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

Change-Id: I8b5a10d897a926078895ae41f48cdbd2474902b8
This commit is contained in:
Qt Forward Merge Bot 2018-03-15 01:00:11 +01:00
commit 8264e495fa
48 changed files with 484 additions and 281 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -84,8 +84,13 @@ MainWindow::MainWindow() : QMainWindow(0)
view->setAlignment(Qt::AlignLeft | Qt::AlignTop); view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
scene->setupScene(newAction, quitAction); scene->setupScene(newAction, quitAction);
#ifndef QT_NO_OPENGL #ifndef QT_NO_OPENGL
view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); QGLWidget *glWidget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
if (glWidget->context()->isValid()) {
view->setViewport(glWidget);
} else {
qWarning("Unable to create an Open GL context with sample buffers, not using Open GL.");
delete glWidget;
}
#endif #endif
setCentralWidget(view); setCentralWidget(view);
} }

View File

@ -31,8 +31,38 @@
\ingroup examples-itemviews \ingroup examples-itemviews
\brief This example demonstrates the usage of a tree view. \brief This example demonstrates the usage of a tree view.
\brief The Dir View example shows a tree view onto the local filing system. It uses the The Dir View example shows a tree view of the local file
QFileSystemModel class to provide file and directory information. system. It uses the QFileSystemModel class to provide file
and directory information.
\image dirview-example.png \borderedimage dirview-example.png
The example supports a number of command line options.
These options include:
\list
\li Application description
\li -help option
\li -version option
\li if the optionc {-c} is specified, the application will not
use custom directory options
\endlist
\quotefromfile itemviews/dirview/main.cpp
\skipto QCommandLineParser parser
\printuntil parser.positionalArguments
Declares a QFileSystemModel as data model for viewing
the local file system. QFileSystem works with a cache, that is,
it is updated continually with QFileSystemWatcher on that folder.
\skipto QFileSystemModel
\printuntil tree.setModel
Creates a model/view implementation called \c tree
for viewing the filesystem.
\skipto tree.setAnimated(false)
\printuntil tree.setWindowTitle
Sets some formatting options for \c tree.
*/ */

View File

@ -34,7 +34,82 @@
applications. The widget placement depends on whether \c Horizontal or \c applications. The widget placement depends on whether \c Horizontal or \c
Vertical is chosen. Vertical is chosen.
\borderedimage dynamiclayouts-example.png
For more information, visit the \l{Layout Management} page. For more information, visit the \l{Layout Management} page.
\section1 Dialog Constructor
To begin with, the application creates the UI components by calling the
following methods:
\list
\li createRotatableGroupBox()
\li createOptionsGroupBox()
\li createButtonBox()
\endlist
It then adds the UI components to a GridLayout (\c mainLayout).
Finally, \c Dialog::rotateWidgets() is called.
\quotefromfile layouts/dynamiclayouts/dialog.cpp
\skipuntil createRotatableGroupBox
\printuntil setWindowTitle
\section1 Creating the Main Widgets
The \c createRotatableGroupBox() method creates a rotatable group box,
then adds a series of widgets:
\list
\li QSpinBox
\li QSlider
\li QDial
\li QProgressBar
\endlist
It goes on to add signals and slots to each widget, and assigns
a QGridLayout called \a rotatableLayout.
\skipto Dialog::createRotatableGroupBox
\printuntil /^\}/
\section1 Adding Options
\c createOptionsGroupBox() creates the following widgets:
\list
\li \c optionsGroupBox
\li \c buttonsOrientationLabel
\li \c buttonsOrientationComboBox. The orientation of the ComboBox is either
\c horizontal (default value) or \c vertical. These two values
are added during the startup of the application. It is not possible
to leave the option empty.
\endlist
\skipto Dialog::createOptionsGroupBox()
\printuntil /^\}/
\section1 Adding Buttons
createButtonBox() constructs a QDialogButtonBox called \c buttonBox
to which are added a \c closeButton, a \c helpButton and a
\c rotateWidgetsButton.
It then assigns a signal and a slot to each button in \c buttonBox.
\skipto Dialog::createButtonBox()
\printuntil /^\}/
\section1 Rotating the Widgets
Removes the current widgets and activates the next widget.
\quotefromfile layouts/dynamiclayouts/dialog.cpp
\skipto Dialog::rotateWidgets()
\printuntil rotatableLayout->addWidget(rotatableWidgets[i]
\printuntil }
\printuntil }
\include examples-run.qdocinc \include examples-run.qdocinc
*/ */

View File

@ -36,5 +36,17 @@
\image graphicsflowlayout-example.png \image graphicsflowlayout-example.png
See the \l{Flow Layout Example} for a corresponding widget-based example. This example uses a Graphics View to display the widget, which is a more
customizable approach than displaying the flow layout in the application
window (See \l {Flow Layout Example}).
Graphics View Flow Layout snippet:
\snippet graphicsview/flowlayout/main.cpp 1
Flow Layout Example snippet:
\snippet layouts/flowlayout/main.cpp 1
*/ */

View File

@ -47,7 +47,7 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
//! [1]
#include "window.h" #include "window.h"
#include <QApplication> #include <QApplication>
@ -68,3 +68,4 @@ int main(int argc, char *argv[])
return app.exec(); return app.exec();
} }
//! [1]

View File

@ -55,12 +55,12 @@
Dialog::Dialog(QWidget *parent) Dialog::Dialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
{ {
createRotableGroupBox(); createRotatableGroupBox();
createOptionsGroupBox(); createOptionsGroupBox();
createButtonBox(); createButtonBox();
mainLayout = new QGridLayout; mainLayout = new QGridLayout;
mainLayout->addWidget(rotableGroupBox, 0, 0); mainLayout->addWidget(rotatableGroupBox, 0, 0);
mainLayout->addWidget(optionsGroupBox, 1, 0); mainLayout->addWidget(optionsGroupBox, 1, 0);
mainLayout->addWidget(buttonBox, 2, 0); mainLayout->addWidget(buttonBox, 2, 0);
setLayout(mainLayout); setLayout(mainLayout);
@ -102,17 +102,17 @@ void Dialog::buttonsOrientationChanged(int index)
void Dialog::rotateWidgets() void Dialog::rotateWidgets()
{ {
Q_ASSERT(rotableWidgets.count() % 2 == 0); Q_ASSERT(rotatableWidgets.count() % 2 == 0);
foreach (QWidget *widget, rotableWidgets) foreach (QWidget *widget, rotatableWidgets)
rotableLayout->removeWidget(widget); rotatableLayout->removeWidget(widget);
rotableWidgets.enqueue(rotableWidgets.dequeue()); rotatableWidgets.enqueue(rotatableWidgets.dequeue());
const int n = rotableWidgets.count(); const int n = rotatableWidgets.count();
for (int i = 0; i < n / 2; ++i) { for (int i = 0; i < n / 2; ++i) {
rotableLayout->addWidget(rotableWidgets[n - i - 1], 0, i); rotatableLayout->addWidget(rotatableWidgets[n - i - 1], 0, i);
rotableLayout->addWidget(rotableWidgets[i], 1, i); rotatableLayout->addWidget(rotatableWidgets[i], 1, i);
} }
} }
@ -123,23 +123,23 @@ void Dialog::help()
"dynamically.")); "dynamically."));
} }
void Dialog::createRotableGroupBox() void Dialog::createRotatableGroupBox()
{ {
rotableGroupBox = new QGroupBox(tr("Rotable Widgets")); rotatableGroupBox = new QGroupBox(tr("Rotatable Widgets"));
rotableWidgets.enqueue(new QSpinBox); rotatableWidgets.enqueue(new QSpinBox);
rotableWidgets.enqueue(new QSlider); rotatableWidgets.enqueue(new QSlider);
rotableWidgets.enqueue(new QDial); rotatableWidgets.enqueue(new QDial);
rotableWidgets.enqueue(new QProgressBar); rotatableWidgets.enqueue(new QProgressBar);
int n = rotableWidgets.count(); int n = rotatableWidgets.count();
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
connect(rotableWidgets[i], SIGNAL(valueChanged(int)), connect(rotatableWidgets[i], SIGNAL(valueChanged(int)),
rotableWidgets[(i + 1) % n], SLOT(setValue(int))); rotatableWidgets[(i + 1) % n], SLOT(setValue(int)));
} }
rotableLayout = new QGridLayout; rotatableLayout = new QGridLayout;
rotableGroupBox->setLayout(rotableLayout); rotatableGroupBox->setLayout(rotatableLayout);
rotateWidgets(); rotateWidgets();
} }
@ -154,8 +154,10 @@ void Dialog::createOptionsGroupBox()
buttonsOrientationComboBox->addItem(tr("Horizontal"), Qt::Horizontal); buttonsOrientationComboBox->addItem(tr("Horizontal"), Qt::Horizontal);
buttonsOrientationComboBox->addItem(tr("Vertical"), Qt::Vertical); buttonsOrientationComboBox->addItem(tr("Vertical"), Qt::Vertical);
connect(buttonsOrientationComboBox, SIGNAL(currentIndexChanged(int)), connect(buttonsOrientationComboBox,
this, SLOT(buttonsOrientationChanged(int))); QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
&Dialog::buttonsOrientationChanged);
optionsLayout = new QGridLayout; optionsLayout = new QGridLayout;
optionsLayout->addWidget(buttonsOrientationLabel, 0, 0); optionsLayout->addWidget(buttonsOrientationLabel, 0, 0);
@ -173,7 +175,9 @@ void Dialog::createButtonBox()
rotateWidgetsButton = buttonBox->addButton(tr("Rotate &Widgets"), rotateWidgetsButton = buttonBox->addButton(tr("Rotate &Widgets"),
QDialogButtonBox::ActionRole); QDialogButtonBox::ActionRole);
connect(rotateWidgetsButton, SIGNAL(clicked()), this, SLOT(rotateWidgets())); connect(rotateWidgetsButton, &QPushButton::clicked, this, &Dialog::rotateWidgets);
connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(closeButton, &QPushButton::clicked, this, &Dialog::close);
connect(helpButton, SIGNAL(clicked()), this, SLOT(help())); connect(helpButton, &QPushButton::clicked, this, &Dialog::help);
} }

View File

@ -76,12 +76,12 @@ private slots:
void help(); void help();
private: private:
void createRotableGroupBox(); void createRotatableGroupBox();
void createOptionsGroupBox(); void createOptionsGroupBox();
void createButtonBox(); void createButtonBox();
QGroupBox *rotableGroupBox; QGroupBox *rotatableGroupBox;
QQueue<QWidget *> rotableWidgets; QQueue<QWidget *> rotatableWidgets;
QGroupBox *optionsGroupBox; QGroupBox *optionsGroupBox;
QLabel *buttonsOrientationLabel; QLabel *buttonsOrientationLabel;
@ -93,7 +93,7 @@ private:
QPushButton *rotateWidgetsButton; QPushButton *rotateWidgetsButton;
QGridLayout *mainLayout; QGridLayout *mainLayout;
QGridLayout *rotableLayout; QGridLayout *rotatableLayout;
QGridLayout *optionsLayout; QGridLayout *optionsLayout;
}; };

View File

@ -47,7 +47,7 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
//! [1]
#include <QApplication> #include <QApplication>
#include "window.h" #include "window.h"
@ -59,3 +59,4 @@ int main(int argc, char *argv[])
window.show(); window.show();
return app.exec(); return app.exec();
} }
//! [1]

View File

@ -48,9 +48,7 @@
#include <errno.h> #include <errno.h>
#if QT_CONFIG(getentropy) #if !QT_CONFIG(getentropy) && !defined(Q_OS_BSD4) && !defined(Q_OS_WIN)
# include <sys/random.h>
#elif !defined(Q_OS_BSD4) && !defined(Q_OS_WIN)
# include "qdeadlinetimer.h" # include "qdeadlinetimer.h"
# include "qhashfunctions.h" # include "qhashfunctions.h"

View File

@ -750,13 +750,47 @@ QString QDir::filePath(const QString &fileName) const
QString QDir::absoluteFilePath(const QString &fileName) const QString QDir::absoluteFilePath(const QString &fileName) const
{ {
const QDirPrivate* d = d_ptr.constData(); const QDirPrivate* d = d_ptr.constData();
if (isAbsolutePath(fileName)) // Don't trust our own isAbsolutePath(); Q_OS_WIN needs a drive.
if (QFileSystemEntry(fileName).isAbsolute())
return fileName; return fileName;
d->resolveAbsoluteEntry(); d->resolveAbsoluteEntry();
const QString absoluteDirPath = d->absoluteDirEntry.filePath(); const QString absoluteDirPath = d->absoluteDirEntry.filePath();
if (fileName.isEmpty()) if (fileName.isEmpty())
return absoluteDirPath; return absoluteDirPath;
#ifdef Q_OS_WIN
// Handle the "absolute except for drive" case (i.e. \blah not c:\blah):
int size = absoluteDirPath.length();
if ((fileName.startsWith(QLatin1Char('/'))
|| fileName.startsWith(QLatin1Char('\\')))
&& size > 1) {
// Combine absoluteDirPath's drive with fileName
int drive = 2; // length of drive prefix
if (Q_UNLIKELY(absoluteDirPath.at(1).unicode() != ':')) {
// Presumably, absoluteDirPath is an UNC path; use its //server/share
// part as "drive" - it's as sane a thing as we can do.
for (int i = 2; i-- > 0; ) { // Scan two "path fragments":
while (drive < size && absoluteDirPath.at(drive).unicode() == '/')
drive++;
if (drive >= size) {
qWarning("Base directory starts with neither a drive nor a UNC share: %s",
qPrintable(QDir::toNativeSeparators(absoluteDirPath)));
return QString();
}
while (drive < size && absoluteDirPath.at(drive).unicode() != '/')
drive++;
}
// We'll append fileName, which starts with a slash; so omit trailing slash:
if (absoluteDirPath.at(drive).unicode() == '/')
drive--;
} else if (!absoluteDirPath.at(0).isLetter()) {
qWarning("Base directory's drive is not a letter: %s",
qPrintable(QDir::toNativeSeparators(absoluteDirPath)));
return QString();
}
return absoluteDirPath.leftRef(drive) % fileName;
}
#endif // Q_OS_WIN
if (!absoluteDirPath.endsWith(QLatin1Char('/'))) if (!absoluteDirPath.endsWith(QLatin1Char('/')))
return absoluteDirPath % QLatin1Char('/') % fileName; return absoluteDirPath % QLatin1Char('/') % fileName;
return absoluteDirPath % fileName; return absoluteDirPath % fileName;

View File

@ -91,26 +91,35 @@ extern "C" NSString *NSTemporaryDirectory();
# include <sys/syscall.h> # include <sys/syscall.h>
# include <sys/sendfile.h> # include <sys/sendfile.h>
# include <linux/fs.h> # include <linux/fs.h>
# include <linux/stat.h>
// in case linux/fs.h is too old and doesn't define it: // in case linux/fs.h is too old and doesn't define it:
#ifndef FICLONE #ifndef FICLONE
# define FICLONE _IOW(0x94, 9, int) # define FICLONE _IOW(0x94, 9, int)
#endif #endif
# if defined(Q_OS_ANDROID)
// renameat2() and statx() are disabled on Android because quite a few systems
// come with sandboxes that kill applications that make system calls outside a
// whitelist and several Android vendors can't be bothered to update the list.
# undef SYS_renameat2
# undef SYS_statx
# undef STATX_BASIC_STATS
# else
# if !QT_CONFIG(renameat2) && defined(SYS_renameat2) # if !QT_CONFIG(renameat2) && defined(SYS_renameat2)
static int renameat2(int oldfd, const char *oldpath, int newfd, const char *newpath, unsigned flags) static int renameat2(int oldfd, const char *oldpath, int newfd, const char *newpath, unsigned flags)
{ return syscall(SYS_renameat2, oldfd, oldpath, newfd, newpath, flags); } { return syscall(SYS_renameat2, oldfd, oldpath, newfd, newpath, flags); }
# endif # endif
# if !QT_CONFIG(statx) && defined(SYS_statx) && QT_HAS_INCLUDE(<linux/stat.h>) # if !QT_CONFIG(statx) && defined(SYS_statx)
# include <linux/stat.h>
static int statx(int dirfd, const char *pathname, int flag, unsigned mask, struct statx *statxbuf) static int statx(int dirfd, const char *pathname, int flag, unsigned mask, struct statx *statxbuf)
{ return syscall(SYS_statx, dirfd, pathname, flag, mask, statxbuf); } { return syscall(SYS_statx, dirfd, pathname, flag, mask, statxbuf); }
# endif # endif
# endif // !Q_OS_ANDROID
#endif #endif
#ifndef STATX_BASIC_STATS #ifndef STATX_ALL
struct statx { mode_t stx_mode; }; struct statx { mode_t stx_mode; }; // dummy
#endif #endif
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE

View File

@ -599,7 +599,7 @@ void QtAndroidPrivate::setOnBindListener(QtAndroidPrivate::OnBindListener *liste
jobject QtAndroidPrivate::callOnBindListener(jobject intent) jobject QtAndroidPrivate::callOnBindListener(jobject intent)
{ {
QMutexLocker lock(g_onBindListenerMutex); QMutexLocker lock(g_onBindListenerMutex);
if (g_onBindListener) if (*g_onBindListener)
return (*g_onBindListener)->onBind(intent); return (*g_onBindListener)->onBind(intent);
return nullptr; return nullptr;
} }

View File

@ -3896,7 +3896,7 @@ QDebug operator<<(QDebug dbg, const QVariant::Type p)
\sa setValue(), value() \sa setValue(), value()
*/ */
/*! \fn static inline QVariant fromStdVariant(const std::variant<T, Types...> &value) /*! \fn template<typename... Types> QVariant QVariant::fromStdVariant(const std::variant<Types...> &value)
\since 5.11 \since 5.11
Returns a QVariant with the type and value of the active variant of \a value. If Returns a QVariant with the type and value of the active variant of \a value. If

View File

@ -359,7 +359,7 @@ class Q_CORE_EXPORT QVariant
static inline QVariant fromValue(const T &value) static inline QVariant fromValue(const T &value)
{ return qVariantFromValue(value); } { return qVariantFromValue(value); }
#if QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L #if defined(Q_CLANG_QDOC) || (QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L)
template<typename... Types> template<typename... Types>
static inline QVariant fromStdVariant(const std::variant<Types...> &value) static inline QVariant fromStdVariant(const std::variant<Types...> &value)
{ {

View File

@ -4409,7 +4409,6 @@ QByteArray &QByteArray::setRawData(const char *data, uint size)
} else { } else {
d->offset = sizeof(QByteArrayData); d->offset = sizeof(QByteArrayData);
d->size = 0; d->size = 0;
*d->data() = 0;
} }
} }
return *this; return *this;

View File

@ -222,6 +222,9 @@ void QOpenGLWindowPrivate::initialize()
if (context) if (context)
return; return;
if (!q->handle())
qWarning("Attempted to initialize QOpenGLWindow without a platform window");
context.reset(new QOpenGLContext); context.reset(new QOpenGLContext);
context->setShareContext(shareContext); context->setShareContext(shareContext);
context->setFormat(q->requestedFormat()); context->setFormat(q->requestedFormat());

View File

@ -251,7 +251,7 @@ QT_DEFINE_QPA_EVENT_HANDLER(void, handleWindowStateChanged, QWindow *window, Qt:
{ {
Q_ASSERT(window); Q_ASSERT(window);
if (oldState < Qt::WindowNoState) if (oldState < Qt::WindowNoState)
oldState = window->windowState(); oldState = window->windowStates();
QWindowSystemInterfacePrivate::WindowStateChangedEvent *e = QWindowSystemInterfacePrivate::WindowStateChangedEvent *e =
new QWindowSystemInterfacePrivate::WindowStateChangedEvent(window, newState, Qt::WindowStates(oldState)); new QWindowSystemInterfacePrivate::WindowStateChangedEvent(window, newState, Qt::WindowStates(oldState));

View File

@ -5489,6 +5489,8 @@ static inline void alphamapblend_argb32(quint32 *dst, int coverage, QRgba64 srcL
// nothing // nothing
} else if (coverage == 255) { } else if (coverage == 255) {
*dst = src; *dst = src;
} else if (!colorProfile) {
*dst = INTERPOLATE_PIXEL_255(src, coverage, *dst, 255 - coverage);
} else { } else {
if (*dst >= 0xff000000) { if (*dst >= 0xff000000) {
grayBlendPixel(dst, coverage, srcLinear, colorProfile); grayBlendPixel(dst, coverage, srcLinear, colorProfile);

View File

@ -2341,8 +2341,12 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe
if (s->matrix.type() > QTransform::TxTranslate || stretch_sr) { if (s->matrix.type() > QTransform::TxTranslate || stretch_sr) {
QRectF targetBounds = s->matrix.mapRect(r); QRectF targetBounds = s->matrix.mapRect(r);
bool exceedsPrecision = targetBounds.width() > 0x7fff bool exceedsPrecision = r.width() > 0x7fff
|| targetBounds.height() > 0x7fff; || r.height() > 0x7fff
|| targetBounds.width() > 0x7fff
|| targetBounds.height() > 0x7fff
|| s->matrix.m11() >= 512
|| s->matrix.m22() >= 512;
if (!exceedsPrecision && d->canUseFastImageBlending(d->rasterBuffer->compositionMode, img)) { if (!exceedsPrecision && d->canUseFastImageBlending(d->rasterBuffer->compositionMode, img)) {
if (s->matrix.type() > QTransform::TxScale) { if (s->matrix.type() > QTransform::TxScale) {
@ -4639,9 +4643,13 @@ void QSpanData::setupMatrix(const QTransform &matrix, int bilin)
bilinear = bilin; bilinear = bilin;
const bool affine = inv.isAffine(); const bool affine = inv.isAffine();
const qreal f1 = m11 * m11 + m21 * m21;
const qreal f2 = m12 * m12 + m22 * m22;
fast_matrix = affine fast_matrix = affine
&& m11 * m11 + m21 * m21 < 1e4 && f1 < 1e4
&& m12 * m12 + m22 * m22 < 1e4 && f2 < 1e4
&& f1 > (1.0 / 65536)
&& f2 > (1.0 / 65536)
&& qAbs(dx) < 1e4 && qAbs(dx) < 1e4
&& qAbs(dy) < 1e4; && qAbs(dy) < 1e4;

View File

@ -876,12 +876,12 @@ void QSslConfiguration::setDiffieHellmanParameters(const QSslDiffieHellmanParame
Returns the backend-specific configuration. Returns the backend-specific configuration.
Only options set by addBackendConfig() or setBackendConfig() will be Only options set by addBackendConfiguration() or setBackendConfiguration() will be
returned. The internal standard configuration of the backend is not reported. returned. The internal standard configuration of the backend is not reported.
\sa setBackendConfigOption(), setBackendConfig() \sa setBackendConfigurationOption(), setBackendConfiguration()
*/ */
QMap<QByteArray, QVariant> QSslConfiguration::backendConfig() const QMap<QByteArray, QVariant> QSslConfiguration::backendConfiguration() const
{ {
return d->backendConfig; return d->backendConfig;
} }
@ -902,9 +902,9 @@ QMap<QByteArray, QVariant> QSslConfiguration::backendConfig() const
configuration. Using the backend-specific configuration to set a general configuration. Using the backend-specific configuration to set a general
configuration option again will overwrite the general configuration option. configuration option again will overwrite the general configuration option.
\sa backendConfig(), setBackendConfig() \sa backendConfiguration(), setBackendConfiguration()
*/ */
void QSslConfiguration::setBackendConfigOption(const QByteArray &name, const QVariant &value) void QSslConfiguration::setBackendConfigurationOption(const QByteArray &name, const QVariant &value)
{ {
d->backendConfig[name] = value; d->backendConfig[name] = value;
} }
@ -914,13 +914,13 @@ void QSslConfiguration::setBackendConfigOption(const QByteArray &name, const QVa
Sets or clears the backend-specific configuration. Sets or clears the backend-specific configuration.
Without a \a backendConfig parameter this function will clear the Without a \a backendConfiguration parameter this function will clear the
backend-specific configuration. More information about the supported backend-specific configuration. More information about the supported
options is available in the documentation of addBackendConfig(). options is available in the documentation of addBackendConfiguration().
\sa backendConfig(), setBackendConfigOption() \sa backendConfiguration(), setBackendConfigurationOption()
*/ */
void QSslConfiguration::setBackendConfig(const QMap<QByteArray, QVariant> &backendConfig) void QSslConfiguration::setBackendConfiguration(const QMap<QByteArray, QVariant> &backendConfig)
{ {
d->backendConfig = backendConfig; d->backendConfig = backendConfig;
} }

View File

@ -150,9 +150,9 @@ public:
QSslDiffieHellmanParameters diffieHellmanParameters() const; QSslDiffieHellmanParameters diffieHellmanParameters() const;
void setDiffieHellmanParameters(const QSslDiffieHellmanParameters &dhparams); void setDiffieHellmanParameters(const QSslDiffieHellmanParameters &dhparams);
QMap<QByteArray, QVariant> backendConfig() const; QMap<QByteArray, QVariant> backendConfiguration() const;
void setBackendConfigOption(const QByteArray &name, const QVariant &value); void setBackendConfigurationOption(const QByteArray &name, const QVariant &value);
void setBackendConfig(const QMap<QByteArray, QVariant> &backendConfig = QMap<QByteArray, QVariant>()); void setBackendConfiguration(const QMap<QByteArray, QVariant> &backendConfig = QMap<QByteArray, QVariant>());
static QSslConfiguration defaultConfiguration(); static QSslConfiguration defaultConfiguration();
static void setDefaultConfiguration(const QSslConfiguration &configuration); static void setDefaultConfiguration(const QSslConfiguration &configuration);

View File

@ -245,7 +245,7 @@ QString QSslContext::errorString() const
// static // static
void QSslContext::applyBackendConfig(QSslContext *sslContext) void QSslContext::applyBackendConfig(QSslContext *sslContext)
{ {
if (sslContext->sslConfiguration.backendConfig().isEmpty()) if (sslContext->sslConfiguration.backendConfiguration().isEmpty())
return; return;
#if OPENSSL_VERSION_NUMBER >= 0x10002000L #if OPENSSL_VERSION_NUMBER >= 0x10002000L
@ -255,7 +255,7 @@ void QSslContext::applyBackendConfig(QSslContext *sslContext)
q_SSL_CONF_CTX_set_ssl_ctx(cctx.data(), sslContext->ctx); q_SSL_CONF_CTX_set_ssl_ctx(cctx.data(), sslContext->ctx);
q_SSL_CONF_CTX_set_flags(cctx.data(), SSL_CONF_FLAG_FILE); q_SSL_CONF_CTX_set_flags(cctx.data(), SSL_CONF_FLAG_FILE);
const auto &backendConfig = sslContext->sslConfiguration.backendConfig(); const auto &backendConfig = sslContext->sslConfiguration.backendConfiguration();
for (auto i = backendConfig.constBegin(); i != backendConfig.constEnd(); ++i) { for (auto i = backendConfig.constBegin(); i != backendConfig.constEnd(); ++i) {
if (!i.value().canConvert(QMetaType::QByteArray)) { if (!i.value().canConvert(QMetaType::QByteArray)) {
sslContext->errorCode = QSslError::UnspecifiedError; sslContext->errorCode = QSslError::UnspecifiedError;

View File

@ -922,7 +922,7 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
d->configuration.peerVerifyDepth = configuration.peerVerifyDepth(); d->configuration.peerVerifyDepth = configuration.peerVerifyDepth();
d->configuration.peerVerifyMode = configuration.peerVerifyMode(); d->configuration.peerVerifyMode = configuration.peerVerifyMode();
d->configuration.protocol = configuration.protocol(); d->configuration.protocol = configuration.protocol();
d->configuration.backendConfig = configuration.backendConfig(); d->configuration.backendConfig = configuration.backendConfiguration();
d->configuration.sslOptions = configuration.d->sslOptions; d->configuration.sslOptions = configuration.d->sslOptions;
d->configuration.sslSession = configuration.sessionTicket(); d->configuration.sslSession = configuration.sessionTicket();
d->configuration.sslSessionTicketLifeTimeHint = configuration.sessionTicketLifeTimeHint(); d->configuration.sslSessionTicketLifeTimeHint = configuration.sessionTicketLifeTimeHint();

View File

@ -134,6 +134,7 @@ messageDebugEntries[] = {
{WM_XBUTTONUP, "WM_XBUTTONUP", true}, {WM_XBUTTONUP, "WM_XBUTTONUP", true},
{WM_XBUTTONDBLCLK, "WM_XBUTTONDBLCLK", true}, {WM_XBUTTONDBLCLK, "WM_XBUTTONDBLCLK", true},
{WM_MOUSEHWHEEL, "WM_MOUSEHWHEEL", true}, {WM_MOUSEHWHEEL, "WM_MOUSEHWHEEL", true},
{WM_GETOBJECT, "WM_GETOBJECT", true},
{WM_IME_SETCONTEXT, "WM_IME_SETCONTEXT", true}, {WM_IME_SETCONTEXT, "WM_IME_SETCONTEXT", true},
{WM_INPUTLANGCHANGE, "WM_INPUTLANGCHANGE", true}, {WM_INPUTLANGCHANGE, "WM_INPUTLANGCHANGE", true},
{WM_IME_NOTIFY, "WM_IME_NOTIFY", true}, {WM_IME_NOTIFY, "WM_IME_NOTIFY", true},
@ -162,6 +163,7 @@ messageDebugEntries[] = {
{WM_GETMINMAXINFO, "WM_GETMINMAXINFO", true}, {WM_GETMINMAXINFO, "WM_GETMINMAXINFO", true},
{WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING", true}, {WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING", true},
{WM_NCCREATE, "WM_NCCREATE", true}, {WM_NCCREATE, "WM_NCCREATE", true},
{WM_NCDESTROY, "WM_NCDESTROY", true},
{WM_NCCALCSIZE, "WM_NCCALCSIZE", true}, {WM_NCCALCSIZE, "WM_NCCALCSIZE", true},
{WM_NCACTIVATE, "WM_NCACTIVATE", true}, {WM_NCACTIVATE, "WM_NCACTIVATE", true},
{WM_NCMOUSEMOVE, "WM_NCMOUSEMOVE", true}, {WM_NCMOUSEMOVE, "WM_NCMOUSEMOVE", true},
@ -180,7 +182,9 @@ messageDebugEntries[] = {
{WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN", true}, {WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN", true},
{WM_DISPLAYCHANGE, "WM_DISPLAYCHANGE", true}, {WM_DISPLAYCHANGE, "WM_DISPLAYCHANGE", true},
{WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD", true}, {WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD", true},
{WM_THEMECHANGED, "WM_THEMECHANGED", true} {WM_THEMECHANGED, "WM_THEMECHANGED", true},
{0x90, "WM_UAHDESTROYWINDOW", true},
{0x272, "WM_UNREGISTER_WINDOW_SERVICES", true}
}; };
static inline const MessageDebugEntry *messageDebugEntry(UINT msg) static inline const MessageDebugEntry *messageDebugEntry(UINT msg)

View File

@ -507,6 +507,8 @@ static void addExtraFallbacks(QStringList *fallbackList)
// add Apple Symbols to cover those too. // add Apple Symbols to cover those too.
if (!fallbackList->contains(QStringLiteral("Apple Symbols"))) if (!fallbackList->contains(QStringLiteral("Apple Symbols")))
fallbackList->append(QStringLiteral("Apple Symbols")); fallbackList->append(QStringLiteral("Apple Symbols"));
#else
Q_UNUSED(fallbackList)
#endif #endif
} }

View File

@ -1364,9 +1364,10 @@ extern "C" LRESULT QT_WIN_CALLBACK qWindowsWndProc(HWND hwnd, UINT message, WPAR
const bool handled = QWindowsContext::instance()->windowsProc(hwnd, message, et, wParam, lParam, &result, &platformWindow); const bool handled = QWindowsContext::instance()->windowsProc(hwnd, message, et, wParam, lParam, &result, &platformWindow);
if (QWindowsContext::verbose > 1 && lcQpaEvents().isDebugEnabled()) { if (QWindowsContext::verbose > 1 && lcQpaEvents().isDebugEnabled()) {
if (const char *eventName = QWindowsGuiEventDispatcher::windowsMessageName(message)) { if (const char *eventName = QWindowsGuiEventDispatcher::windowsMessageName(message)) {
qCDebug(lcQpaEvents) << "EVENT: hwd=" << hwnd << eventName << hex << "msg=0x" << message qCDebug(lcQpaEvents).nospace() << "EVENT: hwd=" << hwnd << ' ' << eventName
<< "et=0x" << et << dec << "wp=" << int(wParam) << "at" << " msg=0x" << hex << message << " et=0x" << et << dec << " wp="
<< GET_X_LPARAM(lParam) << GET_Y_LPARAM(lParam) << "handled=" << handled; << int(wParam) << " at " << GET_X_LPARAM(lParam) << ','
<< GET_Y_LPARAM(lParam) << " handled=" << handled;
} }
} }
if (!handled) if (!handled)

View File

@ -1077,6 +1077,7 @@ QWindowCreationContext::QWindowCreationContext(const QWindow *w,
*/ */
const char *QWindowsWindow::embeddedNativeParentHandleProperty = "_q_embedded_native_parent_handle"; const char *QWindowsWindow::embeddedNativeParentHandleProperty = "_q_embedded_native_parent_handle";
const char *QWindowsWindow::hasBorderInFullScreenProperty = "_q_has_border_in_fullscreen";
QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data) : QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data) :
QWindowsBaseWindow(aWindow), QWindowsBaseWindow(aWindow),
@ -1106,7 +1107,6 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data)
updateDropSite(window()->isTopLevel()); updateDropSite(window()->isTopLevel());
registerTouchWindow(); registerTouchWindow();
setWindowState(aWindow->windowStates());
const qreal opacity = qt_window_private(aWindow)->opacity; const qreal opacity = qt_window_private(aWindow)->opacity;
if (!qFuzzyCompare(opacity, qreal(1.0))) if (!qFuzzyCompare(opacity, qreal(1.0)))
setOpacity(opacity); setOpacity(opacity);
@ -1115,6 +1115,8 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data)
if (aWindow->isTopLevel()) if (aWindow->isTopLevel())
setWindowIcon(aWindow->icon()); setWindowIcon(aWindow->icon());
if (aWindow->property(hasBorderInFullScreenProperty).toBool())
setFlag(HasBorderInFullScreen);
clearFlag(WithinCreate); clearFlag(WithinCreate);
} }
@ -1133,9 +1135,11 @@ void QWindowsWindow::initialize()
QWindowCreationContextPtr creationContext = QWindowCreationContextPtr creationContext =
QWindowsContext::instance()->setWindowCreationContext(QWindowCreationContextPtr()); QWindowsContext::instance()->setWindowCreationContext(QWindowCreationContextPtr());
QWindow *w = window();
setWindowState(w->windowStates());
// Trigger geometry change (unless it has a special state in which case setWindowState() // Trigger geometry change (unless it has a special state in which case setWindowState()
// will send the message) and screen change signals of QWindow. // will send the message) and screen change signals of QWindow.
QWindow *w = window();
if (w->type() != Qt::Desktop) { if (w->type() != Qt::Desktop) {
const Qt::WindowState state = w->windowState(); const Qt::WindowState state = w->windowState();
if (state != Qt::WindowMaximized && state != Qt::WindowFullScreen if (state != Qt::WindowMaximized && state != Qt::WindowFullScreen
@ -2662,15 +2666,26 @@ void QWindowsWindow::setHasBorderInFullScreenStatic(QWindow *window, bool border
if (QPlatformWindow *handle = window->handle()) if (QPlatformWindow *handle = window->handle())
static_cast<QWindowsWindow *>(handle)->setHasBorderInFullScreen(border); static_cast<QWindowsWindow *>(handle)->setHasBorderInFullScreen(border);
else else
qWarning("%s invoked without window handle; call has no effect.", Q_FUNC_INFO); window->setProperty(hasBorderInFullScreenProperty, QVariant(border));
} }
void QWindowsWindow::setHasBorderInFullScreen(bool border) void QWindowsWindow::setHasBorderInFullScreen(bool border)
{ {
if (testFlag(HasBorderInFullScreen) == border)
return;
if (border) if (border)
setFlag(HasBorderInFullScreen); setFlag(HasBorderInFullScreen);
else else
clearFlag(HasBorderInFullScreen); clearFlag(HasBorderInFullScreen);
// Directly apply the flag in case we are fullscreen.
if (m_windowState == Qt::WindowFullScreen) {
LONG_PTR style = GetWindowLongPtr(handle(), GWL_STYLE);
if (border)
style |= WS_BORDER;
else
style &= ~WS_BORDER;
SetWindowLongPtr(handle(), GWL_STYLE, style);
}
} }
QString QWindowsWindow::formatWindowTitle(const QString &title) QString QWindowsWindow::formatWindowTitle(const QString &title)

View File

@ -340,6 +340,7 @@ public:
static QString formatWindowTitle(const QString &title); static QString formatWindowTitle(const QString &title);
static const char *embeddedNativeParentHandleProperty; static const char *embeddedNativeParentHandleProperty;
static const char *hasBorderInFullScreenProperty;
private: private:
inline void show_sys() const; inline void show_sys() const;

View File

@ -74,7 +74,9 @@ class QXcbShmImage : public QXcbObject
{ {
public: public:
QXcbShmImage(QXcbScreen *connection, const QSize &size, uint depth, QImage::Format format); QXcbShmImage(QXcbScreen *connection, const QSize &size, uint depth, QImage::Format format);
~QXcbShmImage() { destroy(); } ~QXcbShmImage() { destroy(true); }
void resize(const QSize &size);
void flushScrolledRegion(bool clientSideScroll); void flushScrolledRegion(bool clientSideScroll);
@ -95,14 +97,18 @@ private:
void createShmSegment(size_t segmentSize); void createShmSegment(size_t segmentSize);
void destroyShmSegment(size_t segmentSize); void destroyShmSegment(size_t segmentSize);
void destroy(); void create(const QSize &size, const xcb_format_t *fmt, QImage::Format format);
void destroy(bool destroyShm);
void ensureGC(xcb_drawable_t dst); void ensureGC(xcb_drawable_t dst);
void shmPutImage(xcb_drawable_t drawable, const QRegion &region, const QPoint &offset = QPoint()); void shmPutImage(xcb_drawable_t drawable, const QRegion &region, const QPoint &offset = QPoint());
void flushPixmap(const QRegion &region, bool fullRegion = false); void flushPixmap(const QRegion &region, bool fullRegion = false);
void setClip(const QRegion &region); void setClip(const QRegion &region);
xcb_window_t m_screen_root;
xcb_shm_segment_info_t m_shm_info; xcb_shm_segment_info_t m_shm_info;
size_t m_segmentSize;
xcb_image_t *m_xcb_image; xcb_image_t *m_xcb_image;
@ -171,6 +177,8 @@ static inline size_t imageDataSize(const xcb_image_t *image)
QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QImage::Format format) QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QImage::Format format)
: QXcbObject(screen->connection()) : QXcbObject(screen->connection())
, m_screen_root(screen->screen()->root)
, m_segmentSize(0)
, m_graphics_buffer(nullptr) , m_graphics_buffer(nullptr)
, m_gc(0) , m_gc(0)
, m_gc_drawable(0) , m_gc_drawable(0)
@ -180,6 +188,27 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
const xcb_format_t *fmt = connection()->formatForDepth(depth); const xcb_format_t *fmt = connection()->formatForDepth(depth);
Q_ASSERT(fmt); Q_ASSERT(fmt);
m_hasAlpha = QImage::toPixelFormat(format).alphaUsage() == QPixelFormat::UsesAlpha;
if (!m_hasAlpha)
format = qt_maybeAlphaVersionWithSameDepth(format);
memset(&m_shm_info, 0, sizeof m_shm_info);
create(size, fmt, format);
}
void QXcbShmImage::resize(const QSize &size)
{
xcb_format_t fmt;
fmt.depth = m_xcb_image->depth;
fmt.bits_per_pixel = m_xcb_image->bpp;
fmt.scanline_pad = m_xcb_image->scanline_pad;
memset(fmt.pad0, 0, sizeof(fmt.pad0));
destroy(false);
create(size, &fmt, m_qimage.format());
}
void QXcbShmImage::create(const QSize &size, const xcb_format_t *fmt, QImage::Format format)
{
m_xcb_image = xcb_image_create(size.width(), size.height(), m_xcb_image = xcb_image_create(size.width(), size.height(),
XCB_IMAGE_FORMAT_Z_PIXMAP, XCB_IMAGE_FORMAT_Z_PIXMAP,
fmt->scanline_pad, fmt->scanline_pad,
@ -192,14 +221,16 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
if (!segmentSize) if (!segmentSize)
return; return;
if (hasShm() && m_segmentSize > 0 && (m_segmentSize < segmentSize || m_segmentSize / 2 >= segmentSize))
destroyShmSegment(m_segmentSize);
if (!hasShm() && connection()->hasShm())
{
qCDebug(lcQpaXcb) << "creating shared memory" << segmentSize << "for" << size << "depth" << fmt->depth << "bits" << fmt->bits_per_pixel;
createShmSegment(segmentSize); createShmSegment(segmentSize);
}
m_xcb_image->data = m_shm_info.shmaddr ? m_shm_info.shmaddr : (uint8_t *)malloc(segmentSize); m_xcb_image->data = m_shm_info.shmaddr ? m_shm_info.shmaddr : (uint8_t *)malloc(segmentSize);
m_hasAlpha = QImage::toPixelFormat(format).alphaUsage() == QPixelFormat::UsesAlpha;
if (!m_hasAlpha)
format = qt_maybeAlphaVersionWithSameDepth(format);
m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, format); m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, format);
m_graphics_buffer = new QXcbShmGraphicsBuffer(&m_qimage); m_graphics_buffer = new QXcbShmGraphicsBuffer(&m_qimage);
@ -207,10 +238,36 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
xcb_create_pixmap(xcb_connection(), xcb_create_pixmap(xcb_connection(),
m_xcb_image->depth, m_xcb_image->depth,
m_xcb_pixmap, m_xcb_pixmap,
screen->screen()->root, m_screen_root,
m_xcb_image->width, m_xcb_image->height); m_xcb_image->width, m_xcb_image->height);
} }
void QXcbShmImage::destroy(bool destroyShm)
{
if (m_xcb_image->data) {
if (m_shm_info.shmaddr) {
if (destroyShm)
destroyShmSegment(m_segmentSize);
} else {
free(m_xcb_image->data);
}
}
xcb_image_destroy(m_xcb_image);
if (m_gc) {
xcb_free_gc(xcb_connection(), m_gc);
m_gc = 0;
}
m_gc_drawable = 0;
delete m_graphics_buffer;
m_graphics_buffer = nullptr;
xcb_free_pixmap(xcb_connection(), m_xcb_pixmap);
m_xcb_pixmap = 0;
}
void QXcbShmImage::flushScrolledRegion(bool clientSideScroll) void QXcbShmImage::flushScrolledRegion(bool clientSideScroll)
{ {
if (m_clientSideScroll == clientSideScroll) if (m_clientSideScroll == clientSideScroll)
@ -261,10 +318,8 @@ void QXcbShmImage::flushScrolledRegion(bool clientSideScroll)
void QXcbShmImage::createShmSegment(size_t segmentSize) void QXcbShmImage::createShmSegment(size_t segmentSize)
{ {
m_shm_info.shmaddr = nullptr; Q_ASSERT(connection()->hasShm());
Q_ASSERT(m_segmentSize == 0);
if (!connection()->hasShm())
return;
#ifdef XCB_USE_SHM_FD #ifdef XCB_USE_SHM_FD
if (connection()->hasShmFd()) { if (connection()->hasShmFd()) {
@ -302,6 +357,8 @@ void QXcbShmImage::createShmSegment(size_t segmentSize)
close(fds[0]); close(fds[0]);
m_shm_info.shmseg = seg; m_shm_info.shmseg = seg;
m_shm_info.shmaddr = static_cast<quint8 *>(addr); m_shm_info.shmaddr = static_cast<quint8 *>(addr);
m_segmentSize = segmentSize;
} else } else
#endif #endif
{ {
@ -338,6 +395,8 @@ void QXcbShmImage::createShmSegment(size_t segmentSize)
m_shm_info.shmseg = seg; m_shm_info.shmseg = seg;
m_shm_info.shmid = id; // unused m_shm_info.shmid = id; // unused
m_shm_info.shmaddr = static_cast<quint8 *>(addr); m_shm_info.shmaddr = static_cast<quint8 *>(addr);
m_segmentSize = segmentSize;
} }
} }
@ -350,6 +409,7 @@ void QXcbShmImage::destroyShmSegment(size_t segmentSize)
xcb_generic_error_t *error = xcb_request_check(xcb_connection(), cookie); xcb_generic_error_t *error = xcb_request_check(xcb_connection(), cookie);
if (error) if (error)
connection()->printXcbError("QXcbShmImage: xcb_shm_detach() failed with error", error); connection()->printXcbError("QXcbShmImage: xcb_shm_detach() failed with error", error);
m_shm_info.shmseg = 0;
#ifdef XCB_USE_SHM_FD #ifdef XCB_USE_SHM_FD
if (connection()->hasShmFd()) { if (connection()->hasShmFd()) {
@ -364,7 +424,11 @@ void QXcbShmImage::destroyShmSegment(size_t segmentSize)
qWarning("QXcbShmImage: shmdt() failed (%d: %s) for %p", qWarning("QXcbShmImage: shmdt() failed (%d: %s) for %p",
errno, strerror(errno), m_shm_info.shmaddr); errno, strerror(errno), m_shm_info.shmaddr);
} }
m_shm_info.shmid = 0; // unused
} }
m_shm_info.shmaddr = nullptr;
m_segmentSize = 0;
} }
extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset); extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
@ -413,26 +477,6 @@ bool QXcbShmImage::scroll(const QRegion &area, int dx, int dy)
return true; return true;
} }
void QXcbShmImage::destroy()
{
if (m_xcb_image->data) {
if (m_shm_info.shmaddr)
destroyShmSegment(imageDataSize(m_xcb_image));
else
free(m_xcb_image->data);
}
xcb_image_destroy(m_xcb_image);
if (m_gc)
xcb_free_gc(xcb_connection(), m_gc);
delete m_graphics_buffer;
m_graphics_buffer = nullptr;
xcb_free_pixmap(xcb_connection(), m_xcb_pixmap);
m_xcb_pixmap = 0;
}
void QXcbShmImage::ensureGC(xcb_drawable_t dst) void QXcbShmImage::ensureGC(xcb_drawable_t dst)
{ {
if (m_gc_drawable != dst) { if (m_gc_drawable != dst) {
@ -805,7 +849,6 @@ void QXcbBackingStore::resize(const QSize &size, const QRegion &)
if (m_image && size == m_image->size()) if (m_image && size == m_image->size())
return; return;
QXcbScreen *screen = static_cast<QXcbScreen *>(window()->screen()->handle());
QPlatformWindow *pw = window()->handle(); QPlatformWindow *pw = window()->handle();
if (!pw) { if (!pw) {
window()->create(); window()->create();
@ -813,8 +856,13 @@ void QXcbBackingStore::resize(const QSize &size, const QRegion &)
} }
QXcbWindow* win = static_cast<QXcbWindow *>(pw); QXcbWindow* win = static_cast<QXcbWindow *>(pw);
delete m_image; if (m_image) {
m_image->resize(size);
} else {
QXcbScreen *screen = static_cast<QXcbScreen *>(window()->screen()->handle());
m_image = new QXcbShmImage(screen, size, win->depth(), win->imageFormat()); m_image = new QXcbShmImage(screen, size, win->depth(), win->imageFormat());
}
// Slow path for bgr888 VNC: Create an additional image, paint into that and // Slow path for bgr888 VNC: Create an additional image, paint into that and
// swap R and B while copying to m_image after each paint. // swap R and B while copying to m_image after each paint.
if (win->imageNeedsRgbSwap()) { if (win->imageNeedsRgbSwap()) {

View File

@ -95,41 +95,25 @@ QFlatpakTheme::QFlatpakTheme()
QPlatformMenuItem* QFlatpakTheme::createPlatformMenuItem() const QPlatformMenuItem* QFlatpakTheme::createPlatformMenuItem() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->createPlatformMenuItem(); return d->baseTheme->createPlatformMenuItem();
return QPlatformTheme::createPlatformMenuItem();
} }
QPlatformMenu* QFlatpakTheme::createPlatformMenu() const QPlatformMenu* QFlatpakTheme::createPlatformMenu() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->createPlatformMenu(); return d->baseTheme->createPlatformMenu();
return QPlatformTheme::createPlatformMenu();
} }
QPlatformMenuBar* QFlatpakTheme::createPlatformMenuBar() const QPlatformMenuBar* QFlatpakTheme::createPlatformMenuBar() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->createPlatformMenuBar(); return d->baseTheme->createPlatformMenuBar();
return QFlatpakTheme::createPlatformMenuBar();
} }
void QFlatpakTheme::showPlatformMenuBar() void QFlatpakTheme::showPlatformMenuBar()
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->showPlatformMenuBar(); return d->baseTheme->showPlatformMenuBar();
return QFlatpakTheme::showPlatformMenuBar();
} }
bool QFlatpakTheme::usePlatformNativeDialog(DialogType type) const bool QFlatpakTheme::usePlatformNativeDialog(DialogType type) const
@ -139,10 +123,7 @@ bool QFlatpakTheme::usePlatformNativeDialog(DialogType type) const
if (type == FileDialog) if (type == FileDialog)
return true; return true;
if (d->baseTheme)
return d->baseTheme->usePlatformNativeDialog(type); return d->baseTheme->usePlatformNativeDialog(type);
return QFlatpakTheme::usePlatformNativeDialog(type);
} }
QPlatformDialogHelper* QFlatpakTheme::createPlatformDialogHelper(DialogType type) const QPlatformDialogHelper* QFlatpakTheme::createPlatformDialogHelper(DialogType type) const
@ -152,103 +133,64 @@ QPlatformDialogHelper* QFlatpakTheme::createPlatformDialogHelper(DialogType type
if (type == FileDialog) if (type == FileDialog)
return new QFlatpakFileDialog; return new QFlatpakFileDialog;
if (d->baseTheme)
return d->baseTheme->createPlatformDialogHelper(type); return d->baseTheme->createPlatformDialogHelper(type);
return QFlatpakTheme::createPlatformDialogHelper(type);
} }
#ifndef QT_NO_SYSTEMTRAYICON #ifndef QT_NO_SYSTEMTRAYICON
QPlatformSystemTrayIcon* QFlatpakTheme::createPlatformSystemTrayIcon() const QPlatformSystemTrayIcon* QFlatpakTheme::createPlatformSystemTrayIcon() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->createPlatformSystemTrayIcon(); return d->baseTheme->createPlatformSystemTrayIcon();
return QPlatformTheme::createPlatformSystemTrayIcon();
} }
#endif #endif
const QPalette *QFlatpakTheme::palette(Palette type) const const QPalette *QFlatpakTheme::palette(Palette type) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->palette(type); return d->baseTheme->palette(type);
return QPlatformTheme::palette(type);
} }
const QFont* QFlatpakTheme::font(Font type) const const QFont* QFlatpakTheme::font(Font type) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->font(type); return d->baseTheme->font(type);
return QPlatformTheme::font(type);
} }
QVariant QFlatpakTheme::themeHint(ThemeHint hint) const QVariant QFlatpakTheme::themeHint(ThemeHint hint) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->themeHint(hint); return d->baseTheme->themeHint(hint);
return QPlatformTheme::themeHint(hint);
} }
QPixmap QFlatpakTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const QPixmap QFlatpakTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->standardPixmap(sp, size); return d->baseTheme->standardPixmap(sp, size);
return QPlatformTheme::standardPixmap(sp, size);
} }
QIcon QFlatpakTheme::fileIcon(const QFileInfo &fileInfo, QIcon QFlatpakTheme::fileIcon(const QFileInfo &fileInfo,
QPlatformTheme::IconOptions iconOptions) const QPlatformTheme::IconOptions iconOptions) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->fileIcon(fileInfo, iconOptions); return d->baseTheme->fileIcon(fileInfo, iconOptions);
return QPlatformTheme::fileIcon(fileInfo, iconOptions);
} }
QIconEngine * QFlatpakTheme::createIconEngine(const QString &iconName) const QIconEngine * QFlatpakTheme::createIconEngine(const QString &iconName) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->createIconEngine(iconName); return d->baseTheme->createIconEngine(iconName);
return QPlatformTheme::createIconEngine(iconName);
} }
QList<QKeySequence> QFlatpakTheme::keyBindings(QKeySequence::StandardKey key) const QList<QKeySequence> QFlatpakTheme::keyBindings(QKeySequence::StandardKey key) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->keyBindings(key); return d->baseTheme->keyBindings(key);
return QPlatformTheme::keyBindings(key);
} }
QString QFlatpakTheme::standardButtonText(int button) const QString QFlatpakTheme::standardButtonText(int button) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QFlatpakTheme);
if (d->baseTheme)
return d->baseTheme->standardButtonText(button); return d->baseTheme->standardButtonText(button);
return QPlatformTheme::standardButtonText(button);
} }
QT_END_NAMESPACE QT_END_NAMESPACE

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -1175,9 +1175,10 @@ bool QHeaderView::sectionsMovable() const
*/ */
/*! /*!
\since 5.10 \property QHeaderView::firstSectionMovable
\brief Whether the first column can be moved by the user
If \a movable is true, the first column can be moved by the user. This property controls whether the first column can be moved by the user.
In a QTreeView, the first column holds the tree structure and is In a QTreeView, the first column holds the tree structure and is
therefore non-movable by default, even after setSectionsMovable(true). therefore non-movable by default, even after setSectionsMovable(true).
@ -1186,8 +1187,11 @@ bool QHeaderView::sectionsMovable() const
In such a scenario, it is recommended to call QTreeView::setRootIsDecorated(false) In such a scenario, it is recommended to call QTreeView::setRootIsDecorated(false)
as well. as well.
This method has no effect unless setSectionsMovable(true) is called as well. Setting it to true has no effect unless setSectionsMovable(true) is called
as well.
\sa setSectionsMovable() \sa setSectionsMovable()
\since 5.11
*/ */
void QHeaderView::setFirstSectionMovable(bool movable) void QHeaderView::setFirstSectionMovable(bool movable)
{ {
@ -1195,13 +1199,7 @@ void QHeaderView::setFirstSectionMovable(bool movable)
d->allowUserMoveOfSection0 = movable; d->allowUserMoveOfSection0 = movable;
} }
/*! bool QHeaderView::isFirstSectionMovable() const
\since 5.10
Returns \c true if the first column can be moved by the user,
when this header is used in a QTreeView.
*/
bool QHeaderView::firstSectionMovable() const
{ {
Q_D(const QHeaderView); Q_D(const QHeaderView);
return d->allowUserMoveOfSection0; return d->allowUserMoveOfSection0;

View File

@ -53,6 +53,7 @@ class QStyleOptionHeader;
class Q_WIDGETS_EXPORT QHeaderView : public QAbstractItemView class Q_WIDGETS_EXPORT QHeaderView : public QAbstractItemView
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(bool firstSectionMovable READ isFirstSectionMovable WRITE setFirstSectionMovable)
Q_PROPERTY(bool showSortIndicator READ isSortIndicatorShown WRITE setSortIndicatorShown) Q_PROPERTY(bool showSortIndicator READ isSortIndicatorShown WRITE setSortIndicatorShown)
Q_PROPERTY(bool highlightSections READ highlightSections WRITE setHighlightSections) Q_PROPERTY(bool highlightSections READ highlightSections WRITE setHighlightSections)
Q_PROPERTY(bool stretchLastSection READ stretchLastSection WRITE setStretchLastSection) Q_PROPERTY(bool stretchLastSection READ stretchLastSection WRITE setStretchLastSection)
@ -119,7 +120,7 @@ public:
inline QT_DEPRECATED bool isMovable() const { return sectionsMovable(); } inline QT_DEPRECATED bool isMovable() const { return sectionsMovable(); }
#endif #endif
void setFirstSectionMovable(bool movable); void setFirstSectionMovable(bool movable);
bool firstSectionMovable() const; bool isFirstSectionMovable() const;
void setSectionsClickable(bool clickable); void setSectionsClickable(bool clickable);
bool sectionsClickable() const; bool sectionsClickable() const;

View File

@ -113,8 +113,10 @@
static void initResources() static void initResources()
{ {
Q_INIT_RESOURCE(qstyle); Q_INIT_RESOURCE(qstyle);
Q_INIT_RESOURCE(qmessagebox);
#if QT_CONFIG(messagebox)
Q_INIT_RESOURCE(qmessagebox);
#endif
} }
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE

View File

@ -5457,11 +5457,11 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), rgn.translated(offset)); setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), rgn.translated(offset));
QPainter p(pdev); QPainter p(pdev);
p.translate(offset); p.translate(offset);
context.painter = context.sharedPainter = &p; context.painter = &p;
graphicsEffect->draw(&p); graphicsEffect->draw(&p);
setSystemClip(pdev->paintEngine(), 1, QRegion()); setSystemClip(pdev->paintEngine(), 1, QRegion());
} else { } else {
context.painter = context.sharedPainter = sharedPainter; context.painter = sharedPainter;
if (sharedPainter->worldTransform() != sourced->lastEffectTransform) { if (sharedPainter->worldTransform() != sourced->lastEffectTransform) {
sourced->invalidateCache(); sourced->invalidateCache();
sourced->lastEffectTransform = sharedPainter->worldTransform(); sourced->lastEffectTransform = sharedPainter->worldTransform();

View File

@ -1384,16 +1384,22 @@ void tst_QDir::absoluteFilePath_data()
QTest::addColumn<QString>("fileName"); QTest::addColumn<QString>("fileName");
QTest::addColumn<QString>("expectedFilePath"); QTest::addColumn<QString>("expectedFilePath");
QTest::newRow("0") << "/etc" << "/passwd" << "/passwd";
QTest::newRow("1") << "/etc" << "passwd" << "/etc/passwd";
QTest::newRow("2") << "/" << "passwd" << "/passwd";
QTest::newRow("3") << "relative" << "path" << QDir::currentPath() + "/relative/path";
QTest::newRow("4") << "" << "" << QDir::currentPath();
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
QTest::newRow("5") << "//machine" << "share" << "//machine/share"; QTest::newRow("UNC") << "//machine" << "share" << "//machine/share";
QTest::newRow("Drive") << "c:/side/town" << "/my/way/home" << "c:/my/way/home";
#define DRIVE "Q:"
#else
#define DRIVE
#endif #endif
QTest::newRow("0") << DRIVE "/etc" << "/passwd" << DRIVE "/passwd";
QTest::newRow("1") << DRIVE "/etc" << "passwd" << DRIVE "/etc/passwd";
QTest::newRow("2") << DRIVE "/" << "passwd" << DRIVE "/passwd";
QTest::newRow("3") << "relative" << "path" << QDir::currentPath() + "/relative/path";
QTest::newRow("4") << "" << "" << QDir::currentPath();
QTest::newRow("resource") << ":/prefix" << "foo.bar" << ":/prefix/foo.bar"; QTest::newRow("resource") << ":/prefix" << "foo.bar" << ":/prefix/foo.bar";
#undef DRIVE
} }
void tst_QDir::absoluteFilePath() void tst_QDir::absoluteFilePath()

View File

@ -528,8 +528,16 @@ void tst_QPixmap::fill_transparent()
QVERIFY(pixmap.hasAlphaChannel()); QVERIFY(pixmap.hasAlphaChannel());
} }
static bool isPlatformWayland()
{
return QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive);
}
void tst_QPixmap::mask() void tst_QPixmap::mask()
{ {
if (isPlatformWayland())
QSKIP("Wayland: This fails. See QTBUG-66983.");
QPixmap pm(100, 100); QPixmap pm(100, 100);
QBitmap bm(100, 100); QBitmap bm(100, 100);
@ -792,6 +800,9 @@ void tst_QPixmap::convertFromImageNoDetach()
void tst_QPixmap::convertFromImageNoDetach2() void tst_QPixmap::convertFromImageNoDetach2()
{ {
if (isPlatformWayland())
QSKIP("Wayland: This fails. See QTBUG-66984.");
QPixmap randomPixmap(10, 10); QPixmap randomPixmap(10, 10);
if (randomPixmap.handle()->classId() != QPlatformPixmap::RasterClass) if (randomPixmap.handle()->classId() != QPlatformPixmap::RasterClass)
QSKIP("Test only valid for raster pixmaps"); QSKIP("Test only valid for raster pixmaps");
@ -1466,6 +1477,9 @@ void tst_QPixmap::fromImageReaderAnimatedGif()
void tst_QPixmap::task_246446() void tst_QPixmap::task_246446()
{ {
if (isPlatformWayland())
QSKIP("Wayland: This fails. See QTBUG-66985.");
// This crashed without the bugfix in 246446 // This crashed without the bugfix in 246446
QPixmap pm(10, 10); QPixmap pm(10, 10);
pm.fill(Qt::transparent); // force 32-bit depth pm.fill(Qt::transparent); // force 32-bit depth

View File

@ -35,9 +35,12 @@
#include <QtGui/QFont> #include <QtGui/QFont>
#include <QtGui/QPalette> #include <QtGui/QPalette>
#include <QtGui/QStyleHints> #include <QtGui/QStyleHints>
#include <qpa/qplatformintegration.h>
#include <qpa/qwindowsysteminterface.h> #include <qpa/qwindowsysteminterface.h>
#include <qgenericplugin.h> #include <qgenericplugin.h>
#include <private/qguiapplication_p.h>
#if defined(Q_OS_QNX) #if defined(Q_OS_QNX)
#include <QOpenGLContext> #include <QOpenGLContext>
#endif #endif
@ -203,8 +206,8 @@ void tst_QGuiApplication::focusObject()
int argc = 0; int argc = 0;
QGuiApplication app(argc, 0); QGuiApplication app(argc, 0);
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive)) if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
QSKIP("Wayland: This fails. Figure out why."); QSKIP("QWindow::requestActivate() is not supported.");
QObject obj1, obj2, obj3; QObject obj1, obj2, obj3;
const QRect screenGeometry = QGuiApplication::primaryScreen()->availableVirtualGeometry(); const QRect screenGeometry = QGuiApplication::primaryScreen()->availableVirtualGeometry();
@ -374,8 +377,8 @@ void tst_QGuiApplication::changeFocusWindow()
int argc = 0; int argc = 0;
QGuiApplication app(argc, 0); QGuiApplication app(argc, 0);
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive)) if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
QSKIP("Wayland: This fails. Figure out why."); QSKIP("QWindow::requestActivate() is not supported.");
const QRect screenGeometry = QGuiApplication::primaryScreen()->availableVirtualGeometry(); const QRect screenGeometry = QGuiApplication::primaryScreen()->availableVirtualGeometry();

View File

@ -186,8 +186,8 @@ void tst_qinputmethod::cursorRectangle()
{ {
QCOMPARE(qApp->inputMethod()->cursorRectangle(), QRectF()); QCOMPARE(qApp->inputMethod()->cursorRectangle(), QRectF());
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive)) if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
QSKIP("Wayland: This fails. Figure out why."); QSKIP("QWindow::requestActivate() is not supported.");
DummyWindow window; DummyWindow window;
window.show(); window.show();
@ -284,8 +284,8 @@ void tst_qinputmethod::inputDirection()
void tst_qinputmethod::inputMethodAccepted() void tst_qinputmethod::inputMethodAccepted()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive)) if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
QSKIP("Wayland: This fails. Figure out why."); QSKIP("QWindow::requestActivate() is not supported.");
if (!QGuiApplication::platformName().compare(QLatin1String("minimal"), Qt::CaseInsensitive) if (!QGuiApplication::platformName().compare(QLatin1String("minimal"), Qt::CaseInsensitive)
|| !QGuiApplication::platformName().compare(QLatin1String("offscreen"), Qt::CaseInsensitive)) { || !QGuiApplication::platformName().compare(QLatin1String("offscreen"), Qt::CaseInsensitive)) {

View File

@ -317,9 +317,6 @@ void tst_QTouchEvent::touchDisabledByDefault()
void tst_QTouchEvent::touchEventAcceptedByDefault() void tst_QTouchEvent::touchEventAcceptedByDefault()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
// QWidget // QWidget
{ {
// enabling touch events should automatically accept touch events // enabling touch events should automatically accept touch events
@ -606,9 +603,6 @@ QPointF normalized(const QPointF &pos, const QRectF &rect)
void tst_QTouchEvent::basicRawEventTranslation() void tst_QTouchEvent::basicRawEventTranslation()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
tst_QTouchEventWidget touchWidget; tst_QTouchEventWidget touchWidget;
touchWidget.setWindowTitle(QTest::currentTestFunction()); touchWidget.setWindowTitle(QTest::currentTestFunction());
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
@ -733,9 +727,6 @@ void tst_QTouchEvent::basicRawEventTranslation()
void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen() void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
tst_QTouchEventWidget touchWidget; tst_QTouchEventWidget touchWidget;
touchWidget.setWindowTitle(QTest::currentTestFunction()); touchWidget.setWindowTitle(QTest::currentTestFunction());
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
@ -962,9 +953,6 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad() void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
tst_QTouchEventWidget touchWidget; tst_QTouchEventWidget touchWidget;
touchWidget.setWindowTitle(QTest::currentTestFunction()); touchWidget.setWindowTitle(QTest::currentTestFunction());
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
@ -1191,9 +1179,6 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
void tst_QTouchEvent::basicRawEventTranslationOfIds() void tst_QTouchEvent::basicRawEventTranslationOfIds()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
tst_QTouchEventWidget touchWidget; tst_QTouchEventWidget touchWidget;
touchWidget.setWindowTitle(QTest::currentTestFunction()); touchWidget.setWindowTitle(QTest::currentTestFunction());
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
@ -1311,9 +1296,6 @@ void tst_QTouchEvent::basicRawEventTranslationOfIds()
void tst_QTouchEvent::deleteInEventHandler() void tst_QTouchEvent::deleteInEventHandler()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
// QWidget // QWidget
{ {
QWidget window; QWidget window;
@ -1463,9 +1445,6 @@ void tst_QTouchEvent::deleteInEventHandler()
void tst_QTouchEvent::deleteInRawEventTranslation() void tst_QTouchEvent::deleteInRawEventTranslation()
{ {
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
tst_QTouchEventWidget touchWidget; tst_QTouchEventWidget touchWidget;
touchWidget.setWindowTitle(QTest::currentTestFunction()); touchWidget.setWindowTitle(QTest::currentTestFunction());
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);

View File

@ -4016,12 +4016,12 @@ void tst_QSslSocket::signatureAlgorithm()
SslServer server; SslServer server;
server.protocol = serverProtocol; server.protocol = serverProtocol;
server.config.setCiphers({QSslCipher("ECDHE-RSA-AES256-SHA")}); server.config.setCiphers({QSslCipher("ECDHE-RSA-AES256-SHA")});
server.config.setBackendConfigOption(QByteArrayLiteral("SignatureAlgorithms"), serverSigAlgPairs.join(':')); server.config.setBackendConfigurationOption(QByteArrayLiteral("SignatureAlgorithms"), serverSigAlgPairs.join(':'));
QVERIFY(server.listen()); QVERIFY(server.listen());
QSslConfiguration clientConfig = QSslConfiguration::defaultConfiguration(); QSslConfiguration clientConfig = QSslConfiguration::defaultConfiguration();
clientConfig.setProtocol(clientProtocol); clientConfig.setProtocol(clientProtocol);
clientConfig.setBackendConfigOption(QByteArrayLiteral("SignatureAlgorithms"), clientSigAlgPairs.join(':')); clientConfig.setBackendConfigurationOption(QByteArrayLiteral("SignatureAlgorithms"), clientSigAlgPairs.join(':'));
QSslSocket client; QSslSocket client;
client.setSslConfiguration(clientConfig); client.setSslConfiguration(clientConfig);
socket = &client; socket = &client;

View File

@ -257,7 +257,7 @@ def main(name, *args):
# Avoid interference from any qtlogging.ini files, e.g. in # Avoid interference from any qtlogging.ini files, e.g. in
# /etc/xdg/QtProject/, (must match tst_selftests.cpp's # /etc/xdg/QtProject/, (must match tst_selftests.cpp's
# processEnvironment()'s value): # processEnvironment()'s value):
QT_LOGGING_RULES = '*.debug=true;qt.qpa.screen=false') QT_LOGGING_RULES = '*.debug=true;qt.*=false')
herePath = os.getcwd() herePath = os.getcwd()
cleaner = Cleaner(herePath, name) cleaner = Cleaner(herePath, name)

View File

@ -417,7 +417,6 @@ tst_Selftests::tst_Selftests()
void tst_Selftests::initTestCase() void tst_Selftests::initTestCase()
{ {
QVERIFY2(tempDir.isValid(), qPrintable(tempDir.errorString())); QVERIFY2(tempDir.isValid(), qPrintable(tempDir.errorString()));
qputenv("QT_LOGGING_RULES", QByteArrayLiteral("*.debug=false")); // Silence any debug output
//Detect the location of the sub programs //Detect the location of the sub programs
QString subProgram = QLatin1String("float/float"); QString subProgram = QLatin1String("float/float");
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
@ -657,7 +656,7 @@ static QProcessEnvironment processEnvironment()
// Avoid interference from any qtlogging.ini files, e.g. in /etc/xdg/QtProject/: // Avoid interference from any qtlogging.ini files, e.g. in /etc/xdg/QtProject/:
result.insert(QStringLiteral("QT_LOGGING_RULES"), result.insert(QStringLiteral("QT_LOGGING_RULES"),
// Must match generate_expected_output.py's main()'s value: // Must match generate_expected_output.py's main()'s value:
QStringLiteral("*.debug=true;qt.qpa.screen=false")); QStringLiteral("*.debug=true;qt.*=false"));
} }
return result; return result;
} }

View File

@ -52,7 +52,6 @@ private slots:
void boundingRect2(); void boundingRect2();
void draw(); void draw();
void opacity(); void opacity();
void nestedOpaqueOpacity();
void grayscale(); void grayscale();
void colorize(); void colorize();
void drawPixmapItem(); void drawPixmapItem();
@ -408,26 +407,6 @@ void tst_QGraphicsEffect::opacity()
QCOMPARE(effect->m_opacity, qreal(0.5)); QCOMPARE(effect->m_opacity, qreal(0.5));
} }
void tst_QGraphicsEffect::nestedOpaqueOpacity()
{
// QTBUG-60231: Nesting widgets with a QGraphicsEffect on a toplevel with
// QGraphicsOpacityEffect caused crashes due to constructing several
// QPainter instances on a device in the fast path for
// QGraphicsOpacityEffect::opacity=1
QWidget topLevel;
topLevel.setWindowTitle(QTest::currentTestFunction());
topLevel.resize(320, 200);
QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;
opacityEffect->setOpacity(1);
topLevel.setGraphicsEffect(opacityEffect);
QWidget *child = new QWidget(&topLevel);
child->resize(topLevel.size() / 2);
QGraphicsDropShadowEffect *childEffect = new QGraphicsDropShadowEffect;
child->setGraphicsEffect(childEffect);
topLevel.show();
QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
}
void tst_QGraphicsEffect::grayscale() void tst_QGraphicsEffect::grayscale()
{ {
if (qApp->desktop()->depth() < 24) if (qApp->desktop()->depth() < 24)

View File

@ -544,11 +544,11 @@ void tst_QHeaderView::movable()
view->setSectionsMovable(true); view->setSectionsMovable(true);
QCOMPARE(view->sectionsMovable(), true); QCOMPARE(view->sectionsMovable(), true);
QCOMPARE(view->firstSectionMovable(), true); QCOMPARE(view->isFirstSectionMovable(), true);
view->setFirstSectionMovable(false); view->setFirstSectionMovable(false);
QCOMPARE(view->firstSectionMovable(), false); QCOMPARE(view->isFirstSectionMovable(), false);
view->setFirstSectionMovable(true); view->setFirstSectionMovable(true);
QCOMPARE(view->firstSectionMovable(), true); QCOMPARE(view->isFirstSectionMovable(), true);
} }
void tst_QHeaderView::clickable() void tst_QHeaderView::clickable()

View File

@ -61,14 +61,28 @@ struct TabletPoint
class ProximityEventFilter : public QObject class ProximityEventFilter : public QObject
{ {
Q_OBJECT
public: public:
explicit ProximityEventFilter(QObject *parent) : QObject(parent) { } explicit ProximityEventFilter(QObject *parent) : QObject(parent) { }
bool eventFilter(QObject *, QEvent *event) override bool eventFilter(QObject *, QEvent *event) override;
static bool tabletPenProximity() { return m_tabletPenProximity; }
signals:
void proximityChanged();
private:
static bool m_tabletPenProximity;
};
bool ProximityEventFilter::eventFilter(QObject *, QEvent *event)
{ {
switch (event->type()) { switch (event->type()) {
case QEvent::TabletEnterProximity: case QEvent::TabletEnterProximity:
case QEvent::TabletLeaveProximity: case QEvent::TabletLeaveProximity:
ProximityEventFilter::m_tabletPenProximity = event->type() == QEvent::TabletEnterProximity;
emit proximityChanged();
qDebug() << event; qDebug() << event;
break; break;
default: default:
@ -76,7 +90,8 @@ public:
} }
return false; return false;
} }
};
bool ProximityEventFilter::m_tabletPenProximity = false;
class EventReportWidget : public QWidget class EventReportWidget : public QWidget
{ {
@ -111,6 +126,7 @@ private:
Qt::MouseButton m_lastButton = Qt::NoButton; Qt::MouseButton m_lastButton = Qt::NoButton;
QVector<TabletPoint> m_points; QVector<TabletPoint> m_points;
QVector<QPointF> m_touchPoints; QVector<QPointF> m_touchPoints;
QPointF m_tabletPos;
int m_tabletMoveCount = 0; int m_tabletMoveCount = 0;
int m_paintEventCount = 0; int m_paintEventCount = 0;
}; };
@ -169,6 +185,13 @@ void EventReportWidget::paintEvent(QPaintEvent *)
} }
} }
} }
// Draw haircross when tablet pen is in proximity
if (ProximityEventFilter::tabletPenProximity() && geom.contains(m_tabletPos)) {
p.setPen(Qt::black);
p.drawLine(QPointF(0, m_tabletPos.y()), QPointF(geom.width(), m_tabletPos.y()));
p.drawLine(QPointF(m_tabletPos.x(), 0), QPointF(m_tabletPos.x(), geom.height()));
}
p.setPen(Qt::blue); p.setPen(Qt::blue);
for (QPointF t : m_touchPoints) { for (QPointF t : m_touchPoints) {
p.drawLine(t.x() - 40, t.y(), t.x() + 40, t.y()); p.drawLine(t.x() - 40, t.y(), t.x() + 40, t.y());
@ -181,20 +204,21 @@ void EventReportWidget::tabletEvent(QTabletEvent *event)
{ {
QWidget::tabletEvent(event); QWidget::tabletEvent(event);
bool isMove = false; bool isMove = false;
m_tabletPos = event->posF();
switch (event->type()) { switch (event->type()) {
case QEvent::TabletMove: case QEvent::TabletMove:
m_points.push_back(TabletPoint(event->pos(), TabletMove, m_lastButton, event->pointerType(), event->pressure(), event->rotation())); m_points.push_back(TabletPoint(m_tabletPos, TabletMove, m_lastButton, event->pointerType(), event->pressure(), event->rotation()));
update(); update();
isMove = true; isMove = true;
++m_tabletMoveCount; ++m_tabletMoveCount;
break; break;
case QEvent::TabletPress: case QEvent::TabletPress:
m_points.push_back(TabletPoint(event->pos(), TabletButtonPress, event->button(), event->pointerType(), event->rotation())); m_points.push_back(TabletPoint(m_tabletPos, TabletButtonPress, event->button(), event->pointerType(), event->rotation()));
m_lastButton = event->button(); m_lastButton = event->button();
update(); update();
break; break;
case QEvent::TabletRelease: case QEvent::TabletRelease:
m_points.push_back(TabletPoint(event->pos(), TabletButtonRelease, event->button(), event->pointerType(), event->rotation())); m_points.push_back(TabletPoint(m_tabletPos, TabletButtonRelease, event->button(), event->pointerType(), event->rotation()));
update(); update();
break; break;
default: default:
@ -253,10 +277,14 @@ void EventReportWidget::timerEvent(QTimerEvent *)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
app.installEventFilter(new ProximityEventFilter(&app));
ProximityEventFilter *proximityEventFilter = new ProximityEventFilter(&app);
app.installEventFilter(proximityEventFilter);
QMainWindow mainWindow; QMainWindow mainWindow;
mainWindow.setWindowTitle(QString::fromLatin1("Tablet Test %1").arg(QT_VERSION_STR)); mainWindow.setWindowTitle(QString::fromLatin1("Tablet Test %1").arg(QT_VERSION_STR));
EventReportWidget *widget = new EventReportWidget; EventReportWidget *widget = new EventReportWidget;
QObject::connect(proximityEventFilter, &ProximityEventFilter::proximityChanged,
widget, QOverload<void>::of(&QWidget::update));
widget->setMinimumSize(640, 480); widget->setMinimumSize(640, 480);
QMenu *fileMenu = mainWindow.menuBar()->addMenu("File"); QMenu *fileMenu = mainWindow.menuBar()->addMenu("File");
fileMenu->addAction("Clear", widget, &EventReportWidget::clearPoints); fileMenu->addAction("Clear", widget, &EventReportWidget::clearPoints);