Update to 5.6.1
This commit is contained in:
parent
14526fb832
commit
9e956f03e6
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,3 +3,4 @@
|
||||
/qtbase-opensource-src-5.6.0-rc.tar.xz
|
||||
/sources
|
||||
/qtbase-opensource-src-5.6.0.tar.xz
|
||||
/qtbase-opensource-src-5.6.1.tar.xz
|
||||
|
@ -1,178 +0,0 @@
|
||||
From 8dc55367ca3993f465f270ef79c2cb212d821d0c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <spaz16@wp.pl>
|
||||
Date: Mon, 8 Feb 2016 15:02:17 +0100
|
||||
Subject: [PATCH 058/328] QtGui: Avoid rgba64->rgba32 conversion on every pixel
|
||||
in gradient
|
||||
|
||||
Convert rgba64 color table to a new rgb32 color table only once. Use
|
||||
this cache when required.
|
||||
|
||||
This patch can 2x speed up gradient painting using 32bit color format.
|
||||
|
||||
Task-number: QTBUG-50930
|
||||
Change-Id: I9212e01e397c2e0127cdf3070cc49880a2d8df88
|
||||
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
|
||||
---
|
||||
src/gui/painting/qdrawhelper.cpp | 4 ++--
|
||||
src/gui/painting/qdrawhelper_p.h | 9 ++++----
|
||||
src/gui/painting/qpaintengine_raster.cpp | 38 ++++++++++++++++++++++++--------
|
||||
3 files changed, 36 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
|
||||
index 28c7099..f0e5810 100644
|
||||
--- a/src/gui/painting/qdrawhelper.cpp
|
||||
+++ b/src/gui/painting/qdrawhelper.cpp
|
||||
@@ -3433,13 +3433,13 @@ static SourceFetchProc64 sourceFetch64[NBlendTypes][QImage::NImageFormats] = {
|
||||
static uint qt_gradient_pixel_fixed(const QGradientData *data, int fixed_pos)
|
||||
{
|
||||
int ipos = (fixed_pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS;
|
||||
- return data->colorTable[qt_gradient_clamp(data, ipos)].toArgb32();
|
||||
+ return data->colorTable32[qt_gradient_clamp(data, ipos)];
|
||||
}
|
||||
|
||||
static const QRgba64& qt_gradient_pixel64_fixed(const QGradientData *data, int fixed_pos)
|
||||
{
|
||||
int ipos = (fixed_pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS;
|
||||
- return data->colorTable[qt_gradient_clamp(data, ipos)];
|
||||
+ return data->colorTable64[qt_gradient_clamp(data, ipos)];
|
||||
}
|
||||
|
||||
static void QT_FASTCALL getLinearGradientValues(LinearGradientValues *v, const QSpanData *data)
|
||||
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
|
||||
index 1ff19f4..ff98d18 100644
|
||||
--- a/src/gui/painting/qdrawhelper_p.h
|
||||
+++ b/src/gui/painting/qdrawhelper_p.h
|
||||
@@ -268,7 +268,8 @@ struct QGradientData
|
||||
#define GRADIENT_STOPTABLE_SIZE 1024
|
||||
#define GRADIENT_STOPTABLE_SIZE_SHIFT 10
|
||||
|
||||
- QRgba64* colorTable; //[GRADIENT_STOPTABLE_SIZE];
|
||||
+ const QRgba64 *colorTable64; //[GRADIENT_STOPTABLE_SIZE];
|
||||
+ const QRgb *colorTable32; //[GRADIENT_STOPTABLE_SIZE];
|
||||
|
||||
uint alphaColor : 1;
|
||||
};
|
||||
@@ -376,13 +377,13 @@ static inline uint qt_gradient_clamp(const QGradientData *data, int ipos)
|
||||
static inline uint qt_gradient_pixel(const QGradientData *data, qreal pos)
|
||||
{
|
||||
int ipos = int(pos * (GRADIENT_STOPTABLE_SIZE - 1) + qreal(0.5));
|
||||
- return data->colorTable[qt_gradient_clamp(data, ipos)].toArgb32();
|
||||
+ return data->colorTable32[qt_gradient_clamp(data, ipos)];
|
||||
}
|
||||
|
||||
static inline const QRgba64& qt_gradient_pixel64(const QGradientData *data, qreal pos)
|
||||
{
|
||||
int ipos = int(pos * (GRADIENT_STOPTABLE_SIZE - 1) + qreal(0.5));
|
||||
- return data->colorTable[qt_gradient_clamp(data, ipos)];
|
||||
+ return data->colorTable64[qt_gradient_clamp(data, ipos)];
|
||||
}
|
||||
|
||||
static inline qreal qRadialDeterminant(qreal a, qreal b, qreal c)
|
||||
@@ -550,7 +551,7 @@ public:
|
||||
delta_det4_vec.v = Simd::v_add(delta_det4_vec.v, v_delta_delta_det16); \
|
||||
b_vec.v = Simd::v_add(b_vec.v, v_delta_b4); \
|
||||
for (int i = 0; i < 4; ++i) \
|
||||
- *buffer++ = (extended_mask | v_buffer_mask.i[i]) & data->gradient.colorTable[index_vec.i[i]].toArgb32(); \
|
||||
+ *buffer++ = (extended_mask | v_buffer_mask.i[i]) & data->gradient.colorTable32[index_vec.i[i]]; \
|
||||
}
|
||||
|
||||
#define FETCH_RADIAL_LOOP(FETCH_RADIAL_LOOP_CLAMP) \
|
||||
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
|
||||
index 05ccff5..fb44a7a 100644
|
||||
--- a/src/gui/painting/qpaintengine_raster.cpp
|
||||
+++ b/src/gui/painting/qpaintengine_raster.cpp
|
||||
@@ -4138,7 +4138,8 @@ class QGradientCache
|
||||
{
|
||||
inline CacheInfo(QGradientStops s, int op, QGradient::InterpolationMode mode) :
|
||||
stops(qMove(s)), opacity(op), interpolationMode(mode) {}
|
||||
- QRgba64 buffer[GRADIENT_STOPTABLE_SIZE];
|
||||
+ QRgba64 buffer64[GRADIENT_STOPTABLE_SIZE];
|
||||
+ QRgb buffer32[GRADIENT_STOPTABLE_SIZE];
|
||||
QGradientStops stops;
|
||||
int opacity;
|
||||
QGradient::InterpolationMode interpolationMode;
|
||||
@@ -4147,7 +4148,9 @@ class QGradientCache
|
||||
typedef QMultiHash<quint64, CacheInfo> QGradientColorTableHash;
|
||||
|
||||
public:
|
||||
- inline const QRgba64 *getBuffer(const QGradient &gradient, int opacity) {
|
||||
+ typedef QPair<const QRgb *, const QRgba64 *> ColorBufferPair;
|
||||
+
|
||||
+ inline ColorBufferPair getBuffer(const QGradient &gradient, int opacity) {
|
||||
quint64 hash_val = 0;
|
||||
|
||||
const QGradientStops stops = gradient.stops();
|
||||
@@ -4163,7 +4166,8 @@ public:
|
||||
do {
|
||||
const CacheInfo &cache_info = it.value();
|
||||
if (cache_info.stops == stops && cache_info.opacity == opacity && cache_info.interpolationMode == gradient.interpolationMode())
|
||||
- return cache_info.buffer;
|
||||
+ return qMakePair(reinterpret_cast<const QRgb *>(cache_info.buffer32),
|
||||
+ reinterpret_cast<const QRgba64 *>(cache_info.buffer64));
|
||||
++it;
|
||||
} while (it != cache.constEnd() && it.key() == hash_val);
|
||||
// an exact match for these stops and opacity was not found, create new cache
|
||||
@@ -4177,14 +4181,18 @@ protected:
|
||||
inline void generateGradientColorTable(const QGradient& g,
|
||||
QRgba64 *colorTable,
|
||||
int size, int opacity) const;
|
||||
- QRgba64 *addCacheElement(quint64 hash_val, const QGradient &gradient, int opacity) {
|
||||
+ ColorBufferPair addCacheElement(quint64 hash_val, const QGradient &gradient, int opacity) {
|
||||
if (cache.size() == maxCacheSize()) {
|
||||
// may remove more than 1, but OK
|
||||
cache.erase(cache.begin() + (qrand() % maxCacheSize()));
|
||||
}
|
||||
CacheInfo cache_entry(gradient.stops(), opacity, gradient.interpolationMode());
|
||||
- generateGradientColorTable(gradient, cache_entry.buffer, paletteSize(), opacity);
|
||||
- return cache.insert(hash_val, cache_entry).value().buffer;
|
||||
+ generateGradientColorTable(gradient, cache_entry.buffer64, paletteSize(), opacity);
|
||||
+ for (int i = 0; i < GRADIENT_STOPTABLE_SIZE; ++i)
|
||||
+ cache_entry.buffer32[i] = cache_entry.buffer64[i].toArgb32();
|
||||
+ CacheInfo &cache_value = cache.insert(hash_val, cache_entry).value();
|
||||
+ return qMakePair(reinterpret_cast<const QRgb *>(cache_value.buffer32),
|
||||
+ reinterpret_cast<const QRgba64 *>(cache_value.buffer64));
|
||||
}
|
||||
|
||||
QGradientColorTableHash cache;
|
||||
@@ -4418,7 +4426,11 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode
|
||||
type = LinearGradient;
|
||||
const QLinearGradient *g = static_cast<const QLinearGradient *>(brush.gradient());
|
||||
gradient.alphaColor = !brush.isOpaque() || alpha != 256;
|
||||
- gradient.colorTable = const_cast<QRgba64*>(qt_gradient_cache()->getBuffer(*g, alpha));
|
||||
+
|
||||
+ QGradientCache::ColorBufferPair colorBuffers = qt_gradient_cache()->getBuffer(*g, alpha);
|
||||
+ gradient.colorTable64 = colorBuffers.second;
|
||||
+ gradient.colorTable32 = colorBuffers.first;
|
||||
+
|
||||
gradient.spread = g->spread();
|
||||
|
||||
QLinearGradientData &linearData = gradient.linear;
|
||||
@@ -4435,7 +4447,11 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode
|
||||
type = RadialGradient;
|
||||
const QRadialGradient *g = static_cast<const QRadialGradient *>(brush.gradient());
|
||||
gradient.alphaColor = !brush.isOpaque() || alpha != 256;
|
||||
- gradient.colorTable = const_cast<QRgba64*>(qt_gradient_cache()->getBuffer(*g, alpha));
|
||||
+
|
||||
+ QGradientCache::ColorBufferPair colorBuffers = qt_gradient_cache()->getBuffer(*g, alpha);
|
||||
+ gradient.colorTable64 = colorBuffers.second;
|
||||
+ gradient.colorTable32 = colorBuffers.first;
|
||||
+
|
||||
gradient.spread = g->spread();
|
||||
|
||||
QRadialGradientData &radialData = gradient.radial;
|
||||
@@ -4456,7 +4472,11 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode
|
||||
type = ConicalGradient;
|
||||
const QConicalGradient *g = static_cast<const QConicalGradient *>(brush.gradient());
|
||||
gradient.alphaColor = !brush.isOpaque() || alpha != 256;
|
||||
- gradient.colorTable = const_cast<QRgba64*>(qt_gradient_cache()->getBuffer(*g, alpha));
|
||||
+
|
||||
+ QGradientCache::ColorBufferPair colorBuffers = qt_gradient_cache()->getBuffer(*g, alpha);
|
||||
+ gradient.colorTable64 = colorBuffers.second;
|
||||
+ gradient.colorTable32 = colorBuffers.first;
|
||||
+
|
||||
gradient.spread = QGradient::RepeatSpread;
|
||||
|
||||
QConicalGradientData &conicalData = gradient.conical;
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,57 +0,0 @@
|
||||
From c689bcafd3196aad22372e8056fe0ccb13c15f35 Mon Sep 17 00:00:00 2001
|
||||
From: Heiko Becker <heirecka@exherbo.org>
|
||||
Date: Fri, 12 Feb 2016 12:37:15 +0100
|
||||
Subject: [PATCH 067/652] Search for libsystemd first, fall back to
|
||||
libsystemd-journal
|
||||
|
||||
systemd >= 209 merged the individual libraries libsystemd-journal,
|
||||
libsystemd-login, libsystemd-id128 and libsystemd-daemon into
|
||||
a single library, libsystemd. To ease the transition one could pass
|
||||
an option to its build to generate stub libraries and matching
|
||||
pkg-config files. With systemd >= 229 this option has now been
|
||||
removed, causing the build to fail when the journald option is
|
||||
enabled.
|
||||
|
||||
Change-Id: I26670f207f1a9e79c16be5ce8c8a49353143c5ba
|
||||
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
|
||||
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
|
||||
---
|
||||
config.tests/unix/journald/journald.pro | 6 +++++-
|
||||
src/corelib/global/global.pri | 5 ++++-
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/config.tests/unix/journald/journald.pro b/config.tests/unix/journald/journald.pro
|
||||
index 2bb50ce..ea76564 100644
|
||||
--- a/config.tests/unix/journald/journald.pro
|
||||
+++ b/config.tests/unix/journald/journald.pro
|
||||
@@ -1,6 +1,10 @@
|
||||
SOURCES = journald.c
|
||||
|
||||
CONFIG += link_pkgconfig
|
||||
-PKGCONFIG_PRIVATE += libsystemd-journal
|
||||
+
|
||||
+packagesExist(libsystemd): \
|
||||
+ PKGCONFIG_PRIVATE += libsystemd
|
||||
+else: \
|
||||
+ PKGCONFIG_PRIVATE += libsystemd-journal
|
||||
|
||||
CONFIG -= qt
|
||||
diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri
|
||||
index aa4945f..dd84695 100644
|
||||
--- a/src/corelib/global/global.pri
|
||||
+++ b/src/corelib/global/global.pri
|
||||
@@ -53,7 +53,10 @@ slog2 {
|
||||
|
||||
journald {
|
||||
CONFIG += link_pkgconfig
|
||||
- PKGCONFIG_PRIVATE += libsystemd-journal
|
||||
+ packagesExist(libsystemd): \
|
||||
+ PKGCONFIG_PRIVATE += libsystemd
|
||||
+ else: \
|
||||
+ PKGCONFIG_PRIVATE += libsystemd-journal
|
||||
DEFINES += QT_USE_JOURNALD
|
||||
}
|
||||
|
||||
--
|
||||
2.7.4
|
||||
|
@ -1,78 +0,0 @@
|
||||
From a3b8e355fc17783a5d4badfb9ad50247655000cd Mon Sep 17 00:00:00 2001
|
||||
From: Anton Kudryavtsev <a.kudryavtsev@netris.ru>
|
||||
Date: Fri, 12 Feb 2016 15:31:07 +0300
|
||||
Subject: [PATCH 076/122] QListView: fix skipping indexes in selectedIndexes().
|
||||
|
||||
Remove spurious increment of i.
|
||||
|
||||
Task-number: QTBUG-51086
|
||||
Change-Id: I4307a6728de1e7f25c8afa31fe2066f92373f3fc
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@theqtcompany.com>
|
||||
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
|
||||
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
|
||||
---
|
||||
src/widgets/itemviews/qlistview.cpp | 2 +-
|
||||
.../widgets/itemviews/qlistview/tst_qlistview.cpp | 28 ++++++++++++++++++++++
|
||||
2 files changed, 29 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp
|
||||
index 9c79509..a17d89e 100644
|
||||
--- a/src/widgets/itemviews/qlistview.cpp
|
||||
+++ b/src/widgets/itemviews/qlistview.cpp
|
||||
@@ -1437,7 +1437,7 @@ QModelIndexList QListView::selectedIndexes() const
|
||||
return QModelIndexList();
|
||||
|
||||
QModelIndexList viewSelected = d->selectionModel->selectedIndexes();
|
||||
- for (int i = 0; i < viewSelected.count(); ++i) {
|
||||
+ for (int i = 0; i < viewSelected.count();) {
|
||||
const QModelIndex &index = viewSelected.at(i);
|
||||
if (!isIndexHidden(index) && index.parent() == d->root && index.column() == d->column)
|
||||
++i;
|
||||
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
|
||||
index 5b206af..3cf9f7f 100644
|
||||
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
|
||||
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
|
||||
@@ -152,6 +152,7 @@ private slots:
|
||||
void taskQTBUG_39902_mutualScrollBars_data();
|
||||
void taskQTBUG_39902_mutualScrollBars();
|
||||
void horizontalScrollingByVerticalWheelEvents();
|
||||
+ void taskQTBUG_51086_skippingIndexesInSelectedIndexes();
|
||||
};
|
||||
|
||||
// Testing get/set functions
|
||||
@@ -2493,5 +2494,32 @@ void tst_QListView::horizontalScrollingByVerticalWheelEvents()
|
||||
QVERIFY(lv.verticalScrollBar()->value() > vValue);
|
||||
}
|
||||
|
||||
+void tst_QListView::taskQTBUG_51086_skippingIndexesInSelectedIndexes()
|
||||
+{
|
||||
+ // simple way to get access to selectedIndexes()
|
||||
+ class QListViewWithPublicSelectedIndexes : public QListView
|
||||
+ {
|
||||
+ public:
|
||||
+ using QListView::selectedIndexes;
|
||||
+ };
|
||||
+
|
||||
+ QStandardItemModel data(10, 1);
|
||||
+ QItemSelectionModel selections(&data);
|
||||
+ QListViewWithPublicSelectedIndexes list;
|
||||
+ list.setModel(&data);
|
||||
+ list.setSelectionModel(&selections);
|
||||
+
|
||||
+ list.setRowHidden(7, true);
|
||||
+ list.setRowHidden(8, true);
|
||||
+
|
||||
+ for (int i = 0, count = data.rowCount(); i < count; ++i)
|
||||
+ selections.select(data.index(i, 0), QItemSelectionModel::Select);
|
||||
+
|
||||
+ const QModelIndexList indexes = list.selectedIndexes();
|
||||
+
|
||||
+ QVERIFY(!indexes.contains(data.index(7, 0)));
|
||||
+ QVERIFY(!indexes.contains(data.index(8, 0)));
|
||||
+}
|
||||
+
|
||||
QTEST_MAIN(tst_QListView)
|
||||
#include "tst_qlistview.moc"
|
||||
--
|
||||
2.5.0
|
||||
|
@ -1,88 +0,0 @@
|
||||
From 78ad8f208d8dbe3575194bb9b97d4e42efdc32d5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <spaz16@wp.pl>
|
||||
Date: Mon, 15 Feb 2016 20:50:16 +0100
|
||||
Subject: [PATCH 087/652] xcb: Fix drag and drop between xcb screens
|
||||
|
||||
Set the proper screen before creating a shaped pixmap window in
|
||||
QBasicDrag::startDrag(). Grab mouse again when D&D window is
|
||||
recreated.
|
||||
|
||||
Task-number: QTBUG-51215
|
||||
Change-Id: I5cb47d3b11672b56d17b32072d84a722bdcdcd9a
|
||||
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
|
||||
---
|
||||
src/gui/kernel/qsimpledrag.cpp | 5 +++--
|
||||
src/gui/kernel/qsimpledrag_p.h | 3 +++
|
||||
src/plugins/platforms/xcb/qxcbdrag.cpp | 4 ++++
|
||||
3 files changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/gui/kernel/qsimpledrag.cpp b/src/gui/kernel/qsimpledrag.cpp
|
||||
index 9f38c9b..00589d2 100644
|
||||
--- a/src/gui/kernel/qsimpledrag.cpp
|
||||
+++ b/src/gui/kernel/qsimpledrag.cpp
|
||||
@@ -88,7 +88,8 @@ static QWindow* topLevelAt(const QPoint &pos)
|
||||
QBasicDrag::QBasicDrag() :
|
||||
m_restoreCursor(false), m_eventLoop(0),
|
||||
m_executed_drop_action(Qt::IgnoreAction), m_can_drop(false),
|
||||
- m_drag(0), m_drag_icon_window(0), m_useCompositing(true)
|
||||
+ m_drag(0), m_drag_icon_window(0), m_useCompositing(true),
|
||||
+ m_screen(Q_NULLPTR)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -211,7 +212,7 @@ void QBasicDrag::startDrag()
|
||||
pos = QPoint();
|
||||
}
|
||||
#endif
|
||||
- recreateShapedPixmapWindow(Q_NULLPTR, pos);
|
||||
+ recreateShapedPixmapWindow(m_screen, pos);
|
||||
enableEventFilter();
|
||||
}
|
||||
|
||||
diff --git a/src/gui/kernel/qsimpledrag_p.h b/src/gui/kernel/qsimpledrag_p.h
|
||||
index 055136c..b208c8c 100644
|
||||
--- a/src/gui/kernel/qsimpledrag_p.h
|
||||
+++ b/src/gui/kernel/qsimpledrag_p.h
|
||||
@@ -90,6 +90,8 @@ protected:
|
||||
bool useCompositing() const { return m_useCompositing; }
|
||||
void setUseCompositing(bool on) { m_useCompositing = on; }
|
||||
|
||||
+ void setScreen(QScreen *screen) { m_screen = screen; }
|
||||
+
|
||||
Qt::DropAction executedDropAction() const { return m_executed_drop_action; }
|
||||
void setExecutedDropAction(Qt::DropAction da) { m_executed_drop_action = da; }
|
||||
|
||||
@@ -108,6 +110,7 @@ private:
|
||||
QDrag *m_drag;
|
||||
QShapedPixmapWindow *m_drag_icon_window;
|
||||
bool m_useCompositing;
|
||||
+ QScreen *m_screen;
|
||||
};
|
||||
|
||||
class Q_GUI_EXPORT QSimpleDrag : public QBasicDrag
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
index 9296a6d..aa6445d 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
@@ -193,6 +193,7 @@ void QXcbDrag::startDrag()
|
||||
XCB_ATOM_ATOM, 32, drag_types.size(), (const void *)drag_types.constData());
|
||||
|
||||
setUseCompositing(current_virtual_desktop->compositingActive());
|
||||
+ setScreen(current_virtual_desktop->screens().constFirst()->screen());
|
||||
QBasicDrag::startDrag();
|
||||
if (connection()->mouseGrabber() == Q_NULLPTR)
|
||||
shapedPixmapWindow()->setMouseGrabEnabled(true);
|
||||
@@ -322,6 +323,9 @@ void QXcbDrag::move(const QPoint &globalPos)
|
||||
if (virtualDesktop != current_virtual_desktop) {
|
||||
setUseCompositing(virtualDesktop->compositingActive());
|
||||
recreateShapedPixmapWindow(static_cast<QPlatformScreen*>(screen)->screen(), deviceIndependentPos);
|
||||
+ if (connection()->mouseGrabber() == Q_NULLPTR)
|
||||
+ shapedPixmapWindow()->setMouseGrabEnabled(true);
|
||||
+
|
||||
current_virtual_desktop = virtualDesktop;
|
||||
} else {
|
||||
QBasicDrag::moveShapedPixmapWindow(deviceIndependentPos);
|
||||
--
|
||||
2.7.4
|
||||
|
@ -1,28 +0,0 @@
|
||||
From 9868d8af8316c01f28255110c28e11344ea6f7a5 Mon Sep 17 00:00:00 2001
|
||||
From: Shawn Rutledge <shawn.rutledge@digia.com>
|
||||
Date: Thu, 18 Feb 2016 14:06:02 +0100
|
||||
Subject: [PATCH 101/328] xcb: include <cmath>
|
||||
|
||||
Fix trouble compiling with gcc 4.4.7 on Centos 6
|
||||
|
||||
Change-Id: Id81bd570e896507a07388257c4f75f80b4b468fd
|
||||
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
|
||||
index 969b6de..81cdaa5 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "qtouchdevice.h"
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
#include <QDebug>
|
||||
+#include <cmath>
|
||||
|
||||
#ifdef XCB_USE_XINPUT2
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,103 +0,0 @@
|
||||
From 4f577051676ad8ff161d481030f016d0c6bb324f Mon Sep 17 00:00:00 2001
|
||||
From: Marc Mutz <marc.mutz@kdab.com>
|
||||
Date: Sat, 5 Mar 2016 00:34:01 +0100
|
||||
Subject: [PATCH 177/328] Fix GCC 6 -Wunused-functions warnings
|
||||
|
||||
GCC 6 is able to identify member functions that are unused.
|
||||
|
||||
Remove them.
|
||||
|
||||
Change-Id: Ic77548164b38a1cd3c957d2c57a5bccb979bc02e
|
||||
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
|
||||
---
|
||||
src/gui/painting/qpathclipper.cpp | 8 --------
|
||||
src/widgets/dialogs/qcolordialog.cpp | 15 ---------------
|
||||
src/widgets/widgets/qcalendarwidget.cpp | 6 ------
|
||||
3 files changed, 29 deletions(-)
|
||||
|
||||
diff --git a/src/gui/painting/qpathclipper.cpp b/src/gui/painting/qpathclipper.cpp
|
||||
index 3a686bd..a5557c9 100644
|
||||
--- a/src/gui/painting/qpathclipper.cpp
|
||||
+++ b/src/gui/painting/qpathclipper.cpp
|
||||
@@ -252,8 +252,6 @@ class SegmentTree
|
||||
public:
|
||||
SegmentTree(QPathSegments &segments);
|
||||
|
||||
- QRectF boundingRect() const;
|
||||
-
|
||||
void produceIntersections(int segment);
|
||||
|
||||
private:
|
||||
@@ -304,12 +302,6 @@ SegmentTree::SegmentTree(QPathSegments &segments)
|
||||
m_tree[0] = root;
|
||||
}
|
||||
|
||||
-QRectF SegmentTree::boundingRect() const
|
||||
-{
|
||||
- return QRectF(QPointF(m_bounds.x1, m_bounds.y1),
|
||||
- QPointF(m_bounds.x2, m_bounds.y2));
|
||||
-}
|
||||
-
|
||||
static inline qreal coordinate(const QPointF &pos, int axis)
|
||||
{
|
||||
return axis == 0 ? pos.x() : pos.y();
|
||||
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
|
||||
index 468bffe..9a8bfc5 100644
|
||||
--- a/src/widgets/dialogs/qcolordialog.cpp
|
||||
+++ b/src/widgets/dialogs/qcolordialog.cpp
|
||||
@@ -190,7 +190,6 @@ public:
|
||||
QSize sizeHint() const Q_DECL_OVERRIDE;
|
||||
|
||||
virtual void setCellBrush(int row, int col, const QBrush &);
|
||||
- QBrush cellBrush(int row, int col);
|
||||
|
||||
inline int cellWidth() const
|
||||
{ return cellw; }
|
||||
@@ -459,20 +458,6 @@ void QWellArray::setCellBrush(int row, int col, const QBrush &b)
|
||||
d->brush[row*numCols()+col] = b;
|
||||
}
|
||||
|
||||
-/*
|
||||
- Returns the brush set for the cell at \a row, \a column. If no brush is
|
||||
- set, Qt::NoBrush is returned.
|
||||
-*/
|
||||
-
|
||||
-QBrush QWellArray::cellBrush(int row, int col)
|
||||
-{
|
||||
- if (d && row >= 0 && row < numRows() && col >= 0 && col < numCols())
|
||||
- return d->brush[row*numCols()+col];
|
||||
- return Qt::NoBrush;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-
|
||||
/*!\reimp
|
||||
*/
|
||||
|
||||
diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp
|
||||
index 48b224f..89cde85 100644
|
||||
--- a/src/widgets/widgets/qcalendarwidget.cpp
|
||||
+++ b/src/widgets/widgets/qcalendarwidget.cpp
|
||||
@@ -654,7 +654,6 @@ public:
|
||||
int dateEditAcceptDelay() const;
|
||||
void setDateEditAcceptDelay(int delay);
|
||||
|
||||
- QDate date() const;
|
||||
void setDate(const QDate &date);
|
||||
|
||||
bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE;
|
||||
@@ -690,11 +689,6 @@ void QCalendarTextNavigator::setWidget(QWidget *widget)
|
||||
m_widget = widget;
|
||||
}
|
||||
|
||||
-QDate QCalendarTextNavigator::date() const
|
||||
-{
|
||||
- return m_date;
|
||||
-}
|
||||
-
|
||||
void QCalendarTextNavigator::setDate(const QDate &date)
|
||||
{
|
||||
m_date = date;
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 992e762f66f6dd5ed2c5e369da77c7b3fdfcfd80 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Mutz <marc.mutz@kdab.com>
|
||||
Date: Sat, 5 Mar 2016 01:50:54 +0100
|
||||
Subject: [PATCH 178/328] qt_common.prf: when looking for GCC >= 4.6, match GCC
|
||||
6+, too
|
||||
|
||||
Change-Id: Ia04690f62faa214fb91dffc758e253b5a64e5648
|
||||
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
|
||||
---
|
||||
mkspecs/features/qt_common.prf | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf
|
||||
index 38602f6..e70d3bf 100644
|
||||
--- a/mkspecs/features/qt_common.prf
|
||||
+++ b/mkspecs/features/qt_common.prf
|
||||
@@ -69,9 +69,9 @@ warnings_are_errors:warning_clean {
|
||||
QMAKE_CXXFLAGS_WARN_ON += -Werror -ww177,1224,1478,1881 $$WERROR
|
||||
}
|
||||
} else:gcc:!clang:!intel_icc {
|
||||
- # GCC 4.6-4.9, 5.x
|
||||
+ # GCC 4.6-4.9, 5.x, ...
|
||||
ver = $${QT_GCC_MAJOR_VERSION}.$${QT_GCC_MINOR_VERSION}
|
||||
- contains(ver, "(4\\.[6789]|5\\..)") {
|
||||
+ contains(ver, "(4\\.[6789]|[5-9]\\..)") {
|
||||
QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=cpp -Wno-error=deprecated-declarations $$WERROR
|
||||
|
||||
# GCC prints this bogus warning, after it has inlined a lot of code
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,29 +0,0 @@
|
||||
From b8f98d956501dfa4ce03a137f15d404930a56066 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Shachnev <mitya57@gmail.com>
|
||||
Date: Sat, 5 Mar 2016 10:25:33 +0300
|
||||
Subject: [PATCH 201/328] alsatest: Fix the check to treat alsalib 1.1.x as
|
||||
correct version
|
||||
|
||||
Task-number: QTBUG-51681
|
||||
Change-Id: I63266c33342f02f4d1a5ea5786f5fbc5a1b421b3
|
||||
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
|
||||
---
|
||||
config.tests/unix/alsa/alsatest.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/config.tests/unix/alsa/alsatest.cpp b/config.tests/unix/alsa/alsatest.cpp
|
||||
index cab6533..0b45819 100644
|
||||
--- a/config.tests/unix/alsa/alsatest.cpp
|
||||
+++ b/config.tests/unix/alsa/alsatest.cpp
|
||||
@@ -32,7 +32,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <alsa/asoundlib.h>
|
||||
-#if(!(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 10))
|
||||
+#if SND_LIB_VERSION < 0x1000a // 1.0.10
|
||||
#error "Alsa version found too old, require >= 1.0.10"
|
||||
#endif
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,149 +0,0 @@
|
||||
From 2020d2cb63b851723e188c002acbe25b5f066525 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Mutz <marc.mutz@kdab.com>
|
||||
Date: Fri, 4 Mar 2016 15:19:50 -0800
|
||||
Subject: [PATCH 221/328] QObject: fix GCC 6 warning about qt_static_metacall's
|
||||
'hidden' attribute use
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This warning is triggered when we try to apply the Q_DECL_HIDDEN
|
||||
attribute to a class in an unnamed namespace. Such classes are
|
||||
already not exported.
|
||||
|
||||
qobjectdefs.h:175:108: warning: ‘visibility’ attribute ignored [-Wattributes]
|
||||
qobjectdefs.h:198:108: warning: ‘visibility’ attribute ignored [-Wattributes]
|
||||
|
||||
Added a test on gadgets (and QObjects) in unnamed namespaces,
|
||||
because qtbase currently does not contain such Q_GADGETs.
|
||||
|
||||
Done-with: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Change-Id: Ic747cc2ab45e4dc6bb70ffff1438c747b05c5672
|
||||
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
|
||||
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
|
||||
---
|
||||
src/corelib/kernel/qobjectdefs.h | 15 ++++++++++--
|
||||
tests/auto/tools/moc/tst_moc.cpp | 50 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 63 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
|
||||
index b1ed971..2e9ed4f 100644
|
||||
--- a/src/corelib/kernel/qobjectdefs.h
|
||||
+++ b/src/corelib/kernel/qobjectdefs.h
|
||||
@@ -152,6 +152,12 @@ inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
|
||||
# define Q_OBJECT_NO_OVERRIDE_WARNING
|
||||
#endif
|
||||
|
||||
+#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
|
||||
+# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
|
||||
+#else
|
||||
+# define Q_OBJECT_NO_ATTRIBUTES_WARNING
|
||||
+#endif
|
||||
+
|
||||
/* qmake ignore Q_OBJECT */
|
||||
#define Q_OBJECT \
|
||||
public: \
|
||||
@@ -162,10 +168,11 @@ public: \
|
||||
virtual const QMetaObject *metaObject() const; \
|
||||
virtual void *qt_metacast(const char *); \
|
||||
virtual int qt_metacall(QMetaObject::Call, int, void **); \
|
||||
- QT_WARNING_POP \
|
||||
QT_TR_FUNCTIONS \
|
||||
private: \
|
||||
+ Q_OBJECT_NO_ATTRIBUTES_WARNING \
|
||||
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
|
||||
+ QT_WARNING_POP \
|
||||
struct QPrivateSignal {};
|
||||
|
||||
/* qmake ignore Q_OBJECT */
|
||||
@@ -179,7 +186,11 @@ public: \
|
||||
void qt_check_for_QGADGET_macro(); \
|
||||
typedef void QtGadgetHelper; \
|
||||
private: \
|
||||
- Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
|
||||
+ QT_WARNING_PUSH \
|
||||
+ Q_OBJECT_NO_ATTRIBUTES_WARNING \
|
||||
+ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
|
||||
+ QT_WARNING_POP \
|
||||
+ /*end*/
|
||||
#endif // QT_NO_META_MACROS
|
||||
|
||||
#else // Q_MOC_RUN
|
||||
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
|
||||
index c113b7c..5c16c7a 100644
|
||||
--- a/tests/auto/tools/moc/tst_moc.cpp
|
||||
+++ b/tests/auto/tools/moc/tst_moc.cpp
|
||||
@@ -131,6 +131,33 @@ typedef struct {
|
||||
int doNotConfuseMoc;
|
||||
} OldStyleCStruct;
|
||||
|
||||
+namespace {
|
||||
+
|
||||
+ class GadgetInUnnamedNS
|
||||
+ {
|
||||
+ Q_GADGET
|
||||
+ Q_PROPERTY(int x READ x WRITE setX)
|
||||
+ Q_PROPERTY(int y READ y WRITE setY)
|
||||
+ public:
|
||||
+ explicit GadgetInUnnamedNS(int x, int y) : m_x(x), m_y(y) {}
|
||||
+ int x() const { return m_x; }
|
||||
+ int y() const { return m_y; }
|
||||
+ void setX(int x) { m_x = x; }
|
||||
+ void setY(int y) { m_y = y; }
|
||||
+
|
||||
+ private:
|
||||
+ int m_x, m_y;
|
||||
+ };
|
||||
+
|
||||
+ class ObjectInUnnamedNS : public QObject
|
||||
+ {
|
||||
+ Q_OBJECT
|
||||
+ public:
|
||||
+ explicit ObjectInUnnamedNS(QObject *parent = Q_NULLPTR) : QObject(parent) {}
|
||||
+ };
|
||||
+
|
||||
+}
|
||||
+
|
||||
class Sender : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -597,6 +624,7 @@ private slots:
|
||||
void relatedMetaObjectsNameConflict_data();
|
||||
void relatedMetaObjectsNameConflict();
|
||||
void strignLiteralsInMacroExtension();
|
||||
+ void unnamedNamespaceObjectsAndGadgets();
|
||||
void veryLongStringData();
|
||||
void gadgetHierarchy();
|
||||
|
||||
@@ -3421,6 +3449,28 @@ class VeryLongStringData : public QObject
|
||||
#undef repeat65534
|
||||
};
|
||||
|
||||
+void tst_Moc::unnamedNamespaceObjectsAndGadgets()
|
||||
+{
|
||||
+ // these just test very basic functionality of gadgets and objects
|
||||
+ // defined in unnamed namespaces.
|
||||
+ {
|
||||
+ GadgetInUnnamedNS gadget(21, 42);
|
||||
+ QCOMPARE(gadget.x(), 21);
|
||||
+ QCOMPARE(gadget.y(), 42);
|
||||
+ gadget.staticMetaObject.property(0).writeOnGadget(&gadget, 12);
|
||||
+ gadget.staticMetaObject.property(1).writeOnGadget(&gadget, 24);
|
||||
+ QCOMPARE(gadget.x(), 12);
|
||||
+ QCOMPARE(gadget.y(), 24);
|
||||
+ }
|
||||
+
|
||||
+ {
|
||||
+ ObjectInUnnamedNS object;
|
||||
+ QObject *qObject = &object;
|
||||
+ QCOMPARE(static_cast<ObjectInUnnamedNS *>(qObject),
|
||||
+ qobject_cast<ObjectInUnnamedNS *>(qObject));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void tst_Moc::veryLongStringData()
|
||||
{
|
||||
const QMetaObject *mobj = &VeryLongStringData::staticMetaObject;
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,132 +0,0 @@
|
||||
From 2e02de165115c9d67ac343ff0960ed80f9c09bc8 Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Tue, 15 Mar 2016 11:00:20 -0700
|
||||
Subject: [PATCH 293/328] Fix QtDBus deadlock inside kded/kiod
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Whenever a message spy was installed, we failed to actually process
|
||||
looped-back messages by queueing them for processing by the spy. That
|
||||
had as a consequence that the caller got an error reply. Worse, since
|
||||
the message had been queued, QtDBus would attempt to deliver it later.
|
||||
Since that message had isLocal==true, bad things happened inside the
|
||||
manager thread.
|
||||
|
||||
The correct solution is not to queue the message for the filter. If the
|
||||
message is local, then simply deliver directly, as we're still in the
|
||||
user's thread. This used to be the behavior in Qt 5.5.
|
||||
|
||||
Task-number: QTBUG-51676
|
||||
Change-Id: I1dc112894cde7121e8ce302ae51b438ade1ff612
|
||||
Reviewed-by: David Faure <david.faure@kdab.com>
|
||||
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
|
||||
Reviewed-by: Jan Kundrát <jkt@kde.org>
|
||||
---
|
||||
src/dbus/qdbusintegrator.cpp | 42 ++++++++++++++++++++++++++++++++----------
|
||||
src/dbus/qdbusintegrator_p.h | 1 +
|
||||
2 files changed, 33 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
|
||||
index cd44861..478a2c4 100644
|
||||
--- a/src/dbus/qdbusintegrator.cpp
|
||||
+++ b/src/dbus/qdbusintegrator.cpp
|
||||
@@ -481,6 +481,11 @@ QDBusSpyCallEvent::~QDBusSpyCallEvent()
|
||||
|
||||
void QDBusSpyCallEvent::placeMetaCall(QObject *)
|
||||
{
|
||||
+ invokeSpyHooks(msg, hooks, hookCount);
|
||||
+}
|
||||
+
|
||||
+inline void QDBusSpyCallEvent::invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount)
|
||||
+{
|
||||
// call the spy hook list
|
||||
for (int i = 0; i < hookCount; ++i)
|
||||
hooks[i](msg);
|
||||
@@ -509,7 +514,12 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
|
||||
{
|
||||
if (!ref.load())
|
||||
return false;
|
||||
- if (!dispatchEnabled && !QDBusMessagePrivate::isLocal(amsg)) {
|
||||
+
|
||||
+ // local message are always delivered, regardless of filtering
|
||||
+ // or whether the dispatcher is enabled
|
||||
+ bool isLocal = QDBusMessagePrivate::isLocal(amsg);
|
||||
+
|
||||
+ if (!dispatchEnabled && !isLocal) {
|
||||
// queue messages only, we'll handle them later
|
||||
qDBusDebug() << this << "delivery is suspended";
|
||||
pendingMessages << amsg;
|
||||
@@ -523,13 +533,23 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
|
||||
// let them see the signal too
|
||||
return false;
|
||||
case QDBusMessage::MethodCallMessage:
|
||||
- // run it through the spy filters (if any) before the regular processing
|
||||
+ // run it through the spy filters (if any) before the regular processing:
|
||||
+ // a) if it's a local message, we're in the caller's thread, so invoke the filter directly
|
||||
+ // b) if it's an external message, post to the main thread
|
||||
if (Q_UNLIKELY(qDBusSpyHookList.exists()) && qApp) {
|
||||
const QDBusSpyHookList &list = *qDBusSpyHookList;
|
||||
- qDBusDebug() << this << "invoking message spies";
|
||||
- QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this),
|
||||
- amsg, list.constData(), list.size()));
|
||||
- return true;
|
||||
+ if (isLocal) {
|
||||
+ Q_ASSERT(QThread::currentThread() != thread());
|
||||
+ qDBusDebug() << this << "invoking message spies directly";
|
||||
+ QDBusSpyCallEvent::invokeSpyHooks(amsg, list.constData(), list.size());
|
||||
+ } else {
|
||||
+ qDBusDebug() << this << "invoking message spies via event";
|
||||
+ QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this),
|
||||
+ amsg, list.constData(), list.size()));
|
||||
+
|
||||
+ // we'll be called back, so return
|
||||
+ return true;
|
||||
+ }
|
||||
}
|
||||
|
||||
handleObjectCall(amsg);
|
||||
@@ -1451,9 +1471,9 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg)
|
||||
// that means the dispatchLock mutex is locked
|
||||
// must not call out to user code in that case
|
||||
//
|
||||
- // however, if the message is internal, handleMessage was called
|
||||
- // directly and no lock is in place. We can therefore call out to
|
||||
- // user code, if necessary
|
||||
+ // however, if the message is internal, handleMessage was called directly
|
||||
+ // (user's thread) and no lock is in place. We can therefore call out to
|
||||
+ // user code, if necessary.
|
||||
ObjectTreeNode result;
|
||||
int usedLength;
|
||||
QThread *objThread = 0;
|
||||
@@ -1492,12 +1512,14 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg)
|
||||
usedLength, msg));
|
||||
return;
|
||||
} else if (objThread != QThread::currentThread()) {
|
||||
- // synchronize with other thread
|
||||
+ // looped-back message, targeting another thread:
|
||||
+ // synchronize with it
|
||||
postEventToThread(HandleObjectCallPostEventAction, result.obj,
|
||||
new QDBusActivateObjectEvent(QDBusConnection(this), this, result,
|
||||
usedLength, msg, &sem));
|
||||
semWait = true;
|
||||
} else {
|
||||
+ // looped-back message, targeting current thread
|
||||
semWait = false;
|
||||
}
|
||||
} // release the lock
|
||||
diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h
|
||||
index 2bbebdf..c0d9c22 100644
|
||||
--- a/src/dbus/qdbusintegrator_p.h
|
||||
+++ b/src/dbus/qdbusintegrator_p.h
|
||||
@@ -145,6 +145,7 @@ public:
|
||||
{}
|
||||
~QDBusSpyCallEvent();
|
||||
void placeMetaCall(QObject *) Q_DECL_OVERRIDE;
|
||||
+ static inline void invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount);
|
||||
|
||||
QDBusConnection conn; // keeps the refcount in QDBusConnectionPrivate up
|
||||
QDBusMessage msg;
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,87 +0,0 @@
|
||||
From b77ef8a7e6e4104067d52824e29eadc8c66f5929 Mon Sep 17 00:00:00 2001
|
||||
From: Weng Xuetian <wengxt@gmail.com>
|
||||
Date: Sat, 5 Mar 2016 12:23:21 -0800
|
||||
Subject: [PATCH 415/595] QtDBus: clean up signal hooks and object tree in
|
||||
closeConnection
|
||||
|
||||
If a QObject is added or passed as receiver to QDBusConnection::connect()
|
||||
and it is managed by Q_GLOBAL_STATIC or similar mechanism, it is
|
||||
possible that when that its destructor is called after the dbus daemon
|
||||
thread ends. In that case, QObject::destroyed connected via
|
||||
Qt::BlockingQueuedConnection to QDBusConnectionPrivate will cause dead
|
||||
lock since the thread is no longer processing events.
|
||||
|
||||
Task-number: QTBUG-51648
|
||||
Change-Id: I1a1810a6d6d0234af0269d5f3fc1f54101bf1547
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/dbus/qdbusconnection_p.h | 1 +
|
||||
src/dbus/qdbusintegrator.cpp | 26 +++++++++++++++++++++++++-
|
||||
2 files changed, 26 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
|
||||
index c77daf7..565eb83 100644
|
||||
--- a/src/dbus/qdbusconnection_p.h
|
||||
+++ b/src/dbus/qdbusconnection_p.h
|
||||
@@ -254,6 +254,7 @@ private:
|
||||
const QVector<int> &metaTypes, int slotIdx);
|
||||
|
||||
SignalHookHash::Iterator removeSignalHookNoLock(SignalHookHash::Iterator it);
|
||||
+ void disconnectObjectTree(ObjectTreeNode &node);
|
||||
|
||||
bool isServiceRegisteredByThread(const QString &serviceName);
|
||||
|
||||
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
|
||||
index 478a2c4..3be775d 100644
|
||||
--- a/src/dbus/qdbusintegrator.cpp
|
||||
+++ b/src/dbus/qdbusintegrator.cpp
|
||||
@@ -1050,7 +1050,6 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate()
|
||||
qPrintable(name));
|
||||
|
||||
closeConnection();
|
||||
- rootNode.children.clear(); // free resources
|
||||
qDeleteAll(cachedMetaObjects);
|
||||
|
||||
if (mode == ClientMode || mode == PeerMode) {
|
||||
@@ -1072,6 +1071,19 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate()
|
||||
}
|
||||
}
|
||||
|
||||
+void QDBusConnectionPrivate::disconnectObjectTree(QDBusConnectionPrivate::ObjectTreeNode &haystack)
|
||||
+{
|
||||
+ QDBusConnectionPrivate::ObjectTreeNode::DataList::Iterator it = haystack.children.begin();
|
||||
+
|
||||
+ while (it != haystack.children.end()) {
|
||||
+ disconnectObjectTree(*it);
|
||||
+ it++;
|
||||
+ }
|
||||
+
|
||||
+ if (haystack.obj)
|
||||
+ haystack.obj->disconnect(this);
|
||||
+}
|
||||
+
|
||||
void QDBusConnectionPrivate::closeConnection()
|
||||
{
|
||||
QDBusWriteLocker locker(CloseConnectionAction, this);
|
||||
@@ -1095,6 +1107,18 @@ void QDBusConnectionPrivate::closeConnection()
|
||||
}
|
||||
|
||||
qDeleteAll(pendingCalls);
|
||||
+
|
||||
+ // Disconnect all signals from signal hooks and from the object tree to
|
||||
+ // avoid QObject::destroyed being sent to dbus daemon thread which has
|
||||
+ // already quit.
|
||||
+ SignalHookHash::iterator sit = signalHooks.begin();
|
||||
+ while (sit != signalHooks.end()) {
|
||||
+ sit.value().obj->disconnect(this);
|
||||
+ sit++;
|
||||
+ }
|
||||
+
|
||||
+ disconnectObjectTree(rootNode);
|
||||
+ rootNode.children.clear(); // free resources
|
||||
}
|
||||
|
||||
void QDBusConnectionPrivate::checkThread()
|
||||
--
|
||||
2.7.4
|
||||
|
@ -1,98 +0,0 @@
|
||||
From 269fdbdd2bedda5f5eacb751224d3a3fc3eed5bc Mon Sep 17 00:00:00 2001
|
||||
From: Urs Fleisch <ufleisch@users.sourceforge.net>
|
||||
Date: Fri, 26 Feb 2016 17:46:09 +0100
|
||||
Subject: [PATCH 508/652] xcb: Fix drag and drop to applications like Emacs and
|
||||
Chromium.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Drops without matching time stamp do not work. I have fixed the issue by
|
||||
reanimating the findXdndAwareParent() function (adapted to XCB) and
|
||||
using it to find a matching transaction if all else fails.
|
||||
|
||||
Task-number: QTBUG-45812
|
||||
Change-Id: Ibca15bbab02ccf2f25280418e9edf36972ebf9a0
|
||||
Reviewed-by: Błażej Szczygieł <spaz16@wp.pl>
|
||||
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbdrag.cpp | 55 +++++++++++++++++++++++++++-------
|
||||
1 file changed, 44 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
index f5cc873..f1428d0 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
@@ -1072,6 +1072,40 @@ void QXcbDrag::cancel()
|
||||
send_leave();
|
||||
}
|
||||
|
||||
+// find an ancestor with XdndAware on it
|
||||
+static xcb_window_t findXdndAwareParent(QXcbConnection *c, xcb_window_t window)
|
||||
+{
|
||||
+ xcb_window_t target = 0;
|
||||
+ forever {
|
||||
+ // check if window has XdndAware
|
||||
+ xcb_get_property_cookie_t gpCookie = Q_XCB_CALL(
|
||||
+ xcb_get_property(c->xcb_connection(), false, window,
|
||||
+ c->atom(QXcbAtom::XdndAware), XCB_GET_PROPERTY_TYPE_ANY, 0, 0));
|
||||
+ xcb_get_property_reply_t *gpReply = xcb_get_property_reply(
|
||||
+ c->xcb_connection(), gpCookie, 0);
|
||||
+ bool aware = gpReply && gpReply->type != XCB_NONE;
|
||||
+ free(gpReply);
|
||||
+ if (aware) {
|
||||
+ target = window;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ // try window's parent
|
||||
+ xcb_query_tree_cookie_t qtCookie = Q_XCB_CALL(
|
||||
+ xcb_query_tree_unchecked(c->xcb_connection(), window));
|
||||
+ xcb_query_tree_reply_t *qtReply = xcb_query_tree_reply(
|
||||
+ c->xcb_connection(), qtCookie, NULL);
|
||||
+ if (!qtReply)
|
||||
+ break;
|
||||
+ xcb_window_t root = qtReply->root;
|
||||
+ xcb_window_t parent = qtReply->parent;
|
||||
+ free(qtReply);
|
||||
+ if (window == root)
|
||||
+ break;
|
||||
+ window = parent;
|
||||
+ }
|
||||
+ return target;
|
||||
+}
|
||||
|
||||
void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event)
|
||||
{
|
||||
@@ -1099,17 +1133,16 @@ void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event
|
||||
// xcb_convert_selection() that we sent the XdndDrop event to.
|
||||
at = findTransactionByWindow(event->requestor);
|
||||
}
|
||||
-// if (at == -1 && event->time == XCB_CURRENT_TIME) {
|
||||
-// // previous Qt versions always requested the data on a child of the target window
|
||||
-// // using CurrentTime... but it could be asking for either drop data or the current drag's data
|
||||
-// Window target = findXdndAwareParent(event->requestor);
|
||||
-// if (target) {
|
||||
-// if (current_target && current_target == target)
|
||||
-// at = -2;
|
||||
-// else
|
||||
-// at = findXdndDropTransactionByWindow(target);
|
||||
-// }
|
||||
-// }
|
||||
+
|
||||
+ if (at == -1 && event->time == XCB_CURRENT_TIME) {
|
||||
+ xcb_window_t target = findXdndAwareParent(connection(), event->requestor);
|
||||
+ if (target) {
|
||||
+ if (current_target == target)
|
||||
+ at = -2;
|
||||
+ else
|
||||
+ at = findTransactionByWindow(target);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
QDrag *transactionDrag = 0;
|
||||
--
|
||||
2.7.4
|
||||
|
@ -1,205 +0,0 @@
|
||||
From 9be4ee52021bbb3227611979319ab5e3106063b2 Mon Sep 17 00:00:00 2001
|
||||
From: Weng Xuetian <wengxt@gmail.com>
|
||||
Date: Thu, 3 Mar 2016 21:56:53 -0800
|
||||
Subject: [PATCH 537/595] QtDBus: finish all pending call with error if
|
||||
disconnected
|
||||
|
||||
libdbus will send a local signal if connection gets disconnected. When
|
||||
this happens, end all pending calls with QDBusError::Disconnected.
|
||||
|
||||
Task-number: QTBUG-51649
|
||||
Change-Id: I5c7d2a468bb5da746d0c0e53e458c1e376f186a9
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/dbus/dbus_minimal_p.h | 2 ++
|
||||
src/dbus/qdbusconnection_p.h | 3 ++
|
||||
src/dbus/qdbusintegrator.cpp | 41 ++++++++++++++++++----
|
||||
src/dbus/qdbusutil_p.h | 2 ++
|
||||
.../dbus/qdbusconnection/tst_qdbusconnection.cpp | 21 +++++++++++
|
||||
.../dbus/qdbusconnection/tst_qdbusconnection.h | 1 +
|
||||
6 files changed, 64 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/dbus/dbus_minimal_p.h b/src/dbus/dbus_minimal_p.h
|
||||
index f0a2954..8f25b24 100644
|
||||
--- a/src/dbus/dbus_minimal_p.h
|
||||
+++ b/src/dbus/dbus_minimal_p.h
|
||||
@@ -99,9 +99,11 @@ typedef dbus_uint32_t dbus_bool_t;
|
||||
/* dbus-shared.h */
|
||||
#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
|
||||
#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
|
||||
+#define DBUS_PATH_LOCAL "/org/freedesktop/DBus/Local"
|
||||
#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus"
|
||||
#define DBUS_INTERFACE_INTROSPECTABLE "org.freedesktop.DBus.Introspectable"
|
||||
#define DBUS_INTERFACE_PROPERTIES "org.freedesktop.DBus.Properties"
|
||||
+#define DBUS_INTERFACE_LOCAL "org.freedesktop.DBus.Local"
|
||||
|
||||
#define DBUS_NAME_FLAG_ALLOW_REPLACEMENT 0x1 /**< Allow another service to become the primary owner if requested */
|
||||
#define DBUS_NAME_FLAG_REPLACE_EXISTING 0x2 /**< Request to replace the current primary owner */
|
||||
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
|
||||
index 565eb83..b733a68 100644
|
||||
--- a/src/dbus/qdbusconnection_p.h
|
||||
+++ b/src/dbus/qdbusconnection_p.h
|
||||
@@ -260,6 +260,8 @@ private:
|
||||
|
||||
QString getNameOwnerNoCache(const QString &service);
|
||||
|
||||
+ void watchForDBusDisconnection();
|
||||
+
|
||||
void _q_newConnection(QDBusConnectionPrivate *newConnection);
|
||||
|
||||
protected:
|
||||
@@ -279,6 +281,7 @@ private slots:
|
||||
void serviceOwnerChangedNoLock(const QString &name, const QString &oldOwner, const QString &newOwner);
|
||||
void registerServiceNoLock(const QString &serviceName);
|
||||
void unregisterServiceNoLock(const QString &serviceName);
|
||||
+ void handleDBusDisconnection();
|
||||
|
||||
signals:
|
||||
void dispatchStatusChanged();
|
||||
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
|
||||
index 3be775d..d0468f4 100644
|
||||
--- a/src/dbus/qdbusintegrator.cpp
|
||||
+++ b/src/dbus/qdbusintegrator.cpp
|
||||
@@ -1121,6 +1121,12 @@ void QDBusConnectionPrivate::closeConnection()
|
||||
rootNode.children.clear(); // free resources
|
||||
}
|
||||
|
||||
+void QDBusConnectionPrivate::handleDBusDisconnection()
|
||||
+{
|
||||
+ while (!pendingCalls.isEmpty())
|
||||
+ processFinishedCall(pendingCalls.first());
|
||||
+}
|
||||
+
|
||||
void QDBusConnectionPrivate::checkThread()
|
||||
{
|
||||
Q_ASSERT(thread() == QDBusConnectionManager::instance());
|
||||
@@ -1646,6 +1652,19 @@ void QDBusConnectionPrivate::handleSignal(const QDBusMessage& msg)
|
||||
handleSignal(key, msg); // third try
|
||||
}
|
||||
|
||||
+void QDBusConnectionPrivate::watchForDBusDisconnection()
|
||||
+{
|
||||
+ SignalHook hook;
|
||||
+ // Initialize the hook for Disconnected signal
|
||||
+ hook.service.clear(); // org.freedesktop.DBus.Local.Disconnected uses empty service name
|
||||
+ hook.path = QDBusUtil::dbusPathLocal();
|
||||
+ hook.obj = this;
|
||||
+ hook.params << QMetaType::Void;
|
||||
+ hook.midx = staticMetaObject.indexOfSlot("handleDBusDisconnection()");
|
||||
+ Q_ASSERT(hook.midx != -1);
|
||||
+ signalHooks.insert(QLatin1String("Disconnected:" DBUS_INTERFACE_LOCAL), hook);
|
||||
+}
|
||||
+
|
||||
void QDBusConnectionPrivate::setServer(QDBusServer *object, DBusServer *s, const QDBusErrorInternal &error)
|
||||
{
|
||||
mode = ServerMode;
|
||||
@@ -1711,6 +1730,8 @@ void QDBusConnectionPrivate::setPeer(DBusConnection *c, const QDBusErrorInternal
|
||||
qDBusSignalFilter,
|
||||
this, 0);
|
||||
|
||||
+ watchForDBusDisconnection();
|
||||
+
|
||||
QMetaObject::invokeMethod(this, "doDispatch", Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
@@ -1787,6 +1808,8 @@ void QDBusConnectionPrivate::setConnection(DBusConnection *dbc, const QDBusError
|
||||
Q_ASSERT(hook.midx != -1);
|
||||
signalHooks.insert(QLatin1String("NameOwnerChanged:" DBUS_INTERFACE_DBUS), hook);
|
||||
|
||||
+ watchForDBusDisconnection();
|
||||
+
|
||||
qDBusDebug() << this << ": connected successfully";
|
||||
|
||||
// schedule a dispatch:
|
||||
@@ -1813,10 +1836,16 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call)
|
||||
|
||||
QDBusMessage &msg = call->replyMessage;
|
||||
if (call->pending) {
|
||||
- // decode the message
|
||||
- DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending);
|
||||
- msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities);
|
||||
- q_dbus_message_unref(reply);
|
||||
+ // when processFinishedCall is called and pending call is not completed,
|
||||
+ // it means we received disconnected signal from libdbus
|
||||
+ if (q_dbus_pending_call_get_completed(call->pending)) {
|
||||
+ // decode the message
|
||||
+ DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending);
|
||||
+ msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities);
|
||||
+ q_dbus_message_unref(reply);
|
||||
+ } else {
|
||||
+ msg = QDBusMessage::createError(QDBusError::Disconnected, QDBusUtil::disconnectedErrorMessage());
|
||||
+ }
|
||||
}
|
||||
qDBusDebug() << connection << "got message reply:" << msg;
|
||||
|
||||
@@ -2116,8 +2145,8 @@ void QDBusConnectionPrivate::sendInternal(QDBusPendingCallPrivate *pcall, void *
|
||||
pcall->pending = pending;
|
||||
q_dbus_pending_call_set_notify(pending, qDBusResultReceived, pcall, 0);
|
||||
|
||||
- // DBus won't notify us when a peer disconnects so we need to track these ourselves
|
||||
- if (mode == QDBusConnectionPrivate::PeerMode)
|
||||
+ // DBus won't notify us when a peer disconnects or server terminates so we need to track these ourselves
|
||||
+ if (mode == QDBusConnectionPrivate::PeerMode || mode == QDBusConnectionPrivate::ClientMode)
|
||||
pendingCalls.append(pcall);
|
||||
|
||||
return;
|
||||
diff --git a/src/dbus/qdbusutil_p.h b/src/dbus/qdbusutil_p.h
|
||||
index 8f5ae92..f4ab9b9 100644
|
||||
--- a/src/dbus/qdbusutil_p.h
|
||||
+++ b/src/dbus/qdbusutil_p.h
|
||||
@@ -155,6 +155,8 @@ namespace QDBusUtil
|
||||
{ return QStringLiteral(DBUS_SERVICE_DBUS); }
|
||||
inline QString dbusPath()
|
||||
{ return QStringLiteral(DBUS_PATH_DBUS); }
|
||||
+ inline QString dbusPathLocal()
|
||||
+ { return QStringLiteral(DBUS_PATH_LOCAL); }
|
||||
inline QString dbusInterface()
|
||||
{
|
||||
// it's the same string, but just be sure
|
||||
diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
|
||||
index e91f87d..f378091 100644
|
||||
--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
|
||||
+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
|
||||
@@ -1218,6 +1218,27 @@ void tst_QDBusConnection::callVirtualObjectLocal()
|
||||
QCOMPARE(obj.replyArguments, subPathReply.arguments());
|
||||
}
|
||||
|
||||
+void tst_QDBusConnection::pendingCallWhenDisconnected()
|
||||
+{
|
||||
+ if (!QCoreApplication::instance())
|
||||
+ QSKIP("Test requires a QCoreApplication");
|
||||
+
|
||||
+ QDBusServer *server = new QDBusServer;
|
||||
+ QDBusConnection con = QDBusConnection::connectToPeer(server->address(), "disconnect");
|
||||
+ QTestEventLoop::instance().enterLoop(2);
|
||||
+ QVERIFY(con.isConnected());
|
||||
+ QDBusMessage message = QDBusMessage::createMethodCall("", "/", QString(), "method");
|
||||
+ QDBusPendingCall reply = con.asyncCall(message);
|
||||
+
|
||||
+ delete server;
|
||||
+
|
||||
+ QTestEventLoop::instance().enterLoop(2);
|
||||
+ QVERIFY(!con.isConnected());
|
||||
+ QVERIFY(reply.isFinished());
|
||||
+ QVERIFY(reply.isError());
|
||||
+ QVERIFY(reply.error().type() == QDBusError::Disconnected);
|
||||
+}
|
||||
+
|
||||
QString MyObject::path;
|
||||
QString MyObjectWithoutInterface::path;
|
||||
QString MyObjectWithoutInterface::interface;
|
||||
diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h
|
||||
index a53ba32..720e484 100644
|
||||
--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h
|
||||
+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h
|
||||
@@ -121,6 +121,7 @@ private slots:
|
||||
void registerVirtualObject();
|
||||
void callVirtualObject();
|
||||
void callVirtualObjectLocal();
|
||||
+ void pendingCallWhenDisconnected();
|
||||
|
||||
public:
|
||||
QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; }
|
||||
--
|
||||
2.7.4
|
||||
|
@ -1,41 +0,0 @@
|
||||
From c6d041e7ca3eb7945bf143a5c4fffcb2b2afba75 Mon Sep 17 00:00:00 2001
|
||||
From: Urs Fleisch <ufleisch@users.sourceforge.net>
|
||||
Date: Sun, 1 May 2016 14:31:48 +0200
|
||||
Subject: [PATCH 554/652] xcb: Fix drag and drop to Emacs.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Unfortunately, the improved patch for QTBUG-45812 fixed things for
|
||||
Chromium, but did no longer work for Emacs. This fixes commit [269fdb]
|
||||
to make it work for both Emacs and Chromium.
|
||||
|
||||
Task-number: QTBUG-45812
|
||||
Change-Id: I2fca708503f27679681bc6959de1ad94943a063e
|
||||
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
|
||||
Reviewed-by: Błażej Szczygieł <spaz16@wp.pl>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbdrag.cpp | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
index f1428d0..529f91e 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
@@ -1134,10 +1134,10 @@ void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event
|
||||
at = findTransactionByWindow(event->requestor);
|
||||
}
|
||||
|
||||
- if (at == -1 && event->time == XCB_CURRENT_TIME) {
|
||||
+ if (at == -1) {
|
||||
xcb_window_t target = findXdndAwareParent(connection(), event->requestor);
|
||||
if (target) {
|
||||
- if (current_target == target)
|
||||
+ if (event->time == XCB_CURRENT_TIME && current_target == target)
|
||||
at = -2;
|
||||
else
|
||||
at = findTransactionByWindow(target);
|
||||
--
|
||||
2.7.4
|
||||
|
@ -55,8 +55,8 @@ BuildRequires: pkgconfig(libsystemd)
|
||||
|
||||
Summary: Qt5 - QtBase components
|
||||
Name: qt5-qtbase
|
||||
Version: 5.6.0
|
||||
Release: 21%{?prerelease:.%{prerelease}}%{?dist}
|
||||
Version: 5.6.1
|
||||
Release: 1%{?prerelease:.%{prerelease}}%{?dist}
|
||||
|
||||
# See LGPL_EXCEPTIONS.txt, for exception details
|
||||
License: LGPLv2 with exceptions or GPLv3 with exceptions
|
||||
@ -102,22 +102,6 @@ Patch61: qt5-qtbase-cxxflag.patch
|
||||
|
||||
## upstream patches
|
||||
|
||||
# Item views, https://bugreports.qt.io/browse/QTBUG-48870
|
||||
Patch158: 0058-QtGui-Avoid-rgba64-rgba32-conversion-on-every-pixel-.patch
|
||||
Patch167: 0067-Search-for-libsystemd-first-fall-back-to-libsystemd-.patch
|
||||
Patch176: 0076-QListView-fix-skipping-indexes-in-selectedIndexes.patch
|
||||
Patch187: 0087-xcb-Fix-drag-and-drop-between-xcb-screens.patch
|
||||
Patch201: 0101-xcb-include-cmath.patch
|
||||
Patch277: 0177-Fix-GCC-6-Wunused-functions-warnings.patch
|
||||
Patch278: 0178-qt_common.prf-when-looking-for-GCC-4.6-match-GCC-6-t.patch
|
||||
Patch301: 0201-alsatest-Fix-the-check-to-treat-alsalib-1.1.x-as-cor.patch
|
||||
Patch321: 0221-QObject-fix-GCC-6-warning-about-qt_static_metacall-s.patch
|
||||
Patch393: 0293-Fix-QtDBus-deadlock-inside-kded-kiod.patch
|
||||
Patch515: 0415-QtDBus-clean-up-signal-hooks-and-object-tree-in-clos.patch
|
||||
Patch608: 0508-xcb-Fix-drag-and-drop-to-applications-like-Emacs-and.patch
|
||||
Patch637: 0537-QtDBus-finish-all-pending-call-with-error-if-disconn.patch
|
||||
Patch654: 0554-xcb-Fix-drag-and-drop-to-Emacs.patch
|
||||
|
||||
# macros, be mindful to keep sync'd with macros.qt5
|
||||
Source10: macros.qt5
|
||||
%define _qt5 %{name}
|
||||
@ -370,21 +354,6 @@ RPM macros for building Qt5 packages.
|
||||
%patch60 -p1 -b .moc_system_defines
|
||||
%patch61 -p1 -b .qt5-qtbase-cxxflag
|
||||
|
||||
%patch158 -p1 -b .0058
|
||||
%patch167 -p1 -b .0067
|
||||
%patch176 -p1 -b .0076
|
||||
%patch187 -p1 -b .0087
|
||||
%patch201 -p1 -b .0101
|
||||
%patch277 -p1 -b .0177
|
||||
%patch278 -p1 -b .0178
|
||||
%patch301 -p1 -b .0201
|
||||
%patch321 -p1 -b .0221
|
||||
%patch393 -p1 -b .0293
|
||||
%patch515 -p1 -b .0415
|
||||
%patch608 -p1 -b .0508
|
||||
%patch637 -p1 -b .0537
|
||||
%patch654 -p1 -b .0554
|
||||
|
||||
%define platform linux-g++
|
||||
|
||||
%if 0%{?inject_optflags}
|
||||
@ -978,6 +947,9 @@ fi
|
||||
|
||||
|
||||
%changelog
|
||||
* Thu Jun 09 2016 Jan Grulich <jgrulich@redhat.com> - 5.6.1-1
|
||||
- Update to 5.6.1
|
||||
|
||||
* Thu Jun 02 2016 Than Ngo <than@redhat.com> - 5.6.0-21
|
||||
- drop gcc6 workaround on arm
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user