Merge remote-tracking branch 'origin/release' into stable
Change-Id: I9300572e2b74f0564b2589cbd0fbdf24850f68df
This commit is contained in:
commit
73bc91c9df
70
dist/changes-5.3.0
vendored
70
dist/changes-5.3.0
vendored
@ -91,6 +91,10 @@ QtCore
|
|||||||
- QLibraryInfo provides information on how Qt was built.
|
- QLibraryInfo provides information on how Qt was built.
|
||||||
- Added class QMarginsF to support handling margins with floating-point
|
- Added class QMarginsF to support handling margins with floating-point
|
||||||
values.
|
values.
|
||||||
|
- The setSharable() and isSharable() functions in Qt containers has
|
||||||
|
been deprecated and will be removed in Qt 6. New applications should
|
||||||
|
not use this feature, while old applications that may be using this
|
||||||
|
(undocumented) feature should port away from it.
|
||||||
|
|
||||||
- Atomic support:
|
- Atomic support:
|
||||||
* Added more operations to the atomic classes, including operator T(),
|
* Added more operations to the atomic classes, including operator T(),
|
||||||
@ -222,6 +226,9 @@ QtGui
|
|||||||
EGL
|
EGL
|
||||||
- [QTBUG-36993] Native (that is, not distance field based) text
|
- [QTBUG-36993] Native (that is, not distance field based) text
|
||||||
rendering is now functional on OpenGL 3.2+ core profiles too.
|
rendering is now functional on OpenGL 3.2+ core profiles too.
|
||||||
|
- The function QOpenGLShaderProgram::create() has been added. It is can
|
||||||
|
be used to force immediate allocation of the program's id.
|
||||||
|
- QFont::setRawName() and QFont::rawName() were deprecated.
|
||||||
|
|
||||||
- Accessibility:
|
- Accessibility:
|
||||||
* [QTBUG-37204] Implemented text attributes to enable VoiceOver to read
|
* [QTBUG-37204] Implemented text attributes to enable VoiceOver to read
|
||||||
@ -285,8 +292,6 @@ QtNetwork
|
|||||||
QtPrintSupport
|
QtPrintSupport
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
- [QTBUG-29663] Made the Qt buildsystem automatically include the
|
|
||||||
necessary plugins so that static applications can print.
|
|
||||||
- CUPS 1.4 is now required for print support on Linux and other *nix
|
- CUPS 1.4 is now required for print support on Linux and other *nix
|
||||||
platforms.
|
platforms.
|
||||||
|
|
||||||
@ -309,19 +314,29 @@ QtPrintSupport
|
|||||||
QtSql
|
QtSql
|
||||||
-----
|
-----
|
||||||
|
|
||||||
- QSqlQuery::isNull(field) now correctly returns true for "no such field".
|
- QSqlError:
|
||||||
- QSqlQuery::isNull(fieldname) is a new overload.
|
* Now handles alphanumeric error codes. Used by QPSQL. Old numeric
|
||||||
- [QTBUG-12186] Fixed the order of values with positional binding in a
|
code is deprecated.
|
||||||
QSqlQuery
|
|
||||||
|
- QSqlQuery:
|
||||||
|
* isNull(field) now correctly returns true for "no such field".
|
||||||
|
* isNull(fieldname) is a new overload.
|
||||||
|
* [QTBUG-12186] Fixed order of values with positional binding.
|
||||||
|
|
||||||
|
- QSqlTableModel:
|
||||||
|
* [QTBUG-38509] Fix failure to refresh in selectRow()
|
||||||
|
|
||||||
|
- QIBASE:
|
||||||
|
* [QTBUG-37508] Fix QByteArray memory corruption in QIBaseDriver::open().
|
||||||
|
* Support for prepared queries in numRowsAffected().
|
||||||
|
|
||||||
|
- QODBC:
|
||||||
|
* [QTBUG-37831] Fix access of tmpStorage in QODBCResult::exec().
|
||||||
|
|
||||||
- QSQLITE:
|
- QSQLITE:
|
||||||
* Creating temporary databases is now possible
|
* Creating temporary databases is now possible
|
||||||
* Empty database name now opens in-memory database.
|
* Empty database name now opens in-memory database.
|
||||||
|
|
||||||
- QSqlError
|
|
||||||
* Now handles alphanumeric error codes. Used by QPSQL. Old numeric
|
|
||||||
code is deprecated.
|
|
||||||
|
|
||||||
QtTest
|
QtTest
|
||||||
------
|
------
|
||||||
|
|
||||||
@ -430,8 +445,6 @@ QtWidgets
|
|||||||
Android
|
Android
|
||||||
-------
|
-------
|
||||||
|
|
||||||
- [QTBUG-34781] Fixed regression in "make install" on library projects on
|
|
||||||
Android so they can be used inside subdirs projects again.
|
|
||||||
- [QTBUG-36074] Fixed crash on populating large combo boxes or menus.
|
- [QTBUG-36074] Fixed crash on populating large combo boxes or menus.
|
||||||
- [QTBUG-36528] Fixed QDir::entryList() for assets scheme to no longer
|
- [QTBUG-36528] Fixed QDir::entryList() for assets scheme to no longer
|
||||||
skip the first file in the directory.
|
skip the first file in the directory.
|
||||||
@ -513,3 +526,36 @@ qdbus
|
|||||||
trying to display remote interfaces that had complex types without a
|
trying to display remote interfaces that had complex types without a
|
||||||
matching base Qt type.
|
matching base Qt type.
|
||||||
|
|
||||||
|
configure & build system
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
- Configure's -separate-debug-info option is now checked more strictly.
|
||||||
|
- Added configure [-no]-imf options for QNX.
|
||||||
|
- Added unsupported linux-libc++-clang and freebsd-clang mkspecs.
|
||||||
|
- Numerous configuration-specific build fixes.
|
||||||
|
|
||||||
|
qmake
|
||||||
|
-----
|
||||||
|
|
||||||
|
- QTPLUGIN will now be automatically populated with the plugins that are
|
||||||
|
typically needed by the used Qt modules.
|
||||||
|
- qmake will not create dependencies on system headers any more, provided it
|
||||||
|
detects the system include paths.
|
||||||
|
- Added DISTCLEAN_DEPS variable analogous to CLEAN_DEPS.
|
||||||
|
- Added function $$getenv() which is equivalent to using the $$() expansion,
|
||||||
|
but permits various qmake meta characters in the name.
|
||||||
|
- [MacOS] QMAKE_BUNDLEID_PREFIX is now recognized by the Makefile generator.
|
||||||
|
- [QTBUG-29939][MSVC2012+] Added Windows XP target support.
|
||||||
|
- [QTBUG-35570][VS2012+] Fixed bad ProgramDataBaseFileName.
|
||||||
|
- [QTBUG-38066][VS2010+] Fixed version suffix being appended to applications.
|
||||||
|
- [QTBUG-31185][VS] The PlatformToolset environment variable is now honored.
|
||||||
|
- [QTBUG-34781][Android] Fixed regression in "make install" on library projects
|
||||||
|
so they can be used inside subdirs projects again.
|
||||||
|
- [QTBUG-37113] Fixed creation of excessively long relative paths, which
|
||||||
|
would lead to errors with MSVC. Note that this does not fix all such cases.
|
||||||
|
|
||||||
|
qlalr
|
||||||
|
-----
|
||||||
|
|
||||||
|
- (Re-)added to Qt base. Added corresponding qmake feature file.
|
||||||
|
Caveat: the generated files are not scanned for dependencies.
|
||||||
|
@ -39,15 +39,18 @@ manifestmeta.highlighted.names = "QtQuick/Qt Quick Demo - Same Game" \
|
|||||||
"QtQuick/Qt Quick Demo - Tweet Search" \
|
"QtQuick/Qt Quick Demo - Tweet Search" \
|
||||||
"QtQuick/Qt Quick Demo - Maroon*" \
|
"QtQuick/Qt Quick Demo - Maroon*" \
|
||||||
"QtQuick/Qt Quick Demo - Calqlatr" \
|
"QtQuick/Qt Quick Demo - Calqlatr" \
|
||||||
"QtQuick/Qt Quick Particles Examples - Emitters" \
|
"QtQuick/Qt Quick Demo - StocQt" \
|
||||||
|
"QtQuick/Qt Quick Demo - Clocks" \
|
||||||
"QtQuick/Qt Quick Examples - Shader Effects" \
|
"QtQuick/Qt Quick Examples - Shader Effects" \
|
||||||
"QtWebKitExamples/Fancy Browser" \
|
"QtQuick/Qt Quick Examples - Text" \
|
||||||
"QtWebKitExamples/Flickr View Example" \
|
"QtQuick/Qt Quick Examples - Window and Screen" \
|
||||||
"QtWebKitExamples/YouTube View Example" \
|
|
||||||
"QtQuickControls/Qt Quick Controls - Gallery" \
|
"QtQuickControls/Qt Quick Controls - Gallery" \
|
||||||
"QtQuickControls/Qt Quick Controls - Text Editor Example" \
|
"QtQuickControls/Qt Quick Controls - Text Editor Example" \
|
||||||
"QtQuickControls/Qt Quick Controls - Table View Example" \
|
"QtQuickControls/Qt Quick Controls - Table View Example" \
|
||||||
"QtWidgets/Application Example"
|
"QtQuickControls/Qt Quick Controls - Calendar Example" \
|
||||||
|
"QtQuickDialogs/Qt Quick System Dialog Examples" \
|
||||||
|
"QtWidgets/Application Example" \
|
||||||
|
"QtWinExtras/Quick Player"
|
||||||
|
|
||||||
manifestmeta.highlighted.attributes = isHighlighted:true
|
manifestmeta.highlighted.attributes = isHighlighted:true
|
||||||
|
|
||||||
|
@ -214,22 +214,23 @@ init_context:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add all our CAs to this store.
|
// Add all our CAs to this store.
|
||||||
QList<QSslCertificate> expiredCerts;
|
|
||||||
foreach (const QSslCertificate &caCertificate, sslContext->sslConfiguration.caCertificates()) {
|
foreach (const QSslCertificate &caCertificate, sslContext->sslConfiguration.caCertificates()) {
|
||||||
// add expired certs later, so that the
|
// From https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html:
|
||||||
// valid ones are used before the expired ones
|
//
|
||||||
if (caCertificate.expiryDate() < QDateTime::currentDateTime()) {
|
// If several CA certificates matching the name, key identifier, and
|
||||||
expiredCerts.append(caCertificate);
|
// serial number condition are available, only the first one will be
|
||||||
} else {
|
// examined. This may lead to unexpected results if the same CA
|
||||||
|
// certificate is available with different expiration dates. If a
|
||||||
|
// ``certificate expired'' verification error occurs, no other
|
||||||
|
// certificate will be searched. Make sure to not have expired
|
||||||
|
// certificates mixed with valid ones.
|
||||||
|
//
|
||||||
|
// See also: QSslSocketBackendPrivate::verify()
|
||||||
|
if (caCertificate.expiryDate() >= QDateTime::currentDateTime()) {
|
||||||
q_X509_STORE_add_cert(sslContext->ctx->cert_store, (X509 *)caCertificate.handle());
|
q_X509_STORE_add_cert(sslContext->ctx->cert_store, (X509 *)caCertificate.handle());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now add the expired certs
|
|
||||||
foreach (const QSslCertificate &caCertificate, expiredCerts) {
|
|
||||||
q_X509_STORE_add_cert(sslContext->ctx->cert_store, reinterpret_cast<X509 *>(caCertificate.handle()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QSslSocketPrivate::s_loadRootCertsOnDemand && allowRootCertOnDemandLoading) {
|
if (QSslSocketPrivate::s_loadRootCertsOnDemand && allowRootCertOnDemandLoading) {
|
||||||
// tell OpenSSL the directories where to look up the root certs on demand
|
// tell OpenSSL the directories where to look up the root certs on demand
|
||||||
QList<QByteArray> unixDirs = QSslSocketPrivate::unixRootCertDirectories();
|
QList<QByteArray> unixDirs = QSslSocketPrivate::unixRootCertDirectories();
|
||||||
|
@ -1600,23 +1600,23 @@ QList<QSslError> QSslSocketBackendPrivate::verify(QList<QSslCertificate> certifi
|
|||||||
setDefaultCaCertificates(defaultCaCertificates() + systemCaCertificates());
|
setDefaultCaCertificates(defaultCaCertificates() + systemCaCertificates());
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QSslCertificate> expiredCerts;
|
|
||||||
|
|
||||||
foreach (const QSslCertificate &caCertificate, QSslSocket::defaultCaCertificates()) {
|
foreach (const QSslCertificate &caCertificate, QSslSocket::defaultCaCertificates()) {
|
||||||
// add expired certs later, so that the
|
// From https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html:
|
||||||
// valid ones are used before the expired ones
|
//
|
||||||
if (caCertificate.expiryDate() < QDateTime::currentDateTime()) {
|
// If several CA certificates matching the name, key identifier, and
|
||||||
expiredCerts.append(caCertificate);
|
// serial number condition are available, only the first one will be
|
||||||
} else {
|
// examined. This may lead to unexpected results if the same CA
|
||||||
|
// certificate is available with different expiration dates. If a
|
||||||
|
// ``certificate expired'' verification error occurs, no other
|
||||||
|
// certificate will be searched. Make sure to not have expired
|
||||||
|
// certificates mixed with valid ones.
|
||||||
|
//
|
||||||
|
// See also: QSslContext::fromConfiguration()
|
||||||
|
if (caCertificate.expiryDate() >= QDateTime::currentDateTime()) {
|
||||||
q_X509_STORE_add_cert(certStore, reinterpret_cast<X509 *>(caCertificate.handle()));
|
q_X509_STORE_add_cert(certStore, reinterpret_cast<X509 *>(caCertificate.handle()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now add the expired certs
|
|
||||||
foreach (const QSslCertificate &caCertificate, expiredCerts) {
|
|
||||||
q_X509_STORE_add_cert(certStore, reinterpret_cast<X509 *>(caCertificate.handle()));
|
|
||||||
}
|
|
||||||
|
|
||||||
QMutexLocker sslErrorListMutexLocker(&_q_sslErrorList()->mutex);
|
QMutexLocker sslErrorListMutexLocker(&_q_sslErrorList()->mutex);
|
||||||
|
|
||||||
// Register a custom callback to get all verification errors.
|
// Register a custom callback to get all verification errors.
|
||||||
|
@ -100,9 +100,8 @@ void QEGLPlatformBackingStore::updateTexture()
|
|||||||
glBindTexture(GL_TEXTURE_2D, m_bsTexture);
|
glBindTexture(GL_TEXTURE_2D, m_bsTexture);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
// QOpenGLTextureBlitter requires GL_REPEAT for the time being
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_image.width(), m_image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_image.width(), m_image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||||
} else {
|
} else {
|
||||||
glBindTexture(GL_TEXTURE_2D, m_bsTexture);
|
glBindTexture(GL_TEXTURE_2D, m_bsTexture);
|
||||||
|
@ -425,17 +425,8 @@ QWinRTScreen::QWinRTScreen(ICoreWindow *window)
|
|||||||
#endif
|
#endif
|
||||||
, m_cursor(new QWinRTCursor(window))
|
, m_cursor(new QWinRTCursor(window))
|
||||||
, m_orientation(Qt::PrimaryOrientation)
|
, m_orientation(Qt::PrimaryOrientation)
|
||||||
|
, m_touchDevice(Q_NULLPTR)
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WINPHONE // On phone, there can be only one touch device
|
|
||||||
QTouchDevice *touchDevice = new QTouchDevice;
|
|
||||||
touchDevice->setCapabilities(QTouchDevice::Position | QTouchDevice::Area | QTouchDevice::Pressure);
|
|
||||||
touchDevice->setType(QTouchDevice::TouchScreen);
|
|
||||||
touchDevice->setName(QStringLiteral("WinPhoneTouchScreen"));
|
|
||||||
Pointer pointer = { Pointer::TouchScreen, touchDevice };
|
|
||||||
m_pointers.insert(0, pointer);
|
|
||||||
QWindowSystemInterface::registerTouchDevice(touchDevice);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Rect rect;
|
Rect rect;
|
||||||
window->get_Bounds(&rect);
|
window->get_Bounds(&rect);
|
||||||
m_geometry = QRect(0, 0, rect.Width, rect.Height);
|
m_geometry = QRect(0, 0, rect.Width, rect.Height);
|
||||||
@ -763,47 +754,25 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *window, IPointerEventArgs *a
|
|||||||
if (FAILED(pointerPoint->get_Properties(&properties)))
|
if (FAILED(pointerPoint->get_Properties(&properties)))
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
#ifdef Q_OS_WINPHONE
|
PointerDeviceType pointerDeviceType;
|
||||||
quint32 pointerId = 0;
|
#if defined(Q_OS_WINPHONE) && _MSC_VER <= 1700
|
||||||
Pointer pointer = m_pointers.value(pointerId);
|
pointerDeviceType = PointerDeviceType_Touch;
|
||||||
#else
|
#else
|
||||||
Pointer pointer = { Pointer::Unknown, 0 };
|
ComPtr<IPointerDevice> pointerDevice;
|
||||||
quint32 pointerId;
|
HRESULT hr = pointerPoint->get_PointerDevice(&pointerDevice);
|
||||||
pointerPoint->get_PointerId(&pointerId);
|
if (FAILED(hr)) {
|
||||||
if (m_pointers.contains(pointerId)) {
|
qErrnoWarning(hr, "Failed to get pointer device.");
|
||||||
pointer = m_pointers.value(pointerId);
|
return S_OK;
|
||||||
} else { // We have not yet enumerated this device. Do so now...
|
|
||||||
IPointerDevice *device;
|
|
||||||
if (SUCCEEDED(pointerPoint->get_PointerDevice(&device))) {
|
|
||||||
PointerDeviceType type;
|
|
||||||
device->get_PointerDeviceType(&type);
|
|
||||||
switch (type) {
|
|
||||||
case PointerDeviceType_Touch:
|
|
||||||
pointer.type = Pointer::TouchScreen;
|
|
||||||
pointer.device = new QTouchDevice;
|
|
||||||
pointer.device->setName(QStringLiteral("WinRT TouchScreen ") + QString::number(pointerId));
|
|
||||||
// TODO: We may want to probe the device usage flags for more accurate values for these next two
|
|
||||||
pointer.device->setType(QTouchDevice::TouchScreen);
|
|
||||||
pointer.device->setCapabilities(QTouchDevice::Position | QTouchDevice::Area | QTouchDevice::Pressure);
|
|
||||||
QWindowSystemInterface::registerTouchDevice(pointer.device);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PointerDeviceType_Pen:
|
|
||||||
pointer.type = Pointer::Tablet;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PointerDeviceType_Mouse:
|
|
||||||
pointer.type = Pointer::Mouse;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pointers.insert(pointerId, pointer);
|
hr = pointerDevice->get_PointerDeviceType(&pointerDeviceType);
|
||||||
device->Release();
|
if (FAILED(hr)) {
|
||||||
}
|
qErrnoWarning(hr, "Failed to get pointer device type.");
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
switch (pointer.type) {
|
switch (pointerDeviceType) {
|
||||||
case Pointer::Mouse: {
|
case PointerDeviceType_Mouse: {
|
||||||
qint32 delta;
|
qint32 delta;
|
||||||
properties->get_MouseWheelDelta(&delta);
|
properties->get_MouseWheelDelta(&delta);
|
||||||
if (delta) {
|
if (delta) {
|
||||||
@ -840,7 +809,15 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *window, IPointerEventArgs *a
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Pointer::TouchScreen: {
|
case PointerDeviceType_Touch: {
|
||||||
|
if (!m_touchDevice) {
|
||||||
|
m_touchDevice = new QTouchDevice;
|
||||||
|
m_touchDevice->setName(QStringLiteral("WinRTTouchScreen"));
|
||||||
|
m_touchDevice->setType(QTouchDevice::TouchScreen);
|
||||||
|
m_touchDevice->setCapabilities(QTouchDevice::Position | QTouchDevice::Area | QTouchDevice::Pressure | QTouchDevice::NormalizedPosition);
|
||||||
|
QWindowSystemInterface::registerTouchDevice(m_touchDevice);
|
||||||
|
}
|
||||||
|
|
||||||
quint32 id;
|
quint32 id;
|
||||||
pointerPoint->get_PointerId(&id);
|
pointerPoint->get_PointerId(&id);
|
||||||
|
|
||||||
@ -868,7 +845,7 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *window, IPointerEventArgs *a
|
|||||||
it.value().normalPosition = QPointF(pos.x()/m_geometry.width(), pos.y()/m_geometry.height());
|
it.value().normalPosition = QPointF(pos.x()/m_geometry.width(), pos.y()/m_geometry.height());
|
||||||
it.value().pressure = pressure;
|
it.value().pressure = pressure;
|
||||||
|
|
||||||
QWindowSystemInterface::handleTouchEvent(topWindow(), pointer.device, m_touchPoints.values(), mods);
|
QWindowSystemInterface::handleTouchEvent(topWindow(), m_touchDevice, m_touchPoints.values(), mods);
|
||||||
|
|
||||||
// Remove released points, station others
|
// Remove released points, station others
|
||||||
for (QHash<quint32, QWindowSystemInterface::TouchPoint>::iterator i = m_touchPoints.begin(); i != m_touchPoints.end();) {
|
for (QHash<quint32, QWindowSystemInterface::TouchPoint>::iterator i = m_touchPoints.begin(); i != m_touchPoints.end();) {
|
||||||
@ -880,7 +857,7 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *window, IPointerEventArgs *a
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Pointer::Tablet: {
|
case PointerDeviceType_Pen: {
|
||||||
quint32 id;
|
quint32 id;
|
||||||
pointerPoint->get_PointerId(&id);
|
pointerPoint->get_PointerId(&id);
|
||||||
|
|
||||||
@ -903,7 +880,7 @@ HRESULT QWinRTScreen::onPointerUpdated(ICoreWindow *window, IPointerEventArgs *a
|
|||||||
float rotation;
|
float rotation;
|
||||||
properties->get_Twist(&rotation);
|
properties->get_Twist(&rotation);
|
||||||
|
|
||||||
QWindowSystemInterface::handleTabletEvent(topWindow(), isPressed, pos, pos, pointerId,
|
QWindowSystemInterface::handleTabletEvent(topWindow(), isPressed, pos, pos, 0,
|
||||||
pointerType, pressure, xTilt, yTilt,
|
pointerType, pressure, xTilt, yTilt,
|
||||||
0, rotation, 0, id, mods);
|
0, rotation, 0, id, mods);
|
||||||
|
|
||||||
|
@ -101,12 +101,6 @@ class QWinRTPageFlipper;
|
|||||||
class QWinRTCursor;
|
class QWinRTCursor;
|
||||||
class QWinRTInputContext;
|
class QWinRTInputContext;
|
||||||
|
|
||||||
struct Pointer {
|
|
||||||
enum Type { Unknown, Mouse, TouchScreen, Tablet };
|
|
||||||
Type type;
|
|
||||||
QTouchDevice *device;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QWinRTScreen : public QPlatformScreen
|
class QWinRTScreen : public QPlatformScreen
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -165,6 +159,7 @@ private:
|
|||||||
ABI::Windows::UI::Core::ICoreWindow *m_coreWindow;
|
ABI::Windows::UI::Core::ICoreWindow *m_coreWindow;
|
||||||
ABI::Windows::UI::ViewManagement::IApplicationViewStatics *m_applicationView;
|
ABI::Windows::UI::ViewManagement::IApplicationViewStatics *m_applicationView;
|
||||||
ABI::Windows::ApplicationModel::Core::ICoreApplication *m_application;
|
ABI::Windows::ApplicationModel::Core::ICoreApplication *m_application;
|
||||||
|
|
||||||
QRect m_geometry;
|
QRect m_geometry;
|
||||||
QImage::Format m_format;
|
QImage::Format m_format;
|
||||||
QSurfaceFormat m_surfaceFormat;
|
QSurfaceFormat m_surfaceFormat;
|
||||||
@ -183,7 +178,7 @@ private:
|
|||||||
#ifndef Q_OS_WINPHONE
|
#ifndef Q_OS_WINPHONE
|
||||||
QHash<quint32, QPair<Qt::Key, QString> > m_activeKeys;
|
QHash<quint32, QPair<Qt::Key, QString> > m_activeKeys;
|
||||||
#endif
|
#endif
|
||||||
QHash<quint32, Pointer> m_pointers;
|
QTouchDevice *m_touchDevice;
|
||||||
QHash<quint32, QWindowSystemInterface::TouchPoint> m_touchPoints;
|
QHash<quint32, QWindowSystemInterface::TouchPoint> m_touchPoints;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1791,19 +1791,6 @@ bool QXcbConnection::xi2GetValuatorValueIfSet(void *event, int valuatorNum, doub
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QXcbConnection::xi2GetButtonState(void *event, int buttonNum)
|
|
||||||
{
|
|
||||||
xXIDeviceEvent *xideviceevent = static_cast<xXIDeviceEvent *>(event);
|
|
||||||
unsigned char *buttonsMaskAddr = (unsigned char*)&xideviceevent[1];
|
|
||||||
|
|
||||||
for (int i = 0; i < (xideviceevent->buttons_len * 4); i++) {
|
|
||||||
if (buttonNum < 8)
|
|
||||||
return (buttonsMaskAddr[i] & (1 << buttonNum));
|
|
||||||
buttonNum -= 8;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed:
|
// Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed:
|
||||||
// - "pad0" became "extension"
|
// - "pad0" became "extension"
|
||||||
// - "pad1" and "pad" became "pad0"
|
// - "pad1" and "pad" became "pad0"
|
||||||
|
@ -532,7 +532,6 @@ private:
|
|||||||
#if defined(XCB_USE_XINPUT2) || defined(XCB_USE_XINPUT2_MAEMO)
|
#if defined(XCB_USE_XINPUT2) || defined(XCB_USE_XINPUT2_MAEMO)
|
||||||
static bool xi2GetValuatorValueIfSet(void *event, int valuatorNum, double *value);
|
static bool xi2GetValuatorValueIfSet(void *event, int valuatorNum, double *value);
|
||||||
static bool xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *event, int opCode);
|
static bool xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *event, int opCode);
|
||||||
static bool xi2GetButtonState(void *event, int buttonNum);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
xcb_connection_t *m_connection;
|
xcb_connection_t *m_connection;
|
||||||
|
@ -575,7 +575,7 @@ void QXcbConnection::xi2HandleScrollEvent(void *event, ScrollingDevice &scrollin
|
|||||||
#ifdef XCB_USE_XINPUT21
|
#ifdef XCB_USE_XINPUT21
|
||||||
xXIGenericDeviceEvent *xiEvent = reinterpret_cast<xXIGenericDeviceEvent *>(event);
|
xXIGenericDeviceEvent *xiEvent = reinterpret_cast<xXIGenericDeviceEvent *>(event);
|
||||||
|
|
||||||
if (xiEvent->evtype == XI_Motion) {
|
if (xiEvent->evtype == XI_Motion && scrollingDevice.orientations) {
|
||||||
xXIDeviceEvent* xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event);
|
xXIDeviceEvent* xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event);
|
||||||
if (QXcbWindow *platformWindow = platformWindowFromId(xiDeviceEvent->event)) {
|
if (QXcbWindow *platformWindow = platformWindowFromId(xiDeviceEvent->event)) {
|
||||||
QPoint rawDelta;
|
QPoint rawDelta;
|
||||||
@ -612,20 +612,20 @@ void QXcbConnection::xi2HandleScrollEvent(void *event, ScrollingDevice &scrollin
|
|||||||
QWindowSystemInterface::handleWheelEvent(platformWindow->window(), xiEvent->time, local, global, rawDelta, angleDelta, modifiers);
|
QWindowSystemInterface::handleWheelEvent(platformWindow->window(), xiEvent->time, local, global, rawDelta, angleDelta, modifiers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (xiEvent->evtype == XI_ButtonRelease) {
|
} else if (xiEvent->evtype == XI_ButtonRelease && scrollingDevice.legacyOrientations) {
|
||||||
xXIDeviceEvent* xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event);
|
xXIDeviceEvent* xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event);
|
||||||
if (QXcbWindow *platformWindow = platformWindowFromId(xiDeviceEvent->event)) {
|
if (QXcbWindow *platformWindow = platformWindowFromId(xiDeviceEvent->event)) {
|
||||||
QPoint angleDelta;
|
QPoint angleDelta;
|
||||||
if (scrollingDevice.legacyOrientations & Qt::Vertical) {
|
if (scrollingDevice.legacyOrientations & Qt::Vertical) {
|
||||||
if (xi2GetButtonState(xiDeviceEvent, 4))
|
if (xiDeviceEvent->detail == 4)
|
||||||
angleDelta.setY(120);
|
angleDelta.setY(120);
|
||||||
else if (xi2GetButtonState(xiDeviceEvent, 5))
|
else if (xiDeviceEvent->detail == 5)
|
||||||
angleDelta.setY(-120);
|
angleDelta.setY(-120);
|
||||||
}
|
}
|
||||||
if (scrollingDevice.legacyOrientations & Qt::Horizontal) {
|
if (scrollingDevice.legacyOrientations & Qt::Horizontal) {
|
||||||
if (xi2GetButtonState(xiDeviceEvent, 6))
|
if (xiDeviceEvent->detail == 6)
|
||||||
angleDelta.setX(120);
|
angleDelta.setX(120);
|
||||||
if (xi2GetButtonState(xiDeviceEvent, 7))
|
else if (xiDeviceEvent->detail == 7)
|
||||||
angleDelta.setX(-120);
|
angleDelta.setX(-120);
|
||||||
}
|
}
|
||||||
if (!angleDelta.isNull()) {
|
if (!angleDelta.isNull()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user