Merge remote-tracking branch 'origin/5.4' into 5.5
Conflicts: examples/xml/htmlinfo/simpleexample.html examples/xml/rsslisting/rsslisting.cpp qmake/generators/win32/msbuild_objectmodel.cpp src/3rdparty/harfbuzz-ng/src/hb-private.hh src/corelib/global/qlogging.cpp src/corelib/io/qstorageinfo_unix.cpp src/corelib/thread/qwaitcondition_unix.cpp src/gui/kernel/qguiapplication.cpp src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp src/testlib/doc/src/qt-webpages.qdoc tests/auto/other/qaccessibility/tst_qaccessibility.cpp Change-Id: Ib272ff0bc30a1a5d51275eb3cd2f201dc82c11ff
This commit is contained in:
commit
34b14a8472
10
INSTALL
10
INSTALL
@ -1,10 +1,10 @@
|
|||||||
INSTALLING Qt Source Package Version %VERSION%.
|
INSTALLING Qt Source Package Version %VERSION%.
|
||||||
|
|
||||||
For instructions on building and installing Qt for each supported platform,
|
For instructions on building and installing Qt for each supported platform,
|
||||||
please see http://qt-project.org/doc/qt-%SHORTVERSION%/build-sources.html,
|
please see http://doc.qt.io/qt-%SHORTVERSION%/build-sources.html,
|
||||||
or follow one of these links:
|
or follow one of these links:
|
||||||
|
|
||||||
Mac OS X: http://qt-project.org/doc/qt-%SHORTVERSION%/macosx-building.html
|
Mac OS X: http://doc.qt.io/qt-%SHORTVERSION%/osx-building.html
|
||||||
Windows: http://qt-project.org/doc/qt-%SHORTVERSION%/windows-building.html
|
Windows: http://doc.qt.io/qt-%SHORTVERSION%/windows-building.html
|
||||||
X11 Platforms: http://qt-project.org/doc/qt-%SHORTVERSION%/linux-building.html
|
X11 Platforms: http://doc.qt.io/qt-%SHORTVERSION%/linux-building.html
|
||||||
Windows CE: http://qt-project.org/doc/qt-%SHORTVERSION%/install-wince.html
|
Windows CE: http://doc.qt.io/qt-%SHORTVERSION%/install-wince.html
|
||||||
|
4
configure
vendored
4
configure
vendored
@ -2589,8 +2589,8 @@ Additional options:
|
|||||||
-device-option <key=value> ... Add device specific options for the device mkspec
|
-device-option <key=value> ... Add device specific options for the device mkspec
|
||||||
(experimental)
|
(experimental)
|
||||||
|
|
||||||
-no-separate-debug-info . Do not store debug information in a separate file.
|
* -no-separate-debug-info . Do not store debug information in a separate file.
|
||||||
* -separate-debug-info .... Strip debug information into a separate file.
|
-separate-debug-info .... Strip debug information into a separate file.
|
||||||
|
|
||||||
-no-xcb ............ Do not compile Xcb (X protocol C-language Binding) support.
|
-no-xcb ............ Do not compile Xcb (X protocol C-language Binding) support.
|
||||||
* -xcb ............... Compile Xcb support.
|
* -xcb ............... Compile Xcb support.
|
||||||
|
184
dist/changes-5.4.1
vendored
Normal file
184
dist/changes-5.4.1
vendored
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
Qt 5.4.1 is a bug-fix release. It maintains both forward and backward
|
||||||
|
compatibility (source and binary) with Qt 5.4.0 except on Windows
|
||||||
|
when using MSVC 2012 or MSVC 2013. See note below.
|
||||||
|
|
||||||
|
For more details, refer to the online documentation included in this
|
||||||
|
distribution. The documentation is also available online:
|
||||||
|
|
||||||
|
http://doc.qt.io/qt-5.4/
|
||||||
|
|
||||||
|
The Qt version 5.4 series is binary compatible with the 5.3.x series.
|
||||||
|
Applications compiled for 5.3 will continue to run with 5.4 with the
|
||||||
|
exception of on Windows when using MSVC 2012 or MSVC 2013. See note
|
||||||
|
below.
|
||||||
|
|
||||||
|
Some of the changes listed in this file include issue tracking numbers
|
||||||
|
corresponding to tasks in the Qt Bug Tracker:
|
||||||
|
|
||||||
|
http://bugreports.qt.io/
|
||||||
|
|
||||||
|
Each of these identifiers can be entered in the bug tracker to obtain more
|
||||||
|
information about a particular change.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Important Behavior Changes *
|
||||||
|
****************************************************************************
|
||||||
|
- Restored binary compatibility with Qt 5.3.2 on Windows when using MSVC
|
||||||
|
2012 or MSVC 2013. This means that Qt 5.4.1 is no longer binary compatible
|
||||||
|
with Qt 5.4.0 when using either of those compilers.
|
||||||
|
- [QTBUG-42594] OS X binary package: fixed incorrect linking to libraries in
|
||||||
|
/opt/local/lib
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Library *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
QtCore
|
||||||
|
------
|
||||||
|
- [QTBUG-43893] Fixed memory leak in qSetMessagePattern
|
||||||
|
- [QTBUG-43513] QXmlStreamReader: Correctly parse XML containing NUL bytes
|
||||||
|
in the input stream
|
||||||
|
- [QTBUG-43352] QTemporaryDirectory: Properly clean up in case of a failure
|
||||||
|
- [QTBUG-43827] Fixed regression in QSortFilterProxyModel which crashed when
|
||||||
|
sorting a tree model
|
||||||
|
|
||||||
|
QtGui
|
||||||
|
-----
|
||||||
|
- [QTBUG-44273] Fixed misplacement of outlined text with native text rendering
|
||||||
|
- [QTBUG-44147] Fixed VNC not working on some VNC servers
|
||||||
|
- [QTBUG-43850] Fixed crash with multi-threaded font usage
|
||||||
|
- [QTBUG-43850] Made the old harfbuzz fallback available at runtime
|
||||||
|
- Improvements to the experimental high-dpi support
|
||||||
|
- [QTBUG-43318] Better resolving of GLES3 functions to avoid issues when deploying
|
||||||
|
on systems with GLES 2.0 only
|
||||||
|
|
||||||
|
QtWidgets
|
||||||
|
---------
|
||||||
|
- [QTBUG-43830] Fixed crash in stylesheets when styling QProgressBar
|
||||||
|
- [QTBUG-43663] QColorDialog: Don't lose focus while color picking
|
||||||
|
|
||||||
|
QtNetwork
|
||||||
|
---------
|
||||||
|
- [QTBUG-43793] Fixed disconnections of QSSLSocket after starting encryption
|
||||||
|
|
||||||
|
QtSql
|
||||||
|
-----
|
||||||
|
- [QTBUG-36211] qpsql: Added timezone support for datetime fields.
|
||||||
|
- qodbc: Fixed converted string values on Microsoft SQL Server 2012
|
||||||
|
- [QTBUG-43874] QSqlQuery: Fixed failure of multiple execBatch() calls after
|
||||||
|
a single prepare() call
|
||||||
|
|
||||||
|
QtPrintSupport
|
||||||
|
--------------
|
||||||
|
- [QTBUG-43124] Fixed QPrinter::{width,height} return values
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Platform Specific Changes *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
Linux/XCB
|
||||||
|
---------
|
||||||
|
- [QTBUG-43436] Fixed regression when drag and drop to other applications
|
||||||
|
- [QTBUG-43809] Turned off font hinting when doing high DPI scaling
|
||||||
|
- [QTBUG-43743] Fixed constantly resizing bigger window when devicePixelRatio is
|
||||||
|
greater than 1
|
||||||
|
- [QTBUG-43713] Fixed problems with multiple screens with different device pixel
|
||||||
|
ratios regarding window mapping and font sizes.
|
||||||
|
- [QTBUG-43688] Fixed physical DPI and size for rotated screens on X11
|
||||||
|
- [QTBUG-43049] Fixed grabKeyboard and grabMouse
|
||||||
|
- [QTBUG-36862] Now sends a leave event to the other window when a popup shows
|
||||||
|
which grabs the input
|
||||||
|
- [QTBUG-41590] Turned off subpixel gamma-correction on XCB
|
||||||
|
- Added support for SelectionClientClose in QXcbClipboard
|
||||||
|
- Fixed -nograb and -dograb arguments
|
||||||
|
- [QTBUG-43623] Fixed use after free
|
||||||
|
- [QTBUG-43436] Fixed regression in DnD. Make sure to preserve the QDrag until all
|
||||||
|
data has been received.
|
||||||
|
|
||||||
|
OS X
|
||||||
|
----
|
||||||
|
- [QTBUG-42952] macdeployqt: Fixed incorrect links to QtQuick plugin libraries
|
||||||
|
- [QTBUG-43061] Fixed namespacing of QNSViewMouseMoveHelper
|
||||||
|
- [QTBUG-43471] Fixed regression with Cut/Copy/Paste menu items staying disabled
|
||||||
|
after a filedialog was closed
|
||||||
|
- [QTBUG-42728] Fixed crash in QAction::setFont() when the font is unknown
|
||||||
|
- qt_mac_loadMenuNib: Prevent stale NIB files by diffing file size
|
||||||
|
- [QTBUG-43710] Fixed memory leak in QUrl::toCFUrl()
|
||||||
|
- [QTBUG-43061] Fixed namespacing of QNSViewMouseMoveHelper
|
||||||
|
- [QTBUG-40449] QMacPasteboardMimeFileUri: Use file paths instead of file references
|
||||||
|
- [QTBUG-36787] Fixed crashes occurring during PAC detection in
|
||||||
|
QNetworkProxyFactory::systemProxyForQuery()
|
||||||
|
|
||||||
|
Windows
|
||||||
|
-------
|
||||||
|
- [QTBUG-44021][QTBUG-35734] Fixed standard shortcuts when using a
|
||||||
|
non-Latin keyboard layout
|
||||||
|
- ANGLE: Fixed initialization of contexts
|
||||||
|
- [QTBUG-43832] Delayed the creation of static OpenGL context
|
||||||
|
- [QTBUG-43870] Fallback to ANGLE when OpenGL 1.x is detected
|
||||||
|
- [QTBUG-43466] Use the chosen DnD effect in drag enter/move for drop
|
||||||
|
- [QTBUG-41162] Fixed regression with dialogs not rendering when WA_TransluentBackground
|
||||||
|
is used
|
||||||
|
- [QTBUG-43833] Fixed crash when focus window does not have a native window
|
||||||
|
- [QTBUG-43263] Added infrastructure for GPU-specific GL renderers
|
||||||
|
- [QTBUG-43263] Added support for GPU detection
|
||||||
|
- [QTBUG-41782] Prevent buffer over-run when getting the glyph images
|
||||||
|
- [QTBUG-43420] Removed check for minimum/maximum size constraints
|
||||||
|
- [QTBUG-43308] Release mouse capture when window blocked by modal window
|
||||||
|
- [QTBUG-43082] Fixed PDF output when embedding fonts with a large internal leading
|
||||||
|
- [QTBUG-43343] Pass on any unhandled multimedia keys back to the system
|
||||||
|
- [QTBUG-43252] Do not register windows obtained by QWindow::fromWinId() for touch
|
||||||
|
- [QTBUG-43252] Fixed window geometry when using QWindow::fromWinId()
|
||||||
|
- [QTBUG-40578] Skip calculating margins for Qt::FramelessWindowHint
|
||||||
|
- [QTBUG-36318] Handle WM_WINDOWPOSCHANGING during window creation
|
||||||
|
- [QTBUG-42564] Brought FreeType rendering up to par with other platforms
|
||||||
|
- [QTBUG-36220] [QTBUG-36318] Implement heightForWidth()
|
||||||
|
- [QTBUG-40691] Correctly associate IME contexts
|
||||||
|
- [QTBUG-40691] Added support for capabilities to QPlatformInputContext
|
||||||
|
- Limit cursor cache to avoid hitting GDI resource limits
|
||||||
|
- [QTBUG-43900] rcc: Fixed build failure on Windows XP / MingW 4.9
|
||||||
|
- [QTBUG-41782] DirectWrite: Fixed possible buffer over-run in font handling
|
||||||
|
|
||||||
|
Android
|
||||||
|
-------
|
||||||
|
- [QTBUG-39712] Fixed problems caused by surface creation/destruction
|
||||||
|
|
||||||
|
iOS
|
||||||
|
---
|
||||||
|
- [QTBUG-43716] guard text responder from clearing selection
|
||||||
|
|
||||||
|
WinRT
|
||||||
|
-----
|
||||||
|
- [QTBUG-43862] Fixed QCoreApplication::quit() to exit application.
|
||||||
|
- [QTBUG-44196] Fixed click events being ignored when using pressAndHold.
|
||||||
|
|
||||||
|
Windows Embedded
|
||||||
|
----------------
|
||||||
|
- [QTBUG-44022] Fixed finding windows and widgets
|
||||||
|
|
||||||
|
QNX
|
||||||
|
---
|
||||||
|
- [QTBUG-43850] Fixed Harfbuzz-NG support
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Tools *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
configure & build system
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
- configure will now reject invalid -no-feature-* options.
|
||||||
|
- pkg-config assisted libudev detection was fixed.
|
||||||
|
- [QTBUG-43302][Android] The Android style is included when cross-building
|
||||||
|
on Windows as well.
|
||||||
|
- [QTBUG-43205][Unix] Fixed build D-Bus headers cannot be found.
|
||||||
|
|
||||||
|
qmake
|
||||||
|
-----
|
||||||
|
|
||||||
|
- [QTBUG-39690][Windows] Fixed file separators in 'make clean'.
|
||||||
|
- [QTBUG-40264][Unix] Fixed 'make distclean' for a dynamic library target.
|
||||||
|
- [QTBUG-42678] 'make distclean' now removes .qmake.{stash|super}.
|
||||||
|
- [QTBUG-43026][VS2010+] Fixed compilation of .rc files.
|
||||||
|
- [QTBUG-43457][MSVC] Fixed QMAKE_TARGET.arch for amd64_x86 x-build.
|
||||||
|
- INCLUDEPATH+=. is now unnecessary with all generators.
|
@ -74,7 +74,7 @@
|
|||||||
\title Livecoding video effects with Qt5
|
\title Livecoding video effects with Qt5
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
\externalpage http://blog.qt.digia.com/2012/02/29/pimp-my-video-shader-effects-and-multimedia/
|
\externalpage http://blog.qt.io/2012/02/29/pimp-my-video-shader-effects-and-multimedia/
|
||||||
\title Pimp my video
|
\title Pimp my video
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
@ -92,12 +92,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\externalpage http://qt-project.org/doc/qt-4.8
|
\externalpage http://doc.qt.io/qt-4.8
|
||||||
\title Qt 4.8 Reference Documentation
|
\title Qt 4.8 Reference Documentation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\externalpage http://qt-project.org/doc/qt-4.8/qtquick.html
|
\externalpage http://doc.qt.io/qt-4.8/qtquick.html
|
||||||
\title Qt Quick 1 Reference Documentation
|
\title Qt Quick 1 Reference Documentation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -33,9 +33,9 @@ HTML.footer += \
|
|||||||
"</li>\n" \
|
"</li>\n" \
|
||||||
"<li id=\"menu-item-33\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-33\"><a href=\"http://qt.io/developers/\">Developers</a>\n" \
|
"<li id=\"menu-item-33\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-33\"><a href=\"http://qt.io/developers/\">Developers</a>\n" \
|
||||||
"<ul class=\"sub-menu\">\n" \
|
"<ul class=\"sub-menu\">\n" \
|
||||||
" <li id=\"menu-item-1365\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1365\"><a href=\"http://qt-project.org/doc/\">Documentation</a></li>\n" \
|
" <li id=\"menu-item-1365\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1365\"><a href=\"http://doc.qt.io/\">Documentation</a></li>\n" \
|
||||||
" <li id=\"menu-item-1364\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1364\"><a href=\"http://qt-project.org/doc/qt-5/qtexamplesandtutorials.html\">Examples & Tutorials</a></li>\n" \
|
" <li id=\"menu-item-1364\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1364\"><a href=\"http://doc.qt.io/qt-5/qtexamplesandtutorials.html\">Examples & Tutorials</a></li>\n" \
|
||||||
" <li id=\"menu-item-1363\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1363\"><a href=\"http://qt-project.org/doc/qt-5/topics-app-development.html\">Tools</a></li>\n" \
|
" <li id=\"menu-item-1363\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1363\"><a href=\"http://doc.qt.io/qt-5/topics-app-development.html\">Tools</a></li>\n" \
|
||||||
" <li id=\"menu-item-1361\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1361\"><a href=\"http://qt-project.org/wiki\">Wiki</a></li>\n" \
|
" <li id=\"menu-item-1361\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1361\"><a href=\"http://qt-project.org/wiki\">Wiki</a></li>\n" \
|
||||||
" <li id=\"menu-item-1360\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1360\"><a href=\"http://qt-project.org/forums\">Forums</a></li>\n" \
|
" <li id=\"menu-item-1360\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1360\"><a href=\"http://qt-project.org/forums\">Forums</a></li>\n" \
|
||||||
" <li id=\"menu-item-1362\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1362\"><a href=\"http://qt-project.org/wiki/Qt-Contribution-Guidelines\">Contribute to Qt</a></li>\n" \
|
" <li id=\"menu-item-1362\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1362\"><a href=\"http://qt-project.org/wiki/Qt-Contribution-Guidelines\">Contribute to Qt</a></li>\n" \
|
||||||
|
@ -79,7 +79,7 @@ HTML.postheader = \
|
|||||||
" </a>\n" \
|
" </a>\n" \
|
||||||
" </li>\n" \
|
" </li>\n" \
|
||||||
" <li>\n" \
|
" <li>\n" \
|
||||||
" <a target=\"_blank\" href=\"http://blog.qt.digia.com/\" data-icon=\"\">\n" \
|
" <a target=\"_blank\" href=\"http://blog.qt.io/\" data-icon=\"\">\n" \
|
||||||
" <span>Blog</span>\n" \
|
" <span>Blog</span>\n" \
|
||||||
" </a>\n" \
|
" </a>\n" \
|
||||||
" </li>\n" \
|
" </li>\n" \
|
||||||
|
@ -76,7 +76,7 @@ RSSListing::RSSListing(QWidget *parent)
|
|||||||
{
|
{
|
||||||
|
|
||||||
lineEdit = new QLineEdit(this);
|
lineEdit = new QLineEdit(this);
|
||||||
lineEdit->setText("http://http://blog.qt.io/feed/");
|
lineEdit->setText("http://blog.qt.io/feed/");
|
||||||
|
|
||||||
fetchButton = new QPushButton(tr("Fetch"), this);
|
fetchButton = new QPushButton(tr("Fetch"), this);
|
||||||
|
|
||||||
|
@ -5,6 +5,6 @@
|
|||||||
|
|
||||||
#! [1]
|
#! [1]
|
||||||
# To include a literal hash character, use the $$LITERAL_HASH variable:
|
# To include a literal hash character, use the $$LITERAL_HASH variable:
|
||||||
urlPieces = http://qt-project.org/doc/qt-5.0/qtgui/qtextdocument.html pageCount
|
urlPieces = http://doc.qt.io/qt-5/qtextdocument.html pageCount
|
||||||
message($$join(urlPieces, $$LITERAL_HASH))
|
message($$join(urlPieces, $$LITERAL_HASH))
|
||||||
#! [1]
|
#! [1]
|
||||||
|
@ -769,12 +769,7 @@
|
|||||||
|
|
||||||
\section2 Creating Visual Studio Project Files
|
\section2 Creating Visual Studio Project Files
|
||||||
|
|
||||||
Developers using Visual Studio to write Qt applications can use the
|
This section describes how to import an existing
|
||||||
Visual Studio integration facilities provided with the
|
|
||||||
\l{Qt Commercial License}
|
|
||||||
and do not need to worry about how project dependencies are managed.
|
|
||||||
|
|
||||||
However, some developers may need to import an existing
|
|
||||||
qmake project into Visual Studio.
|
qmake project into Visual Studio.
|
||||||
qmake is able to take a project file and create
|
qmake is able to take a project file and create
|
||||||
a Visual Studio project that contains all the necessary information
|
a Visual Studio project that contains all the necessary information
|
||||||
|
@ -343,8 +343,8 @@ static QStringList unquote(const QStringList &values)
|
|||||||
|
|
||||||
// Tree file generation ---------------------------------------------
|
// Tree file generation ---------------------------------------------
|
||||||
void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName,
|
void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName,
|
||||||
VCProject &tool, const QString &filter, const QString &filterId) {
|
VCProject &tool, const QString &filter)
|
||||||
|
{
|
||||||
if (children.size()) {
|
if (children.size()) {
|
||||||
// Filter
|
// Filter
|
||||||
QString tempFilterName;
|
QString tempFilterName;
|
||||||
@ -364,24 +364,24 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString
|
|||||||
if ((*it)->children.size())
|
if ((*it)->children.size())
|
||||||
{
|
{
|
||||||
if ( !tempFilterName.isEmpty() )
|
if ( !tempFilterName.isEmpty() )
|
||||||
(*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName, filterId);
|
(*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName);
|
||||||
else
|
else
|
||||||
(*it)->generateXML(xml, xmlFilter, it.key(), tool, filter, filterId);
|
(*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
|
||||||
}
|
}
|
||||||
// Second round, do leafs
|
// Second round, do leafs
|
||||||
for (it = children.constBegin(); it != end; ++it)
|
for (it = children.constBegin(); it != end; ++it)
|
||||||
if (!(*it)->children.size())
|
if (!(*it)->children.size())
|
||||||
{
|
{
|
||||||
if ( !tempFilterName.isEmpty() )
|
if ( !tempFilterName.isEmpty() )
|
||||||
(*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName, filterId);
|
(*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName);
|
||||||
else
|
else
|
||||||
(*it)->generateXML(xml, xmlFilter, it.key(), tool, filter, filterId);
|
(*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Leaf
|
// Leaf
|
||||||
xml << tag(_ItemGroup);
|
xml << tag(_ItemGroup);
|
||||||
xmlFilter << tag(_ItemGroup);
|
xmlFilter << tag(_ItemGroup);
|
||||||
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter, filterId);
|
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter);
|
||||||
xmlFilter << closetag();
|
xmlFilter << closetag();
|
||||||
xml << closetag();
|
xml << closetag();
|
||||||
}
|
}
|
||||||
@ -389,14 +389,15 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString
|
|||||||
|
|
||||||
// Flat file generation ---------------------------------------------
|
// Flat file generation ---------------------------------------------
|
||||||
void XFlatNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &/*tagName*/,
|
void XFlatNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &/*tagName*/,
|
||||||
VCProject &tool, const QString &filter, const QString &filterId) {
|
VCProject &tool, const QString &filter)
|
||||||
|
{
|
||||||
if (children.size()) {
|
if (children.size()) {
|
||||||
ChildrenMapFlat::ConstIterator it = children.constBegin();
|
ChildrenMapFlat::ConstIterator it = children.constBegin();
|
||||||
ChildrenMapFlat::ConstIterator end = children.constEnd();
|
ChildrenMapFlat::ConstIterator end = children.constEnd();
|
||||||
xml << tag(_ItemGroup);
|
xml << tag(_ItemGroup);
|
||||||
xmlFilter << tag(_ItemGroup);
|
xmlFilter << tag(_ItemGroup);
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, (*it), filter, filterId);
|
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, (*it), filter);
|
||||||
}
|
}
|
||||||
xml << closetag();
|
xml << closetag();
|
||||||
xmlFilter << closetag();
|
xmlFilter << closetag();
|
||||||
@ -1826,21 +1827,29 @@ void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutpu
|
|||||||
if (!root->hasElements())
|
if (!root->hasElements())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
root->generateXML(xml, xmlFilter, "", project, filtername, filtername); // output root tree
|
root->generateXML(xml, xmlFilter, "", project, filtername); // output root tree
|
||||||
|
}
|
||||||
|
|
||||||
|
static QString stringBeforeFirstBackslash(const QString &str)
|
||||||
|
{
|
||||||
|
int idx = str.indexOf(QLatin1Char('\\'));
|
||||||
|
return idx == -1 ? str : str.left(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output all configurations (by filtername) for a file (by info)
|
// Output all configurations (by filtername) for a file (by info)
|
||||||
// A filters config output is in VCFilter.outputFileConfig()
|
// A filters config output is in VCFilter.outputFileConfig()
|
||||||
void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter,
|
void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter,
|
||||||
const VCFilterFile &info, const QString &filtername,
|
const VCFilterFile &info, const QString &filtername)
|
||||||
const QString &filterId)
|
|
||||||
{
|
{
|
||||||
|
// In non-flat mode the filter names have directory suffixes, e.g. "Generated Files\subdir".
|
||||||
|
const QString cleanFilterName = stringBeforeFirstBackslash(filtername);
|
||||||
|
|
||||||
// We need to check if the file has any custom build step.
|
// We need to check if the file has any custom build step.
|
||||||
// If there is one then it has to be included with "CustomBuild Include"
|
// If there is one then it has to be included with "CustomBuild Include"
|
||||||
bool hasCustomBuildStep = false;
|
bool hasCustomBuildStep = false;
|
||||||
QVarLengthArray<OutputFilterData> data(project.SingleProjects.count());
|
QVarLengthArray<OutputFilterData> data(project.SingleProjects.count());
|
||||||
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
||||||
data[i].filter = project.SingleProjects.at(i).filterByName(filterId);
|
data[i].filter = project.SingleProjects.at(i).filterByName(cleanFilterName);
|
||||||
if (!data[i].filter.Config) // only if the filter is not empty
|
if (!data[i].filter.Config) // only if the filter is not empty
|
||||||
continue;
|
continue;
|
||||||
VCFilter &filter = data[i].filter;
|
VCFilter &filter = data[i].filter;
|
||||||
@ -1854,6 +1863,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
|
|||||||
filter.CompilerTool.config = filter.Config;
|
filter.CompilerTool.config = filter.Config;
|
||||||
|
|
||||||
VCFilterFile fileInFilter = filter.findFile(info.file, &data[i].inBuild);
|
VCFilterFile fileInFilter = filter.findFile(info.file, &data[i].inBuild);
|
||||||
|
data[i].info = fileInFilter;
|
||||||
data[i].inBuild &= !fileInFilter.excludeFromBuild;
|
data[i].inBuild &= !fileInFilter.excludeFromBuild;
|
||||||
if (data[i].inBuild && filter.addExtraCompiler(fileInFilter))
|
if (data[i].inBuild && filter.addExtraCompiler(fileInFilter))
|
||||||
hasCustomBuildStep = true;
|
hasCustomBuildStep = true;
|
||||||
@ -1861,12 +1871,13 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
|
|||||||
|
|
||||||
bool fileAdded = false;
|
bool fileAdded = false;
|
||||||
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
||||||
const VCFilter &filter = project.SingleProjects.at(i).filterByName(filterId);
|
OutputFilterData *d = &data[i];
|
||||||
if (!filter.Config) // only if the filter is not empty
|
if (!d->filter.Config) // only if the filter is not empty
|
||||||
continue;
|
continue;
|
||||||
if (outputFileConfig(&data[i], xml, xmlFilter, info.file, fileAdded,
|
if (outputFileConfig(d, xml, xmlFilter, info.file, filtername, fileAdded,
|
||||||
hasCustomBuildStep))
|
hasCustomBuildStep)) {
|
||||||
fileAdded = true;
|
fileAdded = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !fileAdded )
|
if ( !fileAdded )
|
||||||
@ -1877,8 +1888,8 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter,
|
bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter,
|
||||||
const QString &filename, bool fileAdded,
|
const QString &filename, const QString &fullFilterName,
|
||||||
bool hasCustomBuildStep)
|
bool fileAdded, bool hasCustomBuildStep)
|
||||||
{
|
{
|
||||||
VCFilter &filter = d->filter;
|
VCFilter &filter = d->filter;
|
||||||
if (d->inBuild) {
|
if (d->inBuild) {
|
||||||
@ -1901,7 +1912,7 @@ bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, Xml
|
|||||||
|
|
||||||
xmlFilter << tag("CustomBuild")
|
xmlFilter << tag("CustomBuild")
|
||||||
<< attrTag("Include", Option::fixPathToTargetOS(filename))
|
<< attrTag("Include", Option::fixPathToTargetOS(filename))
|
||||||
<< attrTagS("Filter", filter.Name);
|
<< attrTagS("Filter", fullFilterName);
|
||||||
|
|
||||||
xml << tag("CustomBuild")
|
xml << tag("CustomBuild")
|
||||||
<< attrTag("Include", Option::fixPathToTargetOS(filename));
|
<< attrTag("Include", Option::fixPathToTargetOS(filename));
|
||||||
@ -1919,7 +1930,7 @@ bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, Xml
|
|||||||
if (!fileAdded)
|
if (!fileAdded)
|
||||||
{
|
{
|
||||||
fileAdded = true;
|
fileAdded = true;
|
||||||
outputFileConfig(xml, xmlFilter, filename, filter.Name);
|
outputFileConfig(xml, xmlFilter, filename, fullFilterName);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString condition = generateCondition(*filter.Config);
|
const QString condition = generateCondition(*filter.Config);
|
||||||
|
@ -57,7 +57,7 @@ public:
|
|||||||
virtual void addElement(const QString &filepath, const VCFilterFile &allInfo) = 0;
|
virtual void addElement(const QString &filepath, const VCFilterFile &allInfo) = 0;
|
||||||
virtual void removeElements()= 0;
|
virtual void removeElements()= 0;
|
||||||
virtual void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName,
|
virtual void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName,
|
||||||
VCProject &tool, const QString &filter, const QString &filterId) = 0;
|
VCProject &tool, const QString &filter) = 0;
|
||||||
virtual bool hasElements() = 0;
|
virtual bool hasElements() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool,
|
void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool,
|
||||||
const QString &filter, const QString &filterId);
|
const QString &filter);
|
||||||
bool hasElements() {
|
bool hasElements() {
|
||||||
return children.size() != 0;
|
return children.size() != 0;
|
||||||
}
|
}
|
||||||
@ -149,7 +149,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &proj,
|
void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &proj,
|
||||||
const QString &filter, const QString &filterId);
|
const QString &filter);
|
||||||
bool hasElements() {
|
bool hasElements() {
|
||||||
return children.size() != 0;
|
return children.size() != 0;
|
||||||
}
|
}
|
||||||
@ -183,8 +183,11 @@ private:
|
|||||||
|
|
||||||
static void addFilters(VCProject &project, XmlOutput &xmlFilter, const QString &filterName);
|
static void addFilters(VCProject &project, XmlOutput &xmlFilter, const QString &filterName);
|
||||||
static void outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername);
|
static void outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername);
|
||||||
static void outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const VCFilterFile &info, const QString &filtername, const QString &filterId);
|
static void outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter,
|
||||||
static bool outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filename, bool fileAdded, bool hasCustomBuildStep);
|
const VCFilterFile &info, const QString &filtername);
|
||||||
|
static bool outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter,
|
||||||
|
const QString &filename, const QString &fullFilterName,
|
||||||
|
bool fileAdded, bool hasCustomBuildStep);
|
||||||
static void outputFileConfig(XmlOutput &xml, XmlOutput &xmlFilter, const QString &fileName, const QString &filterName);
|
static void outputFileConfig(XmlOutput &xml, XmlOutput &xmlFilter, const QString &fileName, const QString &filterName);
|
||||||
static QString generateCondition(const VCConfiguration &config);
|
static QString generateCondition(const VCConfiguration &config);
|
||||||
|
|
||||||
|
@ -970,7 +970,11 @@ static ProString msvcBinDirToQMakeArch(QString subdir)
|
|||||||
|
|
||||||
static ProString defaultMsvcArchitecture()
|
static ProString defaultMsvcArchitecture()
|
||||||
{
|
{
|
||||||
|
#if defined(Q_OS_WIN64)
|
||||||
|
return ProString("x86_64");
|
||||||
|
#else
|
||||||
return ProString("x86");
|
return ProString("x86");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static ProString msvcArchitecture(const QString &vcInstallDir, const QString &pathVar)
|
static ProString msvcArchitecture(const QString &vcInstallDir, const QString &pathVar)
|
||||||
|
4
src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
vendored
4
src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
vendored
@ -7,15 +7,15 @@ CONFIG += \
|
|||||||
|
|
||||||
load(qt_helper_lib)
|
load(qt_helper_lib)
|
||||||
|
|
||||||
DEFINES += HAVE_OT HB_NO_UNICODE_FUNCS HB_DISABLE_DEPRECATED
|
DEFINES += HAVE_OT HAVE_QT5_ATOMICS HB_NO_UNICODE_FUNCS HB_DISABLE_DEPRECATED
|
||||||
|
|
||||||
# platform/compiler specific definitions
|
# platform/compiler specific definitions
|
||||||
DEFINES += HAVE_ATEXIT
|
DEFINES += HAVE_ATEXIT
|
||||||
gcc: DEFINES += HAVE_INTEL_ATOMIC_PRIMITIVES
|
|
||||||
unix: DEFINES += HAVE_PTHREAD HAVE_SCHED_H HAVE_SCHED_YIELD
|
unix: DEFINES += HAVE_PTHREAD HAVE_SCHED_H HAVE_SCHED_YIELD
|
||||||
win32: DEFINES += HB_NO_WIN1256
|
win32: DEFINES += HB_NO_WIN1256
|
||||||
|
|
||||||
INCLUDEPATH += $$PWD/include
|
INCLUDEPATH += $$PWD/include
|
||||||
|
INCLUDEPATH += $$QT.core.includes
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
$$PWD/src/hb-blob.cc \
|
$$PWD/src/hb-blob.cc \
|
||||||
|
@ -41,6 +41,25 @@
|
|||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
|
#elif !defined(HB_NO_MT) && defined(HAVE_QT5_ATOMICS)
|
||||||
|
#include <QtCore/qatomic.h>
|
||||||
|
|
||||||
|
QT_USE_NAMESPACE
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
// We need to cast hb_atomic_int_t to QAtomicInt and pointers to
|
||||||
|
// QAtomicPointer instead of using QAtomicOps, otherwise we get a failed
|
||||||
|
// overload resolution of the template arguments for testAndSetOrdered.
|
||||||
|
template <typename T> QAtomicPointer<T> *makeAtomicPointer(T * const &ptr)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<QAtomicPointer<T> *>(const_cast<T **>(&ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef int hb_atomic_int_t;
|
||||||
|
#define hb_atomic_int_add(AI, V) reinterpret_cast<QAtomicInt &>(AI).fetchAndAddOrdered(V)
|
||||||
|
#define hb_atomic_ptr_get(P) makeAtomicPointer(*P)->loadAcquire()
|
||||||
|
#define hb_atomic_ptr_cmpexch(P,O,N) makeAtomicPointer(*P)->testAndSetOrdered((O), (N))
|
||||||
|
|
||||||
#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__))
|
#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__))
|
||||||
|
|
||||||
|
10
src/3rdparty/harfbuzz-ng/src/hb-private.hh
vendored
10
src/3rdparty/harfbuzz-ng/src/hb-private.hh
vendored
@ -94,16 +94,6 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#undef inline
|
|
||||||
#define inline __inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __STRICT_ANSI__
|
|
||||||
#undef inline
|
|
||||||
#define inline __inline__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
#define HB_FUNC __PRETTY_FUNCTION__
|
#define HB_FUNC __PRETTY_FUNCTION__
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
|
@ -134,12 +134,12 @@ if (NOT TARGET Qt5::WinMain)
|
|||||||
set(_isNotExcluded $<NOT:$<BOOL:$<TARGET_PROPERTY:Qt5_NO_LINK_QTMAIN>>>)
|
set(_isNotExcluded $<NOT:$<BOOL:$<TARGET_PROPERTY:Qt5_NO_LINK_QTMAIN>>>)
|
||||||
set(_isPolicyNEW $<TARGET_POLICY:CMP0020>)
|
set(_isPolicyNEW $<TARGET_POLICY:CMP0020>)
|
||||||
get_target_property(_configs Qt5::Core IMPORTED_CONFIGURATIONS)
|
get_target_property(_configs Qt5::Core IMPORTED_CONFIGURATIONS)
|
||||||
|
set_property(TARGET Qt5::Core APPEND PROPERTY
|
||||||
|
INTERFACE_LINK_LIBRARIES
|
||||||
|
$<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
|
||||||
|
)
|
||||||
|
# For backward compatibility with CMake < 2.8.12
|
||||||
foreach(_config ${_configs})
|
foreach(_config ${_configs})
|
||||||
set_property(TARGET Qt5::Core APPEND PROPERTY
|
|
||||||
INTERFACE_LINK_LIBRARIES
|
|
||||||
$<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
|
|
||||||
)
|
|
||||||
# For backward compatibility with CMake < 2.8.12
|
|
||||||
set_property(TARGET Qt5::Core APPEND PROPERTY
|
set_property(TARGET Qt5::Core APPEND PROPERTY
|
||||||
IMPORTED_LINK_INTERFACE_LIBRARIES_${_config}
|
IMPORTED_LINK_INTERFACE_LIBRARIES_${_config}
|
||||||
$<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
|
$<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
animations in parallel. The animation group finishes when the
|
animations in parallel. The animation group finishes when the
|
||||||
longest lasting animation has finished.
|
longest lasting animation has finished.
|
||||||
|
|
||||||
You can treat QParallelAnimation as any other QAbstractAnimation,
|
You can treat QParallelAnimationGroup as any other QAbstractAnimation,
|
||||||
e.g., pause, resume, or add it to other animation groups.
|
e.g., pause, resume, or add it to other animation groups.
|
||||||
|
|
||||||
\code
|
\code
|
||||||
|
@ -25,7 +25,7 @@ qhp.QtCore.subprojects.classes.sortPages = true
|
|||||||
|
|
||||||
tagfile = ../../../doc/qtcore/qtcore.tags
|
tagfile = ../../../doc/qtcore/qtcore.tags
|
||||||
|
|
||||||
depends += activeqt qtdbus qtgui qtwidgets qtnetwork qtdoc qtmacextras qtquick qtlinguist qtdesigner qtconcurrent qtxml qmake
|
depends += activeqt qtdbus qtgui qtwidgets qtnetwork qtdoc qtmacextras qtquick qtlinguist qtdesigner qtconcurrent qtxml qmake qtwinextras
|
||||||
# depends += qtqml # Qt namespace collides with QtQml::Qt, see QTBUG-38630
|
# depends += qtqml # Qt namespace collides with QtQml::Qt, see QTBUG-38630
|
||||||
|
|
||||||
headerdirs += ..
|
headerdirs += ..
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
The animation framework aims to provide an easy way for creating animated
|
The animation framework aims to provide an easy way for creating animated
|
||||||
and smooth GUIs. By animating Qt properties, the framework provides great
|
and smooth GUIs. By animating Qt properties, the framework provides great
|
||||||
freedom for animating widgets and other {QObject}s. The framework can
|
freedom for animating widgets and other \l{QObject}s. The framework can
|
||||||
also be used with the Graphics View framework. Many of the concepts
|
also be used with the Graphics View framework. Many of the concepts
|
||||||
available in the animation framework are also available in \l{Qt Quick},
|
available in the animation framework are also available in \l{Qt Quick},
|
||||||
where it offers a declarative way of defining animations. Much of the
|
where it offers a declarative way of defining animations. Much of the
|
||||||
@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
In this overview, we explain the basics of its architecture. We
|
In this overview, we explain the basics of its architecture. We
|
||||||
also show examples of the most common techniques that the
|
also show examples of the most common techniques that the
|
||||||
framework allows for animating {QObject}s and graphics items.
|
framework allows for animating \l{QObject}s and graphics items.
|
||||||
|
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
|
|
||||||
@ -85,7 +85,7 @@
|
|||||||
over the property using an easing curve. So when you want to
|
over the property using an easing curve. So when you want to
|
||||||
animate a value, you can declare it as a property and make your
|
animate a value, you can declare it as a property and make your
|
||||||
class a QObject. Note that this gives us great freedom in
|
class a QObject. Note that this gives us great freedom in
|
||||||
animating already existing widgets and other {QObject}s.
|
animating already existing widgets and other \l{QObject}s.
|
||||||
|
|
||||||
Complex animations can be constructed by building a tree structure
|
Complex animations can be constructed by building a tree structure
|
||||||
of \l{QAbstractAnimation}s. The tree is built by using
|
of \l{QAbstractAnimation}s. The tree is built by using
|
||||||
|
@ -87,7 +87,7 @@ There are three general ways to use QTextStream when reading text files:
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
\li Chunk by chunk, by calling \l{QBuffer::readLine()}{readLine()} or \l{QBuffer::readAll()}{readAll()}.
|
\li Chunk by chunk, by calling \l{QBuffer::readLine()}{readLine()} or \l{QBuffer::readAll()}{readAll()}.
|
||||||
\li Word by word. QTextStream supports streaming into {QString}s, {QByteArray}s
|
\li Word by word. QTextStream supports streaming into \l{QString}s, \l{QByteArray}s
|
||||||
and char* buffers. Words are delimited by space, and leading white space
|
and char* buffers. Words are delimited by space, and leading white space
|
||||||
is automatically skipped.
|
is automatically skipped.
|
||||||
\li Character by character, by streaming into QChar or char types. This
|
\li Character by character, by streaming into QChar or char types. This
|
||||||
|
@ -549,7 +549,10 @@
|
|||||||
# define Q_COMPILER_UNRESTRICTED_UNIONS
|
# define Q_COMPILER_UNRESTRICTED_UNIONS
|
||||||
# endif
|
# endif
|
||||||
# if __INTEL_COMPILER >= 1500
|
# if __INTEL_COMPILER >= 1500
|
||||||
# define Q_COMPILER_CONSTEXPR
|
# if __INTEL_COMPILER * 100 + __INTEL_COMPILER_UPDATE >= 150001
|
||||||
|
// the bug mentioned above is fixed in 15.0.1
|
||||||
|
# define Q_COMPILER_CONSTEXPR
|
||||||
|
# endif
|
||||||
# define Q_COMPILER_ALIGNAS
|
# define Q_COMPILER_ALIGNAS
|
||||||
# define Q_COMPILER_ALIGNOF
|
# define Q_COMPILER_ALIGNOF
|
||||||
# define Q_COMPILER_INHERITING_CONSTRUCTORS
|
# define Q_COMPILER_INHERITING_CONSTRUCTORS
|
||||||
|
@ -882,6 +882,7 @@ QT_WARNING_DISABLE_MSVC(4530) /* C++ exception handler used, but unwind semantic
|
|||||||
/* make use of decltype or GCC's __typeof__ extension */
|
/* make use of decltype or GCC's __typeof__ extension */
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class QForeachContainer {
|
class QForeachContainer {
|
||||||
|
QForeachContainer &operator=(const QForeachContainer &) Q_DECL_EQ_DELETE;
|
||||||
public:
|
public:
|
||||||
inline QForeachContainer(const T& t) : c(t), i(c.begin()), e(c.end()), control(1) { }
|
inline QForeachContainer(const T& t) : c(t), i(c.begin()), e(c.end()), control(1) { }
|
||||||
const T c;
|
const T c;
|
||||||
|
@ -78,11 +78,12 @@
|
|||||||
|
|
||||||
#ifndef QT_BOOTSTRAPPED
|
#ifndef QT_BOOTSTRAPPED
|
||||||
#if !defined QT_NO_REGULAREXPRESSION
|
#if !defined QT_NO_REGULAREXPRESSION
|
||||||
# if (defined(__GLIBC__) && defined(__GLIBCXX__)) || (__has_include(<cxxabi.h>) && __has_include(<execinfo.h>))
|
# ifdef __UCLIBC__
|
||||||
|
# if __UCLIBC_HAS_BACKTRACE__
|
||||||
|
# define QLOGGING_HAVE_BACKTRACE
|
||||||
|
# endif
|
||||||
|
# elif (defined(__GLIBC__) && defined(__GLIBCXX__)) || (__has_include(<cxxabi.h>) && __has_include(<execinfo.h>))
|
||||||
# define QLOGGING_HAVE_BACKTRACE
|
# define QLOGGING_HAVE_BACKTRACE
|
||||||
# include <qregularexpression.h>
|
|
||||||
# include <cxxabi.h>
|
|
||||||
# include <execinfo.h>
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -116,6 +117,12 @@ static QT_PREPEND_NAMESPACE(qint64) qt_gettid()
|
|||||||
return qintptr(QThread::currentThreadId());
|
return qintptr(QThread::currentThreadId());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef QLOGGING_HAVE_BACKTRACE
|
||||||
|
# include <qregularexpression.h>
|
||||||
|
# include <cxxabi.h>
|
||||||
|
# include <execinfo.h>
|
||||||
|
#endif
|
||||||
#endif // !QT_BOOTSTRAPPED
|
#endif // !QT_BOOTSTRAPPED
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -998,7 +1005,7 @@ QMessagePattern::QMessagePattern()
|
|||||||
|
|
||||||
QMessagePattern::~QMessagePattern()
|
QMessagePattern::~QMessagePattern()
|
||||||
{
|
{
|
||||||
for (int i = 0; literals[i] != 0; ++i)
|
for (int i = 0; literals[i]; ++i)
|
||||||
delete [] literals[i];
|
delete [] literals[i];
|
||||||
delete [] literals;
|
delete [] literals;
|
||||||
literals = 0;
|
literals = 0;
|
||||||
@ -1008,8 +1015,12 @@ QMessagePattern::~QMessagePattern()
|
|||||||
|
|
||||||
void QMessagePattern::setPattern(const QString &pattern)
|
void QMessagePattern::setPattern(const QString &pattern)
|
||||||
{
|
{
|
||||||
|
if (literals) {
|
||||||
|
for (int i = 0; literals[i]; ++i)
|
||||||
|
delete [] literals[i];
|
||||||
|
delete [] literals;
|
||||||
|
}
|
||||||
delete [] tokens;
|
delete [] tokens;
|
||||||
delete [] literals;
|
|
||||||
|
|
||||||
// scanner
|
// scanner
|
||||||
QList<QString> lexemes;
|
QList<QString> lexemes;
|
||||||
@ -1285,13 +1296,13 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
|
|||||||
message.append(QString::number(qlonglong(QThread::currentThread()->currentThread()), 16));
|
message.append(QString::number(qlonglong(QThread::currentThread()->currentThread()), 16));
|
||||||
#ifdef QLOGGING_HAVE_BACKTRACE
|
#ifdef QLOGGING_HAVE_BACKTRACE
|
||||||
} else if (token == backtraceTokenC) {
|
} else if (token == backtraceTokenC) {
|
||||||
QVarLengthArray<void*, 32> buffer(15 + pattern->backtraceDepth);
|
QVarLengthArray<void*, 32> buffer(7 + pattern->backtraceDepth);
|
||||||
int n = backtrace(buffer.data(), buffer.size());
|
int n = backtrace(buffer.data(), buffer.size());
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
QScopedPointer<char*, QScopedPointerPodDeleter> strings(backtrace_symbols(buffer.data(), n));
|
|
||||||
int numberPrinted = 0;
|
int numberPrinted = 0;
|
||||||
for (int i = 0; i < n && numberPrinted < pattern->backtraceDepth; ++i) {
|
for (int i = 0; i < n && numberPrinted < pattern->backtraceDepth; ++i) {
|
||||||
QString trace = QString::fromLatin1(strings.data()[i]);
|
QScopedPointer<char*, QScopedPointerPodDeleter> strings(backtrace_symbols(buffer.data() + i, 1));
|
||||||
|
QString trace = QString::fromLatin1(strings.data()[0]);
|
||||||
// The results of backtrace_symbols looks like this:
|
// The results of backtrace_symbols looks like this:
|
||||||
// /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413]
|
// /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413]
|
||||||
// The offset and function name are optional.
|
// The offset and function name are optional.
|
||||||
|
@ -498,7 +498,7 @@
|
|||||||
\value TextExpandTabs Makes the U+0009 (ASCII tab) character move to
|
\value TextExpandTabs Makes the U+0009 (ASCII tab) character move to
|
||||||
the next tab stop.
|
the next tab stop.
|
||||||
\value TextShowMnemonic Displays the string "\&P" as \underline{P}
|
\value TextShowMnemonic Displays the string "\&P" as \underline{P}
|
||||||
(see QButton for an example). For an ampersand, use "\&\&".
|
For an ampersand, use "\&\&".
|
||||||
\value TextWordWrap Breaks lines at appropriate points, e.g. at word
|
\value TextWordWrap Breaks lines at appropriate points, e.g. at word
|
||||||
boundaries.
|
boundaries.
|
||||||
\value TextWrapAnywhere Breaks lines anywhere, even within words.
|
\value TextWrapAnywhere Breaks lines anywhere, even within words.
|
||||||
@ -902,8 +902,7 @@
|
|||||||
on QWidget::contentsRect(). This is set by the widget's author.
|
on QWidget::contentsRect(). This is set by the widget's author.
|
||||||
|
|
||||||
\value WA_LayoutUsesWidgetRect Ignore the layout item rect from the style
|
\value WA_LayoutUsesWidgetRect Ignore the layout item rect from the style
|
||||||
when laying out this widget with QLayout. This makes a difference in
|
when laying out this widget with QLayout.
|
||||||
QMacStyle and QPlastiqueStyle for some widgets.
|
|
||||||
|
|
||||||
\value WA_MacNoClickThrough When a widget that has this attribute set
|
\value WA_MacNoClickThrough When a widget that has this attribute set
|
||||||
is clicked, and its window is inactive, the click will make the window
|
is clicked, and its window is inactive, the click will make the window
|
||||||
@ -1162,7 +1161,7 @@
|
|||||||
_NET_WM_WINDOW_TYPE X11 window property. See
|
_NET_WM_WINDOW_TYPE X11 window property. See
|
||||||
http://standards.freedesktop.org/wm-spec/ for more details. This
|
http://standards.freedesktop.org/wm-spec/ for more details. This
|
||||||
attribute has no effect on non-X11 platforms. \b Note: Qt
|
attribute has no effect on non-X11 platforms. \b Note: Qt
|
||||||
automatically sets this attribute for QMenus added to a QMenuBar.
|
automatically sets this attribute for QMenu objects added to a QMenuBar.
|
||||||
|
|
||||||
\value WA_X11NetWmWindowTypePopupMenu Adds _NET_WM_WINDOW_TYPE_POPUP_MENU
|
\value WA_X11NetWmWindowTypePopupMenu Adds _NET_WM_WINDOW_TYPE_POPUP_MENU
|
||||||
to the window's _NET_WM_WINDOW_TYPE X11 window property. See
|
to the window's _NET_WM_WINDOW_TYPE X11 window property. See
|
||||||
|
@ -231,7 +231,7 @@ static QString qrcScheme()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
This is a convenience version of select operating on QUrls. If the scheme is not file or qrc,
|
This is a convenience version of select operating on QUrl objects. If the scheme is not file or qrc,
|
||||||
\a filePath is returned immediately. Otherwise selection is applied to the path of \a filePath
|
\a filePath is returned immediately. Otherwise selection is applied to the path of \a filePath
|
||||||
and a QUrl is returned with the selected path and other QUrl parts the same as \a filePath.
|
and a QUrl is returned with the selected path and other QUrl parts the same as \a filePath.
|
||||||
|
|
||||||
|
@ -706,7 +706,7 @@ bool QIODevice::reset()
|
|||||||
number of bytes to allocate in a buffer before reading.
|
number of bytes to allocate in a buffer before reading.
|
||||||
|
|
||||||
Subclasses that reimplement this function must call the base
|
Subclasses that reimplement this function must call the base
|
||||||
implementation in order to include the size of QIODevices' buffer. Example:
|
implementation in order to include the size of the buffer of QIODevice. Example:
|
||||||
|
|
||||||
\snippet code/src_corelib_io_qiodevice.cpp 1
|
\snippet code/src_corelib_io_qiodevice.cpp 1
|
||||||
|
|
||||||
|
@ -1456,7 +1456,7 @@ void QProcess::setStandardErrorFile(const QString &fileName, OpenMode mode)
|
|||||||
The following shell command:
|
The following shell command:
|
||||||
\snippet code/src_corelib_io_qprocess.cpp 2
|
\snippet code/src_corelib_io_qprocess.cpp 2
|
||||||
|
|
||||||
Can be accomplished with QProcesses with the following code:
|
Can be accomplished with QProcess with the following code:
|
||||||
\snippet code/src_corelib_io_qprocess.cpp 3
|
\snippet code/src_corelib_io_qprocess.cpp 3
|
||||||
*/
|
*/
|
||||||
void QProcess::setStandardOutputProcess(QProcess *destination)
|
void QProcess::setStandardOutputProcess(QProcess *destination)
|
||||||
|
@ -197,7 +197,7 @@ Q_GLOBAL_STATIC(QStringList, resourceSearchPaths)
|
|||||||
path requested in setFileName().
|
path requested in setFileName().
|
||||||
|
|
||||||
The unregisterResource() function removes a reference to a particular
|
The unregisterResource() function removes a reference to a particular
|
||||||
file. If there are QResources that currently reference resources related
|
file. If there are QResource objects that currently reference resources related
|
||||||
to the unregistered file, they will continue to be valid but the resource
|
to the unregistered file, they will continue to be valid but the resource
|
||||||
file itself will be removed from the resource roots, and thus no further
|
file itself will be removed from the resource roots, and thus no further
|
||||||
QResource can be created pointing into this resource data. The resource
|
QResource can be created pointing into this resource data. The resource
|
||||||
|
@ -77,15 +77,10 @@ QT_BEGIN_NAMESPACE
|
|||||||
this user, but should still be assumed to be unreachable by applications by
|
this user, but should still be assumed to be unreachable by applications by
|
||||||
other users.
|
other users.
|
||||||
|
|
||||||
The only exception is QStandardPaths::TempLocation (which is the same as
|
|
||||||
QDir::tempPath()): the path returned may be application-specific, but files
|
|
||||||
stored there may be accessed by other applications run by the same user.
|
|
||||||
|
|
||||||
Data interchange with other users is out of the scope of QStandardPaths.
|
Data interchange with other users is out of the scope of QStandardPaths.
|
||||||
|
|
||||||
\value DesktopLocation Returns the user's desktop directory. This is a generic value.
|
\value DesktopLocation Returns the user's desktop directory. This is a generic value.
|
||||||
On systems with no concept of a desktop, this is the same as
|
On systems with no concept of a desktop.
|
||||||
QStandardPaths::HomeLocation.
|
|
||||||
\value DocumentsLocation Returns the directory containing user document files.
|
\value DocumentsLocation Returns the directory containing user document files.
|
||||||
This is a generic value. The returned path is never empty.
|
This is a generic value. The returned path is never empty.
|
||||||
\value FontsLocation Returns the directory containing user's fonts. This is a generic value.
|
\value FontsLocation Returns the directory containing user's fonts. This is a generic value.
|
||||||
@ -118,9 +113,6 @@ QT_BEGIN_NAMESPACE
|
|||||||
\value GenericCacheLocation Returns a directory location where user-specific non-essential
|
\value GenericCacheLocation Returns a directory location where user-specific non-essential
|
||||||
(cached) data, shared across applications, should be written. This is a generic value.
|
(cached) data, shared across applications, should be written. This is a generic value.
|
||||||
Note that the returned path may be empty if the system has no concept of shared cache.
|
Note that the returned path may be empty if the system has no concept of shared cache.
|
||||||
\value GenericDataLocation Returns a directory location where persistent
|
|
||||||
data shared across applications can be stored. This is a generic value. The returned
|
|
||||||
path is never empty.
|
|
||||||
\value RuntimeLocation Returns a directory location where runtime communication
|
\value RuntimeLocation Returns a directory location where runtime communication
|
||||||
files should be written, like Unix local sockets. This is a generic value.
|
files should be written, like Unix local sockets. This is a generic value.
|
||||||
The returned path may be empty on some systems.
|
The returned path may be empty on some systems.
|
||||||
|
@ -57,7 +57,7 @@ static QJNIObjectPrivate applicationContext()
|
|||||||
if (appCtx.isValid())
|
if (appCtx.isValid())
|
||||||
return appCtx;
|
return appCtx;
|
||||||
|
|
||||||
QJNIObjectPrivate activity = QtAndroidPrivate::activity();
|
QJNIObjectPrivate activity(QtAndroidPrivate::activity());
|
||||||
if (!activity.isValid())
|
if (!activity.isValid())
|
||||||
return appCtx;
|
return appCtx;
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ static QString getExternalFilesDir(const char *directoryField = 0)
|
|||||||
if (!path.isEmpty())
|
if (!path.isEmpty())
|
||||||
return path;
|
return path;
|
||||||
|
|
||||||
QJNIObjectPrivate activity = QtAndroidPrivate::activity();
|
QJNIObjectPrivate activity(QtAndroidPrivate::activity());
|
||||||
if (!activity.isValid())
|
if (!activity.isValid())
|
||||||
return QString();
|
return QString();
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@
|
|||||||
# include <sys/statvfs.h>
|
# include <sys/statvfs.h>
|
||||||
#elif defined(Q_OS_SOLARIS)
|
#elif defined(Q_OS_SOLARIS)
|
||||||
# include <sys/mnttab.h>
|
# include <sys/mnttab.h>
|
||||||
|
# include <sys/statvfs.h>
|
||||||
#elif defined(Q_OS_HAIKU)
|
#elif defined(Q_OS_HAIKU)
|
||||||
# include <Directory.h>
|
# include <Directory.h>
|
||||||
# include <Path.h>
|
# include <Path.h>
|
||||||
@ -210,17 +211,17 @@ inline bool QStorageIterator::next()
|
|||||||
|
|
||||||
inline QString QStorageIterator::rootPath() const
|
inline QString QStorageIterator::rootPath() const
|
||||||
{
|
{
|
||||||
return QFile::decodeName(mnt->mnt_mountp);
|
return QFile::decodeName(mnt.mnt_mountp);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QByteArray QStorageIterator::fileSystemType() const
|
inline QByteArray QStorageIterator::fileSystemType() const
|
||||||
{
|
{
|
||||||
return QByteArray(mnt->mnt_fstype);
|
return QByteArray(mnt.mnt_fstype);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QByteArray QStorageIterator::device() const
|
inline QByteArray QStorageIterator::device() const
|
||||||
{
|
{
|
||||||
return QByteArray(mnt->mnt_mntopts);
|
return QByteArray(mnt.mnt_mntopts);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(Q_OS_ANDROID)
|
#elif defined(Q_OS_ANDROID)
|
||||||
|
@ -82,7 +82,7 @@
|
|||||||
For the convenience of generating encoded URL strings or query
|
For the convenience of generating encoded URL strings or query
|
||||||
strings, there are two static functions called
|
strings, there are two static functions called
|
||||||
fromPercentEncoding() and toPercentEncoding() which deal with
|
fromPercentEncoding() and toPercentEncoding() which deal with
|
||||||
percent encoding and decoding of QStrings.
|
percent encoding and decoding of QString objects.
|
||||||
|
|
||||||
Calling isRelative() will tell whether or not the URL is
|
Calling isRelative() will tell whether or not the URL is
|
||||||
relative. A relative URL can be resolved by passing it as argument
|
relative. A relative URL can be resolved by passing it as argument
|
||||||
@ -172,7 +172,7 @@
|
|||||||
setters setting components of a URL; it is not permitted in
|
setters setting components of a URL; it is not permitted in
|
||||||
the QUrl constructor, in fromEncoded() or in setUrl().
|
the QUrl constructor, in fromEncoded() or in setUrl().
|
||||||
For more information on this mode, see the documentation for
|
For more information on this mode, see the documentation for
|
||||||
QUrl::FullyDecoded.
|
\l {QUrl::ComponentFormattingOption}{QUrl::FullyDecoded}.
|
||||||
|
|
||||||
In TolerantMode, the parser has the following behaviour:
|
In TolerantMode, the parser has the following behaviour:
|
||||||
|
|
||||||
@ -3083,6 +3083,21 @@ bool QUrl::hasFragment() const
|
|||||||
URL does not contain a valid TLD, in which case the function returns
|
URL does not contain a valid TLD, in which case the function returns
|
||||||
an empty string.
|
an empty string.
|
||||||
|
|
||||||
|
Note that this function considers a TLD to be any domain that allows users
|
||||||
|
to register subdomains under, including many home, dynamic DNS websites and
|
||||||
|
blogging providers. This is useful for determining whether two websites
|
||||||
|
belong to the same infrastructure and communication should be allowed, such
|
||||||
|
as browser cookies: two domains should be considered part of the same
|
||||||
|
website if they share at least one label in addition to the value
|
||||||
|
returned by this function.
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li \c{foo.co.uk} and \c{foo.com} do not share a top-level domain
|
||||||
|
\li \c{foo.co.uk} and \c{bar.co.uk} share the \c{.co.uk} domain, but the next label is different
|
||||||
|
\li \c{www.foo.co.uk} and \c{ftp.foo.co.uk} share the same top-level domain and one more label,
|
||||||
|
so they are considered part of the same site
|
||||||
|
\endlist
|
||||||
|
|
||||||
If \a options includes EncodeUnicode, the returned string will be in
|
If \a options includes EncodeUnicode, the returned string will be in
|
||||||
ASCII Compatible Encoding.
|
ASCII Compatible Encoding.
|
||||||
*/
|
*/
|
||||||
@ -4041,7 +4056,7 @@ QString QUrl::errorString() const
|
|||||||
/*!
|
/*!
|
||||||
\since 5.1
|
\since 5.1
|
||||||
|
|
||||||
Converts a list of \a urls into a list of QStrings, using toString(\a options).
|
Converts a list of \a urls into a list of QString objects, using toString(\a options).
|
||||||
*/
|
*/
|
||||||
QStringList QUrl::toStringList(const QList<QUrl> &urls, FormattingOptions options)
|
QStringList QUrl::toStringList(const QList<QUrl> &urls, FormattingOptions options)
|
||||||
{
|
{
|
||||||
|
@ -414,7 +414,7 @@ bool QUrlQuery::operator ==(const QUrlQuery &other) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns \c true if this QUrlQUery object contains no key-value pairs, such as
|
Returns \c true if this QUrlQuery object contains no key-value pairs, such as
|
||||||
after being default-constructed or after parsing an empty query string.
|
after being default-constructed or after parsing an empty query string.
|
||||||
|
|
||||||
\sa setQuery(), clear()
|
\sa setQuery(), clear()
|
||||||
|
@ -200,6 +200,7 @@ bool Object::isValid() const
|
|||||||
if (tableOffset + length*sizeof(offset) > size)
|
if (tableOffset + length*sizeof(offset) > size)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
QString lastKey;
|
||||||
for (uint i = 0; i < length; ++i) {
|
for (uint i = 0; i < length; ++i) {
|
||||||
offset entryOffset = table()[i];
|
offset entryOffset = table()[i];
|
||||||
if (entryOffset + sizeof(Entry) >= tableOffset)
|
if (entryOffset + sizeof(Entry) >= tableOffset)
|
||||||
@ -208,8 +209,12 @@ bool Object::isValid() const
|
|||||||
int s = e->size();
|
int s = e->size();
|
||||||
if (table()[i] + s > tableOffset)
|
if (table()[i] + s > tableOffset)
|
||||||
return false;
|
return false;
|
||||||
|
QString key = e->key();
|
||||||
|
if (key < lastKey)
|
||||||
|
return false;
|
||||||
if (!e->value.isValid(this))
|
if (!e->value.isValid(this))
|
||||||
return false;
|
return false;
|
||||||
|
lastKey = key;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -531,8 +531,8 @@ bool QJsonArray::contains(const QJsonValue &value) const
|
|||||||
\a i must be a valid index position in the array (i.e., \c{0 <= i <
|
\a i must be a valid index position in the array (i.e., \c{0 <= i <
|
||||||
size()}).
|
size()}).
|
||||||
|
|
||||||
The return value is of type QJsonValueRef, a helper class for QJsonArray
|
The return value is of type \keyword QJsonValueRef, a helper class for QJsonArray
|
||||||
and QJsonObject. When you get an object of type QJsonValueRef, you can
|
and QJsonObject. When you get an object of type \keyword QJsonValueRef, you can
|
||||||
use it as if it were a reference to a QJsonValue. If you assign to it,
|
use it as if it were a reference to a QJsonValue. If you assign to it,
|
||||||
the assignment will apply to the character in the QJsonArray of QJsonObject
|
the assignment will apply to the character in the QJsonArray of QJsonObject
|
||||||
from which you got the reference.
|
from which you got the reference.
|
||||||
@ -731,13 +731,14 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
|
|||||||
|
|
||||||
/*! \fn QJsonValueRef QJsonArray::iterator::operator*() const
|
/*! \fn QJsonValueRef QJsonArray::iterator::operator*() const
|
||||||
|
|
||||||
|
|
||||||
Returns a modifiable reference to the current item.
|
Returns a modifiable reference to the current item.
|
||||||
|
|
||||||
You can change the value of an item by using operator*() on the
|
You can change the value of an item by using operator*() on the
|
||||||
left side of an assignment.
|
left side of an assignment.
|
||||||
|
|
||||||
The return value is of type QJsonValueRef, a helper class for QJsonArray
|
The return value is of type \keyword QJsonValueRef, a helper class for QJsonArray
|
||||||
and QJsonObject. When you get an object of type QJsonValueRef, you can
|
and QJsonObject. When you get an object of type \keyword QJsonValueRef, you can
|
||||||
use it as if it were a reference to a QJsonValue. If you assign to it,
|
use it as if it were a reference to a QJsonValue. If you assign to it,
|
||||||
the assignment will apply to the character in the QJsonArray of QJsonObject
|
the assignment will apply to the character in the QJsonArray of QJsonObject
|
||||||
from which you got the reference.
|
from which you got the reference.
|
||||||
@ -756,8 +757,8 @@ bool QJsonArray::operator!=(const QJsonArray &other) const
|
|||||||
This function is provided to make QJsonArray iterators behave like C++
|
This function is provided to make QJsonArray iterators behave like C++
|
||||||
pointers.
|
pointers.
|
||||||
|
|
||||||
The return value is of type QJsonValueRef, a helper class for QJsonArray
|
The return value is of type \keyword QJsonValueRef, a helper class for QJsonArray
|
||||||
and QJsonObject. When you get an object of type QJsonValueRef, you can
|
and QJsonObject. When you get an object of type \keyword QJsonValueRef, you can
|
||||||
use it as if it were a reference to a QJsonValue. If you assign to it,
|
use it as if it were a reference to a QJsonValue. If you assign to it,
|
||||||
the assignment will apply to the character in the QJsonArray of QJsonObject
|
the assignment will apply to the character in the QJsonArray of QJsonObject
|
||||||
from which you got the reference.
|
from which you got the reference.
|
||||||
|
@ -264,6 +264,8 @@ QVariantHash QJsonObject::toVariantHash() const
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns a list of all keys in this object.
|
Returns a list of all keys in this object.
|
||||||
|
|
||||||
|
The list is sorted lexographically.
|
||||||
*/
|
*/
|
||||||
QStringList QJsonObject::keys() const
|
QStringList QJsonObject::keys() const
|
||||||
{
|
{
|
||||||
|
@ -74,6 +74,20 @@ QT_BEGIN_NAMESPACE
|
|||||||
conversions. This implies that converting to a type that is not stored in the value will return a default
|
conversions. This implies that converting to a type that is not stored in the value will return a default
|
||||||
constructed return value.
|
constructed return value.
|
||||||
|
|
||||||
|
\section1 QJsonValueRef
|
||||||
|
|
||||||
|
QJsonValueRef is a helper class for QJsonArray and QJsonObject.
|
||||||
|
When you get an object of type QJsonValueRef, you can
|
||||||
|
use it as if it were a reference to a QJsonValue. If you assign to it,
|
||||||
|
the assignment will apply to the element in the QJsonArray or QJsonObject
|
||||||
|
from which you got the reference.
|
||||||
|
|
||||||
|
The following methods return QJsonValueRef:
|
||||||
|
\list
|
||||||
|
\li \l {QJsonArray}::operator[](int i)
|
||||||
|
\li \l {QJsonObject}::operator[](const QString & key) const
|
||||||
|
\endlist
|
||||||
|
|
||||||
\sa {JSON Support in Qt}, {JSON Save Game Example}
|
\sa {JSON Support in Qt}, {JSON Save Game Example}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -419,13 +433,13 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
|
|||||||
|
|
||||||
The QJsonValue types will be converted as follows:
|
The QJsonValue types will be converted as follows:
|
||||||
|
|
||||||
\value Null {QVariant::}{QVariant()}
|
\value Null \l {QVariant::}{QVariant()}
|
||||||
\value Bool QMetaType::Bool
|
\value Bool QMetaType::Bool
|
||||||
\value Double QMetaType::Double
|
\value Double QMetaType::Double
|
||||||
\value String QString
|
\value String QString
|
||||||
\value Array QVariantList
|
\value Array QVariantList
|
||||||
\value Object QVariantMap
|
\value Object QVariantMap
|
||||||
\value Undefined {QVariant::}{QVariant()}
|
\value Undefined \l {QVariant::}{QVariant()}
|
||||||
|
|
||||||
\sa fromVariant()
|
\sa fromVariant()
|
||||||
*/
|
*/
|
||||||
|
@ -386,7 +386,7 @@ void QAbstractEventDispatcher::closingDown()
|
|||||||
\note The filter function set here receives native messages,
|
\note The filter function set here receives native messages,
|
||||||
that is, MSG or XEvent structs.
|
that is, MSG or XEvent structs.
|
||||||
|
|
||||||
For maximum portability, you should always try to use QEvents
|
For maximum portability, you should always try to use QEvent objects
|
||||||
and QObject::installEventFilter() whenever possible.
|
and QObject::installEventFilter() whenever possible.
|
||||||
|
|
||||||
\sa QObject::installEventFilter()
|
\sa QObject::installEventFilter()
|
||||||
|
@ -80,6 +80,11 @@
|
|||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
# ifdef Q_OS_WINRT
|
# ifdef Q_OS_WINRT
|
||||||
# include "qeventdispatcher_winrt_p.h"
|
# include "qeventdispatcher_winrt_p.h"
|
||||||
|
# include "qfunctions_winrt.h"
|
||||||
|
# include <wrl.h>
|
||||||
|
# include <Windows.ApplicationModel.core.h>
|
||||||
|
using namespace ABI::Windows::ApplicationModel::Core;
|
||||||
|
using namespace Microsoft::WRL;
|
||||||
# else
|
# else
|
||||||
# include "qeventdispatcher_win_p.h"
|
# include "qeventdispatcher_win_p.h"
|
||||||
# endif
|
# endif
|
||||||
@ -1244,6 +1249,19 @@ void QCoreApplication::exit(int returnCode)
|
|||||||
QEventLoop *eventLoop = data->eventLoops.at(i);
|
QEventLoop *eventLoop = data->eventLoops.at(i);
|
||||||
eventLoop->exit(returnCode);
|
eventLoop->exit(returnCode);
|
||||||
}
|
}
|
||||||
|
#ifdef Q_OS_WINRT
|
||||||
|
qWarning("QCoreApplication::exit: It is not recommended to explicitly exit an application on Windows Store Apps");
|
||||||
|
ComPtr<ICoreApplication> app;
|
||||||
|
HRESULT hr = RoGetActivationFactory(Wrappers::HString::MakeReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(),
|
||||||
|
IID_PPV_ARGS(&app));
|
||||||
|
RETURN_VOID_IF_FAILED("Could not acquire ICoreApplication object");
|
||||||
|
ComPtr<ICoreApplicationExit> appExit;
|
||||||
|
|
||||||
|
hr = app.As(&appExit);
|
||||||
|
RETURN_VOID_IF_FAILED("Could not acquire ICoreApplicationExit object");
|
||||||
|
hr = appExit->Exit();
|
||||||
|
RETURN_VOID_IF_FAILED("Could not exit application");
|
||||||
|
#endif // Q_OS_WINRT
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@ -2405,7 +2423,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutex, libraryPathMutex, (QMutex::Recursive))
|
|||||||
INSTALL/plugins, where \c INSTALL is the directory where Qt was
|
INSTALL/plugins, where \c INSTALL is the directory where Qt was
|
||||||
installed). The directory of the application executable (NOT the
|
installed). The directory of the application executable (NOT the
|
||||||
working directory) is always added, as well as the colon separated
|
working directory) is always added, as well as the colon separated
|
||||||
entries of the QT_PLUGIN_PATH environment variable.
|
entries of the \c QT_PLUGIN_PATH environment variable.
|
||||||
|
|
||||||
If you want to iterate over the list, you can use the \l foreach
|
If you want to iterate over the list, you can use the \l foreach
|
||||||
pseudo-keyword:
|
pseudo-keyword:
|
||||||
@ -2550,7 +2568,7 @@ void QCoreApplication::removeLibraryPath(const QString &path)
|
|||||||
\note Native event filters will be disabled when the application the
|
\note Native event filters will be disabled when the application the
|
||||||
Qt::AA_MacPluginApplication attribute is set.
|
Qt::AA_MacPluginApplication attribute is set.
|
||||||
|
|
||||||
For maximum portability, you should always try to use QEvents
|
For maximum portability, you should always try to use QEvent
|
||||||
and QObject::installEventFilter() whenever possible.
|
and QObject::installEventFilter() whenever possible.
|
||||||
|
|
||||||
\sa QObject::installEventFilter()
|
\sa QObject::installEventFilter()
|
||||||
|
@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
send events using QCoreApplication::sendEvent() and
|
send events using QCoreApplication::sendEvent() and
|
||||||
QCoreApplication::postEvent() (spontaneous() returns \c false).
|
QCoreApplication::postEvent() (spontaneous() returns \c false).
|
||||||
|
|
||||||
QObjects receive events by having their QObject::event() function
|
\l {QObject}{QObjects} receive events by having their QObject::event() function
|
||||||
called. The function can be reimplemented in subclasses to
|
called. The function can be reimplemented in subclasses to
|
||||||
customize event handling and add additional event types;
|
customize event handling and add additional event types;
|
||||||
QWidget::event() is a notable example. By default, events are
|
QWidget::event() is a notable example. By default, events are
|
||||||
@ -102,13 +102,13 @@ QT_BEGIN_NAMESPACE
|
|||||||
\value ChildAdded An object gets a child (QChildEvent).
|
\value ChildAdded An object gets a child (QChildEvent).
|
||||||
\value ChildPolished A widget child gets polished (QChildEvent).
|
\value ChildPolished A widget child gets polished (QChildEvent).
|
||||||
\value ChildRemoved An object loses a child (QChildEvent).
|
\value ChildRemoved An object loses a child (QChildEvent).
|
||||||
\value Clipboard The clipboard contents have changed (QClipboardEvent).
|
\value Clipboard The clipboard contents have changed.
|
||||||
\value Close Widget was closed (QCloseEvent).
|
\value Close Widget was closed (QCloseEvent).
|
||||||
\value CloseSoftwareInputPanel A widget wants to close the software input panel (SIP).
|
\value CloseSoftwareInputPanel A widget wants to close the software input panel (SIP).
|
||||||
\value ContentsRectChange The margins of the widget's content rect changed.
|
\value ContentsRectChange The margins of the widget's content rect changed.
|
||||||
\value ContextMenu Context popup menu (QContextMenuEvent).
|
\value ContextMenu Context popup menu (QContextMenuEvent).
|
||||||
\value CursorChange The widget's cursor has changed.
|
\value CursorChange The widget's cursor has changed.
|
||||||
\value DeferredDelete The object will be deleted after it has cleaned up (QDeferredDeleteEvent).
|
\value DeferredDelete The object will be deleted after it has cleaned up (QDeferredDeleteEvent)
|
||||||
\value DragEnter The cursor enters a widget during a drag and drop operation (QDragEnterEvent).
|
\value DragEnter The cursor enters a widget during a drag and drop operation (QDragEnterEvent).
|
||||||
\value DragLeave The cursor leaves a widget during a drag and drop operation (QDragLeaveEvent).
|
\value DragLeave The cursor leaves a widget during a drag and drop operation (QDragLeaveEvent).
|
||||||
\value DragMove A drag and drop operation is in progress (QDragMoveEvent).
|
\value DragMove A drag and drop operation is in progress (QDragMoveEvent).
|
||||||
@ -116,7 +116,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
\value DynamicPropertyChange A dynamic property was added, changed, or removed from the object.
|
\value DynamicPropertyChange A dynamic property was added, changed, or removed from the object.
|
||||||
\value EnabledChange Widget's enabled state has changed.
|
\value EnabledChange Widget's enabled state has changed.
|
||||||
\value Enter Mouse enters widget's boundaries (QEnterEvent).
|
\value Enter Mouse enters widget's boundaries (QEnterEvent).
|
||||||
\value EnterEditFocus An editor widget gains focus for editing. QT_KEYPAD_NAVIGATION must be defined.
|
\value EnterEditFocus An editor widget gains focus for editing. \c QT_KEYPAD_NAVIGATION must be defined.
|
||||||
\value EnterWhatsThisMode Send to toplevel widgets when the application enters "What's This?" mode.
|
\value EnterWhatsThisMode Send to toplevel widgets when the application enters "What's This?" mode.
|
||||||
\value Expose Sent to a window when its on-screen contents are invalidated and need to be flushed from the backing store.
|
\value Expose Sent to a window when its on-screen contents are invalidated and need to be flushed from the backing store.
|
||||||
\value FileOpen File open request (QFileOpenEvent).
|
\value FileOpen File open request (QFileOpenEvent).
|
||||||
@ -177,7 +177,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
\value MouseTrackingChange The mouse tracking state has changed.
|
\value MouseTrackingChange The mouse tracking state has changed.
|
||||||
\value Move Widget's position changed (QMoveEvent).
|
\value Move Widget's position changed (QMoveEvent).
|
||||||
\value NativeGesture The system has detected a gesture (QNativeGestureEvent).
|
\value NativeGesture The system has detected a gesture (QNativeGestureEvent).
|
||||||
\value OrientationChange The screens orientation has changes (QScreenOrientationChangeEvent)
|
\value OrientationChange The screens orientation has changes (QScreenOrientationChangeEvent).
|
||||||
\value Paint Screen update necessary (QPaintEvent).
|
\value Paint Screen update necessary (QPaintEvent).
|
||||||
\value PaletteChange Palette of the widget changed.
|
\value PaletteChange Palette of the widget changed.
|
||||||
\value ParentAboutToChange The widget parent is about to change.
|
\value ParentAboutToChange The widget parent is about to change.
|
||||||
|
@ -96,7 +96,7 @@ static jclass loadClassDotEnc(const QString &classDotEnc, JNIEnv *env)
|
|||||||
if (clazz != 0 || isCached)
|
if (clazz != 0 || isCached)
|
||||||
return clazz;
|
return clazz;
|
||||||
|
|
||||||
QJNIObjectPrivate classLoader = QtAndroidPrivate::classLoader();
|
QJNIObjectPrivate classLoader(QtAndroidPrivate::classLoader());
|
||||||
if (!classLoader.isValid())
|
if (!classLoader.isValid())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -2239,6 +2239,13 @@ bool QJNIObjectPrivate::isValid() const
|
|||||||
return d->m_jobject;
|
return d->m_jobject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QJNIObjectPrivate QJNIObjectPrivate::fromLocalRef(jobject lref)
|
||||||
|
{
|
||||||
|
QJNIObjectPrivate o(lref);
|
||||||
|
QJNIEnvironmentPrivate()->DeleteLocalRef(lref);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
bool QJNIObjectPrivate::isSameObject(jobject obj) const
|
bool QJNIObjectPrivate::isSameObject(jobject obj) const
|
||||||
{
|
{
|
||||||
QJNIEnvironmentPrivate env;
|
QJNIEnvironmentPrivate env;
|
||||||
|
@ -84,7 +84,10 @@ public:
|
|||||||
QJNIObjectPrivate(const char *className, const char *sig, ...);
|
QJNIObjectPrivate(const char *className, const char *sig, ...);
|
||||||
explicit QJNIObjectPrivate(jclass clazz);
|
explicit QJNIObjectPrivate(jclass clazz);
|
||||||
QJNIObjectPrivate(jclass clazz, const char *sig, ...);
|
QJNIObjectPrivate(jclass clazz, const char *sig, ...);
|
||||||
QJNIObjectPrivate(jobject obj);
|
// In most cases you should never call this function with a local ref. unless you intend
|
||||||
|
// to manage the local ref. yourself.
|
||||||
|
// NOTE: see fromLocalRef() for converting a local ref. to QJNIObjectPrivate.
|
||||||
|
explicit QJNIObjectPrivate(jobject globalRef);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T callMethod(const char *methodName,
|
T callMethod(const char *methodName,
|
||||||
@ -183,6 +186,9 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This function takes ownership of the jobject and releases the local ref. before returning.
|
||||||
|
static QJNIObjectPrivate fromLocalRef(jobject lref);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class QAndroidJniObject;
|
friend class QAndroidJniObject;
|
||||||
|
|
||||||
|
@ -201,6 +201,8 @@ struct DefinedTypesFilter {
|
|||||||
\enum QMetaType::Type
|
\enum QMetaType::Type
|
||||||
|
|
||||||
These are the built-in types supported by QMetaType:
|
These are the built-in types supported by QMetaType:
|
||||||
|
Read doc on QChar
|
||||||
|
Read doc on \l QChar
|
||||||
|
|
||||||
\value Void \c void
|
\value Void \c void
|
||||||
\value Bool \c bool
|
\value Bool \c bool
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
\li When using QPointer on a QWidget (or a subclass of QWidget), previously
|
\li When using QPointer on a QWidget (or a subclass of QWidget), previously
|
||||||
the QPointer would be cleared by the QWidget destructor. Now, the QPointer
|
the QPointer would be cleared by the QWidget destructor. Now, the QPointer
|
||||||
is cleared by the QObject destructor (since this is when QWeakPointers are
|
is cleared by the QObject destructor (since this is when QWeakPointer objects are
|
||||||
cleared). Any QPointers tracking a widget will \b NOT be cleared before the
|
cleared). Any QPointers tracking a widget will \b NOT be cleared before the
|
||||||
QWidget destructor destroys the children for the widget being tracked.
|
QWidget destructor destroys the children for the widget being tracked.
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
its work. This is the traditional way of implementing heavy work
|
its work. This is the traditional way of implementing heavy work
|
||||||
in GUI applications, but as multithreading is nowadays becoming available on
|
in GUI applications, but as multithreading is nowadays becoming available on
|
||||||
more and more platforms, we expect that zero-millisecond
|
more and more platforms, we expect that zero-millisecond
|
||||||
QTimers will gradually be replaced by \l{QThread}s.
|
QTimer objects will gradually be replaced by \l{QThread}s.
|
||||||
|
|
||||||
\section1 Accuracy and Timer Resolution
|
\section1 Accuracy and Timer Resolution
|
||||||
|
|
||||||
|
@ -1410,13 +1410,13 @@ QVariant::QVariant(const char *val)
|
|||||||
/*!
|
/*!
|
||||||
\fn QVariant::QVariant(const QMap<QString, QVariant> &val)
|
\fn QVariant::QVariant(const QMap<QString, QVariant> &val)
|
||||||
|
|
||||||
Constructs a new variant with a map of QVariants, \a val.
|
Constructs a new variant with a map of \l {QVariant}s, \a val.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QVariant::QVariant(const QHash<QString, QVariant> &val)
|
\fn QVariant::QVariant(const QHash<QString, QVariant> &val)
|
||||||
|
|
||||||
Constructs a new variant with a hash of QVariants, \a val.
|
Constructs a new variant with a hash of \l {QVariant}s, \a val.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -3610,7 +3610,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
|
|||||||
Q_OBJECT macro.
|
Q_OBJECT macro.
|
||||||
|
|
||||||
If the QVariant contains a sequential container and \c{T} is QVariantList, the
|
If the QVariant contains a sequential container and \c{T} is QVariantList, the
|
||||||
elements of the container will be converted into QVariants and returned as a QVariantList.
|
elements of the container will be converted into \l {QVariant}s and returned as a QVariantList.
|
||||||
|
|
||||||
\snippet code/src_corelib_kernel_qvariant.cpp 9
|
\snippet code/src_corelib_kernel_qvariant.cpp 9
|
||||||
|
|
||||||
|
@ -420,7 +420,7 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin plugin)
|
|||||||
/*!
|
/*!
|
||||||
Returns a list of static plugin instances (root components) held
|
Returns a list of static plugin instances (root components) held
|
||||||
by the plugin loader.
|
by the plugin loader.
|
||||||
\sa staticPlugins()
|
\sa staticPlugin()
|
||||||
*/
|
*/
|
||||||
QObjectList QPluginLoader::staticInstances()
|
QObjectList QPluginLoader::staticInstances()
|
||||||
{
|
{
|
||||||
|
@ -389,14 +389,13 @@ Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
|
|||||||
|
|
||||||
int QThread::idealThreadCount() Q_DECL_NOTHROW
|
int QThread::idealThreadCount() Q_DECL_NOTHROW
|
||||||
{
|
{
|
||||||
int cores = -1;
|
int cores = 1;
|
||||||
|
|
||||||
#if defined(Q_OS_HPUX)
|
#if defined(Q_OS_HPUX)
|
||||||
// HP-UX
|
// HP-UX
|
||||||
struct pst_dynamic psd;
|
struct pst_dynamic psd;
|
||||||
if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) == -1) {
|
if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) == -1) {
|
||||||
perror("pstat_getdynamic");
|
perror("pstat_getdynamic");
|
||||||
cores = -1;
|
|
||||||
} else {
|
} else {
|
||||||
cores = (int)psd.psd_proc_cnt;
|
cores = (int)psd.psd_proc_cnt;
|
||||||
}
|
}
|
||||||
@ -408,7 +407,6 @@ int QThread::idealThreadCount() Q_DECL_NOTHROW
|
|||||||
mib[1] = HW_NCPU;
|
mib[1] = HW_NCPU;
|
||||||
if (sysctl(mib, 2, &cores, &len, NULL, 0) != 0) {
|
if (sysctl(mib, 2, &cores, &len, NULL, 0) != 0) {
|
||||||
perror("sysctl");
|
perror("sysctl");
|
||||||
cores = -1;
|
|
||||||
}
|
}
|
||||||
#elif defined(Q_OS_IRIX)
|
#elif defined(Q_OS_IRIX)
|
||||||
// IRIX
|
// IRIX
|
||||||
@ -443,9 +441,9 @@ int QThread::idealThreadCount() Q_DECL_NOTHROW
|
|||||||
#else
|
#else
|
||||||
// the rest: Linux, Solaris, AIX, Tru64
|
// the rest: Linux, Solaris, AIX, Tru64
|
||||||
cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
#endif
|
|
||||||
if (cores == -1)
|
if (cores == -1)
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
return cores;
|
return cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,9 +52,12 @@
|
|||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#ifdef Q_OS_ANDROID
|
||||||
// Android lacks pthread_condattr_setclock, but it does have a nice function
|
// pthread_condattr_setclock is available only since Android 5.0. On older versions, there's
|
||||||
// for relative waits. Use weakref so we can determine at runtime whether it is
|
// a private function for relative waits (hidden in 5.0).
|
||||||
// present.
|
// Use weakref so we can determine at runtime whether each of them is present.
|
||||||
|
static int local_condattr_setclock(pthread_condattr_t*, clockid_t)
|
||||||
|
__attribute__((weakref("pthread_condattr_setclock")));
|
||||||
|
|
||||||
static int local_cond_timedwait_relative(pthread_cond_t*, pthread_mutex_t *, const timespec *)
|
static int local_cond_timedwait_relative(pthread_cond_t*, pthread_mutex_t *, const timespec *)
|
||||||
__attribute__((weakref("__pthread_cond_timedwait_relative")));
|
__attribute__((weakref("__pthread_cond_timedwait_relative")));
|
||||||
#endif
|
#endif
|
||||||
@ -70,9 +73,14 @@ void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where)
|
|||||||
pthread_condattr_t condattr;
|
pthread_condattr_t condattr;
|
||||||
|
|
||||||
pthread_condattr_init(&condattr);
|
pthread_condattr_init(&condattr);
|
||||||
#if !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID) && !defined(Q_OS_HAIKU) && (_POSIX_MONOTONIC_CLOCK-0 >= 0)
|
#if (_POSIX_MONOTONIC_CLOCK-0 >= 0)
|
||||||
|
#if defined(Q_OS_ANDROID)
|
||||||
|
if (local_condattr_setclock && QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
|
||||||
|
local_condattr_setclock(&condattr, CLOCK_MONOTONIC);
|
||||||
|
#elif !defined(Q_OS_MAC) && !defined(Q_OS_HAIKU)
|
||||||
if (QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
|
if (QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
|
||||||
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
|
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
report_error(pthread_cond_init(cond, &condattr), where, "cv init");
|
report_error(pthread_cond_init(cond, &condattr), where, "cv init");
|
||||||
pthread_condattr_destroy(&condattr);
|
pthread_condattr_destroy(&condattr);
|
||||||
@ -108,7 +116,7 @@ public:
|
|||||||
{
|
{
|
||||||
timespec ti;
|
timespec ti;
|
||||||
#ifdef Q_OS_ANDROID
|
#ifdef Q_OS_ANDROID
|
||||||
if (Q_LIKELY(local_cond_timedwait_relative)) {
|
if (local_cond_timedwait_relative) {
|
||||||
ti.tv_sec = time / 1000;
|
ti.tv_sec = time / 1000;
|
||||||
ti.tv_nsec = time % 1000 * Q_UINT64_C(1000) * 1000;
|
ti.tv_nsec = time % 1000 * Q_UINT64_C(1000) * 1000;
|
||||||
return local_cond_timedwait_relative(&cond, &mutex, &ti);
|
return local_cond_timedwait_relative(&cond, &mutex, &ti);
|
||||||
|
@ -786,7 +786,7 @@ static inline char qToLower(char c)
|
|||||||
occurrences of a particular value with another, use one of the
|
occurrences of a particular value with another, use one of the
|
||||||
two-parameter replace() overloads.
|
two-parameter replace() overloads.
|
||||||
|
|
||||||
{QByteArray}s can be compared using overloaded operators such as
|
\l{QByteArray}s can be compared using overloaded operators such as
|
||||||
operator<(), operator<=(), operator==(), operator>=(), and so on.
|
operator<(), operator<=(), operator==(), operator>=(), and so on.
|
||||||
The comparison is based exclusively on the numeric values
|
The comparison is based exclusively on the numeric values
|
||||||
of the characters and is very fast, but is not what a human would
|
of the characters and is very fast, but is not what a human would
|
||||||
@ -831,7 +831,7 @@ static inline char qToLower(char c)
|
|||||||
lastIndexOf(), operator<(), operator<=(), operator>(),
|
lastIndexOf(), operator<(), operator<=(), operator>(),
|
||||||
operator>=(), toLower() and toUpper().
|
operator>=(), toLower() and toUpper().
|
||||||
|
|
||||||
This issue does not apply to {QString}s since they represent
|
This issue does not apply to \l{QString}s since they represent
|
||||||
characters using Unicode.
|
characters using Unicode.
|
||||||
|
|
||||||
\sa QString, QBitArray
|
\sa QString, QBitArray
|
||||||
|
@ -625,6 +625,15 @@ QTimeZonePrivate *QUtcTimeZonePrivate::clone()
|
|||||||
return new QUtcTimeZonePrivate(*this);
|
return new QUtcTimeZonePrivate(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QTimeZonePrivate::Data QUtcTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
|
||||||
|
{
|
||||||
|
Data d = invalidData();
|
||||||
|
d.abbreviation = m_abbreviation;
|
||||||
|
d.atMSecsSinceEpoch = forMSecsSinceEpoch;
|
||||||
|
d.offsetFromUtc = m_offsetFromUtc;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
void QUtcTimeZonePrivate::init(const QByteArray &zoneId)
|
void QUtcTimeZonePrivate::init(const QByteArray &zoneId)
|
||||||
{
|
{
|
||||||
m_id = zoneId;
|
m_id = zoneId;
|
||||||
|
@ -186,6 +186,8 @@ public:
|
|||||||
|
|
||||||
QTimeZonePrivate *clone() Q_DECL_OVERRIDE;
|
QTimeZonePrivate *clone() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
Data data(qint64 forMSecsSinceEpoch) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
QLocale::Country country() const Q_DECL_OVERRIDE;
|
QLocale::Country country() const Q_DECL_OVERRIDE;
|
||||||
QString comment() const Q_DECL_OVERRIDE;
|
QString comment() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
@ -154,7 +154,9 @@ public:
|
|||||||
const const_iterator ce = this->cend(), cit = std::find(this->cbegin(), ce, t);
|
const const_iterator ce = this->cend(), cit = std::find(this->cbegin(), ce, t);
|
||||||
if (cit == ce)
|
if (cit == ce)
|
||||||
return 0;
|
return 0;
|
||||||
const iterator e = end(), it = std::remove(c2m(cit), e, t);
|
// next operation detaches, so ce, cit may become invalidated:
|
||||||
|
const int firstFoundIdx = std::distance(this->cbegin(), cit);
|
||||||
|
const iterator e = end(), it = std::remove(begin() + firstFoundIdx, e, t);
|
||||||
const int result = std::distance(it, e);
|
const int result = std::distance(it, e);
|
||||||
erase(it, e);
|
erase(it, e);
|
||||||
return result;
|
return result;
|
||||||
|
@ -314,12 +314,20 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int
|
|||||||
}
|
}
|
||||||
} else if (comp == BMP_BITFIELDS && (nbits == 16 || nbits == 32)) {
|
} else if (comp == BMP_BITFIELDS && (nbits == 16 || nbits == 32)) {
|
||||||
red_shift = calc_shift(red_mask);
|
red_shift = calc_shift(red_mask);
|
||||||
|
if (((red_mask >> red_shift) + 1) == 0)
|
||||||
|
return false;
|
||||||
red_scale = 256 / ((red_mask >> red_shift) + 1);
|
red_scale = 256 / ((red_mask >> red_shift) + 1);
|
||||||
green_shift = calc_shift(green_mask);
|
green_shift = calc_shift(green_mask);
|
||||||
|
if (((green_mask >> green_shift) + 1) == 0)
|
||||||
|
return false;
|
||||||
green_scale = 256 / ((green_mask >> green_shift) + 1);
|
green_scale = 256 / ((green_mask >> green_shift) + 1);
|
||||||
blue_shift = calc_shift(blue_mask);
|
blue_shift = calc_shift(blue_mask);
|
||||||
|
if (((blue_mask >> blue_shift) + 1) == 0)
|
||||||
|
return false;
|
||||||
blue_scale = 256 / ((blue_mask >> blue_shift) + 1);
|
blue_scale = 256 / ((blue_mask >> blue_shift) + 1);
|
||||||
alpha_shift = calc_shift(alpha_mask);
|
alpha_shift = calc_shift(alpha_mask);
|
||||||
|
if (((alpha_mask >> alpha_shift) + 1) == 0)
|
||||||
|
return false;
|
||||||
alpha_scale = 256 / ((alpha_mask >> alpha_shift) + 1);
|
alpha_scale = 256 / ((alpha_mask >> alpha_shift) + 1);
|
||||||
} else if (comp == BMP_RGB && (nbits == 24 || nbits == 32)) {
|
} else if (comp == BMP_RGB && (nbits == 24 || nbits == 32)) {
|
||||||
blue_mask = 0x000000ff;
|
blue_mask = 0x000000ff;
|
||||||
|
@ -1675,15 +1675,13 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo
|
|||||||
if (e->globalPos != QGuiApplicationPrivate::lastCursorPosition && (stateChange != Qt::NoButton)) {
|
if (e->globalPos != QGuiApplicationPrivate::lastCursorPosition && (stateChange != Qt::NoButton)) {
|
||||||
// A mouse event should not change both position and buttons at the same time. Instead we
|
// A mouse event should not change both position and buttons at the same time. Instead we
|
||||||
// should first send a move event followed by a button changed event. Since this is not the case
|
// should first send a move event followed by a button changed event. Since this is not the case
|
||||||
// with the current event, we fake a move-only event that we recurse and process first. This
|
// with the current event, we split it in two.
|
||||||
// will update the global mouse position and cause the second event to be a button only event.
|
QWindowSystemInterfacePrivate::MouseEvent *mouseButtonEvent = new QWindowSystemInterfacePrivate::MouseEvent(
|
||||||
QWindowSystemInterfacePrivate::MouseEvent moveEvent(e->window.data(),
|
e->window.data(), e->timestamp, e->type, e->localPos, e->globalPos, e->buttons, e->modifiers);
|
||||||
e->timestamp, e->type, e->localPos, e->globalPos, buttons, e->modifiers, e->source);
|
|
||||||
if (e->flags & QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic)
|
if (e->flags & QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic)
|
||||||
moveEvent.flags |= QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic;
|
mouseButtonEvent->flags |= QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic;
|
||||||
processMouseEvent(&moveEvent);
|
QWindowSystemInterfacePrivate::windowSystemEventQueue.prepend(mouseButtonEvent);
|
||||||
Q_ASSERT(e->globalPos == QGuiApplicationPrivate::lastCursorPosition);
|
stateChange = Qt::NoButton;
|
||||||
// continue with processing mouse button change event
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QWindow *window = e->window.data();
|
QWindow *window = e->window.data();
|
||||||
|
@ -840,6 +840,8 @@ static QOpenGLTexture::PixelType pixelTypeCompatibleWithInternalFormat(QOpenGLTe
|
|||||||
return QOpenGLTexture::UInt8;
|
return QOpenGLTexture::UInt8;
|
||||||
|
|
||||||
case QOpenGLTexture::DepthFormat:
|
case QOpenGLTexture::DepthFormat:
|
||||||
|
return QOpenGLTexture::UInt32;
|
||||||
|
|
||||||
case QOpenGLTexture::AlphaFormat:
|
case QOpenGLTexture::AlphaFormat:
|
||||||
case QOpenGLTexture::RGBFormat:
|
case QOpenGLTexture::RGBFormat:
|
||||||
case QOpenGLTexture::RGBAFormat:
|
case QOpenGLTexture::RGBAFormat:
|
||||||
@ -1859,7 +1861,7 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target
|
|||||||
\value SRGB_Alpha_DXT5 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
|
\value SRGB_Alpha_DXT5 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
|
||||||
\value SRGB_BP_UNorm Equivalent to GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
|
\value SRGB_BP_UNorm Equivalent to GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
|
||||||
|
|
||||||
\value DepthFormat Equivalent to GL_DEPTH_COMPONENT (OpenGL ES 2 only and when OES_depth_texture is present)
|
\value DepthFormat Equivalent to GL_DEPTH_COMPONENT (only OpenGL ES 3 or ES 2 with OES_depth_texture)
|
||||||
\value AlphaFormat Equivalent to GL_ALPHA (OpenGL ES 2 only)
|
\value AlphaFormat Equivalent to GL_ALPHA (OpenGL ES 2 only)
|
||||||
\value RGBFormat Equivalent to GL_RGB (OpenGL ES 2 only)
|
\value RGBFormat Equivalent to GL_RGB (OpenGL ES 2 only)
|
||||||
\value RGBAFormat Equivalent to GL_RGBA (OpenGL ES 2 only)
|
\value RGBAFormat Equivalent to GL_RGBA (OpenGL ES 2 only)
|
||||||
|
@ -65,8 +65,6 @@ struct StrokeHandler;
|
|||||||
QDebug Q_GUI_EXPORT &operator<<(QDebug &, const QVectorPath &path);
|
QDebug Q_GUI_EXPORT &operator<<(QDebug &, const QVectorPath &path);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class QPixmapFilter;
|
|
||||||
|
|
||||||
class Q_GUI_EXPORT QPaintEngineEx : public QPaintEngine
|
class Q_GUI_EXPORT QPaintEngineEx : public QPaintEngine
|
||||||
{
|
{
|
||||||
Q_DECLARE_PRIVATE(QPaintEngineEx)
|
Q_DECLARE_PRIVATE(QPaintEngineEx)
|
||||||
@ -140,13 +138,6 @@ public:
|
|||||||
virtual void beginNativePainting() {}
|
virtual void beginNativePainting() {}
|
||||||
virtual void endNativePainting() {}
|
virtual void endNativePainting() {}
|
||||||
|
|
||||||
// Return a pixmap filter of "type" that can render the parameters
|
|
||||||
// in "prototype". The returned filter is owned by the engine and
|
|
||||||
// will be destroyed when the engine is destroyed. The "prototype"
|
|
||||||
// allows the engine to pick different filters based on the parameters
|
|
||||||
// that will be requested, and not just the "type".
|
|
||||||
virtual QPixmapFilter *pixmapFilter(int /*type*/, const QPixmapFilter * /*prototype*/) { return 0; }
|
|
||||||
|
|
||||||
// These flags are needed in the implementation of paint buffers.
|
// These flags are needed in the implementation of paint buffers.
|
||||||
enum Flags
|
enum Flags
|
||||||
{
|
{
|
||||||
|
@ -5536,6 +5536,11 @@ void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphRun)
|
|||||||
{
|
{
|
||||||
Q_D(QPainter);
|
Q_D(QPainter);
|
||||||
|
|
||||||
|
if (!d->engine) {
|
||||||
|
qWarning("QPainter::drawGlyphRun: Painter not active");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
QRawFont font = glyphRun.rawFont();
|
QRawFont font = glyphRun.rawFont();
|
||||||
if (!font.isValid())
|
if (!font.isValid())
|
||||||
return;
|
return;
|
||||||
|
@ -1051,7 +1051,7 @@ void QPdfEngine::drawPath (const QPainterPath &p)
|
|||||||
if (!d->hasPen && !d->hasBrush)
|
if (!d->hasPen && !d->hasBrush)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (d->simplePen && d->opacity == 1.0) {
|
if (d->simplePen) {
|
||||||
// draw strokes natively in this case for better output
|
// draw strokes natively in this case for better output
|
||||||
*d->currentPage << QPdf::generatePath(p, QTransform(), d->hasBrush ? QPdf::FillAndStrokePath : QPdf::StrokePath);
|
*d->currentPage << QPdf::generatePath(p, QTransform(), d->hasBrush ? QPdf::FillAndStrokePath : QPdf::StrokePath);
|
||||||
} else {
|
} else {
|
||||||
@ -1198,7 +1198,7 @@ void QPdfEngine::updateState(const QPaintEngineState &state)
|
|||||||
d->stroker.setPen(d->pen, state.renderHints());
|
d->stroker.setPen(d->pen, state.renderHints());
|
||||||
QBrush penBrush = d->pen.brush();
|
QBrush penBrush = d->pen.brush();
|
||||||
bool oldSimple = d->simplePen;
|
bool oldSimple = d->simplePen;
|
||||||
d->simplePen = (d->hasPen && (penBrush.style() == Qt::SolidPattern) && penBrush.isOpaque());
|
d->simplePen = (d->hasPen && (penBrush.style() == Qt::SolidPattern) && penBrush.isOpaque() && d->opacity == 1.0);
|
||||||
if (oldSimple != d->simplePen)
|
if (oldSimple != d->simplePen)
|
||||||
flags |= DirtyTransform;
|
flags |= DirtyTransform;
|
||||||
} else if (flags & DirtyHints) {
|
} else if (flags & DirtyHints) {
|
||||||
@ -1214,8 +1214,13 @@ void QPdfEngine::updateState(const QPaintEngineState &state)
|
|||||||
d->brushOrigin = state.brushOrigin();
|
d->brushOrigin = state.brushOrigin();
|
||||||
flags |= DirtyBrush;
|
flags |= DirtyBrush;
|
||||||
}
|
}
|
||||||
if (flags & DirtyOpacity)
|
if (flags & DirtyOpacity) {
|
||||||
d->opacity = state.opacity();
|
d->opacity = state.opacity();
|
||||||
|
if (d->simplePen && d->opacity != 1.0) {
|
||||||
|
d->simplePen = false;
|
||||||
|
flags |= DirtyTransform;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool ce = d->clipEnabled;
|
bool ce = d->clipEnabled;
|
||||||
if (flags & DirtyClipPath) {
|
if (flags & DirtyClipPath) {
|
||||||
|
@ -1696,7 +1696,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(glyph_t glyph, const QTransform &matr
|
|||||||
|
|
||||||
glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixelPosition, const QTransform &matrix, QFontEngine::GlyphFormat format)
|
glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixelPosition, const QTransform &matrix, QFontEngine::GlyphFormat format)
|
||||||
{
|
{
|
||||||
Glyph *g = loadGlyphFor(glyph, subPixelPosition, format, matrix);
|
Glyph *g = loadGlyphFor(glyph, subPixelPosition, format, matrix, true);
|
||||||
|
|
||||||
glyph_metrics_t overall;
|
glyph_metrics_t overall;
|
||||||
if (g) {
|
if (g) {
|
||||||
@ -1839,7 +1839,8 @@ void QFontEngineFT::unlockAlphaMapForGlyph()
|
|||||||
QFontEngineFT::Glyph *QFontEngineFT::loadGlyphFor(glyph_t g,
|
QFontEngineFT::Glyph *QFontEngineFT::loadGlyphFor(glyph_t g,
|
||||||
QFixed subPixelPosition,
|
QFixed subPixelPosition,
|
||||||
GlyphFormat format,
|
GlyphFormat format,
|
||||||
const QTransform &t)
|
const QTransform &t,
|
||||||
|
bool fetchBoundingBox)
|
||||||
{
|
{
|
||||||
FT_Face face = 0;
|
FT_Face face = 0;
|
||||||
QGlyphSet *glyphSet = 0;
|
QGlyphSet *glyphSet = 0;
|
||||||
@ -1852,7 +1853,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyphFor(glyph_t g,
|
|||||||
Q_ASSERT(glyphSet != 0);
|
Q_ASSERT(glyphSet != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (glyphSet != 0 && glyphSet->outline_drawing)
|
if (glyphSet != 0 && glyphSet->outline_drawing && !fetchBoundingBox)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Glyph *glyph = glyphSet != 0 ? glyphSet->getGlyph(g, subPixelPosition) : 0;
|
Glyph *glyph = glyphSet != 0 ? glyphSet->getGlyph(g, subPixelPosition) : 0;
|
||||||
|
@ -266,7 +266,7 @@ private:
|
|||||||
inline Glyph *loadGlyph(uint glyph, QFixed subPixelPosition, GlyphFormat format = Format_None, bool fetchMetricsOnly = false) const
|
inline Glyph *loadGlyph(uint glyph, QFixed subPixelPosition, GlyphFormat format = Format_None, bool fetchMetricsOnly = false) const
|
||||||
{ return loadGlyph(cacheEnabled ? &defaultGlyphSet : 0, glyph, subPixelPosition, format, fetchMetricsOnly); }
|
{ return loadGlyph(cacheEnabled ? &defaultGlyphSet : 0, glyph, subPixelPosition, format, fetchMetricsOnly); }
|
||||||
Glyph *loadGlyph(QGlyphSet *set, uint glyph, QFixed subPixelPosition, GlyphFormat = Format_None, bool fetchMetricsOnly = false) const;
|
Glyph *loadGlyph(QGlyphSet *set, uint glyph, QFixed subPixelPosition, GlyphFormat = Format_None, bool fetchMetricsOnly = false) const;
|
||||||
Glyph *loadGlyphFor(glyph_t g, QFixed subPixelPosition, GlyphFormat format, const QTransform &t);
|
Glyph *loadGlyphFor(glyph_t g, QFixed subPixelPosition, GlyphFormat format, const QTransform &t, bool fetchBoundingBox = false);
|
||||||
|
|
||||||
QGlyphSet *loadTransformedGlyphSet(const QTransform &matrix);
|
QGlyphSet *loadTransformedGlyphSet(const QTransform &matrix);
|
||||||
|
|
||||||
|
@ -235,19 +235,11 @@ void QLocalSocket::connectToServer(OpenMode openMode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create the socket
|
// create the socket
|
||||||
if (-1 == (d->connectingSocket = qt_safe_socket(PF_UNIX, SOCK_STREAM, 0))) {
|
if (-1 == (d->connectingSocket = qt_safe_socket(PF_UNIX, SOCK_STREAM, 0, O_NONBLOCK))) {
|
||||||
d->errorOccurred(UnsupportedSocketOperationError,
|
d->errorOccurred(UnsupportedSocketOperationError,
|
||||||
QLatin1String("QLocalSocket::connectToServer"));
|
QLatin1String("QLocalSocket::connectToServer"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// set non blocking so we can try to connect and it won't wait
|
|
||||||
int flags = fcntl(d->connectingSocket, F_GETFL, 0);
|
|
||||||
if (-1 == flags
|
|
||||||
|| -1 == (fcntl(d->connectingSocket, F_SETFL, flags | O_NONBLOCK))) {
|
|
||||||
d->errorOccurred(UnknownSocketError,
|
|
||||||
QLatin1String("QLocalSocket::connectToServer"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// _q_connectToSocket does the actual connecting
|
// _q_connectToSocket does the actual connecting
|
||||||
d->connectingName = d->serverName;
|
d->connectingName = d->serverName;
|
||||||
|
@ -357,14 +357,6 @@ bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAb
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the socket nonblocking.
|
|
||||||
if (!setOption(NonBlockingSocketOption, 1)) {
|
|
||||||
d->setError(QAbstractSocket::UnsupportedSocketOperationError,
|
|
||||||
QNativeSocketEnginePrivate::NonBlockingInitFailedErrorString);
|
|
||||||
close();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the broadcasting flag if it's a UDP socket.
|
// Set the broadcasting flag if it's a UDP socket.
|
||||||
if (socketType == QAbstractSocket::UdpSocket
|
if (socketType == QAbstractSocket::UdpSocket
|
||||||
&& !setOption(BroadcastSocketOption, 1)) {
|
&& !setOption(BroadcastSocketOption, 1)) {
|
||||||
|
@ -138,10 +138,10 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
|
|||||||
int protocol = (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) ? AF_INET6 : AF_INET;
|
int protocol = (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) ? AF_INET6 : AF_INET;
|
||||||
int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM;
|
int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM;
|
||||||
|
|
||||||
int socket = qt_safe_socket(protocol, type, 0);
|
int socket = qt_safe_socket(protocol, type, 0, O_NONBLOCK);
|
||||||
if (socket < 0 && socketProtocol == QAbstractSocket::AnyIPProtocol && errno == EAFNOSUPPORT) {
|
if (socket < 0 && socketProtocol == QAbstractSocket::AnyIPProtocol && errno == EAFNOSUPPORT) {
|
||||||
protocol = AF_INET;
|
protocol = AF_INET;
|
||||||
socket = qt_safe_socket(protocol, type, 0);
|
socket = qt_safe_socket(protocol, type, 0, O_NONBLOCK);
|
||||||
socketProtocol = QAbstractSocket::IPv4Protocol;
|
socketProtocol = QAbstractSocket::IPv4Protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,8 +383,15 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
socketDescriptor = socket;
|
socketDescriptor = socket;
|
||||||
return true;
|
|
||||||
|
|
||||||
|
// Make the socket nonblocking.
|
||||||
|
if (!setOption(QAbstractSocketEngine::NonBlockingSocketOption, 1)) {
|
||||||
|
setError(QAbstractSocket::UnsupportedSocketOperationError, NonBlockingInitFailedErrorString);
|
||||||
|
q_func()->close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \internal
|
/*! \internal
|
||||||
|
@ -768,7 +768,7 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
socketDescriptor = qintptr(socket.Detach());
|
socketDescriptor = qintptr(socket.Detach());
|
||||||
return true;
|
break;
|
||||||
}
|
}
|
||||||
case QAbstractSocket::UdpSocket: {
|
case QAbstractSocket::UdpSocket: {
|
||||||
ComPtr<IDatagramSocket> socket;
|
ComPtr<IDatagramSocket> socket;
|
||||||
@ -780,13 +780,21 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
|
|||||||
EventRegistrationToken token;
|
EventRegistrationToken token;
|
||||||
socketDescriptor = qintptr(socket.Detach());
|
socketDescriptor = qintptr(socket.Detach());
|
||||||
udpSocket()->add_MessageReceived(Callback<DatagramReceivedHandler>(this, &QNativeSocketEnginePrivate::handleNewDatagram).Get(), &token);
|
udpSocket()->add_MessageReceived(Callback<DatagramReceivedHandler>(this, &QNativeSocketEnginePrivate::handleNewDatagram).Get(), &token);
|
||||||
return true;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
qWarning("Invalid socket type");
|
qWarning("Invalid socket type");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
// Make the socket nonblocking.
|
||||||
|
if (!setOption(QAbstractSocketEngine::NonBlockingSocketOption, 1)) {
|
||||||
|
setError(QAbstractSocket::UnsupportedSocketOperationError, NonBlockingInitFailedErrorString);
|
||||||
|
q_func()->close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QNativeSocketEnginePrivate::QNativeSocketEnginePrivate()
|
QNativeSocketEnginePrivate::QNativeSocketEnginePrivate()
|
||||||
|
@ -163,7 +163,7 @@ Q_GLOBAL_STATIC(QGLSignalProxy, theSignalProxy)
|
|||||||
QGLSignalProxy *QGLSignalProxy::instance()
|
QGLSignalProxy *QGLSignalProxy::instance()
|
||||||
{
|
{
|
||||||
QGLSignalProxy *proxy = theSignalProxy();
|
QGLSignalProxy *proxy = theSignalProxy();
|
||||||
if (proxy && proxy->thread() != qApp->thread()) {
|
if (proxy && qApp && proxy->thread() != qApp->thread()) {
|
||||||
if (proxy->thread() == QThread::currentThread())
|
if (proxy->thread() == QThread::currentThread())
|
||||||
proxy->moveToThread(qApp->thread());
|
proxy->moveToThread(qApp->thread());
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
a QGLWidget.
|
a QGLWidget.
|
||||||
|
|
||||||
\obsolete
|
\obsolete
|
||||||
\inmodule OpenGL
|
\inmodule QtOpenGL
|
||||||
\ingroup painting-3D
|
\ingroup painting-3D
|
||||||
\ingroup shared
|
\ingroup shared
|
||||||
|
|
||||||
|
@ -295,8 +295,7 @@ QList<AndroidNetworkInfo> AndroidConnectivityManager::getAllNetworkInfo() const
|
|||||||
if (exceptionCheckAndClear(env))
|
if (exceptionCheckAndClear(env))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
list << AndroidNetworkInfo(lref);
|
list << AndroidNetworkInfo(QJNIObjectPrivate::fromLocalRef(lref));
|
||||||
env->DeleteLocalRef(lref);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
|
@ -80,10 +80,10 @@ QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
|
|||||||
this, SLOT(ofonoUnRegistered(QString)));
|
this, SLOT(ofonoUnRegistered(QString)));
|
||||||
|
|
||||||
if (QDBusConnection::systemBus().interface()->isServiceRegistered("org.ofono"))
|
if (QDBusConnection::systemBus().interface()->isServiceRegistered("org.ofono"))
|
||||||
ofonoRegistered();
|
QMetaObject::invokeMethod(this, "ofonoRegistered", Qt::QueuedConnection);
|
||||||
|
|
||||||
if (QDBusConnection::systemBus().interface()->isServiceRegistered(NM_DBUS_SERVICE))
|
if (QDBusConnection::systemBus().interface()->isServiceRegistered(NM_DBUS_SERVICE))
|
||||||
nmRegistered();
|
QMetaObject::invokeMethod(this, "nmRegistered", Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
QNetworkManagerEngine::~QNetworkManagerEngine()
|
QNetworkManagerEngine::~QNetworkManagerEngine()
|
||||||
|
@ -438,7 +438,7 @@ static QString strippedText(QString s)
|
|||||||
- (void)panelSelectionDidChange:(id)sender
|
- (void)panelSelectionDidChange:(id)sender
|
||||||
{
|
{
|
||||||
Q_UNUSED(sender);
|
Q_UNUSED(sender);
|
||||||
if (mHelper) {
|
if (mHelper && [mSavePanel isVisible]) {
|
||||||
QString selection = QCFString::toQString([[mSavePanel URL] path]);
|
QString selection = QCFString::toQString([[mSavePanel URL] path]);
|
||||||
if (selection != mCurrentSelection) {
|
if (selection != mCurrentSelection) {
|
||||||
*mCurrentSelection = selection;
|
*mCurrentSelection = selection;
|
||||||
|
@ -68,8 +68,6 @@ enum {
|
|||||||
D2DDebugFillRectTag,
|
D2DDebugFillRectTag,
|
||||||
D2DDebugDrawRectsTag,
|
D2DDebugDrawRectsTag,
|
||||||
D2DDebugDrawRectFsTag,
|
D2DDebugDrawRectFsTag,
|
||||||
D2DDebugDrawLinesTag,
|
|
||||||
D2DDebugDrawLineFsTag,
|
|
||||||
D2DDebugDrawEllipseTag,
|
D2DDebugDrawEllipseTag,
|
||||||
D2DDebugDrawEllipseFTag,
|
D2DDebugDrawEllipseFTag,
|
||||||
D2DDebugDrawImageTag,
|
D2DDebugDrawImageTag,
|
||||||
@ -102,22 +100,28 @@ static inline ID2D1Factory1 *factory()
|
|||||||
return QWindowsDirect2DContext::instance()->d2dFactory();
|
return QWindowsDirect2DContext::instance()->d2dFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline D2D1_MATRIX_3X2_F transformFromLine(const QLineF &line, qreal penWidth)
|
static inline D2D1_MATRIX_3X2_F transformFromLine(const QLineF &line, qreal penWidth, qreal dashOffset)
|
||||||
{
|
{
|
||||||
const qreal halfWidth = penWidth / 2;
|
const qreal halfWidth = penWidth / 2;
|
||||||
const qreal angle = -qDegreesToRadians(line.angle());
|
const qreal angle = -qDegreesToRadians(line.angle());
|
||||||
QTransform transform = QTransform::fromTranslate(line.p1().x() + qSin(angle) * halfWidth,
|
const qreal sinA = qSin(angle);
|
||||||
line.p1().y() - qCos(angle) * halfWidth);
|
const qreal cosA = qCos(angle);
|
||||||
|
QTransform transform = QTransform::fromTranslate(line.p1().x() + dashOffset * cosA + sinA * halfWidth,
|
||||||
|
line.p1().y() + dashOffset * sinA - cosA * halfWidth);
|
||||||
transform.rotateRadians(angle);
|
transform.rotateRadians(angle);
|
||||||
return to_d2d_matrix_3x2_f(transform);
|
return to_d2d_matrix_3x2_f(transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void adjustLine(QPointF *p1, QPointF *p2);
|
||||||
|
static bool isLinePositivelySloped(const QPointF &p1, const QPointF &p2);
|
||||||
|
|
||||||
class Direct2DPathGeometryWriter
|
class Direct2DPathGeometryWriter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Direct2DPathGeometryWriter()
|
Direct2DPathGeometryWriter()
|
||||||
: m_inFigure(false)
|
: m_inFigure(false)
|
||||||
, m_roundCoordinates(false)
|
, m_roundCoordinates(false)
|
||||||
|
, m_adjustPositivelySlopedLines(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -152,6 +156,11 @@ public:
|
|||||||
m_roundCoordinates = enable;
|
m_roundCoordinates = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setPositiveSlopeAdjustmentEnabled(bool enable)
|
||||||
|
{
|
||||||
|
m_adjustPositivelySlopedLines = enable;
|
||||||
|
}
|
||||||
|
|
||||||
bool isInFigure() const
|
bool isInFigure() const
|
||||||
{
|
{
|
||||||
return m_inFigure;
|
return m_inFigure;
|
||||||
@ -164,11 +173,20 @@ public:
|
|||||||
|
|
||||||
m_sink->BeginFigure(adjusted(point), D2D1_FIGURE_BEGIN_FILLED);
|
m_sink->BeginFigure(adjusted(point), D2D1_FIGURE_BEGIN_FILLED);
|
||||||
m_inFigure = true;
|
m_inFigure = true;
|
||||||
|
m_previousPoint = point;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lineTo(const QPointF &point)
|
void lineTo(const QPointF &point)
|
||||||
{
|
{
|
||||||
m_sink->AddLine(adjusted(point));
|
QPointF pt = point;
|
||||||
|
if (m_adjustPositivelySlopedLines && isLinePositivelySloped(m_previousPoint, point)) {
|
||||||
|
moveTo(m_previousPoint - QPointF(0, 1));
|
||||||
|
pt -= QPointF(0, 1);
|
||||||
|
}
|
||||||
|
m_sink->AddLine(adjusted(pt));
|
||||||
|
if (pt != point)
|
||||||
|
moveTo(point);
|
||||||
|
m_previousPoint = point;
|
||||||
}
|
}
|
||||||
|
|
||||||
void curveTo(const QPointF &p1, const QPointF &p2, const QPointF &p3)
|
void curveTo(const QPointF &p1, const QPointF &p2, const QPointF &p3)
|
||||||
@ -180,6 +198,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
m_sink->AddBezier(segment);
|
m_sink->AddBezier(segment);
|
||||||
|
m_previousPoint = p3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void close()
|
void close()
|
||||||
@ -212,6 +231,8 @@ private:
|
|||||||
|
|
||||||
bool m_inFigure;
|
bool m_inFigure;
|
||||||
bool m_roundCoordinates;
|
bool m_roundCoordinates;
|
||||||
|
bool m_adjustPositivelySlopedLines;
|
||||||
|
QPointF m_previousPoint;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct D2DVectorPathCache {
|
struct D2DVectorPathCache {
|
||||||
@ -257,6 +278,7 @@ public:
|
|||||||
ComPtr<ID2D1Brush> brush;
|
ComPtr<ID2D1Brush> brush;
|
||||||
ComPtr<ID2D1StrokeStyle1> strokeStyle;
|
ComPtr<ID2D1StrokeStyle1> strokeStyle;
|
||||||
ComPtr<ID2D1BitmapBrush1> dashBrush;
|
ComPtr<ID2D1BitmapBrush1> dashBrush;
|
||||||
|
int dashLength;
|
||||||
|
|
||||||
inline void reset() {
|
inline void reset() {
|
||||||
emulate = false;
|
emulate = false;
|
||||||
@ -264,6 +286,7 @@ public:
|
|||||||
brush.Reset();
|
brush.Reset();
|
||||||
strokeStyle.Reset();
|
strokeStyle.Reset();
|
||||||
dashBrush.Reset();
|
dashBrush.Reset();
|
||||||
|
dashLength = 0;
|
||||||
}
|
}
|
||||||
} pen;
|
} pen;
|
||||||
|
|
||||||
@ -566,6 +589,7 @@ public:
|
|||||||
D2D1_BITMAP_BRUSH_PROPERTIES1 bitmapBrushProperties = D2D1::BitmapBrushProperties1(
|
D2D1_BITMAP_BRUSH_PROPERTIES1 bitmapBrushProperties = D2D1::BitmapBrushProperties1(
|
||||||
D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_CLAMP, D2D1_INTERPOLATION_MODE_LINEAR);
|
D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_CLAMP, D2D1_INTERPOLATION_MODE_LINEAR);
|
||||||
hr = dc()->CreateBitmapBrush(bitmap.bitmap(), bitmapBrushProperties, &pen.dashBrush);
|
hr = dc()->CreateBitmapBrush(bitmap.bitmap(), bitmapBrushProperties, &pen.dashBrush);
|
||||||
|
pen.dashLength = bitmap.size().width();
|
||||||
} else {
|
} else {
|
||||||
hr = factory()->CreateStrokeStyle(props, NULL, 0, &pen.strokeStyle);
|
hr = factory()->CreateStrokeStyle(props, NULL, 0, &pen.strokeStyle);
|
||||||
}
|
}
|
||||||
@ -795,6 +819,8 @@ public:
|
|||||||
|
|
||||||
writer.setWindingFillEnabled(path.hasWindingFill());
|
writer.setWindingFillEnabled(path.hasWindingFill());
|
||||||
writer.setAliasingEnabled(alias);
|
writer.setAliasingEnabled(alias);
|
||||||
|
writer.setPositiveSlopeAdjustmentEnabled(path.shape() == QVectorPath::LinesHint
|
||||||
|
|| path.shape() == QVectorPath::PolygonHint);
|
||||||
|
|
||||||
const QPainterPath::ElementType *types = path.elements();
|
const QPainterPath::ElementType *types = path.elements();
|
||||||
const int count = path.elementCount();
|
const int count = path.elementCount();
|
||||||
@ -910,6 +936,90 @@ public:
|
|||||||
DWRITE_MEASURING_MODE_GDI_CLASSIC);
|
DWRITE_MEASURING_MODE_GDI_CLASSIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void stroke(const QVectorPath &path)
|
||||||
|
{
|
||||||
|
Q_Q(QWindowsDirect2DPaintEngine);
|
||||||
|
|
||||||
|
// Default path (no optimization)
|
||||||
|
if (!(path.shape() == QVectorPath::LinesHint || path.shape() == QVectorPath::PolygonHint)
|
||||||
|
|| !pen.dashBrush || q->state()->renderHints.testFlag(QPainter::HighQualityAntialiasing)) {
|
||||||
|
ComPtr<ID2D1Geometry> geometry = vectorPathToID2D1PathGeometry(path);
|
||||||
|
if (!geometry) {
|
||||||
|
qWarning("%s: Could not convert path to d2d geometry", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dc()->DrawGeometry(geometry.Get(), pen.brush.Get(), pen.qpen.widthF(), pen.strokeStyle.Get());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optimized dash line drawing
|
||||||
|
const bool isPolygon = path.shape() == QVectorPath::PolygonHint && path.elementCount() >= 3;
|
||||||
|
const bool implicitClose = isPolygon && (path.hints() & QVectorPath::ImplicitClose);
|
||||||
|
const bool skipJoin = !isPolygon // Non-polygons don't require joins
|
||||||
|
|| (pen.qpen.joinStyle() == Qt::MiterJoin && qFuzzyIsNull(pen.qpen.miterLimit()));
|
||||||
|
const qreal *points = path.points();
|
||||||
|
const int lastElement = path.elementCount() - (implicitClose ? 1 : 2);
|
||||||
|
qreal dashOffset = 0;
|
||||||
|
QPointF jointStart;
|
||||||
|
ID2D1Brush *brush = pen.dashBrush ? pen.dashBrush.Get() : pen.brush.Get();
|
||||||
|
for (int i = 0; i <= lastElement; ++i) {
|
||||||
|
QPointF p1(points[i * 2], points[i * 2 + 1]);
|
||||||
|
QPointF p2 = implicitClose && i == lastElement ? QPointF(points[0], points[1])
|
||||||
|
: QPointF(points[i * 2 + 2], points[i * 2 + 3]);
|
||||||
|
if (!isPolygon) // Advance the count for lines
|
||||||
|
++i;
|
||||||
|
|
||||||
|
// Match raster engine output
|
||||||
|
if (p1 == p2 && pen.qpen.widthF() <= 1.0) {
|
||||||
|
q->fillRect(QRectF(p1, QSizeF(pen.qpen.widthF(), pen.qpen.widthF())), pen.qpen.brush());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!q->antiAliasingEnabled())
|
||||||
|
adjustLine(&p1, &p2);
|
||||||
|
|
||||||
|
q->adjustForAliasing(&p1);
|
||||||
|
q->adjustForAliasing(&p2);
|
||||||
|
|
||||||
|
const QLineF line(p1, p2);
|
||||||
|
const qreal lineLength = line.length();
|
||||||
|
if (pen.dashBrush) {
|
||||||
|
pen.dashBrush->SetTransform(transformFromLine(line, pen.qpen.widthF(), dashOffset));
|
||||||
|
dashOffset = pen.dashLength - fmod(lineLength - dashOffset, pen.dashLength);
|
||||||
|
}
|
||||||
|
dc()->DrawLine(to_d2d_point_2f(p1), to_d2d_point_2f(p2),
|
||||||
|
brush, pen.qpen.widthF(), NULL);
|
||||||
|
|
||||||
|
if (skipJoin)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Patch the join with the original brush
|
||||||
|
const qreal patchSegment = pen.dashBrush ? qBound(0.0, (pen.dashLength - dashOffset) / lineLength, 1.0)
|
||||||
|
: pen.qpen.widthF();
|
||||||
|
if (i > 0) {
|
||||||
|
Direct2DPathGeometryWriter writer;
|
||||||
|
writer.begin();
|
||||||
|
writer.moveTo(jointStart);
|
||||||
|
writer.lineTo(p1);
|
||||||
|
writer.lineTo(line.pointAt(patchSegment));
|
||||||
|
writer.close();
|
||||||
|
dc()->DrawGeometry(writer.geometry().Get(), pen.brush.Get(), pen.qpen.widthF(), pen.strokeStyle.Get());
|
||||||
|
}
|
||||||
|
// Record the start position of the next joint
|
||||||
|
jointStart = line.pointAt(1 - patchSegment);
|
||||||
|
|
||||||
|
if (implicitClose && i == lastElement) { // Close the polygon
|
||||||
|
Direct2DPathGeometryWriter writer;
|
||||||
|
writer.begin();
|
||||||
|
writer.moveTo(jointStart);
|
||||||
|
writer.lineTo(p2);
|
||||||
|
writer.lineTo(QLineF(p2, QPointF(points[2], points[3])).pointAt(patchSegment));
|
||||||
|
writer.close();
|
||||||
|
dc()->DrawGeometry(writer.geometry().Get(), pen.brush.Get(), pen.qpen.widthF(), pen.strokeStyle.Get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ComPtr<IDWriteFontFace> fontFaceFromFontEngine(QFontEngine *fe)
|
ComPtr<IDWriteFontFace> fontFaceFromFontEngine(QFontEngine *fe)
|
||||||
{
|
{
|
||||||
const QFontDef fontDef = fe->fontDef;
|
const QFontDef fontDef = fe->fontDef;
|
||||||
@ -1055,20 +1165,12 @@ void QWindowsDirect2DPaintEngine::setState(QPainterState *s)
|
|||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::draw(const QVectorPath &path)
|
void QWindowsDirect2DPaintEngine::draw(const QVectorPath &path)
|
||||||
{
|
{
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
|
||||||
|
|
||||||
ComPtr<ID2D1Geometry> geometry = d->vectorPathToID2D1PathGeometry(path);
|
|
||||||
if (!geometry) {
|
|
||||||
qWarning("%s: Could not convert path to d2d geometry", __FUNCTION__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QBrush &brush = state()->brush;
|
const QBrush &brush = state()->brush;
|
||||||
if (qbrush_style(brush) != Qt::NoBrush) {
|
if (qbrush_style(brush) != Qt::NoBrush) {
|
||||||
if (emulationRequired(BrushEmulation))
|
if (emulationRequired(BrushEmulation))
|
||||||
rasterFill(path, brush);
|
rasterFill(path, brush);
|
||||||
else
|
else
|
||||||
fill(geometry.Get(), brush);
|
fill(path, brush);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QPen &pen = state()->pen;
|
const QPen &pen = state()->pen;
|
||||||
@ -1076,7 +1178,7 @@ void QWindowsDirect2DPaintEngine::draw(const QVectorPath &path)
|
|||||||
if (emulationRequired(PenEmulation))
|
if (emulationRequired(PenEmulation))
|
||||||
QPaintEngineEx::stroke(path, pen);
|
QPaintEngineEx::stroke(path, pen);
|
||||||
else
|
else
|
||||||
stroke(geometry.Get(), pen);
|
stroke(path, pen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1106,18 +1208,6 @@ void QWindowsDirect2DPaintEngine::fill(const QVectorPath &path, const QBrush &br
|
|||||||
d->dc()->FillGeometry(geometry.Get(), d->brush.brush.Get());
|
d->dc()->FillGeometry(geometry.Get(), d->brush.brush.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::fill(ID2D1Geometry *geometry, const QBrush &brush)
|
|
||||||
{
|
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
|
||||||
D2D_TAG(D2DDebugFillTag);
|
|
||||||
|
|
||||||
ensureBrush(brush);
|
|
||||||
if (!d->brush.brush)
|
|
||||||
return;
|
|
||||||
|
|
||||||
d->dc()->FillGeometry(geometry, d->brush.brush.Get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::stroke(const QVectorPath &path, const QPen &pen)
|
void QWindowsDirect2DPaintEngine::stroke(const QVectorPath &path, const QPen &pen)
|
||||||
{
|
{
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
Q_D(QWindowsDirect2DPaintEngine);
|
||||||
@ -1135,25 +1225,7 @@ void QWindowsDirect2DPaintEngine::stroke(const QVectorPath &path, const QPen &pe
|
|||||||
if (!d->pen.brush)
|
if (!d->pen.brush)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ComPtr<ID2D1Geometry> geometry = d->vectorPathToID2D1PathGeometry(path);
|
d->stroke(path);
|
||||||
if (!geometry) {
|
|
||||||
qWarning("%s: Could not convert path to d2d geometry", __FUNCTION__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
d->dc()->DrawGeometry(geometry.Get(), d->pen.brush.Get(), d->pen.qpen.widthF(), d->pen.strokeStyle.Get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::stroke(ID2D1Geometry *geometry, const QPen &pen)
|
|
||||||
{
|
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
|
||||||
D2D_TAG(D2DDebugFillTag);
|
|
||||||
|
|
||||||
ensurePen(pen);
|
|
||||||
if (!d->pen.brush)
|
|
||||||
return;
|
|
||||||
|
|
||||||
d->dc()->DrawGeometry(geometry, d->pen.brush.Get(), d->pen.qpen.widthF(), d->pen.strokeStyle.Get());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
|
void QWindowsDirect2DPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
|
||||||
@ -1301,88 +1373,6 @@ static void adjustLine(QPointF *p1, QPointF *p2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::drawLines(const QLine *lines, int lineCount)
|
|
||||||
{
|
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
|
||||||
D2D_TAG(D2DDebugDrawLinesTag);
|
|
||||||
|
|
||||||
ensurePen();
|
|
||||||
|
|
||||||
if (emulationRequired(PenEmulation)) {
|
|
||||||
QPaintEngineEx::drawLines(lines, lineCount);
|
|
||||||
} else if (d->pen.brush) {
|
|
||||||
for (int i = 0; i < lineCount; i++) {
|
|
||||||
QPointF p1 = lines[i].p1();
|
|
||||||
QPointF p2 = lines[i].p2();
|
|
||||||
|
|
||||||
// Match raster engine output
|
|
||||||
if (p1 == p2 && d->pen.qpen.widthF() <= 1.0) {
|
|
||||||
fillRect(QRectF(p1, QSizeF(d->pen.qpen.widthF(), d->pen.qpen.widthF())),
|
|
||||||
d->pen.qpen.brush());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match raster engine output
|
|
||||||
if (!antiAliasingEnabled())
|
|
||||||
adjustLine(&p1, &p2);
|
|
||||||
|
|
||||||
adjustForAliasing(&p1);
|
|
||||||
adjustForAliasing(&p2);
|
|
||||||
|
|
||||||
D2D1_POINT_2F d2d_p1 = to_d2d_point_2f(p1);
|
|
||||||
D2D1_POINT_2F d2d_p2 = to_d2d_point_2f(p2);
|
|
||||||
|
|
||||||
if (!d->pen.dashBrush || state()->renderHints.testFlag(QPainter::HighQualityAntialiasing)) {
|
|
||||||
d->dc()->DrawLine(d2d_p1, d2d_p2, d->pen.brush.Get(), d->pen.qpen.widthF(), d->pen.strokeStyle.Get());
|
|
||||||
} else {
|
|
||||||
d->pen.dashBrush->SetTransform(transformFromLine(lines[i], d->pen.qpen.widthF()));
|
|
||||||
d->dc()->DrawLine(d2d_p1, d2d_p2, d->pen.dashBrush.Get(), d->pen.qpen.widthF(), NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::drawLines(const QLineF *lines, int lineCount)
|
|
||||||
{
|
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
|
||||||
D2D_TAG(D2DDebugDrawLineFsTag);
|
|
||||||
|
|
||||||
ensurePen();
|
|
||||||
|
|
||||||
if (emulationRequired(PenEmulation)) {
|
|
||||||
QPaintEngineEx::drawLines(lines, lineCount);
|
|
||||||
} else if (d->pen.brush) {
|
|
||||||
for (int i = 0; i < lineCount; i++) {
|
|
||||||
QPointF p1 = lines[i].p1();
|
|
||||||
QPointF p2 = lines[i].p2();
|
|
||||||
|
|
||||||
// Match raster engine output
|
|
||||||
if (p1 == p2 && d->pen.qpen.widthF() <= 1.0) {
|
|
||||||
fillRect(QRectF(p1, QSizeF(d->pen.qpen.widthF(), d->pen.qpen.widthF())),
|
|
||||||
d->pen.qpen.brush());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match raster engine output
|
|
||||||
if (!antiAliasingEnabled())
|
|
||||||
adjustLine(&p1, &p2);
|
|
||||||
|
|
||||||
adjustForAliasing(&p1);
|
|
||||||
adjustForAliasing(&p2);
|
|
||||||
|
|
||||||
D2D1_POINT_2F d2d_p1 = to_d2d_point_2f(p1);
|
|
||||||
D2D1_POINT_2F d2d_p2 = to_d2d_point_2f(p2);
|
|
||||||
|
|
||||||
if (!d->pen.dashBrush || state()->renderHints.testFlag(QPainter::HighQualityAntialiasing)) {
|
|
||||||
d->dc()->DrawLine(d2d_p1, d2d_p2, d->pen.brush.Get(), d->pen.qpen.widthF(), d->pen.strokeStyle.Get());
|
|
||||||
} else {
|
|
||||||
d->pen.dashBrush->SetTransform(transformFromLine(lines[i], d->pen.qpen.widthF()));
|
|
||||||
d->dc()->DrawLine(d2d_p1, d2d_p2, d->pen.dashBrush.Get(), d->pen.qpen.widthF(), NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWindowsDirect2DPaintEngine::drawEllipse(const QRectF &r)
|
void QWindowsDirect2DPaintEngine::drawEllipse(const QRectF &r)
|
||||||
{
|
{
|
||||||
Q_D(QWindowsDirect2DPaintEngine);
|
Q_D(QWindowsDirect2DPaintEngine);
|
||||||
|
@ -92,9 +92,6 @@ public:
|
|||||||
void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE;
|
void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE;
|
||||||
void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE;
|
void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
void drawLines(const QLine *lines, int lineCount) Q_DECL_OVERRIDE;
|
|
||||||
void drawLines(const QLineF *lines, int lineCount) Q_DECL_OVERRIDE;
|
|
||||||
|
|
||||||
void drawEllipse(const QRectF &r) Q_DECL_OVERRIDE;
|
void drawEllipse(const QRectF &r) Q_DECL_OVERRIDE;
|
||||||
void drawEllipse(const QRect &r) Q_DECL_OVERRIDE;
|
void drawEllipse(const QRect &r) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
@ -138,8 +138,9 @@
|
|||||||
QRect previousGeometry = requestedGeometry != actualGeometry ?
|
QRect previousGeometry = requestedGeometry != actualGeometry ?
|
||||||
requestedGeometry : qt_window_private(m_qioswindow->window())->geometry;
|
requestedGeometry : qt_window_private(m_qioswindow->window())->geometry;
|
||||||
|
|
||||||
QWindowSystemInterface::handleGeometryChange(m_qioswindow->window(), actualGeometry, previousGeometry);
|
QWindow *window = m_qioswindow->window();
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
QWindowSystemInterface::handleGeometryChange(window, actualGeometry, previousGeometry);
|
||||||
|
QWindowSystemInterface::flushWindowSystemEvents(window->inherits("QWidgetWindow") ? QEventLoop::ExcludeUserInputEvents : QEventLoop::AllEvents);
|
||||||
|
|
||||||
if (actualGeometry.size() != previousGeometry.size()) {
|
if (actualGeometry.size() != previousGeometry.size()) {
|
||||||
// Trigger expose event on resize
|
// Trigger expose event on resize
|
||||||
|
@ -79,6 +79,8 @@ void QLinuxFbIntegration::initialize()
|
|||||||
|
|
||||||
m_inputContext = QPlatformInputContextFactory::create();
|
m_inputContext = QPlatformInputContextFactory::create();
|
||||||
|
|
||||||
|
m_nativeInterface.reset(new QPlatformNativeInterface);
|
||||||
|
|
||||||
m_vtHandler.reset(new QFbVtHandler);
|
m_vtHandler.reset(new QFbVtHandler);
|
||||||
|
|
||||||
if (!qEnvironmentVariableIntValue("QT_QPA_FB_DISABLE_INPUT"))
|
if (!qEnvironmentVariableIntValue("QT_QPA_FB_DISABLE_INPUT"))
|
||||||
@ -141,4 +143,9 @@ void QLinuxFbIntegration::createInputHandlers()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPlatformNativeInterface *QLinuxFbIntegration::nativeInterface() const
|
||||||
|
{
|
||||||
|
return m_nativeInterface.data();
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -61,6 +61,8 @@ public:
|
|||||||
QPlatformServices *services() const Q_DECL_OVERRIDE;
|
QPlatformServices *services() const Q_DECL_OVERRIDE;
|
||||||
QPlatformInputContext *inputContext() const Q_DECL_OVERRIDE { return m_inputContext; }
|
QPlatformInputContext *inputContext() const Q_DECL_OVERRIDE { return m_inputContext; }
|
||||||
|
|
||||||
|
QPlatformNativeInterface *nativeInterface() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
QList<QPlatformScreen *> screens() const;
|
QList<QPlatformScreen *> screens() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -71,6 +73,7 @@ private:
|
|||||||
QScopedPointer<QPlatformFontDatabase> m_fontDb;
|
QScopedPointer<QPlatformFontDatabase> m_fontDb;
|
||||||
QScopedPointer<QPlatformServices> m_services;
|
QScopedPointer<QPlatformServices> m_services;
|
||||||
QScopedPointer<QFbVtHandler> m_vtHandler;
|
QScopedPointer<QFbVtHandler> m_vtHandler;
|
||||||
|
QScopedPointer<QPlatformNativeInterface> m_nativeInterface;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -675,6 +675,8 @@ static inline bool findPlatformWindowHelper(const POINT &screenPoint, unsigned c
|
|||||||
#ifndef Q_OS_WINCE
|
#ifndef Q_OS_WINCE
|
||||||
const HWND child = ChildWindowFromPointEx(*hwnd, point, cwexFlags);
|
const HWND child = ChildWindowFromPointEx(*hwnd, point, cwexFlags);
|
||||||
#else
|
#else
|
||||||
|
// Under Windows CE we don't use ChildWindowFromPointEx as it's not available
|
||||||
|
// and ChildWindowFromPoint does not work properly.
|
||||||
Q_UNUSED(cwexFlags)
|
Q_UNUSED(cwexFlags)
|
||||||
const HWND child = WindowFromPoint(point);
|
const HWND child = WindowFromPoint(point);
|
||||||
#endif
|
#endif
|
||||||
@ -683,7 +685,13 @@ static inline bool findPlatformWindowHelper(const POINT &screenPoint, unsigned c
|
|||||||
if (QWindowsWindow *window = context->findPlatformWindow(child)) {
|
if (QWindowsWindow *window = context->findPlatformWindow(child)) {
|
||||||
*result = window;
|
*result = window;
|
||||||
*hwnd = child;
|
*hwnd = child;
|
||||||
|
#ifndef Q_OS_WINCE
|
||||||
return true;
|
return true;
|
||||||
|
#else
|
||||||
|
// WindowFromPoint does not return same handle in two sequential calls, which leads
|
||||||
|
// to an endless loop, but calling WindowFromPoint once is good enough.
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifndef Q_OS_WINCE // Does not have WS_EX_TRANSPARENT .
|
#ifndef Q_OS_WINCE // Does not have WS_EX_TRANSPARENT .
|
||||||
// QTBUG-40555: despite CWP_SKIPINVISIBLE, it is possible to hit on invisible
|
// QTBUG-40555: despite CWP_SKIPINVISIBLE, it is possible to hit on invisible
|
||||||
|
@ -567,16 +567,15 @@ static inline int toKeyOrUnicode(int vk, int scancode, unsigned char *kbdBuffer,
|
|||||||
Q_ASSERT(vk > 0 && vk < 256);
|
Q_ASSERT(vk > 0 && vk < 256);
|
||||||
int code = 0;
|
int code = 0;
|
||||||
QChar unicodeBuffer[5];
|
QChar unicodeBuffer[5];
|
||||||
// While key combinations containing alt and ctrl might trigger the third assignment of a key
|
|
||||||
// (for example "alt+ctrl+q" causes '@' on a German layout), ToUnicode often does not return the
|
|
||||||
// wanted character if only the ctrl modifier is used. Thus we unset this modifier temporarily
|
|
||||||
// if it is not used together with alt.
|
|
||||||
const unsigned char controlState = kbdBuffer[VK_MENU] ? 0 : kbdBuffer[VK_CONTROL];
|
|
||||||
if (controlState)
|
|
||||||
kbdBuffer[VK_CONTROL] = 0;
|
|
||||||
int res = ToUnicode(vk, scancode, kbdBuffer, reinterpret_cast<LPWSTR>(unicodeBuffer), 5, 0);
|
int res = ToUnicode(vk, scancode, kbdBuffer, reinterpret_cast<LPWSTR>(unicodeBuffer), 5, 0);
|
||||||
if (controlState)
|
// When Ctrl modifier is used ToUnicode does not return correct values. In order to assign the
|
||||||
|
// right key the control modifier is removed for just that function if the previous call failed.
|
||||||
|
if (res == 0 && kbdBuffer[VK_CONTROL]) {
|
||||||
|
const unsigned char controlState = kbdBuffer[VK_CONTROL];
|
||||||
|
kbdBuffer[VK_CONTROL] = 0;
|
||||||
|
res = ToUnicode(vk, scancode, kbdBuffer, reinterpret_cast<LPWSTR>(unicodeBuffer), 5, 0);
|
||||||
kbdBuffer[VK_CONTROL] = controlState;
|
kbdBuffer[VK_CONTROL] = controlState;
|
||||||
|
}
|
||||||
if (res)
|
if (res)
|
||||||
code = unicodeBuffer[0].toUpper().unicode();
|
code = unicodeBuffer[0].toUpper().unicode();
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ QVariant QWinRTTheme::styleHint(QPlatformIntegration::StyleHint hint)
|
|||||||
return false;
|
return false;
|
||||||
case QPlatformIntegration::ShowIsMaximized:
|
case QPlatformIntegration::ShowIsMaximized:
|
||||||
return false;
|
return false;
|
||||||
case MousePressAndHoldInterval:
|
case QPlatformIntegration::MousePressAndHoldInterval:
|
||||||
return defaultThemeHint(MousePressAndHoldInterval);
|
return defaultThemeHint(MousePressAndHoldInterval);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -789,6 +789,15 @@ void QXcbConnection::handleButtonRelease(xcb_generic_event_t *ev)
|
|||||||
qCDebug(lcQpaXInput, "xcb: released mouse button %d, button state %X", event->detail, static_cast<unsigned int>(m_buttons));
|
qCDebug(lcQpaXInput, "xcb: released mouse button %d, button state %X", event->detail, static_cast<unsigned int>(m_buttons));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QXcbConnection::handleMotionNotify(xcb_generic_event_t *ev)
|
||||||
|
{
|
||||||
|
xcb_motion_notify_event_t *event = (xcb_motion_notify_event_t *)ev;
|
||||||
|
|
||||||
|
m_buttons = (m_buttons & ~0x7) | translateMouseButtons(event->state);
|
||||||
|
if (Q_UNLIKELY(lcQpaXInput().isDebugEnabled()))
|
||||||
|
qDebug("xcb: moved mouse to %4d, %4d; button state %X", event->event_x, event->event_y, static_cast<unsigned int>(m_buttons));
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_XKB
|
#ifndef QT_NO_XKB
|
||||||
namespace {
|
namespace {
|
||||||
typedef union {
|
typedef union {
|
||||||
@ -839,11 +848,8 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
|
|||||||
handleButtonRelease(event);
|
handleButtonRelease(event);
|
||||||
HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
|
HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
|
||||||
case XCB_MOTION_NOTIFY:
|
case XCB_MOTION_NOTIFY:
|
||||||
if (Q_UNLIKELY(lcQpaXInput().isDebugEnabled())) {
|
|
||||||
xcb_motion_notify_event_t *mev = (xcb_motion_notify_event_t *)event;
|
|
||||||
qDebug("xcb: moved mouse to %4d, %4d; button state %X", mev->event_x, mev->event_y, static_cast<unsigned int>(m_buttons));
|
|
||||||
}
|
|
||||||
m_keyboard->updateXKBStateFromCore(((xcb_motion_notify_event_t *)event)->state);
|
m_keyboard->updateXKBStateFromCore(((xcb_motion_notify_event_t *)event)->state);
|
||||||
|
handleMotionNotify(event);
|
||||||
HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
|
HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
|
||||||
case XCB_CONFIGURE_NOTIFY:
|
case XCB_CONFIGURE_NOTIFY:
|
||||||
HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
|
HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
|
||||||
|
@ -497,6 +497,7 @@ private:
|
|||||||
void updateScreens();
|
void updateScreens();
|
||||||
void handleButtonPress(xcb_generic_event_t *event);
|
void handleButtonPress(xcb_generic_event_t *event);
|
||||||
void handleButtonRelease(xcb_generic_event_t *event);
|
void handleButtonRelease(xcb_generic_event_t *event);
|
||||||
|
void handleMotionNotify(xcb_generic_event_t *event);
|
||||||
|
|
||||||
bool m_xi2Enabled;
|
bool m_xi2Enabled;
|
||||||
int m_xi2Minor;
|
int m_xi2Minor;
|
||||||
@ -507,6 +508,7 @@ private:
|
|||||||
XInput2TouchDeviceData *touchDeviceForId(int id);
|
XInput2TouchDeviceData *touchDeviceForId(int id);
|
||||||
void xi2HandleEvent(xcb_ge_event_t *event);
|
void xi2HandleEvent(xcb_ge_event_t *event);
|
||||||
void xi2HandleHierachyEvent(void *event);
|
void xi2HandleHierachyEvent(void *event);
|
||||||
|
void xi2HandleDeviceChangedEvent(void *event);
|
||||||
int m_xiOpCode, m_xiEventBase, m_xiErrorBase;
|
int m_xiOpCode, m_xiEventBase, m_xiErrorBase;
|
||||||
#ifndef QT_NO_TABLETEVENT
|
#ifndef QT_NO_TABLETEVENT
|
||||||
struct TabletData {
|
struct TabletData {
|
||||||
@ -540,6 +542,7 @@ private:
|
|||||||
Qt::Orientations legacyOrientations;
|
Qt::Orientations legacyOrientations;
|
||||||
QPointF lastScrollPosition;
|
QPointF lastScrollPosition;
|
||||||
};
|
};
|
||||||
|
void updateScrollingDevice(ScrollingDevice& scrollingDevice, int num_classes, void *classes);
|
||||||
void xi2HandleScrollEvent(void *event, ScrollingDevice &scrollingDevice);
|
void xi2HandleScrollEvent(void *event, ScrollingDevice &scrollingDevice);
|
||||||
QHash<int, ScrollingDevice> m_scrollingDevices;
|
QHash<int, ScrollingDevice> m_scrollingDevices;
|
||||||
#endif // XCB_USE_XINPUT2
|
#endif // XCB_USE_XINPUT2
|
||||||
|
@ -348,6 +348,7 @@ void QXcbConnection::xi2Select(xcb_window_t window)
|
|||||||
// Listen for hotplug events
|
// Listen for hotplug events
|
||||||
XIEventMask xiEventMask;
|
XIEventMask xiEventMask;
|
||||||
bitMask = XI_HierarchyChangedMask;
|
bitMask = XI_HierarchyChangedMask;
|
||||||
|
bitMask |= XI_DeviceChangedMask;
|
||||||
xiEventMask.deviceid = XIAllDevices;
|
xiEventMask.deviceid = XIAllDevices;
|
||||||
xiEventMask.mask_len = sizeof(bitMask);
|
xiEventMask.mask_len = sizeof(bitMask);
|
||||||
xiEventMask.mask = xiBitMask;
|
xiEventMask.mask = xiBitMask;
|
||||||
@ -468,6 +469,11 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
|
|||||||
xi2HandleHierachyEvent(xiEvent);
|
xi2HandleHierachyEvent(xiEvent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (xiEvent->evtype == XI_DeviceChanged) {
|
||||||
|
xi2HandleDeviceChangedEvent(xiEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_TABLETEVENT
|
#ifndef QT_NO_TABLETEVENT
|
||||||
for (int i = 0; i < m_tabletData.count(); ++i) {
|
for (int i = 0; i < m_tabletData.count(); ++i) {
|
||||||
if (m_tabletData.at(i).deviceId == xiEvent->deviceid) {
|
if (m_tabletData.at(i).deviceId == xiEvent->deviceid) {
|
||||||
@ -628,6 +634,64 @@ void QXcbConnection::xi2HandleHierachyEvent(void *event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QXcbConnection::xi2HandleDeviceChangedEvent(void *event)
|
||||||
|
{
|
||||||
|
xXIDeviceChangedEvent *xiEvent = reinterpret_cast<xXIDeviceChangedEvent *>(event);
|
||||||
|
|
||||||
|
// ### If a slave device changes (XIDeviceChange), we should probably run setup on it again.
|
||||||
|
if (xiEvent->reason != XISlaveSwitch)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef XCB_USE_XINPUT21
|
||||||
|
// This code handles broken scrolling device drivers that reset absolute positions
|
||||||
|
// when they are made active. Whenever a new slave device is made active the
|
||||||
|
// primary pointer sends a DeviceChanged event with XISlaveSwitch, and the new
|
||||||
|
// active slave in sourceid.
|
||||||
|
|
||||||
|
QHash<int, ScrollingDevice>::iterator device = m_scrollingDevices.find(xiEvent->sourceid);
|
||||||
|
if (device == m_scrollingDevices.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
int nrDevices = 0;
|
||||||
|
XIDeviceInfo* xiDeviceInfo = XIQueryDevice(static_cast<Display *>(m_xlib_display), xiEvent->sourceid, &nrDevices);
|
||||||
|
if (nrDevices <= 0) {
|
||||||
|
qCDebug(lcQpaXInputDevices, "scrolling device %d no longer present", xiEvent->sourceid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
updateScrollingDevice(*device, xiDeviceInfo->num_classes, xiDeviceInfo->classes);
|
||||||
|
XIFreeDeviceInfo(xiDeviceInfo);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void QXcbConnection::updateScrollingDevice(ScrollingDevice &scrollingDevice, int num_classes, void *classInfo)
|
||||||
|
{
|
||||||
|
#ifdef XCB_USE_XINPUT21
|
||||||
|
XIAnyClassInfo **classes = reinterpret_cast<XIAnyClassInfo**>(classInfo);
|
||||||
|
QPointF lastScrollPosition;
|
||||||
|
if (lcQpaXInput().isDebugEnabled())
|
||||||
|
lastScrollPosition = scrollingDevice.lastScrollPosition;
|
||||||
|
for (int c = 0; c < num_classes; ++c) {
|
||||||
|
if (classes[c]->type == XIValuatorClass) {
|
||||||
|
XIValuatorClassInfo *vci = reinterpret_cast<XIValuatorClassInfo *>(classes[c]);
|
||||||
|
const int valuatorAtom = qatom(vci->label);
|
||||||
|
if (valuatorAtom == QXcbAtom::RelHorizScroll || valuatorAtom == QXcbAtom::RelHorizWheel)
|
||||||
|
scrollingDevice.lastScrollPosition.setX(vci->value);
|
||||||
|
else if (valuatorAtom == QXcbAtom::RelVertScroll || valuatorAtom == QXcbAtom::RelVertWheel)
|
||||||
|
scrollingDevice.lastScrollPosition.setY(vci->value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lcQpaXInput().isDebugEnabled() && lastScrollPosition != scrollingDevice.lastScrollPosition)
|
||||||
|
qCDebug(lcQpaXInput, "scrolling device %d moved from (%f, %f) to (%f, %f)", scrollingDevice.deviceId,
|
||||||
|
lastScrollPosition.x(), lastScrollPosition.y(),
|
||||||
|
scrollingDevice.lastScrollPosition.x(),
|
||||||
|
scrollingDevice.lastScrollPosition.y());
|
||||||
|
#else
|
||||||
|
Q_UNUSED(scrollingDevice);
|
||||||
|
Q_UNUSED(num_classes);
|
||||||
|
Q_UNUSED(classInfo);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void QXcbConnection::handleEnterEvent(const xcb_enter_notify_event_t *)
|
void QXcbConnection::handleEnterEvent(const xcb_enter_notify_event_t *)
|
||||||
{
|
{
|
||||||
#ifdef XCB_USE_XINPUT21
|
#ifdef XCB_USE_XINPUT21
|
||||||
@ -638,19 +702,11 @@ void QXcbConnection::handleEnterEvent(const xcb_enter_notify_event_t *)
|
|||||||
int nrDevices = 0;
|
int nrDevices = 0;
|
||||||
XIDeviceInfo* xiDeviceInfo = XIQueryDevice(static_cast<Display *>(m_xlib_display), scrollingDevice.deviceId, &nrDevices);
|
XIDeviceInfo* xiDeviceInfo = XIQueryDevice(static_cast<Display *>(m_xlib_display), scrollingDevice.deviceId, &nrDevices);
|
||||||
if (nrDevices <= 0) {
|
if (nrDevices <= 0) {
|
||||||
|
qCDebug(lcQpaXInputDevices, "scrolling device %d no longer present", scrollingDevice.deviceId);
|
||||||
it = m_scrollingDevices.erase(it);
|
it = m_scrollingDevices.erase(it);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (int c = 0; c < xiDeviceInfo->num_classes; ++c) {
|
updateScrollingDevice(scrollingDevice, xiDeviceInfo->num_classes, xiDeviceInfo->classes);
|
||||||
if (xiDeviceInfo->classes[c]->type == XIValuatorClass) {
|
|
||||||
XIValuatorClassInfo *vci = reinterpret_cast<XIValuatorClassInfo *>(xiDeviceInfo->classes[c]);
|
|
||||||
const int valuatorAtom = qatom(vci->label);
|
|
||||||
if (valuatorAtom == QXcbAtom::RelHorizScroll || valuatorAtom == QXcbAtom::RelHorizWheel)
|
|
||||||
scrollingDevice.lastScrollPosition.setX(vci->value);
|
|
||||||
else if (valuatorAtom == QXcbAtom::RelVertScroll || valuatorAtom == QXcbAtom::RelVertWheel)
|
|
||||||
scrollingDevice.lastScrollPosition.setY(vci->value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XIFreeDeviceInfo(xiDeviceInfo);
|
XIFreeDeviceInfo(xiDeviceInfo);
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
@ -206,6 +206,18 @@ static inline QImage::Format imageFormatForVisual(int depth, quint32 red_mask, q
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
qWarning("Unsupported screen format: depth: %d, red_mask: %x, blue_mask: %x", depth, red_mask, blue_mask);
|
qWarning("Unsupported screen format: depth: %d, red_mask: %x, blue_mask: %x", depth, red_mask, blue_mask);
|
||||||
|
|
||||||
|
switch (depth) {
|
||||||
|
case 24:
|
||||||
|
qWarning("Using RGB32 fallback, if this works your X11 server is reporting a bad screen format.");
|
||||||
|
return QImage::Format_RGB32;
|
||||||
|
case 16:
|
||||||
|
qWarning("Using RGB16 fallback, if this works your X11 server is reporting a bad screen format.");
|
||||||
|
return QImage::Format_RGB16;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return QImage::Format_Invalid;
|
return QImage::Format_Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,8 +76,11 @@ QT_USE_NAMESPACE
|
|||||||
PMPageFormat format = static_cast<PMPageFormat>([printInfo PMPageFormat]);
|
PMPageFormat format = static_cast<PMPageFormat>([printInfo PMPageFormat]);
|
||||||
PMRect paperRect;
|
PMRect paperRect;
|
||||||
PMGetUnadjustedPaperRect(format, &paperRect);
|
PMGetUnadjustedPaperRect(format, &paperRect);
|
||||||
|
PMOrientation orientation;
|
||||||
|
PMGetOrientation(format, &orientation);
|
||||||
QSizeF paperSize = QSizeF(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top);
|
QSizeF paperSize = QSizeF(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top);
|
||||||
printer->printEngine()->setProperty(QPrintEngine::PPK_CustomPaperSize, paperSize);
|
printer->printEngine()->setProperty(QPrintEngine::PPK_CustomPaperSize, paperSize);
|
||||||
|
printer->printEngine()->setProperty(QPrintEngine::PPK_Orientation, orientation == kPMLandscape ? QPrinter::Landscape : QPrinter::Portrait);
|
||||||
}
|
}
|
||||||
|
|
||||||
dialog->done((returnCode == NSOKButton) ? QDialog::Accepted : QDialog::Rejected);
|
dialog->done((returnCode == NSOKButton) ? QDialog::Accepted : QDialog::Rejected);
|
||||||
|
@ -60,34 +60,34 @@ END
|
|||||||
|
|
||||||
|
|
||||||
//! [3]
|
//! [3]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/mysql
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/mysql
|
||||||
qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient_r" mysql.pro
|
qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient_r" mysql.pro
|
||||||
make
|
make
|
||||||
//! [3]
|
//! [3]
|
||||||
|
|
||||||
|
|
||||||
//! [4]
|
//! [4]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/mysql
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/mysql
|
||||||
make install
|
make install
|
||||||
//! [4]
|
//! [4]
|
||||||
|
|
||||||
|
|
||||||
//! [5]
|
//! [5]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\mysql
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\mysql
|
||||||
qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+=C:/MYSQL/MySQL Server <version>/lib/opt/libmysql.lib" mysql.pro
|
qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+=C:/MYSQL/MySQL Server <version>/lib/opt/libmysql.lib" mysql.pro
|
||||||
nmake
|
nmake
|
||||||
//! [5]
|
//! [5]
|
||||||
|
|
||||||
|
|
||||||
//! [6]
|
//! [6]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/oci
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/oci
|
||||||
qmake "INCLUDEPATH+=$ORACLE_HOME/rdbms/public $ORACLE_HOME/rdbms/demo" "LIBS+=-L$ORACLE_HOME/lib -lclntsh -lwtc9" oci.pro
|
qmake "INCLUDEPATH+=$ORACLE_HOME/rdbms/public $ORACLE_HOME/rdbms/demo" "LIBS+=-L$ORACLE_HOME/lib -lclntsh -lwtc9" oci.pro
|
||||||
make
|
make
|
||||||
//! [6]
|
//! [6]
|
||||||
|
|
||||||
|
|
||||||
//! [7]
|
//! [7]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/oci
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/oci
|
||||||
qmake "INCLUDEPATH+=/usr/include/oracle/10.1.0.3/client/" "LIBS+=-L/usr/lib/oracle/10.1.0.3/client/lib -lclntsh" oci.pro
|
qmake "INCLUDEPATH+=/usr/include/oracle/10.1.0.3/client/" "LIBS+=-L/usr/lib/oracle/10.1.0.3/client/lib -lclntsh" oci.pro
|
||||||
make
|
make
|
||||||
//! [7]
|
//! [7]
|
||||||
@ -96,7 +96,7 @@ make
|
|||||||
//! [8]
|
//! [8]
|
||||||
set INCLUDE=%INCLUDE%;c:\oracle\oci\include
|
set INCLUDE=%INCLUDE%;c:\oracle\oci\include
|
||||||
set LIB=%LIB%;c:\oracle\oci\lib\msvc
|
set LIB=%LIB%;c:\oracle\oci\lib\msvc
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\oci
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\oci
|
||||||
qmake oci.pro
|
qmake oci.pro
|
||||||
nmake
|
nmake
|
||||||
//! [8]
|
//! [8]
|
||||||
@ -108,116 +108,116 @@ set PATH=%PATH%;c:\oracle\bin
|
|||||||
|
|
||||||
|
|
||||||
//! [11]
|
//! [11]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/odbc
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/odbc
|
||||||
qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"
|
qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"
|
||||||
make
|
make
|
||||||
//! [11]
|
//! [11]
|
||||||
|
|
||||||
|
|
||||||
//! [12]
|
//! [12]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\odbc
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\odbc
|
||||||
qmake odbc.pro
|
qmake odbc.pro
|
||||||
nmake
|
nmake
|
||||||
//! [12]
|
//! [12]
|
||||||
|
|
||||||
|
|
||||||
//! [13]
|
//! [13]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/psql
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/psql
|
||||||
qmake "INCLUDEPATH+=/usr/include/pgsql" "LIBS+=-L/usr/lib -lpq" psql.pro
|
qmake "INCLUDEPATH+=/usr/include/pgsql" "LIBS+=-L/usr/lib -lpq" psql.pro
|
||||||
make
|
make
|
||||||
//! [13]
|
//! [13]
|
||||||
|
|
||||||
|
|
||||||
//! [14]
|
//! [14]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/psql
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/psql
|
||||||
make install
|
make install
|
||||||
//! [14]
|
//! [14]
|
||||||
|
|
||||||
|
|
||||||
//! [15]
|
//! [15]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\psql
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\psql
|
||||||
qmake "INCLUDEPATH+=C:/psql/include" "LIBS+=C:/psql/lib/ms/libpq.lib" psql.pro
|
qmake "INCLUDEPATH+=C:/psql/include" "LIBS+=C:/psql/lib/ms/libpq.lib" psql.pro
|
||||||
nmake
|
nmake
|
||||||
//! [15]
|
//! [15]
|
||||||
|
|
||||||
|
|
||||||
//! [16]
|
//! [16]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/tds
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/tds
|
||||||
qmake "INCLUDEPATH=$SYBASE/include" "LIBS=-L$SYBASE/lib -lsybdb"
|
qmake "INCLUDEPATH=$SYBASE/include" "LIBS=-L$SYBASE/lib -lsybdb"
|
||||||
make
|
make
|
||||||
//! [16]
|
//! [16]
|
||||||
|
|
||||||
|
|
||||||
//! [17]
|
//! [17]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\tds
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\tds
|
||||||
qmake "LIBS+=NTWDBLIB.LIB" tds.pro
|
qmake "LIBS+=NTWDBLIB.LIB" tds.pro
|
||||||
nmake
|
nmake
|
||||||
//! [17]
|
//! [17]
|
||||||
|
|
||||||
|
|
||||||
//! [18]
|
//! [18]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/db2
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/db2
|
||||||
qmake "INCLUDEPATH+=$DB2DIR/include" "LIBS+=-L$DB2DIR/lib -ldb2"
|
qmake "INCLUDEPATH+=$DB2DIR/include" "LIBS+=-L$DB2DIR/lib -ldb2"
|
||||||
make
|
make
|
||||||
//! [18]
|
//! [18]
|
||||||
|
|
||||||
|
|
||||||
//! [19]
|
//! [19]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/db2
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/db2
|
||||||
make install
|
make install
|
||||||
//! [19]
|
//! [19]
|
||||||
|
|
||||||
|
|
||||||
//! [20]
|
//! [20]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\db2
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\db2
|
||||||
qmake "INCLUDEPATH+=<DB2 home>/sqllib/include" "LIBS+=<DB2 home>/sqllib/lib/db2cli.lib"
|
qmake "INCLUDEPATH+=<DB2 home>/sqllib/include" "LIBS+=<DB2 home>/sqllib/lib/db2cli.lib"
|
||||||
nmake
|
nmake
|
||||||
//! [20]
|
//! [20]
|
||||||
|
|
||||||
|
|
||||||
//! [21]
|
//! [21]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/sqlite
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/sqlite
|
||||||
qmake "INCLUDEPATH+=$SQLITE/include" "LIBS+=-L$SQLITE/lib -lsqlite"
|
qmake "INCLUDEPATH+=$SQLITE/include" "LIBS+=-L$SQLITE/lib -lsqlite"
|
||||||
make
|
make
|
||||||
//! [21]
|
//! [21]
|
||||||
|
|
||||||
|
|
||||||
//! [22]
|
//! [22]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/sqlite
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/sqlite
|
||||||
make install
|
make install
|
||||||
//! [22]
|
//! [22]
|
||||||
|
|
||||||
|
|
||||||
//! [23]
|
//! [23]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\sqlite
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\sqlite
|
||||||
qmake "INCLUDEPATH+=C:/SQLITE/INCLUDE" "LIBS+=C:/SQLITE/LIB/SQLITE3.LIB" sqlite.pro
|
qmake "INCLUDEPATH+=C:/SQLITE/INCLUDE" "LIBS+=C:/SQLITE/LIB/SQLITE3.LIB" sqlite.pro
|
||||||
nmake
|
nmake
|
||||||
//! [23]
|
//! [23]
|
||||||
|
|
||||||
|
|
||||||
//! [27]
|
//! [27]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/ibase
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/ibase
|
||||||
qmake "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib" ibase.pro
|
qmake "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib" ibase.pro
|
||||||
make
|
make
|
||||||
//! [27]
|
//! [27]
|
||||||
|
|
||||||
|
|
||||||
//! [28]
|
//! [28]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/ibase
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/ibase
|
||||||
qmake "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib -lfbclient" ibase.pro
|
qmake "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib -lfbclient" ibase.pro
|
||||||
make
|
make
|
||||||
//! [28]
|
//! [28]
|
||||||
|
|
||||||
|
|
||||||
//! [29]
|
//! [29]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\ibase
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\ibase
|
||||||
qmake "INCLUDEPATH+=C:/interbase/include" ibase.pro
|
qmake "INCLUDEPATH+=C:/interbase/include" ibase.pro
|
||||||
nmake
|
nmake
|
||||||
//! [29]
|
//! [29]
|
||||||
|
|
||||||
|
|
||||||
//! [30]
|
//! [30]
|
||||||
cd %QTDIR%\src\plugins\sqldrivers\ibase
|
cd %QTDIR%\qtbase\src\plugins\sqldrivers\ibase
|
||||||
qmake "INCLUDEPATH+=C:/interbase/include" "LIBS+=-lfbclient" ibase.pro
|
qmake "INCLUDEPATH+=C:/interbase/include" "LIBS+=-lfbclient" ibase.pro
|
||||||
nmake
|
nmake
|
||||||
//! [30]
|
//! [30]
|
||||||
@ -229,7 +229,7 @@ make
|
|||||||
//! [32]
|
//! [32]
|
||||||
|
|
||||||
//! [33]
|
//! [33]
|
||||||
cd $QTDIR/src/plugins/sqldrivers/oci
|
cd $QTDIR/qtbase/src/plugins/sqldrivers/oci
|
||||||
qmake "INCLUDEPATH+=/usr/include/oracle/10.1.0.3/client" "LIBS+=-L/usr/lib/oracle/10.1.0.3/client/lib -Wl,-rpath,/usr/lib/oracle/10.1.0.3/client/lib -lclntsh -lnnz10" oci.pro
|
qmake "INCLUDEPATH+=/usr/include/oracle/10.1.0.3/client" "LIBS+=-L/usr/lib/oracle/10.1.0.3/client/lib -Wl,-rpath,/usr/lib/oracle/10.1.0.3/client/lib -lclntsh -lnnz10" oci.pro
|
||||||
make
|
make
|
||||||
//! [33]
|
//! [33]
|
||||||
|
@ -471,7 +471,7 @@
|
|||||||
|
|
||||||
By default the Microsoft library is used on Windows, if you want to
|
By default the Microsoft library is used on Windows, if you want to
|
||||||
force the use of the Sybase Open Client, you must define \c
|
force the use of the Sybase Open Client, you must define \c
|
||||||
Q_USE_SYBASE in \c{%QTDIR%\src\sql\drivers\tds\qsql_tds.cpp}. If you
|
Q_USE_SYBASE in \c{%QTDIR%\qtbase\src\sql\drivers\tds\qsql_tds.cpp}. If you
|
||||||
are not using a Microsoft compiler, replace \c nmake with \c make in
|
are not using a Microsoft compiler, replace \c nmake with \c make in
|
||||||
the line above.
|
the line above.
|
||||||
|
|
||||||
@ -751,7 +751,7 @@
|
|||||||
must use the Q_PLUGIN_METADATA() macro. Read \l{How to Create Qt
|
must use the Q_PLUGIN_METADATA() macro. Read \l{How to Create Qt
|
||||||
Plugins} for more information on this. You can also check out how
|
Plugins} for more information on this. You can also check out how
|
||||||
this is done in the SQL plugins that are provided with Qt in
|
this is done in the SQL plugins that are provided with Qt in
|
||||||
\c{QTDIR/src/plugins/sqldrivers} and \c{QTDIR/src/sql/drivers}.
|
\c{QTDIR/qtbase/src/plugins/sqldrivers} and \c{QTDIR/qtbase/src/sql/drivers}.
|
||||||
|
|
||||||
The following code can be used as a skeleton for a SQL driver:
|
The following code can be used as a skeleton for a SQL driver:
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ src_testlib.depends = src_corelib # src_gui & src_widgets are not build-depend
|
|||||||
|
|
||||||
src_3rdparty_harfbuzzng.subdir = $$PWD/3rdparty/harfbuzz-ng
|
src_3rdparty_harfbuzzng.subdir = $$PWD/3rdparty/harfbuzz-ng
|
||||||
src_3rdparty_harfbuzzng.target = sub-3rdparty-harfbuzzng
|
src_3rdparty_harfbuzzng.target = sub-3rdparty-harfbuzzng
|
||||||
|
src_3rdparty_harfbuzzng.depends = src_corelib # for the Qt atomics
|
||||||
|
|
||||||
src_angle.subdir = $$PWD/angle
|
src_angle.subdir = $$PWD/angle
|
||||||
src_angle.target = sub-angle
|
src_angle.target = sub-angle
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
\externalpage http://blog.qt.io/
|
\externalpage http://blog.qt.io
|
||||||
\title Qt Labs
|
\title Qt Labs
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
|
@ -428,7 +428,7 @@
|
|||||||
\quotation
|
\quotation
|
||||||
\raw HTML
|
\raw HTML
|
||||||
<h3>
|
<h3>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/qchar.html#Joining-enum">Joining</a>
|
<a href="http://doc.qt.io/qt-5/qchar.html#JoiningType-enum">Joining</a>
|
||||||
QChar::joining () const</h3>
|
QChar::joining () const</h3>
|
||||||
\endraw
|
\endraw
|
||||||
|
|
||||||
@ -787,7 +787,7 @@
|
|||||||
|
|
||||||
\quotation
|
\quotation
|
||||||
\raw HTML
|
\raw HTML
|
||||||
<h3><a href="http://qt-project.org/doc/qt-5.0/qtwidgets/qaction.html">QAction</a>
|
<h3><a href="http://doc.qt.io/qt-5/qaction.html">QAction</a>
|
||||||
* QMenu::addAction ( const QIcon & <i>icon</i>,
|
* QMenu::addAction ( const QIcon & <i>icon</i>,
|
||||||
const QString & <i>text</i> )
|
const QString & <i>text</i> )
|
||||||
</h3>
|
</h3>
|
||||||
|
@ -1479,10 +1479,10 @@
|
|||||||
\printuntil hello
|
\printuntil hello
|
||||||
|
|
||||||
First we create a \l
|
First we create a \l
|
||||||
{http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html} {QApplication}
|
{http://doc.qt.io/qt-5/qapplication.html} {QApplication}
|
||||||
object using the \c argc and \c argv parameters, then we
|
object using the \c argc and \c argv parameters, then we
|
||||||
create a \l
|
create a \l
|
||||||
{http://qt-project.org/doc/qt-5.0/qtwidgets/qpushbutton.html} {QPushButton}.
|
{http://doc.qt.io/qt-5/qpushbutton.html} {QPushButton}.
|
||||||
\endquotation
|
\endquotation
|
||||||
|
|
||||||
See also \l {printline-command} {\\printline} and \l
|
See also \l {printline-command} {\\printline} and \l
|
||||||
@ -1782,7 +1782,7 @@
|
|||||||
|
|
||||||
\code
|
\code
|
||||||
/ *!
|
/ *!
|
||||||
Read the \l {http://qt-project.org/doc/qt-5.0/}
|
Read the \l {http://doc.qt.io/qt-5/}
|
||||||
{Qt 5.0 Documentation} carefully.
|
{Qt 5.0 Documentation} carefully.
|
||||||
* /
|
* /
|
||||||
\endcode
|
\endcode
|
||||||
@ -1790,7 +1790,7 @@
|
|||||||
QDoc renders this as:
|
QDoc renders this as:
|
||||||
|
|
||||||
\quotation
|
\quotation
|
||||||
Read the \l {http://qt-project.org/doc/qt-5.0/}
|
Read the \l {http://doc.qt.io/qt-5/}
|
||||||
{Qt 5.0 Documentation} carefully.
|
{Qt 5.0 Documentation} carefully.
|
||||||
\endquotation
|
\endquotation
|
||||||
|
|
||||||
@ -2419,7 +2419,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#d0d0d0">
|
<tr valign="top" bgcolor="#d0d0d0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/signalsandslots.html">
|
<a href="http://doc.qt.io/qt-5/signalsandslots.html">
|
||||||
Signals and Slots</a>
|
Signals and Slots</a>
|
||||||
</td>
|
</td>
|
||||||
<td>Signals and slots are used for communication
|
<td>Signals and slots are used for communication
|
||||||
@ -2428,7 +2428,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#c0c0c0">
|
<tr valign="top" bgcolor="#c0c0c0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtwidgets/layout.html">
|
<a href="http://doc.qt.io/qt-5/layout.html">
|
||||||
Layout Management</a></td>
|
Layout Management</a></td>
|
||||||
<td>The Qt layout system provides a simple
|
<td>The Qt layout system provides a simple
|
||||||
and powerful way of specifying the layout
|
and powerful way of specifying the layout
|
||||||
@ -2437,7 +2437,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#d0d0d0">
|
<tr valign="top" bgcolor="#d0d0d0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtgui/dnd.html">
|
<a href="http://doc.qt.io/qt-5/dnd.html">
|
||||||
Drag and Drop</a></td>
|
Drag and Drop</a></td>
|
||||||
<td>Drag and drop provides a simple visual
|
<td>Drag and drop provides a simple visual
|
||||||
mechanism which users can use to transfer
|
mechanism which users can use to transfer
|
||||||
@ -2538,7 +2538,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#d0d0d0">
|
<tr valign="top" bgcolor="#d0d0d0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/signalsandslots.html">
|
<a href="http://doc.qt.io/qt-5/signalsandslots.html">
|
||||||
Signals and Slots</a>
|
Signals and Slots</a>
|
||||||
</td>
|
</td>
|
||||||
<td>Signals and slots are used for communication
|
<td>Signals and slots are used for communication
|
||||||
@ -2600,7 +2600,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#d0d0d0">
|
<tr valign="top" bgcolor="#d0d0d0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/signalsandslots.html">
|
<a href="http://doc.qt.io/qt-5/signalsandslots.html">
|
||||||
Signals and Slots</a>
|
Signals and Slots</a>
|
||||||
</td>
|
</td>
|
||||||
<td>Signals and slots are used for communication
|
<td>Signals and slots are used for communication
|
||||||
@ -2609,7 +2609,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#c0c0c0">
|
<tr valign="top" bgcolor="#c0c0c0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtwidgets/layout.html">
|
<a href="http://doc.qt.io/qt-5/layout.html">
|
||||||
Layout Management</a></td>
|
Layout Management</a></td>
|
||||||
<td>The Qt layout system provides a simple
|
<td>The Qt layout system provides a simple
|
||||||
and powerful way of specifying the layout
|
and powerful way of specifying the layout
|
||||||
@ -2618,7 +2618,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#d0d0d0">
|
<tr valign="top" bgcolor="#d0d0d0">
|
||||||
<td>
|
<td>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtgui/dnd.html">
|
<a href="http://doc.qt.io/qt-5/dnd.html">
|
||||||
Drag and Drop</a></td>
|
Drag and Drop</a></td>
|
||||||
<td>Drag and drop provides a simple visual
|
<td>Drag and drop provides a simple visual
|
||||||
mechanism which users can use to transfer
|
mechanism which users can use to transfer
|
||||||
@ -3036,7 +3036,7 @@
|
|||||||
\quotation
|
\quotation
|
||||||
\raw HTML
|
\raw HTML
|
||||||
<h3>geometry :
|
<h3>geometry :
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/qrect.html">QRect</a>
|
<a href="http://doc.qt.io/qt-5/qrect.html">QRect</a>
|
||||||
</h3>
|
</h3>
|
||||||
\endraw
|
\endraw
|
||||||
|
|
||||||
|
@ -1409,7 +1409,7 @@
|
|||||||
\code
|
\code
|
||||||
project = Qt
|
project = Qt
|
||||||
description = Qt Reference Documentation
|
description = Qt Reference Documentation
|
||||||
url = http://qt-project.org/doc/qt-4.8/
|
url = http://doc.qt.io/qt-4.8/
|
||||||
|
|
||||||
...
|
...
|
||||||
\endcode
|
\endcode
|
||||||
@ -1432,7 +1432,7 @@
|
|||||||
\code
|
\code
|
||||||
project = Qt
|
project = Qt
|
||||||
description = Qt Reference Documentation
|
description = Qt Reference Documentation
|
||||||
url = http://qt-project.org/doc/qt-4.8/
|
url = http://doc.qt.io/qt-4.8/
|
||||||
|
|
||||||
...
|
...
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -393,11 +393,11 @@
|
|||||||
|
|
||||||
Files:
|
Files:
|
||||||
\list
|
\list
|
||||||
\li \l{http://qt-project.org/doc/qt-5.0/qtwidgets/widgets-imageviewer-imageviewer-cpp.html}
|
\li \l{http://doc.qt.io/qt-5/qtwidgets-widgets-imageviewer-imageviewer-cpp.html}
|
||||||
{widgets/imageviewer/imageviewer.cpp}
|
{widgets/imageviewer/imageviewer.cpp}
|
||||||
\li \l{http://qt-project.org/doc/qt-5.0/qtwidgets/widgets-imageviewer-imageviewer-h.html}
|
\li \l{http://doc.qt.io/qt-5/qtwidgets-widgets-imageviewer-imageviewer-h.html}
|
||||||
{widgets/imageviewer/imageviewer.h}
|
{widgets/imageviewer/imageviewer.h}
|
||||||
\li \l{http://qt-project.org/doc/qt-5.0/qtwidgets/widgets-imageviewer-main-cpp.html}
|
\li \l{http://doc.qt.io/qt-5/qtwidgets-widgets-imageviewer-main-cpp.html}
|
||||||
{widgets/imageviewer/main.cpp}
|
{widgets/imageviewer/main.cpp}
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@ -414,7 +414,7 @@
|
|||||||
|
|
||||||
\code
|
\code
|
||||||
/ *!
|
/ *!
|
||||||
\externalpage http://qt-project.org/doc/
|
\externalpage http://doc.qt.io/
|
||||||
\title Qt Documentation Site
|
\title Qt Documentation Site
|
||||||
* /
|
* /
|
||||||
\endcode
|
\endcode
|
||||||
@ -432,7 +432,7 @@
|
|||||||
QDoc renders this as:
|
QDoc renders this as:
|
||||||
|
|
||||||
\quotation
|
\quotation
|
||||||
At the \l {http://qt-project.org/doc/}{Qt Documentation Site}
|
At the \l {http://doc.qt.io/}{Qt Documentation Site}
|
||||||
you can find the latest documentation for Qt, Qt Creator, the Qt SDK
|
you can find the latest documentation for Qt, Qt Creator, the Qt SDK
|
||||||
and much more.
|
and much more.
|
||||||
\endquotation
|
\endquotation
|
||||||
@ -443,7 +443,7 @@
|
|||||||
|
|
||||||
\code
|
\code
|
||||||
/ *!
|
/ *!
|
||||||
At the \l {http://qt-project.org/doc/}{Qt Documentation Site}
|
At the \l {http://doc.qt.io/}{Qt Documentation Site}
|
||||||
you can find the latest documentation for Qt, Qt Creator, the Qt SDK
|
you can find the latest documentation for Qt, Qt Creator, the Qt SDK
|
||||||
and much more.
|
and much more.
|
||||||
* /
|
* /
|
||||||
@ -543,7 +543,7 @@
|
|||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr valign="top" bgcolor="#e0e0e0">
|
<tr valign="top" bgcolor="#e0e0e0">
|
||||||
<td><b>
|
<td><b>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtnetwork/qabstractsocket.html">QAbstractSocket</a>
|
<a href="http://doc.qt.io/qt-5/qabstractsocket.html">QAbstractSocket</a>
|
||||||
</b></td>
|
</b></td>
|
||||||
<td>
|
<td>
|
||||||
The base functionality common to all socket types
|
The base functionality common to all socket types
|
||||||
@ -551,7 +551,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#e0e0e0">
|
<tr valign="top" bgcolor="#e0e0e0">
|
||||||
<td><b>
|
<td><b>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/qbuffer.html">QBuffer</a>
|
<a href="http://doc.qt.io/qt-5/qbuffer.html">QBuffer</a>
|
||||||
</b></td>
|
</b></td>
|
||||||
<td>
|
<td>
|
||||||
QIODevice interface for a QByteArray
|
QIODevice interface for a QByteArray
|
||||||
@ -559,7 +559,7 @@
|
|||||||
|
|
||||||
<tr valign="top" bgcolor="#e0e0e0">
|
<tr valign="top" bgcolor="#e0e0e0">
|
||||||
<td><b>
|
<td><b>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtgui/qclipboard.html">QClipboard</a>
|
<a href="http://doc.qt.io/qt-5/qclipboard.html">QClipboard</a>
|
||||||
</b></td>
|
</b></td>
|
||||||
<td>
|
<td>
|
||||||
Access to the window system clipboard
|
Access to the window system clipboard
|
||||||
@ -635,7 +635,7 @@
|
|||||||
<h3>Functions</h3>
|
<h3>Functions</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>RandomAccessIterator
|
<li>RandomAccessIterator
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtcore/qtalgorithms.html#qBinaryFind">qBinaryFind</a></b>
|
<a href="http://doc.qt.io/qt-5/qtalgorithms-obsolete.html#qBinaryFind">qBinaryFind</a></b>
|
||||||
(RandomAccessIterator begin, RandomAccessIterator end,
|
(RandomAccessIterator begin, RandomAccessIterator end,
|
||||||
const T & value)</li>
|
const T & value)</li>
|
||||||
<li>...</li></ul>
|
<li>...</li></ul>
|
||||||
@ -804,7 +804,7 @@
|
|||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr valign="top" bgcolor="#d0d0d0">
|
<tr valign="top" bgcolor="#d0d0d0">
|
||||||
<td><b>
|
<td><b>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtnetwork/qabstractsocket.html">QAbstractSocket</a>
|
<a href="http://doc.qt.io/qt-5/qabstractsocket.html">QAbstractSocket</a>
|
||||||
</b></td>
|
</b></td>
|
||||||
<td>
|
<td>
|
||||||
The base functionality common to all socket types
|
The base functionality common to all socket types
|
||||||
@ -1539,7 +1539,7 @@
|
|||||||
\quotation
|
\quotation
|
||||||
\raw HTML
|
\raw HTML
|
||||||
<h3>
|
<h3>
|
||||||
<a href="http://qt-project.org/doc/qt-5.0/qtgui/qpalette.html">
|
<a href="http://doc.qt.io/qt-5/qpalette.html">
|
||||||
QPalette
|
QPalette
|
||||||
</a>
|
</a>
|
||||||
QStyleOption::palette
|
QStyleOption::palette
|
||||||
|
@ -43,7 +43,7 @@ every statement in the qdocconf file.
|
|||||||
|
|
||||||
project = QtGui
|
project = QtGui
|
||||||
description = Qt GUI Reference Documentation
|
description = Qt GUI Reference Documentation
|
||||||
url = http://qt-project.org/doc/qt-$QT_VER/qtgui
|
url = http://doc.qt.io/qt-$QT_VER/qtgui-index.html
|
||||||
version = $QT_VERSION
|
version = $QT_VERSION
|
||||||
|
|
||||||
examplesinstallpath = gui
|
examplesinstallpath = gui
|
||||||
@ -125,7 +125,7 @@ name of the index file doesn't adopt the uppercase letters of the project name.
|
|||||||
A short description of the project concerned.
|
A short description of the project concerned.
|
||||||
|
|
||||||
\code
|
\code
|
||||||
url = http://qt-project.org/doc/qt-$QT_VER/qtgui
|
url = http://doc.qt.io/qt-$QT_VER/qtgui-index.html
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
The \c url variable holds the base url of the project.
|
The \c url variable holds the base url of the project.
|
||||||
|
@ -727,19 +727,31 @@ QString QAccessibleTextWidget::attributes(int offset, int *startOffset, int *end
|
|||||||
int blockEnd = blockStart + block.length();
|
int blockEnd = blockStart + block.length();
|
||||||
|
|
||||||
QTextBlock::iterator iter = block.begin();
|
QTextBlock::iterator iter = block.begin();
|
||||||
while (!iter.fragment().contains(offset))
|
int lastFragmentIndex = blockStart;
|
||||||
|
while (!iter.atEnd()) {
|
||||||
|
QTextFragment f = iter.fragment();
|
||||||
|
if (f.contains(offset))
|
||||||
|
break;
|
||||||
|
lastFragmentIndex = f.position() + f.length();
|
||||||
++iter;
|
++iter;
|
||||||
|
}
|
||||||
|
|
||||||
QTextFragment fragment = iter.fragment();
|
QTextCharFormat charFormat;
|
||||||
int pos = fragment.position();
|
if (!iter.atEnd()) {
|
||||||
|
QTextFragment fragment = iter.fragment();
|
||||||
// text block and fragment may overlap, use the smallest common range
|
charFormat = fragment.charFormat();
|
||||||
*startOffset = qMax(pos, blockStart);
|
int pos = fragment.position();
|
||||||
|
// text block and fragment may overlap, use the smallest common range
|
||||||
|
*startOffset = qMax(pos, blockStart);
|
||||||
|
*endOffset = qMin(pos + fragment.length(), blockEnd);
|
||||||
|
} else {
|
||||||
|
charFormat = block.charFormat();
|
||||||
|
*startOffset = lastFragmentIndex;
|
||||||
|
*endOffset = blockEnd;
|
||||||
|
}
|
||||||
Q_ASSERT(*startOffset <= offset);
|
Q_ASSERT(*startOffset <= offset);
|
||||||
*endOffset = qMin(pos + fragment.length(), blockEnd);
|
|
||||||
Q_ASSERT(*endOffset >= offset);
|
Q_ASSERT(*endOffset >= offset);
|
||||||
|
|
||||||
QTextCharFormat charFormat = fragment.charFormat();
|
|
||||||
QTextBlockFormat blockFormat = cursor.blockFormat();
|
QTextBlockFormat blockFormat = cursor.blockFormat();
|
||||||
|
|
||||||
QMap<QByteArray, QString> attrs;
|
QMap<QByteArray, QString> attrs;
|
||||||
|
@ -2711,7 +2711,7 @@ void QFileDialogPrivate::createWidgets()
|
|||||||
return;
|
return;
|
||||||
Q_Q(QFileDialog);
|
Q_Q(QFileDialog);
|
||||||
model = new QFileSystemModel(q);
|
model = new QFileSystemModel(q);
|
||||||
options->setFilter(model->filter());
|
model->setFilter(options->filter());
|
||||||
model->setObjectName(QLatin1String("qt_filesystem_model"));
|
model->setObjectName(QLatin1String("qt_filesystem_model"));
|
||||||
if (QPlatformFileDialogHelper *helper = platformFileDialogHelper())
|
if (QPlatformFileDialogHelper *helper = platformFileDialogHelper())
|
||||||
model->setNameFilterDisables(helper->defaultNameFilterDisables());
|
model->setNameFilterDisables(helper->defaultNameFilterDisables());
|
||||||
|
@ -416,17 +416,7 @@ void QPixmapConvolutionFilter::draw(QPainter *painter, const QPointF &p, const Q
|
|||||||
if (src.isNull())
|
if (src.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
|
// raster implementation
|
||||||
static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
|
|
||||||
QPixmapConvolutionFilter *convolutionFilter = static_cast<QPixmapConvolutionFilter*>(filter);
|
|
||||||
if (convolutionFilter) {
|
|
||||||
convolutionFilter->setConvolutionKernel(d->convolutionKernel, d->kernelWidth, d->kernelHeight);
|
|
||||||
convolutionFilter->d_func()->convoluteAlpha = d->convoluteAlpha;
|
|
||||||
convolutionFilter->draw(painter, p, src, srcRect);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// falling back to raster implementation
|
|
||||||
|
|
||||||
QImage *target = 0;
|
QImage *target = 0;
|
||||||
if (painter->paintEngine()->paintDevice()->devType() == QInternal::Image) {
|
if (painter->paintEngine()->paintDevice()->devType() == QInternal::Image) {
|
||||||
@ -925,16 +915,6 @@ void QPixmapBlurFilter::draw(QPainter *painter, const QPointF &p, const QPixmap
|
|||||||
if (qt_scaleForTransform(painter->transform(), &scale))
|
if (qt_scaleForTransform(painter->transform(), &scale))
|
||||||
scaledRadius /= scale;
|
scaledRadius /= scale;
|
||||||
|
|
||||||
QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
|
|
||||||
static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
|
|
||||||
QPixmapBlurFilter *blurFilter = static_cast<QPixmapBlurFilter*>(filter);
|
|
||||||
if (blurFilter) {
|
|
||||||
blurFilter->setRadius(scaledRadius);
|
|
||||||
blurFilter->setBlurHints(d->hints);
|
|
||||||
blurFilter->draw(painter, p, src, srcRect);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QImage srcImage;
|
QImage srcImage;
|
||||||
QImage destImage;
|
QImage destImage;
|
||||||
|
|
||||||
@ -1095,17 +1075,7 @@ void QPixmapColorizeFilter::draw(QPainter *painter, const QPointF &dest, const Q
|
|||||||
if (src.isNull())
|
if (src.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QPixmapFilter *filter = painter->paintEngine() && painter->paintEngine()->isExtended() ?
|
// raster implementation
|
||||||
static_cast<QPaintEngineEx *>(painter->paintEngine())->pixmapFilter(type(), this) : 0;
|
|
||||||
QPixmapColorizeFilter *colorizeFilter = static_cast<QPixmapColorizeFilter*>(filter);
|
|
||||||
if (colorizeFilter) {
|
|
||||||
colorizeFilter->setColor(d->color);
|
|
||||||
colorizeFilter->setStrength(d->strength);
|
|
||||||
colorizeFilter->draw(painter, dest, src, srcRect);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// falling back to raster implementation
|
|
||||||
|
|
||||||
if (!d->opaque) {
|
if (!d->opaque) {
|
||||||
painter->drawPixmap(dest, src, srcRect);
|
painter->drawPixmap(dest, src, srcRect);
|
||||||
@ -1329,17 +1299,6 @@ void QPixmapDropShadowFilter::draw(QPainter *p,
|
|||||||
if (px.isNull())
|
if (px.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QPixmapFilter *filter = p->paintEngine() && p->paintEngine()->isExtended() ?
|
|
||||||
static_cast<QPaintEngineEx *>(p->paintEngine())->pixmapFilter(type(), this) : 0;
|
|
||||||
QPixmapDropShadowFilter *dropShadowFilter = static_cast<QPixmapDropShadowFilter*>(filter);
|
|
||||||
if (dropShadowFilter) {
|
|
||||||
dropShadowFilter->setColor(d->color);
|
|
||||||
dropShadowFilter->setBlurRadius(d->radius);
|
|
||||||
dropShadowFilter->setOffset(d->offset);
|
|
||||||
dropShadowFilter->draw(p, pos, px, src);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QImage tmp(px.size(), QImage::Format_ARGB32_Premultiplied);
|
QImage tmp(px.size(), QImage::Format_ARGB32_Premultiplied);
|
||||||
tmp.fill(0);
|
tmp.fill(0);
|
||||||
QPainter tmpPainter(&tmp);
|
QPainter tmpPainter(&tmp);
|
||||||
|
@ -565,7 +565,7 @@ void QGridLayoutPrivate::add(QGridBox *box, int row1, int row2, int col1, int co
|
|||||||
add(box, row1, col1);
|
add(box, row1, col1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
expand(row2 + 1, col2 + 1);
|
expand(qMax(row1, row2) + 1, qMax(col1, col2) + 1);
|
||||||
box->row = row1;
|
box->row = row1;
|
||||||
box->col = col1;
|
box->col = col1;
|
||||||
|
|
||||||
|
@ -5229,6 +5229,9 @@ QGraphicsEffect *QWidget::graphicsEffect() const
|
|||||||
|
|
||||||
\note This function will apply the effect on itself and all its children.
|
\note This function will apply the effect on itself and all its children.
|
||||||
|
|
||||||
|
\note Graphics effects are not supported for OpenGL-based widgets, such as QGLWidget,
|
||||||
|
QOpenGLWidget and QQuickWidget.
|
||||||
|
|
||||||
\since 4.6
|
\since 4.6
|
||||||
|
|
||||||
\sa graphicsEffect()
|
\sa graphicsEffect()
|
||||||
@ -12271,7 +12274,7 @@ QPoint QWidget::mapToGlobal(const QPoint &pos) const
|
|||||||
{
|
{
|
||||||
#ifndef QT_NO_GRAPHICSVIEW
|
#ifndef QT_NO_GRAPHICSVIEW
|
||||||
Q_D(const QWidget);
|
Q_D(const QWidget);
|
||||||
if (d->extra && d->extra->proxyWidget) {
|
if (d->extra && d->extra->proxyWidget && d->extra->proxyWidget->scene()) {
|
||||||
const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views();
|
const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views();
|
||||||
if (!views.isEmpty()) {
|
if (!views.isEmpty()) {
|
||||||
const QPointF scenePos = d->extra->proxyWidget->mapToScene(pos);
|
const QPointF scenePos = d->extra->proxyWidget->mapToScene(pos);
|
||||||
@ -12306,7 +12309,7 @@ QPoint QWidget::mapFromGlobal(const QPoint &pos) const
|
|||||||
{
|
{
|
||||||
#ifndef QT_NO_GRAPHICSVIEW
|
#ifndef QT_NO_GRAPHICSVIEW
|
||||||
Q_D(const QWidget);
|
Q_D(const QWidget);
|
||||||
if (d->extra && d->extra->proxyWidget) {
|
if (d->extra && d->extra->proxyWidget && d->extra->proxyWidget->scene()) {
|
||||||
const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views();
|
const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views();
|
||||||
if (!views.isEmpty()) {
|
if (!views.isEmpty()) {
|
||||||
const QPoint viewPortPos = views.first()->viewport()->mapFromGlobal(pos);
|
const QPoint viewPortPos = views.first()->viewport()->mapFromGlobal(pos);
|
||||||
|
@ -651,7 +651,7 @@ void QWidgetWindow::handleScreenChange()
|
|||||||
|
|
||||||
void QWidgetWindow::repaintWindow()
|
void QWidgetWindow::repaintWindow()
|
||||||
{
|
{
|
||||||
if (!m_widget->isVisible() || !m_widget->updatesEnabled())
|
if (!m_widget->isVisible() || !m_widget->updatesEnabled() || !m_widget->rect().isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
|
QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
|
||||||
|
@ -1737,8 +1737,8 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio
|
|||||||
state = QIcon::On;
|
state = QIcon::On;
|
||||||
|
|
||||||
QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
|
QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
|
||||||
int w = pixmap.width();
|
int w = pixmap.width() / pixmap.devicePixelRatio();
|
||||||
int h = pixmap.height();
|
int h = pixmap.height() / pixmap.devicePixelRatio();
|
||||||
|
|
||||||
if (!button->text.isEmpty())
|
if (!button->text.isEmpty())
|
||||||
w += button->fontMetrics.boundingRect(option->rect, tf, button->text).width() + 2;
|
w += button->fontMetrics.boundingRect(option->rect, tf, button->text).width() + 2;
|
||||||
@ -1746,15 +1746,17 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio
|
|||||||
point = QPoint(ir.x() + ir.width() / 2 - w / 2,
|
point = QPoint(ir.x() + ir.width() / 2 - w / 2,
|
||||||
ir.y() + ir.height() / 2 - h / 2);
|
ir.y() + ir.height() / 2 - h / 2);
|
||||||
|
|
||||||
|
w = pixmap.width() / pixmap.devicePixelRatio();
|
||||||
|
|
||||||
if (button->direction == Qt::RightToLeft)
|
if (button->direction == Qt::RightToLeft)
|
||||||
point.rx() += pixmap.width();
|
point.rx() += w;
|
||||||
|
|
||||||
painter->drawPixmap(visualPos(button->direction, button->rect, point), pixmap);
|
painter->drawPixmap(visualPos(button->direction, button->rect, point), pixmap);
|
||||||
|
|
||||||
if (button->direction == Qt::RightToLeft)
|
if (button->direction == Qt::RightToLeft)
|
||||||
ir.translate(-point.x() - 2, 0);
|
ir.translate(-point.x() - 2, 0);
|
||||||
else
|
else
|
||||||
ir.translate(point.x() + pixmap.width(), 0);
|
ir.translate(point.x() + w, 0);
|
||||||
|
|
||||||
// left-align text if there is
|
// left-align text if there is
|
||||||
if (!button->text.isEmpty())
|
if (!button->text.isEmpty())
|
||||||
|
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