Merge pull request #7218 from spycrab/qt_fix_removable

Qt/GameTracker: Work around Qt crash
This commit is contained in:
spycrab 2018-07-05 22:43:08 +02:00 committed by GitHub
commit f3143b1888
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 29 additions and 2 deletions

View File

@ -119,9 +119,36 @@ void GameTracker::StartInternal()
m_cache.Save(); m_cache.Save();
} }
// Works around a bug in QtCore that will cause crashes when QFileSystemWatcher::addPath
// is called on a directory that is located on a removable device
static bool IsOnRemovableMedia(const QString& dir)
{
#ifdef _WIN32
const QString absolute_dir = QFileInfo(dir).absolutePath();
if (absolute_dir.startsWith(QStringLiteral("//")))
return true;
const QString root_dir = QDir::toNativeSeparators(absolute_dir.left(3));
auto type = GetDriveType(root_dir.toStdWString().c_str());
switch (type)
{
case DRIVE_REMOVABLE:
case DRIVE_REMOTE:
case DRIVE_CDROM:
case DRIVE_UNKNOWN:
case DRIVE_NO_ROOT_DIR:
return true;
default:
return false;
}
#else
return false;
#endif
}
bool GameTracker::AddPath(const QString& dir) bool GameTracker::AddPath(const QString& dir)
{ {
if (Settings::Instance().IsAutoRefreshEnabled()) if (Settings::Instance().IsAutoRefreshEnabled() && !IsOnRemovableMedia(dir))
return addPath(dir); return addPath(dir);
m_tracked_paths.push_back(dir); m_tracked_paths.push_back(dir);
@ -131,7 +158,7 @@ bool GameTracker::AddPath(const QString& dir)
bool GameTracker::RemovePath(const QString& dir) bool GameTracker::RemovePath(const QString& dir)
{ {
if (Settings::Instance().IsAutoRefreshEnabled()) if (Settings::Instance().IsAutoRefreshEnabled() && !IsOnRemovableMedia(dir))
return removePath(dir); return removePath(dir);
const auto index = m_tracked_paths.indexOf(dir); const auto index = m_tracked_paths.indexOf(dir);