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:
commit
015002fec9
13
configure
vendored
13
configure
vendored
@ -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
|
||||
|
||||
;;
|
||||
|
470
dist/changes-5.4.0
vendored
470
dist/changes-5.4.0
vendored
@ -15,31 +15,431 @@ corresponding to tasks in the Qt Bug Tracker:
|
||||
Each of these identifiers can be entered in the bug tracker to obtain more
|
||||
information about a particular change.
|
||||
|
||||
****************************************************************************
|
||||
* 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.
|
||||
|
||||
****************************************************************************
|
||||
* 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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -1,4 +1,4 @@
|
||||
naturallanguage = en_US
|
||||
naturallanguage = en
|
||||
outputencoding = UTF-8
|
||||
sourceencoding = UTF-8
|
||||
|
||||
|
84
doc/global/html-footer-online.qdocconf
Normal file
84
doc/global/html-footer-online.qdocconf
Normal 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 & 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 & 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 & 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&app_id=207346529386114&href=https%3A%2F%2Fwww.facebook.com%2Fqtbydigia&layout=button_count&locale=en_US&sdk=joey&share=false&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&id=twitter-widget-0&lang=en&screen_name=qtproject&show_count=true&show_screen_name=false&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"
|
@ -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 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 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" \
|
||||
" </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" \
|
||||
" </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" \
|
||||
" <ul id=\"menuextras\">\n" \
|
||||
" <li>\n" \
|
||||
" <a href=\"http://doc-snapshot.qt-project.org\">Snapshots</a>\n" \
|
||||
" <a href=\"//qt.io/partners/\" data-icon=\"\">\n" \
|
||||
" <span>Partners</span>\n" \
|
||||
" </a>\n" \
|
||||
" </li>\n" \
|
||||
" <li>\n" \
|
||||
" <a href=\"http://qt-project.org/doc\">Released</a>\n" \
|
||||
" <a target=\"_blank\" href=\"http://blog.qt.digia.com/\" data-icon=\"\">\n" \
|
||||
" <span>Blog</span>\n" \
|
||||
" </a>\n" \
|
||||
" </li>\n" \
|
||||
" <li>\n" \
|
||||
" <a href=\"http://doc.qt.digia.com\">Archives</a>\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>\n" \
|
||||
" </div>\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" \
|
||||
"</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"
|
||||
|
39
doc/global/includes-online/search.qdoc
Normal file
39
doc/global/includes-online/search.qdoc
Normal 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
|
||||
*/
|
@ -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
|
||||
|
@ -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"
|
||||
|
29
doc/global/qt-module-defaults-online-commercial.qdocconf
Normal file
29
doc/global/qt-module-defaults-online-commercial.qdocconf
Normal 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
|
@ -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\">©</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"
|
||||
|
23
doc/global/template/scripts/extras.js
Normal file
23
doc/global/template/scripts/extras.js
Normal 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);
|
||||
}
|
||||
});
|
241
doc/global/template/scripts/main.js
Normal file
241
doc/global/template/scripts/main.js
Normal 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++;
|
||||
});
|
||||
}
|
||||
}
|
BIN
doc/global/template/style/doc_search.png
Normal file
BIN
doc/global/template/style/doc_search.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
192
doc/global/template/style/gsc.css
Normal file
192
doc/global/template/style/gsc.css
Normal 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
|
||||
}
|
BIN
doc/global/template/style/icomoon.eot
Executable file
BIN
doc/global/template/style/icomoon.eot
Executable file
Binary file not shown.
20
doc/global/template/style/icomoon.svg
Executable file
20
doc/global/template/style/icomoon.svg
Executable 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=" " d="" horiz-adv-x="256" />
|
||||
<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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 |
BIN
doc/global/template/style/icomoon.ttf
Executable file
BIN
doc/global/template/style/icomoon.ttf
Executable file
Binary file not shown.
BIN
doc/global/template/style/icomoon.woff
Executable file
BIN
doc/global/template/style/icomoon.woff
Executable file
Binary file not shown.
BIN
doc/global/template/style/list_arrow.png
Normal file
BIN
doc/global/template/style/list_arrow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
File diff suppressed because it is too large
Load Diff
@ -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.
|
||||
|
@ -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): \
|
||||
|
18
mkspecs/features/link_ltcg.prf
Normal file
18
mkspecs/features/link_ltcg.prf
Normal 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
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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: \
|
||||
|
@ -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,6 +184,9 @@ macx-xcode {
|
||||
launch_images.files = $$copy_image.output
|
||||
QMAKE_BUNDLE_DATA += launch_images
|
||||
|
||||
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
|
||||
@ -192,6 +194,7 @@ macx-xcode {
|
||||
QMAKE_SUBSTITUTES += copy_launch_screen
|
||||
launch_screens.files = $$copy_launch_screen.output
|
||||
QMAKE_BUNDLE_DATA += launch_screens
|
||||
}
|
||||
}
|
||||
|
||||
macx-xcode {
|
||||
|
@ -73,3 +73,5 @@ depends += \
|
||||
qtx11extras \
|
||||
qtxml \
|
||||
qtxmlpatterns
|
||||
|
||||
navigation.landingpage = "qmake Manual"
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
|
6
src/3rdparty/angle/src/libGLESv2/Context.cpp
vendored
6
src/3rdparty/angle/src/libGLESv2/Context.cpp
vendored
@ -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);
|
||||
|
1
src/3rdparty/angle/src/libGLESv2/Context.h
vendored
1
src/3rdparty/angle/src/libGLESv2/Context.h
vendored
@ -247,7 +247,6 @@ class Context
|
||||
int mClientVersion;
|
||||
|
||||
TextureMap mZeroTextures;
|
||||
TextureMap mIncompleteTextures;
|
||||
|
||||
typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap;
|
||||
FramebufferMap mFramebufferMap;
|
||||
|
9
src/3rdparty/angle/src/libGLESv2/Shader.cpp
vendored
9
src/3rdparty/angle/src/libGLESv2/Shader.cpp
vendored
@ -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();
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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:
|
||||
|
@ -1870,6 +1870,8 @@ bool Renderer11::testDeviceResettable()
|
||||
|
||||
void Renderer11::release()
|
||||
{
|
||||
RendererD3D::cleanup();
|
||||
|
||||
releaseShaderCompiler();
|
||||
releaseDeviceResources();
|
||||
|
||||
|
@ -151,6 +151,8 @@ Renderer9::~Renderer9()
|
||||
|
||||
void Renderer9::release()
|
||||
{
|
||||
RendererD3D::cleanup();
|
||||
|
||||
releaseShaderCompiler();
|
||||
releaseDeviceResources();
|
||||
|
||||
|
18
src/3rdparty/pcre/patches/pcre-r1513.patch
vendored
Normal file
18
src/3rdparty/pcre/patches/pcre-r1513.patch
vendored
Normal 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];
|
5
src/3rdparty/pcre/pcre_exec.c
vendored
5
src/3rdparty/pcre/pcre_exec.c
vendored
@ -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];
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -1,2 +1,3 @@
|
||||
TEMPLATE = subdirs
|
||||
CONFIG += ordered
|
||||
SUBDIRS = jar java templates accessibility
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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" />
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
*/
|
||||
|
||||
/*!
|
||||
|
@ -1201,11 +1201,14 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
|
||||
}
|
||||
#endif
|
||||
} else if (token == timeTokenC) {
|
||||
if (pattern->timeFormat == QLatin1String("process")) {
|
||||
quint64 ms = pattern->timer.elapsed();
|
||||
if (pattern->timeFormat.isEmpty())
|
||||
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 "|").
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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!";
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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().
|
||||
|
@ -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}
|
||||
*/
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
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()) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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().
|
||||
|
@ -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
275
src/dbus/dbus_minimal_p.h
Normal 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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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), "
|
||||
|
@ -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
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
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,7 +1780,6 @@ 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();
|
||||
}
|
||||
return overall;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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()
|
||||
*/
|
||||
|
||||
/*!
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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())));
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
||||
// Attach 'hide keyboard' gesture to the window, but keep it disabled when the
|
||||
// keyboard is not visible.
|
||||
// UIGestureRecognizer
|
||||
self.enabled = NO;
|
||||
self.cancelsTouchesInView = NO;
|
||||
self.delaysTouchesEnded = NO;
|
||||
[m_viewController.view.window addGestureRecognizer:self];
|
||||
|
||||
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
||||
|
||||
[notificationCenter addObserver:self
|
||||
selector:@selector(keyboardWillShow:)
|
||||
name:UIKeyboardWillShowNotification object:nil];
|
||||
[notificationCenter addObserver:self
|
||||
selector:@selector(keyboardWillOrDidChange:)
|
||||
name:UIKeyboardDidShowNotification object:nil];
|
||||
[notificationCenter addObserver:self
|
||||
selector:@selector(keyboardWillHide:)
|
||||
name:UIKeyboardWillHideNotification object:nil];
|
||||
[notificationCenter addObserver:self
|
||||
selector:@selector(keyboardWillOrDidChange:)
|
||||
name:UIKeyboardDidHideNotification object:nil];
|
||||
[notificationCenter addObserver:self
|
||||
selector:@selector(keyboardDidChangeFrame:)
|
||||
name:UIKeyboardDidChangeFrameNotification object:nil];
|
||||
}
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver:self
|
||||
selector:@selector(keyboardWillShow:)
|
||||
name:@"UIKeyboardWillShowNotification" object:nil];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver:self
|
||||
selector:@selector(keyboardWillHide:)
|
||||
name:@"UIKeyboardWillHideNotification" object:nil];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver:self
|
||||
selector:@selector(keyboardDidChangeFrame:)
|
||||
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
Loading…
Reference in New Issue
Block a user