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

Conflicts:
	doc/global/template/style/online.css
	mkspecs/android-g++/qmake.conf

Change-Id: Ib39ea7bd42f5ae12e82a3bc59a66787a16bdfc61
This commit is contained in:
Simon Hausmann 2014-12-10 07:58:06 +01:00
commit 015002fec9
154 changed files with 4692 additions and 1978 deletions

13
configure vendored
View File

@ -4719,8 +4719,8 @@ if [ "$CFG_DBUS" != "no" ]; then
fi
QMakeVar set QT_HOST_CFLAGS_DBUS "$QT_CFLAGS_DBUS"
else
if [ "$CFG_DBUS" = "auto" ]; then
CFG_DBUS=no
if [ "$CFG_DBUS" != "linked" ]; then
CFG_DBUS=runtime
elif [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
# CFG_DBUS is "yes" or "linked" here
@ -5007,10 +5007,11 @@ if [ "$CFG_LIBUDEV" != "no" ]; then
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists libudev 2>/dev/null; then
QMAKE_INCDIR_LIBUDEV=`$PKG_CONFIG --cflags-only-I libudev 2>/dev/null | sed -e 's,^-I,,g' -e 's, -I, ,g'`
QMAKE_LIBS_LIBUDEV=`$PKG_CONFIG --libs libudev 2>/dev/null`
QMAKE_CFLAGS_LIBUDEV=`$PKG_CONFIG --cflags libudev 2>/dev/null`
QMakeVar set QMAKE_INCDIR_LIBUDEV "$QMAKE_INCDIR_LIBUDEV"
QMakeVar set QMAKE_LIBS_LIBUDEV "$QMAKE_LIBS_LIBUDEV"
fi
if compileTest unix/libudev "libudev" $QMAKE_INCDIR_LIBUDEV $QMAKE_LIBS_LIBUDEV; then
if compileTest unix/libudev "libudev" $QMAKE_CFLAGS_LIBUDEV $QMAKE_LIBS_LIBUDEV; then
CFG_LIBUDEV=yes
QT_CONFIG="$QT_CONFIG libudev"
elif [ "$CFG_LIBUDEV" = "yes" ]; then
@ -5561,7 +5562,7 @@ if [ "$CFG_OPENSSL" != "no" ]; then
CFG_OPENSSL=yes
fi
else
if ( [ "$CFG_OPENSSL" = "yes" ] || [ "$CFG_OPENSSL" = "linked" ] ) && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ] && [ "$XPLATFORM_ANDROID" = "no" ]; then
if ( [ "$CFG_OPENSSL" = "yes" ] || [ "$CFG_OPENSSL" = "linked" ] ) && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "OpenSSL support cannot be enabled due to functionality tests!"
echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
@ -6123,6 +6124,10 @@ s/icpc version \([0-9]*\)\.\([0-9]*\)\.\([0-9]*\) .*$/QT_ICC_MAJOR_VERSION=\1; Q
QT_GCC_MINOR_VERSION=`echo $COMPILER_VERSION | sed 's,^\([0-9]*\)\.\([0-9]*\).*,\2,'`
QT_GCC_PATCH_VERSION=0
;;
*)
QT_GCC_MAJOR_VERSION=$COMPILER_VERSION
QT_GCC_MINOR_VERSION=0
QT_GCC_PATCH_VERSION=0
esac
;;

474
dist/changes-5.4.0 vendored
View File

@ -16,30 +16,430 @@ Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
****************************************************************************
* Library *
* Deprecation Notice *
****************************************************************************
- The Q_COMPILER_xxx macros for C++14 compiler features introduced in Qt
5.3 are deprecated and will not be updated for new compilers either.
User code should be changed to use the macros from Standing Document 6
instead:
http://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations.
This does not affect C++11 feature macros.
****************************************************************************
* Important Behavior Changes *
****************************************************************************
- QExplicitelySharedDataPointer's copy constructor which performs a
static_cast from "X *" to "T *" (when constructing a
QExplicitlySharedDataPointer<T> from a QExplicitlySharedDataPointer<X>)
doesn't perform a static_cast from "X *" to "T *" any more. Instead, an
implicit cast is now performed. This change will break compilation of code
that relied on the downcast (i.e. cast towards a more derived type) of the
templated type when copy constructing a QExplicitelySharedDataPointer
object. Please refer to the class documentation for more information about
this issue and a workaround to keep old code compiling.
- QImageReader now automatically rotates JPEG images according to Exif
orientation
- [QTBUG-18980] HarfBuzz-NG is now the default shaper on all platforms.
This results in a better shaping results for various languages, better
performance, and lower memory consumption.
- [QTBUG-41858] Changed QStringRef::right() to be consistent with
QString::right(). The function now returns the N right-most characters,
like the documentation already claimed.
- The mutable Java-style iterators like QListMutableIterator and
QHashMutableIterator no longer set the parent container to unsharable
mode. If you create a copy of the container being iterated on after the
iterator, any changes done with the iterator might affect the copy too.
- Logging (including qDebug and qWarning):
* Support for the deprecated environment variables QT_NO_JOURNALD_LOG
and QT_ANDROID_PLAIN_LOG has been removed. Instead, set
QT_LOGGING_TO_CONSOLE to 1 to force logging to the console (stderr).
Set that variable to 0 to force logging to the system-specific event
log (if any).
* [QTCREATORBUG-12564] Log output will now go to the system log (if
support for it was compiled into Qt) if the application has no
controlling terminal or console window. Set QT_LOGGING_TO_CONSOLE to 1
to force logging to go to stderr.
- QSettings:
* [QTBUG-41812] QSettings::value() now returns an invalid QVariant when
passing an empty key. The code path ran into an assert, which was only
noticeable in debug builds.
* [QTBUG-21739] The locking mechanism inside QSettings has changed
and is no longer compatible with the one of previous versions of
Qt. There might be corruption if two applications running different
versions of Qt are writing to the same config file at the same
time. You must also now have write permissions in the directory
containing the settings file in order to write settings.
****************************************************************************
* Library *
****************************************************************************
QtConcurrent
------------
- [QTBUG-17220] run() now optionally takes as its first argument the
QThreadPool to run the task on.
QtCore
------
- Added QEnableSharedFromThis, a class that allows obtaining a
QSharedPointer for an object already managed by a shared pointer.
- Added qHashBits() to aid implementing qHash() overloads for custom
types.
- Added new QByteArrayList class.
- Added QStorageInfo class to retrive information about mounted volumes
and drives
- Logging:
* QT_MESSAGE_PATTERN can include a backtrace using %{backtrace}
* QT_MESSAGE_PATTERN can include a timestamp using %{time}. By
default, this shows the time in ISO format (YYYY-MM-DDTHH:mm:ss),
but a different format string can be specified in the tag (e.g.,
%{time YYYYMMDDHHmmsszzz}). If the format is "process", Qt will
display the elapsed time since the process started.
* Added QtMsgType argument to QLoggingCategory constructor and
Q_LOGGING_CATEGORY macro that controls the default category
configuration.
* File, line, function information are not recorded anymore for logging
statements in release builds. Set QT_MESSAGELOGCONTEXT explicitly to
enable recording in all configurations.
- QAbstractProxyModel:
* [QTBUG-39549] QAbstractProxyModel now forwards the drop-related API.
- QByteArray:
* Added convenience methods to convert directly to and from std::string.
* Fixed a bug that would cause QByteArray to stop converting toUpper or
toLower at the first embedded null character.
- QCommandLineParser:
* Added addOptions() method.
- QElapsedTimer:
* Is no longer a POD; its default constructor now initializes the object to
an invalid QElapsedTimer
- QFlags:
* [QTBUG-39786] Added initializer_list constructor
- QFuture:
* [QTBUG-17220] Can now be used with any QThreadPool, not just
globalInstance().
- QPair:
* Can now be used in C++11 constexpr contexts.
- QSaveFile:
* Now follows symbolic links when writing to a link instead of
replacing the link with the contents.
- QSettings:
* [QTBUG-21739] Fixed data loss while writing the config to the disk
fails.
- QStandardPaths:
* [QTBUG-38483] QStandardPaths now has new enumeration values
AppDataLocation, AppLocalDataLocation to be able to differentiate
between roaming and local paths on the Windows operating system.
DataLocation is deprecated in favor of AppDataLocation.
- QString:
* QString can now split a string to a list of QStringRef.
* Added the QStringRef::split() function
- QTextStream:
* QTextStream now uses group separators when writing floating-point
numbers when the locale is not the C locale. The old behavior can be
restored by setting QLocale::OmitGroupSeparator on the locale.
- QTimer:
* [QTBUG-26406] Implemented new style connect syntax, including
functors, in QTimer::singleShot
- QUrl:
* QUrl::fromLocalFile now returns an empty URL if the input string is
empty.
- QVariant:
* [QTBUG-40363] Fixed ordered comparison between QVariants that do not
match but produce identical toString output.
- QVector:
* Added removeOne() and removeAll() for QList compatibility.
- QWeakPointer:
* Added lock() method for std::weak_ptr compatibility.
* Added member-swap function.
- QtJson:
* [QTBUG-26606] QJsonArray and QJsonObject now supports C++11
initializer lists.
- QtMath:
* Introduced qNextPowerOfTwo methods.
QtDBus
------
- Blocking calls that take a long time will now generate a warning. The
time taken may be tuned using the environment variables
Q_DBUS_BLOCKING_CALL_MAIN_THREAD_WARNING_MS and
Q_DBUS_BLOCKING_CALL_OTHER_THREAD_WARNING_MS. The value represents (in
milliseconds) how long before a blocking call is warned about. A value
below zero disables the warning, a value of zero will warn about all
blocking calls.
QtGui
-----
- Added QPixelFormat class.
- Added QOpenGLWidget class.
- Added QOpenGLWindow class.
- Added QRasterWindow class.
- QOpenGLContext is now able to adopt existing native contexts.
- [QTBUG-38168] QtGui's OpenGL headers are now automatically including the
highest available header (gl31.h, gl3.h or gl2.h) in OpenGL ES builds.
- [QTBUG-36483] Dynamic OpenGL implementation loading is now supported on
Windows. This requires Qt to be configured with -opengl dynamic.
- [QTBUG-39583] Keymaps are now changeable at runtime when using eglfs.
- [QTBUG-40841] environment variable QT_DBL_CLICK_DIST customizes the
amount of movement allowed when detecting a double click.
- [QTBUG-37552] The eglfs mouse cursor properly resets the array buffer
from now on to avoid rendering issues.
- [QTBUG-40093] QWindow::close() is changed to send a QCloseEvent which
must be accepted before destroy() will be called.
- Clipboard:
* [QTBUG-41852] Fixed a memory leak in setMimeData() when the platform
plugin did not support the requested mode.
- Painting:
*[QTBUG-41413] Fixed some very rare cases of mismatched raster modes
in QPainter.
- QEvent:
* [QTBUG-38858] The debug output for events has been significantly
improved.
- QFont:
* [QTBUG-22814][QTBUG-22946] QFont now serializes its data properly,
without any data loss.
- QGuiApplication:
* Add support for -icon command line argument on X11, add -qwindowicon
on all platforms.
* Added QGuiApplication::screenRemoved signal to inform that a screen
has been removed, before Qt reacts to it.
- QImage:
* [QTBUG-25998] Added support for 10-bit per color channel image
formats.
- QImageReader now automatically rotates JPEG images according to Exif orientation
- QOpenGLBuffer:
* [QTBUG-38168] Added QOpenGLBuffer::mapBufferRange().
- QOpenGLFramebufferObject:
* Introduced an argument to QOpenGLFramebufferObject::toImage() to save
mirroring the result.
* Added support 10-bit per color channels formats as the internal
framebuffer format, making it possible to render in that precision.
- QOpenGLTextureCache:
* Added support for uploading common QImage formats directly to OpenGL,
if supported by the OpenGL implementation.
- QPicture:
* [QTBUG-20578] QPicture now serializes its data properly by also
accounting for QDataStream versions greater than Qt 4.5.
- Tablet support:
* [QTBUG-39458] Added buttons to QTabletEvent.
* [QTBUG-39666] Events correctly identify the tool.
* [QTBUG-39570][QTBUG-40469] Corrected valuator ranges across platforms.
* Better support for non-Wacom devices.
* Better manual test to verify more features.
- Text:
* [QTBUG-41372] Fixed regression when rendering Uchen text in WebKit
on Windows.
* Fixed use of uninitialized memory in the FreeType font engine
QtNetwork
---------
- QNetworkAccessManager:
* Fixed behavior of upload QIODevice that generate data on readyRead()
for HTTP PUT/POST
- QSsl:
* QSsl::SecureProtocols now also excludes SSLv3
- QSslCertificate:
* Can now be used as a key in QSet/QHash.
- QSslError:
* Can now be used in QSet/QHash.
- QSslSocket:
* [QTBUG-28471] Added support for finding the version of SSL/TLS in
use by a connection.
* Added accessors for the version of OpenSSL used at build-time. This
will help when debugging problems caused by a mismatch with the
run-time version.
* [QTBUG-1565] Support for loading PKCS#12 bundles was added. These are
often used to conveniently transport keys and certificates,
particularly when making use of client certificates.
QtPrintSupport
--------------
- QPrinter:
* [QTBUG-11332] Added duplex support for Windows and OS X.
QtSql
-----
- qsql ibase: fix memory corruption due to LONG being 4 bytes in firebird.
- QSqlDriver::dbmsType(): New method reports DBMS type. Especially useful when using ODBC.
- ibase: Fixed memory corruption due to LONG being 4 bytes in firebird.
- QSqlDriver:
* Add support for determining DBMS type from SQL driver using
QSqlDriver::dbmsType()
QtTest
------
- Tests now output build information.
QtWidgets
---------
- All widgets with a setReadOnly method now send a ReadOnlyChange event
(e.g., for app-specific palette changes)
- [QTBUG-32888] Accessibility for widgets is now included in the widget
library instead of being a separate plugin. For static builds this means
that libqtaccessiblewidgets is no longer required.
- [QTBUG-39814] Accessors for Qt::MouseEventSource and Qt::MouseEventFlags
are now available in QGraphicsSceneMouseEvent.
- QComboBox:
* [QTBUG-33537] Fixed positions of items when QComboBox is set as
editable in Fusion style.
* [QTBUG-33537] Fixed updating appearance of popup menu when changing
the editable state of the combo box.
- QDialog / Windows:
* [QTBUG-2027] Dialogs can now be menuless.
- QGraphicsScene:
* Added the minimumRenderSize property which can be used to speed up
rendering by not painting items smaller than a give size.
* The removal of items when using the linear index is now more
efficient.
- QLayout:
* [QTBUG-37673] Widgets and dialogs containing layouts with
heightForWidth (such as a label with word wrap) will no longer get a
minimum size of 0x0.
- QLineEdit:
* [QTBUG-40287] The signal textEdited() is now emitted when the user
clicks the clear button created by setClearButtonEnabled() as well.
- QMainWindow:
* [QTBUG-40410] Dock widgets will now be resized properly when the
central widget has a fixed size.
- QPlainTextEdit:
* [QTBUG-36415] Fixed a crash when using full width selections and
issuing a complex undo command chain which removes and inserts an
empty block in one go.
* [QTBUG-40347] Fixed a possible divide by zero crash when font metrics
were missing for the font.
- QTabBar:
* Added changeCurrentOnDrag property.
- QTableView / QTableWidget:
* [QTBUG-29239] currentIndex() now reflects the top left cell when in a
span.
- QTreeView:
* Indentation is now style-dependent by default.
* Added resetIndentation().
- Styles:
* Allow overriding standardIcon() in a proxy style
****************************************************************************
* Platform Specific Changes *
****************************************************************************
- Several QPA logging categories are added under qt.qpa to enable logging
of various platform-specific details. qt.qpa.input is now used
consistently.
Android
-------
- [QTBUG-36019] Enable using native style also when Ministro deployment
mechanism is not in use.
- [QTBUG-29069] Release all windows when the application is suspended.
- Added Gradle support to build the APK.
- [QTBUG-39688] Back key no longer kills the application when no window is
visible.
- [QTBUG-41365] Default open-source license for Qt for Android is now
LGPLv3. For compatibility with the LGPLv2.1 license, add
"-no-android-style-assets" to your configuration.
- [QTBUG-32399] Input panels are now hidden when focus changes to an object
that does not accept input.
- [QTBUG-41854] Added support for QClipboard::clear()
- [QTBUG-41852] Fixed memory leak in QClipboard::setMimeData()
- [QTBUG-41817] QClipboard::mimeData() now returns an empty object instead
of null pointer from QClipboard when clipboard is empty for consistency
with other platforms.
- New bearer plugin. It's now possible to get more information about the
different network configurations on Android.
- Important Behavior Changes:
* [QTBUG-36274] The main event loop is now stopped when the app is
suspended
iOS
---
- [QTBUG-39097] Accessibility was added to the iOS platform port. This
enables Qt applications to be read by VoiceOver on iOS devices.
- [QTBUG-42276] Fixed path to QStandardPaths::DataLocation. Until now,
DataLocation was pointing to the Document directory. With this patch,
it will return the more accurate Library/Application Support.
Applications making use of DataLocation should move these data to the
new location. This can be done using the path provided by
DocumentLocation as the source path.
- [QTBUG-41458] screen resolution update after device rotation now works.
- [QTBUG-42345] fixed crash on startup on iOS 7.1
- iOS is now using fat builds with both 32-, and 64-bit support.
- New launch screen added to support iPhone6/6+.
- QtQuick Controls now support native text selection and popup menus.
- Virtual keyboard visibility is now automatically managed by the platform plugin.
- Default theme fonts now uses Dynamic Type, which is based on user system settings.
Linux/XCB
---------
- [QTBUG-35832] Fixed transparency of tray icons in cases where there
is no alpha channel or system tray visual.
- environment variables QT_XCB_DEBUG_XINPUT and
QT_XCB_DEBUG_XINPUT_DEVICES are deprecated and replaced with logging
categories qt.qpa.input and qt.qpa.input.devices respectively
- [QTBUG-39572] Wacom touch devices are now working correctly.
- [QTBUG-42249] A path to a font file can now contain non-Latin characters.
OS X
----
@ -47,17 +447,51 @@ OS X
- OS X 10.10 is now supported.
- QMacStyle has been updated with better OS 10.10 support.
- The Qt binary packages are now configured with C++11 enabled.
- [QTBUG-41208] Fixed detection of writing system support in fonts for
some scripts such as Mkhedruli.
- Fixed menu item shortcuts without keyboard modifiers.
- [QTBUG-31301] Drag-and-drop QMimeData requests are now delayed until
drop time.
- [QTBUG-10899] Added support for ApplicationState
capability. Application can now detect when an application states
have changed as well when the dock icon has been clicked.
- Fonts:
* [QTBUG-40986][QTBUG-40549] Fixed missing glyph box shown in place of
some uncommon Unicode code points.
Windows
-------
- [QTBUG-38259] Changed configure defaults so that Qt5Core does not
link against ICU libraries anymore. Pass '-icu' to enable it.
- [QTBUG-38259] Changed configure defaults so that Qt5Core does not link
against ICU libraries anymore. Pass '-icu' to enable it.
- [QTBUG-35432][QTBUG-23687] Command line parsing on Windows now uses
the WinAPI function CommandLineToArgvW() to exactly match the quoting
behavior used by the majority of applications.
- Fonts:
* [QTBUG-41783] Fix off-by-one in font descent when using the
DirectWrite font engine.
* [QTBUG-39961] Set default fallback font to MS Shell Dlg 2 instead of
Arial.
****************************************************************************
* Tools *
* Compiler Specific Changes *
****************************************************************************
- Release builds with Microsoft Visual Studio 2013 now enable the
standard-conforming C and C++ strict string behavior. This option will
be enabled in all builds with future Visual Studio versions.
Non-conforming code should be fixed for maximum portability and
correctness. See http://msdn.microsoft.com/en-us/library/dn449508.aspx
for more information.
****************************************************************************
* Tools *
****************************************************************************
- [QTBUG-30900] The obsolete findtr script was removed.
configure & build system
------------------------
@ -70,6 +504,12 @@ configure & build system
from a pre-existing Qt installation.
- [QTBUG-41267] Fixed parallelized (jom) -debug-and-release builds.
moc
---
- Fixed "zero as null pointer constant" warnings in moc's generated
code.
qmake
-----
@ -90,3 +530,25 @@ qmake
- QMAKE_EXTRA_COMPILERS' commands and depend_command are no longer mangled.
Use $$shell_path() and $$shell_quote() to prepare the commands correctly.
- Added link-time optimization support for Clang, GCC and ICC. CONFIG+=ltgc.
rcc
---
- rcc now supports an optional, two-pass compilation that improves build
times for large resource bundles. This feature can be enabled by adding
"CONFIG += resources_big" to your .pro file. Note that this feature may
interfere with builds that enable link-time code generation or other
optimization techniques.
****************************************************************************
* Third-party libraries *
****************************************************************************
- ANGLE has been upgraded to version 2.1, bringing partial support for
OpenGL ES3 over Direct3D 11, numerous bug fixes, and several new vendor
extensions.
- [QTBUG-40649][QTBUG-40658][QTBUG-41031][QTBUG-41081][QTBUG-41308][QTBUG-
41563] ANGLE updated to 2.1~f8602ad91e4f
- [QTBUG-41031] The ANGLE D3D11 renderer is now enabled by default. Systems
which cannot use the new renderer will automatically fall back to the D3D9
renderer at runtime.

View File

@ -9,8 +9,7 @@ dita.metadata.default.audience = programmer
#Set the main Qt index.html
navigation.homepage = "Qt $QT_VER"
buildversion = "Qt $QT_VERSION Reference Documentation"
sourcedirs += includes
url = http://qt-project.org/doc/qt-5
url = http://doc.qt.io/qt-5

View File

@ -38,7 +38,7 @@
\title external: Publishing Applications to Ovi Store
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator
\externalpage http://doc.qt.io/qtcreator
\title external: Qt Creator Manual
*/
/*!
@ -50,31 +50,31 @@
\title external: Qt Mobility QML Plugins
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-managing.html
\externalpage http://doc.qt.io/qtcreator/creator-project-managing.html
\title external: Creating Qt Projects in Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-building-running.html
\externalpage http://doc.qt.io/qtcreator/creator-building-running.html
\title external: Building and Running Applications in Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-running-targets.html
\externalpage http://doc.qt.io/qtcreator/creator-running-targets.html
\title external: Set Compiler Targets in Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-build-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-build-settings.html
\title external: Build Settings in Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-run-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-run-settings.html
\title external: Run Settings in Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-using-qt-designer.html
\externalpage http://doc.qt.io/qtcreator/creator-using-qt-designer.html
\title external: Designer in Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugging.html
\externalpage http://doc.qt.io/qtcreator/creator-debugging.html
\title external: Debugging Applications in Creator
*/
/*!
@ -90,6 +90,6 @@
\title external: Qt Mobility Examples
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-overview.html
\externalpage http://doc.qt.io/qtcreator/creator-overview.html
\title external: Qt Creator Overview
*/

View File

@ -26,472 +26,472 @@
****************************************************************************/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-deployment-qnx.html
\externalpage http://doc.qt.io/qtcreator/creator-deployment-qnx.html
\title Qt Creator: Deploying Applications to QNX Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-baremetal.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-baremetal.html
\title Qt Creator: Connecting Bare Metal Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-bb10.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-bb10.html
\title Qt Creator: Connecting BlackBerry 10 Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-qnx.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-qnx.html
\title Qt Creator: Connecting QNX Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-deployment-bb10.html
\externalpage http://doc.qt.io/qtcreator/creator-deployment-bb10.html
\title Qt Creator: Deploying Applications to BlackBerry 10 Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-generic-linux.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-generic-linux.html
\title Qt Creator: Connecting Embedded Linux Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-deployment-embedded-linux.html
\externalpage http://doc.qt.io/qtcreator/creator-deployment-embedded-linux.html
\title Qt Creator: Deploying Applications to Embedded Linux Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-faq.html
\externalpage http://doc.qt.io/qtcreator/creator-faq.html
\title Qt Creator: FAQ
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-tips.html
\externalpage http://doc.qt.io/qtcreator/creator-tips.html
\title Qt Creator: Tips and Tricks
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-help.html
\externalpage http://doc.qt.io/qtcreator/creator-help.html
\title Qt Creator: Using the Help Mode
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-quick-tour.html
\externalpage http://doc.qt.io/qtcreator/creator-quick-tour.html
\title Qt Creator: User Interface
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-cli.html
\externalpage http://doc.qt.io/qtcreator/creator-cli.html
\title Qt Creator: Using Command Line Options
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-task-lists.html
\externalpage http://doc.qt.io/qtcreator/creator-task-lists.html
\title Qt Creator: Showing Task List Files in Issues Pane
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-managing-sessions.html
\externalpage http://doc.qt.io/qtcreator/creator-project-managing-sessions.html
\title Qt Creator: Managing Sessions
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-external.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-external.html
\title Qt Creator: Using External Tools
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-version-control.html
\externalpage http://doc.qt.io/qtcreator/creator-version-control.html
\title Qt Creator: Using Version Control Systems
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-keyboard-shortcuts.html
\externalpage http://doc.qt.io/qtcreator/creator-keyboard-shortcuts.html
\title Qt Creator: Keyboard Shortcuts
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/quick-screens.html
\externalpage http://doc.qt.io/qtcreator/quick-screens.html
\title Qt Creator: Creating Screens
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-qml-application.html
\externalpage http://doc.qt.io/qtcreator/creator-qml-application.html
\title Qt Creator: Creating a Qt Quick Application
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/quick-export-to-qml.html
\externalpage http://doc.qt.io/qtcreator/quick-export-to-qml.html
\title Qt Creator: Exporting Designs from Graphics Software
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-qml-modules-with-plugins.html
\externalpage http://doc.qt.io/qtcreator/creator-qml-modules-with-plugins.html
\title Qt Creator: Using QML Modules with Plugins
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-visual-editor.html
\externalpage http://doc.qt.io/qtcreator/creator-visual-editor.html
\title Qt Creator: Developing Qt Quick Applications
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-using-qt-quick-designer.html
\externalpage http://doc.qt.io/qtcreator/creator-using-qt-quick-designer.html
\title Qt Creator: Using Qt Quick Designer
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/quick-projects.html
\externalpage http://doc.qt.io/qtcreator/quick-projects.html
\title Qt Creator: Creating Qt Quick Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/quick-components.html
\externalpage http://doc.qt.io/qtcreator/quick-components.html
\title Qt Creator: Creating Components
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/qt-quick-toolbars.html
\externalpage http://doc.qt.io/qtcreator/qt-quick-toolbars.html
\title Qt Creator: Using Qt Quick Toolbars
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/quick-buttons.html
\externalpage http://doc.qt.io/qtcreator/quick-buttons.html
\title Qt Creator: Creating Buttons
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/quick-scalable-image.html
\externalpage http://doc.qt.io/qtcreator/quick-scalable-image.html
\title Qt Creator: Creating Scalable Buttons and Borders
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-options.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-options.html
\title Qt Creator: Configuring the Editor
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-functions.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-functions.html
\title Qt Creator: Writing Code
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-coding-navigating.html
\externalpage http://doc.qt.io/qtcreator/creator-coding-navigating.html
\title Qt Creator: Working in Edit Mode
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-highlighting.html
\externalpage http://doc.qt.io/qtcreator/creator-highlighting.html
\title Qt Creator: Semantic Highlighting
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-checking-code-syntax.html
\externalpage http://doc.qt.io/qtcreator/creator-checking-code-syntax.html
\title Qt Creator: Checking Code Syntax
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-completing-code.html
\externalpage http://doc.qt.io/qtcreator/creator-completing-code.html
\title Qt Creator: Completing Code
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-codepasting.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-codepasting.html
\title Qt Creator: Pasting and Fetching Code Snippets
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-macros.html
\externalpage http://doc.qt.io/qtcreator/creator-macros.html
\title Qt Creator: Using Text Editing Macros
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-fakevim.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-fakevim.html
\title Qt Creator: Using FakeVim Mode
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-indenting-code.html
\externalpage http://doc.qt.io/qtcreator/creator-indenting-code.html
\title Qt Creator: Indenting Text or Code
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-finding.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-finding.html
\title Qt Creator: Finding and Replacing
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-refactoring.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-refactoring.html
\title Qt Creator: Refactoring
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-locator.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-locator.html
\title Qt Creator: Searching with the Locator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-coding.html
\externalpage http://doc.qt.io/qtcreator/creator-coding.html
\title Qt Creator: Coding
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-options-text.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-options-text.html
\title Qt Creator: Specifying Text Editor Settings
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-finding-overview.html
\externalpage http://doc.qt.io/qtcreator/creator-finding-overview.html
\title Qt Creator: Finding
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-mime-types.html
\externalpage http://doc.qt.io/qtcreator/creator-mime-types.html
\title Qt Creator: Editing MIME Types
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-qml-debugging-example.html
\externalpage http://doc.qt.io/qtcreator/creator-qml-debugging-example.html
\title Qt Creator: Debugging a Qt Quick Example Application
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugging-example.html
\externalpage http://doc.qt.io/qtcreator/creator-debugging-example.html
\title Qt Creator: Debugging a C++ Example Application
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugger-engines.html
\externalpage http://doc.qt.io/qtcreator/creator-debugger-engines.html
\title Qt Creator: Setting Up Debugger
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugging-qml.html
\externalpage http://doc.qt.io/qtcreator/creator-debugging-qml.html
\title Qt Creator: Debugging Qt Quick Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugging.html
\externalpage http://doc.qt.io/qtcreator/creator-debugging.html
\title Qt Creator: Debugging
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugger-operating-modes.html
\externalpage http://doc.qt.io/qtcreator/creator-debugger-operating-modes.html
\title Qt Creator: Launching the Debugger
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debug-mode.html
\externalpage http://doc.qt.io/qtcreator/creator-debug-mode.html
\title Qt Creator: Interacting with the Debugger
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debugging-helpers.html
\externalpage http://doc.qt.io/qtcreator/creator-debugging-helpers.html
\title Qt Creator: Using Debugging Helpers
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-troubleshooting-debugging.html
\externalpage http://doc.qt.io/qtcreator/creator-troubleshooting-debugging.html
\title Qt Creator: Troubleshooting Debugger
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/index.html
\externalpage http://doc.qt.io/qtcreator/index.html
\title Qt Creator Manual
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-advanced.html
\externalpage http://doc.qt.io/qtcreator/creator-advanced.html
\title Qt Creator: Advanced Use
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-os-supported-platforms.html
\externalpage http://doc.qt.io/qtcreator/creator-os-supported-platforms.html
\title Qt Creator: Supported Platforms
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-connecting-mobile.html
\externalpage http://doc.qt.io/qtcreator/creator-connecting-mobile.html
\title Qt Creator: Connecting Mobile Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-usability.html
\externalpage http://doc.qt.io/qtcreator/creator-usability.html
\title Qt Creator: Optimizing Applications for Mobile Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-acknowledgements.html
\externalpage http://doc.qt.io/qtcreator/creator-acknowledgements.html
\title Qt Creator: Acknowledgements
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-help-overview.html
\externalpage http://doc.qt.io/qtcreator/creator-help-overview.html
\title Qt Creator: Getting Help
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/technical-support.html
\externalpage http://doc.qt.io/qtcreator/technical-support.html
\title Qt Creator: Technical Support
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-overview.html
\externalpage http://doc.qt.io/qtcreator/creator-overview.html
\title Qt Creator: IDE Overview
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-testing.html
\externalpage http://doc.qt.io/qtcreator/creator-testing.html
\title Qt Creator: Debugging and Analyzing
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-deployment.html
\externalpage http://doc.qt.io/qtcreator/creator-deployment.html
\title Qt Creator: Deploying to Mobile Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-tutorials.html
\externalpage http://doc.qt.io/qtcreator/creator-tutorials.html
\title Qt Creator: Tutorials
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-known-issues.html
\externalpage http://doc.qt.io/qtcreator/creator-known-issues.html
\title Qt Creator: Known Issues
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-design-mode.html
\externalpage http://doc.qt.io/qtcreator/creator-design-mode.html
\title Qt Creator: Designing User Interfaces
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-publish-ovi.html
\externalpage http://doc.qt.io/qtcreator/creator-publish-ovi.html
\title Qt Creator: Publishing
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-glossary.html
\externalpage http://doc.qt.io/qtcreator/creator-glossary.html
\title Qt Creator: Glossary
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-getting-started.html
\externalpage http://doc.qt.io/qtcreator/creator-getting-started.html
\title Qt Creator: Getting Started
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-analyzer.html
\externalpage http://doc.qt.io/qtcreator/creator-analyzer.html
\title Qt Creator: Detecting Memory Leaks
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-cache-profiler.html
\externalpage http://doc.qt.io/qtcreator/creator-cache-profiler.html
\title Qt Creator: Profiling Function Execution
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-running-valgrind-remotely.html
\externalpage http://doc.qt.io/qtcreator/creator-running-valgrind-remotely.html
\title Qt Creator: Running Valgrind Tools Remotely
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-valgrind-overview.html
\externalpage http://doc.qt.io/qtcreator/creator-valgrind-overview.html
\title Qt Creator: Using Valgrind Code Analysis Tools
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-analyze-mode.html
\externalpage http://doc.qt.io/qtcreator/creator-analyze-mode.html
\title Qt Creator: Analyzing Code
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-qml-performance-monitor.html
\externalpage http://doc.qt.io/qtcreator/creator-qml-performance-monitor.html
\title Qt Creator: Profiling QML Applications
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-deploying-android.html
\externalpage http://doc.qt.io/qtcreator/creator-deploying-android.html
\title Qt Creator: Deploying Applications to Android Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-ios.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-ios.html
\title Qt Creator: Connecting iOS devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-android.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-android.html
\title Qt Creator: Connecting Android Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-build-example-application.html
\externalpage http://doc.qt.io/qtcreator/creator-build-example-application.html
\title Qt Creator: Building and Running an Example
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-generic.html
\externalpage http://doc.qt.io/qtcreator/creator-project-generic.html
\title Qt Creator: Setting Up a Generic Project
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-sharing-project-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-sharing-project-settings.html
\title Qt Creator: Sharing Project Settings
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-opening.html
\externalpage http://doc.qt.io/qtcreator/creator-project-opening.html
\title Qt Creator: Opening Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-managing.html
\externalpage http://doc.qt.io/qtcreator/creator-project-managing.html
\title Qt Creator: Managing Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-cmake.html
\externalpage http://doc.qt.io/qtcreator/creator-project-cmake.html
\title Qt Creator: Setting Up a CMake Project
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-targets.html
\externalpage http://doc.qt.io/qtcreator/creator-targets.html
\title Qt Creator: Adding Kits
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-tool-chains.html
\externalpage http://doc.qt.io/qtcreator/creator-tool-chains.html
\title Qt Creator: Adding Compilers
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-qbs.html
\externalpage http://doc.qt.io/qtcreator/creator-project-qbs.html
\title Qt Creator: Setting Up a Qbs Project
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-creating.html
\externalpage http://doc.qt.io/qtcreator/creator-project-creating.html
\title Qt Creator: Creating Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-wizards.html
\externalpage http://doc.qt.io/qtcreator/creator-project-wizards.html
\title Qt Creator: Adding New Custom Wizards
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-projects-autotools.html
\externalpage http://doc.qt.io/qtcreator/creator-projects-autotools.html
\title Qt Creator: Setting Up an Autotools Project
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-configuring-projects.html
\externalpage http://doc.qt.io/qtcreator/creator-configuring-projects.html
\title Qt Creator: Configuring Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-build-process-customizing.html
\externalpage http://doc.qt.io/qtcreator/creator-build-process-customizing.html
\title Qt Creator: Customizing the Build Process
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-build-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-build-settings.html
\title Qt Creator: Specifying Build Settings
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-code-style-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-code-style-settings.html
\title Qt Creator: Specifying Code Style Settings
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-run-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-run-settings.html
\title Qt Creator: Specifying Run Settings
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-qmake-libraries.html
\externalpage http://doc.qt.io/qtcreator/creator-project-qmake-libraries.html
\title Qt Creator: Adding Libraries to Projects
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-other.html
\externalpage http://doc.qt.io/qtcreator/creator-project-other.html
\title Qt Creator: Using Other Build Systems
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-running-targets.html
\externalpage http://doc.qt.io/qtcreator/creator-running-targets.html
\title Qt Creator: Running on Multiple Platforms
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-build-dependencies.html
\externalpage http://doc.qt.io/qtcreator/creator-build-dependencies.html
\title Qt Creator: Specifying Dependencies
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-building-running.html
\externalpage http://doc.qt.io/qtcreator/creator-building-running.html
\title Qt Creator: Building and Running
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-editor-settings.html
\externalpage http://doc.qt.io/qtcreator/creator-editor-settings.html
\title Qt Creator: Specifying Editor Settings
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-project-qmake.html
\externalpage http://doc.qt.io/qtcreator/creator-project-qmake.html
\title Qt Creator: Adding Qt Versions
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-building-targets.html
\externalpage http://doc.qt.io/qtcreator/creator-building-targets.html
\title Qt Creator: Building for Multiple Platforms
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-using-qt-designer.html
\externalpage http://doc.qt.io/qtcreator/creator-using-qt-designer.html
\title Qt Creator: Developing Widget Based Applications
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-writing-program.html
\externalpage http://doc.qt.io/qtcreator/creator-writing-program.html
\title Qt Creator: Creating a Qt Widget Based Application
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/adding-plugins.html
\externalpage http://doc.qt.io/qtcreator/adding-plugins.html
\title Qt Creator: Adding Qt Designer Plugins
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-configuring.html
\externalpage http://doc.qt.io/qtcreator/creator-configuring.html
\title Qt Creator: Configuring Qt Creator
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-debuggers.html
\externalpage http://doc.qt.io/qtcreator/creator-debuggers.html
\title Qt Creator: Adding Debuggers
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-mobile-app-tutorial.html
\externalpage http://doc.qt.io/qtcreator/creator-mobile-app-tutorial.html
\title Qt Creator: Creating a Mobile Application
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-diff-editor.html
\externalpage http://doc.qt.io/qtcreator/creator-diff-editor.html
\title Qt Creator: Comparing Files
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-beautifier.html
\externalpage http://doc.qt.io/qtcreator/creator-beautifier.html
\title Qt Creator: Beautifying Source Code
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-winrt.html
\externalpage http://doc.qt.io/qtcreator/creator-developing-winrt.html
\title Qt Creator: Connecting Windows Runtime Devices
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-clang-codemodel.html
\externalpage http://doc.qt.io/qtcreator/creator-clang-codemodel.html
\title Qt Creator: Parsing C++ Files
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-quick-ui-forms.html
\externalpage http://doc.qt.io/qtcreator/creator-quick-ui-forms.html
\title Qt Creator: Qt Quick UI Forms
*/
/*!
\externalpage http://qt-project.org/doc/qtcreator/creator-clang-static-analyzer.html
\externalpage http://doc.qt.io/qtcreator/creator-clang-static-analyzer.html
\title Qt Creator: Using Clang Static Analyzer
*/

View File

@ -1,4 +1,4 @@
naturallanguage = en_US
naturallanguage = en
outputencoding = UTF-8
sourceencoding = UTF-8

View File

@ -0,0 +1,84 @@
# HTML footer for qt.io
HTML.footer += \
"</div>\n" \
"</div>\n" \
"</div>\n" \
"</div>\n" \
"</div>\n" \
"<div id=\"footer\">\n" \
"<footer id=\"footerbar\">\n" \
" <div class=\"footer-main\">\n" \
" <div class=\"container clearfix\">\n" \
" <nav class=\"footer-nav clearfix\">\n" \
" <div class=\"menu-footer-menu-container\"><ul id=\"menu-footer-menu\" class=\"menu\"><li id=\"menu-item-1350\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1350\"><a href=\"http://qt.io/about-us/\">About us</a>\n" \
"<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-1353\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1353\"><a href=\"http://qt.io/events/\">Events</a></li>\n" \
" <li id=\"menu-item-1596\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1596\"><a href=\"http://qt.io/news/\">News</a></li>\n" \
" <li id=\"menu-item-1354\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1354\"><a href=\"http://qt.io/resource-center/\">Resource Center</a></li>\n" \
" <li id=\"menu-item-1352\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1352\"><a href=\"http://qt.io/partners/\">Partners</a></li>\n" \
" <li id=\"menu-item-1349\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1349\"><a href=\"http://qt.io/careers/\">Careers</a></li>\n" \
" <li id=\"menu-item-1415\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1415\"><a href=\"http://qt.io/terms-conditions/\">Terms &amp; Conditions</a></li>\n" \
"</ul>\n" \
"</li>\n" \
"<li id=\"menu-item-1355\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1355\"><a href=\"http://qt.io/product/\">Product</a>\n" \
"<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-1358\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1358\"><a href=\"http://qt.io/qt-framework/\">Qt Framework</a></li>\n" \
" <li id=\"menu-item-1356\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1356\"><a href=\"http://qt.io/qt-features/\">Qt Features</a></li>\n" \
" <li id=\"menu-item-1359\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1359\"><a href=\"http://qt.io/qt-quick/\">Qt Quick</a></li>\n" \
" <li id=\"menu-item-1357\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1357\"><a href=\"http://qt.io/qt-for-device-creation/\">Qt for Device Creation</a></li>\n" \
" <li id=\"menu-item-34\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-34\"><a href=\"http://qt.io/qt-in-use/\">Qt in Use</a></li>\n" \
" <li id=\"menu-item-1366\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1366\"><a href=\"http://showroom.qt-project.org/\">Showroom</a></li>\n" \
"</ul>\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" \
"<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-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 &amp; 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-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-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" \
"</ul>\n" \
"</li>\n" \
"<li id=\"menu-item-1347\" class=\"menu-item menu-item-type-post_type menu-item-object-page current-menu-ancestor current-menu-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-1347\"><a href=\"http://qt.io/services/\">Services</a>\n" \
"<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-32\" class=\"menu-item menu-item-type-post_type menu-item-object-page page_item page-item-14 menu-item-32\"><a href=\"http://qt.io/support/\">Support</a></li>\n" \
" <li id=\"menu-item-4028\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4028\"><a href=\"http://qt.io/services-technology-evaluation/\">Technology Evaluation</a></li>\n" \
" <li id=\"menu-item-4027\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4027\"><a href=\"http://qt.io/services-proof-of-concept/\">Proof of Concept</a></li>\n" \
" <li id=\"menu-item-4026\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4026\"><a href=\"http://qt.io/services-design-implementation/\">Design &amp; Implementation</a></li>\n" \
" <li id=\"menu-item-4025\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4025\"><a href=\"http://qt.io/services-productization/\">Productization</a></li>\n" \
"</ul>\n" \
"</li>\n" \
"<li id=\"menu-item-1403\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1403\"><a href=\"http://qt.io/download/\">Download</a>\n" \
"<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-1985\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1985\"><a title=\"Professional\" href=\"http://qt.io/buy/\">Professional</a></li>\n" \
" <li id=\"menu-item-3346\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3346\"><a title=\"Indie Mobile\" href=\"http://qt.io/download-mobile/\">Indie Mobile</a></li>\n" \
" <li id=\"menu-item-1982\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1982\"><a title=\"Enterprise\" href=\"http://qt.io/download-enterprise-step-2/\">Enterprise</a></li>\n" \
" <li id=\"menu-item-3013\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3013\"><a title=\"Evaluation\" href=\"http://qt.io/download-eval-step-2/\">Evaluation</a></li>\n" \
" <li id=\"menu-item-3343\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3343\"><a href=\"http://qt.io/download-open-source/\">Community</a></li>\n" \
"</ul>\n" \
"</li>\n" \
"</ul></div></nav>\n" \
"<a href=\"http://digia.com\" target=\"_blank\" class=\"footer-logo retina\" data-icon=\"\">\n" \
" </a>\n" \
" <div class=\"footer-social clearfix\">\n" \
" <div class=\"facebook\">\n" \
" <div class=\"fb-like fb_iframe_widget\" data-href=\"https://www.facebook.com/qtbydigia\" data-layout=\"button_count\" data-action=\"like\" data-show-faces=\"true\" data-share=\"false\" fb-xfbml-state=\"parsed\" fb-iframe-plugin-query=\"action=like&amp;app_id=207346529386114&amp;href=https%3A%2F%2Fwww.facebook.com%2Fqtbydigia&amp;layout=button_count&amp;locale=en_US&amp;sdk=joey&amp;share=false&amp;show_faces=true\" style=\"display: block;\"><iframe style=\"width: 30px; height: 19px; border: 0px;\"></iframe></div>\n" \
" </div>\n" \
" <div class=\"twitter\">\n" \
" <iframe id=\"twitter-widget-0\" scrolling=\"no\" frameborder=\"0\" allowtransparency=\"true\" src=\"http://platform.twitter.com/widgets/follow_button.33b190ea0cba008796487b65df7f6d8e.en.html#_=1414403615717&amp;id=twitter-widget-0&amp;lang=en&amp;screen_name=qtproject&amp;show_count=true&amp;show_screen_name=false&amp;size=m\" class=\"twitter-follow-button twitter-follow-button\" title=\"Twitter Follow Button\" data-twttr-rendered=\"true\" style=\"width: 160px; height: 20px;\"></iframe>\n" \
" </div>\n" \
" </div>\n" \
"</div>\n" \
"</div>\n" \
"<div class=\"disclaimer\">\n" \
"<div class=\"container clearfix no_discs\">\n" \
" <ul id=\"menu-footer-submenu\" class=\"right clearfix\"><li id=\"menu-item-1795\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1795\"><a title=\"Sign into your account.\" href=\"https://account.qt.io/login\">Sign In</a></li>\n" \
" <li id=\"menu-item-1494\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1494\"><a href=\"http://qt.io/contact-us/\">Contact us</a></li>\n" \
" <li id=\"menu-item-4472\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-4472\"><a href=\"http://www.digia.com\">© 2014 Digia Oyj</a></li>\n" \
" </ul>\n" \
"</div>\n" \
"</div>\n" \
"</footer>\n" \
"</div>\n"

View File

@ -1,64 +1,149 @@
#HTML Header with Qt Project branding and online links
# HTML Header with qt.io branding and online links
HTML.stylesheets = template/style/online.css
HTML.stylesheets = template/style/online.css \
template/style/gsc.css \
template/style/list_arrow.png \
template/style/icomoon.eot \
template/style/icomoon.svg \
template/style/icomoon.ttf \
template/style/icomoon.woff \
template/style/doc_search.png
#for including files into the qch file. Relative to the outputdir of a QDoc build.
# $QT_INSTALL_DOCS/qtquick/style/online.css for example
qhp.extraFiles += style/online.css
qhp.extraFiles += style/online.css \
style/gsc.css \
style/list_arrow.png \
style/icomoon.eot \
style/icomoon.svg \
style/icomoon.ttf \
style/icomoon.woff
HTML.headerstyles = \
" <link rel=\"stylesheet\" type=\"text/css\" href=\"style/online.css\" />\n"
" <link rel=\"stylesheet\" type=\"text/css\" href=\"style/online.css\" />\n" \
" <link rel=\"shortcut icon\" href=\"//d3hp9ud7yvwzy0.cloudfront.net/wp-content/themes/oneqt/images/favicon.ico.gzip\" />\n"
HTML.headerscripts = \
" <script type=\"text/javascript\"> wpThemeFolder = \'http://qt.io/wp-content/themes/oneqt\'; </script>\n" \
" <script type=\"text/javascript\" src=\"http://d3hp9ud7yvwzy0.cloudfront.net/wp-content/themes/oneqt/js/combo.js.gzip\"></script>\n" \
" <script type=\"text/javascript\" src=\"scripts/main.js\"></script>\n" \
" <script type=\"text/javascript\" src=\"scripts/extras.js\"></script>\n" \
" <script type=\"text/javascript\">\n" \
" \$(function(){\n" \
" \$(\"#sidebar-content\").load(\"style/qt5-sidebar.html\");\n" \
" });\n" \
" </script>\n" \
" <script type=\"text/javascript\">\n" \
" (function (i, s, o, g, r, a, m) {\n" \
" i[\'GoogleAnalyticsObject\'] = r; i[r] = i[r] || function () {\n" \
" (i[r].q = i[r].q || []).push(arguments)\n" \
" }, i[r].l = 1 * new Date(); a = s.createElement(o),\n" \
" m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)\n" \
" })(window, document, \'script\', \'//www.google-analytics.com/analytics.js\', \'ga\');\n\n" \
" ga(\'create\', \'UA-54043535-2\', \'qt.io\');\n" \
" ga(\'set\', \'forceSSL\', true);\n" \
" ga(\'send\', \'pageview\');\n" \
" </script>\n"
HTML.scripts = template/scripts/extras.js \
template/scripts/main.js
HTML.endheader = \
"</head>\n"
# minimal header
HTML.postheader = \
"<body>\n" \
"<div class=\"header\" id=\"qtdocheader\"></div>\n" \
" <div class=\"nav\" id=\"qt13a-header\">\n" \
" <div class=\"qt13a-gradient\">\n" \
" <div class=\"qt13a-container qt13a-dynamicREMOVE\" >\n" \
" <div id=\"qt13a-register\">\n" \
" <a href=\"http://qt-project.org/\">Qt Home</a>\n" \
" <a href=\"https://bugreports.qt-project.org/\">Bug Tracker</a>\n" \
" <a href=\"https://codereview.qt-project.org/\">Code Review</a>\n" \
" </div>\n" \
" <div class=\"qt13a-sixCol\">\n" \
" <div id=\"qt13a-logo\">\n" \
" <a href=\"http://qt-project.org/\" class=\"qt13a-site-logo\">\n" \
" <img src=\"images/Qt-logo.png\" alt=\"Qt\"></img>\n" \
" </a>\n" \
" </div>\n" \
" <div id=\"qt13a-title_nav\">\n" \
" <div id=\"qt13a-title\">\n" \
" <p class=\"qt13a-title\">Qt Documentation Snapshots</p>\n" \
" </div>\n" \
" <div class=\"qt13a-nav\">\n" \
" <ul>\n" \
" <li>\n" \
" <a href=\"http://doc-snapshot.qt-project.org\">Snapshots</a>\n" \
" </li>\n" \
" <li>\n" \
" <a href=\"http://qt-project.org/doc\">Released</a>\n" \
" </li>\n" \
" <li>\n" \
" <a href=\"http://doc.qt.digia.com\">Archives</a>\n" \
" </li>\n" \
" </ul>\n" \
" </div>\n" \
" </div>\n" \
" </div>\n" \
" </div>\n" \
"<div class=\"header\" id=\"header\">\n" \
"<header id=\"navbar\" class=\"\">\n" \
" <div class=\"cookies_yum\">\n" \
" <div>\n" \
" <img src=\"http://qt.io/wp-content/themes/oneqt/assets/images/cookie_small.png\" align=\"left\">\n" \
" <p class=\"close_button\">\n" \
" We bake cookies in your browser for a better experience. Using this site means that you consent. <a href=\"//qt.io/terms-conditions/\">Read More</a>\n" \
" </p>\n" \
" <a class=\"close\"></a>\n" \
" </div>\n" \
" </div>\n" \
" <div class=\"container\">\n" \
" <div class=\"navbar-header clearfix\">\n" \
" <a href=\"#\" class=\"navbar-toggle\">\n" \
" <figure>\n" \
" <span class=\"line\"></span>\n" \
" </figure>\n" \
" <span>Menu</span>\n" \
" </a>\n" \
" <ul id=\"menuextras\">\n" \
" <li>\n" \
" <a href=\"//qt.io/partners/\" data-icon=\"\">\n" \
" <span>Partners</span>\n" \
" </a>\n" \
" </li>\n" \
" <li>\n" \
" <a target=\"_blank\" href=\"http://blog.qt.digia.com/\" data-icon=\"\">\n" \
" <span>Blog</span>\n" \
" </a>\n" \
" </li>\n" \
" <li class=\"sign-in\">\n" \
" <a data-icon=\"\" class=\"signin\" href=\"https://account.qt.io/login\"><span>Sign in</span></a>\n" \
" </li>\n" \
" </ul>\n" \
" <a href=\"http://qt.io/\" class=\"navbar-oneQt retina\" data-icon=\"\">\n" \
" </a>\n" \
" <nav class=\"navbar-menu clearfix\" role=\"navigation\">\n" \
" <ul id=\"mainmenu\" class=\"menu\"><li id=\"menu-item-21\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-21\"><a href=\"http://qt.io/product/\">Product</a></li>\n" \
"<li id=\"menu-item-1381\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1381\"><a href=\"http://qt.io/services/\">Services</a></li>\n" \
"<li id=\"menu-item-22\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-22\"><a href=\"http://qt.io/qt-in-use/\">Qt in Use</a></li>\n" \
"<li id=\"menu-item-20\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-20\"><a href=\"http://qt.io/developers/\">Developers</a></li>\n" \
"<li id=\"menu-item-4466\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4466\"><a href=\"http://qt.io/licensing/\">Licensing</a></li>\n" \
"<li id=\"menu-item-18\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-18\"><a href=\"http://qt.io/download/\">Download</a></li>\n" \
"</ul> <ul class=\"menuextraslanguages\">\n" \
" <li class=\"active dark\"><a class=\"dark\" href=\"http://qt.io/support/\">EN</a></li><li class=\"dark\"><a class=\"dark\" href=\"http://qt.io/ru/\">RU</a></li><li class=\"dark\"><a class=\"dark\" href=\"http://qt.io/zh-hans/\">ZH</a></li></ul>\n" \
" </nav>\n" \
" </div>\n" \
" </div>\n" \
"<div class=\"big_bar account\" style=\"\">\n" \
" <div class=\"container\">\n" \
" <h1><!-- mclude oneqt_no_cache_bMrsJxAh /wp-content/themes/oneqt/php_login_info_bottom_header.php --><!-- /mclude oneqt_no_cache_bMrsJxAh -->\n" \
" <div class=\"col-1 right big_bar_button account\" style=\"margin-top:5px !important;\"></div>\n" \
" </h1>\n" \
" </div>\n" \
" <div class=\"main\">\n" \
" <div class=\"main-rounded\">\n" \
" <div class=\"navigationbar\">\n" \
" <ul>\n" \
"</div>\n" \
"</header>\n" \
"</div>\n" \
"<div class=\"main\">\n" \
"<div class=\"main-rounded\">\n" \
"<div class=\"navigationbar\">\n" \
" <ul class=\"sub-navigation\">\n" \
" <li><a href=\"http://qt-project.org/wiki\">Wiki</a></li>\n" \
" <li><a href=\"http://doc.qt.io/\" class=\"active\">Documentation</a></li>\n" \
" <li><a href=\"http://qt-project.org/forums\">Forum</a></li>\n" \
" <li><a href=\"https://bugreports.qt-project.org/\">Bug Reports</a></li>\n" \
" <li><a href=\"https://codereview.qt-project.org/\">Code Review</a></li>\n" \
" </ul>\n" \
" <div id=\"main_title_bar\">\n" \
" <h1>Qt Documentation</h1>\n" \
" <div class=\"search_bar\">\n" \
" <script>\n" \
" (function() {\n" \
" var cx = \'003672281345882769388:1y4pftuq8so\';\n" \
" var gcse = document.createElement(\'script\');\n" \
" gcse.type = \'text/javascript\';\n" \
" gcse.async = true;\n" \
" gcse.src = (document.location.protocol == \'https:\' ? \'https:\' : \'http:\') + \'//www.google.com/cse/cse.js?cx=\' + cx;\n" \
" var s = document.getElementsByTagName(\'script\')[0];\n" \
" s.parentNode.insertBefore(gcse, s);\n" \
" })();\n" \
" </script>\n" \
" <gcse:searchbox-only resultsUrl=\"search-results.html\"></gcse:searchbox-only>\n" \
" </div></div>\n" \
" <ul>\n"
HTML.postpostheader = \
" </ul>\n" \
" </div>\n" \
" </ul>\n" \
"</div>\n" \
"<div class=\"content\">\n" \
" <div class=\"line\">\n" \
" <div class=\"content mainContent\">\n" \
" <div class=\"content mainContent\">\n"
HTML.prologue = \
"<div class=\"context\">\n"

View File

@ -0,0 +1,39 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: http://www.gnu.org/copyleft/fdl.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\page search-results.html
\title Search Results
\raw HTML
<link rel="stylesheet" type="text/css" href="style/gsc.css" />
<script type="text/javascript">
$(function(){ $(".title").append(": " + decodeURIComponent(location.search.split('=')[1]).substring(0,32)); });
</script>
<gcse:searchresults-only></gcse:searchresults-only>
\endraw
*/

View File

@ -1,23 +1,9 @@
#include standard set of HTML header and footer.
include(html-config.qdocconf)
include(html-header-online.qdocconf)
include(html-footer.qdocconf)
include(html-footer-online.qdocconf)
#uncomment if navigation bar is not wanted
#HTML.nonavigationbar = "true"
HTML.stylesheets = template/style/online.css
HTML.extraimages += template/images/ico_out.png \
template/images/ico_note.png \
template/images/ico_note_attention.png \
template/images/btn_prev.png \
template/images/btn_next.png \
template/images/bullet_dn.png \
template/images/bullet_sq.png \
template/images/bgrContent.png \
template/images/Qt-logo.png \
template/images/Qt-dark_gradient.png \
template/images/Qt-footer-bg.jpg \
template/images/Qt-footer_shadow.png \
template/images/Qt-gradient.png \
template/images/Qt-header-bg.jpg
sourcedirs += includes-online

View File

@ -11,3 +11,6 @@ include(qt-html-templates-offline.qdocconf)
#extra configuration data such as file extensions
include(config.qdocconf)
# Show Qt version as part of the navigation bar
buildversion = "Qt $QT_VERSION Reference Documentation"

View File

@ -0,0 +1,29 @@
# This template uses the default online template for qt.io
# and modifies it for a commercial Qt component
# Start of footer - the rest is defined in the default template
HTML.footer = \
" <p class=\"qt_commercial\">Available under certain Qt licenses.<br/><a href=\"http://www.qt.io/download/\">Find out more.</a></p>\n" \
" </div>\n"
include(macros.qdocconf)
include(qt-cpp-defines.qdocconf)
include(compat.qdocconf)
#include(manifest-meta.qdocconf)
include(fileextensions.qdocconf)
include(qt-html-templates-online.qdocconf)
#extra configuration data DITA information
include(config.qdocconf)
HTML.prologue = \
"<div class=\"context qt_commercial\">\n" \
"<a href=\"http://www.qt.io/download/\" title=\"Available under certain Qt licenses.\" ><h1 class=\"qt_commercial\">C</h1></a>\n"
# Turn off single-directory output mode
HTML.nosubdirs = "false"
# Set navigation homepage
navigation.homepage = "Qt Documentation"
sourcedirs += includes-online

View File

@ -1,7 +1,20 @@
#The online onfiguration for a Qt 5 module, including Add-Ons and Tools.
#Online version contains a different header.
#Include this file for a standard Qt 5 module; builds with the online style.
# Start of footer - the rest is defined in qt-html-templates-online.qdocconf
HTML.footer = \
" </div>\n" \
" <p class=\"copy-notice\">\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2014 Digia Plc and/or its\n" \
" subsidiaries. Documentation contributions included herein are the copyrights of\n" \
" their respective owners. " \
" The documentation provided herein is licensed under the terms of the" \
" <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU Free Documentation" \
" License version 1.3</a> as published by the Free Software Foundation. " \
" Digia, Qt and their respective logos are trademarks of Digia Plc " \
" in Finland and/or other countries worldwide. All other trademarks are property\n" \
" of their respective owners. </p>\n"
#include standard set of macros and C++ defines and ignores
include(macros.qdocconf)
include(qt-cpp-defines.qdocconf)
@ -12,3 +25,7 @@ include(qt-html-templates-online.qdocconf)
#extra configuration data DITA information
include(config.qdocconf)
# single-directory output mode
HTML.nosubdirs = "true"
HTML.outputsubdir = "html"

View File

@ -0,0 +1,23 @@
var vOffset = 65;
$(function () {
$('a[href*=#]:not([href=#])').on('click', function () {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
if (target.length) {
setTimeout(function () {
$('html, body').animate({scrollTop: target.offset().top - vOffset}, 50);}, 50);
// return false;
}
});
});
$(window).load(function () {
var h = window.location.hash;
var re = /[^a-z0-9_\#\-]/i
if (h.length > 1 && !re.test(h)) {
setTimeout(function () {
$(window).scrollTop($(h).offset().top - vOffset);
}, 0);
}
});

View File

@ -0,0 +1,241 @@
"use strict";
function createCookie(name, value, days) {
var expires;
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
} else {
expires = "";
}
document.cookie = escape(name) + "=" + escape(value) + expires + "; path=/";
$('.cookies_yum').click(function() {
$(this).fadeOut()
});
}
function readCookie(name) {
var nameEQ = escape(name) + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return unescape(c.substring(nameEQ.length, c.length));
}
return null;
}
function eraseCookie(name) {
createCookie(name, "", -1);
}
function load_sdk(s, id, src) {
var js, fjs = document.getElementsByTagName(s)[0];
if (document.getElementById(id)) return;
js = document.createElement(s);
js.id = id;
js.src = src;
fjs.parentNode.insertBefore(js, fjs);
}
$(document).ready(function($) {
if (document.documentElement.clientWidth < 1220) {
oneQt.extraLinksToMain();
}
$('#menuextras .search').click(function(e){
e.preventDefault();
$('.big_bar.account').slideUp();
$('.big_bar.search').slideToggle();
$('.big_bar_search').focus();
$(this).toggleClass('open');
});
$('.cookies_yum').click(function() {
$('.cookies_yum').fadeOut();
createCookie("cookies_nom", "yum", 180);
var cookie_added = 1;
});
if (!(readCookie('cookies_nom') == 'yum')) {
$('.cookies_yum').fadeIn();
} else {
var cookie_added = 1;
}
Modernizr.load({test: Modernizr.input.placeholder,
nope: wpThemeFolder + '/js/placeholders.min.js'});
$('#navbar .navbar-toggle').click(function(e) {
e.preventDefault();
if ($(this).hasClass('opened')) {
$(this).removeClass('opened');
$('#navbar .navbar-menu').css('max-height', '0px');
}
else {
$(this).addClass('opened');
$('#navbar .navbar-menu').css('max-height', $('#navbar .navbar-menu ul').outerHeight() + 'px');
}
});
$(window).resize(function() {
oneQt.stickySidebar();
oneQt.footerPosition();
if (document.documentElement.clientWidth < 1220) {
oneQt.extraLinksToMain();
} else {
oneQt.mainLinkstoExtra();
}
});
$(window).scroll(function() {
oneQt.stickySidebar();
oneQt.stickyHeader();
});
oneQt.stickySidebar();
oneQt.footerPosition();
oneQt.tabContents();
});
$( window ).load(function() {
load_sdk('script', 'facebook-jssdk','//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=207346529386114&version=v2.0');
load_sdk('script', 'twitter-wjs', '//platform.twitter.com/widgets.js');
$.getScript("//www.google.com/jsapi", function(){
google.load("feeds", "1", {"callback": oneQt.liveFeeds});
});
});
var oneQt = {
stickySidebar: function() {
if ($('#sidebar').length && $('#sidebar').outerHeight() > 20) {
var $sidebar = $('#sidebar');
var $win = $(window);
var $sidebarContainer = $sidebar.parent();
var headerHeight = $('#navbar').outerHeight();
if ($win.outerHeight() - headerHeight > $sidebar.innerHeight() &&
$win.scrollTop() > $sidebarContainer.offset().top) {
var newTop = headerHeight + $win.scrollTop() - $sidebarContainer.offset().top;
if (newTop + $sidebar.innerHeight() > $sidebarContainer.innerHeight())
newTop = $sidebarContainer.innerHeight() - $sidebar.innerHeight();
$sidebar.css({top: newTop +'px'})
}
else {
$sidebar.css({top: '0'})
}
}
},
footerPosition: function () {
$('#footerbar').removeClass('fixed');
if (($('.hbspt-form').length > 0) || ($('#customerInfo').length > 0) || ($('.purchase_bar').length > 0)) {
var footerBottomPos = $('#footerbar').offset().top + $('#footerbar').outerHeight();
if (footerBottomPos < $(window).height())
$('#footerbar').addClass('fixed');
}
},
stickyHeader: function () {
var originalHeaderHeight = 79;
if ($(window).scrollTop() > originalHeaderHeight) {
$('#navbar').addClass('fixed');
$('#bottom_header').fadeOut();
if (!(cookie_added == 1)) {
$('.cookies_yum').fadeOut();
createCookie("cookies_nom", "yum", 180);
var cookie_added = 1;
}
}
else {
$('#navbar').removeClass('fixed');
$('#bottom_header').fadeIn();
}
},
tabContents: function () {
$('.tab-container').each(function(i) {
var $el = $(this);
$el.find('.tab-titles li:eq(0)').addClass('active');
$el.find('.tab-contents .tab:eq(0)').addClass('active');
$el.find('.tab-titles a').click(function(e) {
e.preventDefault();
var index = $(this).parent().index();
$el.find('.tab-titles li').removeClass('active');
$el.find('.tab-contents .tab').removeClass('active');
$(this).parent().addClass('active');
$el.find('.tab-contents .tab').eq(index).addClass('active');
})
});
},
liveFeeds: function () {
$('.feed-container').each(function(i) {
var feedUrl = $(this).data('url');
if (feedUrl != "") oneQt.blogFeed($(this), feedUrl);
});
},
blogFeed: function ($container, feedUrl) {
var feed = new google.feeds.Feed(feedUrl);
feed.setNumEntries(3);
feed.load(function(result) {
$container.html('');
if (!result.error) {
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
var $article = $('<article class="discussion-tile cf"></article>');
$container.append($article);
var html = ' <div class="author retina">';
html += ' <img src="'+wpThemeFolder+'/assets/images/author_placeholder.png" alt="">';
html += ' </div>';
html += ' <div class="discussion-item">';
html += ' <h4><a href="'+encodeURI(entry.link)+'"></a></h4>'
html += ' <h3><a href="'+encodeURI(entry.link)+'" target="_blank"></a></h3>'
html += ' <p><a href="'+encodeURI(entry.link)+'" target="_blank"></a></p>';
html += ' <ul class="taglist cf">';
html += ' </ul>';
html += ' </div>';
$article.append(html);
$article.find('h4 a').text(result.feed.title);
$article.find('h3 a').text(entry.title);
$article.find('p a').text(entry.author);
try {
for (var j=0; j<entry.categories.length; j++) {
var $li = $('<li><a href="'+encodeURI(entry.link)+'" target="_blank" class="btn btn-tag"></a></li>');
$li.find('a').text(entry.categories[j]);
$article.find('.taglist').append($li);
}
} catch(e) {}
}
if (result.feed.link && result.feed.link != "") {
var linkHtml = '<a href="'+encodeURI(result.feed.link)+'" class="text-lightgrey" target="_blank">Show all</a>';
$container.append(linkHtml);
}
}
});
},
extraLinksToMain: function() {
var extramenuLinks = $('#menuextras').find('li');
var mainmenu = $('#mainmenu');
var count = 0;
if ($(extramenuLinks).length > 3) {
$(extramenuLinks).each(function() {
if (count < 3) {
var newLink = $(this);
$(newLink).addClass('dynamic-add');
$(mainmenu).append(newLink);
}
count++;
});
}
},
mainLinkstoExtra: function() {
var mainmenuLinks = $('#mainmenu').find('.dynamic-add');
var extramenu = $('#menuextras');
var count = 0;
$(mainmenuLinks).each(function() {
var newLink = $(this);
$(extramenu).prepend(newLink);
count++;
});
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,192 @@
.gsc-control-cse table, table td, table th {
border: none !important;
margin-bottom: 10px !important
}
.gsc-control-cse {
width: 100% !important;
box-sizing: border-box !important
}
.gsc-control-cse * {
font-family: 'Open Sans', Arial, Helvetica, sans-serif !important;
line-height: 1.5 !important;
font-weight: 300 !important
}
.gsc-control-cse,
.gsc-control-cse .gsc-table-result {
width: 100% !important;
font-family: 'Open Sans', Arial, Helvetica, sans-serif !important;
font-weight: 300 !important;
font-size: 13px !important
}
.gsc-resultsHeader {
width: 100% !important;
clear: both !important
}
.gsc-resultsHeader td.gsc-twiddleRegionCell {
width: 75% !important
}
.gsc-resultsbox-visible {
display: block !important
}
.gsc-resultsbox-invisible {
display: none !important
}
.gsc-results {
padding-bottom: 2px !important;
width: 99% !important
}
.gsc-result {
margin-bottom: 10px !important
}
.gsc-result .gs-title {
height: 1.4em !important;
overflow: hidden !important
}
.gsc-result div.gs-watermark {
display: none !important
}
.gsc-results .gsc-result img.gs-ad-marker {
display: none !important
}
.gsc-webResult:after {
content: "." !important;
display: block !important;
height: 0 !important;
clear: both !important;
visibility: hidden !important
}
.gsc-webResult {
zoom: 1 !important
}
.gsc-webResult .gsc-result {
margin: 0 !important;
padding: .5em 0 !important;
border-bottom: 1px solid #ebebeb !important
}
.gsc-above-wrapper-area {
border-bottom: 1px solid #E9E9E9 !important;
padding: 5px 0 5px 0 !important
}
.gsc-above-wrapper-area-invisible {
display: none !important
}
.gsc-above-wrapper-area-container {
width: 100% !important
}
.gsc-result-info {
text-align: left !important;
color: #676767 !important;
font-size: 13px !important;
padding-left: 8px !important;
margin: 10px 0 10px 0 !important
}
.gsc-result-info-container {
text-align: left !important
}
.gsc-result-info-invisible {
display: none !important
}
.gsc-orderby-container {
text-align: right !important;
background: transparent !important
}
.gsc-orderby-invisible {
display: none !important
}
.gsc-orderby-label {
color: #676767 !important;
padding: 5px 5px 6px 0 !important
}
.gsc-selected-option-container {
background-color: transparent !important;
border: 1px solid #eee !important;
border: 1px solid rgba(0, 0, 0, 0.1) !important;
border-radius: 2px !important;
box-shadow: none !important;
color: #444 !important;
cursor: default !important;
font-size: 11px !important;
font-weight: bold !important;
height: 20px !important;
line-height: 20px !important;
max-width: 90% !important;
min-width: 54px !important;
outline: 0 !important;
padding: 0 28px 0 6px !important;
position: relative !important;
text-align: center !important;
width: 50px !important !important
}
.gsc-selected-option {
position: relative !important;
width: 100% !important;
}
.gsc-control-cse .gsc-option-selector {
border: none !important;
height: 11px !important;
margin-top: -4px !important;
position: absolute !important;
right: 5px !important;
top: 8px !important;
width: 7px !important;
padding: 0 5px 0 5px !important;
background: url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat
}
.gsc-results .gsc-cursor-box .gsc-trailing-more-results {
margin-bottom: 0 !important;
display: inline !important
}
.gsc-results .gsc-cursor {
display: inline !important
}
.gsc-results .gsc-cursor-box {
margin: 10px 5px 10px !important
}
.gsc-results .gsc-cursor-box .gsc-cursor-page {
cursor: pointer !important;
color: #000000 !important;
text-decoration: underline !important;
margin-right: 8px !important;
display: inline !important
}
.gsc-results .gsc-cursor-box .gsc-cursor-current-page {
cursor: default !important;
color: white !important;
background-color: #5caa15 !important;
font-weight: bold !important;
text-decoration: none !important;
padding: 0 3px 0 3px !important;
margin-top: 10px !important;
cursor: pointer !important
}
.gs-result .gs-title,
.gs-result .gs-title * {
color: #5caa15 !important;
text-decoration: underline !important
}
.gs-webResult div.gs-visibleUrl-long,
.gs-promotion div.gs-visibleUrl-long {
overflow: hidden !important;
display: none !important
}
.gs-webResult div.gs-per-result-labels a.gs-label {
text-decoration: underline !important;
cursor: pointer !important;
padding: 3px !important;
color: #26282a !important
}
.gs-webResult div.gs-per-result-labels a.gs-label.gs-labelActive {
cursor: default !important;
text-decoration: none !important
}
.gsc-control-cse:after {
content: "." !important;
display: block !important;
clear: both !important;
height: 0 !important;
visibility: hidden !important
}
*:first-child + html .gsc-inline-block {
display: inline !important
}

Binary file not shown.

View File

@ -0,0 +1,20 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="512">
<font-face units-per-em="512" ascent="480" descent="-32" />
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
<glyph unicode="&#xe600;" d="M70.281 478.981c-38.026 6.451-70.281-21.729-70.281-62.472v-448.51l347.671 58.398c24.106 4.075 42.78 32.255 42.78 62.812v337.486l-320.17 52.286zM232.233 147.608c-10.185-23.767-25.464-39.045-46.175-46.514 2.037-10.865 5.433-17.655 9.506-21.729 2.376-2.037 5.772-3.735 9.846-3.735h11.544c-2.376 0-4.414-0.679-6.451-0.679l0.339-0.339c2.037 0 3.055 0 6.451 0.339v-31.915l-14.939-2.037c-4.414-0.679-8.488-0.679-12.223-0.679-12.902 0-23.088 3.055-30.897 9.507-10.185 8.149-17.994 24.106-22.748 47.533-22.409 4.753-39.724 19.014-51.608 42.78-12.223 24.106-18.334 59.416-18.334 105.931 0 49.91 8.488 86.578 25.124 110.005 14.26 19.692 33.953 29.538 58.737 29.538 4.075 0 8.149-0.339 12.223-0.679 29.199-3.395 50.25-16.976 64.17-41.082 13.581-23.427 20.032-56.7 20.032-100.838 0-40.403-4.754-71.979-14.6-95.406zM346.313 125.199c-13.581-5.433-24.785-8.827-37.008-9.846-1.697 0-3.395-0.339-5.093-0.339-10.865 0-19.692 3.055-25.464 9.507-6.791 7.469-10.525 19.353-10.525 35.65v125.623l-13.581 0.679v33.273l17.994-1.358 11.884 49.57 27.841-3.055v-49.231l30.557-2.376v-30.897l-30.557 1.358v-113.061c0-9.846 1.019-16.297 3.055-19.014s5.093-3.735 9.167-3.735c0.339 0 1.019 0 1.358 0 6.111 0.339 13.581 2.377 20.372 5.772v-28.52zM162.631 347.586c-1.018 0-1.697 0-2.716 0-10.525 0-18.673-6.111-24.446-18.673-6.112-13.581-9.167-41.422-9.167-84.202 0-41.082 3.055-70.281 9.167-87.257 5.772-16.297 14.26-24.445 25.803-24.445 0.339 0 1.018 0 1.358 0 11.204 0.679 19.692 8.488 25.464 23.427 5.772 14.599 8.488 43.798 8.488 86.918 0 38.706-2.716 65.528-8.488 80.127-5.433 14.939-13.921 23.088-25.464 24.106zM206.090 75.289v0zM206.090 75.289c1.358 0 2.716 0 4.414 0 2.037 0 4.075 0.679 6.451 0.679h-11.544l0.679-0.679z" horiz-adv-x="391" />
<glyph unicode="&#xe601;" d="M511.589 224.206c0-141.272-114.523-255.794-255.794-255.794s-255.794 114.523-255.794 255.794c0 141.271 114.523 255.794 255.794 255.794s255.794-114.523 255.794-255.794zM192.565 127.717c0-18.066-14.781-32.436-32.436-32.436s-32.847 14.37-32.847 32.436c0 18.066 14.781 32.436 32.436 32.436s32.847-14.37 32.847-32.436zM127.281 367.91v-50.502c133.030 0 221.716-89.097 221.716-222.127h50.502c0 165.466-107.163 272.628-272.218 272.628zM142.473 262.8c-3.696 0-11.496 0-15.192-0.411v-45.164c3.695 0.411 11.497 0.411 15.192 0.411 61.999 0 107.163-45.164 107.163-107.163 0-3.695 0-11.907-0.411-15.192h45.575c0.411 3.695 0.411 11.497 0.411 15.192-0.411 94.024-58.714 152.327-152.738 152.327z" />
<glyph unicode="&#xe602;" d="M511.589 224.206c0-141.272-114.523-255.794-255.794-255.794s-255.794 114.523-255.794 255.794c0 141.271 114.523 255.794 255.794 255.794s255.794-114.523 255.794-255.794zM382.666 298.111h-253.331c-8.212 0-14.781 6.57-14.781 14.781v18.887c0 8.212 6.57 14.781 14.781 14.781h253.331c8.212 0 14.781-6.57 14.781-14.781v-18.887c0-8.212-6.57-14.781-14.781-14.781zM382.666 199.981h-253.331c-8.212 0-14.781 6.57-14.781 14.781v18.887c0 8.212 6.57 14.781 14.781 14.781h253.331c8.212 0 14.781-6.57 14.781-14.781v-18.887c0-8.212-6.57-14.781-14.781-14.781zM382.666 101.44h-253.331c-8.212 0-14.781 6.57-14.781 14.781v18.887c0 8.212 6.57 14.781 14.781 14.781h253.331c8.212 0 14.781-6.57 14.781-14.781v-18.887c0-7.801-6.57-14.781-14.781-14.781z" />
<glyph unicode="&#xe603;" d="M511.795 224c0-141.272-114.524-255.795-255.795-255.795s-255.795 114.524-255.795 255.795c0 141.272 114.523 255.795 255.795 255.795s255.795-114.524 255.795-255.795zM405.529 256.947l-103.168 14.797-46.566 92.646-46.080-92.646-103.245-14.797 74.471-71.68-17.664-101.581 92.416 47.974 93.056-48.051-17.69 101.657z" />
<glyph unicode="&#xe604;" d="M511.589 224.206c0-141.272-114.523-255.794-255.794-255.794s-255.794 114.523-255.794 255.794c0 141.271 114.523 255.794 255.794 255.794s255.794-114.523 255.794-255.794zM379.381 126.486l-74.726 75.137c12.728 17.245 20.118 39.005 20.118 61.998 0 29.152-11.907 55.429-30.794 74.316-18.887 19.298-45.575 31.204-74.726 31.204s-55.429-11.907-74.316-30.794c-18.887-18.887-30.794-45.575-30.794-74.316 0-29.151 11.907-55.429 30.794-74.316s45.575-30.794 74.316-30.794c20.119 0 38.595 5.748 54.608 15.192l75.959-75.959c5.337-5.337 13.96-5.337 19.298 0l9.854 9.854c5.748 4.517 5.748 13.139 0.411 18.476zM165.055 209.424c-13.96 13.96-22.582 32.847-22.582 54.197s8.623 40.238 22.582 54.197c13.96 13.96 32.847 22.582 54.197 22.582s40.238-8.623 54.197-22.582c13.96-13.96 22.582-32.847 22.582-54.197s-8.623-40.238-22.582-54.197c-13.96-13.96-32.847-22.582-54.197-22.582-20.94 0-40.238 8.623-54.197 22.582z" />
<glyph unicode="&#xe605;" d="M511.589 224.206c0-141.272-114.523-255.794-255.794-255.794s-255.794 114.523-255.794 255.794c0 141.271 114.523 255.794 255.794 255.794s255.794-114.523 255.794-255.794zM255.794-22.557c67.746 0 129.335 27.509 174.088 71.442-5.748 4.106-11.907 8.623-18.887 13.55-22.993 15.602-52.966 34.9-92.382 59.535-1.642 1.232-2.874 2.464-3.284 3.695-0.821 1.232-1.232 2.464-1.232 3.284-0.411 2.053-0.821 4.106-0.821 6.159 0 4.927 0.821 10.264 2.874 16.423 1.642 6.159 4.517 12.317 7.801 18.476 2.053 3.695 4.927 9.854 7.39 17.655s4.927 17.655 7.39 28.741c4.517 22.172 7.39 49.681 7.39 79.243 0 13.138-5.337 29.973-14.781 45.575-9.854 15.602-23.404 29.972-39.827 38.595-11.086 5.748-22.993 9.033-35.721 9.033v0 0c-18.476-0.411-35.31-7.801-49.681-19.708s-25.867-27.92-32.847-43.933c-4.517-10.675-6.57-20.94-6.57-29.562 0-22.171 1.643-43.112 4.517-61.588s6.57-34.489 10.264-45.986c2.464-7.801 5.338-13.96 7.391-17.655 3.696-5.748 6.159-12.317 7.801-18.476s2.874-11.497 2.874-16.423c0-1.642 0-2.874-0.411-4.517s-0.821-3.284-1.643-4.927c-0.821-1.232-1.643-2.464-3.285-3.695-51.323-32.026-87.044-55.429-111.679-73.084 43.933-44.343 105.52-71.853 173.267-71.853z" />
<glyph unicode="&#xe606;" d="M511.087 224.411c0-141.109-114.392-255.502-255.501-255.502s-255.501 114.392-255.501 255.501c0 141.109 114.392 255.501 255.501 255.501s255.501-114.392 255.501-255.501zM369.577 360.185h-227.981c-2.263-0.003-4.095-1.838-4.098-4.098v-263.767c0.003-2.263 1.838-4.095 4.098-4.098h227.981c2.263 0.003 4.095 1.838 4.098 4.098v263.767c-0.007 2.263-1.838 4.095-4.098 4.098zM291.959 165.217c0-4.507-3.688-8.197-8.197-8.197h-112.482c-4.507 0-8.196 3.688-8.196 8.197v2.263c0 4.507 3.689 8.197 8.197 8.197h112.482c4.507 0 8.197-3.688 8.197-8.197v-2.263zM348.089 210.007c0-4.507-3.688-8.197-8.197-8.197h-168.612c-4.507 0-8.196 3.688-8.196 8.197v2.263c0 4.507 3.689 8.197 8.197 8.197h168.608c4.507 0 8.197-3.688 8.197-8.197v-2.263zM348.089 254.796c0-4.507-3.688-8.197-8.197-8.197h-168.612c-4.507 0-8.196 3.689-8.196 8.197v2.263c0 4.508 3.689 8.197 8.197 8.197h168.608c4.507 0 8.197-3.688 8.197-8.197v-2.263zM348.089 299.584c0-4.507-3.688-8.197-8.197-8.197h-168.612c-4.507 0-8.196 3.689-8.196 8.197v2.263c0 4.508 3.689 8.197 8.197 8.197h168.608c4.507 0 8.197-3.688 8.197-8.197v-2.263z" />
<glyph unicode="&#xe607;" d="M0 139.988v153.96c0 19.471 0.36 36.417 3.966 50.84 36.056 11.538 85.093 18.389 127.279 18.389 23.797 0 53.724-2.524 75.719-5.409v122.231h55.166v-340.012c0-18.389-0.361-35.335-3.966-51.56-34.254-11.538-86.535-18.389-126.918-18.389-42.547 0-89.059 6.49-126.197 17.668-3.606 16.947-5.048 34.253-5.048 52.281zM57.33 308.372c-1.443-7.572-2.163-19.471-2.163-34.974v-113.578c0-18.389 0.721-29.927 2.163-34.974 20.191-5.409 49.758-7.933 73.916-7.933 27.042 0 56.248 3.245 73.555 8.293 1.442 5.048 2.163 16.586 2.163 34.614v150.355c-21.634 3.606-51.921 5.769-76.44 5.769-23.436 0.361-51.56-3.245-73.195-7.572zM389.048 360.293v-287.009h-55.887v287.009h55.887zM658.028 28.214c1.442 6.49 2.163 15.144 2.163 24.879v29.566c-22.355-2.524-50.479-4.327-72.112-4.327-41.826 0-89.059 6.13-123.673 17.668-2.885 16.947-4.327 33.893-4.327 51.2v146.75c0 18.028 1.442 34.974 4.327 50.839 34.254 11.538 81.848 18.389 123.673 18.389 41.465 0 87.256-6.851 123.673-18.389 3.606-16.586 3.966-32.812 3.966-50.839v-271.865c-15.865-46.512-64.18-54.084-124.034-54.084-25.961 0-62.377 4.327-91.583 10.096v43.988c29.206-5.769 72.834-9.735 108.169-7.933 19.11 0.721 40.383 5.769 49.758 14.062zM660.192 129.533v143.865c0 16.586-0.361 27.403-2.524 34.975-19.471 4.327-45.792 7.933-69.588 7.933-23.437 0-50.119-3.245-69.588-7.933-1.803-7.572-2.885-19.471-2.885-34.975v-107.087c0-15.865 1.082-27.403 2.885-34.974 18.389-5.409 45.431-7.933 69.228-7.933 23.076 0.361 50.479 2.163 72.473 6.13zM842.276 360.293v-287.009h-55.888v287.009h55.888zM1159.211 344.067c-36.417 12.62-73.555 18.75-115.741 18.75-36.057 0-91.583-5.769-123.673-15.144v-51.2h27.403c5.048 4.327 9.014 10.096 11.899 16.226 10.457 2.524 32.812 5.048 74.637 5.048 23.797 0 51.2-3.966 71.752-8.293 1.443-13.341 2.524-26.681 2.524-38.941v-23.076h-120.067c-22.355 0-51.2-3.245-75.357-12.619-3.606-15.143-4.688-32.451-5.048-44.71v-50.118c0-18.028 1.442-35.335 5.048-51.921 36.778-11.538 84.011-17.668 126.557-17.668 40.383 0 85.814 6.13 120.068 17.668 3.605 15.865 3.966 32.812 3.966 51.2v143.504c0 15.504-0.361 34.974-3.966 61.296zM998.039 206.693h110.333v-35.696c0-14.423 0.361-34.614-1.803-46.152-17.307-5.048-40.023-7.572-66.704-7.572-1.443 0-2.884 0-3.966 0-23.076 0-52.282 2.524-71.391 7.572-1.803 10.817-2.885 26.321-2.885 35.696v3.606c0 8.293 0.361 27.043 3.606 38.581 8.293 2.885 19.11 3.966 32.812 3.966zM912.586 234.817c-3.606-15.144-5.048-44.71-5.048-44.71v-50.118zM387.966 476.034v-59.493h-55.887v59.493h55.887zM842.276 476.034v-59.493h-55.888v59.493h55.888z" horiz-adv-x="1163" />
<glyph unicode="&#xe608;" d="M512.419 224.922c0-141.385-114.615-256-256-256s-256 114.615-256 256c0 141.385 114.615 256 256 256s256-114.615 256-256zM414.157 260.356l-108.984 15.832-48.921 98.764-7.456-15.246-41.047-83.519-108.984-15.832 78.744-76.9-18.597-108.565 97.424 51.267 97.759-51.267-18.597 108.565 78.659 76.9zM256.252 145.005l-75.142-39.539 14.409 83.769-60.817 59.309 84.189 12.314 37.362 76.231 37.78-76.231 84.188-12.231-60.817-59.309 14.409-83.853-75.56 39.539z" horiz-adv-x="513" />
<glyph unicode="&#xe609;" d="M511.795 224c0-141.272-114.524-255.795-255.795-255.795s-255.795 114.524-255.795 255.795c0 141.272 114.523 255.795 255.795 255.795s255.795-114.524 255.795-255.795zM418.457 266.368l-112.435 16.128-50.279 100.070-11.392-22.912-38.4-77.159-112.409-16.102 81.229-78.183-19.174-110.157 100.224 51.993 100.582-51.942-19.175 110.106 81.229 78.157z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
@ -26,10 +26,10 @@
****************************************************************************/
/*!
\example codecs
\title Codecs Example
\example tools/codecs
\title Text Codecs Example
The Codecs example demonstrates the principles behind importing and exporting text
The Text Codecs example demonstrates the principles behind importing and exporting text
using codecs to ensure that characters are encoded properly, avoiding loss of data
and retaining the correct symbols used in various scripts.

View File

@ -114,9 +114,9 @@ equals(ANDROID_TARGET_ARCH, x86_64)|equals(ANDROID_TARGET_ARCH, mips64): \
QMAKE_CC = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-gcc
equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
QMAKE_CFLAGS = -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack
QMAKE_CFLAGS = -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove
else: equals(ANDROID_TARGET_ARCH, armeabi): \
QMAKE_CFLAGS = -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack
QMAKE_CFLAGS = -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): \
QMAKE_CFLAGS = -ffunction-sections -funwind-tables -fstack-protector -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack
else: equals(ANDROID_TARGET_ARCH, x86): \

View File

@ -0,0 +1,18 @@
gcc {
# When doing link-time code generation, we need to pass the compiler
# flags during linking the stage too. This file is processed after
# default_post.prf, so the QMAKE_CXXFLAGS already contains
# QMAKE_CXXFLAGS_DEBUG or _RELEASE.
use_c_linker {
# use_c_linker.prf is in effect, use the C flags
QMAKE_LFLAGS_LTCG += $$QMAKE_CFLAGS $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS_APP += $$QMAKE_CFLAGS_APP
QMAKE_LFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB
QMAKE_LFLAGS_PLUGIN += $$QMAKE_CFLAGS_SHLIB
} else {
QMAKE_LFLAGS_LTCG = $$QMAKE_CXXFLAGS $$QMAKE_LFLAGS_LTCG
QMAKE_LFLAGS_APP += $$QMAKE_CXXFLAGS_APP
QMAKE_LFLAGS_SHLIB += $$QMAKE_CXXFLAGS_SHLIB
QMAKE_LFLAGS_PLUGIN += $$QMAKE_CFLAGS_SHLIB
}
}

View File

@ -31,23 +31,9 @@ CONFIG(release, debug|release) {
QMAKE_CXXFLAGS_LTCG =
QMAKE_LFLAGS_LTCG =
}
# When doing link-time code generation, we need to pass the compiler
# flags during linking stage too. This file is processed after
# default_post.prf, so the QMAKE_CXXFLAGS already contains
# QMAKE_CXXFLAGS_DEBUG or _RELEASE.
use_c_linker {
# use_c_linker.prf is in effect, use the C flags
QMAKE_LFLAGS_LTCG += $$QMAKE_CFLAGS $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS_APP += $$QMAKE_CFLAGS_APP
QMAKE_LFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB
} else {
QMAKE_LFLAGS_LTCG = $$QMAKE_CXXFLAGS $$QMAKE_LFLAGS_LTCG
QMAKE_LFLAGS_APP += $$QMAKE_CXXFLAGS_APP
QMAKE_LFLAGS_SHLIB += $$QMAKE_CXXFLAGS_SHLIB
}
}
load(link_ltcg)
QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG

View File

@ -9,11 +9,15 @@ isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path) {
QMAKE_MAC_SDK_PATH = $$system("/usr/bin/xcodebuild -sdk $$QMAKE_MAC_SDK -version Path 2>/dev/null")
isEmpty(QMAKE_MAC_SDK_PATH): error("Could not resolve SDK path for \'$$QMAKE_MAC_SDK\'")
cache(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path, set stash, QMAKE_MAC_SDK_PATH)
} else {
QMAKE_MAC_SDK_PATH = $$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path)
}
isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.version) {
QMAKE_MAC_SDK_VERSION = $$system("/usr/bin/xcodebuild -sdk $$QMAKE_MAC_SDK -version SDKVersion 2>/dev/null")
isEmpty(QMAKE_MAC_SDK_VERSION): error("Could not resolve SDK version for \'$$QMAKE_MAC_SDK\'")
cache(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.version, set stash, QMAKE_MAC_SDK_VERSION)
} else {
QMAKE_MAC_SDK_PATH = $$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path)
QMAKE_MAC_SDK_VERSION = $$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.version)
}

View File

@ -7,8 +7,8 @@ win32-msvc2*|wince*msvc* {
QMAKE_CXXFLAGS_DEBUG -= -Zi
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO -= -Zi
} else {
QMAKE_CFLAGS -= -g -ggdb3
QMAKE_CXXFLAGS -= -g -ggdb3
QMAKE_LFLAGS -= -g -ggdb3
QMAKE_LIBFLAGS -= -g -ggdb3
QMAKE_CFLAGS -= -g -ggdb3 -gstabs
QMAKE_CXXFLAGS -= -g -ggdb3 -gstabs
QMAKE_LFLAGS -= -g -ggdb3 -gstabs
QMAKE_LIBFLAGS -= -g -ggdb3 -gstabs
}

View File

@ -68,6 +68,7 @@ defineTest(qtAddModule) {
using_privates = true
export(using_privates)
}
contains(MODULE_CONFIG, ltcg): CONFIG += link_ltcg
qtProcessModuleFlags(CONFIG, QT.$${1}.CONFIG)
qtProcessModuleFlags(DEFINES, QT.$${1}.DEFINES)

View File

@ -66,6 +66,8 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri
module_build_type =
internal_module: \
module_build_type += internal_module
ltcg: \
module_build_type += ltcg
!isEmpty(MODULE_CONFIG): \
module_config = "QT.$${MODULE_ID}.CONFIG = $$MODULE_CONFIG"
else: \

View File

@ -68,8 +68,7 @@ equals(TEMPLATE, app) {
debug-iphonesimulator-distclean debug-iphoneos-distclean \
release-iphonesimulator-distclean release-iphoneos-distclean
QMAKE_EXTRA_TARGETS += xcode_distclean
distclean.depends = xcode_distclean
QMAKE_EXTRA_TARGETS += distclean
DISTCLEAN_DEPS += xcode_distclean
mkpath($$OUT_PWD)|error("Aborting.")
args =
@ -185,13 +184,17 @@ macx-xcode {
launch_images.files = $$copy_image.output
QMAKE_BUNDLE_DATA += launch_images
# Set up default LaunchScreen to support iPhone6/6+
launch_screen = LaunchScreen.xib
copy_launch_screen.input = $$QMAKESPEC/$$launch_screen
copy_launch_screen.output = $$OUT_PWD/$${TARGET}.xcodeproj/$$launch_screen
QMAKE_SUBSTITUTES += copy_launch_screen
launch_screens.files = $$copy_launch_screen.output
QMAKE_BUNDLE_DATA += launch_screens
lessThan(QMAKE_XCODE_VERSION, "6.0") {
warning("You need to update Xcode to version 6 or newer to fully support iPhone6/6+")
} else {
# Set up default LaunchScreen to support iPhone6/6+
launch_screen = LaunchScreen.xib
copy_launch_screen.input = $$QMAKESPEC/$$launch_screen
copy_launch_screen.output = $$OUT_PWD/$${TARGET}.xcodeproj/$$launch_screen
QMAKE_SUBSTITUTES += copy_launch_screen
launch_screens.files = $$copy_launch_screen.output
QMAKE_BUNDLE_DATA += launch_screens
}
}
macx-xcode {

View File

@ -73,3 +73,5 @@ depends += \
qtx11extras \
qtxml \
qtxmlpatterns
navigation.landingpage = "qmake Manual"

View File

@ -1195,6 +1195,12 @@
Please see \l{Setting the Application Icon}{the application icon documentation}
for more information.
\target IDLSOURCES
\section1 IDLSOURCES
This variable is used only on Windows for the Visual Studio project generation to
put the specified files in the Generated Files folder.
\target INCLUDEPATH
\section1 INCLUDEPATH
@ -1304,6 +1310,12 @@
handled internally by qmake and rarely needs to
be modified.
\target MSVCPROJ_*
\section1 MSVCPROJ_*
These variables are handled internally by qmake and should not be modified
or utilized.
\target MOC_DIR
\section1 MOC_DIR
@ -2110,6 +2122,38 @@
variable is typically handled by qmake or
\l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
\target QMAKE_TARGET_COMPANY
\section1 QMAKE_TARGET_COMPANY
Windows only. Specifies the company for the project target, this is used where
applicable for putting the company name in the application's properties. This is
only utilized if the VERSION or RC_ICONS variable is set and the RC_FILE and RES_FILE
variables are not set.
\target QMAKE_TARGET_DESCRIPTION
\section1 QMAKE_TARGET_DESCRIPTION
Windows only. Specifies the description for the project target, this is used where
applicable for putting the description in the application's properties. This is only
utilized if the VERSION or RC_ICONS variable is set and the RC_FILE and RES_FILE variables
are not set.
\target QMAKE_TARGET_COPYRIGHT
\section1 QMAKE_TARGET_COPYRIGHT
Windows only. Specifies the copyright information for the project target, this is used where
applicable for putting the copyright information in the application's properties. This is only
utilized if the VERSION or RC_ICONS variable is set and the RC_FILE and RES_FILE variables
are not set.
\target QMAKE_TARGET_PRODUCT
\section1 QMAKE_TARGET_PRODUCT
Windows only. Specifies the product for the project target, this is used where
applicable for putting the product in the application's properties. This is only utilized if
the VERSION or RC_ICONS variable is set and the RC_FILE and RES_FILE variables
are not set.
\section1 QT
Specifies the Qt modules that are used by your project.
@ -2209,6 +2253,26 @@
qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
needs to be modified.
\target RC_CODEPAGE
\section1 RC_CODEPAGE
Windows only. Specifies the codepage that should be specified in a generated rc file. This is
only utilized if the VERSION or RC_ICONS variable is set and the RC_FILE and RES_FILE variables
are not set.
\target RC_ICONS
\section1 RC_ICONS
Windows only. Specifies the icons that should be included into a generated rc file, this
is only utilized if the RC_FILE and RES_FILE variable are not set.
\target RC_LANG
\section1 RC_LANG
Windows only. Specifies the language that should be specified in a generated rc file. This is
only utilized if the VERSION or RC_ICONS variable is set and the RC_FILE and RES_FILE variables
are not set.
\section1 RC_INCLUDEPATH
Specifies include paths that are passed to the Windows Resource Compiler.

View File

@ -444,6 +444,22 @@ MakefileGenerator::init()
setSystemIncludes(v["QMAKE_DEFAULT_INCDIRS"]);
const char * const cacheKeys[] = { "_QMAKE_STASH_", "_QMAKE_SUPER_CACHE_", 0 };
for (int i = 0; cacheKeys[i]; ++i) {
if (v[cacheKeys[i]].isEmpty())
continue;
const ProString &file = v[cacheKeys[i]].first();
if (file.isEmpty())
continue;
QFileInfo fi(fileInfo(file.toQString()));
// If the file lives in the output dir we treat it as 'owned' by
// the current project, so it should be distcleaned by it as well.
if (fi.path() == Option::output_dir)
v["QMAKE_DISTCLEAN"].append(fi.fileName());
}
ProStringList &quc = v["QMAKE_EXTRA_COMPILERS"];
//make sure the COMPILERS are in the correct input/output chain order

View File

@ -1177,7 +1177,7 @@ void VcprojGenerator::initResourceTool()
// to add it for the compiler) However, the resource tool does not do this.
if(project->isActiveConfig("debug"))
conf.resource.PreprocessorDefinitions += "_DEBUG";
if(project->isActiveConfig("staticlib"))
if (conf.CompilerVersion < NET2010 && project->isActiveConfig("staticlib"))
conf.resource.ResourceOutputFileName = "$(OutDir)\\$(InputName).res";
}

View File

@ -162,12 +162,6 @@ Context::~Context()
deleteTransformFeedback(mTransformFeedbackMap.begin()->first);
}
for (TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); i++)
{
i->second.set(NULL);
}
mIncompleteTextures.clear();
for (TextureMap::iterator i = mZeroTextures.begin(); i != mZeroTextures.end(); i++)
{
i->second.set(NULL);

View File

@ -247,7 +247,6 @@ class Context
int mClientVersion;
TextureMap mZeroTextures;
TextureMap mIncompleteTextures;
typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap;

View File

@ -51,7 +51,14 @@ void Shader::setSource(GLsizei count, const char *const *string, const GLint *le
for (int i = 0; i < count; i++)
{
stream << string[i];
if (length == nullptr || length[i] < 0)
{
stream.write(string[i], std::strlen(string[i]));
}
else
{
stream.write(string[i], length[i]);
}
}
mSource = stream.str();

View File

@ -26,6 +26,11 @@ RendererD3D::RendererD3D(egl::Display *display)
}
RendererD3D::~RendererD3D()
{
cleanup();
}
void RendererD3D::cleanup()
{
for (gl::TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); ++i)
{

View File

@ -160,6 +160,8 @@ class RendererD3D : public Renderer
const gl::Rectangle *scissor, bool blitRenderTarget,
bool blitDepth, bool blitStencil, GLenum filter) = 0;
void cleanup();
egl::Display *mDisplay;
private:

View File

@ -1870,6 +1870,8 @@ bool Renderer11::testDeviceResettable()
void Renderer11::release()
{
RendererD3D::cleanup();
releaseShaderCompiler();
releaseDeviceResources();

View File

@ -151,6 +151,8 @@ Renderer9::~Renderer9()
void Renderer9::release()
{
RendererD3D::cleanup();
releaseShaderCompiler();
releaseDeviceResources();

View File

@ -0,0 +1,18 @@
Index: pcre_exec.c
===================================================================
--- pcre_exec.c (revisione 1512)
+++ pcre_exec.c (revisione 1513)
@@ -1404,8 +1404,11 @@
condition = TRUE;
/* Advance ecode past the assertion to the start of the first branch,
- but adjust it so that the general choosing code below works. */
-
+ but adjust it so that the general choosing code below works. If the
+ assertion has a quantifier that allows zero repeats we must skip over
+ the BRAZERO. This is a lunatic thing to do, but somebody did! */
+
+ if (*ecode == OP_BRAZERO) ecode++;
ecode += GET(ecode, 1);
while (*ecode == OP_ALT) ecode += GET(ecode, 1);
ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode];

View File

@ -1394,8 +1394,11 @@ for (;;)
condition = TRUE;
/* Advance ecode past the assertion to the start of the first branch,
but adjust it so that the general choosing code below works. */
but adjust it so that the general choosing code below works. If the
assertion has a quantifier that allows zero repeats we must skip over
the BRAZERO. This is a lunatic thing to do, but somebody did! */
if (*ecode == OP_BRAZERO) ecode++;
ecode += GET(ecode, 1);
while (*ecode == OP_ALT) ecode += GET(ecode, 1);
ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode];

View File

@ -4,7 +4,8 @@ API_VERSION = android-16
PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/accessibility
JAVACLASSPATH += $$PWD/src/
JAVACLASSPATH += $$PWD/src/ \
$$DESTDIR/QtAndroid-bundled.jar
JAVASOURCES += \
$$PATHPREFIX/QtAccessibilityDelegate.java \
$$PATHPREFIX/QtNativeAccessibility.java

View File

@ -43,6 +43,7 @@
package org.qtproject.qt5.android.accessibility;
import android.accessibilityservice.AccessibilityService;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
@ -60,6 +61,8 @@ import android.content.Context;
import java.util.LinkedList;
import java.util.List;
import org.qtproject.qt5.android.QtActivityDelegate;
public class QtAccessibilityDelegate extends View.AccessibilityDelegate
{
private static final String TAG = "Qt A11Y";
@ -72,8 +75,11 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
// Pretend to be an inner class of the QtSurface.
private static final String DEFAULT_CLASS_NAME = "$VirtualChild";
private final View m_view;
private final AccessibilityManager m_manager;
private View m_view = null;
private AccessibilityManager m_manager;
private QtActivityDelegate m_activityDelegate;
private Activity m_activity;
private ViewGroup m_layout;
// The accessible object that currently has the "accessibility focus"
// usually indicated by a yellow rectangle on screen.
@ -95,17 +101,71 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
}
}
public QtAccessibilityDelegate(View host)
public QtAccessibilityDelegate(Activity activity, ViewGroup layout, QtActivityDelegate activityDelegate)
{
m_view = host;
m_view.setOnHoverListener(new HoverEventListener());
m_manager = (AccessibilityManager) host.getContext()
.getSystemService(Context.ACCESSIBILITY_SERVICE);
m_activity = activity;
m_layout = layout;
m_activityDelegate = activityDelegate;
m_manager = (AccessibilityManager) m_activity.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (m_manager != null) {
AccessibilityManagerListener accServiceListener = new AccessibilityManagerListener();
if (!m_manager.addAccessibilityStateChangeListener(accServiceListener))
Log.w("Qt A11y", "Could not register a11y state change listener");
if (m_manager.isEnabled())
accServiceListener.onAccessibilityStateChanged(true);
}
// Enable Qt Accessibility so that notifications are enabled
QtNativeAccessibility.setActive(true);
}
private class AccessibilityManagerListener implements AccessibilityManager.AccessibilityStateChangeListener
{
@Override
public void onAccessibilityStateChanged(boolean enabled)
{
if (enabled) {
// The accessibility code depends on android API level 16, so dynamically resolve it
if (android.os.Build.VERSION.SDK_INT >= 16) {
try {
View view = m_view;
if (view == null) {
view = new View(m_activity);
view.setId(View.NO_ID);
}
// ### Keep this for debugging for a while. It allows us to visually see that our View
// ### is on top of the surface(s)
// ColorDrawable color = new ColorDrawable(0x80ff8080); //0xAARRGGBB
// view.setBackground(color);
view.setAccessibilityDelegate(QtAccessibilityDelegate.this);
// if all is fine, add it to the layout
if (m_view == null) {
//m_layout.addAccessibilityView(view);
m_layout.addView(view, m_activityDelegate.getSurfaceCount(),
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
m_view = view;
m_view.setOnHoverListener(new HoverEventListener());
} catch (Exception e) {
// Unknown exception means something went wrong.
Log.w("Qt A11y", "Unknown exception: " + e.toString());
}
}
} else {
if (m_view != null) {
m_layout.removeView(m_view);
m_view = null;
}
}
}
}
@Override
public AccessibilityNodeProvider getAccessibilityNodeProvider(View host)
{

View File

@ -1,2 +1,3 @@
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = jar java templates accessibility

View File

@ -80,6 +80,7 @@ import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
@ -321,7 +322,6 @@ public class QtActivityDelegate
m_layout.removeView(m_editText);
m_layout.addView(m_editText, new QtLayout.LayoutParams(width, height, x, y));
m_editText.bringToFront();
m_editText.requestFocus();
m_editText.postDelayed(new Runnable() {
@Override
@ -803,6 +803,22 @@ public class QtActivityDelegate
m_nativeViews = new HashMap<Integer, View>();
m_activity.registerForContextMenu(m_layout);
// Initialize accessibility
try {
final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate";
Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName);
Constructor constructor = qtDelegateClass.getConstructor(android.app.Activity.class,
android.view.ViewGroup.class,
this.getClass());
Object accessibilityDelegate = constructor.newInstance(m_activity, m_layout, this);
} catch (ClassNotFoundException e) {
// Class not found is fine since we are compatible with Android API < 16, but the function will
// only be available with that API level.
} catch (Exception e) {
// Unknown exception means something went wrong.
Log.w("Qt A11y", "Unknown exception: " + e.toString());
}
m_activity.setContentView(m_layout,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
@ -1179,8 +1195,8 @@ public class QtActivityDelegate
// Native views are always inserted in the end of the stack (i.e., on top).
// All other views are stacked based on the order they are created.
final int index = m_layout.getChildCount() - m_nativeViews.size() - 1;
m_layout.addView(surface, index < 0 ? 0 : index);
final int surfaceCount = getSurfaceCount();
m_layout.addView(surface, surfaceCount);
m_surfaces.put(id, surface);
}
@ -1221,12 +1237,18 @@ public class QtActivityDelegate
}
}
public int getSurfaceCount()
{
return m_surfaces.size();
}
public void bringChildToFront(int id)
{
View view = m_surfaces.get(id);
if (view != null) {
final int index = m_layout.getChildCount() - m_nativeViews.size() - 1;
m_layout.moveChild(view, index < 0 ? 0 : index);
final int surfaceCount = getSurfaceCount();
if (surfaceCount > 0)
m_layout.moveChild(view, surfaceCount - 1);
return;
}
@ -1245,7 +1267,7 @@ public class QtActivityDelegate
view = m_nativeViews.get(id);
if (view != null) {
final int index = m_layout.getChildCount() - m_nativeViews.size();
final int index = getSurfaceCount();
m_layout.moveChild(view, index);
}
}

View File

@ -88,26 +88,6 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback
public void surfaceCreated(SurfaceHolder holder)
{
QtNative.setSurface(getId(), holder.getSurface(), getWidth(), getHeight());
// Initialize Accessibility
// The accessibility code depends on android API level 16, so dynamically resolve it
if (android.os.Build.VERSION.SDK_INT >= 16) {
try {
final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate";
Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName);
Constructor constructor = qtDelegateClass.getConstructor(Class.forName("android.view.View"));
m_accessibilityDelegate = constructor.newInstance(this);
Class a11yDelegateClass = Class.forName("android.view.View$AccessibilityDelegate");
Method setDelegateMethod = this.getClass().getMethod("setAccessibilityDelegate", a11yDelegateClass);
setDelegateMethod.invoke(this, m_accessibilityDelegate);
} catch (ClassNotFoundException e) {
// Class not found is fine since we are compatible with Android API < 16, but the function will
// only be available with that API level.
} catch (Exception e) {
// Unknown exception means something went wrong.
Log.w("Qt A11y", "Unknown exception: " + e.toString());
}
}
}
@Override

View File

@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

View File

@ -187,7 +187,7 @@ public class QtActivity extends Activity
QT_ANDROID_THEMES = new String[] {"Theme_Light"};
QT_ANDROID_DEFAULT_THEME = "Theme_Light";
}
else if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT <= 13) {
else if ((Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT <= 13) || Build.VERSION.SDK_INT == 21){
QT_ANDROID_THEMES = new String[] {"Theme_Holo_Light"};
QT_ANDROID_DEFAULT_THEME = "Theme_Holo_Light";
} else {

View File

@ -0,0 +1,106 @@
From 014d3fcf6011109491b0489da9c1abb1fdc6dbdc Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@theqtcompany.com>
Date: Mon, 24 Nov 2014 10:52:03 +0100
Subject: [PATCH] ANGLE: Fix releasing textures after we kill D3D11
Cherry-pick upstream commit cc4cd2925b9a4f1142a86df131345a861c9d7cd9
to fix crashes on exit.
Task-number: QTBUG-42772
Change-Id: Ib74be17f2b5fdd58f9e0568e1da74ba19e943019
---
src/3rdparty/angle/src/libGLESv2/Context.cpp | 6 ------
src/3rdparty/angle/src/libGLESv2/Context.h | 1 -
src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp | 5 +++++
src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h | 2 ++
src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 2 ++
src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 2 ++
6 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/src/3rdparty/angle/src/libGLESv2/Context.cpp b/src/3rdparty/angle/src/libGLESv2/Context.cpp
index b87689c..3772da6 100644
--- a/src/3rdparty/angle/src/libGLESv2/Context.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/Context.cpp
@@ -162,12 +162,6 @@ Context::~Context()
deleteTransformFeedback(mTransformFeedbackMap.begin()->first);
}
- for (TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); i++)
- {
- i->second.set(NULL);
- }
- mIncompleteTextures.clear();
-
for (TextureMap::iterator i = mZeroTextures.begin(); i != mZeroTextures.end(); i++)
{
i->second.set(NULL);
diff --git a/src/3rdparty/angle/src/libGLESv2/Context.h b/src/3rdparty/angle/src/libGLESv2/Context.h
index 1e890de..0699592 100644
--- a/src/3rdparty/angle/src/libGLESv2/Context.h
+++ b/src/3rdparty/angle/src/libGLESv2/Context.h
@@ -247,7 +247,6 @@ class Context
int mClientVersion;
TextureMap mZeroTextures;
- TextureMap mIncompleteTextures;
typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap;
diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp
index 97da6da..5cddd8a 100644
--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp
@@ -27,6 +27,11 @@ RendererD3D::RendererD3D(egl::Display *display)
RendererD3D::~RendererD3D()
{
+ cleanup();
+}
+
+void RendererD3D::cleanup()
+{
for (gl::TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); ++i)
{
i->second.set(NULL);
diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h
index 9919207..a2f7787 100644
--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h
+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h
@@ -160,6 +160,8 @@ class RendererD3D : public Renderer
const gl::Rectangle *scissor, bool blitRenderTarget,
bool blitDepth, bool blitStencil, GLenum filter) = 0;
+ void cleanup();
+
egl::Display *mDisplay;
private:
diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
index e6d7f30..777308e 100644
--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
@@ -1870,6 +1870,8 @@ bool Renderer11::testDeviceResettable()
void Renderer11::release()
{
+ RendererD3D::cleanup();
+
releaseShaderCompiler();
releaseDeviceResources();
diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
index 601cd24..18e6e2d 100644
--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
@@ -151,6 +151,8 @@ Renderer9::~Renderer9()
void Renderer9::release()
{
+ RendererD3D::cleanup();
+
releaseShaderCompiler();
releaseDeviceResources();
--
1.9.4.msysgit.0

View File

@ -0,0 +1,37 @@
From 5e277b05a16e7be24d36c600f158f8119ee583d8 Mon Sep 17 00:00:00 2001
From: Andrew Knight <andrew.knight@theqtcompany.com>
Date: Mon, 1 Dec 2014 11:58:08 +0200
Subject: [PATCH] ANGLE: Fix handling of shader source with fixed length
This is a cherry-pick of upstream f60fab6d154f4c9bf599e92976cd8cee7f8633e0
(See https://chromium-review.googlesource.com/231612)
Task-number: QTBUG-42882
Change-Id: I7b4bdc4b68a1b93ff514f09ce35dbf4e9360af9b
---
src/3rdparty/angle/src/libGLESv2/Shader.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/3rdparty/angle/src/libGLESv2/Shader.cpp b/src/3rdparty/angle/src/libGLESv2/Shader.cpp
index 1cc17a0..5bca746 100644
--- a/src/3rdparty/angle/src/libGLESv2/Shader.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/Shader.cpp
@@ -51,7 +51,14 @@ void Shader::setSource(GLsizei count, const char *const *string, const GLint *le
for (int i = 0; i < count; i++)
{
- stream << string[i];
+ if (length == nullptr || length[i] < 0)
+ {
+ stream.write(string[i], std::strlen(string[i]));
+ }
+ else
+ {
+ stream.write(string[i], length[i]);
+ }
}
mSource = stream.str();
--
1.9.4.msysgit.1

View File

@ -380,7 +380,7 @@ QTextCodec::ConverterState::~ConverterState()
If Qt is compiled with ICU support enabled, most codecs supported by
ICU will also be available to the application.
QTextCodecs can be used as follows to convert some locally encoded
\l {QTextCodec}s can be used as follows to convert some locally encoded
string to Unicode. Suppose you have some string encoded in Russian
KOI8-R encoding, and want to convert it to Unicode. The simple way
to do it is like this:
@ -453,7 +453,7 @@ QTextCodec::ConverterState::~ConverterState()
\li Converts a Unicode string to an 8-bit character string.
\endtable
\sa QTextStream, QTextDecoder, QTextEncoder, {Codecs Example}
\sa QTextStream, QTextDecoder, QTextEncoder, {Text Codecs Example}
*/
/*!

View File

@ -1201,11 +1201,14 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
}
#endif
} else if (token == timeTokenC) {
quint64 ms = pattern->timer.elapsed();
if (pattern->timeFormat.isEmpty())
if (pattern->timeFormat == QLatin1String("process")) {
quint64 ms = pattern->timer.elapsed();
message.append(QString().sprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000)));
else
message.append(pattern->startTime.addMSecs(ms).toString(pattern->timeFormat));
} else if (pattern->timeFormat.isEmpty()) {
message.append(QDateTime::currentDateTime().toString(Qt::ISODate));
} else {
message.append(QDateTime::currentDateTime().toString(pattern->timeFormat));
}
#endif
} else if (token == ifCategoryTokenC) {
if (!context.category || (strcmp(context.category, "default") == 0))
@ -1550,9 +1553,10 @@ void qErrnoWarning(int code, const char *msg, ...)
\row \li \c %{pid} \li QCoreApplication::applicationPid()
\row \li \c %{threadid} \li ID of current thread
\row \li \c %{type} \li "debug", "warning", "critical" or "fatal"
\row \li \c %{time} \li time of the message, in seconds since the process started
\row \li \c %{time format} \li system time when the message occurred, formatted by
passing the \c format to \l QDateTime::toString()
\row \li \c %{time process} \li time of the message, in seconds since the process started (the token "process" is literal)
\row \li \c %{time [format]} \li system time when the message occurred, formatted by
passing the \c format to \l QDateTime::toString(). If the format is
not specified, the format of Qt::ISODate is used.
\row \li \c{%{backtrace [depth=N] [separator="..."]}} \li A backtrace with the number of frames
specified by the optional \c depth parameter (defaults to 5), and separated by the optional
\c separator parameter (defaults to "|").

View File

@ -425,8 +425,8 @@ QDebug &QDebug::resetFormat()
\brief Convenience class for custom QDebug operators
Saves the settings used by QDebug, and restores them upon destruction,
then calls maybeSpace(), to separate arguments with a space if
autoInsertSpaces() was true at the time of constructing the QDebugStateSaver.
then calls \l {QDebug::maybeSpace()}{maybeSpace()}, to separate arguments with a space if
\l {QDebug::autoInsertSpaces()}{autoInsertSpaces()} was true at the time of constructing the QDebugStateSaver.
The automatic insertion of spaces between writes is one of the settings
that QDebugStateSaver stores for the duration of the current block.

View File

@ -240,7 +240,7 @@ bool QFileDevice::isSequential() const
Returns the file handle of the file.
This is a small positive integer, suitable for use with C library
functions such as fdopen() and fcntl(). On systems that use file
functions such as \c fdopen() and \c fcntl(). On systems that use file
descriptors for sockets (i.e. Unix systems, but not Windows) the handle
can be used with QSocketNotifier as well.
@ -389,9 +389,9 @@ bool QFileDevice::atEnd() const
return false.
Seeking beyond the end of a file:
If the position is beyond the end of a file, then seek() shall not
If the position is beyond the end of a file, then seek() will not
immediately extend the file. If a write is performed at this position,
then the file shall be extended. The content of the file between the
then the file will be extended. The content of the file between the
previous end of file and the newly written data is UNDEFINED and
varies between platforms and file systems.
*/

View File

@ -518,7 +518,6 @@ bool QFseventsFileSystemWatcherEngine::startStream()
NULL
};
const CFAbsoluteTime latency = .5; // in seconds
FSEventStreamCreateFlags flags = kFSEventStreamCreateFlagWatchRoot;
// Never start with kFSEventStreamEventIdSinceNow, because this will generate an invalid
// soft-assert in FSEventStreamFlushSync in CarbonCore when no event occurred.
@ -530,7 +529,7 @@ bool QFseventsFileSystemWatcherEngine::startStream()
reinterpret_cast<CFArrayRef>(pathsToWatch),
lastReceivedEvent,
latency,
flags);
FSEventStreamCreateFlags(0));
if (!stream) {
DEBUG() << "Failed to create stream!";

View File

@ -149,10 +149,10 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
Order of evaluation:
\list
\li Rules from QtProject/qtlogging.ini
\li Rules set by \l setFilterRules()
\li Rules from file in \c QT_LOGGING_CONF
\li Rules from environment variable QT_LOGGING_RULES
\li QtProject/qtlogging.ini
\li \l setFilterRules()
\li \c QT_LOGGING_CONF
\li \c QT_LOGGING_RULES
\endlist
The \c QtProject/qtlogging.ini file is looked up in all directories returned

View File

@ -1853,8 +1853,8 @@ void QProcess::setProcessState(ProcessState state)
/*!
This function is called in the child process context just before the
program is executed on Unix or Mac OS X (i.e., after \e fork(), but before
\e execve()). Reimplement this function to do last minute initialization
program is executed on Unix or OS X (i.e., after \c fork(), but before
\c execve()). Reimplement this function to do last minute initialization
of the child process. Example:
\snippet code/src_corelib_io_qprocess.cpp 4
@ -1864,7 +1864,7 @@ void QProcess::setProcessState(ProcessState state)
execution, your workaround is to emit finished() and then call
exit().
\warning This function is called by QProcess on Unix and Mac OS X
\warning This function is called by QProcess on Unix and OS X
only. On Windows and QNX, it is not called.
*/
void QProcess::setupChildProcess()
@ -2272,7 +2272,7 @@ void QProcess::setArguments(const QStringList &arguments)
On Windows, terminate() posts a WM_CLOSE message to all toplevel windows
of the process and then to the main thread of the process itself. On Unix
and Mac OS X the SIGTERM signal is sent.
and OS X the \c SIGTERM signal is sent.
Console applications on Windows that do not run an event loop, or whose
event loop does not handle the WM_CLOSE message, can only be terminated by
@ -2289,7 +2289,7 @@ void QProcess::terminate()
/*!
Kills the current process, causing it to exit immediately.
On Windows, kill() uses TerminateProcess, and on Unix and Mac OS X, the
On Windows, kill() uses TerminateProcess, and on Unix and OS X, the
SIGKILL signal is sent to the process.
\sa terminate()

View File

@ -588,11 +588,11 @@ QString QStandardPaths::displayName(StandardLocation type)
GenericCacheLocation, CacheLocation.
Other locations are not affected.
On Unix, XDG_DATA_HOME is set to ~/.qttest/share, XDG_CONFIG_HOME is
set to ~/.qttest/config, and XDG_CACHE_HOME is set to ~/.qttest/cache.
On Unix, \c XDG_DATA_HOME is set to \e ~/.qttest/share, \c XDG_CONFIG_HOME is
set to \e ~/.qttest/config, and \c XDG_CACHE_HOME is set to \e ~/.qttest/cache.
On Mac, data goes to "~/.qttest/Application Support", cache goes to
~/.qttest/Cache, and config goes to ~/.qttest/Preferences.
On OS X, data goes to \e ~/.qttest/Application Support, cache goes to
\e ~/.qttest/Cache, and config goes to \e ~/.qttest/Preferences.
On Windows, everything goes to a "qttest" directory under Application Data.
*/

View File

@ -180,7 +180,7 @@ void QTemporaryDirPrivate::create(const QString &templateName)
\snippet code/src_corelib_io_qtemporarydir.cpp 0
It is very important to test that the temporary directory could be
created, using isValid(). Do not use exists(), since a default-constructed
created, using isValid(). Do not use \l {QDir::exists()}{exists()}, since a default-constructed
QDir represents the current directory, which exists.
The path to the temporary dir can be found by calling path().

View File

@ -85,8 +85,8 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\li Chunk by chunk, by calling readLine() or readAll().
\li Word by word. QTextStream supports streaming into QStrings,
QByteArrays and char* buffers. Words are delimited by space, and
\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 is automatically skipped.
\li Character by character, by streaming into QChar or char types.
@ -158,7 +158,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
parameter: qSetFieldWidth(), qSetPadChar(), and
qSetRealNumberPrecision().
\sa QDataStream, QIODevice, QFile, QBuffer, QTcpSocket, {Codecs Example}
\sa QDataStream, QIODevice, QFile, QBuffer, QTcpSocket, {Text Codecs Example}
*/
/*! \enum QTextStream::RealNumberNotation
@ -1557,7 +1557,7 @@ bool QTextStream::atEnd() const
QString. Avoid this function when working on large files, as it
will consume a significant amount of memory.
Calling readLine() is better if you do not know how much data is
Calling \l {QTextStream::readLine()}{readLine()} is better if you do not know how much data is
available.
\sa readLine()
@ -1582,9 +1582,9 @@ QString QTextStream::readAll()
The returned line has no trailing end-of-line characters ("\\n"
or "\\r\\n"), so calling QString::trimmed() is unnecessary.
If the stream has read to the end of the file, readLine() will return a
null QString. For strings, or for devices that support it, you can
explicitly test for the end of the stream using atEnd().
If the stream has read to the end of the file, \l {QTextStream::readLine()}{readLine()}
will return a null QString. For strings, or for devices that support it,
you can explicitly test for the end of the stream using atEnd().
\sa readAll(), QIODevice::readLine()
*/
@ -2816,7 +2816,7 @@ QTextStream &endl(QTextStream &stream)
/*!
\relates QTextStream
Calls QTextStream::flush() on \a stream and returns \a stream.
Calls \l{QTextStream::flush()}{flush()} on \a stream and returns \a stream.
\sa endl(), reset(), {QTextStream manipulators}
*/

View File

@ -2687,8 +2687,8 @@ void QUrl::setQuery(const QUrlQuery &query)
Sets the query string of the URL to an encoded version of \a
query. The contents of \a query are converted to a string
internally, each pair delimited by the character returned by
queryPairDelimiter(), and the key and value are delimited by
queryValueDelimiter().
\l {QUrlQuery::queryPairDelimiter()}{queryPairDelimiter()}, and the key and value are delimited by
\l {QUrlQuery::queryValueDelimiter()}{queryValueDelimiter()}
\note This method does not encode spaces (ASCII 0x20) as plus (+) signs,
like HTML forms do. If you need that kind of encoding, you must encode
@ -2707,8 +2707,8 @@ void QUrl::setQuery(const QUrlQuery &query)
Sets the query string of the URL to the encoded version of \a
query. The contents of \a query are converted to a string
internally, each pair delimited by the character returned by
queryPairDelimiter(), and the key and value are delimited by
queryValueDelimiter().
\l {QUrlQuery::queryPairDelimiter()}{queryPairDelimiter()}, and the key and value are delimited by
\l {QUrlQuery::queryValueDelimiter()}{queryValueDelimiter()}.
\obsolete Use QUrlQuery and setQuery().
@ -2725,8 +2725,9 @@ void QUrl::setQuery(const QUrlQuery &query)
The key-value pair is encoded before it is added to the query. The
pair is converted into separate strings internally. The \a key and
\a value is first encoded into UTF-8 and then delimited by the
character returned by queryValueDelimiter(). Each key-value pair is
delimited by the character returned by queryPairDelimiter().
character returned by \l {QUrlQuery::queryValueDelimiter()}{queryValueDelimiter()}.
Each key-value pair is delimited by the character returned by
\l {QUrlQuery::queryPairDelimiter()}{queryPairDelimiter()}
\note This method does not encode spaces (ASCII 0x20) as plus (+) signs,
like HTML forms do. If you need that kind of encoding, you must encode

View File

@ -37,7 +37,7 @@
#include "qbytearray.h"
#include "qhash.h"
QT_USE_NAMESPACE
QT_BEGIN_NAMESPACE
// Environment ------------------------------------------------------
inline QHash<QByteArray, QByteArray> &qt_app_environment()
@ -94,4 +94,6 @@ void qt_winrt__tzset()
{
}
QT_END_NAMESPACE
#endif // Q_OS_WINRT

View File

@ -42,82 +42,6 @@
#include <QtCore/QAbstractEventDispatcher>
#include <QtCore/qt_windows.h>
QT_BEGIN_NAMESPACE
#ifdef QT_BUILD_CORE_LIB
#endif
QT_END_NAMESPACE
#ifdef Q_OS_WINRT
// Environment ------------------------------------------------------
errno_t qt_winrt_getenv_s(size_t*, char*, size_t, const char*);
errno_t qt_winrt__putenv_s(const char*, const char*);
void qt_winrt_tzset();
void qt_winrt__tzset();
// As Windows Runtime lacks some standard functions used in Qt, these got
// reimplemented. Other projects do this as well. Inline functions are used
// that there is a central place to disable functions for newer versions if
// they get available. There are no defines used anymore, because this
// will break member functions of classes which are called like these
// functions.
// The other declarations available in this file are being used per
// define inside qplatformdefs.h of the corresponding WinRT mkspec.
#define generate_inline_return_func0(funcname, returntype) \
inline returntype funcname() \
{ \
return qt_winrt_##funcname(); \
}
#define generate_inline_return_func1(funcname, returntype, param1) \
inline returntype funcname(param1 p1) \
{ \
return qt_winrt_##funcname(p1); \
}
#define generate_inline_return_func2(funcname, returntype, param1, param2) \
inline returntype funcname(param1 p1, param2 p2) \
{ \
return qt_winrt_##funcname(p1, p2); \
}
#define generate_inline_return_func3(funcname, returntype, param1, param2, param3) \
inline returntype funcname(param1 p1, param2 p2, param3 p3) \
{ \
return qt_winrt_##funcname(p1, p2, p3); \
}
#define generate_inline_return_func4(funcname, returntype, param1, param2, param3, param4) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4) \
{ \
return qt_winrt_##funcname(p1, p2, p3, p4); \
}
#define generate_inline_return_func5(funcname, returntype, param1, param2, param3, param4, param5) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \
{ \
return qt_winrt_##funcname(p1, p2, p3, p4, p5); \
}
#define generate_inline_return_func6(funcname, returntype, param1, param2, param3, param4, param5, param6) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \
{ \
return qt_winrt_##funcname(p1, p2, p3, p4, p5, p6); \
}
#define generate_inline_return_func7(funcname, returntype, param1, param2, param3, param4, param5, param6, param7) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \
{ \
return qt_winrt_##funcname(p1, p2, p3, p4, p5, p6, p7); \
}
typedef unsigned (__stdcall *StartAdressExFunc)(void *);
typedef void(*StartAdressFunc)(void *);
typedef int ( __cdecl *CompareFunc ) (const void *, const void *) ;
generate_inline_return_func4(getenv_s, errno_t, size_t *, char *, size_t, const char *)
generate_inline_return_func2(_putenv_s, errno_t, const char *, const char *)
generate_inline_return_func0(tzset, void)
generate_inline_return_func0(_tzset, void)
#endif // Q_OS_WINRT
// Convenience macros for handling HRESULT values
#define RETURN_IF_FAILED(msg, ret) \
if (FAILED(hr)) { \
@ -133,6 +57,81 @@ generate_inline_return_func0(_tzset, void)
#define Q_ASSERT_SUCCEEDED(hr) \
Q_ASSERT_X(SUCCEEDED(hr), Q_FUNC_INFO, qPrintable(qt_error_string(hr)));
#ifdef Q_OS_WINRT
QT_BEGIN_NAMESPACE
#ifdef QT_BUILD_CORE_LIB
#endif
// Environment ------------------------------------------------------
errno_t qt_winrt_getenv_s(size_t*, char*, size_t, const char*);
errno_t qt_winrt__putenv_s(const char*, const char*);
void qt_winrt_tzset();
void qt_winrt__tzset();
QT_END_NAMESPACE
// As Windows Runtime lacks some standard functions used in Qt, these got
// reimplemented. Other projects do this as well. Inline functions are used
// that there is a central place to disable functions for newer versions if
// they get available. There are no defines used anymore, because this
// will break member functions of classes which are called like these
// functions.
// The other declarations available in this file are being used per
// define inside qplatformdefs.h of the corresponding WinRT mkspec.
#define generate_inline_return_func0(funcname, returntype) \
inline returntype funcname() \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(); \
}
#define generate_inline_return_func1(funcname, returntype, param1) \
inline returntype funcname(param1 p1) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1); \
}
#define generate_inline_return_func2(funcname, returntype, param1, param2) \
inline returntype funcname(param1 p1, param2 p2) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2); \
}
#define generate_inline_return_func3(funcname, returntype, param1, param2, param3) \
inline returntype funcname(param1 p1, param2 p2, param3 p3) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3); \
}
#define generate_inline_return_func4(funcname, returntype, param1, param2, param3, param4) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4); \
}
#define generate_inline_return_func5(funcname, returntype, param1, param2, param3, param4, param5) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4, p5); \
}
#define generate_inline_return_func6(funcname, returntype, param1, param2, param3, param4, param5, param6) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4, p5, p6); \
}
#define generate_inline_return_func7(funcname, returntype, param1, param2, param3, param4, param5, param6, param7) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \
{ \
return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4, p5, p6, p7); \
}
typedef unsigned (__stdcall *StartAdressExFunc)(void *);
typedef void(*StartAdressFunc)(void *);
typedef int ( __cdecl *CompareFunc ) (const void *, const void *) ;
generate_inline_return_func4(getenv_s, errno_t, size_t *, char *, size_t, const char *)
generate_inline_return_func2(_putenv_s, errno_t, const char *, const char *)
generate_inline_return_func0(tzset, void)
generate_inline_return_func0(_tzset, void)
QT_BEGIN_NAMESPACE
namespace Microsoft { namespace WRL { template <typename T> class ComPtr; } }
@ -207,6 +206,10 @@ static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, U *results
} // QWinRTFunctions
QT_END_NAMESPACE
#endif // Q_OS_WINRT
#endif // Q_OS_WIN
#endif // QFUNCTIONS_WINRT_H

View File

@ -37,6 +37,7 @@
#include <QtCore/qhash.h>
#include <QtCore/qstring.h>
#include <QtCore/QThread>
#include <QtCore/QReadWriteLock>
QT_BEGIN_NAMESPACE
@ -45,11 +46,6 @@ static inline QString keyBase()
return QStringLiteral("%1%2%3");
}
static inline QByteArray threadBaseName()
{
return QByteArrayLiteral("QtThread-");
}
static QString qt_convertJString(jstring string)
{
QJNIEnvironmentPrivate env;
@ -74,6 +70,7 @@ static inline bool exceptionCheckAndClear(JNIEnv *env)
typedef QHash<QString, jclass> JClassHash;
Q_GLOBAL_STATIC(JClassHash, cachedClasses)
Q_GLOBAL_STATIC(QReadWriteLock, cachedClassesLock)
static QString toDotEncodedClassName(const char *className)
{
@ -82,8 +79,9 @@ static QString toDotEncodedClassName(const char *className)
static jclass getCachedClass(const QString &classDotEnc, bool *isCached = 0)
{
QHash<QString, jclass>::iterator it = cachedClasses->find(classDotEnc);
const bool found = (it != cachedClasses->end());
QReadLocker locker(cachedClassesLock);
const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(classDotEnc);
const bool found = (it != cachedClasses->constEnd());
if (isCached != 0)
*isCached = found;
@ -102,6 +100,12 @@ static jclass loadClassDotEnc(const QString &classDotEnc, JNIEnv *env)
if (!classLoader.isValid())
return 0;
QWriteLocker locker(cachedClassesLock);
// did we lose the race?
const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(classDotEnc);
if (it != cachedClasses->constEnd())
return it.value();
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(classDotEnc);
QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;",
@ -121,6 +125,7 @@ inline static jclass loadClass(const char *className, JNIEnv *env)
typedef QHash<QString, jmethodID> JMethodIDHash;
Q_GLOBAL_STATIC(JMethodIDHash, cachedMethodID)
Q_GLOBAL_STATIC(QReadWriteLock, cachedMethodIDLock)
static jmethodID getCachedMethodID(JNIEnv *env,
jclass clazz,
@ -128,11 +133,24 @@ static jmethodID getCachedMethodID(JNIEnv *env,
const char *sig,
bool isStatic = false)
{
jmethodID id = 0;
// TODO: We need to use something else then the ref. from clazz to avoid collisions.
QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
QHash<QString, jmethodID>::iterator it = cachedMethodID->find(key);
if (it == cachedMethodID->end()) {
const QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
QHash<QString, jmethodID>::const_iterator it;
{
QReadLocker locker(cachedMethodIDLock);
it = cachedMethodID->constFind(key);
if (it != cachedMethodID->constEnd())
return it.value();
}
{
QWriteLocker locker(cachedMethodIDLock);
it = cachedMethodID->constFind(key);
if (it != cachedMethodID->constEnd())
return it.value();
jmethodID id = 0;
if (isStatic)
id = env->GetStaticMethodID(clazz, name, sig);
else
@ -142,14 +160,13 @@ static jmethodID getCachedMethodID(JNIEnv *env,
id = 0;
cachedMethodID->insert(key, id);
} else {
id = it.value();
return id;
}
return id;
}
typedef QHash<QString, jfieldID> JFieldIDHash;
Q_GLOBAL_STATIC(JFieldIDHash, cachedFieldID)
Q_GLOBAL_STATIC(QReadWriteLock, cachedFieldIDLock)
static jfieldID getCachedFieldID(JNIEnv *env,
jclass clazz,
@ -157,10 +174,23 @@ static jfieldID getCachedFieldID(JNIEnv *env,
const char *sig,
bool isStatic = false)
{
jfieldID id = 0;
QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
QHash<QString, jfieldID>::iterator it = cachedFieldID->find(key);
if (it == cachedFieldID->end()) {
const QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
QHash<QString, jfieldID>::const_iterator it;
{
QReadLocker locker(cachedFieldIDLock);
it = cachedFieldID->constFind(key);
if (it != cachedFieldID->constEnd())
return it.value();
}
{
QWriteLocker locker(cachedFieldIDLock);
it = cachedFieldID->constFind(key);
if (it != cachedFieldID->constEnd())
return it.value();
jfieldID id = 0;
if (isStatic)
id = env->GetStaticFieldID(clazz, name, sig);
else
@ -170,10 +200,8 @@ static jfieldID getCachedFieldID(JNIEnv *env,
id = 0;
cachedFieldID->insert(key, id);
} else {
id = it.value();
return id;
}
return id;
}
class QJNIEnvironmentPrivateTLS
@ -187,14 +215,14 @@ public:
Q_GLOBAL_STATIC(QThreadStorage<QJNIEnvironmentPrivateTLS *>, jniEnvTLS)
static const char qJniThreadName[] = "QtThread";
QJNIEnvironmentPrivate::QJNIEnvironmentPrivate()
: jniEnv(0)
{
JavaVM *vm = QtAndroidPrivate::javaVM();
if (vm->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) == JNI_EDETACHED) {
const qulonglong id = reinterpret_cast<qulonglong>(QThread::currentThreadId());
const QByteArray threadName = threadBaseName() + QByteArray::number(id);
JavaVMAttachArgs args = { JNI_VERSION_1_6, threadName, Q_NULLPTR };
JavaVMAttachArgs args = { JNI_VERSION_1_6, qJniThreadName, Q_NULLPTR };
if (vm->AttachCurrentThread(&jniEnv, &args) != JNI_OK)
return;
}
@ -223,6 +251,12 @@ jclass QJNIEnvironmentPrivate::findClass(const char *className, JNIEnv *env)
return clazz;
if (env != 0) { // We got an env. pointer (We expect this to be the right env. and call FindClass())
QWriteLocker locker(cachedClassesLock);
const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(classDotEnc);
// Did we lose the race?
if (it != cachedClasses->constEnd())
return it.value();
jclass fclazz = env->FindClass(className);
if (!exceptionCheckAndClear(env)) {
clazz = static_cast<jclass>(env->NewGlobalRef(fclazz));
@ -400,7 +434,6 @@ QJNIObjectPrivate::QJNIObjectPrivate(jobject obj)
d->m_jclass = static_cast<jclass>(env->NewGlobalRef(objectClass));
env->DeleteLocalRef(objectClass);
}
template <>
void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const
{

View File

@ -86,13 +86,13 @@ static const uchar magic[MagicLength] = {
0xcd, 0x21, 0x1c, 0xbf, 0x60, 0xa1, 0xbd, 0xdd
};
static bool match(const uchar* found, const char* target, uint len)
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
{
// catch the case if \a found has a zero-terminating symbol and \a len includes it.
// (normalize it to be without the zero-terminating symbol)
if (len > 0 && found[len-1] == '\0')
--len;
return (memcmp(found, target, len) == 0 && target[len] == '\0');
if (foundLen > 0 && found[foundLen-1] == '\0')
--foundLen;
return ((targetLen == foundLen) && memcmp(found, target, foundLen) == 0);
}
static void elfHash_continue(const char *name, uint &h)
@ -878,6 +878,9 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
{
const uchar *tn = 0;
uint tn_length = 0;
const uint sourceTextLen = uint(strlen(sourceText));
const uint contextLen = uint(strlen(context));
const uint commentLen = uint(strlen(comment));
for (;;) {
uchar tag = 0;
@ -904,7 +907,7 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
case Tag_SourceText: {
quint32 len = read32(m);
m += 4;
if (!match(m, sourceText, len))
if (!match(m, len, sourceText, sourceTextLen))
return QString();
m += len;
}
@ -912,7 +915,7 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
case Tag_Context: {
quint32 len = read32(m);
m += 4;
if (!match(m, context, len))
if (!match(m, len, context, contextLen))
return QString();
m += len;
}
@ -920,7 +923,7 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
case Tag_Comment: {
quint32 len = read32(m);
m += 4;
if (*m && !match(m, comment, len))
if (*m && !match(m, len, comment, commentLen))
return QString();
m += len;
}
@ -970,11 +973,12 @@ QString QTranslatorPrivate::do_translate(const char *context, const char *source
return QString();
c = contextArray + (2 + (hTableSize << 1) + (off << 1));
const uint contextLen = uint(strlen(context));
for (;;) {
quint8 len = read8(c++);
if (len == 0)
return QString();
if (match(c, context, len))
if (match(c, len, context, contextLen))
break;
c += len;
}

View File

@ -168,43 +168,43 @@
\li STL function
\row
\li qBinaryFind
\li std::binary_search or std::lower_bound
\li \c std::binary_search or \c std::lower_bound
\row
\li qCopy
\li std::copy
\li \c std::copy
\row
\li qCopyBackward
\li std::copy_backward
\li \c std::copy_backward
\row
\li qEqual
\li std::equal
\li \c std::equal
\row
\li qFill
\li std::fill
\li \c std::fill
\row
\li qFind
\li std::find
\li \c std::find
\row
\li qCount
\li std::count
\li \c std::count
\row
\li qSort
\li std::sort
\li \c std::sort
\row
\li qStableSort
\li std::stable_sort
\li \c std::stable_sort
\row
\li qLowerBound
\li std::lower_bound
\li \c std::lower_bound
\row
\li qUpperBound
\li std::upper_bound
\li \c std::upper_bound
\row
\li qLess
\li std::less
\li \c std::less
\row
\li qGreater
\li std::greater
\li \c std::greater
\endtable
@ -223,7 +223,7 @@
Instead, since it's not possible to pass a custom swapper functor to STL
functions, the only workaround for a template specialization for qSwap() is
providing the same specialization for std::swap().
providing the same specialization for \c std::swap().
\sa {container classes}, <QtGlobal>
*/
@ -232,7 +232,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::copy instead.
Use \c std::copy instead.
Copies the items from range [\a begin1, \a end1) to range [\a
begin2, ...), in the order in which they appear.
@ -251,7 +251,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::copy_backward instead.
Use \c std::copy_backward instead.
Copies the items from range [\a begin1, \a end1) to range [...,
\a end2).
@ -270,7 +270,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::equal instead.
Use \c std::equal instead.
Compares the items in the range [\a begin1, \a end1) with the
items in the range [\a begin2, ...). Returns \c true if all the
@ -289,7 +289,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::fill instead.
Use \c std::fill instead.
Fills the range [\a begin, \a end) with \a value.
@ -304,7 +304,7 @@
\deprecated
\overload
Use std::fill instead.
Use \c std::fill instead.
This is the same as qFill(\a{container}.begin(), \a{container}.end(), \a value);
*/
@ -313,7 +313,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::find instead.
Use \c std::find instead.
Returns an iterator to the first occurrence of \a value in a
container in the range [\a begin, \a end). Returns \a end if \a
@ -337,16 +337,16 @@
\deprecated
\overload
Use std::find instead.
Use \c std::find instead.
This is the same as qFind(\a{container}.constBegin(), \a{container}.constEnd(), value);
This is the same as qFind(\a{container}.constBegin(), \a{container}.constEnd(), \a value);
*/
/*! \fn void qCount(InputIterator begin, InputIterator end, const T &value, Size &n)
\relates <QtAlgorithms>
\deprecated
Use std::count instead.
Use \c std::count instead.
Returns the number of occurrences of \a value in the range [\a begin, \a end),
which is returned in \a n. \a n is never initialized, the count is added to \a n.
@ -367,7 +367,7 @@
\deprecated
\overload
Use std::count instead.
Use \c std::count instead.
Instead of operating on iterators, as in the other overload, this function
operates on the specified \a container to obtain the number of instances
@ -378,7 +378,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::swap instead.
Use \c std::swap instead.
Exchanges the values of variables \a var1 and \a var2.
@ -390,7 +390,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::sort instead.
Use \c std::sort instead.
Sorts the items in range [\a begin, \a end) in ascending order
using the quicksort algorithm.
@ -416,7 +416,7 @@
\deprecated
\overload
Use std::sort instead.
Use \c std::sort instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@ -452,7 +452,7 @@
\deprecated
\overload
Use std::sort instead.
Use \c std::sort instead.
This is the same as qSort(\a{container}.begin(), \a{container}.end());
*/
@ -462,7 +462,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::stable_sort instead.
Use \c std::stable_sort instead.
Sorts the items in range [\a begin, \a end) in ascending order
using a stable sorting algorithm.
@ -490,7 +490,7 @@
\deprecated
\overload
Use std::stable_sort instead.
Use \c std::stable_sort instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@ -522,7 +522,7 @@
\deprecated
\overload
Use std::stable_sort instead.
Use \c std::stable_sort instead.
This is the same as qStableSort(\a{container}.begin(), \a{container}.end());
*/
@ -531,7 +531,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::lower_bound instead.
Use \c std::lower_bound instead.
Performs a binary search of the range [\a begin, \a end) and
returns the position of the first occurrence of \a value. If no
@ -561,7 +561,7 @@
\deprecated
\overload
Use std::lower_bound instead.
Use \c std::lower_bound instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@ -576,7 +576,7 @@
\deprecated
\overload
Use std::lower_bound instead.
Use \c std::lower_bound instead.
For read-only iteration over containers, this function is broadly equivalent to
qLowerBound(\a{container}.begin(), \a{container}.end(), value). However, since it
@ -588,7 +588,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::upper_bound instead.
Use \c std::upper_bound instead.
Performs a binary search of the range [\a begin, \a end) and
returns the position of the one-past-the-last occurrence of \a
@ -618,7 +618,7 @@
\deprecated
\overload
Use std::upper_bound instead.
Use \c std::upper_bound instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@ -633,9 +633,9 @@
\deprecated
\overload
Use std::upper_bound instead.
Use \c std::upper_bound instead.
This is the same as qUpperBound(\a{container}.begin(), \a{container}.end(), value);
This is the same as qUpperBound(\a{container}.begin(), \a{container}.end(), \a value);
*/
@ -643,7 +643,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::binary_search or std::lower_bound instead.
Use \c std::binary_search or \c std::lower_bound instead.
Performs a binary search of the range [\a begin, \a end) and
returns the position of an occurrence of \a value. If there are
@ -670,7 +670,7 @@
\deprecated
\overload
Use std::binary_search or std::lower_bound instead.
Use \c std::binary_search or \c std::lower_bound instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@ -685,9 +685,9 @@
\deprecated
\overload
Use std::binary_search or std::lower_bound instead.
Use \c std::binary_search or \c std::lower_bound instead.
This is the same as qBinaryFind(\a{container}.begin(), \a{container}.end(), value);
This is the same as qBinaryFind(\a{container}.begin(), \a{container}.end(), \a value);
*/
@ -727,7 +727,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::less instead.
Use \c std::less instead.
Returns a functional object, or functor, that can be passed to qSort()
or qStableSort().
@ -743,7 +743,7 @@
\relates <QtAlgorithms>
\deprecated
Use std::greater instead.
Use \c std::greater instead.
Returns a functional object, or functor, that can be passed to qSort()
or qStableSort().

View File

@ -61,7 +61,8 @@ HEADERS += $$PUB_HEADERS \
qdbusintegrator_p.h \
qdbuspendingcall_p.h \
qdbus_symbols_p.h \
qdbusintrospection_p.h
qdbusintrospection_p.h \
dbus_minimal_p.h
SOURCES += qdbusconnection.cpp \
qdbusconnectioninterface.cpp \
qdbuserror.cpp \

275
src/dbus/dbus_minimal_p.h Normal file
View File

@ -0,0 +1,275 @@
/****************************************************************************
**
** Copyright (C) 2014 Intel Corporation
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtDBus module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef DBUS_MINIMAL_P_H
#define DBUS_MINIMAL_P_H
extern "C" {
// Equivalent to dbus-arch-deps.h
typedef qint64 dbus_int64_t;
typedef quint64 dbus_uint64_t;
typedef qint32 dbus_int32_t;
typedef quint32 dbus_uint32_t;
typedef qint16 dbus_int16_t;
typedef quint16 dbus_uint16_t;
// simulate minimum version we support
#define DBUS_MAJOR_VERSION 1
#define DBUS_MINOR_VERSION 2
#define DBUS_VERSION ((1 << 16) | (2 << 8))
// forward declaration to opaque types we use
struct DBusConnection;
struct DBusMessage;
struct DBusPendingCall;
struct DBusServer;
struct DBusTimeout;
struct DBusWatch;
// This file contains constants and typedefs from libdbus-1 headers,
// which carry the following copyright:
/*
* Copyright (C) 2002, 2003 CodeFactory AB
* Copyright (C) 2004, 2005 Red Hat, Inc.
*
* Licensed under the Academic Free License version 2.1
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/* dbus-types.h */
typedef dbus_uint32_t dbus_unichar_t;
typedef dbus_uint32_t dbus_bool_t;
/* dbus-shared.h */
#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus"
#define DBUS_INTERFACE_INTROSPECTABLE "org.freedesktop.DBus.Introspectable"
#define DBUS_INTERFACE_PROPERTIES "org.freedesktop.DBus.Properties"
#define DBUS_NAME_FLAG_ALLOW_REPLACEMENT 0x1 /**< Allow another service to become the primary owner if requested */
#define DBUS_NAME_FLAG_REPLACE_EXISTING 0x2 /**< Request to replace the current primary owner */
#define DBUS_NAME_FLAG_DO_NOT_QUEUE 0x4 /**< If we can not become the primary owner do not place us in the queue */
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1 /**< Service has become the primary owner of the requested name */
#define DBUS_REQUEST_NAME_REPLY_IN_QUEUE 2 /**< Service could not become the primary owner and has been placed in the queue */
#define DBUS_REQUEST_NAME_REPLY_EXISTS 3 /**< Service is already in the queue */
#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4 /**< Service is already the primary owner */
#define DBUS_RELEASE_NAME_REPLY_RELEASED 1 /**< Service was released from the given name */
#define DBUS_RELEASE_NAME_REPLY_NON_EXISTENT 2 /**< The given name does not exist on the bus */
#define DBUS_RELEASE_NAME_REPLY_NOT_OWNER 3 /**< Service is not an owner of the given name */
typedef enum
{
DBUS_BUS_SESSION, /**< The login session bus */
DBUS_BUS_SYSTEM, /**< The systemwide bus */
DBUS_BUS_STARTER /**< The bus that started us, if any */
} DBusBusType;
typedef enum
{
DBUS_HANDLER_RESULT_HANDLED, /**< Message has had its effect - no need to run more handlers. */
DBUS_HANDLER_RESULT_NOT_YET_HANDLED, /**< Message has not had any effect - see if other handlers want it. */
DBUS_HANDLER_RESULT_NEED_MEMORY /**< Need more memory in order to return #DBUS_HANDLER_RESULT_HANDLED or #DBUS_HANDLER_RESULT_NOT_YET_HANDLED. Please try again later with more memory. */
} DBusHandlerResult;
/* dbus-memory.h */
typedef void (* DBusFreeFunction) (void *memory);
/* dbus-connection.h */
typedef enum
{
DBUS_WATCH_READABLE = 1 << 0, /**< As in POLLIN */
DBUS_WATCH_WRITABLE = 1 << 1, /**< As in POLLOUT */
DBUS_WATCH_ERROR = 1 << 2, /**< As in POLLERR (can't watch for
* this, but can be present in
* current state passed to
* dbus_watch_handle()).
*/
DBUS_WATCH_HANGUP = 1 << 3 /**< As in POLLHUP (can't watch for
* it, but can be present in current
* state passed to
* dbus_watch_handle()).
*/
/* Internal to libdbus, there is also _DBUS_WATCH_NVAL in dbus-watch.h */
} DBusWatchFlags;
typedef enum
{
DBUS_DISPATCH_DATA_REMAINS, /**< There is more data to potentially convert to messages. */
DBUS_DISPATCH_COMPLETE, /**< All currently available data has been processed. */
DBUS_DISPATCH_NEED_MEMORY /**< More memory is needed to continue. */
} DBusDispatchStatus;
typedef dbus_bool_t (* DBusAddWatchFunction) (DBusWatch *watch,
void *data);
typedef void (* DBusWatchToggledFunction) (DBusWatch *watch,
void *data);
typedef void (* DBusRemoveWatchFunction) (DBusWatch *watch,
void *data);
typedef dbus_bool_t (* DBusAddTimeoutFunction) (DBusTimeout *timeout,
void *data);
typedef void (* DBusTimeoutToggledFunction) (DBusTimeout *timeout,
void *data);
typedef void (* DBusRemoveTimeoutFunction) (DBusTimeout *timeout,
void *data);
typedef void (* DBusDispatchStatusFunction) (DBusConnection *connection,
DBusDispatchStatus new_status,
void *data);
typedef void (* DBusWakeupMainFunction) (void *data);
typedef void (* DBusPendingCallNotifyFunction) (DBusPendingCall *pending,
void *user_data);
typedef DBusHandlerResult (* DBusHandleMessageFunction) (DBusConnection *connection,
DBusMessage *message,
void *user_data);
/* dbus-errors.h */
struct DBusError
{
const char *name; /**< public error name field */
const char *message; /**< public error message field */
unsigned int dummy1 : 1; /**< placeholder */
unsigned int dummy2 : 1; /**< placeholder */
unsigned int dummy3 : 1; /**< placeholder */
unsigned int dummy4 : 1; /**< placeholder */
unsigned int dummy5 : 1; /**< placeholder */
void *padding1; /**< placeholder */
};
/* dbus-message.h */
struct DBusMessageIter
{
void *dummy1; /**< Don't use this */
void *dummy2; /**< Don't use this */
dbus_uint32_t dummy3; /**< Don't use this */
int dummy4; /**< Don't use this */
int dummy5; /**< Don't use this */
int dummy6; /**< Don't use this */
int dummy7; /**< Don't use this */
int dummy8; /**< Don't use this */
int dummy9; /**< Don't use this */
int dummy10; /**< Don't use this */
int dummy11; /**< Don't use this */
int pad1; /**< Don't use this */
int pad2; /**< Don't use this */
void *pad3; /**< Don't use this */
};
/* dbus-protocol.h */
#define DBUS_TYPE_INVALID ((int) '\0')
#define DBUS_TYPE_INVALID_AS_STRING "\0"
#define DBUS_TYPE_BYTE ((int) 'y')
#define DBUS_TYPE_BYTE_AS_STRING "y"
#define DBUS_TYPE_BOOLEAN ((int) 'b')
#define DBUS_TYPE_BOOLEAN_AS_STRING "b"
#define DBUS_TYPE_INT16 ((int) 'n')
#define DBUS_TYPE_INT16_AS_STRING "n"
#define DBUS_TYPE_UINT16 ((int) 'q')
#define DBUS_TYPE_UINT16_AS_STRING "q"
#define DBUS_TYPE_INT32 ((int) 'i')
#define DBUS_TYPE_INT32_AS_STRING "i"
#define DBUS_TYPE_UINT32 ((int) 'u')
#define DBUS_TYPE_UINT32_AS_STRING "u"
#define DBUS_TYPE_INT64 ((int) 'x')
#define DBUS_TYPE_INT64_AS_STRING "x"
#define DBUS_TYPE_UINT64 ((int) 't')
#define DBUS_TYPE_UINT64_AS_STRING "t"
#define DBUS_TYPE_DOUBLE ((int) 'd')
#define DBUS_TYPE_DOUBLE_AS_STRING "d"
#define DBUS_TYPE_STRING ((int) 's')
#define DBUS_TYPE_STRING_AS_STRING "s"
#define DBUS_TYPE_OBJECT_PATH ((int) 'o')
#define DBUS_TYPE_OBJECT_PATH_AS_STRING "o"
#define DBUS_TYPE_SIGNATURE ((int) 'g')
#define DBUS_TYPE_SIGNATURE_AS_STRING "g"
#define DBUS_TYPE_UNIX_FD ((int) 'h')
#define DBUS_TYPE_UNIX_FD_AS_STRING "h"
#define DBUS_TYPE_ARRAY ((int) 'a')
#define DBUS_TYPE_ARRAY_AS_STRING "a"
#define DBUS_TYPE_VARIANT ((int) 'v')
#define DBUS_TYPE_VARIANT_AS_STRING "v"
#define DBUS_TYPE_STRUCT ((int) 'r')
#define DBUS_TYPE_STRUCT_AS_STRING "r"
#define DBUS_TYPE_DICT_ENTRY ((int) 'e')
#define DBUS_TYPE_DICT_ENTRY_AS_STRING "e"
#define DBUS_STRUCT_BEGIN_CHAR ((int) '(')
#define DBUS_STRUCT_BEGIN_CHAR_AS_STRING "("
#define DBUS_STRUCT_END_CHAR ((int) ')')
#define DBUS_STRUCT_END_CHAR_AS_STRING ")"
#define DBUS_DICT_ENTRY_BEGIN_CHAR ((int) '{')
#define DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING "{"
#define DBUS_DICT_ENTRY_END_CHAR ((int) '}')
#define DBUS_DICT_ENTRY_END_CHAR_AS_STRING "}"
#define DBUS_MESSAGE_TYPE_INVALID 0
#define DBUS_MESSAGE_TYPE_METHOD_CALL 1
#define DBUS_MESSAGE_TYPE_METHOD_RETURN 2
#define DBUS_MESSAGE_TYPE_ERROR 3
#define DBUS_MESSAGE_TYPE_SIGNAL 4
#define DBUS_MAXIMUM_NAME_LENGTH 255
#define DBUS_INTROSPECT_1_0_XML_NAMESPACE "http://www.freedesktop.org/standards/dbus"
#define DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
#define DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"
#define DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\"" DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER "\">\n"
/* dbus-server.h */
typedef void (* DBusNewConnectionFunction) (DBusServer *server,
DBusConnection *new_connection,
void *data);
} // extern "C"
#endif // DBUS_MINIMAL_P_H

View File

@ -47,10 +47,15 @@
#define QDBUS_SYMBOLS_P_H
#include <QtCore/qglobal.h>
#include <dbus/dbus.h>
#ifndef QT_NO_DBUS
#ifdef QT_LINKED_LIBDBUS
# include <dbus/dbus.h>
#else
# include "dbus_minimal_p.h"
#endif
QT_BEGIN_NAMESPACE
#if !defined QT_LINKED_LIBDBUS

View File

@ -1184,6 +1184,7 @@ void QDBusConnectionPrivate::socketRead(int fd)
if (it->watch && it->read && it->read->isEnabled()) {
if (!q_dbus_watch_handle(it.value().watch, DBUS_WATCH_READABLE))
qDebug("OUT OF MEM");
break;
}
++it;
}
@ -1198,6 +1199,7 @@ void QDBusConnectionPrivate::socketWrite(int fd)
if (it->watch && it->write && it->write->isEnabled()) {
if (!q_dbus_watch_handle(it.value().watch, DBUS_WATCH_WRITABLE))
qDebug("OUT OF MEM");
break;
}
++it;
}

View File

@ -219,7 +219,7 @@ void qDBusReplyFill(const QDBusMessage &reply, QDBusError &error, QVariant &data
// error
if (receivedSignature.isEmpty())
receivedSignature = "no signature";
receivedSignature = "<empty signature>";
QString errorMsg;
if (receivedType) {
errorMsg = QString::fromLatin1("Unexpected reply signature: got \"%1\" (%4), "

View File

@ -116,6 +116,9 @@ void qInitImageConversions();
const uchar *qt_get_bitflip_array();
Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image);
#if defined(Q_OS_WINRT) && defined(_M_ARM) // QTBUG-42038
#pragma optimize("", off)
#endif
inline int qt_depthForFormat(QImage::Format format)
{
int depth = 0;
@ -160,6 +163,9 @@ inline int qt_depthForFormat(QImage::Format format)
}
return depth;
}
#if defined(Q_OS_WINRT) && defined(_M_ARM)
#pragma optimize("", on)
#endif
QT_END_NAMESPACE

View File

@ -38,6 +38,7 @@
#include <QtGui/QOpenGLFunctions>
#include <QtGui/private/qopengltextureblitter_p.h>
#include <QtGui/private/qopenglextensions_p.h>
#include <QtGui/private/qopenglcontext_p.h>
#include <QtGui/QMatrix4x4>
#include <QtGui/QOffscreenSurface>
@ -101,6 +102,10 @@ QT_BEGIN_NAMESPACE
this way they do not have to redraw the entire window content on each
paintGL() call.
Similarly to QOpenGLWidget, QOpenGLWindow supports the Qt::AA_ShareOpenGLContexts
attribute. When enabled, the OpenGL contexts of all QOpenGLWindow instances will share
with each other. This allows accessing each other's shareable OpenGL resources.
For more information on graphics in Qt, see \l {Graphics}.
*/
@ -196,6 +201,7 @@ public:
if (!context) {
context.reset(new QOpenGLContext);
context->setShareContext(qt_gl_global_share_context());
context->setFormat(q->requestedFormat());
if (!context->create())
qWarning("QOpenGLWindow::beginPaint: Failed to create context");

View File

@ -481,11 +481,9 @@ void QOpenGLFramebufferObjectPrivate::init(QOpenGLFramebufferObject *, const QSi
GLenum storageFormat = internal_format;
// ES requires a sized format. The older desktop extension does not. Correct the format on ES.
if (ctx->isOpenGLES() && internal_format == GL_RGBA) {
#ifdef GL_RGBA8_OES
if (funcs.hasOpenGLExtension(QOpenGLExtensions::Sized8Formats))
storageFormat = GL_RGBA8_OES;
storageFormat = GL_RGBA8;
else
#endif
storageFormat = GL_RGBA4;
}

View File

@ -107,7 +107,7 @@ QOpenGL2PaintEngineExPrivate::~QOpenGL2PaintEngineExPrivate()
}
}
void QOpenGL2PaintEngineExPrivate::updateTextureFilter(GLenum target, GLenum wrapMode, bool smoothPixmapTransform, GLuint id)
void QOpenGL2PaintEngineExPrivate::updateTextureFilter(GLenum wrapMode, bool smoothPixmapTransform, GLuint id)
{
// funcs.glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT); //### Is it always this texture unit?
if (id != GLuint(-1) && id == lastTextureUsed)
@ -115,6 +115,8 @@ void QOpenGL2PaintEngineExPrivate::updateTextureFilter(GLenum target, GLenum wra
lastTextureUsed = id;
static const GLenum target = GL_TEXTURE_2D;
if (smoothPixmapTransform) {
funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@ -122,6 +124,7 @@ void QOpenGL2PaintEngineExPrivate::updateTextureFilter(GLenum target, GLenum wra
funcs.glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
funcs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
funcs.glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapMode);
funcs.glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapMode);
}
@ -185,7 +188,7 @@ void QOpenGL2PaintEngineExPrivate::updateBrushTexture()
funcs.glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, texImage);
updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
updateTextureFilter(GL_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
}
else if (style >= Qt::LinearGradientPattern && style <= Qt::ConicalGradientPattern) {
// Gradiant brush: All the gradiants use the same texture
@ -196,15 +199,15 @@ void QOpenGL2PaintEngineExPrivate::updateBrushTexture()
// for opacity to the cache.
GLuint texId = QOpenGL2GradientCache::cacheForContext(ctx)->getBuffer(*g, 1.0);
GLenum wrapMode = GL_CLAMP_TO_EDGE;
if (g->spread() == QGradient::RepeatSpread || g->type() == QGradient::ConicalGradient)
wrapMode = GL_REPEAT;
else if (g->spread() == QGradient::ReflectSpread)
wrapMode = GL_MIRRORED_REPEAT;
funcs.glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
funcs.glBindTexture(GL_TEXTURE_2D, texId);
if (g->spread() == QGradient::RepeatSpread || g->type() == QGradient::ConicalGradient)
updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
else if (g->spread() == QGradient::ReflectSpread)
updateTextureFilter(GL_TEXTURE_2D, GL_MIRRORED_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
else
updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE, q->state()->renderHints & QPainter::SmoothPixmapTransform);
updateTextureFilter(wrapMode, q->state()->renderHints & QPainter::SmoothPixmapTransform);
}
else if (style == Qt::TexturePattern) {
currentBrushImage = currentBrush.textureImage();
@ -223,7 +226,8 @@ void QOpenGL2PaintEngineExPrivate::updateBrushTexture()
funcs.glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, currentBrushImage);
updateTextureFilter(GL_TEXTURE_2D, wrapMode, q->state()->renderHints & QPainter::SmoothPixmapTransform);
updateTextureFilter(wrapMode, q->state()->renderHints & QPainter::SmoothPixmapTransform);
textureInvertedY = false;
}
brushTextureDirty = false;
@ -1380,16 +1384,14 @@ void QOpenGL2PaintEngineEx::drawPixmap(const QRectF& dest, const QPixmap & pixma
d->funcs.glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
GLuint id = QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, pixmap);
QOpenGLRect srcRect(src.left(), src.top(), src.right(), src.bottom());
d->updateTextureFilter(GL_CLAMP_TO_EDGE, state()->renderHints & QPainter::SmoothPixmapTransform, id);
bool isBitmap = pixmap.isQBitmap();
bool isOpaque = !isBitmap && !pixmap.hasAlpha();
d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
state()->renderHints & QPainter::SmoothPixmapTransform, id);
d->shaderManager->setSrcPixelType(isBitmap ? QOpenGLEngineShaderManager::PatternSrc : QOpenGLEngineShaderManager::ImageSrc);
QOpenGLRect srcRect(src.left(), src.top(), src.right(), src.bottom());
d->drawTexture(dest, srcRect, pixmap.size(), isOpaque, isBitmap);
}
@ -1442,9 +1444,7 @@ void QOpenGL2PaintEngineEx::drawImage(const QRectF& dest, const QImage& image, c
d->funcs.glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
GLuint id = QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, image, bindOption);
d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
state()->renderHints & QPainter::SmoothPixmapTransform, id);
d->updateTextureFilter(GL_CLAMP_TO_EDGE, state()->renderHints & QPainter::SmoothPixmapTransform, id);
d->drawTexture(dest, src, image.size(), !image.hasAlphaChannel());
}
@ -1487,13 +1487,13 @@ bool QOpenGL2PaintEngineEx::drawTexture(const QRectF &dest, GLuint textureId, co
d->funcs.glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
d->funcs.glBindTexture(GL_TEXTURE_2D, textureId);
d->updateTextureFilter(GL_CLAMP_TO_EDGE, state()->renderHints & QPainter::SmoothPixmapTransform, textureId);
d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
QOpenGLRect srcRect(src.left(), src.bottom(), src.right(), src.top());
d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
state()->renderHints & QPainter::SmoothPixmapTransform, textureId);
d->shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
d->drawTexture(dest, srcRect, size, false);
return true;
}
@ -1821,7 +1821,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngine::GlyphFormat gly
funcs.glActiveTexture(GL_TEXTURE0 + QT_MASK_TEXTURE_UNIT);
funcs.glBindTexture(GL_TEXTURE_2D, cache->texture());
updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, false);
updateTextureFilter(GL_REPEAT, false);
#if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
funcs.glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
@ -1964,16 +1964,15 @@ void QOpenGL2PaintEngineExPrivate::drawPixmapFragments(const QPainter::PixmapFra
allOpaque &= (opacity >= 0.99f);
}
transferMode(ImageOpacityArrayDrawingMode);
funcs.glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
GLuint id = QOpenGLTextureCache::cacheForContext(ctx)->bindTexture(ctx, pixmap);
transferMode(ImageOpacityArrayDrawingMode);
updateTextureFilter(GL_CLAMP_TO_EDGE, q->state()->renderHints & QPainter::SmoothPixmapTransform, id);
bool isBitmap = pixmap.isQBitmap();
bool isOpaque = !isBitmap && (!pixmap.hasAlpha() || (hints & QPainter::OpaqueHint)) && allOpaque;
updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
q->state()->renderHints & QPainter::SmoothPixmapTransform, id);
// Setup for texture drawing
currentBrush = noBrush;
shaderManager->setSrcPixelType(isBitmap ? QOpenGLEngineShaderManager::PatternSrc

View File

@ -193,7 +193,7 @@ public:
void updateBrushUniforms();
void updateMatrix();
void updateCompositionMode();
void updateTextureFilter(GLenum target, GLenum wrapMode, bool smoothPixmapTransform, GLuint id = GLuint(-1));
void updateTextureFilter(GLenum wrapMode, bool smoothPixmapTransform, GLuint id = GLuint(-1));
void resetGLState();

View File

@ -6288,6 +6288,8 @@ static inline void rgbBlendPixel(quint32 *dst, int coverage, int sr, int sg, int
}
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
Q_GUI_EXPORT bool qt_needs_a8_gamma_correction = false;
static inline void grayBlendPixel(quint32 *dst, int coverage, int sr, int sg, int sb, const uint *gamma, const uchar *invgamma)
{
// Do a gammacorrected gray alphablend...
@ -6335,6 +6337,7 @@ static void qt_alphamapblit_argb32(QRasterBuffer *rasterBuffer,
int sb = gamma[qBlue(color)];
bool opaque_src = (qAlpha(color) == 255);
bool doGrayBlendPixel = opaque_src && qt_needs_a8_gamma_correction;
#endif
if (!clip) {
@ -6349,7 +6352,7 @@ static void qt_alphamapblit_argb32(QRasterBuffer *rasterBuffer,
dest[i] = c;
} else {
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && opaque_src
if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && doGrayBlendPixel
&& qAlpha(dest[i]) == 255) {
grayBlendPixel(dest+i, coverage, sr, sg, sb, gamma, invgamma);
} else
@ -6390,7 +6393,7 @@ static void qt_alphamapblit_argb32(QRasterBuffer *rasterBuffer,
dest[xp] = c;
} else {
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && opaque_src
if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && doGrayBlendPixel
&& qAlpha(dest[xp]) == 255) {
grayBlendPixel(dest+xp, coverage, sr, sg, sb, gamma, invgamma);
} else

View File

@ -762,8 +762,10 @@ bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format,
face->face_flags &= ~FT_FACE_FLAG_SCALABLE;
FT_Select_Size(face, i);
metrics.ascender = face->size->metrics.ascender;
metrics.descender = face->size->metrics.descender;
if (face->size->metrics.ascender + face->size->metrics.descender > 0) {
metrics.ascender = face->size->metrics.ascender;
metrics.descender = face->size->metrics.descender;
}
FT_Set_Char_Size(face, xsize, ysize, 0, 0);
face->face_flags |= FT_FACE_FLAG_SCALABLE;
@ -889,6 +891,13 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
// this is an error in the bytecode interpreter, just try to run without it
load_flags |= FT_LOAD_FORCE_AUTOHINT;
err = FT_Load_Glyph(face, glyph, load_flags);
} else if (err == FT_Err_Execution_Too_Long) {
// This is an error in the bytecode, probably a web font made by someone who
// didn't test bytecode hinting at all so disable for it for all glyphs.
qWarning("load glyph failed due to broken hinting bytecode in font, switching to auto hinting");
default_load_flags |= FT_LOAD_FORCE_AUTOHINT;
load_flags |= FT_LOAD_FORCE_AUTOHINT;
err = FT_Load_Glyph(face, glyph, load_flags);
}
if (err != FT_Err_Ok) {
qWarning("load glyph failed err=%x face=%p, glyph=%d", err, face, glyph);
@ -1123,7 +1132,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
while (h--) {
uint *dd = (uint *)dst;
*dd++ = 0;
for (int x = 0; x < slot->bitmap.width; x++) {
for (int x = 0; x < static_cast<int>(slot->bitmap.width); x++) {
uint a = ((src[x >> 3] & (0x80 >> (x & 7))) ? 0xffffff : 0x000000);
*dd++ = a;
}
@ -1134,7 +1143,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
} else if (vfactor != 1) {
while (h--) {
uint *dd = (uint *)dst;
for (int x = 0; x < slot->bitmap.width; x++) {
for (int x = 0; x < static_cast<int>(slot->bitmap.width); x++) {
uint a = ((src[x >> 3] & (0x80 >> (x & 7))) ? 0xffffff : 0x000000);
*dd++ = a;
}
@ -1143,7 +1152,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
}
} else {
while (h--) {
for (int x = 0; x < slot->bitmap.width; x++) {
for (int x = 0; x < static_cast<int>(slot->bitmap.width); x++) {
unsigned char a = ((src[x >> 3] & (0x80 >> (x & 7))) ? 0xff : 0x00);
dst[x] = a;
}
@ -1771,8 +1780,7 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe
overall.x = TRUNC(left);
overall.y = -TRUNC(top);
overall.xoff = TRUNC(ROUND(face->glyph->advance.x));
if (face)
unlockFace();
unlockFace();
}
return overall;
}

View File

@ -293,7 +293,7 @@ private:
protected:
QFreetypeFace *freetype;
int default_load_flags;
mutable int default_load_flags;
HintStyle default_hint_style;
bool antialias;
bool transform;

View File

@ -558,6 +558,8 @@ void QHttpThreadDelegate::synchronousFinishedWithErrorSlot(QNetworkReply::Networ
incomingErrorCode = errorCode;
incomingErrorDetail = detail;
synchronousDownloadData = httpReply->readAll();
QMetaObject::invokeMethod(httpReply, "deleteLater", Qt::QueuedConnection);
QMetaObject::invokeMethod(synchronousRequestLoop, "quit", Qt::QueuedConnection);
httpReply = 0;

View File

@ -276,7 +276,7 @@ QNetworkReplyPrivate::QNetworkReplyPrivate()
processing. After this signal is emitted, there will be no more
updates to the reply's data or metadata.
Unless close() has been called, the reply will be still be opened
Unless close() or abort() have been called, the reply will be still be opened
for reading, so the data can be retrieved by calls to read() or
readAll(). In particular, if no calls to read() were made as a
result of readyRead(), a call to readAll() will retrieve the full
@ -365,7 +365,9 @@ QNetworkReplyPrivate::QNetworkReplyPrivate()
connections still open. Uploads still in progress are also
aborted.
\sa close()
The finished() signal will also be emitted.
\sa close(), finished()
*/
/*!

View File

@ -1882,6 +1882,9 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
\since 4.6
Sets the given \a option to the value described by \a value.
\note On Windows Runtime, QAbstractSocket::KeepAliveOption must be set
before the socket is connected.
\sa socketOption()
*/
void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)

View File

@ -998,7 +998,8 @@ bool QNativeSocketEnginePrivate::setOption(QAbstractSocketEngine::SocketOption o
return true;
}
case QAbstractSocketEngine::KeepAliveOption: {
if (socketType == QAbstractSocket::UdpSocket)
if (socketType == QAbstractSocket::UdpSocket
|| socketState != QAbstractSocket::UnconnectedState)
return false;
boolean keepAlive = v;

View File

@ -575,12 +575,12 @@ QList<QSslError> QSslCertificate::verify(QList<QSslCertificate> certificateChain
\note The \a device must be open and ready to be read from.
*/
bool QSslCertificate::importPKCS12(QIODevice *device,
bool QSslCertificate::importPkcs12(QIODevice *device,
QSslKey *key, QSslCertificate *certificate,
QList<QSslCertificate> *caCertificates,
const QByteArray &passPhrase)
{
return QSslSocketBackendPrivate::importPKCS12(device, key, certificate, caCertificates, passPhrase);
return QSslSocketBackendPrivate::importPkcs12(device, key, certificate, caCertificates, passPhrase);
}
// These certificates are known to be fraudulent and were created during the comodo

View File

@ -138,7 +138,7 @@ public:
static QList<QSslError> verify(QList<QSslCertificate> certificateChain, const QString &hostName = QString());
static bool importPKCS12(QIODevice *device,
static bool importPkcs12(QIODevice *device,
QSslKey *key, QSslCertificate *cert,
QList<QSslCertificate> *caCertificates=0,
const QByteArray &passPhrase=QByteArray());

View File

@ -1699,7 +1699,7 @@ QList<QSslError> QSslSocketBackendPrivate::verify(QList<QSslCertificate> certifi
return errors;
}
bool QSslSocketBackendPrivate::importPKCS12(QIODevice *device,
bool QSslSocketBackendPrivate::importPkcs12(QIODevice *device,
QSslKey *key, QSslCertificate *cert,
QList<QSslCertificate> *caCertificates,
const QByteArray &passPhrase)

View File

@ -136,7 +136,7 @@ public:
static QList<QSslCertificate> STACKOFX509_to_QSslCertificates(STACK_OF(X509) *x509);
static QList<QSslError> verify(QList<QSslCertificate> certificateChain, const QString &hostName);
static QString getErrorsFromOpenSsl();
static bool importPKCS12(QIODevice *device,
static bool importPkcs12(QIODevice *device,
QSslKey *key, QSslCertificate *cert,
QList<QSslCertificate> *caCertificates,
const QByteArray &passPhrase);

View File

@ -661,7 +661,7 @@ QList<QSslError> QSslSocketBackendPrivate::verify(QList<QSslCertificate> certifi
return errors;
}
bool QSslSocketBackendPrivate::importPKCS12(QIODevice *device,
bool QSslSocketBackendPrivate::importPkcs12(QIODevice *device,
QSslKey *key, QSslCertificate *cert,
QList<QSslCertificate> *caCertificates,
const QByteArray &passPhrase)

View File

@ -92,7 +92,7 @@ public:
static QList<QSslCipher> defaultCiphers();
static QList<QSslError> verify(QList<QSslCertificate> certificateChain, const QString &hostName);
static bool importPKCS12(QIODevice *device,
static bool importPkcs12(QIODevice *device,
QSslKey *key, QSslCertificate *cert,
QList<QSslCertificate> *caCertificates,
const QByteArray &passPhrase);

View File

@ -638,6 +638,25 @@ namespace QtAndroidInput
}
}
static Qt::KeyboardModifiers mapAndroidModifiers(jint modifiers)
{
Qt::KeyboardModifiers qmodifiers;
if (modifiers & 0x00000001) // META_SHIFT_ON
qmodifiers |= Qt::ShiftModifier;
if (modifiers & 0x00000002) // META_ALT_ON
qmodifiers |= Qt::AltModifier;
if (modifiers & 0x00000004) // META_SYM_ON
qmodifiers |= Qt::MetaModifier;
if (modifiers & 0x00001000) // META_CTRL_ON
qmodifiers |= Qt::ControlModifier;
return qmodifiers;
}
// maps 0 to the empty string, and anything else to a single-character string
static inline QString toString(jint unicode)
{
@ -646,40 +665,20 @@ namespace QtAndroidInput
static void keyDown(JNIEnv */*env*/, jobject /*thiz*/, jint key, jint unicode, jint modifier)
{
Qt::KeyboardModifiers modifiers;
if (modifier & 1)
modifiers |= Qt::ShiftModifier;
if (modifier & 2)
modifiers |= Qt::AltModifier;
if (modifier & 4)
modifiers |= Qt::MetaModifier;
QWindowSystemInterface::handleKeyEvent(0,
QEvent::KeyPress,
mapAndroidKey(key),
modifiers,
mapAndroidModifiers(modifier),
toString(unicode),
false);
}
static void keyUp(JNIEnv */*env*/, jobject /*thiz*/, jint key, jint unicode, jint modifier)
{
Qt::KeyboardModifiers modifiers;
if (modifier & 1)
modifiers |= Qt::ShiftModifier;
if (modifier & 2)
modifiers |= Qt::AltModifier;
if (modifier & 4)
modifiers |= Qt::MetaModifier;
QWindowSystemInterface::handleKeyEvent(0,
QEvent::KeyRelease,
mapAndroidKey(key),
modifiers,
mapAndroidModifiers(modifier),
toString(unicode),
false);
}

View File

@ -611,6 +611,9 @@ jboolean QAndroidInputContext::endBatchEdit()
*/
jboolean QAndroidInputContext::commitText(const QString &text, jint newCursorPosition)
{
bool updateSelectionWasBlocked = m_blockUpdateSelection;
m_blockUpdateSelection = true;
QInputMethodEvent event;
event.setCommitString(text);
sendInputMethodEventThreadSafe(&event);
@ -630,6 +633,7 @@ jboolean QAndroidInputContext::commitText(const QString &text, jint newCursorPos
newLocalPos, 0, QVariant()));
}
}
m_blockUpdateSelection = updateSelectionWasBlocked;
updateCursorPosition();
return JNI_TRUE;

View File

@ -284,9 +284,9 @@ void QAndroidPlatformScreen::doRedraw()
if (m_dirtyRect.isEmpty())
return;
// Stop if there no visible raster windows. This is important because if we only have
// RasterGLSurface windows that have renderToTexture children (i.e. they need the
// OpenGL path) then we must bail out right now.
// Stop if there are no visible raster windows. If we only have RasterGLSurface
// windows that have renderToTexture children (i.e. they need the OpenGL path) then
// we do not need an overlay surface.
bool hasVisibleRasterWindows = false;
foreach (QAndroidPlatformWindow *window, m_windowStack) {
if (window->window()->isVisible() && window->isRaster() && !qt_window_private(window->window())->compositing) {
@ -294,9 +294,13 @@ void QAndroidPlatformScreen::doRedraw()
break;
}
}
if (!hasVisibleRasterWindows)
if (!hasVisibleRasterWindows) {
if (m_id != -1) {
QtAndroid::destroySurface(m_id);
m_id = -1;
}
return;
}
QMutexLocker lock(&m_surfaceMutex);
if (m_id == -1 && m_rasterSurfaces) {
m_id = QtAndroid::createSurface(this, m_availableGeometry, true, m_depth);
@ -339,6 +343,7 @@ void QAndroidPlatformScreen::doRedraw()
QRegion visibleRegion(m_dirtyRect);
foreach (QAndroidPlatformWindow *window, m_windowStack) {
if (!window->window()->isVisible()
|| qt_window_private(window->window())->compositing
|| !window->isRaster())
continue;

View File

@ -278,7 +278,8 @@ static std::shared_ptr<AndroidStyle> loadAndroidStyle(QPalette *defaultPalette)
const int pt = paletteType(key);
if (pt > -1 || !qtClassName.isEmpty()) {
// Extract palette information
QPalette palette;
QPalette palette = *defaultPalette;
attributeIterator = item.find(QLatin1String("defaultTextColorPrimary"));
if (attributeIterator != item.constEnd())
palette.setColor(QPalette::WindowText, QRgb(int(attributeIterator.value().toDouble())));

View File

@ -87,7 +87,11 @@ void qt_mac_loadMenuNib(QCocoaMenuLoader *qtMenuLoader)
return;
}
foreach (const QFileInfo &file, nibResource.entryInfoList()) {
QFile::copy(file.absoluteFilePath(), nibDir + QLatin1String("/") + file.fileName());
QFileInfo destinationFile(nibDir + QLatin1String("/") + file.fileName());
if (destinationFile.exists() && destinationFile.size() != file.size())
QFile::remove(destinationFile.absoluteFilePath());
QFile::copy(file.absoluteFilePath(), destinationFile.absoluteFilePath());
}
// Load and instantiate nib file from temp

View File

@ -48,6 +48,22 @@ QT_BEGIN_NAMESPACE
@class QIOSKeyboardListener;
@class QIOSTextInputResponder;
@protocol KeyboardState;
struct KeyboardState
{
KeyboardState() :
keyboardVisible(false), keyboardAnimating(false),
animationDuration(0), animationCurve(UIViewAnimationCurve(-1))
{}
bool keyboardVisible;
bool keyboardAnimating;
QRectF keyboardRect;
CGRect keyboardEndRect;
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
};
struct ImeState
{
@ -69,6 +85,7 @@ public:
void hideInputPanel() Q_DECL_OVERRIDE;
bool isInputPanelVisible() const Q_DECL_OVERRIDE;
bool isAnimating() const Q_DECL_OVERRIDE;
QRectF keyboardRect() const Q_DECL_OVERRIDE;
void update(Qt::InputMethodQueries) Q_DECL_OVERRIDE;
@ -84,14 +101,21 @@ public:
void scrollToCursor();
void scroll(int y);
void updateKeyboardState(NSNotification *notification = 0);
const ImeState &imeState() { return m_imeState; };
const KeyboardState &keyboardState() { return m_keyboardState; };
bool inputMethodAccepted() const;
static QIOSInputContext *instance();
private:
QIOSKeyboardListener *m_keyboardListener;
UIView* scrollableRootView();
QIOSKeyboardListener *m_keyboardHideGesture;
QIOSTextInputResponder *m_textResponder;
KeyboardState m_keyboardState;
ImeState m_imeState;
};

View File

@ -45,6 +45,7 @@
#include "qiosglobal.h"
#include "qiosintegration.h"
#include "qiosscreen.h"
#include "qiostextresponder.h"
#include "qiosviewcontroller.h"
#include "qioswindow.h"
@ -64,15 +65,8 @@ static QUIView *focusView()
// -------------------------------------------------------------------------
@interface QIOSKeyboardListener : UIGestureRecognizer <UIGestureRecognizerDelegate> {
@public
@private
QIOSInputContext *m_context;
BOOL m_keyboardVisible;
BOOL m_keyboardVisibleAndDocked;
QRectF m_keyboardRect;
CGRect m_keyboardEndRect;
NSTimeInterval m_duration;
UIViewAnimationCurve m_curve;
UIViewController *m_viewController;
}
@end
@ -80,87 +74,51 @@ static QUIView *focusView()
- (id)initWithQIOSInputContext:(QIOSInputContext *)context
{
self = [super initWithTarget:self action:@selector(gestureStateChanged:)];
if (self) {
id originalSelf = self;
if (self = [super initWithTarget:self action:@selector(gestureStateChanged:)]) {
Q_ASSERT(self == originalSelf);
m_context = context;
m_keyboardVisible = NO;
m_keyboardVisibleAndDocked = NO;
m_duration = 0;
m_curve = UIViewAnimationCurveEaseOut;
m_viewController = 0;
if (isQtApplication()) {
// Get the root view controller that is on the same screen as the keyboard:
for (UIWindow *uiWindow in [[UIApplication sharedApplication] windows]) {
if (uiWindow.screen == [UIScreen mainScreen]) {
m_viewController = [uiWindow.rootViewController retain];
break;
}
}
Q_ASSERT(m_viewController);
// UIGestureRecognizer
self.enabled = NO;
self.cancelsTouchesInView = NO;
self.delaysTouchesEnded = NO;
// Attach 'hide keyboard' gesture to the window, but keep it disabled when the
// keyboard is not visible.
self.enabled = NO;
self.cancelsTouchesInView = NO;
self.delaysTouchesEnded = NO;
[m_viewController.view.window addGestureRecognizer:self];
}
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[[NSNotificationCenter defaultCenter]
addObserver:self
[notificationCenter addObserver:self
selector:@selector(keyboardWillShow:)
name:@"UIKeyboardWillShowNotification" object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
name:UIKeyboardWillShowNotification object:nil];
[notificationCenter addObserver:self
selector:@selector(keyboardWillOrDidChange:)
name:UIKeyboardDidShowNotification object:nil];
[notificationCenter addObserver:self
selector:@selector(keyboardWillHide:)
name:@"UIKeyboardWillHideNotification" object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
name:UIKeyboardWillHideNotification object:nil];
[notificationCenter addObserver:self
selector:@selector(keyboardWillOrDidChange:)
name:UIKeyboardDidHideNotification object:nil];
[notificationCenter addObserver:self
selector:@selector(keyboardDidChangeFrame:)
name:@"UIKeyboardDidChangeFrameNotification" object:nil];
name:UIKeyboardDidChangeFrameNotification object:nil];
}
return self;
}
- (void) dealloc
- (void)dealloc
{
[m_viewController.view.window removeGestureRecognizer:self];
[m_viewController release];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:@"UIKeyboardWillShowNotification" object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:@"UIKeyboardWillHideNotification" object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:@"UIKeyboardDidChangeFrameNotification" object:nil];
[super dealloc];
}
- (void) keyboardDidChangeFrame:(NSNotification *)notification
// -------------------------------------------------------------------------
- (void)keyboardWillShow:(NSNotification *)notification
{
Q_UNUSED(notification);
[self handleKeyboardRectChanged];
// If the keyboard was visible and docked from before, this is just a geometry
// change (normally caused by an orientation change). In that case, update scroll:
if (m_keyboardVisibleAndDocked)
m_context->scrollToCursor();
}
- (void) keyboardWillShow:(NSNotification *)notification
{
// Note that UIKeyboardWillShowNotification is only sendt when the keyboard is docked.
m_keyboardVisibleAndDocked = YES;
m_keyboardEndRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
if (!m_duration) {
m_duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
m_curve = UIViewAnimationCurve([[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]);
}
[self keyboardWillOrDidChange:notification];
UIResponder *firstResponder = [UIResponder currentFirstResponder];
if (![firstResponder isKindOfClass:[QIOSTextInputResponder class]])
@ -172,11 +130,10 @@ static QUIView *focusView()
m_context->scrollToCursor();
}
- (void) keyboardWillHide:(NSNotification *)notification
- (void)keyboardWillHide:(NSNotification *)notification
{
// Note that UIKeyboardWillHideNotification is also sendt when the keyboard is undocked.
m_keyboardVisibleAndDocked = NO;
m_keyboardEndRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
[self keyboardWillOrDidChange:notification];
if (self.state != UIGestureRecognizerStateBegan) {
// Only disable the gesture if the hiding of the keyboard was not caused by it.
// Otherwise we need to await the final touchEnd callback for doing some clean-up.
@ -185,29 +142,19 @@ static QUIView *focusView()
m_context->scroll(0);
}
- (void) handleKeyboardRectChanged
- (void)keyboardDidChangeFrame:(NSNotification *)notification
{
// QInputmethod::keyboardRectangle() is documented to be in window coordinates.
// If there is no focus window, we return an empty rectangle
UIView *view = focusView();
QRectF convertedRect = fromCGRect([view convertRect:m_keyboardEndRect fromView:nil]);
[self keyboardWillOrDidChange:notification];
// Set height to zero if keyboard is hidden. Otherwise the rect will not change
// when the keyboard hides on a scrolled screen (since the keyboard will already
// be at the bottom of the 'screen' in that case)
if (!m_keyboardVisibleAndDocked)
convertedRect.setHeight(0);
// If the keyboard was visible and docked from before, this is just a geometry
// change (normally caused by an orientation change). In that case, update scroll:
if (m_context->isInputPanelVisible())
m_context->scrollToCursor();
}
if (convertedRect != m_keyboardRect) {
m_keyboardRect = convertedRect;
m_context->emitKeyboardRectChanged();
}
BOOL visible = CGRectIntersectsRect(m_keyboardEndRect, [UIScreen mainScreen].bounds);
if (m_keyboardVisible != visible) {
m_keyboardVisible = visible;
m_context->emitInputPanelVisibleChanged();
}
- (void)keyboardWillOrDidChange:(NSNotification *)notification
{
m_context->updateKeyboardState(notification);
}
// -------------------------------------------------------------------------
@ -216,7 +163,7 @@ static QUIView *focusView()
{
[super touchesBegan:touches withEvent:event];
Q_ASSERT(m_keyboardVisibleAndDocked);
Q_ASSERT(m_context->isInputPanelVisible());
if ([touches count] != 1)
self.state = UIGestureRecognizerStateFailed;
@ -229,8 +176,8 @@ static QUIView *focusView()
if (self.state != UIGestureRecognizerStatePossible)
return;
CGPoint touchPoint = [[touches anyObject] locationInView:m_viewController.view.window];
if (CGRectContainsPoint(m_keyboardEndRect, touchPoint))
CGPoint touchPoint = [[touches anyObject] locationInView:self.view];
if (CGRectContainsPoint(m_context->keyboardState().keyboardEndRect, touchPoint))
self.state = UIGestureRecognizerStateBegan;
}
@ -280,7 +227,7 @@ static QUIView *focusView()
{
[super reset];
if (!m_keyboardVisibleAndDocked) {
if (!m_context->isInputPanelVisible()) {
qImDebug() << "keyboard was hidden, disabling hide-keyboard gesture";
self.enabled = NO;
} else {
@ -328,23 +275,25 @@ QIOSInputContext *QIOSInputContext::instance()
QIOSInputContext::QIOSInputContext()
: QPlatformInputContext()
, m_keyboardListener([[QIOSKeyboardListener alloc] initWithQIOSInputContext:this])
, m_keyboardHideGesture([[QIOSKeyboardListener alloc] initWithQIOSInputContext:this])
, m_textResponder(0)
{
if (isQtApplication())
if (isQtApplication()) {
QIOSScreen *iosScreen = static_cast<QIOSScreen*>(QGuiApplication::primaryScreen()->handle());
[iosScreen->uiWindow() addGestureRecognizer:m_keyboardHideGesture];
connect(qGuiApp->inputMethod(), &QInputMethod::cursorRectangleChanged, this, &QIOSInputContext::cursorRectangleChanged);
}
connect(qGuiApp, &QGuiApplication::focusWindowChanged, this, &QIOSInputContext::focusWindowChanged);
}
QIOSInputContext::~QIOSInputContext()
{
[m_keyboardListener release];
[m_textResponder release];
}
[m_keyboardHideGesture.view removeGestureRecognizer:m_keyboardHideGesture];
[m_keyboardHideGesture release];
QRectF QIOSInputContext::keyboardRect() const
{
return m_keyboardListener->m_keyboardRect;
[m_textResponder release];
}
void QIOSInputContext::showInputPanel()
@ -375,14 +324,85 @@ void QIOSInputContext::clearCurrentFocusObject()
static_cast<QWindowPrivate *>(QObjectPrivate::get(focusWindow))->clearFocusObject();
}
// -------------------------------------------------------------------------
void QIOSInputContext::updateKeyboardState(NSNotification *notification)
{
static CGRect currentKeyboardRect = CGRectZero;
KeyboardState previousState = m_keyboardState;
if (notification) {
NSDictionary *userInfo = [notification userInfo];
CGRect frameBegin = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGRect frameEnd = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
bool atEndOfKeyboardTransition = [notification.name rangeOfString:@"Did"].location != NSNotFound;
currentKeyboardRect = atEndOfKeyboardTransition ? frameEnd : frameBegin;
// The isInputPanelVisible() property is based on whether or not the virtual keyboard
// is visible on screen, and does not follow the logic of the iOS WillShow and WillHide
// notifications which are not emitted for undocked keyboards, and are buggy when dealing
// with input-accesosory-views. The reason for using frameEnd here (the future state),
// instead of the current state reflected in frameBegin, is that QInputMethod::isVisible()
// is documented to reflect the future state in the case of animated transitions.
m_keyboardState.keyboardVisible = CGRectIntersectsRect(frameEnd, [UIScreen mainScreen].bounds);
// Used for auto-scroller, and will be used for animation-signal in the future
m_keyboardState.keyboardEndRect = frameEnd;
if (m_keyboardState.animationCurve < 0) {
// We only set the animation curve the first time it has a valid value, since iOS will sometimes report
// an invalid animation curve even if the keyboard is animating, and we don't want to overwrite the
// curve in that case.
m_keyboardState.animationCurve = UIViewAnimationCurve([[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]);
}
m_keyboardState.animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
m_keyboardState.keyboardAnimating = m_keyboardState.animationDuration > 0 && !atEndOfKeyboardTransition;
qImDebug() << qPrintable(QString::fromNSString(notification.name)) << "from" << fromCGRect(frameBegin) << "to" << fromCGRect(frameEnd)
<< "(curve =" << m_keyboardState.animationCurve << "duration =" << m_keyboardState.animationDuration << "s)";
} else {
qImDebug() << "No notification to update keyboard state based on, just updating keyboard rect";
}
if (!focusView() || CGRectIsEmpty(currentKeyboardRect))
m_keyboardState.keyboardRect = QRectF();
else // QInputmethod::keyboardRectangle() is documented to be in window coordinates.
m_keyboardState.keyboardRect = fromCGRect([focusView() convertRect:currentKeyboardRect fromView:nil]);
// Emit for all changed properties
if (m_keyboardState.keyboardVisible != previousState.keyboardVisible)
emitInputPanelVisibleChanged();
if (m_keyboardState.keyboardAnimating != previousState.keyboardAnimating)
emitAnimatingChanged();
if (m_keyboardState.keyboardRect != previousState.keyboardRect)
emitKeyboardRectChanged();
}
bool QIOSInputContext::isInputPanelVisible() const
{
return m_keyboardListener->m_keyboardVisible;
return m_keyboardState.keyboardVisible;
}
bool QIOSInputContext::isAnimating() const
{
return m_keyboardState.keyboardAnimating;
}
QRectF QIOSInputContext::keyboardRect() const
{
return m_keyboardState.keyboardRect;
}
// -------------------------------------------------------------------------
void QIOSInputContext::cursorRectangleChanged()
{
if (!m_keyboardListener->m_keyboardVisibleAndDocked || !qApp->focusObject())
if (!isInputPanelVisible() || !qApp->focusObject())
return;
// Check if the cursor has changed position inside the input item. Since
@ -397,44 +417,67 @@ void QIOSInputContext::cursorRectangleChanged()
prevCursor = cursor;
}
UIView *QIOSInputContext::scrollableRootView()
{
if (!m_keyboardHideGesture.view)
return 0;
UIWindow *window = static_cast<UIWindow*>(m_keyboardHideGesture.view);
if (![window.rootViewController isKindOfClass:[QIOSViewController class]])
return 0;
return window.rootViewController.view;
}
void QIOSInputContext::scrollToCursor()
{
if (!isQtApplication())
return;
if (m_keyboardListener.state == UIGestureRecognizerStatePossible && m_keyboardListener.numberOfTouches == 1) {
if (m_keyboardHideGesture.state == UIGestureRecognizerStatePossible && m_keyboardHideGesture.numberOfTouches == 1) {
// Don't scroll to the cursor if the user is touching the screen and possibly
// trying to trigger the hide-keyboard gesture.
qImDebug() << "preventing scrolling to cursor as we're still waiting for a possible gesture";
return;
}
UIView *view = m_keyboardListener->m_viewController.view;
if (view.window != focusView().window)
UIView *rootView = scrollableRootView();
if (!rootView)
return;
if (rootView.window != focusView().window)
return;
// We only support auto-scroll for docked keyboards for now, so make sure that's the case
if (CGRectGetMaxY(m_keyboardState.keyboardEndRect) != CGRectGetMaxY([UIScreen mainScreen].bounds)) {
qImDebug() << "Keyboard not docked, ignoring request to scroll to reveal cursor";
return;
}
const int margin = 20;
QRectF translatedCursorPos = qApp->inputMethod()->cursorRectangle();
translatedCursorPos.translate(focusView().qwindow->geometry().topLeft());
qreal keyboardY = [view convertRect:m_keyboardListener->m_keyboardEndRect fromView:nil].origin.y;
qreal keyboardY = [rootView convertRect:m_keyboardState.keyboardEndRect fromView:nil].origin.y;
int statusBarY = qGuiApp->primaryScreen()->availableGeometry().y();
scroll((translatedCursorPos.bottomLeft().y() < keyboardY - margin) ? 0
: qMin(view.bounds.size.height - keyboardY, translatedCursorPos.y() - statusBarY - margin));
: qMin(rootView.bounds.size.height - keyboardY, translatedCursorPos.y() - statusBarY - margin));
}
void QIOSInputContext::scroll(int y)
{
UIView *rootView = m_keyboardListener->m_viewController.view;
UIView *rootView = scrollableRootView();
if (!rootView)
return;
CATransform3D translationTransform = CATransform3DMakeTranslation(0.0, -y, 0.0);
if (CATransform3DEqualToTransform(translationTransform, rootView.layer.sublayerTransform))
return;
QPointer<QIOSInputContext> self = this;
[UIView animateWithDuration:m_keyboardListener->m_duration delay:0
options:(m_keyboardListener->m_curve << 16) | UIViewAnimationOptionBeginFromCurrentState
[UIView animateWithDuration:m_keyboardState.animationDuration delay:0
options:(m_keyboardState.animationCurve << 16) | UIViewAnimationOptionBeginFromCurrentState
animations:^{
// The sublayerTransform property of CALayer is not implicitly animated for a
// layer-backed view, even inside a UIView animation block, so we need to set up
@ -463,8 +506,12 @@ void QIOSInputContext::scroll(int y)
[rootView.qtViewController updateProperties];
}
completion:^(BOOL){
if (self)
[m_keyboardListener handleKeyboardRectChanged];
if (self) {
// Scrolling the root view results in the keyboard being moved
// relative to the focus window, so we need to re-evaluate the
// keyboard rectangle.
updateKeyboardState();
}
}
];
}
@ -477,7 +524,7 @@ void QIOSInputContext::setFocusObject(QObject *focusObject)
qImDebug() << "new focus object =" << focusObject;
if (m_keyboardListener.state == UIGestureRecognizerStateChanged) {
if (m_keyboardHideGesture.state == UIGestureRecognizerStateChanged) {
// A new focus object may be set as part of delivering touch events to
// application during the hide-keyboard gesture, but we don't want that
// to result in a new object getting focus and bringing the keyboard up
@ -489,7 +536,7 @@ void QIOSInputContext::setFocusObject(QObject *focusObject)
reset();
if (m_keyboardListener->m_keyboardVisibleAndDocked)
if (isInputPanelVisible())
scrollToCursor();
}
@ -501,8 +548,11 @@ void QIOSInputContext::focusWindowChanged(QWindow *focusWindow)
reset();
[m_keyboardListener handleKeyboardRectChanged];
if (m_keyboardListener->m_keyboardVisibleAndDocked)
// The keyboard rectangle depend on the focus window, so
// we need to re-evaluate the keyboard state.
updateKeyboardState();
if (isInputPanelVisible())
scrollToCursor();
}

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