Merge remote-tracking branch 'origin/5.9' into 5.11
Conflicts: .qmake.conf src/corelib/animation/qvariantanimation.cpp src/corelib/global/qglobal.cpp src/corelib/global/qlogging.cpp src/corelib/io/qprocess_win.cpp src/corelib/json/qjsonarray.cpp src/corelib/tools/qsimd_p.h src/corelib/tools/qtimezoneprivate_p.h src/corelib/xml/qxmlstream_p.h src/gui/kernel/qsimpledrag.cpp src/gui/kernel/qsimpledrag_p.h src/plugins/generic/generic.pro src/plugins/platforms/cocoa/qcocoamenu.mm src/widgets/styles/qmacstyle_mac.mm tests/auto/concurrent/qtconcurrentmap/BLACKLIST tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp tests/auto/gui/kernel/qwindow/BLACKLIST tests/auto/widgets/dialogs/qmessagebox/BLACKLIST Change-Id: I508d686cf20f7f8cc6a7119b9bc7c3bbb505c58e
This commit is contained in:
commit
305dd1b61f
@ -1,47 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2017 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the config.tests of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** 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$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <D3D11.h>
|
|
||||||
|
|
||||||
int main(int, char**)
|
|
||||||
{
|
|
||||||
D3D11_QUERY_DATA_TIMESTAMP_DISJOINT qdtd;
|
|
||||||
(void)qdtd;
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
SOURCES = angle_d3d11_qdtd.cpp
|
|
||||||
CONFIG -= qt
|
|
||||||
CONFIG += console
|
|
@ -126,6 +126,9 @@ Build options:
|
|||||||
|
|
||||||
-sanitize {address|thread|memory|undefined}
|
-sanitize {address|thread|memory|undefined}
|
||||||
Instrument with the specified compiler sanitizer.
|
Instrument with the specified compiler sanitizer.
|
||||||
|
Note that some sanitizers cannot be combined;
|
||||||
|
for example, -sanitize address cannot be combined with
|
||||||
|
-sanitize thread.
|
||||||
|
|
||||||
-c++std <edition> .... Select C++ standard <edition> [c++1z/c++14/c++11]
|
-c++std <edition> .... Select C++ standard <edition> [c++1z/c++14/c++11]
|
||||||
(Not supported with MSVC)
|
(Not supported with MSVC)
|
||||||
|
6
dist/changes-5.9.4
vendored
6
dist/changes-5.9.4
vendored
@ -65,6 +65,12 @@ QtCore
|
|||||||
QtNetwork
|
QtNetwork
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
- Bearer Management:
|
||||||
|
* [QTBUG-40332] The nativewifi (Windows) bearer plugin was determined
|
||||||
|
to be causing network interference in the form of system-wide higher
|
||||||
|
latency and has been disabled. The CoreWlan (macOS) plugin has also
|
||||||
|
been disabled.
|
||||||
|
|
||||||
- QUdpSocket:
|
- QUdpSocket:
|
||||||
* [QTBUG-64718] Fixed a regression from Qt 5.9.3 caused by an apparent
|
* [QTBUG-64718] Fixed a regression from Qt 5.9.3 caused by an apparent
|
||||||
Win32 API quirk we triggered when using readDatagram(), resulting in
|
Win32 API quirk we triggered when using readDatagram(), resulting in
|
||||||
|
@ -18,6 +18,7 @@ macro.QA = "\\e{Qt Assistant}"
|
|||||||
macro.QD = "\\e{Qt Designer}"
|
macro.QD = "\\e{Qt Designer}"
|
||||||
macro.QL = "\\e{Qt Linguist}"
|
macro.QL = "\\e{Qt Linguist}"
|
||||||
macro.QQV = "\\e{Qt QML Viewer}"
|
macro.QQV = "\\e{Qt QML Viewer}"
|
||||||
|
macro.QtVersion = "$QT_VERSION"
|
||||||
macro.param = "\\e"
|
macro.param = "\\e"
|
||||||
macro.raisedaster.HTML = "<sup>*</sup>"
|
macro.raisedaster.HTML = "<sup>*</sup>"
|
||||||
macro.rarrow.HTML = "→"
|
macro.rarrow.HTML = "→"
|
||||||
|
@ -3,4 +3,8 @@ requires(qtHaveModule(widgets))
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
qtConfig(sharedmemory): SUBDIRS = sharedmemory
|
qtConfig(sharedmemory): SUBDIRS = sharedmemory
|
||||||
qtHaveModule(network): SUBDIRS += localfortuneserver localfortuneclient
|
qtHaveModule(network) {
|
||||||
|
QT_FOR_CONFIG += network
|
||||||
|
|
||||||
|
qtConfig(localserver): SUBDIRS += localfortuneserver localfortuneclient
|
||||||
|
}
|
||||||
|
@ -64,6 +64,8 @@
|
|||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
QSurfaceFormat fmt;
|
QSurfaceFormat fmt;
|
||||||
fmt.setDepthBufferSize(24);
|
fmt.setDepthBufferSize(24);
|
||||||
|
|
||||||
@ -79,8 +81,6 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QSurfaceFormat::setDefaultFormat(fmt);
|
QSurfaceFormat::setDefaultFormat(fmt);
|
||||||
|
|
||||||
QGuiApplication app(argc, argv);
|
|
||||||
|
|
||||||
GLWindow glWindow;
|
GLWindow glWindow;
|
||||||
glWindow.showMaximized();
|
glWindow.showMaximized();
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
MAKEFILE_GENERATOR = MSVC.NET
|
MAKEFILE_GENERATOR = MSVC.NET
|
||||||
QMAKE_PLATFORM = win32
|
QMAKE_PLATFORM = win32
|
||||||
QMAKE_COMPILER = msvc
|
QMAKE_COMPILER = msvc
|
||||||
CONFIG += incremental flat debug_and_release debug_and_release_target precompile_header autogen_precompile_source embed_manifest_dll embed_manifest_exe
|
CONFIG += flat debug_and_release debug_and_release_target precompile_header autogen_precompile_source embed_manifest_dll embed_manifest_exe
|
||||||
DEFINES += UNICODE _UNICODE WIN32
|
DEFINES += UNICODE _UNICODE WIN32
|
||||||
QMAKE_COMPILER_DEFINES += _WIN32
|
QMAKE_COMPILER_DEFINES += _WIN32
|
||||||
contains(QMAKE_TARGET.arch, x86_64) {
|
contains(QMAKE_TARGET.arch, x86_64) {
|
||||||
@ -23,6 +23,7 @@ contains(QMAKE_TARGET.arch, x86_64) {
|
|||||||
QMAKE_COMPILER_DEFINES += _WIN64
|
QMAKE_COMPILER_DEFINES += _WIN64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Od
|
||||||
QMAKE_CFLAGS_OPTIMIZE = -O2
|
QMAKE_CFLAGS_OPTIMIZE = -O2
|
||||||
QMAKE_CFLAGS_OPTIMIZE_SIZE = -O1
|
QMAKE_CFLAGS_OPTIMIZE_SIZE = -O1
|
||||||
|
|
||||||
@ -94,7 +95,8 @@ QMAKE_EXTENSION_SHLIB = dll
|
|||||||
QMAKE_PREFIX_STATICLIB =
|
QMAKE_PREFIX_STATICLIB =
|
||||||
QMAKE_EXTENSION_STATICLIB = lib
|
QMAKE_EXTENSION_STATICLIB = lib
|
||||||
|
|
||||||
QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib user32.lib advapi32.lib
|
QMAKE_LIBS =
|
||||||
|
QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib
|
||||||
QMAKE_LIBS_NETWORK = ws2_32.lib
|
QMAKE_LIBS_NETWORK = ws2_32.lib
|
||||||
QMAKE_LIBS_OPENGL = glu32.lib opengl32.lib gdi32.lib user32.lib
|
QMAKE_LIBS_OPENGL = glu32.lib opengl32.lib gdi32.lib user32.lib
|
||||||
QMAKE_LIBS_OPENGL_ES2 = gdi32.lib user32.lib
|
QMAKE_LIBS_OPENGL_ES2 = gdi32.lib user32.lib
|
||||||
|
@ -100,6 +100,11 @@ greaterThan(QMAKE_MSC_VER, 1909) {
|
|||||||
# API is used in direct2d, but also in multimedia, positioning and sensors.
|
# API is used in direct2d, but also in multimedia, positioning and sensors.
|
||||||
# We can try again with a later version of Visual Studio.
|
# We can try again with a later version of Visual Studio.
|
||||||
# QMAKE_CXXFLAGS_STRICTCXX = -permissive-
|
# QMAKE_CXXFLAGS_STRICTCXX = -permissive-
|
||||||
|
# MSVC partially supports the following, but '__cplusplus' definition is set
|
||||||
|
# as for C++98 until MSVC fully conforms with C++14, see
|
||||||
|
# https://developercommunity.visualstudio.com/content/problem/139261/msvc-incorrectly-defines-cplusplus.html
|
||||||
|
# QMAKE_CXXFLAGS_CXX14 = -std:c++14
|
||||||
|
# QMAKE_CXXFLAGS_CXX1Z = -std:c++latest
|
||||||
}
|
}
|
||||||
|
|
||||||
greaterThan(QMAKE_MSC_VER, 1910) {
|
greaterThan(QMAKE_MSC_VER, 1910) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
contains(TEMPLATE, ".*app"):!build_pass: {
|
contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
|
||||||
|
|
||||||
defineReplace(emitString) {
|
defineReplace(emitString) {
|
||||||
return("\"$$replace(1, \\\\, \\\\)\"")
|
return("\"$$replace(1, \\\\, \\\\)\"")
|
||||||
|
@ -44,19 +44,25 @@ contains(TEMPLATE, .*app): \
|
|||||||
for(ex, EXAMPLE_FILES): \
|
for(ex, EXAMPLE_FILES): \
|
||||||
sourcefiles += $$files($$absolute_path($$ex, $$_PRO_FILE_PWD_))
|
sourcefiles += $$files($$absolute_path($$ex, $$_PRO_FILE_PWD_))
|
||||||
for(res, RESOURCES) {
|
for(res, RESOURCES) {
|
||||||
rfile = $$cat($$absolute_path($$res, $$_PRO_FILE_PWD_), lines)
|
!contains(res, \\.qrc$): \
|
||||||
for(rline, rfile) {
|
next()
|
||||||
|
rfile = $$absolute_path($$res, $$_PRO_FILE_PWD_)
|
||||||
|
rpath = $$dirname(rfile)
|
||||||
|
rcont = $$cat($$rfile, lines)
|
||||||
|
for (rline, rcont) {
|
||||||
resrc = $$replace(rline, ^[ \\t]*<file[^>]*>([^<]+)</file>[ \\t]*$, \\1)
|
resrc = $$replace(rline, ^[ \\t]*<file[^>]*>([^<]+)</file>[ \\t]*$, \\1)
|
||||||
!equals(resrc, $$rline): \
|
!equals(resrc, $$rline): \
|
||||||
sourcefiles += $$resrc
|
sourcefiles += $$absolute_path($$resrc, $$rpath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(res, RC_FILE) {
|
for(res, RC_FILE) {
|
||||||
rfile = $$cat($$absolute_path($$res, $$_PRO_FILE_PWD_), lines)
|
rfile = $$absolute_path($$res, $$_PRO_FILE_PWD_)
|
||||||
for(rline, rfile) {
|
rpath = $$dirname(rfile)
|
||||||
|
rcont = $$cat($$rfile, lines)
|
||||||
|
for (rline, rcont) {
|
||||||
resrc = $$replace(rline, "^\\d+\\s+ICON\\s+[^\"]*\"([^\"]+)\"\$", \\1)
|
resrc = $$replace(rline, "^\\d+\\s+ICON\\s+[^\"]*\"([^\"]+)\"\$", \\1)
|
||||||
!equals(resrc, $$rline): \
|
!equals(resrc, $$rline): \
|
||||||
sourcefiles += $$resrc
|
sourcefiles += $$absolute_path($$resrc, $$rpath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sourcefiles += \
|
sourcefiles += \
|
||||||
|
@ -44,7 +44,7 @@ unix {
|
|||||||
$${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET)
|
$${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET)
|
||||||
} else {
|
} else {
|
||||||
# Windows
|
# Windows
|
||||||
!isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = $${TEST_TARGET_DIR}$${QMAKE_DIR_SEP}
|
!isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = $$shell_path($$TEST_TARGET_DIR)$${QMAKE_DIR_SEP}
|
||||||
$${type}.commands += $${TEST_TARGET_DIR}$(TARGET)
|
$${type}.commands += $${TEST_TARGET_DIR}$(TARGET)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,8 +16,11 @@ include(../common/g++-base.conf)
|
|||||||
MAKEFILE_GENERATOR = MINGW
|
MAKEFILE_GENERATOR = MINGW
|
||||||
QMAKE_PLATFORM = win32 mingw
|
QMAKE_PLATFORM = win32 mingw
|
||||||
CONFIG += debug_and_release debug_and_release_target precompile_header
|
CONFIG += debug_and_release debug_and_release_target precompile_header
|
||||||
DEFINES += UNICODE _UNICODE
|
DEFINES += UNICODE _UNICODE WIN32
|
||||||
QMAKE_COMPILER_DEFINES += __GNUC__ WIN32
|
QMAKE_COMPILER_DEFINES += __GNUC__ _WIN32
|
||||||
|
# can't add 'DEFINES += WIN64' and 'QMAKE_COMPILER_DEFINES += _WIN64' defines for
|
||||||
|
# x86_64 platform similar to 'msvc-desktop.conf' toolchain, because, unlike for MSVC,
|
||||||
|
# 'QMAKE_TARGET.arch' is inherently unavailable.
|
||||||
|
|
||||||
QMAKE_CC = $${CROSS_COMPILE}gcc
|
QMAKE_CC = $${CROSS_COMPILE}gcc
|
||||||
QMAKE_LEX = flex
|
QMAKE_LEX = flex
|
||||||
@ -32,6 +35,8 @@ QMAKE_CFLAGS_AESNI = -maes
|
|||||||
QMAKE_CFLAGS_SHANI = -msha
|
QMAKE_CFLAGS_SHANI = -msha
|
||||||
|
|
||||||
QMAKE_CXX = $${CROSS_COMPILE}g++
|
QMAKE_CXX = $${CROSS_COMPILE}g++
|
||||||
|
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
||||||
|
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
||||||
QMAKE_CXXFLAGS_RTTI_ON = -frtti
|
QMAKE_CXXFLAGS_RTTI_ON = -frtti
|
||||||
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
|
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
|
||||||
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
|
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
# Written for Intel C++ Compiler on Windows / icl 16.0 or higher
|
# Written for Intel C++ Compiler on Windows / icl 16.0 or higher
|
||||||
#
|
#
|
||||||
|
|
||||||
# Use the Microsoft (R) C/C++ Optimizing Compiler configuration,
|
# Use the Microsoft C/C++ Optimizing Compiler configuration,
|
||||||
# since ICC on Windows pretends to be MSVC
|
# since ICC on Windows pretends to be MSVC
|
||||||
|
|
||||||
include(../common/msvc-desktop.conf)
|
include(../common/msvc-desktop.conf)
|
||||||
@ -13,11 +13,14 @@ include(../common/msvc-desktop.conf)
|
|||||||
|
|
||||||
QMAKE_COMPILER += intel_icl
|
QMAKE_COMPILER += intel_icl
|
||||||
|
|
||||||
|
QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
|
||||||
|
|
||||||
QMAKE_CC = icl
|
QMAKE_CC = icl
|
||||||
QMAKE_CFLAGS = -nologo -Zm200 /Qprec /Qwd1744,1738,809,3373
|
QMAKE_CFLAGS = -nologo -Zc:wchar_t -Qprec -Zm200 -Qdiag-disable:1744,1738,809,3373
|
||||||
QMAKE_CFLAGS_WARN_ON = -W3 /Qwd673
|
QMAKE_CFLAGS_WARN_ON = -W3 -Qdiag-disable:673
|
||||||
QMAKE_CFLAGS_WARN_OFF = -W0 /Qwd673
|
QMAKE_CFLAGS_WARN_OFF = -W0 -Qdiag-disable:673
|
||||||
QMAKE_CFLAGS_DEBUG = -Od -Zi -MDd
|
QMAKE_CFLAGS_DEBUG = $$QMAKE_CFLAGS_OPTIMIZE_DEBUG -Zi -MDd
|
||||||
|
QMAKE_CFLAGS_UTF8_SOURCE = -Qoption,cpp,--unicode_source_kind,UTF-8
|
||||||
QMAKE_CFLAGS_LTCG = -Qipo
|
QMAKE_CFLAGS_LTCG = -Qipo
|
||||||
QMAKE_CFLAGS_DISABLE_LTCG = -Qno-ipo
|
QMAKE_CFLAGS_DISABLE_LTCG = -Qno-ipo
|
||||||
|
|
||||||
@ -46,7 +49,7 @@ QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
|||||||
QMAKE_CXXFLAGS_CXX11 = -Qstd=c++11
|
QMAKE_CXXFLAGS_CXX11 = -Qstd=c++11
|
||||||
# ICC supports the following but Qt won't compile
|
# ICC supports the following but Qt won't compile
|
||||||
#QMAKE_CXXFLAGS_CXX14 = -Qstd=c++14
|
#QMAKE_CXXFLAGS_CXX14 = -Qstd=c++14
|
||||||
#QMAKE_CXXFLAGS_CXX1Z = -Qstd=c++1z
|
#QMAKE_CXXFLAGS_CXX1Z = -Qstd=c++17
|
||||||
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
||||||
QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG
|
QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG
|
||||||
|
|
||||||
|
@ -2359,6 +2359,9 @@
|
|||||||
Specifies the \l{All Modules}{Qt modules} that are used by your project. For
|
Specifies the \l{All Modules}{Qt modules} that are used by your project. For
|
||||||
the value to add for each module, see the module documentation.
|
the value to add for each module, see the module documentation.
|
||||||
|
|
||||||
|
At the C++ implementation level, using a Qt module makes its headers
|
||||||
|
available for inclusion and causes it to be linked to the binary.
|
||||||
|
|
||||||
By default, \c QT contains \c core and \c gui, ensuring that standard
|
By default, \c QT contains \c core and \c gui, ensuring that standard
|
||||||
GUI applications can be built without further configuration.
|
GUI applications can be built without further configuration.
|
||||||
|
|
||||||
|
@ -66,21 +66,22 @@ IoUtils::FileType IoUtils::fileType(const QString &fileName)
|
|||||||
|
|
||||||
bool IoUtils::isRelativePath(const QString &path)
|
bool IoUtils::isRelativePath(const QString &path)
|
||||||
{
|
{
|
||||||
if (path.startsWith(QLatin1Char('/')))
|
|
||||||
return false;
|
|
||||||
#ifdef QMAKE_BUILTIN_PRFS
|
#ifdef QMAKE_BUILTIN_PRFS
|
||||||
if (path.startsWith(QLatin1String(":/")))
|
if (path.startsWith(QLatin1String(":/")))
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
if (path.startsWith(QLatin1Char('\\')))
|
// Unlike QFileInfo, this considers only paths with both a drive prefix and
|
||||||
return false;
|
// a subsequent (back-)slash absolute:
|
||||||
// Unlike QFileInfo, this won't accept a relative path with a drive letter.
|
|
||||||
// Such paths result in a royal mess anyway ...
|
|
||||||
if (path.length() >= 3 && path.at(1) == QLatin1Char(':') && path.at(0).isLetter()
|
if (path.length() >= 3 && path.at(1) == QLatin1Char(':') && path.at(0).isLetter()
|
||||||
&& (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\')))
|
&& (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\'))) {
|
||||||
return false;
|
return false;
|
||||||
#endif
|
}
|
||||||
|
// (... unless, of course, they're UNC, which qmake fails on anyway)
|
||||||
|
#else
|
||||||
|
if (path.startsWith(QLatin1Char('/')))
|
||||||
|
return false;
|
||||||
|
#endif // Q_OS_WIN
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,6 +101,12 @@ QString IoUtils::resolvePath(const QString &baseDir, const QString &fileName)
|
|||||||
return QString();
|
return QString();
|
||||||
if (isAbsolutePath(fileName))
|
if (isAbsolutePath(fileName))
|
||||||
return QDir::cleanPath(fileName);
|
return QDir::cleanPath(fileName);
|
||||||
|
#ifdef Q_OS_WIN // Add drive to otherwise-absolute path:
|
||||||
|
if (fileName.at(0).unicode() == '/' || fileName.at(0).unicode() == '\\') {
|
||||||
|
Q_ASSERT(isAbsolutePath(baseDir));
|
||||||
|
return QDir::cleanPath(baseDir.left(2) + fileName);
|
||||||
|
}
|
||||||
|
#endif // Q_OS_WIN
|
||||||
return QDir::cleanPath(baseDir + QLatin1Char('/') + fileName);
|
return QDir::cleanPath(baseDir + QLatin1Char('/') + fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1177,9 +1177,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
|
|||||||
if (args.count() > 2) {
|
if (args.count() > 2) {
|
||||||
evalError(fL1S("absolute_path(path[, base]) requires one or two arguments."));
|
evalError(fL1S("absolute_path(path[, base]) requires one or two arguments."));
|
||||||
} else {
|
} else {
|
||||||
QString rstr = QDir::cleanPath(
|
QString arg = args.at(0).toQString(m_tmp1);
|
||||||
QDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory())
|
QString baseDir = args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory();
|
||||||
.absoluteFilePath(args.at(0).toQString(m_tmp1)));
|
QString rstr = arg.isEmpty() ? baseDir : IoUtils::resolvePath(baseDir, arg);
|
||||||
ret << (rstr.isSharedWith(m_tmp1)
|
ret << (rstr.isSharedWith(m_tmp1)
|
||||||
? args.at(0)
|
? args.at(0)
|
||||||
: args.count() > 1 && rstr.isSharedWith(m_tmp2)
|
: args.count() > 1 && rstr.isSharedWith(m_tmp2)
|
||||||
@ -1191,9 +1191,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
|
|||||||
if (args.count() > 2) {
|
if (args.count() > 2) {
|
||||||
evalError(fL1S("relative_path(path[, base]) requires one or two arguments."));
|
evalError(fL1S("relative_path(path[, base]) requires one or two arguments."));
|
||||||
} else {
|
} else {
|
||||||
QDir baseDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory());
|
QString arg = args.at(0).toQString(m_tmp1);
|
||||||
QString rstr = baseDir.relativeFilePath(baseDir.absoluteFilePath(
|
QString baseDir = args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory();
|
||||||
args.at(0).toQString(m_tmp1)));
|
QString absArg = arg.isEmpty() ? baseDir : IoUtils::resolvePath(baseDir, arg);
|
||||||
|
QString rstr = QDir(baseDir).relativeFilePath(absArg);
|
||||||
ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
|
ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -68,6 +68,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
using namespace QMakeInternal; // for IoUtils
|
||||||
|
|
||||||
#define fL1S(s) QString::fromLatin1(s)
|
#define fL1S(s) QString::fromLatin1(s)
|
||||||
|
|
||||||
@ -96,9 +97,9 @@ QString QMakeGlobals::cleanSpec(QMakeCmdLineParserState &state, const QString &s
|
|||||||
{
|
{
|
||||||
QString ret = QDir::cleanPath(spec);
|
QString ret = QDir::cleanPath(spec);
|
||||||
if (ret.contains(QLatin1Char('/'))) {
|
if (ret.contains(QLatin1Char('/'))) {
|
||||||
QString absRet = QDir(state.pwd).absoluteFilePath(ret);
|
QString absRet = IoUtils::resolvePath(state.pwd, ret);
|
||||||
if (QFile::exists(absRet))
|
if (QFile::exists(absRet))
|
||||||
ret = QDir::cleanPath(absRet);
|
ret = absRet;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -126,10 +127,10 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
|
|||||||
user_template_prefix = arg;
|
user_template_prefix = arg;
|
||||||
break;
|
break;
|
||||||
case ArgCache:
|
case ArgCache:
|
||||||
cachefile = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
|
cachefile = args[*pos] = IoUtils::resolvePath(state.pwd, arg);
|
||||||
break;
|
break;
|
||||||
case ArgQtConf:
|
case ArgQtConf:
|
||||||
qtconf = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
|
qtconf = args[*pos] = IoUtils::resolvePath(state.pwd, arg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (arg.startsWith(QLatin1Char('-'))) {
|
if (arg.startsWith(QLatin1Char('-'))) {
|
||||||
@ -259,11 +260,11 @@ QStringList QMakeGlobals::splitPathList(const QString &val) const
|
|||||||
{
|
{
|
||||||
QStringList ret;
|
QStringList ret;
|
||||||
if (!val.isEmpty()) {
|
if (!val.isEmpty()) {
|
||||||
QDir bdir;
|
QString cwd(QDir::currentPath());
|
||||||
const QStringList vals = val.split(dirlist_sep);
|
const QStringList vals = val.split(dirlist_sep);
|
||||||
ret.reserve(vals.length());
|
ret.reserve(vals.length());
|
||||||
for (const QString &it : vals)
|
for (const QString &it : vals)
|
||||||
ret << QDir::cleanPath(bdir.absoluteFilePath(it));
|
ret << IoUtils::resolvePath(cwd, it);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -318,7 +319,7 @@ bool QMakeGlobals::initProperties()
|
|||||||
return false;
|
return false;
|
||||||
data = proc.readAll();
|
data = proc.readAll();
|
||||||
#else
|
#else
|
||||||
if (FILE *proc = QT_POPEN(QString(QMakeInternal::IoUtils::shellQuote(qmake_abslocation)
|
if (FILE *proc = QT_POPEN(QString(IoUtils::shellQuote(qmake_abslocation)
|
||||||
+ QLatin1String(" -query")).toLocal8Bit(), QT_POPEN_READ)) {
|
+ QLatin1String(" -query")).toLocal8Bit(), QT_POPEN_READ)) {
|
||||||
char buff[1024];
|
char buff[1024];
|
||||||
while (!feof(proc))
|
while (!feof(proc))
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#include "option.h"
|
#include "option.h"
|
||||||
#include "cachekeys.h"
|
#include "cachekeys.h"
|
||||||
|
#include <ioutils.h>
|
||||||
#include <qdir.h>
|
#include <qdir.h>
|
||||||
#include <qregexp.h>
|
#include <qregexp.h>
|
||||||
#include <qhash.h>
|
#include <qhash.h>
|
||||||
@ -38,6 +39,8 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
using namespace QMakeInternal;
|
||||||
|
|
||||||
EvalHandler Option::evalHandler;
|
EvalHandler Option::evalHandler;
|
||||||
QMakeGlobals *Option::globals;
|
QMakeGlobals *Option::globals;
|
||||||
ProFileCache *Option::proFileCache;
|
ProFileCache *Option::proFileCache;
|
||||||
@ -325,7 +328,7 @@ Option::init(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
if(Option::qmake_mode == Option::QMAKE_GENERATE_NOTHING)
|
if(Option::qmake_mode == Option::QMAKE_GENERATE_NOTHING)
|
||||||
Option::qmake_mode = default_mode(argv0);
|
Option::qmake_mode = default_mode(argv0);
|
||||||
if(!argv0.isEmpty() && !QFileInfo(argv0).isRelative()) {
|
if (!argv0.isEmpty() && IoUtils::isAbsolutePath(argv0)) {
|
||||||
globals->qmake_abslocation = argv0;
|
globals->qmake_abslocation = argv0;
|
||||||
} else if (argv0.contains(QLatin1Char('/'))
|
} else if (argv0.contains(QLatin1Char('/'))
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
303
src/3rdparty/angle/src/libANGLE/Debug2.cpp
vendored
303
src/3rdparty/angle/src/libANGLE/Debug2.cpp
vendored
@ -1,303 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Debug.cpp: Defines debug state used for GL_KHR_debug
|
|
||||||
|
|
||||||
#include "libANGLE/Debug.h"
|
|
||||||
|
|
||||||
#include "common/debug.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
namespace gl
|
|
||||||
{
|
|
||||||
|
|
||||||
Debug::Debug()
|
|
||||||
: mOutputEnabled(false),
|
|
||||||
mCallbackFunction(nullptr),
|
|
||||||
mCallbackUserParam(nullptr),
|
|
||||||
mMessages(),
|
|
||||||
mMaxLoggedMessages(0),
|
|
||||||
mOutputSynchronous(false),
|
|
||||||
mGroups()
|
|
||||||
{
|
|
||||||
pushDefaultGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::setMaxLoggedMessages(GLuint maxLoggedMessages)
|
|
||||||
{
|
|
||||||
mMaxLoggedMessages = maxLoggedMessages;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::setOutputEnabled(bool enabled)
|
|
||||||
{
|
|
||||||
mOutputEnabled = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Debug::isOutputEnabled() const
|
|
||||||
{
|
|
||||||
return mOutputEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::setOutputSynchronous(bool synchronous)
|
|
||||||
{
|
|
||||||
mOutputSynchronous = synchronous;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Debug::isOutputSynchronous() const
|
|
||||||
{
|
|
||||||
return mOutputSynchronous;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::setCallback(GLDEBUGPROCKHR callback, const void *userParam)
|
|
||||||
{
|
|
||||||
mCallbackFunction = callback;
|
|
||||||
mCallbackUserParam = userParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLDEBUGPROCKHR Debug::getCallback() const
|
|
||||||
{
|
|
||||||
return mCallbackFunction;
|
|
||||||
}
|
|
||||||
|
|
||||||
const void *Debug::getUserParam() const
|
|
||||||
{
|
|
||||||
return mCallbackUserParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::insertMessage(GLenum source,
|
|
||||||
GLenum type,
|
|
||||||
GLuint id,
|
|
||||||
GLenum severity,
|
|
||||||
const std::string &message)
|
|
||||||
{
|
|
||||||
std::string messageCopy(message);
|
|
||||||
insertMessage(source, type, id, severity, std::move(messageCopy));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::insertMessage(GLenum source,
|
|
||||||
GLenum type,
|
|
||||||
GLuint id,
|
|
||||||
GLenum severity,
|
|
||||||
std::string &&message)
|
|
||||||
{
|
|
||||||
if (!isMessageEnabled(source, type, id, severity))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mCallbackFunction != nullptr)
|
|
||||||
{
|
|
||||||
// TODO(geofflang) Check the synchronous flag and potentially flush messages from another
|
|
||||||
// thread.
|
|
||||||
mCallbackFunction(source, type, id, severity, static_cast<GLsizei>(message.length()),
|
|
||||||
message.c_str(), mCallbackUserParam);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (mMessages.size() >= mMaxLoggedMessages)
|
|
||||||
{
|
|
||||||
// Drop messages over the limit
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Message m;
|
|
||||||
m.source = source;
|
|
||||||
m.type = type;
|
|
||||||
m.id = id;
|
|
||||||
m.severity = severity;
|
|
||||||
m.message = std::move(message);
|
|
||||||
|
|
||||||
mMessages.push_back(std::move(m));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Debug::getMessages(GLuint count,
|
|
||||||
GLsizei bufSize,
|
|
||||||
GLenum *sources,
|
|
||||||
GLenum *types,
|
|
||||||
GLuint *ids,
|
|
||||||
GLenum *severities,
|
|
||||||
GLsizei *lengths,
|
|
||||||
GLchar *messageLog)
|
|
||||||
{
|
|
||||||
size_t messageCount = 0;
|
|
||||||
size_t messageStringIndex = 0;
|
|
||||||
while (messageCount <= count && !mMessages.empty())
|
|
||||||
{
|
|
||||||
const Message &m = mMessages.front();
|
|
||||||
|
|
||||||
if (messageLog != nullptr)
|
|
||||||
{
|
|
||||||
// Check that this message can fit in the message buffer
|
|
||||||
if (messageStringIndex + m.message.length() + 1 > static_cast<size_t>(bufSize))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy(m.message.begin(), m.message.end(), messageLog + messageStringIndex);
|
|
||||||
messageStringIndex += m.message.length();
|
|
||||||
|
|
||||||
messageLog[messageStringIndex] = '\0';
|
|
||||||
messageStringIndex += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sources != nullptr)
|
|
||||||
{
|
|
||||||
sources[messageCount] = m.source;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (types != nullptr)
|
|
||||||
{
|
|
||||||
types[messageCount] = m.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ids != nullptr)
|
|
||||||
{
|
|
||||||
ids[messageCount] = m.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (severities != nullptr)
|
|
||||||
{
|
|
||||||
severities[messageCount] = m.severity;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lengths != nullptr)
|
|
||||||
{
|
|
||||||
lengths[messageCount] = static_cast<GLsizei>(m.message.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
mMessages.pop_front();
|
|
||||||
|
|
||||||
messageCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return messageCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Debug::getNextMessageLength() const
|
|
||||||
{
|
|
||||||
return mMessages.empty() ? 0 : mMessages.front().message.length();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Debug::getMessageCount() const
|
|
||||||
{
|
|
||||||
return mMessages.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::setMessageControl(GLenum source,
|
|
||||||
GLenum type,
|
|
||||||
GLenum severity,
|
|
||||||
std::vector<GLuint> &&ids,
|
|
||||||
bool enabled)
|
|
||||||
{
|
|
||||||
Control c;
|
|
||||||
c.source = source;
|
|
||||||
c.type = type;
|
|
||||||
c.severity = severity;
|
|
||||||
c.ids = std::move(ids);
|
|
||||||
c.enabled = enabled;
|
|
||||||
|
|
||||||
auto &controls = mGroups.back().controls;
|
|
||||||
controls.push_back(std::move(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::pushGroup(GLenum source, GLuint id, std::string &&message)
|
|
||||||
{
|
|
||||||
insertMessage(source, GL_DEBUG_TYPE_PUSH_GROUP, id, GL_DEBUG_SEVERITY_NOTIFICATION,
|
|
||||||
std::string(message));
|
|
||||||
|
|
||||||
Group g;
|
|
||||||
g.source = source;
|
|
||||||
g.id = id;
|
|
||||||
g.message = std::move(message);
|
|
||||||
mGroups.push_back(std::move(g));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::popGroup()
|
|
||||||
{
|
|
||||||
// Make sure the default group is not about to be popped
|
|
||||||
ASSERT(mGroups.size() > 1);
|
|
||||||
|
|
||||||
Group g = mGroups.back();
|
|
||||||
mGroups.pop_back();
|
|
||||||
|
|
||||||
insertMessage(g.source, GL_DEBUG_TYPE_POP_GROUP, g.id, GL_DEBUG_SEVERITY_NOTIFICATION,
|
|
||||||
g.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Debug::getGroupStackDepth() const
|
|
||||||
{
|
|
||||||
return mGroups.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Debug::isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const
|
|
||||||
{
|
|
||||||
if (!mOutputEnabled)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto groupIter = mGroups.rbegin(); groupIter != mGroups.rend(); groupIter++)
|
|
||||||
{
|
|
||||||
const auto &controls = groupIter->controls;
|
|
||||||
for (auto controlIter = controls.rbegin(); controlIter != controls.rend(); controlIter++)
|
|
||||||
{
|
|
||||||
const auto &control = *controlIter;
|
|
||||||
|
|
||||||
if (control.source != GL_DONT_CARE && control.source != source)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (control.type != GL_DONT_CARE && control.type != type)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (control.severity != GL_DONT_CARE && control.severity != severity)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!control.ids.empty() &&
|
|
||||||
std::find(control.ids.begin(), control.ids.end(), id) == control.ids.end())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return control.enabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Debug::pushDefaultGroup()
|
|
||||||
{
|
|
||||||
Group g;
|
|
||||||
g.source = GL_NONE;
|
|
||||||
g.id = 0;
|
|
||||||
g.message = "";
|
|
||||||
|
|
||||||
Control c0;
|
|
||||||
c0.source = GL_DONT_CARE;
|
|
||||||
c0.type = GL_DONT_CARE;
|
|
||||||
c0.severity = GL_DONT_CARE;
|
|
||||||
c0.enabled = true;
|
|
||||||
g.controls.push_back(std::move(c0));
|
|
||||||
|
|
||||||
Control c1;
|
|
||||||
c1.source = GL_DONT_CARE;
|
|
||||||
c1.type = GL_DONT_CARE;
|
|
||||||
c1.severity = GL_DEBUG_SEVERITY_LOW;
|
|
||||||
c1.enabled = false;
|
|
||||||
g.controls.push_back(std::move(c1));
|
|
||||||
|
|
||||||
mGroups.push_back(std::move(g));
|
|
||||||
}
|
|
||||||
} // namespace gl
|
|
120
src/3rdparty/angle/src/libANGLE/Debug2.h
vendored
120
src/3rdparty/angle/src/libANGLE/Debug2.h
vendored
@ -1,120 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Debug.h: Defines debug state used for GL_KHR_debug
|
|
||||||
|
|
||||||
#ifndef LIBANGLE_DEBUG_H_
|
|
||||||
#define LIBANGLE_DEBUG_H_
|
|
||||||
|
|
||||||
#include "angle_gl.h"
|
|
||||||
#include "common/angleutils.h"
|
|
||||||
|
|
||||||
#include <deque>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace gl
|
|
||||||
{
|
|
||||||
|
|
||||||
class LabeledObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~LabeledObject() {}
|
|
||||||
virtual void setLabel(const std::string &label) = 0;
|
|
||||||
virtual const std::string &getLabel() const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Debug : angle::NonCopyable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Debug();
|
|
||||||
|
|
||||||
void setMaxLoggedMessages(GLuint maxLoggedMessages);
|
|
||||||
|
|
||||||
void setOutputEnabled(bool enabled);
|
|
||||||
bool isOutputEnabled() const;
|
|
||||||
|
|
||||||
void setOutputSynchronous(bool synchronous);
|
|
||||||
bool isOutputSynchronous() const;
|
|
||||||
|
|
||||||
void setCallback(GLDEBUGPROCKHR callback, const void *userParam);
|
|
||||||
GLDEBUGPROCKHR getCallback() const;
|
|
||||||
const void *getUserParam() const;
|
|
||||||
|
|
||||||
void insertMessage(GLenum source,
|
|
||||||
GLenum type,
|
|
||||||
GLuint id,
|
|
||||||
GLenum severity,
|
|
||||||
const std::string &message);
|
|
||||||
void insertMessage(GLenum source,
|
|
||||||
GLenum type,
|
|
||||||
GLuint id,
|
|
||||||
GLenum severity,
|
|
||||||
std::string &&message);
|
|
||||||
|
|
||||||
void setMessageControl(GLenum source,
|
|
||||||
GLenum type,
|
|
||||||
GLenum severity,
|
|
||||||
std::vector<GLuint> &&ids,
|
|
||||||
bool enabled);
|
|
||||||
size_t getMessages(GLuint count,
|
|
||||||
GLsizei bufSize,
|
|
||||||
GLenum *sources,
|
|
||||||
GLenum *types,
|
|
||||||
GLuint *ids,
|
|
||||||
GLenum *severities,
|
|
||||||
GLsizei *lengths,
|
|
||||||
GLchar *messageLog);
|
|
||||||
size_t getNextMessageLength() const;
|
|
||||||
size_t getMessageCount() const;
|
|
||||||
|
|
||||||
void pushGroup(GLenum source, GLuint id, std::string &&message);
|
|
||||||
void popGroup();
|
|
||||||
size_t getGroupStackDepth() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const;
|
|
||||||
|
|
||||||
void pushDefaultGroup();
|
|
||||||
|
|
||||||
struct Message
|
|
||||||
{
|
|
||||||
GLenum source;
|
|
||||||
GLenum type;
|
|
||||||
GLuint id;
|
|
||||||
GLenum severity;
|
|
||||||
std::string message;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Control
|
|
||||||
{
|
|
||||||
GLenum source;
|
|
||||||
GLenum type;
|
|
||||||
GLenum severity;
|
|
||||||
std::vector<GLuint> ids;
|
|
||||||
bool enabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Group
|
|
||||||
{
|
|
||||||
GLenum source;
|
|
||||||
GLuint id;
|
|
||||||
std::string message;
|
|
||||||
|
|
||||||
std::vector<Control> controls;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool mOutputEnabled;
|
|
||||||
GLDEBUGPROCKHR mCallbackFunction;
|
|
||||||
const void *mCallbackUserParam;
|
|
||||||
std::deque<Message> mMessages;
|
|
||||||
GLuint mMaxLoggedMessages;
|
|
||||||
bool mOutputSynchronous;
|
|
||||||
std::vector<Group> mGroups;
|
|
||||||
};
|
|
||||||
} // namespace gl
|
|
||||||
|
|
||||||
#endif // LIBANGLE_DEBUG_H_
|
|
@ -51,6 +51,7 @@ import android.graphics.drawable.Drawable;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.widget.PopupWindow;
|
import android.widget.PopupWindow;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.util.TypedValue;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
|
|
||||||
/* This view represents one of the handle (selection or cursor handle) */
|
/* This view represents one of the handle (selection or cursor handle) */
|
||||||
@ -58,8 +59,9 @@ class CursorView extends ImageView
|
|||||||
{
|
{
|
||||||
private CursorHandle mHandle;
|
private CursorHandle mHandle;
|
||||||
// The coordinare which where clicked
|
// The coordinare which where clicked
|
||||||
private int m_offsetX;
|
private float m_offsetX;
|
||||||
private int m_offsetY;
|
private float m_offsetY;
|
||||||
|
private boolean m_pressed = false;
|
||||||
|
|
||||||
CursorView (Context context, CursorHandle handle) {
|
CursorView (Context context, CursorHandle handle) {
|
||||||
super(context);
|
super(context);
|
||||||
@ -76,21 +78,23 @@ class CursorView extends ImageView
|
|||||||
public boolean onTouchEvent(MotionEvent ev) {
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
switch (ev.getActionMasked()) {
|
switch (ev.getActionMasked()) {
|
||||||
case MotionEvent.ACTION_DOWN: {
|
case MotionEvent.ACTION_DOWN: {
|
||||||
m_offsetX = Math.round(ev.getRawX());
|
m_offsetX = ev.getRawX();
|
||||||
m_offsetY = Math.round(ev.getRawY());
|
m_offsetY = ev.getRawY() + getHeight() / 2;
|
||||||
|
m_pressed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case MotionEvent.ACTION_MOVE: {
|
case MotionEvent.ACTION_MOVE: {
|
||||||
mHandle.updatePosition(Math.round(ev.getRawX()) - m_offsetX,
|
if (!m_pressed)
|
||||||
Math.round(ev.getRawY()) - m_offsetY);
|
return false;
|
||||||
|
mHandle.updatePosition(Math.round(ev.getRawX() - m_offsetX),
|
||||||
|
Math.round(ev.getRawY() - m_offsetY));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case MotionEvent.ACTION_UP:
|
case MotionEvent.ACTION_UP:
|
||||||
break;
|
|
||||||
|
|
||||||
case MotionEvent.ACTION_CANCEL:
|
case MotionEvent.ACTION_CANCEL:
|
||||||
|
m_pressed = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -113,6 +117,7 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener
|
|||||||
private int m_lastY;
|
private int m_lastY;
|
||||||
int tolerance;
|
int tolerance;
|
||||||
private boolean m_rtl;
|
private boolean m_rtl;
|
||||||
|
int m_yShift;
|
||||||
|
|
||||||
public CursorHandle(Activity activity, View layout, int id, int attr, boolean rtl) {
|
public CursorHandle(Activity activity, View layout, int id, int attr, boolean rtl) {
|
||||||
m_activity = activity;
|
m_activity = activity;
|
||||||
@ -121,7 +126,8 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener
|
|||||||
m_layout = layout;
|
m_layout = layout;
|
||||||
DisplayMetrics metrics = new DisplayMetrics();
|
DisplayMetrics metrics = new DisplayMetrics();
|
||||||
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||||
tolerance = Math.round(2 * metrics.density);
|
m_yShift = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 1f, metrics);
|
||||||
|
tolerance = Math.min(1, (int)(m_yShift / 2f));
|
||||||
m_lastX = m_lastY = -1 - tolerance;
|
m_lastX = m_lastY = -1 - tolerance;
|
||||||
m_rtl = rtl;
|
m_rtl = rtl;
|
||||||
}
|
}
|
||||||
@ -158,7 +164,7 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener
|
|||||||
m_layout.getLocationOnScreen(location);
|
m_layout.getLocationOnScreen(location);
|
||||||
|
|
||||||
int x2 = x + location[0];
|
int x2 = x + location[0];
|
||||||
int y2 = y + location[1];
|
int y2 = y + location[1] + m_yShift;
|
||||||
|
|
||||||
if (m_id == QtNative.IdCursorHandle) {
|
if (m_id == QtNative.IdCursorHandle) {
|
||||||
x2 -= m_cursorView.getWidth() / 2 ;
|
x2 -= m_cursorView.getWidth() / 2 ;
|
||||||
@ -187,6 +193,7 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener
|
|||||||
|
|
||||||
// The handle was dragged by a given relative position
|
// The handle was dragged by a given relative position
|
||||||
public void updatePosition(int x, int y) {
|
public void updatePosition(int x, int y) {
|
||||||
|
y -= m_yShift;
|
||||||
if (Math.abs(m_lastX - x) > tolerance || Math.abs(m_lastY - y) > tolerance) {
|
if (Math.abs(m_lastX - x) > tolerance || Math.abs(m_lastY - y) > tolerance) {
|
||||||
QtNative.handleLocationChanged(m_id, x + m_posX, y + m_posY);
|
QtNative.handleLocationChanged(m_id, x + m_posX, y + m_posY);
|
||||||
m_lastX = x;
|
m_lastX = x;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
CONFIG += simd no_batch
|
CONFIG += simd no_batch object_parallel_to_source
|
||||||
include(common.pri)
|
include(common.pri)
|
||||||
|
|
||||||
INCLUDEPATH += $$OUT_PWD/.. $$ANGLE_DIR/src/libANGLE
|
INCLUDEPATH += $$OUT_PWD/.. $$ANGLE_DIR/src/libANGLE
|
||||||
@ -48,6 +48,7 @@ HEADERS += \
|
|||||||
$$ANGLE_DIR/src/libANGLE/Constants.h \
|
$$ANGLE_DIR/src/libANGLE/Constants.h \
|
||||||
$$ANGLE_DIR/src/libANGLE/Context.h \
|
$$ANGLE_DIR/src/libANGLE/Context.h \
|
||||||
$$ANGLE_DIR/src/libANGLE/Data.h \
|
$$ANGLE_DIR/src/libANGLE/Data.h \
|
||||||
|
$$ANGLE_DIR/src/libANGLE/Debug.h \
|
||||||
$$ANGLE_DIR/src/libANGLE/Device.h \
|
$$ANGLE_DIR/src/libANGLE/Device.h \
|
||||||
$$ANGLE_DIR/src/libANGLE/Display.h \
|
$$ANGLE_DIR/src/libANGLE/Display.h \
|
||||||
$$ANGLE_DIR/src/libANGLE/Error.h \
|
$$ANGLE_DIR/src/libANGLE/Error.h \
|
||||||
@ -169,6 +170,7 @@ SOURCES += \
|
|||||||
$$ANGLE_DIR/src/libANGLE/Config.cpp \
|
$$ANGLE_DIR/src/libANGLE/Config.cpp \
|
||||||
$$ANGLE_DIR/src/libANGLE/Context.cpp \
|
$$ANGLE_DIR/src/libANGLE/Context.cpp \
|
||||||
$$ANGLE_DIR/src/libANGLE/Data.cpp \
|
$$ANGLE_DIR/src/libANGLE/Data.cpp \
|
||||||
|
$$ANGLE_DIR/src/libANGLE/Debug.cpp \
|
||||||
$$ANGLE_DIR/src/libANGLE/Device.cpp \
|
$$ANGLE_DIR/src/libANGLE/Device.cpp \
|
||||||
$$ANGLE_DIR/src/libANGLE/Display.cpp \
|
$$ANGLE_DIR/src/libANGLE/Display.cpp \
|
||||||
$$ANGLE_DIR/src/libANGLE/Error.cpp \
|
$$ANGLE_DIR/src/libANGLE/Error.cpp \
|
||||||
@ -241,14 +243,6 @@ SOURCES += \
|
|||||||
|
|
||||||
SSE2_SOURCES += $$ANGLE_DIR/src/libANGLE/renderer/d3d/loadimageSSE2.cpp
|
SSE2_SOURCES += $$ANGLE_DIR/src/libANGLE/renderer/d3d/loadimageSSE2.cpp
|
||||||
|
|
||||||
DEBUG_SOURCE = $$ANGLE_DIR/src/libANGLE/Debug.cpp
|
|
||||||
debug_copy.input = DEBUG_SOURCE
|
|
||||||
debug_copy.output = $$ANGLE_DIR/src/libANGLE/Debug2.cpp
|
|
||||||
debug_copy.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
|
|
||||||
debug_copy.variable_out = GENERATED_SOURCES
|
|
||||||
debug_copy.CONFIG = target_predeps
|
|
||||||
QMAKE_EXTRA_COMPILERS += debug_copy
|
|
||||||
|
|
||||||
angle_d3d11 {
|
angle_d3d11 {
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$ANGLE_DIR/src/libANGLE/renderer/d3d/d3d11/Blit11.h \
|
$$ANGLE_DIR/src/libANGLE/renderer/d3d/d3d11/Blit11.h \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
** Contact: https://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.
|
||||||
@ -133,4 +133,13 @@
|
|||||||
copy of the container when called. If you are using STL containers this copy operation
|
copy of the container when called. If you are using STL containers this copy operation
|
||||||
might take some time, in this case we recommend specifying the begin and end iterators
|
might take some time, in this case we recommend specifying the begin and end iterators
|
||||||
for the container instead.
|
for the container instead.
|
||||||
|
|
||||||
|
\section1 Licenses
|
||||||
|
|
||||||
|
The Qt Concurrent module is available under commercial licenses from \l{The Qt Company}.
|
||||||
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
|
the \l{GNU General Public License, version 2}.
|
||||||
|
See \l{Qt Licensing} for further details.
|
||||||
*/
|
*/
|
||||||
|
@ -55,7 +55,7 @@ class HelloWorldTask : public QRunnable
|
|||||||
{
|
{
|
||||||
qDebug() << "Hello world from thread" << QThread::currentThread();
|
qDebug() << "Hello world from thread" << QThread::currentThread();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
HelloWorldTask *hello = new HelloWorldTask();
|
HelloWorldTask *hello = new HelloWorldTask();
|
||||||
// QThreadPool takes ownership and deletes 'hello' automatically
|
// QThreadPool takes ownership and deletes 'hello' automatically
|
||||||
|
@ -104,17 +104,18 @@
|
|||||||
\section1 Licenses and Attributions
|
\section1 Licenses and Attributions
|
||||||
|
|
||||||
Qt Core is available under commercial licenses from \l{The Qt Company}.
|
Qt Core is available under commercial licenses from \l{The Qt Company}.
|
||||||
In addition, it is available under the
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
\l{GNU Lesser General Public License, version 3}, or
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
the \l{GNU General Public License, version 2}.
|
the \l{GNU General Public License, version 2}.
|
||||||
See \l{Qt Licensing} for further details.
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
Executables on Windows potentially link
|
Executables on Windows potentially link
|
||||||
against \l{The qtmain Library}. This library is available
|
against \l{The qtmain Library}. This library is available
|
||||||
under commercial licenses, and in addition under the
|
under commercial licenses and also under the
|
||||||
\l{BSD 3-clause "New" or "Revised" License}.
|
\l{BSD 3-clause "New" or "Revised" License}.
|
||||||
|
|
||||||
Furthermore Qt Core potentially contains third party
|
Furthermore, Qt Core in Qt \QtVersion may contain third party
|
||||||
modules under following permissive licenses:
|
modules under following permissive licenses:
|
||||||
|
|
||||||
\generatelist{groupsbymodule attributions-qtcore}
|
\generatelist{groupsbymodule attributions-qtcore}
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
# include <envLib.h>
|
# include <envLib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
#include <private/qjni_p.h>
|
#include <private/qjni_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2298,7 +2298,7 @@ static bool findUnixOsVersion(QUnixOSVersion &v)
|
|||||||
# endif // USE_ETC_OS_RELEASE
|
# endif // USE_ETC_OS_RELEASE
|
||||||
#endif // Q_OS_UNIX
|
#endif // Q_OS_UNIX
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
static const char *osVer_helper(QOperatingSystemVersion)
|
static const char *osVer_helper(QOperatingSystemVersion)
|
||||||
{
|
{
|
||||||
/* Data:
|
/* Data:
|
||||||
@ -2779,7 +2779,7 @@ QString QSysInfo::productVersion()
|
|||||||
*/
|
*/
|
||||||
QString QSysInfo::prettyProductName()
|
QString QSysInfo::prettyProductName()
|
||||||
{
|
{
|
||||||
#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
|
#if (defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
|
||||||
const auto version = QOperatingSystemVersion::current();
|
const auto version = QOperatingSystemVersion::current();
|
||||||
const char *name = osVer_helper(version);
|
const char *name = osVer_helper(version);
|
||||||
if (name)
|
if (name)
|
||||||
|
@ -1597,7 +1597,7 @@ static bool syslog_default_message_handler(QtMsgType type, const QMessageLogCont
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
static bool android_default_message_handler(QtMsgType type,
|
static bool android_default_message_handler(QtMsgType type,
|
||||||
const QMessageLogContext &context,
|
const QMessageLogContext &context,
|
||||||
const QString &message)
|
const QString &message)
|
||||||
@ -1678,7 +1678,7 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con
|
|||||||
handledStderr |= systemd_default_message_handler(type, context, message);
|
handledStderr |= systemd_default_message_handler(type, context, message);
|
||||||
# elif QT_CONFIG(syslog)
|
# elif QT_CONFIG(syslog)
|
||||||
handledStderr |= syslog_default_message_handler(type, context, message);
|
handledStderr |= syslog_default_message_handler(type, context, message);
|
||||||
# elif defined(Q_OS_ANDROID)
|
# elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
handledStderr |= android_default_message_handler(type, context, message);
|
handledStderr |= android_default_message_handler(type, context, message);
|
||||||
# elif defined(QT_USE_APPLE_UNIFIED_LOGGING)
|
# elif defined(QT_USE_APPLE_UNIFIED_LOGGING)
|
||||||
if (__builtin_available(macOS 10.12, iOS 10, tvOS 10, watchOS 3, *))
|
if (__builtin_available(macOS 10.12, iOS 10, tvOS 10, watchOS 3, *))
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
#include <qversionnumber.h>
|
#include <qversionnumber.h>
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
|
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
#include <private/qjni_p.h>
|
#include <private/qjni_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ QOperatingSystemVersion QOperatingSystemVersion::current()
|
|||||||
{
|
{
|
||||||
QOperatingSystemVersion version;
|
QOperatingSystemVersion version;
|
||||||
version.m_os = currentType();
|
version.m_os = currentType();
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
#ifndef QT_BOOTSTRAPPED
|
#ifndef QT_BOOTSTRAPPED
|
||||||
const QVersionNumber v = QVersionNumber::fromString(QJNIObjectPrivate::getStaticObjectField(
|
const QVersionNumber v = QVersionNumber::fromString(QJNIObjectPrivate::getStaticObjectField(
|
||||||
"android/os/Build$VERSION", "RELEASE", "Ljava/lang/String;").toString());
|
"android/os/Build$VERSION", "RELEASE", "Ljava/lang/String;").toString());
|
||||||
|
@ -159,7 +159,7 @@ win32 {
|
|||||||
} else {
|
} else {
|
||||||
LIBS += -framework MobileCoreServices
|
LIBS += -framework MobileCoreServices
|
||||||
}
|
}
|
||||||
} else:android {
|
} else:android:!android-embedded {
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
io/qstandardpaths_android.cpp \
|
io/qstandardpaths_android.cpp \
|
||||||
io/qstorageinfo_unix.cpp
|
io/qstorageinfo_unix.cpp
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include <QtCore/qstandardpaths.h>
|
#include <QtCore/qstandardpaths.h>
|
||||||
#include <QtCore/qtextstream.h>
|
#include <QtCore/qtextstream.h>
|
||||||
#include <QtCore/qdir.h>
|
#include <QtCore/qdir.h>
|
||||||
|
#include <QtCore/qcoreapplication.h>
|
||||||
|
|
||||||
// We can't use the default macros because this would lead to recursion.
|
// We can't use the default macros because this would lead to recursion.
|
||||||
// Instead let's define our own one that unconditionally logs...
|
// Instead let's define our own one that unconditionally logs...
|
||||||
@ -255,6 +256,15 @@ void QLoggingSettingsParser::parseNextLine(QStringRef line)
|
|||||||
QLoggingRegistry::QLoggingRegistry()
|
QLoggingRegistry::QLoggingRegistry()
|
||||||
: categoryFilter(defaultCategoryFilter)
|
: categoryFilter(defaultCategoryFilter)
|
||||||
{
|
{
|
||||||
|
#if defined(Q_OS_ANDROID)
|
||||||
|
// Unless QCoreApplication has been constructed we can't be sure that
|
||||||
|
// we are on Qt's main thread. If we did allow logging here, we would
|
||||||
|
// potentially set Qt's main thread to Android's thread 0, which would
|
||||||
|
// confuse Qt later when running main().
|
||||||
|
if (!qApp)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
initializeRules(); // Init on first use
|
initializeRules(); // Init on first use
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +101,8 @@ static void qt_create_pipe(Q_PIPE *pipe, bool isInputPipe)
|
|||||||
unsigned int attempts = 1000;
|
unsigned int attempts = 1000;
|
||||||
forever {
|
forever {
|
||||||
_snwprintf(pipeName, sizeof(pipeName) / sizeof(pipeName[0]),
|
_snwprintf(pipeName, sizeof(pipeName) / sizeof(pipeName[0]),
|
||||||
L"\\\\.\\pipe\\qt-%X", QRandomGenerator::global()->generate());
|
L"\\\\.\\pipe\\qt-%lX-%X", long(QCoreApplication::applicationPid()),
|
||||||
|
QRandomGenerator::global()->generate());
|
||||||
|
|
||||||
DWORD dwOpenMode = FILE_FLAG_OVERLAPPED;
|
DWORD dwOpenMode = FILE_FLAG_OVERLAPPED;
|
||||||
DWORD dwOutputBufferSize = 0;
|
DWORD dwOutputBufferSize = 0;
|
||||||
|
@ -2366,6 +2366,11 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
|
|||||||
limitations is to store the settings using the IniFormat
|
limitations is to store the settings using the IniFormat
|
||||||
instead of the NativeFormat.
|
instead of the NativeFormat.
|
||||||
|
|
||||||
|
\li On Windows, when the Windows system registry is used, QSettings
|
||||||
|
does not preserve the original type of the value. Therefore,
|
||||||
|
the type of the value might change when a new value is set. For
|
||||||
|
example, a value with type \c REG_EXPAND_SZ will change to \c REG_SZ.
|
||||||
|
|
||||||
\li On \macos and iOS, allKeys() will return some extra keys for global
|
\li On \macos and iOS, allKeys() will return some extra keys for global
|
||||||
settings that apply to all applications. These keys can be
|
settings that apply to all applications. These keys can be
|
||||||
read using value() but cannot be changed, only shadowed.
|
read using value() but cannot be changed, only shadowed.
|
||||||
|
@ -217,7 +217,16 @@ static QString getFilesDir()
|
|||||||
if (!path.isEmpty())
|
if (!path.isEmpty())
|
||||||
return path;
|
return path;
|
||||||
|
|
||||||
return (path = QDir::homePath());
|
QJNIObjectPrivate appCtx = applicationContext();
|
||||||
|
if (!appCtx.isValid())
|
||||||
|
return QString();
|
||||||
|
|
||||||
|
QJNIObjectPrivate file = appCtx.callObjectMethod("getFilesDir",
|
||||||
|
"()Ljava/io/File;");
|
||||||
|
if (!file.isValid())
|
||||||
|
return QString();
|
||||||
|
|
||||||
|
return (path = getAbsolutePath(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString QStandardPaths::writableLocation(StandardLocation type)
|
QString QStandardPaths::writableLocation(StandardLocation type)
|
||||||
@ -319,7 +328,9 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
|
|||||||
if (!ba.isEmpty())
|
if (!ba.isEmpty())
|
||||||
return QStringList((fontLocation = QDir::cleanPath(QString::fromLocal8Bit(ba))));
|
return QStringList((fontLocation = QDir::cleanPath(QString::fromLocal8Bit(ba))));
|
||||||
|
|
||||||
return QStringList((fontLocation = QLatin1String("/system/fonts")));
|
// Don't cache the fallback, as we might just have been called before
|
||||||
|
// QT_ANDROID_FONT_LOCATION has been set.
|
||||||
|
return QStringList(QLatin1String("/system/fonts"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return QStringList(writableLocation(type));
|
return QStringList(writableLocation(type));
|
||||||
|
@ -511,7 +511,7 @@ static int decode(QString &appendTo, const ushort *begin, const ushort *end)
|
|||||||
if (Q_UNLIKELY(end - input < 3 || !isHex(input[1]) || !isHex(input[2]))) {
|
if (Q_UNLIKELY(end - input < 3 || !isHex(input[1]) || !isHex(input[2]))) {
|
||||||
// badly-encoded data
|
// badly-encoded data
|
||||||
appendTo.resize(origSize + (end - begin));
|
appendTo.resize(origSize + (end - begin));
|
||||||
memcpy(appendTo.begin() + origSize, begin, (end - begin) * sizeof(ushort));
|
memcpy(static_cast<void *>(appendTo.begin() + origSize), static_cast<const void *>(begin), (end - begin) * sizeof(ushort));
|
||||||
return end - begin;
|
return end - begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,7 +519,7 @@ static int decode(QString &appendTo, const ushort *begin, const ushort *end)
|
|||||||
// detach
|
// detach
|
||||||
appendTo.resize(origSize + (end - begin));
|
appendTo.resize(origSize + (end - begin));
|
||||||
output = reinterpret_cast<ushort *>(appendTo.begin()) + origSize;
|
output = reinterpret_cast<ushort *>(appendTo.begin()) + origSize;
|
||||||
memcpy(output, begin, (input - begin) * sizeof(ushort));
|
memcpy(static_cast<void *>(output), static_cast<const void *>(begin), (input - begin) * sizeof(ushort));
|
||||||
output += input - begin;
|
output += input - begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1238
src/corelib/json/qjsonarray.cpp
Normal file
1238
src/corelib/json/qjsonarray.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -200,7 +200,7 @@ qnx:qtConfig(qqnx_pps) {
|
|||||||
kernel/qppsobjectprivate_p.h
|
kernel/qppsobjectprivate_p.h
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android:!android-embedded {
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
kernel/qjnionload.cpp \
|
kernel/qjnionload.cpp \
|
||||||
kernel/qjnihelpers.cpp \
|
kernel/qjnihelpers.cpp \
|
||||||
|
@ -95,7 +95,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif // QT_NO_QOBJECT
|
#endif // QT_NO_QOBJECT
|
||||||
|
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
# include <private/qjni_p.h>
|
# include <private/qjni_p.h>
|
||||||
# include <private/qjnihelpers_p.h>
|
# include <private/qjnihelpers_p.h>
|
||||||
#endif
|
#endif
|
||||||
@ -186,7 +186,7 @@ QString QCoreApplicationPrivate::appVersion() const
|
|||||||
#ifndef QT_BOOTSTRAPPED
|
#ifndef QT_BOOTSTRAPPED
|
||||||
# ifdef Q_OS_DARWIN
|
# ifdef Q_OS_DARWIN
|
||||||
applicationVersion = infoDictionaryStringProperty(QStringLiteral("CFBundleVersion"));
|
applicationVersion = infoDictionaryStringProperty(QStringLiteral("CFBundleVersion"));
|
||||||
# elif defined(Q_OS_ANDROID)
|
# elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
QJNIObjectPrivate context(QtAndroidPrivate::context());
|
QJNIObjectPrivate context(QtAndroidPrivate::context());
|
||||||
if (context.isValid()) {
|
if (context.isValid()) {
|
||||||
QJNIObjectPrivate pm = context.callObjectMethod(
|
QJNIObjectPrivate pm = context.callObjectMethod(
|
||||||
@ -816,6 +816,14 @@ void QCoreApplicationPrivate::init()
|
|||||||
if (!coreappdata()->applicationVersionSet)
|
if (!coreappdata()->applicationVersionSet)
|
||||||
coreappdata()->applicationVersion = appVersion();
|
coreappdata()->applicationVersion = appVersion();
|
||||||
|
|
||||||
|
#if defined(Q_OS_ANDROID)
|
||||||
|
// We've deferred initializing the logging registry due to not being
|
||||||
|
// able to guarantee that logging happened on the same thread as the
|
||||||
|
// Qt main thread, but now that the Qt main thread is set up, we can
|
||||||
|
// enable categorized logging.
|
||||||
|
QLoggingRegistry::instance()->initializeRules();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if QT_CONFIG(library)
|
#if QT_CONFIG(library)
|
||||||
// Reset the lib paths, so that they will be recomputed, taking the availability of argv[0]
|
// Reset the lib paths, so that they will be recomputed, taking the availability of argv[0]
|
||||||
// into account. If necessary, recompute right away and replay the manual changes on top of the
|
// into account. If necessary, recompute right away and replay the manual changes on top of the
|
||||||
@ -2266,7 +2274,7 @@ QString QCoreApplication::applicationFilePath()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined( Q_OS_UNIX )
|
#if defined( Q_OS_UNIX )
|
||||||
# if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
|
# if defined(Q_OS_LINUX) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED))
|
||||||
// Try looking for a /proc/<pid>/exe symlink first which points to
|
// Try looking for a /proc/<pid>/exe symlink first which points to
|
||||||
// the absolute path of the executable
|
// the absolute path of the executable
|
||||||
QFileInfo pfi(QString::fromLatin1("/proc/%1/exe").arg(getpid()));
|
QFileInfo pfi(QString::fromLatin1("/proc/%1/exe").arg(getpid()));
|
||||||
|
@ -239,22 +239,35 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
|
|||||||
if (lib)
|
if (lib)
|
||||||
lib->errorString = file.errorString();
|
lib->errorString = file.errorString();
|
||||||
if (qt_debug_component()) {
|
if (qt_debug_component()) {
|
||||||
qWarning("%s: %s", (const char*) QFile::encodeName(library),
|
qWarning("%s: %s", QFile::encodeName(library).constData(),
|
||||||
qPrintable(QSystemError::stdString()));
|
qPrintable(QSystemError::stdString()));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray data;
|
QByteArray data;
|
||||||
const char *filedata = 0;
|
|
||||||
ulong fdlen = file.size();
|
ulong fdlen = file.size();
|
||||||
filedata = (char *) file.map(0, fdlen);
|
const char *filedata = reinterpret_cast<char *>(file.map(0, fdlen));
|
||||||
|
|
||||||
if (filedata == 0) {
|
if (filedata == 0) {
|
||||||
// try reading the data into memory instead
|
if (uchar *mapdata = file.map(0, 1)) {
|
||||||
|
file.unmap(mapdata);
|
||||||
|
// Mapping is supported, but failed for the entire file, likely due to OOM.
|
||||||
|
// Return false, as readAll() would cause a bad_alloc and terminate the process.
|
||||||
|
if (lib)
|
||||||
|
lib->errorString = QLibrary::tr("Out of memory while loading plugin '%1'.").arg(library);
|
||||||
|
if (qt_debug_component()) {
|
||||||
|
qWarning("%s: %s", QFile::encodeName(library).constData(),
|
||||||
|
qPrintable(QSystemError::stdString(ENOMEM)));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// Try reading the data into memory instead.
|
||||||
data = file.readAll();
|
data = file.readAll();
|
||||||
filedata = data.constData();
|
filedata = data.constData();
|
||||||
fdlen = data.size();
|
fdlen = data.size();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ELF and Mach-O binaries with GCC have .qplugin sections.
|
ELF and Mach-O binaries with GCC have .qplugin sections.
|
||||||
@ -751,7 +764,7 @@ void QLibraryPrivate::updatePluginState()
|
|||||||
if (qt_debug_component()) {
|
if (qt_debug_component()) {
|
||||||
qWarning("In %s:\n"
|
qWarning("In %s:\n"
|
||||||
" Plugin uses incompatible Qt library (%d.%d.%d) [%s]",
|
" Plugin uses incompatible Qt library (%d.%d.%d) [%s]",
|
||||||
(const char*) QFile::encodeName(fileName),
|
QFile::encodeName(fileName).constData(),
|
||||||
(qt_version&0xff0000) >> 16, (qt_version&0xff00) >> 8, qt_version&0xff,
|
(qt_version&0xff0000) >> 16, (qt_version&0xff00) >> 8, qt_version&0xff,
|
||||||
debug ? "debug" : "release");
|
debug ? "debug" : "release");
|
||||||
}
|
}
|
||||||
|
@ -44,25 +44,17 @@
|
|||||||
#include <qcoreapplication.h>
|
#include <qcoreapplication.h>
|
||||||
#include <private/qfilesystementry_p.h>
|
#include <private/qfilesystementry_p.h>
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
# include <private/qcore_mac_p.h>
|
# include <private/qcore_mac_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
#if !defined(QT_HPUX_LD)
|
|
||||||
QT_BEGIN_INCLUDE_NAMESPACE
|
|
||||||
#include <dlfcn.h>
|
|
||||||
QT_END_INCLUDE_NAMESPACE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static QString qdlerror()
|
static QString qdlerror()
|
||||||
{
|
{
|
||||||
#if !defined(QT_HPUX_LD)
|
|
||||||
const char *err = dlerror();
|
const char *err = dlerror();
|
||||||
#else
|
|
||||||
const char *err = strerror(errno);
|
|
||||||
#endif
|
|
||||||
return err ? QLatin1Char('(') + QString::fromLocal8Bit(err) + QLatin1Char(')'): QString();
|
return err ? QLatin1Char('(') + QString::fromLocal8Bit(err) + QLatin1Char(')'): QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,14 +131,6 @@ bool QLibraryPrivate::load_sys()
|
|||||||
suffixes = suffixes_sys(fullVersion);
|
suffixes = suffixes_sys(fullVersion);
|
||||||
}
|
}
|
||||||
int dlFlags = 0;
|
int dlFlags = 0;
|
||||||
#if defined(QT_HPUX_LD)
|
|
||||||
dlFlags = DYNAMIC_PATH | BIND_NONFATAL;
|
|
||||||
if (loadHints & QLibrary::ResolveAllSymbolsHint) {
|
|
||||||
dlFlags |= BIND_IMMEDIATE;
|
|
||||||
} else {
|
|
||||||
dlFlags |= BIND_DEFERRED;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int loadHints = this->loadHints();
|
int loadHints = this->loadHints();
|
||||||
if (loadHints & QLibrary::ResolveAllSymbolsHint) {
|
if (loadHints & QLibrary::ResolveAllSymbolsHint) {
|
||||||
dlFlags |= RTLD_NOW;
|
dlFlags |= RTLD_NOW;
|
||||||
@ -182,7 +166,6 @@ bool QLibraryPrivate::load_sys()
|
|||||||
dlFlags |= RTLD_MEMBER;
|
dlFlags |= RTLD_MEMBER;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif // QT_HPUX_LD
|
|
||||||
|
|
||||||
// If the filename is an absolute path then we want to try that first as it is most likely
|
// If the filename is an absolute path then we want to try that first as it is most likely
|
||||||
// what the callee wants. If we have been given a non-absolute path then lets try the
|
// what the callee wants. If we have been given a non-absolute path then lets try the
|
||||||
@ -211,11 +194,7 @@ bool QLibraryPrivate::load_sys()
|
|||||||
} else {
|
} else {
|
||||||
attempt = path + prefixes.at(prefix) + name + suffixes.at(suffix);
|
attempt = path + prefixes.at(prefix) + name + suffixes.at(suffix);
|
||||||
}
|
}
|
||||||
#if defined(QT_HPUX_LD)
|
|
||||||
pHnd = (void*)shl_load(QFile::encodeName(attempt), dlFlags, 0);
|
|
||||||
#else
|
|
||||||
pHnd = dlopen(QFile::encodeName(attempt), dlFlags);
|
pHnd = dlopen(QFile::encodeName(attempt), dlFlags);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!pHnd && fileName.startsWith(QLatin1Char('/')) && QFile::exists(attempt)) {
|
if (!pHnd && fileName.startsWith(QLatin1Char('/')) && QFile::exists(attempt)) {
|
||||||
// We only want to continue if dlopen failed due to that the shared library did not exist.
|
// We only want to continue if dlopen failed due to that the shared library did not exist.
|
||||||
@ -253,11 +232,7 @@ bool QLibraryPrivate::load_sys()
|
|||||||
|
|
||||||
bool QLibraryPrivate::unload_sys()
|
bool QLibraryPrivate::unload_sys()
|
||||||
{
|
{
|
||||||
#if defined(QT_HPUX_LD)
|
|
||||||
if (shl_unload((shl_t)pHnd)) {
|
|
||||||
#else
|
|
||||||
if (dlclose(pHnd)) {
|
if (dlclose(pHnd)) {
|
||||||
#endif
|
|
||||||
#if defined (Q_OS_QNX) // Workaround until fixed in QNX; fixes crash in
|
#if defined (Q_OS_QNX) // Workaround until fixed in QNX; fixes crash in
|
||||||
char *error = dlerror(); // QtDeclarative auto test "qqmlenginecleanup" for instance
|
char *error = dlerror(); // QtDeclarative auto test "qqmlenginecleanup" for instance
|
||||||
if (!qstrcmp(error, "Shared objects still referenced")) // On QNX that's only "informative"
|
if (!qstrcmp(error, "Shared objects still referenced")) // On QNX that's only "informative"
|
||||||
@ -289,13 +264,7 @@ Q_CORE_EXPORT QFunctionPointer qt_mac_resolve_sys(void *handle, const char *symb
|
|||||||
|
|
||||||
QFunctionPointer QLibraryPrivate::resolve_sys(const char* symbol)
|
QFunctionPointer QLibraryPrivate::resolve_sys(const char* symbol)
|
||||||
{
|
{
|
||||||
#if defined(QT_HPUX_LD)
|
|
||||||
QFunctionPointer address = 0;
|
|
||||||
if (shl_findsym((shl_t*)&pHnd, symbol, TYPE_UNDEFINED, &address) < 0)
|
|
||||||
address = 0;
|
|
||||||
#else
|
|
||||||
QFunctionPointer address = QFunctionPointer(dlsym(pHnd, symbol));
|
QFunctionPointer address = QFunctionPointer(dlsym(pHnd, symbol));
|
||||||
#endif
|
|
||||||
if (!address) {
|
if (!address) {
|
||||||
errorString = QLibrary::tr("Cannot resolve symbol \"%1\" in %2: %3").arg(
|
errorString = QLibrary::tr("Cannot resolve symbol \"%1\" in %2: %3").arg(
|
||||||
QString::fromLatin1(symbol), fileName, qdlerror());
|
QString::fromLatin1(symbol), fileName, qdlerror());
|
||||||
|
@ -76,7 +76,8 @@ struct QPodArrayOps
|
|||||||
Q_ASSERT(b < e);
|
Q_ASSERT(b < e);
|
||||||
Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
|
Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
|
||||||
|
|
||||||
::memcpy(this->end(), b, (e - b) * sizeof(T));
|
::memcpy(static_cast<void *>(this->end()), static_cast<const void *>(b),
|
||||||
|
(e - b) * sizeof(T));
|
||||||
this->size += e - b;
|
this->size += e - b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3855,14 +3855,14 @@ QString& QString::replace(const QRegExp &rx, const QString &after)
|
|||||||
while (i < pos) {
|
while (i < pos) {
|
||||||
int copyend = replacements[i].pos;
|
int copyend = replacements[i].pos;
|
||||||
int size = copyend - copystart;
|
int size = copyend - copystart;
|
||||||
memcpy(uc, d->data() + copystart, size * sizeof(QChar));
|
memcpy(static_cast<void*>(uc), static_cast<const void *>(d->data() + copystart), size * sizeof(QChar));
|
||||||
uc += size;
|
uc += size;
|
||||||
memcpy(uc, after.d->data(), al * sizeof(QChar));
|
memcpy(static_cast<void *>(uc), static_cast<const void *>(after.d->data()), al * sizeof(QChar));
|
||||||
uc += al;
|
uc += al;
|
||||||
copystart = copyend + replacements[i].length;
|
copystart = copyend + replacements[i].length;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
memcpy(uc, d->data() + copystart, (d->size - copystart) * sizeof(QChar));
|
memcpy(static_cast<void *>(uc), static_cast<const void *>(d->data() + copystart), (d->size - copystart) * sizeof(QChar));
|
||||||
newstring.resize(newlen);
|
newstring.resize(newlen);
|
||||||
*this = newstring;
|
*this = newstring;
|
||||||
caretMode = QRegExp::CaretWontMatch;
|
caretMode = QRegExp::CaretWontMatch;
|
||||||
@ -6309,7 +6309,7 @@ QString QString::rightJustified(int width, QChar fill, bool truncate) const
|
|||||||
while (padlen--)
|
while (padlen--)
|
||||||
* uc++ = fill;
|
* uc++ = fill;
|
||||||
if (len)
|
if (len)
|
||||||
memcpy(uc, d->data(), sizeof(QChar)*len);
|
memcpy(static_cast<void *>(uc), static_cast<const void *>(d->data()), sizeof(QChar)*len);
|
||||||
} else {
|
} else {
|
||||||
if (truncate)
|
if (truncate)
|
||||||
result = left(width);
|
result = left(width);
|
||||||
@ -11834,7 +11834,7 @@ QString QString::toHtmlEscaped() const
|
|||||||
This cost can be avoided by using QStringLiteral instead:
|
This cost can be avoided by using QStringLiteral instead:
|
||||||
|
|
||||||
\code
|
\code
|
||||||
if (node.hasAttribute(QStringLiteral("http-contents-length"))) //...
|
if (node.hasAttribute(QStringLiteral(u"http-contents-length"))) //...
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
In this case, QString's internal data will be generated at compile time; no
|
In this case, QString's internal data will be generated at compile time; no
|
||||||
@ -11854,6 +11854,10 @@ QString QString::toHtmlEscaped() const
|
|||||||
if (attribute.name() == QLatin1String("http-contents-length")) //...
|
if (attribute.name() == QLatin1String("http-contents-length")) //...
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
|
\note Some compilers have bugs encoding strings containing characters outside
|
||||||
|
the US-ASCII character set. Make sure you prefix your string with \c{u} in
|
||||||
|
those cases. It is optional otherwise.
|
||||||
|
|
||||||
\sa QByteArrayLiteral
|
\sa QByteArrayLiteral
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -62,9 +62,9 @@ static QTimeZonePrivate *newBackendTimeZone()
|
|||||||
#else
|
#else
|
||||||
#if defined Q_OS_MAC
|
#if defined Q_OS_MAC
|
||||||
return new QMacTimeZonePrivate();
|
return new QMacTimeZonePrivate();
|
||||||
#elif defined Q_OS_ANDROID
|
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
return new QAndroidTimeZonePrivate();
|
return new QAndroidTimeZonePrivate();
|
||||||
#elif defined Q_OS_UNIX
|
#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
return new QTzTimeZonePrivate();
|
return new QTzTimeZonePrivate();
|
||||||
// Registry based timezone backend not available on WinRT
|
// Registry based timezone backend not available on WinRT
|
||||||
#elif defined Q_OS_WIN
|
#elif defined Q_OS_WIN
|
||||||
@ -89,9 +89,9 @@ static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId)
|
|||||||
#else
|
#else
|
||||||
#if defined Q_OS_MAC
|
#if defined Q_OS_MAC
|
||||||
return new QMacTimeZonePrivate(ianaId);
|
return new QMacTimeZonePrivate(ianaId);
|
||||||
#elif defined Q_OS_ANDROID
|
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
return new QAndroidTimeZonePrivate(ianaId);
|
return new QAndroidTimeZonePrivate(ianaId);
|
||||||
#elif defined Q_OS_UNIX
|
#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
return new QTzTimeZonePrivate(ianaId);
|
return new QTzTimeZonePrivate(ianaId);
|
||||||
// Registry based timezone backend not available on WinRT
|
// Registry based timezone backend not available on WinRT
|
||||||
#elif defined Q_OS_WIN
|
#elif defined Q_OS_WIN
|
||||||
|
@ -68,7 +68,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
|
|||||||
#include <qt_windows.h>
|
#include <qt_windows.h>
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
#include <QtCore/private/qjni_p.h>
|
#include <QtCore/private/qjni_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -266,7 +266,7 @@ private:
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined Q_OS_UNIX && !defined Q_OS_MAC && !defined Q_OS_ANDROID
|
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED))
|
||||||
struct QTzTransitionTime
|
struct QTzTransitionTime
|
||||||
{
|
{
|
||||||
qint64 atMSecsSinceEpoch;
|
qint64 atMSecsSinceEpoch;
|
||||||
@ -442,7 +442,7 @@ private:
|
|||||||
};
|
};
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
class QAndroidTimeZonePrivate final : public QTimeZonePrivate
|
class QAndroidTimeZonePrivate final : public QTimeZonePrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -344,7 +344,7 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, in
|
|||||||
while (s < asize)
|
while (s < asize)
|
||||||
new (ptr+(s++)) T(*abuf++);
|
new (ptr+(s++)) T(*abuf++);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&ptr[s], abuf, increment * sizeof(T));
|
memcpy(static_cast<void *>(&ptr[s]), static_cast<const void *>(abuf), increment * sizeof(T));
|
||||||
s = asize;
|
s = asize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,7 +392,7 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(int asize, int a
|
|||||||
QT_RETHROW;
|
QT_RETHROW;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(ptr, oldPtr, copySize * sizeof(T));
|
memcpy(static_cast<void *>(ptr), static_cast<const void *>(oldPtr), copySize * sizeof(T));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s = copySize;
|
s = copySize;
|
||||||
|
@ -747,7 +747,7 @@ typename QVector<T>::iterator QVector<T>::insert(iterator before, size_type n, c
|
|||||||
} else {
|
} else {
|
||||||
T *b = d->begin() + offset;
|
T *b = d->begin() + offset;
|
||||||
T *i = b + n;
|
T *i = b + n;
|
||||||
memmove(i, b, (d->size - offset) * sizeof(T));
|
memmove(static_cast<void *>(i), static_cast<const void *>(b), (d->size - offset) * sizeof(T));
|
||||||
while (i != b)
|
while (i != b)
|
||||||
new (--i) T(copy);
|
new (--i) T(copy);
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ qtConfig(timezone) {
|
|||||||
tools/qtimezoneprivate.cpp
|
tools/qtimezoneprivate.cpp
|
||||||
!nacl:darwin: \
|
!nacl:darwin: \
|
||||||
SOURCES += tools/qtimezoneprivate_mac.mm
|
SOURCES += tools/qtimezoneprivate_mac.mm
|
||||||
else: android: \
|
else: android:!android-embedded: \
|
||||||
SOURCES += tools/qtimezoneprivate_android.cpp
|
SOURCES += tools/qtimezoneprivate_android.cpp
|
||||||
else: unix: \
|
else: unix: \
|
||||||
SOURCES += tools/qtimezoneprivate_tz.cpp
|
SOURCES += tools/qtimezoneprivate_tz.cpp
|
||||||
|
1966
src/corelib/xml/qxmlstream_p.h
Normal file
1966
src/corelib/xml/qxmlstream_p.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
** Contact: https://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.
|
||||||
@ -200,6 +200,15 @@
|
|||||||
Information about the messages will be written to the console the application
|
Information about the messages will be written to the console the application
|
||||||
was launched from.
|
was launched from.
|
||||||
|
|
||||||
|
\section1 Licenses
|
||||||
|
|
||||||
|
The Qt D-Bus module is available under commercial licenses from \l{The Qt Company}.
|
||||||
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
|
the \l{GNU General Public License, version 2}.
|
||||||
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
\section1 Further Reading
|
\section1 Further Reading
|
||||||
|
|
||||||
The following documents contain information about Qt's D-Bus integration
|
The following documents contain information about Qt's D-Bus integration
|
||||||
|
@ -167,25 +167,20 @@
|
|||||||
"label": "Fontconfig",
|
"label": "Fontconfig",
|
||||||
"test": {
|
"test": {
|
||||||
"head": [
|
"head": [
|
||||||
"#include <ft2build.h>",
|
|
||||||
"#include FT_FREETYPE_H",
|
|
||||||
"#include <fontconfig/fontconfig.h>",
|
"#include <fontconfig/fontconfig.h>",
|
||||||
"#ifndef FC_RGBA_UNKNOWN",
|
"#ifndef FC_RGBA_UNKNOWN",
|
||||||
"# error This version of fontconfig is tool old, it is missing the FC_RGBA_UNKNOWN define",
|
"# error This version of fontconfig is tool old, it is missing the FC_RGBA_UNKNOWN define",
|
||||||
"#endif",
|
|
||||||
"#if ((FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH) < 20110)",
|
|
||||||
"# error This version of freetype is too old.",
|
|
||||||
"#endif"
|
"#endif"
|
||||||
],
|
],
|
||||||
"main": [
|
"main": [
|
||||||
"FT_Face face = 0;",
|
|
||||||
"FcPattern *pattern = 0;"
|
"FcPattern *pattern = 0;"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sources": [
|
"sources": [
|
||||||
{ "type": "pkgConfig", "args": "fontconfig freetype2" },
|
{ "type": "pkgConfig", "args": "fontconfig" },
|
||||||
{ "type": "freetype", "libs": "-lfontconfig -lfreetype" }
|
{ "type": "freetype", "libs": "-lfontconfig" }
|
||||||
]
|
],
|
||||||
|
"use": "freetype"
|
||||||
},
|
},
|
||||||
"gbm": {
|
"gbm": {
|
||||||
"label": "GBM",
|
"label": "GBM",
|
||||||
@ -637,7 +632,13 @@
|
|||||||
"angle_d3d11_qdtd": {
|
"angle_d3d11_qdtd": {
|
||||||
"label": "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT",
|
"label": "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT",
|
||||||
"type": "compile",
|
"type": "compile",
|
||||||
"test": "win/angle_d3d11_qdtd"
|
"test": {
|
||||||
|
"include": "d3d11.h",
|
||||||
|
"main": [
|
||||||
|
"D3D11_QUERY_DATA_TIMESTAMP_DISJOINT qdtd;",
|
||||||
|
"(void) qdtd;"
|
||||||
|
]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"directwrite2": {
|
"directwrite2": {
|
||||||
"label": "DirectWrite 2",
|
"label": "DirectWrite 2",
|
||||||
|
@ -215,12 +215,13 @@
|
|||||||
\section1 Licenses and Attributions
|
\section1 Licenses and Attributions
|
||||||
|
|
||||||
Qt GUI is available under commercial licenses from \l{The Qt Company}.
|
Qt GUI is available under commercial licenses from \l{The Qt Company}.
|
||||||
In addition, it is available under the
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
\l{GNU Lesser General Public License, version 3}, or
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
the \l{GNU General Public License, version 2}.
|
the \l{GNU General Public License, version 2}.
|
||||||
See \l{Qt Licensing} for further details.
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
Furthermore Qt GUI potentially contains third party
|
Furthermore, Qt GUI in Qt \QtVersion may contain third-party
|
||||||
modules under following permissive licenses:
|
modules under following permissive licenses:
|
||||||
|
|
||||||
\generatelist{groupsbymodule attributions-qtgui}
|
\generatelist{groupsbymodule attributions-qtgui}
|
||||||
|
@ -2122,7 +2122,7 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE
|
|||||||
QWindow *window = e->window.data();
|
QWindow *window = e->window.data();
|
||||||
modifier_buttons = e->modifiers;
|
modifier_buttons = e->modifiers;
|
||||||
if (e->nullWindow()
|
if (e->nullWindow()
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
|| e->key == Qt::Key_Back || e->key == Qt::Key_Menu
|
|| e->key == Qt::Key_Back || e->key == Qt::Key_Menu
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
@ -2158,7 +2158,7 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE
|
|||||||
|
|
||||||
if (window && !window->d_func()->blockedByModalWindow)
|
if (window && !window->d_func()->blockedByModalWindow)
|
||||||
QGuiApplication::sendSpontaneousEvent(window, &ev);
|
QGuiApplication::sendSpontaneousEvent(window, &ev);
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
else
|
else
|
||||||
ev.setAccepted(false);
|
ev.setAccepted(false);
|
||||||
|
|
||||||
|
@ -1002,6 +1002,7 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
|
|||||||
if (rendererString)
|
if (rendererString)
|
||||||
needsWorkaround =
|
needsWorkaround =
|
||||||
qstrncmp(rendererString, "Mali-4xx", 6) == 0 // Mali-400, Mali-450
|
qstrncmp(rendererString, "Mali-4xx", 6) == 0 // Mali-400, Mali-450
|
||||||
|
|| qstrcmp(rendererString, "Mali-T880") == 0
|
||||||
|| qstrncmp(rendererString, "Adreno (TM) 2xx", 13) == 0 // Adreno 200, 203, 205
|
|| qstrncmp(rendererString, "Adreno (TM) 2xx", 13) == 0 // Adreno 200, 203, 205
|
||||||
|| qstrncmp(rendererString, "Adreno 2xx", 8) == 0 // Same as above but without the '(TM)'
|
|| qstrncmp(rendererString, "Adreno 2xx", 8) == 0 // Same as above but without the '(TM)'
|
||||||
|| qstrncmp(rendererString, "Adreno (TM) 30x", 14) == 0 // Adreno 302, 305
|
|| qstrncmp(rendererString, "Adreno (TM) 30x", 14) == 0 // Adreno 302, 305
|
||||||
|
@ -287,6 +287,8 @@ void QPlatformInputContext::setSelectionOnFocusObject(const QPointF &anchorPos,
|
|||||||
if (success) {
|
if (success) {
|
||||||
int cursor = QInputMethod::queryFocusObject(Qt::ImCursorPosition, cursorPos * mapToLocal).toInt(&success);
|
int cursor = QInputMethod::queryFocusObject(Qt::ImCursorPosition, cursorPos * mapToLocal).toInt(&success);
|
||||||
if (success) {
|
if (success) {
|
||||||
|
if (anchor == cursor && anchorPos != cursorPos)
|
||||||
|
return;
|
||||||
QList<QInputMethodEvent::Attribute> imAttributes;
|
QList<QInputMethodEvent::Attribute> imAttributes;
|
||||||
imAttributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection, anchor, cursor - anchor, QVariant()));
|
imAttributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection, anchor, cursor - anchor, QVariant()));
|
||||||
QInputMethodEvent event(QString(), imAttributes);
|
QInputMethodEvent event(QString(), imAttributes);
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
|
|
||||||
#include <QtCore/QEventLoop>
|
#include <QtCore/QEventLoop>
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QLoggingCategory>
|
||||||
|
|
||||||
#include <private/qguiapplication_p.h>
|
#include <private/qguiapplication_p.h>
|
||||||
#include <private/qdnd_p.h>
|
#include <private/qdnd_p.h>
|
||||||
@ -69,6 +70,8 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
#ifndef QT_NO_DRAGANDDROP
|
#ifndef QT_NO_DRAGANDDROP
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(lcDnd, "qt.gui.dnd")
|
||||||
|
|
||||||
static QWindow* topLevelAt(const QPoint &pos)
|
static QWindow* topLevelAt(const QPoint &pos)
|
||||||
{
|
{
|
||||||
QWindowList list = QGuiApplication::topLevelWindows();
|
QWindowList list = QGuiApplication::topLevelWindows();
|
||||||
@ -94,9 +97,9 @@ static QWindow* topLevelAt(const QPoint &pos)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
QBasicDrag::QBasicDrag() :
|
QBasicDrag::QBasicDrag() :
|
||||||
m_restoreCursor(false), m_eventLoop(0),
|
m_current_window(nullptr), m_restoreCursor(false), m_eventLoop(nullptr),
|
||||||
m_executed_drop_action(Qt::IgnoreAction), m_can_drop(false),
|
m_executed_drop_action(Qt::IgnoreAction), m_can_drop(false),
|
||||||
m_drag(0), m_drag_icon_window(0), m_useCompositing(true),
|
m_drag(nullptr), m_drag_icon_window(nullptr), m_useCompositing(true),
|
||||||
m_screen(nullptr)
|
m_screen(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -161,6 +164,7 @@ bool QBasicDrag::eventFilter(QObject *o, QEvent *e)
|
|||||||
return true; // Eat all mouse move events
|
return true; // Eat all mouse move events
|
||||||
}
|
}
|
||||||
case QEvent::MouseButtonRelease:
|
case QEvent::MouseButtonRelease:
|
||||||
|
{
|
||||||
disableEventFilter();
|
disableEventFilter();
|
||||||
if (canDrop()) {
|
if (canDrop()) {
|
||||||
QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window);
|
QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window);
|
||||||
@ -169,8 +173,25 @@ bool QBasicDrag::eventFilter(QObject *o, QEvent *e)
|
|||||||
cancel();
|
cancel();
|
||||||
}
|
}
|
||||||
exitDndEventLoop();
|
exitDndEventLoop();
|
||||||
QCoreApplication::postEvent(o, new QMouseEvent(*static_cast<QMouseEvent *>(e)));
|
|
||||||
|
// If a QShapedPixmapWindow (drag feedback) is being dragged along, the
|
||||||
|
// mouse event's localPos() will be relative to that, which is useless.
|
||||||
|
// We want a position relative to the window where the drag ends, if possible (?).
|
||||||
|
// If there is no such window (belonging to this Qt application),
|
||||||
|
// make the event relative to the window where the drag started. (QTBUG-66103)
|
||||||
|
const QMouseEvent *release = static_cast<QMouseEvent *>(e);
|
||||||
|
const QWindow *releaseWindow = topLevelAt(release->globalPos());
|
||||||
|
qCDebug(lcDnd) << "mouse released over" << releaseWindow << "after drag from" << m_current_window << "globalPos" << release->globalPos();
|
||||||
|
if (!releaseWindow)
|
||||||
|
releaseWindow = m_current_window;
|
||||||
|
QPoint releaseWindowPos = (releaseWindow ? releaseWindow->mapFromGlobal(release->globalPos()) : release->globalPos());
|
||||||
|
QMouseEvent *newRelease = new QMouseEvent(release->type(),
|
||||||
|
releaseWindowPos, releaseWindowPos, release->screenPos(),
|
||||||
|
release->button(), release->buttons(),
|
||||||
|
release->modifiers(), release->source());
|
||||||
|
QCoreApplication::postEvent(o, newRelease);
|
||||||
return true; // defer mouse release events until drag event loop has returned
|
return true; // defer mouse release events until drag event loop has returned
|
||||||
|
}
|
||||||
case QEvent::MouseButtonDblClick:
|
case QEvent::MouseButtonDblClick:
|
||||||
case QEvent::Wheel:
|
case QEvent::Wheel:
|
||||||
return true;
|
return true;
|
||||||
@ -349,7 +370,7 @@ static inline QPoint fromNativeGlobalPixels(const QPoint &point)
|
|||||||
into account.
|
into account.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
QSimpleDrag::QSimpleDrag() : m_current_window(0)
|
QSimpleDrag::QSimpleDrag()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,6 +387,7 @@ void QSimpleDrag::startDrag()
|
|||||||
updateCursor(Qt::IgnoreAction);
|
updateCursor(Qt::IgnoreAction);
|
||||||
}
|
}
|
||||||
setExecutedDropAction(Qt::IgnoreAction);
|
setExecutedDropAction(Qt::IgnoreAction);
|
||||||
|
qCDebug(lcDnd) << "drag began from" << m_current_window<< "cursor pos" << QCursor::pos() << "can drop?" << canDrop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QSimpleDrag::cancel()
|
void QSimpleDrag::cancel()
|
||||||
|
@ -105,6 +105,9 @@ protected:
|
|||||||
|
|
||||||
QDrag *drag() const { return m_drag; }
|
QDrag *drag() const { return m_drag; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QWindow *m_current_window;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void enableEventFilter();
|
void enableEventFilter();
|
||||||
void disableEventFilter();
|
void disableEventFilter();
|
||||||
@ -131,9 +134,6 @@ protected:
|
|||||||
virtual void cancel() override;
|
virtual void cancel() override;
|
||||||
virtual void move(const QPoint &globalPos) override;
|
virtual void move(const QPoint &globalPos) override;
|
||||||
virtual void drop(const QPoint &globalPos) override;
|
virtual void drop(const QPoint &globalPos) override;
|
||||||
|
|
||||||
private:
|
|
||||||
QWindow *m_current_window;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QT_NO_DRAGANDDROP
|
#endif // QT_NO_DRAGANDDROP
|
||||||
|
@ -65,10 +65,10 @@ public:
|
|||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
// ### Qt 6: remove; the compiler-generated ones are fine!
|
// ### Qt 6: remove; the compiler-generated ones are fine!
|
||||||
QMatrix &operator=(QMatrix &&other) Q_DECL_NOTHROW // = default
|
QMatrix &operator=(QMatrix &&other) Q_DECL_NOTHROW // = default
|
||||||
{ memcpy(this, &other, sizeof(QMatrix)); return *this; }
|
{ memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QMatrix)); return *this; }
|
||||||
QMatrix &operator=(const QMatrix &) Q_DECL_NOTHROW; // = default
|
QMatrix &operator=(const QMatrix &) Q_DECL_NOTHROW; // = default
|
||||||
QMatrix(QMatrix &&other) Q_DECL_NOTHROW // = default
|
QMatrix(QMatrix &&other) Q_DECL_NOTHROW // = default
|
||||||
{ memcpy(this, &other, sizeof(QMatrix)); }
|
{ memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QMatrix)); }
|
||||||
QMatrix(const QMatrix &other) Q_DECL_NOTHROW; // = default
|
QMatrix(const QMatrix &other) Q_DECL_NOTHROW; // = default
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -78,14 +78,14 @@ public:
|
|||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
// ### Qt 6: remove; the compiler-generated ones are fine!
|
// ### Qt 6: remove; the compiler-generated ones are fine!
|
||||||
QTransform &operator=(QTransform &&other) Q_DECL_NOTHROW // = default
|
QTransform &operator=(QTransform &&other) Q_DECL_NOTHROW // = default
|
||||||
{ memcpy(this, &other, sizeof(QTransform)); return *this; }
|
{ memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QTransform)); return *this; }
|
||||||
QTransform &operator=(const QTransform &) Q_DECL_NOTHROW; // = default
|
QTransform &operator=(const QTransform &) Q_DECL_NOTHROW; // = default
|
||||||
QTransform(QTransform &&other) Q_DECL_NOTHROW // = default
|
QTransform(QTransform &&other) Q_DECL_NOTHROW // = default
|
||||||
: affine(Qt::Uninitialized)
|
: affine(Qt::Uninitialized)
|
||||||
{ memcpy(this, &other, sizeof(QTransform)); }
|
{ memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QTransform)); }
|
||||||
QTransform(const QTransform &other) Q_DECL_NOTHROW // = default
|
QTransform(const QTransform &other) Q_DECL_NOTHROW // = default
|
||||||
: affine(Qt::Uninitialized)
|
: affine(Qt::Uninitialized)
|
||||||
{ memcpy(this, &other, sizeof(QTransform)); }
|
{ memcpy(static_cast<void *>(this), static_cast<const void *>(&other), sizeof(QTransform)); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool isAffine() const;
|
bool isAffine() const;
|
||||||
|
@ -236,13 +236,13 @@ struct QGlyphLayout
|
|||||||
last = numGlyphs;
|
last = numGlyphs;
|
||||||
if (first == 0 && last == numGlyphs
|
if (first == 0 && last == numGlyphs
|
||||||
&& reinterpret_cast<char *>(offsets + numGlyphs) == reinterpret_cast<char *>(glyphs)) {
|
&& reinterpret_cast<char *>(offsets + numGlyphs) == reinterpret_cast<char *>(glyphs)) {
|
||||||
memset(offsets, 0, (numGlyphs * SpaceNeeded));
|
memset(static_cast<void *>(offsets), 0, (numGlyphs * SpaceNeeded));
|
||||||
} else {
|
} else {
|
||||||
const int num = last - first;
|
const int num = last - first;
|
||||||
memset(offsets + first, 0, num * sizeof(QFixedPoint));
|
memset(static_cast<void *>(offsets + first), 0, num * sizeof(QFixedPoint));
|
||||||
memset(glyphs + first, 0, num * sizeof(glyph_t));
|
memset(glyphs + first, 0, num * sizeof(glyph_t));
|
||||||
memset(advances + first, 0, num * sizeof(QFixed));
|
memset(static_cast<void *>(advances + first), 0, num * sizeof(QFixed));
|
||||||
memset(justifications + first, 0, num * sizeof(QGlyphJustification));
|
memset(static_cast<void *>(justifications + first), 0, num * sizeof(QGlyphJustification));
|
||||||
memset(attributes + first, 0, num * sizeof(QGlyphAttributes));
|
memset(attributes + first, 0, num * sizeof(QGlyphAttributes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,9 +154,9 @@ public:
|
|||||||
iterator(const iterator &o) Q_DECL_NOTHROW; // = default
|
iterator(const iterator &o) Q_DECL_NOTHROW; // = default
|
||||||
iterator &operator=(const iterator &o) Q_DECL_NOTHROW; // = default
|
iterator &operator=(const iterator &o) Q_DECL_NOTHROW; // = default
|
||||||
iterator(iterator &&other) Q_DECL_NOTHROW // = default
|
iterator(iterator &&other) Q_DECL_NOTHROW // = default
|
||||||
{ memcpy(this, &other, sizeof(iterator)); }
|
{ memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(iterator)); }
|
||||||
iterator &operator=(iterator &&other) Q_DECL_NOTHROW // = default
|
iterator &operator=(iterator &&other) Q_DECL_NOTHROW // = default
|
||||||
{ memcpy(this, &other, sizeof(iterator)); return *this; }
|
{ memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(iterator)); return *this; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QTextFrame *parentFrame() const { return f; }
|
QTextFrame *parentFrame() const { return f; }
|
||||||
|
@ -541,12 +541,14 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
|
|||||||
directories << ministroPath;
|
directories << ministroPath;
|
||||||
nameFilters << QLatin1String("*.der");
|
nameFilters << QLatin1String("*.der");
|
||||||
platformEncodingFormat = QSsl::Der;
|
platformEncodingFormat = QSsl::Der;
|
||||||
|
# ifndef Q_OS_ANDROID_EMBEDDED
|
||||||
if (ministroPath.isEmpty()) {
|
if (ministroPath.isEmpty()) {
|
||||||
QList<QByteArray> certificateData = fetchSslCertificateData();
|
QList<QByteArray> certificateData = fetchSslCertificateData();
|
||||||
for (int i = 0; i < certificateData.size(); ++i) {
|
for (int i = 0; i < certificateData.size(); ++i) {
|
||||||
systemCerts.append(QSslCertificate::fromData(certificateData.at(i), QSsl::Der));
|
systemCerts.append(QSslCertificate::fromData(certificateData.at(i), QSsl::Der));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
# endif //Q_OS_ANDROID_EMBEDDED
|
||||||
# endif //Q_OS_ANDROID
|
# endif //Q_OS_ANDROID
|
||||||
{
|
{
|
||||||
currentDir.setNameFilters(nameFilters);
|
currentDir.setNameFilters(nameFilters);
|
||||||
|
@ -210,7 +210,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
static bool ensureLibraryLoaded();
|
static bool ensureLibraryLoaded();
|
||||||
static void ensureCiphersAndCertsLoaded();
|
static void ensureCiphersAndCertsLoaded();
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
static QList<QByteArray> fetchSslCertificateData();
|
static QList<QByteArray> fetchSslCertificateData();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ qtConfig(ssl) {
|
|||||||
|
|
||||||
darwin:SOURCES += ssl/qsslsocket_mac_shared.cpp
|
darwin:SOURCES += ssl/qsslsocket_mac_shared.cpp
|
||||||
|
|
||||||
android: SOURCES += ssl/qsslsocket_openssl_android.cpp
|
android:!android-embedded: SOURCES += ssl/qsslsocket_openssl_android.cpp
|
||||||
|
|
||||||
# Add optional SSL libs
|
# Add optional SSL libs
|
||||||
# Static linking of OpenSSL with msvc:
|
# Static linking of OpenSSL with msvc:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
** Contact: https://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.
|
||||||
@ -41,9 +41,6 @@
|
|||||||
platform, Microsoft Foundation Classes (MFC) under Windows, or Qt
|
platform, Microsoft Foundation Classes (MFC) under Windows, or Qt
|
||||||
on both platforms.
|
on both platforms.
|
||||||
|
|
||||||
\note OpenGL is a trademark of Silicon Graphics, Inc. in
|
|
||||||
the United States and other countries.
|
|
||||||
|
|
||||||
The Qt OpenGL module makes it easy to use OpenGL in Qt applications.
|
The Qt OpenGL module makes it easy to use OpenGL in Qt applications.
|
||||||
It provides an OpenGL widget class that can be used just like any
|
It provides an OpenGL widget class that can be used just like any
|
||||||
other Qt widget, except that it opens an OpenGL display buffer where
|
other Qt widget, except that it opens an OpenGL display buffer where
|
||||||
@ -68,4 +65,16 @@
|
|||||||
|
|
||||||
The \l{Qt OpenGL C++ Classes} page gives an overview over the available classes
|
The \l{Qt OpenGL C++ Classes} page gives an overview over the available classes
|
||||||
in this module.
|
in this module.
|
||||||
|
|
||||||
|
\section1 Licenses and Trademarks
|
||||||
|
|
||||||
|
The Qt OpenGL module is available under commercial licenses from \l{The Qt Company}.
|
||||||
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
|
the \l{GNU General Public License, version 2}.
|
||||||
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
|
OpenGL\reg is a trademark of Silicon Graphics, Inc. in
|
||||||
|
the United States and other countries.
|
||||||
*/
|
*/
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
#include <QtPlatformHeaders/QEGLNativeContext>
|
#include <QtPlatformHeaders/QEGLNativeContext>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
#include <QtCore/private/qjnihelpers_p.h>
|
#include <QtCore/private/qjnihelpers_p.h>
|
||||||
#endif
|
#endif
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
@ -332,7 +332,7 @@ void QEGLPlatformContext::updateFormatFromGL()
|
|||||||
QByteArray version = QByteArray(reinterpret_cast<const char *>(s));
|
QByteArray version = QByteArray(reinterpret_cast<const char *>(s));
|
||||||
int major, minor;
|
int major, minor;
|
||||||
if (QPlatformOpenGLContext::parseOpenGLVersion(version, major, minor)) {
|
if (QPlatformOpenGLContext::parseOpenGLVersion(version, major, minor)) {
|
||||||
#ifdef Q_OS_ANDROID
|
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
// Some Android 4.2.2 devices report OpenGL ES 3.0 without the functions being available.
|
// Some Android 4.2.2 devices report OpenGL ES 3.0 without the functions being available.
|
||||||
static int apiLevel = QtAndroidPrivate::androidSdkVersion();
|
static int apiLevel = QtAndroidPrivate::androidSdkVersion();
|
||||||
if (apiLevel <= 17 && major >= 3) {
|
if (apiLevel <= 17 && major >= 3) {
|
||||||
|
@ -993,9 +993,7 @@ int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags,
|
|||||||
static inline bool areMetricsTooLarge(const QFontEngineFT::GlyphInfo &info)
|
static inline bool areMetricsTooLarge(const QFontEngineFT::GlyphInfo &info)
|
||||||
{
|
{
|
||||||
// false if exceeds QFontEngineFT::Glyph metrics
|
// false if exceeds QFontEngineFT::Glyph metrics
|
||||||
return (short)(info.linearAdvance) != info.linearAdvance
|
return info.width > 0xFF || info.height > 0xFF;
|
||||||
|| (uchar)(info.width) != info.width
|
|
||||||
|| (uchar)(info.height) != info.height;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void transformBoundingBox(int *left, int *top, int *right, int *bottom, FT_Matrix *matrix)
|
static inline void transformBoundingBox(int *left, int *top, int *right, int *bottom, FT_Matrix *matrix)
|
||||||
|
@ -133,7 +133,7 @@ public:
|
|||||||
/* we don't cache glyphs that are too large anyway, so we can make this struct rather small */
|
/* we don't cache glyphs that are too large anyway, so we can make this struct rather small */
|
||||||
struct Glyph {
|
struct Glyph {
|
||||||
~Glyph();
|
~Glyph();
|
||||||
short linearAdvance;
|
int linearAdvance : 22;
|
||||||
unsigned char width;
|
unsigned char width;
|
||||||
unsigned char height;
|
unsigned char height;
|
||||||
short x;
|
short x;
|
||||||
|
@ -507,6 +507,23 @@ static QString familyNameFromPostScriptName(NSString *psName)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void addExtraFallbacks(QStringList *fallbackList)
|
||||||
|
{
|
||||||
|
#if defined(Q_OS_MACOS)
|
||||||
|
// Since we are only returning a list of default fonts for the current language, we do not
|
||||||
|
// cover all unicode completely. This was especially an issue for some of the common script
|
||||||
|
// symbols such as mathematical symbols, currency or geometric shapes. To minimize the risk
|
||||||
|
// of missing glyphs, we add Arial Unicode MS as a final fail safe, since this covers most
|
||||||
|
// of Unicode 2.1.
|
||||||
|
if (!fallbackList->contains(QStringLiteral("Arial Unicode MS")))
|
||||||
|
fallbackList->append(QStringLiteral("Arial Unicode MS"));
|
||||||
|
// Since some symbols (specifically Braille) are not in Arial Unicode MS, we
|
||||||
|
// add Apple Symbols to cover those too.
|
||||||
|
if (!fallbackList->contains(QStringLiteral("Apple Symbols")))
|
||||||
|
fallbackList->append(QStringLiteral("Apple Symbols"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
|
QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
|
||||||
{
|
{
|
||||||
Q_UNUSED(style);
|
Q_UNUSED(style);
|
||||||
@ -534,16 +551,7 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo
|
|||||||
fallbackList.append(QString::fromCFString(fallbackFamilyName));
|
fallbackList.append(QString::fromCFString(fallbackFamilyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_OSX)
|
addExtraFallbacks(&fallbackList);
|
||||||
// Since we are only returning a list of default fonts for the current language, we do not
|
|
||||||
// cover all unicode completely. This was especially an issue for some of the common script
|
|
||||||
// symbols such as mathematical symbols, currency or geometric shapes. To minimize the risk
|
|
||||||
// of missing glyphs, we add Arial Unicode MS as a final fail safe, since this covers most
|
|
||||||
// of Unicode 2.1.
|
|
||||||
if (!fallbackList.contains(QStringLiteral("Arial Unicode MS")))
|
|
||||||
fallbackList.append(QStringLiteral("Arial Unicode MS"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern QStringList qt_sort_families_by_writing_system(QChar::Script, const QStringList &);
|
extern QStringList qt_sort_families_by_writing_system(QChar::Script, const QStringList &);
|
||||||
fallbackList = qt_sort_families_by_writing_system(script, fallbackList);
|
fallbackList = qt_sort_families_by_writing_system(script, fallbackList);
|
||||||
|
|
||||||
@ -584,14 +592,7 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo
|
|||||||
|
|
||||||
fallbackList.append(QLatin1String("Apple Color Emoji"));
|
fallbackList.append(QLatin1String("Apple Color Emoji"));
|
||||||
|
|
||||||
// Since we are only returning a list of default fonts for the current language, we do not
|
addExtraFallbacks(&fallbackList);
|
||||||
// cover all unicode completely. This was especially an issue for some of the common script
|
|
||||||
// symbols such as mathematical symbols, currency or geometric shapes. To minimize the risk
|
|
||||||
// of missing glyphs, we add Arial Unicode MS as a final fail safe, since this covers most
|
|
||||||
// of Unicode 2.1.
|
|
||||||
if (!fallbackList.contains(QStringLiteral("Arial Unicode MS")))
|
|
||||||
fallbackList.append(QStringLiteral("Arial Unicode MS"));
|
|
||||||
|
|
||||||
fallbackLists[styleLookupKey.arg(fallbackStyleHint)] = fallbackList;
|
fallbackLists[styleLookupKey.arg(fallbackStyleHint)] = fallbackList;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -182,6 +182,14 @@ public:
|
|||||||
: QCoreTextFontEngine(font, def)
|
: QCoreTextFontEngine(font, def)
|
||||||
, m_fontData(fontData)
|
, m_fontData(fontData)
|
||||||
{}
|
{}
|
||||||
|
QFontEngine *cloneWithSize(qreal pixelSize) const
|
||||||
|
{
|
||||||
|
QFontDef newFontDef = fontDef;
|
||||||
|
newFontDef.pixelSize = pixelSize;
|
||||||
|
newFontDef.pointSize = pixelSize * 72.0 / qt_defaultDpi();
|
||||||
|
|
||||||
|
return new QCoreTextRawFontEngine(cgFont, newFontDef, m_fontData);
|
||||||
|
}
|
||||||
QByteArray m_fontData;
|
QByteArray m_fontData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ public:
|
|||||||
static QFontEngine::GlyphFormat defaultGlyphFormat;
|
static QFontEngine::GlyphFormat defaultGlyphFormat;
|
||||||
|
|
||||||
static QCoreTextFontEngine *create(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference);
|
static QCoreTextFontEngine *create(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference);
|
||||||
private:
|
protected:
|
||||||
void init();
|
void init();
|
||||||
QImage imageForGlyph(glyph_t glyph, QFixed subPixelPosition, bool colorful, const QTransform &m);
|
QImage imageForGlyph(glyph_t glyph, QFixed subPixelPosition, bool colorful, const QTransform &m);
|
||||||
CTFontRef ctfont;
|
CTFontRef ctfont;
|
||||||
|
@ -6,6 +6,6 @@ QT_FOR_CONFIG += network-private
|
|||||||
SUBDIRS += connman networkmanager
|
SUBDIRS += connman networkmanager
|
||||||
}
|
}
|
||||||
|
|
||||||
android:SUBDIRS += android
|
android:!android-embedded: SUBDIRS += android
|
||||||
|
|
||||||
isEmpty(SUBDIRS):SUBDIRS = generic
|
isEmpty(SUBDIRS):SUBDIRS = generic
|
||||||
|
@ -438,6 +438,16 @@ QAndroidInputContext::QAndroidInputContext()
|
|||||||
|
|
||||||
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::cursorRectangleChanged,
|
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::cursorRectangleChanged,
|
||||||
this, &QAndroidInputContext::updateSelectionHandles);
|
this, &QAndroidInputContext::updateSelectionHandles);
|
||||||
|
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::anchorRectangleChanged,
|
||||||
|
this, &QAndroidInputContext::updateSelectionHandles);
|
||||||
|
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::inputItemClipRectangleChanged, this, [this]{
|
||||||
|
auto im = qGuiApp->inputMethod();
|
||||||
|
if (!im->inputItemClipRectangle().contains(im->anchorRectangle()) ||
|
||||||
|
!im->inputItemClipRectangle().contains(im->cursorRectangle())) {
|
||||||
|
m_cursorHandleShown = CursorHandleNotShown;
|
||||||
|
updateSelectionHandles();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QAndroidInputContext::~QAndroidInputContext()
|
QAndroidInputContext::~QAndroidInputContext()
|
||||||
@ -595,27 +605,63 @@ void QAndroidInputContext::handleLocationChanged(int handleId, int x, int y)
|
|||||||
double pixelDensity = window
|
double pixelDensity = window
|
||||||
? QHighDpiScaling::factor(window)
|
? QHighDpiScaling::factor(window)
|
||||||
: QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
|
: QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
|
||||||
QPoint point(x / pixelDensity, y / pixelDensity);
|
QPointF point(x / pixelDensity, y / pixelDensity);
|
||||||
y -= leftRect.width() / 2;
|
point.setY(point.y() - leftRect.width() / 2);
|
||||||
if (handleId == 1) {
|
if (handleId == 1) {
|
||||||
setSelectionOnFocusObject(point, point);
|
setSelectionOnFocusObject(point, point);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition);
|
QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition | Qt::ImCurrentSelection);
|
||||||
QCoreApplication::sendEvent(m_focusObject, &query);
|
QCoreApplication::sendEvent(m_focusObject, &query);
|
||||||
int cpos = query.value(Qt::ImCursorPosition).toInt();
|
int cpos = query.value(Qt::ImCursorPosition).toInt();
|
||||||
int anchor = query.value(Qt::ImAnchorPosition).toInt();
|
int anchor = query.value(Qt::ImAnchorPosition).toInt();
|
||||||
|
bool rtl = query.value(Qt::ImCurrentSelection).toString().isRightToLeft();
|
||||||
auto rightRect = im->anchorRectangle();
|
auto rightRect = im->anchorRectangle();
|
||||||
if (cpos > anchor)
|
if (cpos > anchor)
|
||||||
std::swap(leftRect, rightRect);
|
std::swap(leftRect, rightRect);
|
||||||
|
|
||||||
|
auto checkLeftHandle = [&rightRect](QPointF &handlePos) {
|
||||||
|
if (handlePos.y() > rightRect.center().y())
|
||||||
|
handlePos.setY(rightRect.center().y()); // adjust Y handle pos
|
||||||
|
if (handlePos.y() >= rightRect.y() && handlePos.y() <= rightRect.bottom() && handlePos.x() >= rightRect.x())
|
||||||
|
return false; // same line and wrong X pos ?
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto checkRtlRightHandle = [&rightRect](QPointF &handlePos) {
|
||||||
|
if (handlePos.y() > rightRect.center().y())
|
||||||
|
handlePos.setY(rightRect.center().y()); // adjust Y handle pos
|
||||||
|
if (handlePos.y() >= rightRect.y() && handlePos.y() <= rightRect.bottom() && rightRect.x() >= handlePos.x())
|
||||||
|
return false; // same line and wrong X pos ?
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto checkRightHandle = [&leftRect](QPointF &handlePos) {
|
||||||
|
if (handlePos.y() < leftRect.center().y())
|
||||||
|
handlePos.setY(leftRect.center().y()); // adjust Y handle pos
|
||||||
|
if (handlePos.y() >= leftRect.y() && handlePos.y() <= leftRect.bottom() && leftRect.x() >= handlePos.x())
|
||||||
|
return false; // same line and wrong X pos ?
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto checkRtlLeftHandle = [&leftRect](QPointF &handlePos) {
|
||||||
|
if (handlePos.y() < leftRect.center().y())
|
||||||
|
handlePos.setY(leftRect.center().y()); // adjust Y handle pos
|
||||||
|
if (handlePos.y() >= leftRect.y() && handlePos.y() <= leftRect.bottom() && handlePos.x() >= leftRect.x())
|
||||||
|
return false; // same line and wrong X pos ?
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
if (handleId == 2) {
|
if (handleId == 2) {
|
||||||
QPoint rightPoint(rightRect.center().toPoint());
|
QPointF rightPoint(rightRect.center());
|
||||||
|
if ((!rtl && !checkLeftHandle(point)) || (rtl && !checkRtlRightHandle(point)))
|
||||||
|
return;
|
||||||
setSelectionOnFocusObject(point, rightPoint);
|
setSelectionOnFocusObject(point, rightPoint);
|
||||||
} else if (handleId == 3) {
|
} else if (handleId == 3) {
|
||||||
QPoint leftPoint(leftRect.center().toPoint());
|
QPointF leftPoint(leftRect.center());
|
||||||
|
if ((!rtl && !checkRightHandle(point)) || (rtl && !checkRtlLeftHandle(point)))
|
||||||
|
return;
|
||||||
setSelectionOnFocusObject(leftPoint, point);
|
setSelectionOnFocusObject(leftPoint, point);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -311,6 +311,24 @@ QT_USE_NAMESPACE
|
|||||||
return NO; // Someday qApp->quitOnLastWindowClosed(); when QApp and NSApp work closer together.
|
return NO; // Someday qApp->quitOnLastWindowClosed(); when QApp and NSApp work closer together.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)applicationWillHide:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
if (reflectionDelegate
|
||||||
|
&& [reflectionDelegate respondsToSelector:@selector(applicationWillHide:)]) {
|
||||||
|
[reflectionDelegate applicationWillHide:notification];
|
||||||
|
}
|
||||||
|
|
||||||
|
// When the application is hidden Qt will hide the popup windows associated with
|
||||||
|
// it when it has lost the activation for the application. However, when it gets
|
||||||
|
// to this point it believes the popup windows to be hidden already due to the
|
||||||
|
// fact that the application itself is hidden, which will cause a problem when
|
||||||
|
// the application is made visible again.
|
||||||
|
const QWindowList topLevelWindows = QGuiApplication::topLevelWindows();
|
||||||
|
for (QWindow *topLevelWindow : qAsConst(topLevelWindows)) {
|
||||||
|
if ((topLevelWindow->type() & Qt::Popup) == Qt::Popup && topLevelWindow->isVisible())
|
||||||
|
topLevelWindow->hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)applicationDidBecomeActive:(NSNotification *)notification
|
- (void)applicationDidBecomeActive:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
|
@ -415,6 +415,13 @@ static QString strippedText(QString s)
|
|||||||
} else {
|
} else {
|
||||||
QList<QUrl> result;
|
QList<QUrl> result;
|
||||||
QString filename = QString::fromNSString([[mSavePanel URL] path]).normalized(QString::NormalizationForm_C);
|
QString filename = QString::fromNSString([[mSavePanel URL] path]).normalized(QString::NormalizationForm_C);
|
||||||
|
const QString defaultSuffix = mOptions->defaultSuffix();
|
||||||
|
const QFileInfo fileInfo(filename);
|
||||||
|
// If neither the user or the NSSavePanel have provided a suffix, use
|
||||||
|
// the default suffix (if it exists).
|
||||||
|
if (fileInfo.suffix().isEmpty() && !defaultSuffix.isEmpty()) {
|
||||||
|
filename.append('.').append(defaultSuffix);
|
||||||
|
}
|
||||||
result << QUrl::fromLocalFile(filename.remove(QLatin1String("___qt_very_unlikely_prefix_")));
|
result << QUrl::fromLocalFile(filename.remove(QLatin1String("___qt_very_unlikely_prefix_")));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -442,10 +449,7 @@ static QString strippedText(QString s)
|
|||||||
[mPopUpButton setHidden:chooseDirsOnly]; // TODO hide the whole sunken pane instead?
|
[mPopUpButton setHidden:chooseDirsOnly]; // TODO hide the whole sunken pane instead?
|
||||||
|
|
||||||
if (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) {
|
if (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) {
|
||||||
QStringList ext = [self acceptableExtensionsForSave];
|
const QStringList ext = [self acceptableExtensionsForSave];
|
||||||
const QString defaultSuffix = mOptions->defaultSuffix();
|
|
||||||
if (!ext.isEmpty() && !defaultSuffix.isEmpty())
|
|
||||||
ext.prepend(defaultSuffix);
|
|
||||||
[mSavePanel setAllowedFileTypes:ext.isEmpty() ? nil : qt_mac_QStringListToNSMutableArray(ext)];
|
[mSavePanel setAllowedFileTypes:ext.isEmpty() ? nil : qt_mac_QStringListToNSMutableArray(ext)];
|
||||||
} else {
|
} else {
|
||||||
[mOpenPanel setAllowedFileTypes:nil]; // delegate panel:shouldEnableURL: does the file filtering for NSOpenPanel
|
[mOpenPanel setAllowedFileTypes:nil]; // delegate panel:shouldEnableURL: does the file filtering for NSOpenPanel
|
||||||
|
@ -44,9 +44,11 @@
|
|||||||
|
|
||||||
#include <QtCore/QtDebug>
|
#include <QtCore/QtDebug>
|
||||||
#include "qcocoaapplication.h"
|
#include "qcocoaapplication.h"
|
||||||
|
#include "qcocoaintegration.h"
|
||||||
#include "qcocoamenuloader.h"
|
#include "qcocoamenuloader.h"
|
||||||
#include "qcocoamenubar.h"
|
#include "qcocoamenubar.h"
|
||||||
#include "qcocoawindow.h"
|
#include "qcocoawindow.h"
|
||||||
|
#include "qcocoascreen.h"
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
@ -364,8 +366,9 @@ void QCocoaMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect,
|
|||||||
[popupCell setMenu:m_nativeMenu];
|
[popupCell setMenu:m_nativeMenu];
|
||||||
[popupCell selectItem:nsItem];
|
[popupCell selectItem:nsItem];
|
||||||
|
|
||||||
int availableHeight = screen->availableSize().height();
|
QCocoaScreen *cocoaScreen = static_cast<QCocoaScreen *>(screen->handle());
|
||||||
const QPoint &globalPos = parentWindow->mapToGlobal(pos);
|
int availableHeight = cocoaScreen->availableGeometry().height();
|
||||||
|
const QPoint &globalPos = cocoaWindow->mapToGlobal(pos);
|
||||||
int menuHeight = m_nativeMenu.size.height;
|
int menuHeight = m_nativeMenu.size.height;
|
||||||
if (globalPos.y() + menuHeight > availableHeight) {
|
if (globalPos.y() + menuHeight > availableHeight) {
|
||||||
// Maybe we need to fix the vertical popup position but we don't know the
|
// Maybe we need to fix the vertical popup position but we don't know the
|
||||||
|
@ -72,8 +72,6 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#define QT_MAC_SYSTEMTRAY_USE_GROWL
|
|
||||||
|
|
||||||
#include "qcocoasystemtrayicon.h"
|
#include "qcocoasystemtrayicon.h"
|
||||||
|
|
||||||
#ifndef QT_NO_SYSTEMTRAYICON
|
#ifndef QT_NO_SYSTEMTRAYICON
|
||||||
|
@ -117,7 +117,7 @@ void QEglFSWindow::create()
|
|||||||
QOpenGLCompositor *compositor = QOpenGLCompositor::instance();
|
QOpenGLCompositor *compositor = QOpenGLCompositor::instance();
|
||||||
if (screen->primarySurface() != EGL_NO_SURFACE) {
|
if (screen->primarySurface() != EGL_NO_SURFACE) {
|
||||||
if (Q_UNLIKELY(!isRaster() || !compositor->targetWindow())) {
|
if (Q_UNLIKELY(!isRaster() || !compositor->targetWindow())) {
|
||||||
#if !defined(Q_OS_ANDROID)
|
#if !defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED)
|
||||||
// We can have either a single OpenGL window or multiple raster windows.
|
// We can have either a single OpenGL window or multiple raster windows.
|
||||||
// Other combinations cannot work.
|
// Other combinations cannot work.
|
||||||
qFatal("EGLFS: OpenGL windows cannot be mixed with others.");
|
qFatal("EGLFS: OpenGL windows cannot be mixed with others.");
|
||||||
|
@ -59,13 +59,13 @@
|
|||||||
#include <QtInputSupport/private/qlibinputhandler_p.h>
|
#include <QtInputSupport/private/qlibinputhandler_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID)
|
#if QT_CONFIG(evdev)
|
||||||
#include <QtInputSupport/private/qevdevmousemanager_p.h>
|
#include <QtInputSupport/private/qevdevmousemanager_p.h>
|
||||||
#include <QtInputSupport/private/qevdevkeyboardmanager_p.h>
|
#include <QtInputSupport/private/qevdevkeyboardmanager_p.h>
|
||||||
#include <QtInputSupport/private/qevdevtouchmanager_p.h>
|
#include <QtInputSupport/private/qevdevtouchmanager_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if QT_CONFIG(tslib) && !defined(Q_OS_ANDROID)
|
#if QT_CONFIG(tslib)
|
||||||
#include <QtInputSupport/private/qtslib_p.h>
|
#include <QtInputSupport/private/qtslib_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ void QLinuxFbIntegration::createInputHandlers()
|
|||||||
new QTsLibMouseHandler(QLatin1String("TsLib"), QString());
|
new QTsLibMouseHandler(QLatin1String("TsLib"), QString());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID)
|
#if QT_CONFIG(evdev)
|
||||||
new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
|
new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
|
||||||
new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
|
new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
|
||||||
#if QT_CONFIG(tslib)
|
#if QT_CONFIG(tslib)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
QT_FOR_CONFIG += gui-private
|
QT_FOR_CONFIG += gui-private
|
||||||
|
|
||||||
android: SUBDIRS += android
|
android:!android-embedded: SUBDIRS += android
|
||||||
|
|
||||||
!android: SUBDIRS += minimal
|
!android: SUBDIRS += minimal
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ qtConfig(directfb) {
|
|||||||
|
|
||||||
qtConfig(linuxfb): SUBDIRS += linuxfb
|
qtConfig(linuxfb): SUBDIRS += linuxfb
|
||||||
|
|
||||||
qtConfig(vnc): SUBDIRS += vnc
|
qtHaveModule(network):qtConfig(vnc): SUBDIRS += vnc
|
||||||
|
|
||||||
freebsd {
|
freebsd {
|
||||||
SUBDIRS += bsdfb
|
SUBDIRS += bsdfb
|
||||||
|
@ -71,14 +71,14 @@ HEADERS = main.h \
|
|||||||
|
|
||||||
LIBS += -lscreen
|
LIBS += -lscreen
|
||||||
|
|
||||||
qtConfig(opengles2) {
|
qtConfig(egl) {
|
||||||
SOURCES += qqnxglcontext.cpp \
|
SOURCES += qqnxglcontext.cpp \
|
||||||
qqnxeglwindow.cpp
|
qqnxeglwindow.cpp
|
||||||
|
|
||||||
HEADERS += qqnxglcontext.h \
|
HEADERS += qqnxglcontext.h \
|
||||||
qqnxeglwindow.h
|
qqnxeglwindow.h
|
||||||
|
|
||||||
QMAKE_USE += opengl_es2 egl
|
QMAKE_USE += egl
|
||||||
}
|
}
|
||||||
|
|
||||||
qtConfig(qqnx_pps) {
|
qtConfig(qqnx_pps) {
|
||||||
|
@ -56,18 +56,12 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
QQnxEglWindow::QQnxEglWindow(QWindow *window, screen_context_t context, bool needRootWindow) :
|
QQnxEglWindow::QQnxEglWindow(QWindow *window, screen_context_t context, bool needRootWindow) :
|
||||||
QQnxWindow(window, context, needRootWindow),
|
QQnxWindow(window, context, needRootWindow),
|
||||||
m_platformOpenGLContext(0),
|
|
||||||
m_newSurfaceRequested(true),
|
m_newSurfaceRequested(true),
|
||||||
|
m_eglDisplay(EGL_NO_DISPLAY),
|
||||||
m_eglSurface(EGL_NO_SURFACE)
|
m_eglSurface(EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
initWindow();
|
initWindow();
|
||||||
|
|
||||||
// Set window usage
|
|
||||||
const int val = SCREEN_USAGE_OPENGL_ES2;
|
|
||||||
const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &val);
|
|
||||||
if (Q_UNLIKELY(result != 0))
|
|
||||||
qFatal("QQnxEglWindow: failed to set window alpha usage, errno=%d", errno);
|
|
||||||
|
|
||||||
m_requestedBufferSize = shouldMakeFullScreen() ? screen()->geometry().size() : window->geometry().size();
|
m_requestedBufferSize = shouldMakeFullScreen() ? screen()->geometry().size() : window->geometry().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,14 +71,58 @@ QQnxEglWindow::~QQnxEglWindow()
|
|||||||
destroyEGLSurface();
|
destroyEGLSurface();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQnxEglWindow::createEGLSurface()
|
bool QQnxEglWindow::isInitialized() const
|
||||||
{
|
{
|
||||||
|
return m_eglSurface != EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QQnxEglWindow::ensureInitialized(QQnxGLContext* context)
|
||||||
|
{
|
||||||
|
if (m_newSurfaceRequested.testAndSetOrdered(true, false)) {
|
||||||
|
const QMutexLocker locker(&m_mutex); // Set geomety must not reset the requestedBufferSize till
|
||||||
|
// the surface is created
|
||||||
|
|
||||||
|
if (m_requestedBufferSize != bufferSize() || m_eglSurface == EGL_NO_SURFACE) {
|
||||||
|
if (m_eglSurface != EGL_NO_SURFACE) {
|
||||||
|
context->doneCurrent();
|
||||||
|
destroyEGLSurface();
|
||||||
|
}
|
||||||
|
createEGLSurface(context);
|
||||||
|
} else {
|
||||||
|
// Must've been a sequence of unprocessed changes returning us to the original size.
|
||||||
|
resetBuffers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QQnxEglWindow::createEGLSurface(QQnxGLContext *context)
|
||||||
|
{
|
||||||
|
if (context->format().renderableType() != QSurfaceFormat::OpenGLES) {
|
||||||
|
qFatal("QQnxEglWindow: renderable type is not OpenGLES");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set window usage
|
||||||
|
int usage = SCREEN_USAGE_OPENGL_ES2;
|
||||||
|
#if _SCREEN_VERSION >= _SCREEN_MAKE_VERSION(1, 0, 0)
|
||||||
|
if (context->format().majorVersion() == 3)
|
||||||
|
usage |= SCREEN_USAGE_OPENGL_ES3;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &usage);
|
||||||
|
if (Q_UNLIKELY(result != 0))
|
||||||
|
qFatal("QQnxEglWindow: failed to set window usage, errno=%d", errno);
|
||||||
|
|
||||||
if (!m_requestedBufferSize.isValid()) {
|
if (!m_requestedBufferSize.isValid()) {
|
||||||
qWarning("QQNX: Trying to create 0 size EGL surface. "
|
qWarning("QQNX: Trying to create 0 size EGL surface. "
|
||||||
"Please set a valid window size before calling QOpenGLContext::makeCurrent()");
|
"Please set a valid window size before calling QOpenGLContext::makeCurrent()");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_eglDisplay = context->eglDisplay();
|
||||||
|
m_eglConfig = context->eglConfig();
|
||||||
|
m_format = context->format();
|
||||||
|
|
||||||
// update the window's buffers before we create the EGL surface
|
// update the window's buffers before we create the EGL surface
|
||||||
setBufferSize(m_requestedBufferSize);
|
setBufferSize(m_requestedBufferSize);
|
||||||
|
|
||||||
@ -94,24 +132,27 @@ void QQnxEglWindow::createEGLSurface()
|
|||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
qEglWindowDebug() << "Creating EGL surface" << platformOpenGLContext()->getEglDisplay()
|
qEglWindowDebug() << "Creating EGL surface from" << this << context
|
||||||
<< platformOpenGLContext()->getEglConfig();
|
<< window()->surfaceType() << window()->type();
|
||||||
|
|
||||||
// Create EGL surface
|
// Create EGL surface
|
||||||
m_eglSurface = eglCreateWindowSurface(platformOpenGLContext()->getEglDisplay(),
|
EGLSurface eglSurface = eglCreateWindowSurface(
|
||||||
platformOpenGLContext()->getEglConfig(),
|
m_eglDisplay,
|
||||||
(EGLNativeWindowType) nativeHandle(), eglSurfaceAttrs);
|
m_eglConfig,
|
||||||
if (m_eglSurface == EGL_NO_SURFACE) {
|
(EGLNativeWindowType) nativeHandle(),
|
||||||
const EGLenum error = QQnxGLContext::checkEGLError("eglCreateWindowSurface");
|
eglSurfaceAttrs);
|
||||||
qWarning("QQNX: failed to create EGL surface, err=%d", error);
|
|
||||||
}
|
if (eglSurface == EGL_NO_SURFACE)
|
||||||
|
qWarning("QQNX: failed to create EGL surface, err=%d", eglGetError());
|
||||||
|
|
||||||
|
m_eglSurface = eglSurface;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQnxEglWindow::destroyEGLSurface()
|
void QQnxEglWindow::destroyEGLSurface()
|
||||||
{
|
{
|
||||||
// Destroy EGL surface if it exists
|
// Destroy EGL surface if it exists
|
||||||
if (m_eglSurface != EGL_NO_SURFACE) {
|
if (m_eglSurface != EGL_NO_SURFACE) {
|
||||||
EGLBoolean eglResult = eglDestroySurface(platformOpenGLContext()->getEglDisplay(), m_eglSurface);
|
EGLBoolean eglResult = eglDestroySurface(m_eglDisplay, m_eglSurface);
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
||||||
qFatal("QQNX: failed to destroy EGL surface, err=%d", eglGetError());
|
qFatal("QQNX: failed to destroy EGL surface, err=%d", eglGetError());
|
||||||
}
|
}
|
||||||
@ -119,40 +160,8 @@ void QQnxEglWindow::destroyEGLSurface()
|
|||||||
m_eglSurface = EGL_NO_SURFACE;
|
m_eglSurface = EGL_NO_SURFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQnxEglWindow::swapEGLBuffers()
|
EGLSurface QQnxEglWindow::surface() const
|
||||||
{
|
{
|
||||||
qEglWindowDebug();
|
|
||||||
// Set current rendering API
|
|
||||||
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
|
|
||||||
|
|
||||||
// Post EGL surface to window
|
|
||||||
eglResult = eglSwapBuffers(m_platformOpenGLContext->getEglDisplay(), m_eglSurface);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQNX: failed to swap EGL buffers, err=%d", eglGetError());
|
|
||||||
|
|
||||||
windowPosted();
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLSurface QQnxEglWindow::getSurface()
|
|
||||||
{
|
|
||||||
if (m_newSurfaceRequested.testAndSetOrdered(true, false)) {
|
|
||||||
const QMutexLocker locker(&m_mutex); //Set geomety must not reset the requestedBufferSize till
|
|
||||||
//the surface is created
|
|
||||||
|
|
||||||
if ((m_requestedBufferSize != bufferSize()) || (m_eglSurface == EGL_NO_SURFACE)) {
|
|
||||||
if (m_eglSurface != EGL_NO_SURFACE) {
|
|
||||||
platformOpenGLContext()->doneCurrent();
|
|
||||||
destroyEGLSurface();
|
|
||||||
}
|
|
||||||
createEGLSurface();
|
|
||||||
} else {
|
|
||||||
// Must've been a sequence of unprocessed changes returning us to the original size.
|
|
||||||
resetBuffers();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_eglSurface;
|
return m_eglSurface;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,35 +178,24 @@ void QQnxEglWindow::setGeometry(const QRect &rect)
|
|||||||
// that test.
|
// that test.
|
||||||
const QMutexLocker locker(&m_mutex);
|
const QMutexLocker locker(&m_mutex);
|
||||||
m_requestedBufferSize = newGeometry.size();
|
m_requestedBufferSize = newGeometry.size();
|
||||||
if (m_platformOpenGLContext != 0 && bufferSize() != newGeometry.size())
|
if (isInitialized() && bufferSize() != newGeometry.size())
|
||||||
m_newSurfaceRequested.testAndSetRelease(false, true);
|
m_newSurfaceRequested.testAndSetRelease(false, true);
|
||||||
}
|
}
|
||||||
QQnxWindow::setGeometry(newGeometry);
|
QQnxWindow::setGeometry(newGeometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQnxEglWindow::setPlatformOpenGLContext(QQnxGLContext *platformOpenGLContext)
|
|
||||||
{
|
|
||||||
// This function does not take ownership of the platform gl context.
|
|
||||||
// It is owned by the frontend QOpenGLContext
|
|
||||||
m_platformOpenGLContext = platformOpenGLContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QQnxEglWindow::pixelFormat() const
|
int QQnxEglWindow::pixelFormat() const
|
||||||
{
|
{
|
||||||
if (!m_platformOpenGLContext) //The platform GL context was not set yet
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
const QSurfaceFormat format = m_platformOpenGLContext->format();
|
|
||||||
// Extract size of color channels from window format
|
// Extract size of color channels from window format
|
||||||
const int redSize = format.redBufferSize();
|
const int redSize = m_format.redBufferSize();
|
||||||
if (Q_UNLIKELY(redSize == -1))
|
if (Q_UNLIKELY(redSize == -1))
|
||||||
qFatal("QQnxWindow: red size not defined");
|
qFatal("QQnxWindow: red size not defined");
|
||||||
|
|
||||||
const int greenSize = format.greenBufferSize();
|
const int greenSize = m_format.greenBufferSize();
|
||||||
if (Q_UNLIKELY(greenSize == -1))
|
if (Q_UNLIKELY(greenSize == -1))
|
||||||
qFatal("QQnxWindow: green size not defined");
|
qFatal("QQnxWindow: green size not defined");
|
||||||
|
|
||||||
const int blueSize = format.blueBufferSize();
|
const int blueSize = m_format.blueBufferSize();
|
||||||
if (Q_UNLIKELY(blueSize == -1))
|
if (Q_UNLIKELY(blueSize == -1))
|
||||||
qFatal("QQnxWindow: blue size not defined");
|
qFatal("QQnxWindow: blue size not defined");
|
||||||
|
|
||||||
|
@ -53,13 +53,10 @@ public:
|
|||||||
QQnxEglWindow(QWindow *window, screen_context_t context, bool needRootWindow);
|
QQnxEglWindow(QWindow *window, screen_context_t context, bool needRootWindow);
|
||||||
~QQnxEglWindow();
|
~QQnxEglWindow();
|
||||||
|
|
||||||
void createEGLSurface();
|
EGLSurface surface() const;
|
||||||
void destroyEGLSurface();
|
|
||||||
void swapEGLBuffers();
|
|
||||||
EGLSurface getSurface();
|
|
||||||
|
|
||||||
void setPlatformOpenGLContext(QQnxGLContext *platformOpenGLContext);
|
bool isInitialized() const;
|
||||||
QQnxGLContext *platformOpenGLContext() const { return m_platformOpenGLContext; }
|
void ensureInitialized(QQnxGLContext *context);
|
||||||
|
|
||||||
void setGeometry(const QRect &rect) override;
|
void setGeometry(const QRect &rect) override;
|
||||||
|
|
||||||
@ -68,6 +65,9 @@ protected:
|
|||||||
void resetBuffers() override;
|
void resetBuffers() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void createEGLSurface(QQnxGLContext *context);
|
||||||
|
void destroyEGLSurface();
|
||||||
|
|
||||||
QSize m_requestedBufferSize;
|
QSize m_requestedBufferSize;
|
||||||
|
|
||||||
// This mutex is used to protect access to the m_requestedBufferSize
|
// This mutex is used to protect access to the m_requestedBufferSize
|
||||||
@ -78,9 +78,11 @@ private:
|
|||||||
// QQnxGLContext::makeCurrent()
|
// QQnxGLContext::makeCurrent()
|
||||||
mutable QMutex m_mutex;
|
mutable QMutex m_mutex;
|
||||||
|
|
||||||
QQnxGLContext *m_platformOpenGLContext;
|
|
||||||
QAtomicInt m_newSurfaceRequested;
|
QAtomicInt m_newSurfaceRequested;
|
||||||
|
EGLDisplay m_eglDisplay;
|
||||||
|
EGLConfig m_eglConfig;
|
||||||
EGLSurface m_eglSurface;
|
EGLSurface m_eglSurface;
|
||||||
|
QSurfaceFormat m_format;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -59,117 +59,13 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
EGLDisplay QQnxGLContext::ms_eglDisplay = EGL_NO_DISPLAY;
|
EGLDisplay QQnxGLContext::ms_eglDisplay = EGL_NO_DISPLAY;
|
||||||
|
|
||||||
QQnxGLContext::QQnxGLContext(QOpenGLContext *glContext)
|
QQnxGLContext::QQnxGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share)
|
||||||
: QPlatformOpenGLContext(),
|
: QEGLPlatformContext(format, share, ms_eglDisplay)
|
||||||
m_glContext(glContext),
|
|
||||||
m_currentEglSurface(EGL_NO_SURFACE)
|
|
||||||
{
|
{
|
||||||
qGLContextDebug();
|
|
||||||
QSurfaceFormat format = m_glContext->format();
|
|
||||||
|
|
||||||
// Set current rendering API
|
|
||||||
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
|
|
||||||
|
|
||||||
// Get colour channel sizes from window format
|
|
||||||
int alphaSize = format.alphaBufferSize();
|
|
||||||
int redSize = format.redBufferSize();
|
|
||||||
int greenSize = format.greenBufferSize();
|
|
||||||
int blueSize = format.blueBufferSize();
|
|
||||||
|
|
||||||
// Check if all channels are don't care
|
|
||||||
if (alphaSize == -1 && redSize == -1 && greenSize == -1 && blueSize == -1) {
|
|
||||||
// Set colour channels based on depth of window's screen
|
|
||||||
QQnxScreen *screen = static_cast<QQnxScreen*>(glContext->screen()->handle());
|
|
||||||
int depth = screen->depth();
|
|
||||||
if (depth == 32) {
|
|
||||||
// SCREEN_FORMAT_RGBA8888
|
|
||||||
alphaSize = 8;
|
|
||||||
redSize = 8;
|
|
||||||
greenSize = 8;
|
|
||||||
blueSize = 8;
|
|
||||||
} else {
|
|
||||||
// SCREEN_FORMAT_RGB565
|
|
||||||
alphaSize = 0;
|
|
||||||
redSize = 5;
|
|
||||||
greenSize = 6;
|
|
||||||
blueSize = 5;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Choose best match based on supported pixel formats
|
|
||||||
if (alphaSize <= 0 && redSize <= 5 && greenSize <= 6 && blueSize <= 5) {
|
|
||||||
// SCREEN_FORMAT_RGB565
|
|
||||||
alphaSize = 0;
|
|
||||||
redSize = 5;
|
|
||||||
greenSize = 6;
|
|
||||||
blueSize = 5;
|
|
||||||
} else {
|
|
||||||
// SCREEN_FORMAT_RGBA8888
|
|
||||||
alphaSize = 8;
|
|
||||||
redSize = 8;
|
|
||||||
greenSize = 8;
|
|
||||||
blueSize = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update colour channel sizes in window format
|
|
||||||
format.setAlphaBufferSize(alphaSize);
|
|
||||||
format.setRedBufferSize(redSize);
|
|
||||||
format.setGreenBufferSize(greenSize);
|
|
||||||
format.setBlueBufferSize(blueSize);
|
|
||||||
|
|
||||||
// Select EGL config based on requested window format
|
|
||||||
m_eglConfig = q_configFromGLFormat(ms_eglDisplay, format);
|
|
||||||
if (Q_UNLIKELY(m_eglConfig == 0))
|
|
||||||
qFatal("QQnxGLContext: failed to find EGL config");
|
|
||||||
|
|
||||||
QQnxGLContext *glShareContext = static_cast<QQnxGLContext*>(m_glContext->shareHandle());
|
|
||||||
m_eglShareContext = glShareContext ? glShareContext->m_eglContext : EGL_NO_CONTEXT;
|
|
||||||
|
|
||||||
m_eglContext = eglCreateContext(ms_eglDisplay, m_eglConfig, m_eglShareContext,
|
|
||||||
contextAttrs(format));
|
|
||||||
if (Q_UNLIKELY(m_eglContext == EGL_NO_CONTEXT)) {
|
|
||||||
checkEGLError("eglCreateContext");
|
|
||||||
qFatal("QQnxGLContext: failed to create EGL context, err=%d", eglGetError());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Query/cache window format of selected EGL config
|
|
||||||
m_windowFormat = q_glFormatFromConfig(ms_eglDisplay, m_eglConfig);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QQnxGLContext::~QQnxGLContext()
|
QQnxGLContext::~QQnxGLContext()
|
||||||
{
|
{
|
||||||
qGLContextDebug();
|
|
||||||
|
|
||||||
// Cleanup EGL context if it exists
|
|
||||||
if (m_eglContext != EGL_NO_CONTEXT)
|
|
||||||
eglDestroyContext(ms_eglDisplay, m_eglContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLenum QQnxGLContext::checkEGLError(const char *msg)
|
|
||||||
{
|
|
||||||
static const char *errmsg[] =
|
|
||||||
{
|
|
||||||
"EGL function succeeded",
|
|
||||||
"EGL is not initialized, or could not be initialized, for the specified display",
|
|
||||||
"EGL cannot access a requested resource",
|
|
||||||
"EGL failed to allocate resources for the requested operation",
|
|
||||||
"EGL fail to access an unrecognized attribute or attribute value was passed in an attribute list",
|
|
||||||
"EGLConfig argument does not name a valid EGLConfig",
|
|
||||||
"EGLContext argument does not name a valid EGLContext",
|
|
||||||
"EGL current surface of the calling thread is no longer valid",
|
|
||||||
"EGLDisplay argument does not name a valid EGLDisplay",
|
|
||||||
"EGL arguments are inconsistent",
|
|
||||||
"EGLNativePixmapType argument does not refer to a valid native pixmap",
|
|
||||||
"EGLNativeWindowType argument does not refer to a valid native window",
|
|
||||||
"EGL one or more argument values are invalid",
|
|
||||||
"EGLSurface argument does not name a valid surface configured for rendering",
|
|
||||||
"EGL power management event has occurred",
|
|
||||||
};
|
|
||||||
EGLenum error = eglGetError();
|
|
||||||
fprintf(stderr, "%s: %s\n", msg, errmsg[error - EGL_SUCCESS]);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQnxGLContext::initializeContext()
|
void QQnxGLContext::initializeContext()
|
||||||
@ -178,17 +74,13 @@ void QQnxGLContext::initializeContext()
|
|||||||
|
|
||||||
// Initialize connection to EGL
|
// Initialize connection to EGL
|
||||||
ms_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
ms_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||||
if (Q_UNLIKELY(ms_eglDisplay == EGL_NO_DISPLAY)) {
|
if (Q_UNLIKELY(ms_eglDisplay == EGL_NO_DISPLAY))
|
||||||
checkEGLError("eglGetDisplay");
|
qFatal("QQnxGLContext: failed to obtain EGL display: %x", eglGetError());
|
||||||
qFatal("QQnxGLContext: failed to obtain EGL display");
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLBoolean eglResult = eglInitialize(ms_eglDisplay, 0, 0);
|
EGLBoolean eglResult = eglInitialize(ms_eglDisplay, 0, 0);
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE)) {
|
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
||||||
checkEGLError("eglInitialize");
|
|
||||||
qFatal("QQnxGLContext: failed to initialize EGL display, err=%d", eglGetError());
|
qFatal("QQnxGLContext: failed to initialize EGL display, err=%d", eglGetError());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void QQnxGLContext::shutdownContext()
|
void QQnxGLContext::shutdownContext()
|
||||||
{
|
{
|
||||||
@ -198,98 +90,32 @@ void QQnxGLContext::shutdownContext()
|
|||||||
eglTerminate(ms_eglDisplay);
|
eglTerminate(ms_eglDisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EGLSurface QQnxGLContext::eglSurfaceForPlatformSurface(QPlatformSurface *surface)
|
||||||
|
{
|
||||||
|
QQnxEglWindow *window = static_cast<QQnxEglWindow *>(surface);
|
||||||
|
window->ensureInitialized(this);
|
||||||
|
return window->surface();
|
||||||
|
}
|
||||||
|
|
||||||
bool QQnxGLContext::makeCurrent(QPlatformSurface *surface)
|
bool QQnxGLContext::makeCurrent(QPlatformSurface *surface)
|
||||||
{
|
{
|
||||||
qGLContextDebug();
|
qGLContextDebug();
|
||||||
|
return QEGLPlatformContext::makeCurrent(surface);
|
||||||
Q_ASSERT(surface->surface()->surfaceType() == QSurface::OpenGLSurface);
|
|
||||||
|
|
||||||
// Set current rendering API
|
|
||||||
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQnxGLContext: failed to set EGL API, err=%d", eglGetError());
|
|
||||||
|
|
||||||
QQnxEglWindow *platformWindow = dynamic_cast<QQnxEglWindow*>(surface);
|
|
||||||
if (!platformWindow)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
platformWindow->setPlatformOpenGLContext(this);
|
|
||||||
|
|
||||||
if (m_currentEglSurface == EGL_NO_SURFACE || m_currentEglSurface != platformWindow->getSurface()) {
|
|
||||||
m_currentEglSurface = platformWindow->getSurface();
|
|
||||||
doneCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
eglResult = eglMakeCurrent(ms_eglDisplay, m_currentEglSurface, m_currentEglSurface, m_eglContext);
|
|
||||||
if (eglResult != EGL_TRUE) {
|
|
||||||
checkEGLError("eglMakeCurrent");
|
|
||||||
qWarning("QQNX: failed to set current EGL context, err=%d", eglGetError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return (eglResult == EGL_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QQnxGLContext::doneCurrent()
|
|
||||||
{
|
|
||||||
qGLContextDebug();
|
|
||||||
|
|
||||||
// set current rendering API
|
|
||||||
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
|
|
||||||
|
|
||||||
// clear curent EGL context and unbind EGL surface
|
|
||||||
eglResult = eglMakeCurrent(ms_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQNX: failed to clear current EGL context, err=%d", eglGetError());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQnxGLContext::swapBuffers(QPlatformSurface *surface)
|
void QQnxGLContext::swapBuffers(QPlatformSurface *surface)
|
||||||
{
|
{
|
||||||
qGLContextDebug();
|
qGLContextDebug();
|
||||||
QQnxEglWindow *platformWindow = dynamic_cast<QQnxEglWindow*>(surface);
|
|
||||||
if (!platformWindow)
|
|
||||||
return;
|
|
||||||
|
|
||||||
platformWindow->swapEGLBuffers();
|
QEGLPlatformContext::swapBuffers(surface);
|
||||||
|
|
||||||
|
QQnxEglWindow *platformWindow = static_cast<QQnxEglWindow*>(surface);
|
||||||
|
platformWindow->windowPosted();
|
||||||
}
|
}
|
||||||
|
|
||||||
QFunctionPointer QQnxGLContext::getProcAddress(const char *procName)
|
void QQnxGLContext::doneCurrent()
|
||||||
{
|
{
|
||||||
qGLContextDebug();
|
QEGLPlatformContext::doneCurrent();
|
||||||
|
|
||||||
// Set current rendering API
|
|
||||||
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
|
|
||||||
if (Q_UNLIKELY(eglResult != EGL_TRUE))
|
|
||||||
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
|
|
||||||
|
|
||||||
// Lookup EGL extension function pointer
|
|
||||||
QFunctionPointer result = static_cast<QFunctionPointer>(eglGetProcAddress(procName));
|
|
||||||
if (!result)
|
|
||||||
result = reinterpret_cast<QFunctionPointer>(dlsym(RTLD_DEFAULT, procName));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QQnxGLContext::isSharing() const
|
|
||||||
{
|
|
||||||
return m_eglShareContext != EGL_NO_CONTEXT;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLDisplay QQnxGLContext::getEglDisplay() {
|
|
||||||
return ms_eglDisplay;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLint *QQnxGLContext::contextAttrs(const QSurfaceFormat &format)
|
|
||||||
{
|
|
||||||
qGLContextDebug();
|
|
||||||
|
|
||||||
// Choose EGL settings based on OpenGL version
|
|
||||||
#if defined(QT_OPENGL_ES_2)
|
|
||||||
static EGLint attrs[] = { EGL_CONTEXT_CLIENT_VERSION, format.version().first, EGL_NONE };
|
|
||||||
return attrs;
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -46,49 +46,31 @@
|
|||||||
#include <QtCore/QSize>
|
#include <QtCore/QSize>
|
||||||
|
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
|
#include <QtEglSupport/private/qeglplatformcontext_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
class QQnxWindow;
|
class QQnxWindow;
|
||||||
|
|
||||||
class QQnxGLContext : public QPlatformOpenGLContext
|
class QQnxGLContext : public QEGLPlatformContext
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QQnxGLContext(QOpenGLContext *glContext);
|
QQnxGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share);
|
||||||
virtual ~QQnxGLContext();
|
virtual ~QQnxGLContext();
|
||||||
|
|
||||||
static EGLenum checkEGLError(const char *msg);
|
|
||||||
|
|
||||||
static void initializeContext();
|
static void initializeContext();
|
||||||
static void shutdownContext();
|
static void shutdownContext();
|
||||||
|
|
||||||
void requestSurfaceChange();
|
|
||||||
|
|
||||||
bool makeCurrent(QPlatformSurface *surface) override;
|
bool makeCurrent(QPlatformSurface *surface) override;
|
||||||
void doneCurrent() override;
|
|
||||||
void swapBuffers(QPlatformSurface *surface) override;
|
void swapBuffers(QPlatformSurface *surface) override;
|
||||||
QFunctionPointer getProcAddress(const char *procName) override;
|
void doneCurrent() override;
|
||||||
|
|
||||||
virtual QSurfaceFormat format() const override { return m_windowFormat; }
|
protected:
|
||||||
bool isSharing() const override;
|
EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) override;
|
||||||
|
|
||||||
static EGLDisplay getEglDisplay();
|
|
||||||
EGLConfig getEglConfig() const { return m_eglConfig;}
|
|
||||||
EGLContext getEglContext() const { return m_eglContext; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//Can be static because different displays returne the same handle
|
//Can be static because different displays returne the same handle
|
||||||
static EGLDisplay ms_eglDisplay;
|
static EGLDisplay ms_eglDisplay;
|
||||||
|
|
||||||
QSurfaceFormat m_windowFormat;
|
|
||||||
QOpenGLContext *m_glContext;
|
|
||||||
|
|
||||||
EGLConfig m_eglConfig;
|
|
||||||
EGLContext m_eglContext;
|
|
||||||
EGLContext m_eglShareContext;
|
|
||||||
EGLSurface m_currentEglSurface;
|
|
||||||
|
|
||||||
static EGLint *contextAttrs(const QSurfaceFormat &format);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -313,7 +313,58 @@ QPlatformBackingStore *QQnxIntegration::createPlatformBackingStore(QWindow *wind
|
|||||||
QPlatformOpenGLContext *QQnxIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
|
QPlatformOpenGLContext *QQnxIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
|
||||||
{
|
{
|
||||||
qIntegrationDebug();
|
qIntegrationDebug();
|
||||||
return new QQnxGLContext(context);
|
|
||||||
|
// Get color channel sizes from window format
|
||||||
|
QSurfaceFormat format = context->format();
|
||||||
|
int alphaSize = format.alphaBufferSize();
|
||||||
|
int redSize = format.redBufferSize();
|
||||||
|
int greenSize = format.greenBufferSize();
|
||||||
|
int blueSize = format.blueBufferSize();
|
||||||
|
|
||||||
|
// Check if all channels are don't care
|
||||||
|
if (alphaSize == -1 && redSize == -1 && greenSize == -1 && blueSize == -1) {
|
||||||
|
// Set color channels based on depth of window's screen
|
||||||
|
QQnxScreen *screen = static_cast<QQnxScreen*>(context->screen()->handle());
|
||||||
|
int depth = screen->depth();
|
||||||
|
if (depth == 32) {
|
||||||
|
// SCREEN_FORMAT_RGBA8888
|
||||||
|
alphaSize = 8;
|
||||||
|
redSize = 8;
|
||||||
|
greenSize = 8;
|
||||||
|
blueSize = 8;
|
||||||
|
} else {
|
||||||
|
// SCREEN_FORMAT_RGB565
|
||||||
|
alphaSize = 0;
|
||||||
|
redSize = 5;
|
||||||
|
greenSize = 6;
|
||||||
|
blueSize = 5;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Choose best match based on supported pixel formats
|
||||||
|
if (alphaSize <= 0 && redSize <= 5 && greenSize <= 6 && blueSize <= 5) {
|
||||||
|
// SCREEN_FORMAT_RGB565
|
||||||
|
alphaSize = 0;
|
||||||
|
redSize = 5;
|
||||||
|
greenSize = 6;
|
||||||
|
blueSize = 5;
|
||||||
|
} else {
|
||||||
|
// SCREEN_FORMAT_RGBA8888
|
||||||
|
alphaSize = 8;
|
||||||
|
redSize = 8;
|
||||||
|
greenSize = 8;
|
||||||
|
blueSize = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update color channel sizes in window format
|
||||||
|
format.setAlphaBufferSize(alphaSize);
|
||||||
|
format.setRedBufferSize(redSize);
|
||||||
|
format.setGreenBufferSize(greenSize);
|
||||||
|
format.setBlueBufferSize(blueSize);
|
||||||
|
context->setFormat(format);
|
||||||
|
|
||||||
|
QQnxGLContext *ctx = new QQnxGLContext(context->format(), context->shareHandle());
|
||||||
|
return ctx;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ void *QQnxNativeInterface::nativeResourceForIntegration(const QByteArray &resour
|
|||||||
void *QQnxNativeInterface::nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context)
|
void *QQnxNativeInterface::nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context)
|
||||||
{
|
{
|
||||||
if (resource == "eglcontext" && context)
|
if (resource == "eglcontext" && context)
|
||||||
return static_cast<QQnxGLContext*>(context->handle())->getEglContext();
|
return static_cast<QQnxGLContext*>(context->handle())->eglContext();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -49,10 +49,14 @@
|
|||||||
|
|
||||||
#include <screen/screen.h>
|
#include <screen/screen.h>
|
||||||
|
|
||||||
// For pre-7.0 SDPs, map some screen property names to the old
|
#if !defined(_SCREEN_VERSION)
|
||||||
|
#define _SCREEN_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + (patch))
|
||||||
|
#define _SCREEN_VERSION _SCREEN_MAKE_VERSION(0, 0, 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For pre-1.0.0 screen, map some screen property names to the old
|
||||||
// names.
|
// names.
|
||||||
#include <sys/neutrino.h>
|
#if _SCREEN_VERSION < _SCREEN_MAKE_VERSION(1, 0, 0)
|
||||||
#if _NTO_VERSION < 700
|
|
||||||
const int SCREEN_PROPERTY_FLAGS = SCREEN_PROPERTY_KEY_FLAGS;
|
const int SCREEN_PROPERTY_FLAGS = SCREEN_PROPERTY_KEY_FLAGS;
|
||||||
const int SCREEN_PROPERTY_FOCUS = SCREEN_PROPERTY_KEYBOARD_FOCUS;
|
const int SCREEN_PROPERTY_FOCUS = SCREEN_PROPERTY_KEYBOARD_FOCUS;
|
||||||
const int SCREEN_PROPERTY_MODIFIERS = SCREEN_PROPERTY_KEY_MODIFIERS;
|
const int SCREEN_PROPERTY_MODIFIERS = SCREEN_PROPERTY_KEY_MODIFIERS;
|
||||||
|
@ -112,12 +112,13 @@ public:
|
|||||||
|
|
||||||
bool shouldMakeFullScreen() const;
|
bool shouldMakeFullScreen() const;
|
||||||
|
|
||||||
|
void windowPosted();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int pixelFormat() const = 0;
|
virtual int pixelFormat() const = 0;
|
||||||
virtual void resetBuffers() = 0;
|
virtual void resetBuffers() = 0;
|
||||||
|
|
||||||
void initWindow();
|
void initWindow();
|
||||||
void windowPosted();
|
|
||||||
|
|
||||||
screen_context_t m_screenContext;
|
screen_context_t m_screenContext;
|
||||||
|
|
||||||
|
@ -68,7 +68,6 @@
|
|||||||
#include <QtCore/QMutex>
|
#include <QtCore/QMutex>
|
||||||
#include <QtCore/QMutexLocker>
|
#include <QtCore/QMutexLocker>
|
||||||
#include <QtCore/QUuid>
|
#include <QtCore/QUuid>
|
||||||
#include <QtCore/QRegularExpression>
|
|
||||||
#include <QtCore/QTemporaryFile>
|
#include <QtCore/QTemporaryFile>
|
||||||
#include <QtCore/private/qsystemlibrary_p.h>
|
#include <QtCore/private/qsystemlibrary_p.h>
|
||||||
|
|
||||||
@ -1135,12 +1134,32 @@ void QWindowsNativeFileDialogBase::setLabelText(QFileDialogOptions::DialogLabel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isHexRange(const QString& s, int start, int end)
|
||||||
|
{
|
||||||
|
for (;start < end; ++start) {
|
||||||
|
QChar ch = s.at(start);
|
||||||
|
if (!(ch.isDigit()
|
||||||
|
|| (ch >= QLatin1Char('a') && ch <= QLatin1Char('f'))
|
||||||
|
|| (ch >= QLatin1Char('A') && ch <= QLatin1Char('F'))))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool isClsid(const QString &s)
|
static inline bool isClsid(const QString &s)
|
||||||
{
|
{
|
||||||
// detect "374DE290-123F-4565-9164-39C4925E467B".
|
// detect "374DE290-123F-4565-9164-39C4925E467B".
|
||||||
static const QRegularExpression pattern(QLatin1String("\\A[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\z"));
|
const QChar dash(QLatin1Char('-'));
|
||||||
Q_ASSERT(pattern.isValid());
|
return s.size() == 36
|
||||||
return pattern.match(s).hasMatch();
|
&& isHexRange(s, 0, 8)
|
||||||
|
&& s.at(8) == dash
|
||||||
|
&& isHexRange(s, 9, 13)
|
||||||
|
&& s.at(13) == dash
|
||||||
|
&& isHexRange(s, 14, 18)
|
||||||
|
&& s.at(18) == dash
|
||||||
|
&& isHexRange(s, 19, 23)
|
||||||
|
&& s.at(23) == dash
|
||||||
|
&& isHexRange(s, 24, 36);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowsNativeFileDialogBase::selectFile(const QString &fileName) const
|
void QWindowsNativeFileDialogBase::selectFile(const QString &fileName) const
|
||||||
|
@ -2558,7 +2558,7 @@ void QWindowsWindow::setCustomMargins(const QMargins &newCustomMargins)
|
|||||||
newFrame.moveTo(topLeft);
|
newFrame.moveTo(topLeft);
|
||||||
qCDebug(lcQpaWindows) << __FUNCTION__ << oldCustomMargins << "->" << newCustomMargins
|
qCDebug(lcQpaWindows) << __FUNCTION__ << oldCustomMargins << "->" << newCustomMargins
|
||||||
<< currentFrameGeometry << "->" << newFrame;
|
<< currentFrameGeometry << "->" << newFrame;
|
||||||
SetWindowPos(m_data.hwnd, 0, newFrame.x(), newFrame.y(), newFrame.width(), newFrame.height(), SWP_NOZORDER | SWP_FRAMECHANGED);
|
SetWindowPos(m_data.hwnd, 0, newFrame.x(), newFrame.y(), newFrame.width(), newFrame.height(), SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +134,11 @@ static void updateFormatFromContext(QSurfaceFormat &format)
|
|||||||
}
|
}
|
||||||
|
|
||||||
format.setProfile(QSurfaceFormat::NoProfile);
|
format.setProfile(QSurfaceFormat::NoProfile);
|
||||||
|
const bool isStereo = format.testOption(QSurfaceFormat::StereoBuffers);
|
||||||
format.setOptions(QSurfaceFormat::FormatOptions());
|
format.setOptions(QSurfaceFormat::FormatOptions());
|
||||||
|
// Restore flags that come from the VisualInfo/FBConfig.
|
||||||
|
if (isStereo)
|
||||||
|
format.setOption(QSurfaceFormat::StereoBuffers);
|
||||||
|
|
||||||
if (format.renderableType() == QSurfaceFormat::OpenGL) {
|
if (format.renderableType() == QSurfaceFormat::OpenGL) {
|
||||||
if (format.version() < qMakePair(3, 0)) {
|
if (format.version() < qMakePair(3, 0)) {
|
||||||
|
@ -2071,7 +2071,7 @@ bool QXcbWindow::isEmbedded() const
|
|||||||
QPoint QXcbWindow::mapToGlobal(const QPoint &pos) const
|
QPoint QXcbWindow::mapToGlobal(const QPoint &pos) const
|
||||||
{
|
{
|
||||||
if (!m_embedded)
|
if (!m_embedded)
|
||||||
return pos;
|
return QPlatformWindow::mapToGlobal(pos);
|
||||||
|
|
||||||
QPoint ret;
|
QPoint ret;
|
||||||
auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
|
auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
|
||||||
@ -2088,7 +2088,7 @@ QPoint QXcbWindow::mapToGlobal(const QPoint &pos) const
|
|||||||
QPoint QXcbWindow::mapFromGlobal(const QPoint &pos) const
|
QPoint QXcbWindow::mapFromGlobal(const QPoint &pos) const
|
||||||
{
|
{
|
||||||
if (!m_embedded)
|
if (!m_embedded)
|
||||||
return pos;
|
return QPlatformWindow::mapFromGlobal(pos);
|
||||||
|
|
||||||
QPoint ret;
|
QPoint ret;
|
||||||
auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
|
auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
#include <QtGui/qwindow.h>
|
#include <QtGui/qwindow.h>
|
||||||
#include <QtGui/qpa/qplatformtheme.h>
|
#include <QtGui/qpa/qplatformtheme.h>
|
||||||
|
#include <QtGui/qpa/qplatformwindow.h>
|
||||||
|
|
||||||
#undef signals
|
#undef signals
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
@ -426,9 +427,11 @@ void QGtk3Menu::showPopup(const QWindow *parentWindow, const QRect &targetRect,
|
|||||||
if (index != -1)
|
if (index != -1)
|
||||||
gtk_menu_set_active(GTK_MENU(m_menu), index);
|
gtk_menu_set_active(GTK_MENU(m_menu), index);
|
||||||
|
|
||||||
m_targetPos = targetRect.bottomLeft();
|
m_targetPos = QPoint(targetRect.x(), targetRect.y() + targetRect.height());
|
||||||
if (parentWindow)
|
|
||||||
m_targetPos = parentWindow->mapToGlobal(m_targetPos);
|
QPlatformWindow *pw = parentWindow ? parentWindow->handle() : nullptr;
|
||||||
|
if (pw)
|
||||||
|
m_targetPos = pw->mapToGlobal(m_targetPos);
|
||||||
|
|
||||||
gtk_menu_popup(GTK_MENU(m_menu), NULL, NULL, qt_gtk_menu_position_func, this, 0, gtk_get_current_event_time());
|
gtk_menu_popup(GTK_MENU(m_menu), NULL, NULL, qt_gtk_menu_position_func, this, 0, gtk_get_current_event_time());
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ bool QGtk3Theme::usePlatformNativeDialog(DialogType type) const
|
|||||||
case ColorDialog:
|
case ColorDialog:
|
||||||
return true;
|
return true;
|
||||||
case FileDialog:
|
case FileDialog:
|
||||||
return true;
|
return useNativeFileDialog();
|
||||||
case FontDialog:
|
case FontDialog:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
@ -167,6 +167,8 @@ QPlatformDialogHelper *QGtk3Theme::createPlatformDialogHelper(DialogType type) c
|
|||||||
case ColorDialog:
|
case ColorDialog:
|
||||||
return new QGtk3ColorDialogHelper;
|
return new QGtk3ColorDialogHelper;
|
||||||
case FileDialog:
|
case FileDialog:
|
||||||
|
if (!useNativeFileDialog())
|
||||||
|
return nullptr;
|
||||||
return new QGtk3FileDialogHelper;
|
return new QGtk3FileDialogHelper;
|
||||||
case FontDialog:
|
case FontDialog:
|
||||||
return new QGtk3FontDialogHelper;
|
return new QGtk3FontDialogHelper;
|
||||||
@ -185,4 +187,17 @@ QPlatformMenuItem* QGtk3Theme::createPlatformMenuItem() const
|
|||||||
return new QGtk3MenuItem;
|
return new QGtk3MenuItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QGtk3Theme::useNativeFileDialog()
|
||||||
|
{
|
||||||
|
/* Require GTK3 >= 3.15.5 to avoid running into this bug:
|
||||||
|
* https://bugzilla.gnome.org/show_bug.cgi?id=725164
|
||||||
|
*
|
||||||
|
* While this bug only occurs when using widget-based file dialogs
|
||||||
|
* (native GTK3 dialogs are fine) we have to disable platform file
|
||||||
|
* dialogs entirely since we can't avoid creation of a platform
|
||||||
|
* dialog helper.
|
||||||
|
*/
|
||||||
|
return gtk_check_version(3, 15, 5) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -59,6 +59,8 @@ public:
|
|||||||
QPlatformMenuItem* createPlatformMenuItem() const override;
|
QPlatformMenuItem* createPlatformMenuItem() const override;
|
||||||
|
|
||||||
static const char *name;
|
static const char *name;
|
||||||
|
private:
|
||||||
|
static bool useNativeFileDialog();
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
** Contact: https://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.
|
||||||
@ -165,6 +165,19 @@
|
|||||||
QTextEdit requires a QPrinter rather than a QPainter because it uses information
|
QTextEdit requires a QPrinter rather than a QPainter because it uses information
|
||||||
about the configured page dimensions in order to insert page breaks at the most
|
about the configured page dimensions in order to insert page breaks at the most
|
||||||
appropriate places in printed documents.
|
appropriate places in printed documents.
|
||||||
|
|
||||||
|
\section1 Licenses and Trademarks
|
||||||
|
|
||||||
|
The Qt Print Support module is available under commercial licenses from \l{The Qt Company}.
|
||||||
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
|
the \l{GNU General Public License, version 2}.
|
||||||
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
|
Please note that Adobe\reg places restrictions on the use of its trademarks
|
||||||
|
(including logos) in conjunction with PDF; e.g. "Adobe PDF". Please refer
|
||||||
|
to \l{http://www.adobe.com}{www.adobe.com} for guidelines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -54,12 +54,13 @@
|
|||||||
\section1 Licenses and Attributions
|
\section1 Licenses and Attributions
|
||||||
|
|
||||||
Qt SQL is available under commercial licenses from \l{The Qt Company}.
|
Qt SQL is available under commercial licenses from \l{The Qt Company}.
|
||||||
In addition, it is available under the
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
\l{GNU Lesser General Public License, version 3}, or
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
the \l{GNU General Public License, version 2}.
|
the \l{GNU General Public License, version 2}.
|
||||||
See \l{Qt Licensing} for further details.
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
Furthermore Qt SQL potentially contains third party
|
Furthermore, Qt SQL in Qt \QtVersion may contain third party
|
||||||
modules under following permissive licenses:
|
modules under following permissive licenses:
|
||||||
|
|
||||||
\generatelist{groupsbymodule attributions-qtsql}
|
\generatelist{groupsbymodule attributions-qtsql}
|
||||||
|
@ -210,9 +210,11 @@ qtConfig(gui) {
|
|||||||
src_plugins.depends += src_gui src_platformsupport src_platformheaders
|
src_plugins.depends += src_gui src_platformsupport src_platformheaders
|
||||||
src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers
|
src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers
|
||||||
qtConfig(widgets) {
|
qtConfig(widgets) {
|
||||||
SUBDIRS += src_tools_uic src_widgets src_printsupport
|
SUBDIRS += src_tools_uic src_widgets
|
||||||
|
!android-embedded: SUBDIRS += src_printsupport
|
||||||
TOOLS += src_tools_uic
|
TOOLS += src_tools_uic
|
||||||
src_plugins.depends += src_widgets src_printsupport
|
src_plugins.depends += src_widgets
|
||||||
|
!android-embedded: src_plugins.depends += src_printsupport
|
||||||
src_testlib.depends += src_widgets # if QtWidgets is enabled, QtTest requires QtWidgets's headers
|
src_testlib.depends += src_widgets # if QtWidgets is enabled, QtTest requires QtWidgets's headers
|
||||||
qtConfig(opengl) {
|
qtConfig(opengl) {
|
||||||
SUBDIRS += src_opengl
|
SUBDIRS += src_opengl
|
||||||
@ -224,7 +226,7 @@ SUBDIRS += src_plugins
|
|||||||
|
|
||||||
nacl: SUBDIRS -= src_network src_testlib
|
nacl: SUBDIRS -= src_network src_testlib
|
||||||
|
|
||||||
android: SUBDIRS += src_android src_3rdparty_gradle
|
android:!android-embedded: SUBDIRS += src_android src_3rdparty_gradle
|
||||||
|
|
||||||
TR_EXCLUDE = \
|
TR_EXCLUDE = \
|
||||||
src_tools_bootstrap src_tools_moc src_tools_rcc src_tools_uic src_tools_qlalr \
|
src_tools_bootstrap src_tools_moc src_tools_rcc src_tools_uic src_tools_qlalr \
|
||||||
|
@ -55,12 +55,13 @@
|
|||||||
\section1 Licenses and Attributions
|
\section1 Licenses and Attributions
|
||||||
|
|
||||||
Qt Test is available under commercial licenses from \l{The Qt Company}.
|
Qt Test is available under commercial licenses from \l{The Qt Company}.
|
||||||
In addition, it is available under the
|
In addition, it is available under free software licenses. Since Qt 5.4,
|
||||||
|
these free software licenses are
|
||||||
\l{GNU Lesser General Public License, version 3}, or
|
\l{GNU Lesser General Public License, version 3}, or
|
||||||
the \l{GNU General Public License, version 2}.
|
the \l{GNU General Public License, version 2}.
|
||||||
See \l{Qt Licensing} for further details.
|
See \l{Qt Licensing} for further details.
|
||||||
|
|
||||||
Furthermore Qt Test potentially contains third party
|
Furthermore, Qt Test in Qt \QtVersion may contain third party
|
||||||
modules under following permissive licenses:
|
modules under following permissive licenses:
|
||||||
|
|
||||||
\generatelist{groupsbymodule attributions-qttestlib}
|
\generatelist{groupsbymodule attributions-qttestlib}
|
||||||
|
@ -2830,7 +2830,10 @@ void QFileDialogPrivate::init(const QUrl &directory, const QString &nameFilter,
|
|||||||
if (!nameFilter.isEmpty())
|
if (!nameFilter.isEmpty())
|
||||||
q->setNameFilter(nameFilter);
|
q->setNameFilter(nameFilter);
|
||||||
q->setDirectoryUrl(workingDirectory(directory));
|
q->setDirectoryUrl(workingDirectory(directory));
|
||||||
|
if (directory.isLocalFile())
|
||||||
q->selectFile(initialSelection(directory));
|
q->selectFile(initialSelection(directory));
|
||||||
|
else
|
||||||
|
q->selectUrl(directory);
|
||||||
|
|
||||||
#ifndef QT_NO_SETTINGS
|
#ifndef QT_NO_SETTINGS
|
||||||
// Try to restore from the FileDialog settings group; if it fails, fall back
|
// Try to restore from the FileDialog settings group; if it fails, fall back
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user