summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/widgets/tutorials/gettingstartedqt.qdoc14
-rw-r--r--examples/widgets/tutorials/notepad/notepad.cpp57
-rw-r--r--examples/widgets/tutorials/notepad/notepad.h32
-rw-r--r--examples/widgets/widgets/tablet/tabletcanvas.cpp2
-rw-r--r--src/3rdparty/easing/qt_attribution.json3
-rw-r--r--src/3rdparty/forkfd/qt_attribution.json2
-rw-r--r--src/3rdparty/freebsd/qt_attribution.json5
-rw-r--r--src/3rdparty/iaccessible2/qt_attribution.json2
-rw-r--r--src/3rdparty/icc/qt_attribution.json2
-rw-r--r--src/3rdparty/libpng/libpng.pro2
-rw-r--r--src/3rdparty/md4/qt_attribution.json1
-rw-r--r--src/3rdparty/md5/qt_attribution.json1
-rw-r--r--src/3rdparty/rfc6234/qt_attribution.json1
-rw-r--r--src/3rdparty/tinycbor/qt_attribution.json1
-rw-r--r--src/3rdparty/wintab/qt_attribution.json1
-rw-r--r--src/corelib/codecs/qt_attribution.json7
-rw-r--r--src/corelib/kernel/qcoreapplication_win.cpp19
-rw-r--r--src/corelib/kernel/qobject.cpp34
-rw-r--r--src/corelib/kernel/qt_attribution.json1
-rw-r--r--src/corelib/kernel/qvariant.cpp12
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp2
-rw-r--r--src/corelib/mimetypes/qmimetype.cpp1
-rw-r--r--src/corelib/mimetypes/qmimetypeparser.cpp4
-rw-r--r--src/corelib/thread/qthread_win.cpp4
-rw-r--r--src/corelib/tools/qcontiguouscache.h1
-rw-r--r--src/gui/opengl/qopengltextureuploader.cpp2
-rw-r--r--src/gui/painting/qpdf.cpp26
-rw-r--r--src/gui/painting/qrgba64.qdoc2
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp5
-rw-r--r--src/network/ssl/qsslsocket_openssl11.cpp4
-rw-r--r--src/network/ssl/qsslsocket_opensslpre11.cpp4
-rw-r--r--src/platformsupport/fontdatabases/mac/coretext.pri6
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.cpp190
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.h41
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp13
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h1
-rw-r--r--src/plugins/platforms/xcb/qxcbeventdispatcher.h3
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp182
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h12
-rw-r--r--src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp4
-rw-r--r--src/tools/uic/cpp/cpp.pri2
-rw-r--r--src/tools/uic/driver.cpp11
-rw-r--r--src/tools/uic/main.cpp1
-rw-r--r--src/tools/uic/option.h12
-rw-r--r--src/tools/uic/uic.cpp92
-rw-r--r--src/tools/uic/uic.h8
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp2
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp53
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp8
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp14
-rw-r--r--tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp2
-rw-r--r--tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp4
-rw-r--r--tests/auto/gui/kernel/qwindow/BLACKLIST1
-rw-r--r--tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp2
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp9
55 files changed, 503 insertions, 424 deletions
diff --git a/examples/widgets/tutorials/gettingstartedqt.qdoc b/examples/widgets/tutorials/gettingstartedqt.qdoc
index bbe1dd1a8d..32e8845c05 100644
--- a/examples/widgets/tutorials/gettingstartedqt.qdoc
+++ b/examples/widgets/tutorials/gettingstartedqt.qdoc
@@ -390,10 +390,10 @@
action concerned. When the QAction has been dragged to the toolbar,
clicking the icon will launch the associated slot.
- Complete the method \c on_actionNew_triggered():
+ Complete the method \c newDocument():
\quotefromfile tutorials/notepad/notepad.cpp
- \skipto on_actionNew_triggered()
+ \skipto newDocument()
\printuntil }
\c current_file is a global variable containing the file presently
@@ -411,10 +411,10 @@
In \c notepad.ui, right click on \c actionOpen and select \c {Go to
slot}
- Complete method \c on_actionOpen_triggered().
+ Complete method \c open().
\quotefromfile tutorials/notepad/notepad.cpp
- \skipto on_actionOpen_triggered()
+ \skipto open()
\printuntil file.close
\printuntil }
@@ -436,7 +436,7 @@
\l {Opening a file}, by right clicking on \c actionSave, and
selecting \c {Go to Slot}.
- \skipto Notepad::on_actionSave_triggered
+ \skipto Notepad::save
\printuntil file.close
\printuntil }
@@ -449,7 +449,7 @@
\section2 Saving a file with \c {Save as}
- \skipto Notepad::on_actionSave_as_triggered
+ \skipto Notepad::saveAs
\printuntil file.close
\printuntil }
@@ -475,7 +475,7 @@
\section2 Select a Font
- \skipto Notepad::on_actionFont_triggered
+ \skipto Notepad::selectFont
\printuntil ui->textEdit->setFont
\printline }
diff --git a/examples/widgets/tutorials/notepad/notepad.cpp b/examples/widgets/tutorials/notepad/notepad.cpp
index d0e600e852..2ccd6501a1 100644
--- a/examples/widgets/tutorials/notepad/notepad.cpp
+++ b/examples/widgets/tutorials/notepad/notepad.cpp
@@ -74,6 +74,23 @@ Notepad::Notepad(QWidget *parent) :
ui->setupUi(this);
this->setCentralWidget(ui->textEdit);
+ connect(ui->actionNew, &QAction::triggered, this, &Notepad::newDocument);
+ connect(ui->actionOpen, &QAction::triggered, this, &Notepad::open);
+ connect(ui->actionSave, &QAction::triggered, this, &Notepad::save);
+ connect(ui->actionSave_as, &QAction::triggered, this, &Notepad::saveAs);
+ connect(ui->actionPrint, &QAction::triggered, this, &Notepad::print);
+ connect(ui->actionExit, &QAction::triggered, this, &Notepad::exit);
+ connect(ui->actionCopy, &QAction::triggered, this, &Notepad::copy);
+ connect(ui->actionCut, &QAction::triggered, this, &Notepad::cut);
+ connect(ui->actionPaste, &QAction::triggered, this, &Notepad::paste);
+ connect(ui->actionUndo, &QAction::triggered, this, &Notepad::undo);
+ connect(ui->actionRedo, &QAction::triggered, this, &Notepad::redo);
+ connect(ui->actionFont, &QAction::triggered, this, &Notepad::selectFont);
+ connect(ui->actionBold, &QAction::triggered, this, &Notepad::setFontBold);
+ connect(ui->actionUnderline, &QAction::triggered, this, &Notepad::setFontUnderline);
+ connect(ui->actionItalic, &QAction::triggered, this, &Notepad::setFontItalic);
+ connect(ui->actionAbout, &QAction::triggered, this, &Notepad::about);
+
// Disable menu actions for unavailable features
#if !QT_CONFIG(printer)
ui->actionPrint->setEnabled(false);
@@ -91,13 +108,13 @@ Notepad::~Notepad()
delete ui;
}
-void Notepad::on_actionNew_triggered()
+void Notepad::newDocument()
{
currentFile.clear();
ui->textEdit->setText(QString());
}
-void Notepad::on_actionOpen_triggered()
+void Notepad::open()
{
QString fileName = QFileDialog::getOpenFileName(this, "Open the file");
QFile file(fileName);
@@ -113,7 +130,7 @@ void Notepad::on_actionOpen_triggered()
file.close();
}
-void Notepad::on_actionSave_triggered()
+void Notepad::save()
{
QString fileName;
// If we don't have a filename from before, get one.
@@ -135,7 +152,7 @@ void Notepad::on_actionSave_triggered()
file.close();
}
-void Notepad::on_actionSave_as_triggered()
+void Notepad::saveAs()
{
QString fileName = QFileDialog::getSaveFileName(this, "Save as");
QFile file(fileName);
@@ -152,7 +169,7 @@ void Notepad::on_actionSave_as_triggered()
file.close();
}
-void Notepad::on_actionPrint_triggered()
+void Notepad::print()
{
#if QT_CONFIG(printer)
QPrinter printDev;
@@ -165,43 +182,43 @@ void Notepad::on_actionPrint_triggered()
#endif // QT_CONFIG(printer)
}
-void Notepad::on_actionExit_triggered()
+void Notepad::exit()
{
QCoreApplication::quit();
}
-void Notepad::on_actionCopy_triggered()
+void Notepad::copy()
{
#if QT_CONFIG(clipboard)
ui->textEdit->copy();
#endif
}
-void Notepad::on_actionCut_triggered()
+void Notepad::cut()
{
#if QT_CONFIG(clipboard)
ui->textEdit->cut();
#endif
}
-void Notepad::on_actionPaste_triggered()
+void Notepad::paste()
{
#if QT_CONFIG(clipboard)
ui->textEdit->paste();
#endif
}
-void Notepad::on_actionUndo_triggered()
+void Notepad::undo()
{
ui->textEdit->undo();
}
-void Notepad::on_actionRedo_triggered()
+void Notepad::redo()
{
ui->textEdit->redo();
}
-void Notepad::on_actionFont_triggered()
+void Notepad::selectFont()
{
bool fontSelected;
QFont font = QFontDialog::getFont(&fontSelected, this);
@@ -209,23 +226,23 @@ void Notepad::on_actionFont_triggered()
ui->textEdit->setFont(font);
}
-void Notepad::on_actionUnderline_triggered()
+void Notepad::setFontUnderline(bool underline)
{
- ui->textEdit->setFontUnderline(ui->actionUnderline->isChecked());
+ ui->textEdit->setFontUnderline(underline);
}
-void Notepad::on_actionItalic_triggered()
+void Notepad::setFontItalic(bool italic)
{
- ui->textEdit->setFontItalic(ui->actionItalic->isChecked());
+ ui->textEdit->setFontItalic(italic);
}
-void Notepad::on_actionBold_triggered()
+void Notepad::setFontBold(bool bold)
{
- ui->actionBold->isChecked() ? ui->textEdit->setFontWeight(QFont::Bold) :
- ui->textEdit->setFontWeight(QFont::Normal);
+ bold ? ui->textEdit->setFontWeight(QFont::Bold) :
+ ui->textEdit->setFontWeight(QFont::Normal);
}
-void Notepad::on_actionAbout_triggered()
+void Notepad::about()
{
QMessageBox::about(this, tr("About MDI"),
tr("The <b>Notepad</b> example demonstrates how to code a basic "
diff --git a/examples/widgets/tutorials/notepad/notepad.h b/examples/widgets/tutorials/notepad/notepad.h
index 288ab4e373..9580ab8071 100644
--- a/examples/widgets/tutorials/notepad/notepad.h
+++ b/examples/widgets/tutorials/notepad/notepad.h
@@ -79,37 +79,37 @@ public:
//! [5]
private slots:
- void on_actionNew_triggered();
+ void newDocument();
- void on_actionOpen_triggered();
+ void open();
- void on_actionSave_triggered();
+ void save();
- void on_actionSave_as_triggered();
+ void saveAs();
- void on_actionPrint_triggered();
+ void print();
- void on_actionExit_triggered();
+ void exit();
- void on_actionCopy_triggered();
+ void copy();
- void on_actionCut_triggered();
+ void cut();
- void on_actionPaste_triggered();
+ void paste();
- void on_actionUndo_triggered();
+ void undo();
- void on_actionRedo_triggered();
+ void redo();
- void on_actionFont_triggered();
+ void selectFont();
- void on_actionBold_triggered();
+ void setFontBold(bool bold);
- void on_actionUnderline_triggered();
+ void setFontUnderline(bool underline);
- void on_actionItalic_triggered();
+ void setFontItalic(bool italic);
- void on_actionAbout_triggered();
+ void about();
//! [6]
private:
diff --git a/examples/widgets/widgets/tablet/tabletcanvas.cpp b/examples/widgets/widgets/tablet/tabletcanvas.cpp
index bfcc84e182..dc56702142 100644
--- a/examples/widgets/widgets/tablet/tabletcanvas.cpp
+++ b/examples/widgets/widgets/tablet/tabletcanvas.cpp
@@ -224,7 +224,7 @@ void TabletCanvas::paintPixmap(QPainter &painter, QTabletEvent *event)
qWarning() << error;
#endif
}
- // FALL-THROUGH
+ Q_FALLTHROUGH();
case QTabletEvent::Stylus:
painter.setPen(m_pen);
painter.drawLine(lastPoint.pos, event->posF());
diff --git a/src/3rdparty/easing/qt_attribution.json b/src/3rdparty/easing/qt_attribution.json
index b6240c61c8..bccc67b6d4 100644
--- a/src/3rdparty/easing/qt_attribution.json
+++ b/src/3rdparty/easing/qt_attribution.json
@@ -3,7 +3,10 @@
"Name": "Easing Equations by Robert Penner",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QEasingCurve).",
+ "Files": "easing.cpp",
+ "Homepage": "treat as final",
+ "Homepage": "http://robertpenner.com/easing/",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
"LicenseFile": "LICENSE",
diff --git a/src/3rdparty/forkfd/qt_attribution.json b/src/3rdparty/forkfd/qt_attribution.json
index f004116753..ebbb19c718 100644
--- a/src/3rdparty/forkfd/qt_attribution.json
+++ b/src/3rdparty/forkfd/qt_attribution.json
@@ -3,6 +3,8 @@
"Name": "forkfd",
"QDocModule": "qtcore",
"QtUsage": "Used on most Unix platforms in Qt Core.",
+ "Files": "No upstream; treat as final",
+ "Files": "forkfd.c forkfd.h forkfd_gcc.h",
"License": "MIT License",
"LicenseId": "MIT",
diff --git a/src/3rdparty/freebsd/qt_attribution.json b/src/3rdparty/freebsd/qt_attribution.json
index 57f425cdbc..6a4a9ca1af 100644
--- a/src/3rdparty/freebsd/qt_attribution.json
+++ b/src/3rdparty/freebsd/qt_attribution.json
@@ -3,8 +3,13 @@
"Name": "FreeBSD strtoll and strtoull",
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core.",
+ "Files": "strtoll.c strtoull.c",
"Description": "strtoll() and strtoull() are functions for converting a string to (unsigned) long long integer.",
+ "Homepage": "https://github.com/freebsd/freebsd/",
+ "Upstream": "https://raw.githubusercontent.com/freebsd/freebsd/raw/tree/master/lib/libc/stdlib/$file",
+ "Version": "upstream has complicated with std locales; do not update",
+ "Version": "18b29f3fb8abee5d57ed8f4a44f806bec7e0eeff",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
"LicenseFile": "LICENSE",
diff --git a/src/3rdparty/iaccessible2/qt_attribution.json b/src/3rdparty/iaccessible2/qt_attribution.json
index 290d0d4b7d..eea8314f1a 100644
--- a/src/3rdparty/iaccessible2/qt_attribution.json
+++ b/src/3rdparty/iaccessible2/qt_attribution.json
@@ -5,7 +5,7 @@
"QtUsage": "Optionally used in the Windows platform plugin. Configure with -no-accessibility to avoid.",
"Description": "IAccessible2 is a new accessibility API which complements Microsoft's earlier work on MSAA",
- "Homepage": "http://www.linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2",
+ "Homepage": "https://wiki.linuxfoundation.org/accessibility/iaccessible2/",
"Version": "1.3.0",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
diff --git a/src/3rdparty/icc/qt_attribution.json b/src/3rdparty/icc/qt_attribution.json
index 7a1c813522..06049954e3 100644
--- a/src/3rdparty/icc/qt_attribution.json
+++ b/src/3rdparty/icc/qt_attribution.json
@@ -4,9 +4,11 @@
"Name": "sRGB color profile icc file",
"QDocModule": "qtgui",
"QtUsage": "Used in Qt Gui (Embedded into PDF/A-1b files generated by QPrinter/QPdfWriter).",
+ "Files": "No upstream: treat as final",
"Files": "sRGB2014.icc",
"Description": "An ICC color profile for PDF/A-1b compatible PDF files.",
+ "Homepage": "http://www.color.org/",
"LicenseId": "ICC License",
"License": "International Color Consortium License",
"LicenseFile": "LICENSE.txt",
diff --git a/src/3rdparty/libpng/libpng.pro b/src/3rdparty/libpng/libpng.pro
index 577b61d833..a2f56669b4 100644
--- a/src/3rdparty/libpng/libpng.pro
+++ b/src/3rdparty/libpng/libpng.pro
@@ -10,7 +10,7 @@ MODULE_INCLUDEPATH = $$PWD
load(qt_helper_lib)
-DEFINES += PNG_ARM_NEON_OPT=0
+DEFINES += PNG_ARM_NEON_OPT=0 PNG_POWERPC_VSX_OPT=0
SOURCES += \
png.c \
pngerror.c \
diff --git a/src/3rdparty/md4/qt_attribution.json b/src/3rdparty/md4/qt_attribution.json
index f1bca24660..ea7e22705f 100644
--- a/src/3rdparty/md4/qt_attribution.json
+++ b/src/3rdparty/md4/qt_attribution.json
@@ -4,6 +4,7 @@
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QCryptographicHash). Configure with -DQT_CRYPTOGRAPHICHASH_ONLY_SHA1 to avoid.",
+ "Description": "Treat as final version; no upstream known",
"Description": "An OpenSSL-compatible implementation of the RSA Data Security, Inc. MD4 Message-Digest Algorithm.",
"License": "Public Domain",
"Copyright": "Written by Alexander Peslyak - better known as Solar Designer <solar@openwall.com> - in 2001, and placed in the public domain. There's absolutely no warranty."
diff --git a/src/3rdparty/md5/qt_attribution.json b/src/3rdparty/md5/qt_attribution.json
index 52b613cf6c..e9783f9e49 100644
--- a/src/3rdparty/md5/qt_attribution.json
+++ b/src/3rdparty/md5/qt_attribution.json
@@ -4,6 +4,7 @@
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QCryptographicHash). Configure with -DQT_CRYPTOGRAPHICHASH_ONLY_SHA1 to avoid.",
+ "Description": "Treat as final version; no upstream known",
"Description": "MD5 message-digest algorithm.",
"License": "Public Domain",
"Copyright": "Written by Colin Plumb in 1993, no copyright is claimed.
diff --git a/src/3rdparty/rfc6234/qt_attribution.json b/src/3rdparty/rfc6234/qt_attribution.json
index 9fc427b4a6..1cce430cf6 100644
--- a/src/3rdparty/rfc6234/qt_attribution.json
+++ b/src/3rdparty/rfc6234/qt_attribution.json
@@ -4,6 +4,7 @@
"QDocModule": "qtcore",
"QtUsage": "Used in Qt Core (QCryptographicHash and QMessageAuthenticationCode)",
+ "Description": "The RFC actually contains the code, embedded in RFC-boilerplate; presumably we extracted it; treat as final",
"Description": "Implements the Secure Hash Algorithms SHA 384 and SHA-521",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseFile": "LICENSE",
diff --git a/src/3rdparty/tinycbor/qt_attribution.json b/src/3rdparty/tinycbor/qt_attribution.json
index 1d61534861..5b6355d013 100644
--- a/src/3rdparty/tinycbor/qt_attribution.json
+++ b/src/3rdparty/tinycbor/qt_attribution.json
@@ -5,6 +5,7 @@
"QtUsage": "Used for QCborStreamReader and QCborStreamWriter.",
"Description": "Concise Binary Object Representation (CBOR) Library",
+ "Version": "0.6.0",
"Homepage": "https://github.com/intel/tinycbor",
"License": "MIT License",
"LicenseId": "MIT",
diff --git a/src/3rdparty/wintab/qt_attribution.json b/src/3rdparty/wintab/qt_attribution.json
index ac06e8da5a..f0c9b49841 100644
--- a/src/3rdparty/wintab/qt_attribution.json
+++ b/src/3rdparty/wintab/qt_attribution.json
@@ -5,6 +5,7 @@
"QtUsage": "Used in the Qt platform plugin for Windows. Configure with -no-feature-tabletevent to avoid.",
"Description": "Wintab is a de facto API for pointing devices on Windows.",
+ "Version": "Upstream no longer offers updates; treat as final",
"Homepage": "http://www.pointing.com/Wintab.html",
"License": "Public Domain",
"LicenseId": "NONE",
diff --git a/src/corelib/codecs/qt_attribution.json b/src/corelib/codecs/qt_attribution.json
index 41f644a030..0815074675 100644
--- a/src/corelib/codecs/qt_attribution.json
+++ b/src/corelib/codecs/qt_attribution.json
@@ -6,6 +6,7 @@
"QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.",
"Path": "qbig5codec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The Big5 codecs (QBig5Codec, QBig5hkscsCodec)
provide conversion to and from the Big5 encodings.",
"License": "BSD 2-clause \"Simplified\" License",
@@ -23,6 +24,7 @@ Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd."
"QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.",
"Path": "qeucjpcodec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The EUC-JP text codec provides conversion to and from EUC-JP,
the main legacy encoding for Unix machines in Japan.",
"License": "BSD 2-clause \"Simplified\" License",
@@ -37,6 +39,7 @@ the main legacy encoding for Unix machines in Japan.",
"QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.",
"Path": "qeuckrcodec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The EUC-KR text codec provides conversion to and from EUC-KR, KR,
the main legacy encoding for Unix machines in Korea.",
"License": "BSD 2-clause \"Simplified\" License",
@@ -51,6 +54,7 @@ the main legacy encoding for Unix machines in Korea.",
"QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.",
"Path": "qjiscodec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The ISO 2022-JP (JIS) text codec provides conversion to and from ISO 2022-JP.",
"License": "BSD 2-clause \"Simplified\" License",
"LicenseId": "BSD-2-Clause",
@@ -64,6 +68,7 @@ the main legacy encoding for Unix machines in Korea.",
"QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.",
"Path": "qsjiscodec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The Shift-JIS text codec provides conversion to and from Shift-JIS.",
"License": "BSD 2-clause \"Simplified\" License",
"LicenseId": "BSD-2-Clause",
@@ -77,6 +82,7 @@ the main legacy encoding for Unix machines in Korea.",
"QtUsage": "Used in Qt Core.",
"Path": "qtsciicodec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The TSCII text codec provides conversion to and from the Tamil TSCII
encoding.",
"License": "BSD 2-clause \"Simplified\" License",
@@ -91,6 +97,7 @@ encoding.",
"QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.",
"Path": "qgb18030codec.cpp",
+ "Description": "Treat as final version; no upstream known",
"Description": "The GBK codec provides conversion to and from the Chinese
GB18030/GBK/GB2312 encoding.",
"License": "BSD 2-clause \"Simplified\" License",
diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp
index 0109e2c658..b373267fcb 100644
--- a/src/corelib/kernel/qcoreapplication_win.cpp
+++ b/src/corelib/kernel/qcoreapplication_win.cpp
@@ -417,6 +417,23 @@ static const char *findWMstr(uint msg)
{ 0x0232, "WM_EXITSIZEMOVE" },
{ 0x0233, "WM_DROPFILES" },
{ 0x0234, "WM_MDIREFRESHMENU" },
+ { 0x0241, "WM_NCPOINTERUPDATE"},
+ { 0x0242, "WM_NCPOINTERDOWN"},
+ { 0x0243, "WM_NCPOINTERUP"},
+ { 0x0245, "WM_POINTERUPDATE"},
+ { 0x0246, "WM_POINTERDOWN"},
+ { 0x0247, "WM_POINTERUP"},
+ { 0x0249, "WM_POINTERENTER"},
+ { 0x024A, "WM_POINTERLEAVE"},
+ { 0x0248, "WM_POINTERACTIVATE"},
+ { 0x024C, "WM_POINTERCAPTURECHANGED"},
+ { 0x024D, "WM_TOUCHHITTESTING"},
+ { 0x024E, "WM_POINTERWHEEL"},
+ { 0x024F, "WM_POINTERHWHEEL"},
+ { 0x0250, "DM_POINTERHITTEST"},
+ { 0x0251, "WM_POINTERROUTEDTO"},
+ { 0x0252, "WM_POINTERROUTEDAWAY"},
+ { 0x0253, "WM_POINTERROUTEDRELEASED"},
{ 0x0281, "WM_IME_SETCONTEXT" },
{ 0x0282, "WM_IME_NOTIFY" },
{ 0x0283, "WM_IME_CONTROL" },
@@ -700,7 +717,7 @@ QString decodeMSG(const MSG& msg)
else if (const char *wmmsgC = findWMstr(msg.message))
message = QString::fromLatin1(wmmsgC);
else
- message = QString::fromLatin1("WM_(%1)").arg(msg.message); // Unknown WM_, so use number
+ message = QString::fromLatin1("WM_(0x%1)").arg(msg.message, 0, 16); // Unknown WM_, so use number
// Yes, we want to give the WM_ names 20 chars of space before showing the
// decoded message, since some of the common messages are quite long, and
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 07208b7f40..deab51cfd0 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -421,6 +421,7 @@ void QObjectPrivate::cleanConnectionLists()
{
if (connectionLists->dirty && !connectionLists->inUse) {
// remove broken connections
+ bool allConnected = false;
for (int signal = -1; signal < connectionLists->count(); ++signal) {
QObjectPrivate::ConnectionList &connectionList =
(*connectionLists)[signal];
@@ -432,11 +433,13 @@ void QObjectPrivate::cleanConnectionLists()
QObjectPrivate::Connection **prev = &connectionList.first;
QObjectPrivate::Connection *c = *prev;
+ bool connected = false; // whether the signal is still connected somewhere
while (c) {
if (c->receiver) {
last = c;
prev = &c->nextConnectionList;
c = *prev;
+ connected = true;
} else {
QObjectPrivate::Connection *next = c->nextConnectionList;
*prev = next;
@@ -448,6 +451,14 @@ void QObjectPrivate::cleanConnectionLists()
// Correct the connection list's last pointer.
// As conectionList.last could equal last, this could be a noop
connectionList.last = last;
+
+ if (!allConnected && !connected && signal >= 0
+ && size_t(signal) < sizeof(connectedSignals) * 8) {
+ // This signal is no longer connected
+ connectedSignals[signal >> 5] &= ~(1 << (signal & 0x1f));
+ } else if (signal == -1) {
+ allConnected = connected;
+ }
}
connectionLists->dirty = false;
}
@@ -2501,19 +2512,20 @@ bool QObject::isSignalConnected(const QMetaMethod &signal) const
signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj);
- if (signalIndex < sizeof(d->connectedSignals) * 8)
+ QMutexLocker locker(signalSlotLock(this));
+ if (!d->connectionLists)
+ return false;
+
+ if (signalIndex < sizeof(d->connectedSignals) * 8 && !d->connectionLists->dirty)
return d->isSignalConnected(signalIndex);
- QMutexLocker locker(signalSlotLock(this));
- if (d->connectionLists) {
- if (signalIndex < uint(d->connectionLists->count())) {
- const QObjectPrivate::Connection *c =
- d->connectionLists->at(signalIndex).first;
- while (c) {
- if (c->receiver)
- return true;
- c = c->nextConnectionList;
- }
+ if (signalIndex < uint(d->connectionLists->count())) {
+ const QObjectPrivate::Connection *c =
+ d->connectionLists->at(signalIndex).first;
+ while (c) {
+ if (c->receiver)
+ return true;
+ c = c->nextConnectionList;
}
}
return false;
diff --git a/src/corelib/kernel/qt_attribution.json b/src/corelib/kernel/qt_attribution.json
index 37764a5330..6d8f4f2abc 100644
--- a/src/corelib/kernel/qt_attribution.json
+++ b/src/corelib/kernel/qt_attribution.json
@@ -5,6 +5,7 @@
"QtUsage": "Used in Qt Core on macOS.",
"Path": "qeventdispatcher_cf_p.h",
+ "Description": "Treat as final version; no upstream known",
"Description": "Implementation of QAbstractEventDispatcher for macOS.",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index 0b4c3f387f..6541b97595 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -3523,13 +3523,19 @@ bool QVariant::canConvert(int targetTypeId) const
}
// TODO Reimplement this function, currently it works but it is a historical mess.
- uint currentType = ((d.type == QMetaType::Float) ? QVariant::Double : d.type);
+ uint currentType = d.type;
if (currentType == QMetaType::SChar || currentType == QMetaType::Char)
currentType = QMetaType::UInt;
if (targetTypeId == QMetaType::SChar || currentType == QMetaType::Char)
targetTypeId = QMetaType::UInt;
- if (uint(targetTypeId) == uint(QMetaType::Float)) targetTypeId = QVariant::Double;
-
+ if (currentType == QMetaType::Short || currentType == QMetaType::UShort)
+ currentType = QMetaType::Int;
+ if (targetTypeId == QMetaType::Short || currentType == QMetaType::UShort)
+ targetTypeId = QMetaType::Int;
+ if (currentType == QMetaType::Float)
+ currentType = QMetaType::Double;
+ if (targetTypeId == QMetaType::Float)
+ targetTypeId = QMetaType::Double;
if (currentType == uint(targetTypeId))
return true;
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
index c4a8458243..aac51184a4 100644
--- a/src/corelib/mimetypes/qmimeprovider.cpp
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -502,7 +502,7 @@ void QMimeBinaryProvider::loadMimeTypePrivate(QMimeTypePrivate &data)
QString lang = xml.attributes().value(QLatin1String("xml:lang")).toString();
const QString text = xml.readElementText();
if (lang.isEmpty()) {
- lang = QLatin1String("en_US");
+ lang = QLatin1String("default"); // no locale attribute provided, treat it as default.
}
data.localeComments.insert(lang, text);
continue; // we called readElementText, so we're at the EndElement already.
diff --git a/src/corelib/mimetypes/qmimetype.cpp b/src/corelib/mimetypes/qmimetype.cpp
index 50b8eae5c3..55c7de0c87 100644
--- a/src/corelib/mimetypes/qmimetype.cpp
+++ b/src/corelib/mimetypes/qmimetype.cpp
@@ -258,6 +258,7 @@ QString QMimeType::comment() const
QStringList languageList;
languageList << QLocale().name();
languageList << QLocale().uiLanguages();
+ languageList << QLatin1String("default"); // use the default locale if possible.
for (const QString &language : qAsConst(languageList)) {
const QString lang = language == QLatin1String("C") ? QLatin1String("en_US") : language;
const QString comm = d->localeComments.value(lang);
diff --git a/src/corelib/mimetypes/qmimetypeparser.cpp b/src/corelib/mimetypes/qmimetypeparser.cpp
index 7ff695bbc3..d10575cfe9 100644
--- a/src/corelib/mimetypes/qmimetypeparser.cpp
+++ b/src/corelib/mimetypes/qmimetypeparser.cpp
@@ -248,11 +248,11 @@ bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString
}
break;
case ParseComment: {
- // comments have locale attributes. We want the default, English one
+ // comments have locale attributes.
QString locale = atts.value(QLatin1String(localeAttributeC)).toString();
const QString comment = reader.readElementText();
if (locale.isEmpty())
- locale = QString::fromLatin1("en_US");
+ locale = QString::fromLatin1("default");
data.localeComments.insert(locale, comment);
}
break;
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index e04d27d7b6..e56fe2c6ae 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -465,11 +465,7 @@ int QThread::idealThreadCount() Q_DECL_NOTHROW
void QThread::yieldCurrentThread()
{
-#if !defined(Q_OS_WINRT)
SwitchToThread();
-#else
- ::Sleep(0);
-#endif
}
#endif // QT_CONFIG(thread)
diff --git a/src/corelib/tools/qcontiguouscache.h b/src/corelib/tools/qcontiguouscache.h
index faa7263d6b..fdb9c6d19a 100644
--- a/src/corelib/tools/qcontiguouscache.h
+++ b/src/corelib/tools/qcontiguouscache.h
@@ -217,6 +217,7 @@ void QContiguousCache<T>::setCapacity(int asize)
detach();
union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
x.d = allocateData(asize);
+ x.d->ref.store(1);
x.d->alloc = asize;
x.d->count = qMin(d->count, asize);
x.d->offset = d->offset + d->count - x.d->count;
diff --git a/src/gui/opengl/qopengltextureuploader.cpp b/src/gui/opengl/qopengltextureuploader.cpp
index 2428baed93..42e309b733 100644
--- a/src/gui/opengl/qopengltextureuploader.cpp
+++ b/src/gui/opengl/qopengltextureuploader.cpp
@@ -114,7 +114,7 @@ qsizetype QOpenGLTextureUploader::textureImage(GLenum target, const QImage &imag
externalFormat = GL_BGRA;
internalFormat = GL_RGBA;
pixelType = GL_UNSIGNED_INT_8_8_8_8_REV;
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle) && false) {
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
GLint swizzle[4] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA };
funcs->glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp
index b410e9b900..e69726b617 100644
--- a/src/gui/painting/qpdf.cpp
+++ b/src/gui/painting/qpdf.cpp
@@ -953,7 +953,18 @@ void QPdfEngine::drawPixmap (const QRectF &rectangle, const QPixmap &pixmap, con
if (object < 0)
return;
- *d->currentPage << "q\n/GSa gs\n";
+ *d->currentPage << "q\n";
+
+ if ((d->pdfVersion != QPdfEngine::Version_A1b) && (d->opacity != 1.0)) {
+ int stateObject = d->addConstantAlphaObject(qRound(255 * d->opacity), qRound(255 * d->opacity));
+ if (stateObject)
+ *d->currentPage << "/GState" << stateObject << "gs\n";
+ else
+ *d->currentPage << "/GSa gs\n";
+ } else {
+ *d->currentPage << "/GSa gs\n";
+ }
+
*d->currentPage
<< QPdf::generateMatrix(QTransform(rectangle.width() / sr.width(), 0, 0, rectangle.height() / sr.height(),
rectangle.x(), rectangle.y()) * (d->simplePen ? QTransform() : d->stroker.matrix));
@@ -981,7 +992,18 @@ void QPdfEngine::drawImage(const QRectF &rectangle, const QImage &image, const Q
if (object < 0)
return;
- *d->currentPage << "q\n/GSa gs\n";
+ *d->currentPage << "q\n";
+
+ if ((d->pdfVersion != QPdfEngine::Version_A1b) && (d->opacity != 1.0)) {
+ int stateObject = d->addConstantAlphaObject(qRound(255 * d->opacity), qRound(255 * d->opacity));
+ if (stateObject)
+ *d->currentPage << "/GState" << stateObject << "gs\n";
+ else
+ *d->currentPage << "/GSa gs\n";
+ } else {
+ *d->currentPage << "/GSa gs\n";
+ }
+
*d->currentPage
<< QPdf::generateMatrix(QTransform(rectangle.width() / sr.width(), 0, 0, rectangle.height() / sr.height(),
rectangle.x(), rectangle.y()) * (d->simplePen ? QTransform() : d->stroker.matrix));
diff --git a/src/gui/painting/qrgba64.qdoc b/src/gui/painting/qrgba64.qdoc
index 26c78a5dcd..3ee8a355e6 100644
--- a/src/gui/painting/qrgba64.qdoc
+++ b/src/gui/painting/qrgba64.qdoc
@@ -35,7 +35,7 @@
QRgba64 is a 64-bit data-structure containing four 16-bit color channels: Red, green, blue and alpha.
- QRgba64 can be used a replacement for QRgb when higher precision is needed. In particular a
+ QRgba64 can be used as a replacement for QRgb when higher precision is needed. In particular a
premultiplied QRgba64 can operate on unpremultiplied QRgb without loss of precision except
for alpha 0.
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 64501a75e8..37bb3e4933 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -474,7 +474,12 @@ void QSslSocketPrivate::resetDefaultCiphers()
#else
SSL_CTX *myCtx = q_SSL_CTX_new(q_SSLv23_client_method());
#endif
+ // Note, we assert, not just silently return/bail out early:
+ // this should never happen and problems with OpenSSL's initialization
+ // must be caught before this (see supportsSsl()).
+ Q_ASSERT(myCtx);
SSL *mySsl = q_SSL_new(myCtx);
+ Q_ASSERT(mySsl);
QList<QSslCipher> ciphers;
QList<QSslCipher> defaultCiphers;
diff --git a/src/network/ssl/qsslsocket_openssl11.cpp b/src/network/ssl/qsslsocket_openssl11.cpp
index cbbf403672..2a2667bd48 100644
--- a/src/network/ssl/qsslsocket_openssl11.cpp
+++ b/src/network/ssl/qsslsocket_openssl11.cpp
@@ -88,8 +88,6 @@ bool QSslSocketPrivate::ensureLibraryLoaded()
const QMutexLocker locker(qt_opensslInitMutex);
if (!s_libraryLoaded) {
- s_libraryLoaded = true;
-
// Initialize OpenSSL.
if (q_OPENSSL_init_ssl(0, nullptr) != 1)
return false;
@@ -105,6 +103,8 @@ bool QSslSocketPrivate::ensureLibraryLoaded()
qWarning("Random number generator not seeded, disabling SSL support");
return false;
}
+
+ s_libraryLoaded = true;
}
return true;
}
diff --git a/src/network/ssl/qsslsocket_opensslpre11.cpp b/src/network/ssl/qsslsocket_opensslpre11.cpp
index 062e03f4e6..bc4fd9dc85 100644
--- a/src/network/ssl/qsslsocket_opensslpre11.cpp
+++ b/src/network/ssl/qsslsocket_opensslpre11.cpp
@@ -215,8 +215,6 @@ bool QSslSocketPrivate::ensureLibraryLoaded()
QMutexLocker locker(openssl_locks()->initLock());
if (!s_libraryLoaded) {
- s_libraryLoaded = true;
-
// Initialize OpenSSL.
q_CRYPTO_set_id_callback(id_function);
q_CRYPTO_set_locking_callback(locking_function);
@@ -235,6 +233,8 @@ bool QSslSocketPrivate::ensureLibraryLoaded()
qWarning("Random number generator not seeded, disabling SSL support");
return false;
}
+
+ s_libraryLoaded = true;
}
return true;
}
diff --git a/src/platformsupport/fontdatabases/mac/coretext.pri b/src/platformsupport/fontdatabases/mac/coretext.pri
index af75aa3281..95b9926e65 100644
--- a/src/platformsupport/fontdatabases/mac/coretext.pri
+++ b/src/platformsupport/fontdatabases/mac/coretext.pri
@@ -1,12 +1,6 @@
HEADERS += $$PWD/qcoretextfontdatabase_p.h $$PWD/qfontengine_coretext_p.h
OBJECTIVE_SOURCES += $$PWD/qfontengine_coretext.mm $$PWD/qcoretextfontdatabase.mm
-qtConfig(freetype) {
- QMAKE_USE_PRIVATE += freetype
- HEADERS += freetype/qfontengine_ft_p.h
- SOURCES += freetype/qfontengine_ft.cpp
-}
-
LIBS_PRIVATE += \
-framework CoreFoundation \
-framework CoreGraphics \
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
index 3fd14a659e..9c7559d514 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
@@ -153,114 +153,71 @@ private:
QByteArray format_atoms;
};
-namespace {
-class INCRTransaction;
-typedef QMap<xcb_window_t,INCRTransaction*> TransactionMap;
-static TransactionMap *transactions = 0;
+QXcbClipboardTransaction::QXcbClipboardTransaction(QXcbClipboard *clipboard, xcb_window_t w,
+ xcb_atom_t p, QByteArray d, xcb_atom_t t, int f)
+ : m_clipboard(clipboard), m_window(w), m_property(p), m_data(d), m_target(t), m_format(f)
+{
+ const quint32 values[] = { XCB_EVENT_MASK_PROPERTY_CHANGE };
+ xcb_change_window_attributes(m_clipboard->xcb_connection(), m_window,
+ XCB_CW_EVENT_MASK, values);
-//#define INCR_DEBUG
+ m_abortTimerId = startTimer(m_clipboard->clipboardTimeout());
+}
-class INCRTransaction : public QObject
+QXcbClipboardTransaction::~QXcbClipboardTransaction()
{
- Q_OBJECT
-public:
- INCRTransaction(QXcbConnection *c, xcb_window_t w, xcb_atom_t p,
- QByteArray d, uint i, xcb_atom_t t, int f, int to) :
- conn(c), win(w), property(p), data(d), increment(i),
- target(t), format(f), timeout(to), offset(0)
- {
- const quint32 values[] = { XCB_EVENT_MASK_PROPERTY_CHANGE };
- xcb_change_window_attributes(conn->xcb_connection(), win,
- XCB_CW_EVENT_MASK, values);
- if (!transactions) {
-#ifdef INCR_DEBUG
- qDebug("INCRTransaction: creating the TransactionMap");
-#endif
- transactions = new TransactionMap;
- conn->clipboard()->setProcessIncr(true);
- }
- transactions->insert(win, this);
- abort_timer = startTimer(timeout);
- }
+ if (m_abortTimerId)
+ killTimer(m_abortTimerId);
+ m_abortTimerId = 0;
+ m_clipboard->removeTransaction(m_window);
+}
- ~INCRTransaction()
- {
- if (abort_timer)
- killTimer(abort_timer);
- abort_timer = 0;
- transactions->remove(win);
- if (transactions->isEmpty()) {
-#ifdef INCR_DEBUG
- qDebug("INCRTransaction: no more INCR transactions left in the TransactionMap");
-#endif
- delete transactions;
- transactions = 0;
- conn->clipboard()->setProcessIncr(false);
- }
- }
+bool QXcbClipboardTransaction::updateIncrementalProperty(const xcb_property_notify_event_t *event)
+{
+ if (event->atom != m_property || event->state != XCB_PROPERTY_DELETE)
+ return false;
- void updateIncrProperty(xcb_property_notify_event_t *event, bool &accepted)
- {
- xcb_connection_t *c = conn->xcb_connection();
- if (event->atom == property && event->state == XCB_PROPERTY_DELETE) {
- accepted = true;
- // restart the timer
- if (abort_timer)
- killTimer(abort_timer);
- abort_timer = startTimer(timeout);
-
- unsigned int bytes_left = data.size() - offset;
- if (bytes_left > 0) {
- unsigned int bytes_to_send = qMin(increment, bytes_left);
-#ifdef INCR_DEBUG
- qDebug("INCRTransaction: sending %d bytes, %d remaining (INCR transaction %p)",
- bytes_to_send, bytes_left - bytes_to_send, this);
-#endif
- int dataSize = bytes_to_send / (format / 8);
- xcb_change_property(c, XCB_PROP_MODE_REPLACE, win, property,
- target, format, dataSize, data.constData() + offset);
- offset += bytes_to_send;
- } else {
-#ifdef INCR_DEBUG
- qDebug("INCRTransaction: INCR transaction %p completed", this);
-#endif
- xcb_change_property(c, XCB_PROP_MODE_REPLACE, win, property,
- target, format, 0, (const void *)0);
- const quint32 values[] = { XCB_EVENT_MASK_NO_EVENT };
- xcb_change_window_attributes(conn->xcb_connection(), win,
- XCB_CW_EVENT_MASK, values);
- // self destroy
- delete this;
- }
- }
- }
+ // restart the timer
+ if (m_abortTimerId)
+ killTimer(m_abortTimerId);
+ m_abortTimerId = startTimer(m_clipboard->clipboardTimeout());
-protected:
- void timerEvent(QTimerEvent *ev) override
- {
- if (ev->timerId() == abort_timer) {
- // this can happen when the X client we are sending data
- // to decides to exit (normally or abnormally)
-#ifdef INCR_DEBUG
- qDebug("INCRTransaction: Timed out while sending data to %p", this);
-#endif
- delete this;
- }
+ uint bytes_left = uint(m_data.size()) - m_offset;
+ if (bytes_left > 0) {
+ int increment = m_clipboard->increment();
+ uint bytes_to_send = qMin(uint(increment), bytes_left);
+
+ qCDebug(lcQpaClipboard, "sending %d bytes, %d remaining, transaction: %p)",
+ bytes_to_send, bytes_left - bytes_to_send, this);
+
+ uint32_t dataSize = bytes_to_send / (m_format / 8);
+ xcb_change_property(m_clipboard->xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+ m_property, m_target, m_format, dataSize, m_data.constData() + m_offset);
+ m_offset += bytes_to_send;
+ } else {
+ qCDebug(lcQpaClipboard, "transaction %p completed", this);
+
+ xcb_change_property(m_clipboard->xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+ m_property, m_target, m_format, 0, nullptr);
+
+ const quint32 values[] = { XCB_EVENT_MASK_NO_EVENT };
+ xcb_change_window_attributes(m_clipboard->xcb_connection(), m_window,
+ XCB_CW_EVENT_MASK, values);
+ delete this; // self destroy
}
+ return true;
+}
-private:
- QXcbConnection *conn;
- xcb_window_t win;
- xcb_atom_t property;
- QByteArray data;
- uint increment;
- xcb_atom_t target;
- int format;
- int timeout;
- uint offset;
- int abort_timer;
-};
-} // unnamed namespace
+
+void QXcbClipboardTransaction::timerEvent(QTimerEvent *ev)
+{
+ if (ev->timerId() == m_abortTimerId) {
+ // this can happen when the X client we are sending data
+ // to decides to exit (normally or abnormally)
+ qCDebug(lcQpaClipboard, "timed out while sending data to %p", this);
+ delete this; // self destroy
+ }
+}
const int QXcbClipboard::clipboard_timeout = 5000;
@@ -282,6 +239,9 @@ QXcbClipboard::QXcbClipboard(QXcbConnection *c)
xcb_xfixes_select_selection_input_checked(xcb_connection(), m_owner, XCB_ATOM_PRIMARY, mask);
xcb_xfixes_select_selection_input_checked(xcb_connection(), m_owner, atom(QXcbAtom::CLIPBOARD), mask);
}
+
+ // change property protocol request is 24 bytes
+ m_increment = (xcb_get_maximum_request_length(xcb_connection()) * 4) - 24;
}
QXcbClipboard::~QXcbClipboard()
@@ -313,16 +273,17 @@ QXcbClipboard::~QXcbClipboard()
delete m_clientClipboard[QClipboard::Selection];
}
-void QXcbClipboard::incrTransactionPeeker(xcb_generic_event_t *ge, bool &accepted)
+bool QXcbClipboard::handlePropertyNotify(const xcb_generic_event_t *event)
{
- uint response_type = ge->response_type & ~0x80;
- if (response_type == XCB_PROPERTY_NOTIFY) {
- xcb_property_notify_event_t *event = (xcb_property_notify_event_t *)ge;
- TransactionMap::Iterator it = transactions->find(event->window);
- if (it != transactions->end()) {
- (*it)->updateIncrProperty(event, accepted);
- }
- }
+ if (m_transactions.isEmpty() || event->response_type != XCB_PROPERTY_NOTIFY)
+ return false;
+
+ auto propertyNotify = reinterpret_cast<const xcb_property_notify_event_t *>(event);
+ TransactionMap::Iterator it = m_transactions.find(propertyNotify->window);
+ if (it == m_transactions.constEnd())
+ return false;
+
+ return (*it)->updateIncrementalProperty(propertyNotify);
}
xcb_window_t QXcbClipboard::getSelectionOwner(xcb_atom_t atom) const
@@ -522,19 +483,18 @@ xcb_atom_t QXcbClipboard::sendSelection(QMimeData *d, xcb_atom_t target, xcb_win
// This 'bool' can be removed once there is a proper fix for QTBUG-32853
if (m_clipboard_closing)
allow_incr = false;
- // X_ChangeProperty protocol request is 24 bytes
- const int increment = (xcb_get_maximum_request_length(xcb_connection()) * 4) - 24;
- if (data.size() > increment && allow_incr) {
+
+ if (data.size() > m_increment && allow_incr) {
long bytes = data.size();
xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, window, property,
atom(QXcbAtom::INCR), 32, 1, (const void *)&bytes);
- new INCRTransaction(connection(), window, property, data, increment,
- atomFormat, dataFormat, clipboard_timeout);
+ auto transaction = new QXcbClipboardTransaction(this, window, property, data, atomFormat, dataFormat);
+ m_transactions.insert(window, transaction);
return property;
}
// make sure we can perform the XChangeProperty in a single request
- if (data.size() > increment)
+ if (data.size() > m_increment)
return XCB_NONE; // ### perhaps use several XChangeProperty calls w/ PropModeAppend?
int dataSize = data.size() / (dataFormat / 8);
// use a single request to transfer data
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.h b/src/plugins/platforms/xcb/qxcbclipboard.h
index abab42a613..26d3b3b395 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.h
+++ b/src/plugins/platforms/xcb/qxcbclipboard.h
@@ -45,14 +45,41 @@
#include <xcb/xcb.h>
#include <xcb/xfixes.h>
+#include <QtCore/QObject>
+
QT_BEGIN_NAMESPACE
#ifndef QT_NO_CLIPBOARD
class QXcbConnection;
class QXcbScreen;
+class QXcbClipboard;
class QXcbClipboardMime;
+class QXcbClipboardTransaction : public QObject
+{
+ Q_OBJECT
+public:
+ QXcbClipboardTransaction(QXcbClipboard *clipboard, xcb_window_t w, xcb_atom_t p,
+ QByteArray d, xcb_atom_t t, int f);
+ ~QXcbClipboardTransaction();
+
+ bool updateIncrementalProperty(const xcb_property_notify_event_t *event);
+
+protected:
+ void timerEvent(QTimerEvent *ev) override;
+
+private:
+ QXcbClipboard *m_clipboard;
+ xcb_window_t m_window;
+ xcb_atom_t m_property;
+ QByteArray m_data;
+ xcb_atom_t m_target;
+ uint8_t m_format;
+ uint m_offset = 0;
+ int m_abortTimerId = 0;
+};
+
class QXcbClipboard : public QXcbObject, public QPlatformClipboard
{
public:
@@ -81,13 +108,16 @@ public:
QByteArray getDataInFormat(xcb_atom_t modeAtom, xcb_atom_t fmtatom);
- void setProcessIncr(bool process) { m_incr_active = process; }
- bool processIncr() { return m_incr_active; }
- void incrTransactionPeeker(xcb_generic_event_t *ge, bool &accepted);
+ bool handlePropertyNotify(const xcb_generic_event_t *event);
xcb_window_t getSelectionOwner(xcb_atom_t atom) const;
QByteArray getSelection(xcb_atom_t selection, xcb_atom_t target, xcb_atom_t property, xcb_timestamp_t t = 0);
+ int increment() const { return m_increment; }
+ int clipboardTimeout() const { return clipboard_timeout; }
+
+ void removeTransaction(xcb_window_t window) { m_transactions.remove(window); }
+
private:
xcb_generic_event_t *waitForClipboardEvent(xcb_window_t window, int type, bool checkManager = false);
@@ -107,9 +137,12 @@ private:
static const int clipboard_timeout;
- bool m_incr_active = false;
+ int m_increment = 0;
bool m_clipboard_closing = false;
xcb_timestamp_t m_incr_receive_time = 0;
+
+ using TransactionMap = QMap<xcb_window_t, QXcbClipboardTransaction *>;
+ TransactionMap m_transactions;
};
#endif // QT_NO_CLIPBOARD
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 45f096a13a..37ee980924 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -84,6 +84,7 @@ Q_LOGGING_CATEGORY(lcQpaEvents, "qt.qpa.events")
Q_LOGGING_CATEGORY(lcQpaEventReader, "qt.qpa.events.reader")
Q_LOGGING_CATEGORY(lcQpaPeeker, "qt.qpa.peeker")
Q_LOGGING_CATEGORY(lcQpaKeyboard, "qt.qpa.xkeyboard")
+Q_LOGGING_CATEGORY(lcQpaClipboard, "qt.qpa.clipboard")
Q_LOGGING_CATEGORY(lcQpaXDnd, "qt.qpa.xdnd")
// this event type was added in libxcb 1.10,
@@ -651,6 +652,10 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
break;
case XCB_PROPERTY_NOTIFY:
{
+#ifndef QT_NO_CLIPBOARD
+ if (m_clipboard->handlePropertyNotify(event))
+ break;
+#endif
auto propertyNotify = reinterpret_cast<xcb_property_notify_event_t *>(event);
if (propertyNotify->atom == atom(QXcbAtom::_NET_WORKAREA)) {
QXcbVirtualDesktop *virtualDesktop = virtualDesktopForRootWindow(propertyNotify->window);
@@ -1010,14 +1015,6 @@ void QXcbConnection::processXcbEvents(QEventLoop::ProcessEventsFlags flags)
if (compressEvent(event))
continue;
-#ifndef QT_NO_CLIPBOARD
- bool accepted = false;
- if (clipboard()->processIncr())
- clipboard()->incrTransactionPeeker(event, accepted);
- if (accepted)
- continue;
-#endif
-
auto isWaitingFor = [=](PeekFunc peekFunc) {
// These callbacks return true if the event is what they were
// waiting for, remove them from the list in that case.
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 5d53b97d37..47036ca257 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -68,6 +68,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcQpaScreen)
Q_DECLARE_LOGGING_CATEGORY(lcQpaEvents)
Q_DECLARE_LOGGING_CATEGORY(lcQpaPeeker)
Q_DECLARE_LOGGING_CATEGORY(lcQpaKeyboard)
+Q_DECLARE_LOGGING_CATEGORY(lcQpaClipboard)
Q_DECLARE_LOGGING_CATEGORY(lcQpaXDnd)
Q_DECLARE_LOGGING_CATEGORY(lcQpaEventReader)
diff --git a/src/plugins/platforms/xcb/qxcbeventdispatcher.h b/src/plugins/platforms/xcb/qxcbeventdispatcher.h
index 6aadd63a70..ddf448cf87 100644
--- a/src/plugins/platforms/xcb/qxcbeventdispatcher.h
+++ b/src/plugins/platforms/xcb/qxcbeventdispatcher.h
@@ -107,9 +107,6 @@ class QXcbEventDispatcher
{
public:
static QAbstractEventDispatcher *createEventDispatcher(QXcbConnection *connection);
-
-private:
- QXcbConnection *m_connection;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 70aab77a51..891fe6b155 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -755,7 +755,7 @@ void QXcbWindow::show()
xcb_delete_property(xcb_connection(), m_window, XCB_ATOM_WM_TRANSIENT_FOR);
// update _NET_WM_STATE
- updateNetWmStateBeforeMap();
+ setNetWmStateOnUnmappedWindow();
}
// QWidget-attribute Qt::WA_ShowWithoutActivating.
@@ -963,46 +963,6 @@ QXcbWindow::NetWmStates QXcbWindow::netWmStates()
return result;
}
-void QXcbWindow::setNetWmStates(NetWmStates states)
-{
- QVector<xcb_atom_t> atoms;
-
- auto reply = Q_XCB_REPLY_UNCHECKED(xcb_get_property, xcb_connection(),
- 0, m_window, atom(QXcbAtom::_NET_WM_STATE),
- XCB_ATOM_ATOM, 0, 1024);
- if (reply && reply->format == 32 && reply->type == XCB_ATOM_ATOM && reply->value_len > 0) {
- const xcb_atom_t *data = static_cast<const xcb_atom_t *>(xcb_get_property_value(reply.get()));
- atoms.resize(reply->value_len);
- memcpy((void *)&atoms.first(), (void *)data, reply->value_len * sizeof(xcb_atom_t));
- }
-
- if (states & NetWmStateAbove && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_ABOVE)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_ABOVE));
- if (states & NetWmStateBelow && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_BELOW)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_BELOW));
- if (states & NetWmStateFullScreen && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
- if (states & NetWmStateMaximizedHorz && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ));
- if (states & NetWmStateMaximizedVert && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
- if (states & NetWmStateModal && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MODAL)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MODAL));
- if (states & NetWmStateStaysOnTop && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
- if (states & NetWmStateDemandsAttention && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION)))
- atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
-
- if (atoms.isEmpty()) {
- xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_NET_WM_STATE));
- } else {
- xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
- atom(QXcbAtom::_NET_WM_STATE), XCB_ATOM_ATOM, 32,
- atoms.count(), atoms.constData());
- }
- xcb_flush(xcb_connection());
-}
-
void QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
{
Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
@@ -1029,7 +989,7 @@ void QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
}
setWmWindowType(wmWindowTypes, flags);
- setNetWmStateWindowFlags(flags);
+ setNetWmState(flags);
setMotifWmHints(flags);
setTransparentForMouseEvents(flags & Qt::WindowTransparentForInput);
@@ -1113,7 +1073,7 @@ void QXcbWindow::setMotifWmHints(Qt::WindowFlags flags)
}
}
-void QXcbWindow::changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
+void QXcbWindow::setNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
{
xcb_client_message_event_t event;
@@ -1133,6 +1093,96 @@ void QXcbWindow::changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
(const char *)&event);
}
+void QXcbWindow::setNetWmState(Qt::WindowStates state)
+{
+ if ((m_windowState ^ state) & Qt::WindowMaximized) {
+ setNetWmState(state & Qt::WindowMaximized,
+ atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ),
+ atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
+ }
+
+ if ((m_windowState ^ state) & Qt::WindowFullScreen)
+ setNetWmState(state & Qt::WindowFullScreen, atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
+}
+
+void QXcbWindow::setNetWmState(Qt::WindowFlags flags)
+{
+ setNetWmState(flags & Qt::WindowStaysOnTopHint,
+ atom(QXcbAtom::_NET_WM_STATE_ABOVE),
+ atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
+ setNetWmState(flags & Qt::WindowStaysOnBottomHint, atom(QXcbAtom::_NET_WM_STATE_BELOW));
+}
+
+void QXcbWindow::setNetWmStateOnUnmappedWindow()
+{
+ if (Q_UNLIKELY(m_mapped))
+ qCWarning(lcQpaXcb()) << "internal error: " << Q_FUNC_INFO << "called on mapped window";
+
+ NetWmStates states(0);
+ const Qt::WindowFlags flags = window()->flags();
+ if (flags & Qt::WindowStaysOnTopHint) {
+ states |= NetWmStateAbove;
+ states |= NetWmStateStaysOnTop;
+ } else if (flags & Qt::WindowStaysOnBottomHint) {
+ states |= NetWmStateBelow;
+ }
+
+ if (window()->windowStates() & Qt::WindowFullScreen)
+ states |= NetWmStateFullScreen;
+
+ if (window()->windowStates() & Qt::WindowMaximized) {
+ states |= NetWmStateMaximizedHorz;
+ states |= NetWmStateMaximizedVert;
+ }
+
+ if (window()->modality() != Qt::NonModal)
+ states |= NetWmStateModal;
+
+ // According to EWMH:
+ // "The Window Manager should remove _NET_WM_STATE whenever a window is withdrawn".
+ // Which means that we don't have to read this property before changing it on a withdrawn
+ // window. But there are situations where users want to adjust this property as well
+ // (e4cea305ed2ba3c9f580bf9d16c59a1048af0e8a), so instead of overwriting the property
+ // we first read it and then merge our hints with the existing values, allowing a user
+ // to set custom hints.
+
+ QVector<xcb_atom_t> atoms;
+ auto reply = Q_XCB_REPLY_UNCHECKED(xcb_get_property, xcb_connection(),
+ 0, m_window, atom(QXcbAtom::_NET_WM_STATE),
+ XCB_ATOM_ATOM, 0, 1024);
+ if (reply && reply->format == 32 && reply->type == XCB_ATOM_ATOM && reply->value_len > 0) {
+ const xcb_atom_t *data = static_cast<const xcb_atom_t *>(xcb_get_property_value(reply.get()));
+ atoms.resize(reply->value_len);
+ memcpy((void *)&atoms.first(), (void *)data, reply->value_len * sizeof(xcb_atom_t));
+ }
+
+ if (states & NetWmStateAbove && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_ABOVE)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_ABOVE));
+ if (states & NetWmStateBelow && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_BELOW)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_BELOW));
+ if (states & NetWmStateFullScreen && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
+ if (states & NetWmStateMaximizedHorz && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ));
+ if (states & NetWmStateMaximizedVert && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
+ if (states & NetWmStateModal && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MODAL)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MODAL));
+ if (states & NetWmStateStaysOnTop && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
+ if (states & NetWmStateDemandsAttention && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION)))
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
+
+ if (atoms.isEmpty()) {
+ xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_NET_WM_STATE));
+ } else {
+ xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+ atom(QXcbAtom::_NET_WM_STATE), XCB_ATOM_ATOM, 32,
+ atoms.count(), atoms.constData());
+ }
+ xcb_flush(xcb_connection());
+}
+
void QXcbWindow::setWindowState(Qt::WindowStates state)
{
if (state == m_windowState)
@@ -1160,14 +1210,7 @@ void QXcbWindow::setWindowState(Qt::WindowStates state)
m_minimized = true;
}
- if ((m_windowState ^ state) & Qt::WindowMaximized) {
- changeNetWmState(state & Qt::WindowMaximized, atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ),
- atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
- }
-
- if ((m_windowState ^ state) & Qt::WindowFullScreen) {
- changeNetWmState(state & Qt::WindowFullScreen, atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
- }
+ setNetWmState(state);
xcb_get_property_cookie_t cookie = xcb_get_wm_hints_unchecked(xcb_connection(), m_window);
xcb_wm_hints_t hints;
@@ -1183,41 +1226,6 @@ void QXcbWindow::setWindowState(Qt::WindowStates state)
m_windowState = state;
}
-void QXcbWindow::updateNetWmStateBeforeMap()
-{
- NetWmStates states(0);
-
- const Qt::WindowFlags flags = window()->flags();
- if (flags & Qt::WindowStaysOnTopHint) {
- states |= NetWmStateAbove;
- states |= NetWmStateStaysOnTop;
- } else if (flags & Qt::WindowStaysOnBottomHint) {
- states |= NetWmStateBelow;
- }
-
- if (window()->windowStates() & Qt::WindowFullScreen)
- states |= NetWmStateFullScreen;
-
- if (window()->windowStates() & Qt::WindowMaximized) {
- states |= NetWmStateMaximizedHorz;
- states |= NetWmStateMaximizedVert;
- }
-
- if (window()->modality() != Qt::NonModal)
- states |= NetWmStateModal;
-
- setNetWmStates(states);
-}
-
-void QXcbWindow::setNetWmStateWindowFlags(Qt::WindowFlags flags)
-{
- changeNetWmState(flags & Qt::WindowStaysOnTopHint,
- atom(QXcbAtom::_NET_WM_STATE_ABOVE),
- atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
- changeNetWmState(flags & Qt::WindowStaysOnBottomHint,
- atom(QXcbAtom::_NET_WM_STATE_BELOW));
-}
-
void QXcbWindow::updateNetWmUserTime(xcb_timestamp_t timestamp)
{
xcb_window_t wid = m_window;
@@ -2590,7 +2598,7 @@ void QXcbWindow::setAlertState(bool enabled)
m_alertState = enabled;
- changeNetWmState(enabled, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
+ setNetWmState(enabled, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
}
uint QXcbWindow::visualId() const
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 6667f45343..f98cd8a74d 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -193,21 +193,19 @@ protected:
void setImageFormatForVisual(const xcb_visualtype_t *visual);
QXcbScreen *parentScreen();
-
QXcbScreen *initialScreen() const;
- void changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two = 0);
+
+ void setNetWmState(bool set, xcb_atom_t one, xcb_atom_t two = 0);
+ void setNetWmState(Qt::WindowFlags flags);
+ void setNetWmState(Qt::WindowStates state);
+ void setNetWmStateOnUnmappedWindow();
NetWmStates netWmStates();
- void setNetWmStates(NetWmStates);
void setMotifWmHints(Qt::WindowFlags flags);
- void setNetWmStateWindowFlags(Qt::WindowFlags flags);
- void updateNetWmStateBeforeMap();
-
void setTransparentForMouseEvents(bool transparent);
void updateDoesNotAcceptFocus(bool doesNotAcceptFocus);
- QRect windowToWmGeometry(QRect r) const;
void sendXEmbedMessage(xcb_window_t window, quint32 message,
quint32 detail = 0, quint32 data1 = 0, quint32 data2 = 0);
void handleXEmbedMessage(const xcb_client_message_event_t *event);
diff --git a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp
index cda267d24b..5e94d1558e 100644
--- a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp
+++ b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp
@@ -181,10 +181,10 @@ void QXdgDesktopPortalFileDialog::openPortal()
if (d->saveFile) {
if (!d->directory.isEmpty())
- options.insert(QLatin1String("current_folder"), d->directory.toLatin1());
+ options.insert(QLatin1String("current_folder"), d->directory.toLatin1().append('\0'));
if (!d->selectedFiles.isEmpty())
- options.insert(QLatin1String("current_file"), d->selectedFiles.first().toLatin1());
+ options.insert(QLatin1String("current_file"), d->selectedFiles.first().toLatin1().append('\0'));
}
// Insert filters
diff --git a/src/tools/uic/cpp/cpp.pri b/src/tools/uic/cpp/cpp.pri
index a6b6188117..786b0e97a5 100644
--- a/src/tools/uic/cpp/cpp.pri
+++ b/src/tools/uic/cpp/cpp.pri
@@ -1,7 +1,5 @@
INCLUDEPATH += $$PWD $$QT_BUILD_TREE/src/tools/uic
-DEFINES += QT_UIC_CPP_GENERATOR
-
# Input
HEADERS += $$PWD/cppwritedeclaration.h \
$$PWD/cppwriteincludes.h \
diff --git a/src/tools/uic/driver.cpp b/src/tools/uic/driver.cpp
index 6b3a6f8f69..91a48815fd 100644
--- a/src/tools/uic/driver.cpp
+++ b/src/tools/uic/driver.cpp
@@ -256,18 +256,11 @@ bool Driver::uic(const QString &fileName, DomUI *ui, QTextStream *out)
m_output = out != 0 ? out : &m_stdout;
Uic tool(this);
- bool rtn = false;
-#ifdef QT_UIC_CPP_GENERATOR
- rtn = tool.write(ui);
-#else
- Q_UNUSED(ui);
- fprintf(stderr, "uic: option to generate cpp code not compiled in [%s:%d]\n",
- __FILE__, __LINE__);
-#endif
+ const bool result = tool.write(ui);
m_output = oldOutput;
- return rtn;
+ return result;
}
bool Driver::uic(const QString &fileName, QTextStream *out)
diff --git a/src/tools/uic/main.cpp b/src/tools/uic/main.cpp
index 0e30bac28e..ec7ed63af7 100644
--- a/src/tools/uic/main.cpp
+++ b/src/tools/uic/main.cpp
@@ -115,7 +115,6 @@ int runUic(int argc, char *argv[])
driver.option().postfix = parser.value(postfixOption);
driver.option().translateFunction = parser.value(translateOption);
driver.option().includeFile = parser.value(includeOption);
- driver.option().generator = (parser.value(generatorOption).toLower() == QLatin1String("java")) ? Option::JavaGenerator : Option::CppGenerator;
if (parser.isSet(noStringLiteralOption))
fprintf(stderr, "The -s, --no-stringliteral option is deprecated and it won't take any effect.\n");
diff --git a/src/tools/uic/option.h b/src/tools/uic/option.h
index a5b14abc5f..4fc442e94a 100644
--- a/src/tools/uic/option.h
+++ b/src/tools/uic/option.h
@@ -36,12 +36,6 @@ QT_BEGIN_NAMESPACE
struct Option
{
- enum Generator
- {
- CppGenerator,
- JavaGenerator
- };
-
unsigned int headerProtection : 1;
unsigned int copyrightHeader : 1;
unsigned int generateImplemetation : 1;
@@ -51,7 +45,6 @@ struct Option
unsigned int limitXPM_LineLength : 1;
unsigned int implicitIncludes: 1;
unsigned int idBased: 1;
- Generator generator;
QString inputFile;
QString outputFile;
@@ -61,10 +54,6 @@ struct Option
QString postfix;
QString translateFunction;
QString includeFile;
-#ifdef QT_UIC_JAVA_GENERATOR
- QString javaPackage;
- QString javaOutputDirectory;
-#endif
Option()
: headerProtection(1),
@@ -76,7 +65,6 @@ struct Option
limitXPM_LineLength(0),
implicitIncludes(1),
idBased(0),
- generator(CppGenerator),
prefix(QLatin1String("Ui_"))
{ indent.fill(QLatin1Char(' '), 4); }
diff --git a/src/tools/uic/uic.cpp b/src/tools/uic/uic.cpp
index f275aaeb29..a5b331192f 100644
--- a/src/tools/uic/uic.cpp
+++ b/src/tools/uic/uic.cpp
@@ -33,18 +33,12 @@
#include "treewalker.h"
#include "validator.h"
-#ifdef QT_UIC_CPP_GENERATOR
#include "cppwriteincludes.h"
#include "cppwritedeclaration.h"
-#endif
-
-#ifdef QT_UIC_JAVA_GENERATOR
-#include "javawriteincludes.h"
-#include "javawritedeclaration.h"
-#endif
#include <qxmlstream.h>
#include <qfileinfo.h>
+#include <qscopedpointer.h>
#include <qtextstream.h>
QT_BEGIN_NAMESPACE
@@ -172,65 +166,33 @@ DomUI *Uic::parseUiFile(QXmlStreamReader &reader)
bool Uic::write(QIODevice *in)
{
- if (option().generator == Option::JavaGenerator) {
- // the Java generator ignores header protection
- opt.headerProtection = false;
- }
-
- DomUI *ui = 0;
+ QScopedPointer<DomUI> ui;
{
QXmlStreamReader reader;
reader.setDevice(in);
- ui = parseUiFile(reader);
-
- if (!ui)
- return false;
+ ui.reset(parseUiFile(reader));
}
+ if (ui.isNull())
+ return false;
+
double version = ui->attributeVersion().toDouble();
if (version < 4.0) {
- delete ui;
-
fprintf(stderr, "uic: File generated with too old version of Qt Designer\n");
return false;
}
- QString language = ui->attributeLanguage();
+ const QString &language = ui->attributeLanguage();
driver()->setUseIdBasedTranslations(ui->attributeIdbasedtr());
- bool rtn = false;
-
- if (option().generator == Option::JavaGenerator) {
-#ifdef QT_UIC_JAVA_GENERATOR
- if (language.toLower() != QLatin1String("jambi")) {
- fprintf(stderr, "uic: File is not a 'jambi' form\n");
- delete ui;
- return false;
- }
- rtn = jwrite (ui);
-#else
- fprintf(stderr, "uic: option to generate java code not compiled in\n");
-#endif
- } else {
-#ifdef QT_UIC_CPP_GENERATOR
- if (!language.isEmpty() && language.toLower() != QLatin1String("c++")) {
- fprintf(stderr, "uic: File is not a 'c++' ui file, language=%s\n", qPrintable(language));
- delete ui;
- return false;
- }
-
- rtn = write (ui);
-#else
- fprintf(stderr, "uic: option to generate cpp code not compiled in\n");
-#endif
+ if (!language.isEmpty() && language.compare(QLatin1String("c++"), Qt::CaseInsensitive) != 0) {
+ fprintf(stderr, "uic: File is not a \"c++\" ui file, language=%s\n", qPrintable(language));
+ return false;
}
- delete ui;
-
- return rtn;
+ return write(ui.data());
}
-#ifdef QT_UIC_CPP_GENERATOR
bool Uic::write(DomUI *ui)
{
using namespace CPP;
@@ -267,37 +229,6 @@ bool Uic::write(DomUI *ui)
return true;
}
-#endif
-
-#ifdef QT_UIC_JAVA_GENERATOR
-bool Uic::jwrite(DomUI *ui)
-{
- using namespace Java;
-
- if (!ui || !ui->elementWidget())
- return false;
-
- if (opt.copyrightHeader)
- writeCopyrightHeader(ui);
-
- pixFunction = ui->elementPixmapFunction();
- if (pixFunction == QLatin1String("QPixmap::fromMimeSource"))
- pixFunction = QLatin1String("qPixmapFromMimeSource");
-
- externalPix = ui->elementImages() == 0;
-
- info.acceptUI(ui);
- cWidgetsInfo.acceptUI(ui);
- WriteIncludes(this).acceptUI(ui);
-
- Validator(this).acceptUI(ui);
- WriteDeclaration(this).acceptUI(ui);
-
- return true;
-}
-#endif
-
-#ifdef QT_UIC_CPP_GENERATOR
void Uic::writeHeaderProtectionStart()
{
@@ -311,7 +242,6 @@ void Uic::writeHeaderProtectionEnd()
QString h = drv->headerFileName();
out << "#endif // " << h << "\n";
}
-#endif
bool Uic::isMainWindow(const QString &className) const
{
diff --git a/src/tools/uic/uic.h b/src/tools/uic/uic.h
index 1c229bc516..4c961aa0a5 100644
--- a/src/tools/uic/uic.h
+++ b/src/tools/uic/uic.h
@@ -83,13 +83,7 @@ public:
bool write(QIODevice *in);
-#ifdef QT_UIC_JAVA_GENERATOR
- bool jwrite(DomUI *ui);
-#endif
-
-#ifdef QT_UIC_CPP_GENERATOR
bool write(DomUI *ui);
-#endif
bool isMainWindow(const QString &className) const;
bool isToolBar(const QString &className) const;
@@ -105,11 +99,9 @@ private:
void writeCopyrightHeader(DomUI *ui);
DomUI *parseUiFile(QXmlStreamReader &reader);
-#ifdef QT_UIC_CPP_GENERATOR
// header protection
void writeHeaderProtectionStart();
void writeHeaderProtectionEnd();
-#endif
private:
Driver *drv;
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index 4aa680af61..be60ea60b0 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -1851,7 +1851,7 @@ void QColorDialogPrivate::_q_addCustom()
QColorDialogOptions::setCustomColor(nextCust, cs->currentColor());
if (custom)
custom->update();
- nextCust = (nextCust+1) % 16;
+ nextCust = (nextCust+1) % QColorDialogOptions::customColorCount();
}
void QColorDialogPrivate::retranslateStrings()
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 68c6ece583..effc82261b 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -103,6 +103,7 @@ private slots:
void deleteQObjectWhenDeletingEvent();
void overloads();
void isSignalConnected();
+ void isSignalConnectedAfterDisconnection();
void qMetaObjectConnect();
void qMetaObjectDisconnectOne();
void sameName();
@@ -3835,6 +3836,58 @@ void tst_QObject::isSignalConnected()
QVERIFY(!o.isSignalConnected(QMetaMethod()));
}
+void tst_QObject::isSignalConnectedAfterDisconnection()
+{
+ ManySignals o;
+ const QMetaObject *meta = o.metaObject();
+
+ const QMetaMethod sig00 = meta->method(meta->indexOfSignal("sig00()"));
+ QVERIFY(!o.isSignalConnected(sig00));
+ QObject::connect(&o, &ManySignals::sig00, qt_noop);
+ QVERIFY(o.isSignalConnected(sig00));
+ QVERIFY(QObject::disconnect(&o, &ManySignals::sig00, 0, 0));
+ QVERIFY(!o.isSignalConnected(sig00));
+
+ const QMetaMethod sig69 = meta->method(meta->indexOfSignal("sig69()"));
+ QVERIFY(!o.isSignalConnected(sig69));
+ QObject::connect(&o, &ManySignals::sig69, qt_noop);
+ QVERIFY(o.isSignalConnected(sig69));
+ QVERIFY(QObject::disconnect(&o, &ManySignals::sig69, 0, 0));
+ QVERIFY(!o.isSignalConnected(sig69));
+
+ {
+ ManySignals o2;
+ QObject::connect(&o, &ManySignals::sig00, &o2, &ManySignals::sig00);
+ QVERIFY(o.isSignalConnected(sig00));
+ // o2 is destructed
+ }
+ QVERIFY(!o.isSignalConnected(sig00));
+
+ const QMetaMethod sig01 = meta->method(meta->indexOfSignal("sig01()"));
+ QObject::connect(&o, &ManySignals::sig00, qt_noop);
+ QObject::connect(&o, &ManySignals::sig01, qt_noop);
+ QObject::connect(&o, &ManySignals::sig69, qt_noop);
+ QVERIFY(o.isSignalConnected(sig00));
+ QVERIFY(o.isSignalConnected(sig01));
+ QVERIFY(o.isSignalConnected(sig69));
+ QVERIFY(QObject::disconnect(&o, &ManySignals::sig69, 0, 0));
+ QVERIFY(o.isSignalConnected(sig00));
+ QVERIFY(o.isSignalConnected(sig01));
+ QVERIFY(!o.isSignalConnected(sig69));
+ QVERIFY(QObject::disconnect(&o, &ManySignals::sig00, 0, 0));
+ QVERIFY(!o.isSignalConnected(sig00));
+ QVERIFY(o.isSignalConnected(sig01));
+ QVERIFY(!o.isSignalConnected(sig69));
+ QObject::connect(&o, &ManySignals::sig69, qt_noop);
+ QVERIFY(!o.isSignalConnected(sig00));
+ QVERIFY(o.isSignalConnected(sig01));
+ QVERIFY(o.isSignalConnected(sig69));
+ QVERIFY(QObject::disconnect(&o, &ManySignals::sig01, 0, 0));
+ QVERIFY(!o.isSignalConnected(sig00));
+ QVERIFY(!o.isSignalConnected(sig01));
+ QVERIFY(o.isSignalConnected(sig69));
+}
+
void tst_QObject::qMetaObjectConnect()
{
SenderObject *s = new SenderObject;
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 0780fb9172..4da34c407e 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -525,6 +525,12 @@ void tst_QVariant::canConvert_data()
var = QVariant::fromValue<signed char>(-1);
QTest::newRow("SChar")
<< var << N << N << Y << N << Y << N << N << N << N << Y << N << N << Y << N << N << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y;
+ var = QVariant((short)-3);
+ QTest::newRow("Short")
+ << var << N << N << Y << N << Y << N << N << N << N << Y << N << N << Y << N << Y << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y;
+ var = QVariant((ushort)7);
+ QTest::newRow("UShort")
+ << var << N << N << Y << N << Y << N << N << N << N << Y << N << N << Y << N << Y << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y;
var = QVariant::fromValue<QJsonValue>(QJsonValue(QStringLiteral("hello")));
QTest::newRow("JsonValue")
<< var << N << N << Y << N << N << N << N << N << N << Y << N << N << Y << N << N << Y << Y << Y << N << N << N << N << N << N << N << N << Y << N << N << Y << Y;
@@ -563,6 +569,8 @@ void tst_QVariant::toInt_data()
QTest::newRow( "char" ) << QVariant::fromValue('a') << int('a') << true;
signed char signedChar = -13;
QTest::newRow( "signed char" ) << QVariant::fromValue(signedChar) << -13 << true;
+ QTest::newRow( "short" ) << QVariant::fromValue(short(-7)) << int(-7) << true;
+ QTest::newRow( "ushort" ) << QVariant::fromValue(ushort(30000)) << 30000 << true;
QTest::newRow( "double" ) << QVariant( 3.1415927 ) << 3 << true;
QTest::newRow( "float" ) << QVariant( 3.1415927f ) << 3 << true;
QTest::newRow( "uint" ) << QVariant( 123u ) << 123 << true;
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
index 597d51e7e0..9df52887f7 100644
--- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
@@ -992,6 +992,20 @@ void tst_QMimeDatabase::installNewGlobalMimeType()
const QString fooTestFile2 = QLatin1String(RESOURCE_PREFIX "magic-and-hierarchy2.foo");
QCOMPARE(db.mimeTypeForFile(fooTestFile2).name(), QString::fromLatin1("application/vnd.qnx.bar-descriptor"));
+ // Test if we can use the default comment
+ {
+ struct RestoreLocale
+ {
+ ~RestoreLocale() { QLocale::setDefault(QLocale::c()); }
+ } restoreLocale;
+
+ QLocale::setDefault(QLocale("zh_CN"));
+ QMimeType suseymp = db.mimeTypeForName("text/x-suse-ymp");
+ QVERIFY(suseymp.isValid());
+ QCOMPARE(suseymp.comment(),
+ QString::fromLatin1("YaST Meta Package"));
+ }
+
// Now test removing the mimetype definitions again
for (int i = 0; i < m_additionalMimeFileNames.size(); ++i)
QFile::remove(destDir + m_additionalMimeFileNames.at(i));
diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
index 38b26e7de4..4b753eab6b 100644
--- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
+++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
@@ -330,7 +330,7 @@ void tst_QCborValue::copyCompare()
QCOMPARE(v, other);
QVERIFY(!(v != other));
QVERIFY(!(v < other));
-#if QT_HAS_INCLUDE(<compare>)
+#if 0 && QT_HAS_INCLUDE(<compare>)
QVERIFY(v <= other);
QVERIFY(v >= other);
QVERIFY(!(v > other));
diff --git a/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp b/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
index f520e9742a..18098f16bf 100644
--- a/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
+++ b/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
@@ -2108,12 +2108,16 @@ void tst_QRegularExpression::threadSafety_data()
QTest::addRow("pattern%d", ++i) << "ab.*cd" << subject;
}
+ // pcre2 does not support JIT for winrt. As this test row takes a long time without JIT we skip
+ // it for winrt as it might time out in COIN.
+#ifndef Q_OS_WINRT
{
QString subject = "ab";
subject.append(QString(512*1024, QLatin1Char('x')));
subject.append("c");
QTest::addRow("pattern%d", ++i) << "ab.*cd" << subject;
}
+#endif // Q_OS_WINRT
{
QString subject = "ab";
diff --git a/tests/auto/gui/kernel/qwindow/BLACKLIST b/tests/auto/gui/kernel/qwindow/BLACKLIST
index e9a0d44ba7..f54865b841 100644
--- a/tests/auto/gui/kernel/qwindow/BLACKLIST
+++ b/tests/auto/gui/kernel/qwindow/BLACKLIST
@@ -40,6 +40,7 @@ android
[exposeEventOnShrink_QTBUG54040]
# QTBUG-69155
android
+opensuse
[initialSize]
# QTBUG-69159
android
diff --git a/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp b/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp
index 47d24ce171..48594b2fa1 100644
--- a/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp
+++ b/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp
@@ -502,6 +502,8 @@ void tst_QAccessibilityLinux::testSlider()
void tst_QAccessibilityLinux::testFocus()
{
+ m_window->activateWindow();
+ QVERIFY(QTest::qWaitForWindowActive(m_window));
QLineEdit *lineEdit1 = new QLineEdit(m_window);
lineEdit1->setText("lineEdit 1");
QLineEdit *lineEdit2 = new QLineEdit(m_window);
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index 4ce1009c90..c4cf2e752f 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -633,13 +633,20 @@ void tst_QSqlQuery::bindBool()
QVERIFY_SQL(q, exec());
}
- QVERIFY_SQL(q, exec("SELECT id, flag FROM " + tableName));
+ QVERIFY_SQL(q, exec("SELECT id, flag FROM " + tableName + " ORDER BY id"));
for (int i = 0; i < 2; ++i) {
bool flag = i;
QVERIFY_SQL(q, next());
QCOMPARE(q.value(0).toInt(), i);
QCOMPARE(q.value(1).toBool(), flag);
}
+ QVERIFY_SQL(q, prepare("SELECT flag FROM " + tableName + " WHERE flag = :filter"));
+ const bool filter = true;
+ q.bindValue(":filter", filter);
+ QVERIFY_SQL(q, exec());
+ QVERIFY_SQL(q, next());
+ QCOMPARE(q.value(0).toBool(), filter);
+ QFAIL_SQL(q, next());
QVERIFY_SQL(q, exec("DROP TABLE " + tableName));
}