From 04dabe84b22aa9db501c2d88b4e6ffa0749598ce Mon Sep 17 00:00:00 2001 From: Simeon Bird Date: Fri, 19 Oct 2012 21:04:55 -0400 Subject: Fix race condition and deadlock in the version plugin when listing directories is slow. BUG: 302264 FIXED-IN: 4.9.3 --- src/views/versioncontrol/updateitemstatesthread.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index f9746aadd..e07d72c76 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -45,10 +45,12 @@ UpdateItemStatesThread::~UpdateItemStatesThread() void UpdateItemStatesThread::setData(KVersionControlPlugin* plugin, const QList& itemStates) { + // The locks are taken in the same order as in run() + // to avoid potential deadlock. + QMutexLocker pluginLocker(m_globalPluginMutex); QMutexLocker itemLocker(&m_itemMutex); - m_itemStates = itemStates; - QMutexLocker pluginLocker(m_globalPluginMutex); + m_itemStates = itemStates; m_plugin = plugin; } @@ -58,11 +60,12 @@ void UpdateItemStatesThread::run() Q_ASSERT(m_plugin); QMutexLocker itemLocker(&m_itemMutex); + const QString directory = m_itemStates.first().item.url().directory(KUrl::AppendTrailingSlash); + m_retrievedItems = false; itemLocker.unlock(); QMutexLocker pluginLocker(m_globalPluginMutex); - m_retrievedItems = false; if (m_plugin->beginRetrieval(directory)) { itemLocker.relock(); const int count = m_itemStates.count(); -- cgit v1.3 From 996fe25208f9db430daa7d1800c4476929eef0dd Mon Sep 17 00:00:00 2001 From: Alex Fiestas Date: Wed, 24 Oct 2012 01:21:02 +0200 Subject: Show MTP devices in case support for it is installed Basically adds a conditional that in case that mtp kioslave is installed devices with MTP are added to the predicated. REVIEW: 106651 (cherry picked from commit a09a23795050be4ad6e2c987614cb28096030cc8) --- src/panels/places/placesitem.cpp | 6 ++++++ src/panels/places/placesitem.h | 2 ++ src/panels/places/placesitemmodel.cpp | 23 +++++++++++++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/panels/places/placesitem.cpp b/src/panels/places/placesitem.cpp index f72f63975..f78c98b76 100644 --- a/src/panels/places/placesitem.cpp +++ b/src/panels/places/placesitem.cpp @@ -37,6 +37,7 @@ PlacesItem::PlacesItem(const KBookmark& bookmark, PlacesItem* parent) : m_access(), m_volume(), m_disc(), + m_mtp(), m_signalHandler(0), m_trashDirLister(0), m_bookmark() @@ -124,6 +125,7 @@ void PlacesItem::setBookmark(const KBookmark& bookmark) delete m_access; delete m_volume; delete m_disc; + delete m_mtp; const QString udi = bookmark.metaDataItem("UDI"); @@ -252,6 +254,7 @@ void PlacesItem::initializeDevice(const QString& udi) m_access = m_device.as(); m_volume = m_device.as(); m_disc = m_device.as(); + m_mtp = m_device.as(); setText(m_device.description()); setIcon(m_device.icon()); @@ -265,6 +268,9 @@ void PlacesItem::initializeDevice(const QString& udi) } else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) { const QString device = m_device.as()->device(); setUrl(QString("audiocd:/?device=%1").arg(device)); + } else if (m_mtp && m_mtp->supportedProtocols().contains("mtp")) { + setText(m_device.product()); + setUrl(QString("mtp:udi=%1").arg(m_device.udi())); } } diff --git a/src/panels/places/placesitem.h b/src/panels/places/placesitem.h index 5a24a5268..297f12d91 100644 --- a/src/panels/places/placesitem.h +++ b/src/panels/places/placesitem.h @@ -28,6 +28,7 @@ #include #include #include +#include class KDirLister; class PlacesItemSignalHandler; @@ -115,6 +116,7 @@ private: QPointer m_access; QPointer m_volume; QPointer m_disc; + QPointer m_mtp; QPointer m_signalHandler; QPointer m_trashDirLister; KBookmark m_bookmark; diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index 4770c6b10..1789f1806 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -554,11 +555,14 @@ void PlacesItemModel::onItemChanged(int index, const QSet& changedRo void PlacesItemModel::slotDeviceAdded(const QString& udi) { const Solid::Device device(udi); - if (m_predicate.matches(device)) { - m_availableDevices << udi; - const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - appendItem(new PlacesItem(bookmark)); + + if (!m_predicate.matches(device)) { + return; } + + m_availableDevices << udi; + const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); + appendItem(new PlacesItem(bookmark)); } void PlacesItemModel::slotDeviceRemoved(const QString& udi) @@ -949,14 +953,21 @@ void PlacesItemModel::createSystemBookmarks() void PlacesItemModel::initializeAvailableDevices() { - m_predicate = Solid::Predicate::fromString( - "[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]" + QString predicate("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]" " OR " "[ IS StorageAccess AND StorageDrive.driveType == 'Floppy' ]]" " OR " "OpticalDisc.availableContent & 'Audio' ]" " OR " "StorageAccess.ignored == false ]"); + + + if (KProtocolInfo::isKnownProtocol("mtp")) { + predicate.prepend("["); + predicate.append(" OR PortableMediaPlayer.supportedProtocols == 'mtp']"); + } + + m_predicate = Solid::Predicate::fromString(predicate); Q_ASSERT(m_predicate.isValid()); Solid::DeviceNotifier* notifier = Solid::DeviceNotifier::instance(); -- cgit v1.3 From 282f5cb869696a87c14da8e80ed7096b9055cd12 Mon Sep 17 00:00:00 2001 From: Christoph Feck Date: Fri, 26 Oct 2012 01:52:20 +0200 Subject: Fix color role of tree view arrows BUG: 307734 FIXED-IN: 4.9.3 REVIEW: 107031 --- src/kitemviews/kstandarditemlistwidget.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 72d10cf40..bdc2859c0 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1222,6 +1222,7 @@ void KStandardItemListWidget::drawSiblingsInformation(QPainter* painter) QRect siblingRect(x, 0, siblingSize, siblingSize); QStyleOption option; + option.palette.setColor(QPalette::Text, option.palette.color(normalTextColorRole())); bool isItemSibling = true; const QBitArray siblings = siblingsInformation(); -- cgit v1.3