diff --git a/src/partitionmanager.cpp b/src/partitionmanager.cpp index b4b804ec528d205db99cf0ab94ff9bfaf1ff96f6..b65b745c60312621e537db50c0bfb52a6ee4f0d1 100644 --- a/src/partitionmanager.cpp +++ b/src/partitionmanager.cpp @@ -229,7 +229,7 @@ void PartitionManagerPrivate::refresh() const auto removedPartitions = m_partitions.mid(index); m_partitions.resize(index); - refresh(m_partitions); + refresh(m_partitions, changedPartitions); for (const auto partition : removedPartitions) { emit partitionRemoved(Partition(partition)); @@ -249,12 +249,12 @@ void PartitionManagerPrivate::refresh() void PartitionManagerPrivate::refresh(PartitionPrivate *partition) { - refresh(Partitions() << QExplicitlySharedDataPointer(partition)); + refresh(Partitions() << QExplicitlySharedDataPointer(partition), Partitions() << QExplicitlySharedDataPointer(partition)); emit partitionChanged(Partition(QExplicitlySharedDataPointer(partition))); } -void PartitionManagerPrivate::refresh(const Partitions &partitions) +void PartitionManagerPrivate::refresh(const Partitions &partitions, Partitions &changedPartitions) { for (auto partition : partitions) { // Reset properties to the unmounted defaults. If the partition is mounted these will be restored @@ -311,11 +311,20 @@ void PartitionManagerPrivate::refresh(const Partitions &partitions) if (partition->status == Partition::Mounted) { struct statvfs64 stat; + if (::statvfs64(partition->mountPath.toUtf8().constData(), &stat) == 0) { partition->bytesTotal = stat.f_blocks * stat.f_frsize; - partition->bytesFree = stat.f_bfree * stat.f_frsize; - partition->bytesAvailable = stat.f_bavail * stat.f_frsize; + qint64 bytesFree = stat.f_bfree * stat.f_frsize; + qint64 bytesAvailable = stat.f_bavail * stat.f_frsize; partition->readOnly = (stat.f_flag & ST_RDONLY) != 0; + + if (partition->bytesFree != bytesFree || partition->bytesAvailable != bytesAvailable) { + if (!changedPartitions.contains(partition)) { + changedPartitions.append(partition); + } + } + partition->bytesFree = bytesFree; + partition->bytesAvailable = bytesAvailable; } } else if (partition->storageType == Partition::External) { // Presume the file system can be mounted, unless we can confirm otherwise. diff --git a/src/partitionmanager_p.h b/src/partitionmanager_p.h index 61da9fce448424f6353cb5f9a25b12f6d7c29776..88388dc16125ae2811fa62c4c38aa1c5fcf01e4b 100644 --- a/src/partitionmanager_p.h +++ b/src/partitionmanager_p.h @@ -53,7 +53,7 @@ public: void refresh(); void refresh(PartitionPrivate *partition); - void refresh(const Partitions &partitions); + void refresh(const Partitions &partitions, Partitions &changedPartitions); signals: void partitionChanged(const Partition &partition);