about summary refs log tree commit diff
path: root/pkgs/desktops
diff options
context:
space:
mode:
authorworldofpeace <worldofpeace@protonmail.ch>2019-06-11 02:00:43 -0400
committerGitHub <noreply@github.com>2019-06-11 02:00:43 -0400
commit814c4c1b9d30d0bd523418d65cfd67e8def5ab43 (patch)
tree01989c5f729247c3763d4b27e782b5e41da06a41 /pkgs/desktops
parentd08a128c638016cdc94f24de27119d3fd2ac7a2e (diff)
parent057016a2c569b2a15980664e13a286f93b6b0da0 (diff)
downloadnixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.tar
nixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.tar.gz
nixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.tar.bz2
nixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.tar.lz
nixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.tar.xz
nixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.tar.zst
nixlib-814c4c1b9d30d0bd523418d65cfd67e8def5ab43.zip
Merge pull request #61366 from romildo/upd.deepin.dde-file-manager
deepin.dde-file-manager: init at 4.8.6.2
Diffstat (limited to 'pkgs/desktops')
-rw-r--r--pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-mime-cache-paths.patch323
-rw-r--r--pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-paths.patch89
-rw-r--r--pkgs/desktops/deepin/dde-file-manager/dde-file-manager.pixmaps-paths.patch38
-rw-r--r--pkgs/desktops/deepin/dde-file-manager/default.nix251
-rw-r--r--pkgs/desktops/deepin/deepin-movie-reborn/default.nix2
-rw-r--r--pkgs/desktops/deepin/default.nix1
6 files changed, 704 insertions, 0 deletions
diff --git a/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-mime-cache-paths.patch b/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-mime-cache-paths.patch
new file mode 100644
index 000000000000..253a67b04ec7
--- /dev/null
+++ b/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-mime-cache-paths.patch
@@ -0,0 +1,323 @@
+From 29f4ad88e2294ae70b10180e7361d135c4e5c896 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jos=C3=A9=20Romildo=20Malaquias?= <malaquias@gmail.com>
+Date: Mon, 13 May 2019 00:09:42 -0300
+Subject: [PATCH 2/2] Use XDG to look for mime cache
+
+---
+ .../shutil/mimesappsmanager.cpp               | 230 ++++++++++--------
+ .../shutil/mimesappsmanager.h                 |   6 +-
+ 2 files changed, 125 insertions(+), 111 deletions(-)
+
+diff --git a/dde-file-manager-lib/shutil/mimesappsmanager.cpp b/dde-file-manager-lib/shutil/mimesappsmanager.cpp
+index c9e53630..7a21df51 100644
+--- a/dde-file-manager-lib/shutil/mimesappsmanager.cpp
++++ b/dde-file-manager-lib/shutil/mimesappsmanager.cpp
+@@ -552,14 +552,20 @@ QString MimesAppsManager::getMimeAppsCacheFile()
+     return QString("%1/%2").arg(DFMStandardPaths::location(DFMStandardPaths::CachePath), "MimeApps.json");
+ }
+ 
+-QString MimesAppsManager::getMimeInfoCacheFilePath()
++QStringList MimesAppsManager::getMimeInfoCacheFilePath()
+ {
+-    return "/usr/share/applications/mimeinfo.cache";
++    QStringList paths;
++    for (const QString dir : getMimeInfoCacheFileRootPath() )
++       paths.append(dir + QDir::separator() + "mimeinfo.cache");
++    qDebug() << "getMimeInfoCacheFilePath: " << paths;
++    return paths;
+ }
+ 
+-QString MimesAppsManager::getMimeInfoCacheFileRootPath()
++QStringList MimesAppsManager::getMimeInfoCacheFileRootPath()
+ {
+-    return "/usr/share/applications";
++    QStringList paths = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
++    qDebug() << "getMimeInfoCacheFileRootPath: " << paths;
++    return paths;
+ }
+ 
+ QString MimesAppsManager::getDesktopFilesCacheFile()
+@@ -574,23 +580,27 @@ QString MimesAppsManager::getDesktopIconsCacheFile()
+ 
+ QStringList MimesAppsManager::getDesktopFiles()
+ {
+-      QStringList desktopFiles;
++    QStringList desktopFiles;
+ 
+-      foreach (QString desktopFolder, getApplicationsFolders()) {
+-          QDirIterator it(desktopFolder, QStringList("*.desktop"),
+-                          QDir::Files | QDir::NoDotAndDotDot,
+-                          QDirIterator::Subdirectories);
+-          while (it.hasNext()) {
+-            it.next();
+-            desktopFiles.append(it.filePath());
+-          }
+-      }
+-      return desktopFiles;
++    foreach (QString desktopFolder, getApplicationsFolders()) {
++        QDirIterator it(desktopFolder, QStringList("*.desktop"),
++                        QDir::Files | QDir::NoDotAndDotDot,
++                        QDirIterator::Subdirectories);
++        while (it.hasNext()) {
++          it.next();
++          desktopFiles.append(it.filePath());
++        }
++    }
++    return desktopFiles;
+ }
+ 
+-QString MimesAppsManager::getDDEMimeTypeFile()
++QStringList MimesAppsManager::getDDEMimeTypeFile()
+ {
+-    return QString("%1/%2/%3").arg(getMimeInfoCacheFileRootPath(), "deepin", "dde-mimetype.list");
++    QStringList paths;
++    for (const QString path : getMimeInfoCacheFileRootPath())
++       paths.append(QString("%1/%2/%3").arg(path, "deepin", "dde-mimetype.list"));
++    qDebug() << "getDDEMimeTypeFile: " << paths;
++    return paths;
+ }
+ 
+ QMap<QString, DesktopFile> MimesAppsManager::getDesktopObjs()
+@@ -663,124 +673,128 @@ void MimesAppsManager::initMimeTypeApps()
+         MimeApps.insert(key, orderApps);
+     }
+ 
+-    //check mime apps from cache
+-    QFile f(getMimeInfoCacheFilePath());
+-    if(!f.open(QIODevice::ReadOnly)){
+-        qDebug () << "failed to read mime info cache file:" << f.errorString();
+-        return;
+-    }
+-
+     QStringList audioDesktopList;
+     QStringList imageDeksopList;
+     QStringList textDekstopList;
+     QStringList videoDesktopList;
+ 
+-    while (!f.atEnd()) {
+-        QString data = f.readLine();
+-        QString _desktops = data.split("=").last();
+-        QString mimeType = data.split("=").first();
+-        QStringList desktops = _desktops.split(";");
+-
+-        foreach (const QString desktop, desktops) {
+-            if(desktop.isEmpty() || audioDesktopList.contains(desktop))
+-                continue;
++    //check mime apps from cache
++    for (const QString path : getMimeInfoCacheFilePath()) {
++        QFile f(path);
++        if(!f.open(QIODevice::ReadOnly)){
++            qDebug () << "failed to read mime info cache file:" << f.errorString();
++            return;
++        }
+ 
+-            if(mimeType.startsWith("audio")){
+-                if(!audioDesktopList.contains(desktop))
+-                    audioDesktopList << desktop;
+-            } else if(mimeType.startsWith("image")){
+-                if(!imageDeksopList.contains(desktop))
+-                    imageDeksopList << desktop;
+-            } else if(mimeType.startsWith("text")){
+-                if(!textDekstopList.contains(desktop))
+-                    textDekstopList << desktop;
+-            } else if(mimeType.startsWith("video")){
+-                if(!videoDesktopList.contains(desktop))
+-                    videoDesktopList << desktop;
++        while (!f.atEnd()) {
++            QString data = f.readLine();
++            QString _desktops = data.split("=").last();
++            QString mimeType = data.split("=").first();
++            QStringList desktops = _desktops.split(";");
++
++            foreach (const QString desktop, desktops) {
++                if(desktop.isEmpty() || audioDesktopList.contains(desktop))
++                    continue;
++
++                if(mimeType.startsWith("audio")){
++                    if(!audioDesktopList.contains(desktop))
++                        audioDesktopList << desktop;
++                } else if(mimeType.startsWith("image")){
++                    if(!imageDeksopList.contains(desktop))
++                        imageDeksopList << desktop;
++                } else if(mimeType.startsWith("text")){
++                    if(!textDekstopList.contains(desktop))
++                        textDekstopList << desktop;
++                } else if(mimeType.startsWith("video")){
++                    if(!videoDesktopList.contains(desktop))
++                        videoDesktopList << desktop;
++                }
+             }
+         }
++        f.close();
+     }
+-    f.close();
+ 
+-    const QString mimeInfoCacheRootPath = getMimeInfoCacheFileRootPath();
+-    foreach (QString desktop, audioDesktopList) {
+-        const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
+-        if(!QFile::exists(path))
+-            continue;
+-        DesktopFile df(path);
+-        AudioMimeApps.insert(path, df);
+-    }
++    for (const QString mimeInfoCacheRootPath : getMimeInfoCacheFileRootPath()) {
++        foreach (QString desktop, audioDesktopList) {
++            const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
++            if(!QFile::exists(path))
++                continue;
++            DesktopFile df(path);
++            AudioMimeApps.insert(path, df);
++        }
+ 
+-    foreach (QString desktop, imageDeksopList) {
+-        const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
+-        if(!QFile::exists(path))
+-            continue;
+-        DesktopFile df(path);
+-        ImageMimeApps.insert(path, df);
+-    }
++        foreach (QString desktop, imageDeksopList) {
++            const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
++            if(!QFile::exists(path))
++                continue;
++            DesktopFile df(path);
++            ImageMimeApps.insert(path, df);
++        }
+ 
+-    foreach (QString desktop, textDekstopList) {
+-        const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
+-        if(!QFile::exists(path))
+-            continue;
+-        DesktopFile df(path);
+-        TextMimeApps.insert(path, df);
+-    }
++        foreach (QString desktop, textDekstopList) {
++            const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
++            if(!QFile::exists(path))
++                continue;
++            DesktopFile df(path);
++            TextMimeApps.insert(path, df);
++        }
+ 
+-    foreach (QString desktop, videoDesktopList) {
+-        const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
+-        if(!QFile::exists(path))
+-            continue;
+-        DesktopFile df(path);
+-        VideoMimeApps.insert(path, df);
++        foreach (QString desktop, videoDesktopList) {
++            const QString path = QString("%1/%2").arg(mimeInfoCacheRootPath,desktop);
++            if(!QFile::exists(path))
++                continue;
++            DesktopFile df(path);
++            VideoMimeApps.insert(path, df);
++        }
+     }
+-
+     return;
+ }
+ 
+ void MimesAppsManager::loadDDEMimeTypes()
+ {
+-    QSettings settings(getDDEMimeTypeFile(), QSettings::IniFormat);
+-    qDebug() << settings.childGroups();
++    for (const QString path : getDDEMimeTypeFile()) {
++        QSettings settings(path, QSettings::IniFormat);
++        qDebug() << settings.childGroups();
+ 
+-    QFile file(getDDEMimeTypeFile());
+-    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+-        return;
+-    }
++        QFile file(path);
++        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
++            continue;
++        }
++
++        // Read propeties
++        QTextStream in(&file);
++        QString desktopKey;
++        while (!in.atEnd()) {
+ 
+-    // Read propeties
+-    QTextStream in(&file);
+-    QString desktopKey;
+-    while (!in.atEnd()) {
++          // Read new line
++          QString line = in.readLine();
+ 
+-      // Read new line
+-      QString line = in.readLine();
++          // Skip empty line or line with invalid format
++          if (line.trimmed().isEmpty()) {
++            continue;
++          }
+ 
+-      // Skip empty line or line with invalid format
+-      if (line.trimmed().isEmpty()) {
+-        continue;
+-      }
++          // Read group
++          // NOTE: symbols '[' and ']' can be found not only in group names, but
++          // only group can start with '['
+ 
+-      // Read group
+-      // NOTE: symbols '[' and ']' can be found not only in group names, but
+-      // only group can start with '['
++          if (line.trimmed().startsWith("[") && line.trimmed().endsWith("]")) {
++                QString tmp = line.trimmed().replace("[", "").replace("]", "");
++                desktopKey = tmp;
++                continue;
++          }
+ 
+-      if (line.trimmed().startsWith("[") && line.trimmed().endsWith("]")) {
+-            QString tmp = line.trimmed().replace("[", "").replace("]", "");
+-            desktopKey = tmp;
+-            continue;
+-      }
+-
+-      // If we are in correct group and line contains assignment then read data
+-      int first_equal = line.indexOf('=');
+-      if (!desktopKey.isEmpty() && first_equal >= 0) {
+-            QString value = line.mid(first_equal + 1);
+-            QStringList mimetypes = value.split(";");
+-            DDE_MimeTypes.insert(desktopKey, mimetypes);
+-            desktopKey.clear();
++          // If we are in correct group and line contains assignment then read data
++          int first_equal = line.indexOf('=');
++          if (!desktopKey.isEmpty() && first_equal >= 0) {
++                QString value = line.mid(first_equal + 1);
++                QStringList mimetypes = value.split(";");
++                DDE_MimeTypes.insert(desktopKey, mimetypes);
++                desktopKey.clear();
++            }
+         }
++        file.close();
+     }
+-    file.close();
+ }
+ 
+ bool MimesAppsManager::lessByDateTime(const QFileInfo &f1, const QFileInfo &f2)
+diff --git a/dde-file-manager-lib/shutil/mimesappsmanager.h b/dde-file-manager-lib/shutil/mimesappsmanager.h
+index 223c80aa..00a61302 100644
+--- a/dde-file-manager-lib/shutil/mimesappsmanager.h
++++ b/dde-file-manager-lib/shutil/mimesappsmanager.h
+@@ -101,12 +101,12 @@ public:
+ 
+     static QStringList getApplicationsFolders();
+     static QString getMimeAppsCacheFile();
+-    static QString getMimeInfoCacheFilePath();
+-    static QString getMimeInfoCacheFileRootPath();
++    static QStringList getMimeInfoCacheFilePath();
++    static QStringList getMimeInfoCacheFileRootPath();
+     static QString getDesktopFilesCacheFile();
+     static QString getDesktopIconsCacheFile();
+     static QStringList getDesktopFiles();
+-    static QString getDDEMimeTypeFile();
++    static QStringList getDDEMimeTypeFile();
+     static QMap<QString, DesktopFile> getDesktopObjs();
+     static void initMimeTypeApps();
+     static void loadDDEMimeTypes();
+-- 
+2.21.0
+
diff --git a/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-paths.patch b/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-paths.patch
new file mode 100644
index 000000000000..3ced15e7e5a4
--- /dev/null
+++ b/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.fix-paths.patch
@@ -0,0 +1,89 @@
+From e68d983a6befd223087916cb3fe31baee77decc4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jos=C3=A9=20Romildo=20Malaquias?= <malaquias@gmail.com>
+Date: Sun, 12 May 2019 08:50:07 -0300
+Subject: [PATCH 1/2] Use qt library to determine where to look for application
+ files
+
+---
+ dde-file-manager-lib/shutil/fileutils.cpp     | 34 ++++++++++++-------
+ .../shutil/mimesappsmanager.cpp               | 11 ++----
+ 2 files changed, 25 insertions(+), 20 deletions(-)
+
+diff --git a/dde-file-manager-lib/shutil/fileutils.cpp b/dde-file-manager-lib/shutil/fileutils.cpp
+index ae8120d3..d6a0573a 100644
+--- a/dde-file-manager-lib/shutil/fileutils.cpp
++++ b/dde-file-manager-lib/shutil/fileutils.cpp
+@@ -242,13 +242,19 @@ bool FileUtils::isArchive(const QString &path)
+  */
+ QStringList FileUtils::getApplicationNames() {
+   QStringList appNames;
+-  QDirIterator it("/usr/share/applications", QStringList("*.desktop"),
+-                  QDir::Files | QDir::NoDotAndDotDot,
+-                  QDirIterator::Subdirectories);
+-  while (it.hasNext()) {
+-    it.next();
+-    appNames.append(it.fileName());
++
++  const QStringList desktopDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
++  qDebug() << "dde-file-manager getApplicationNames desktopDirs:" << desktopDirs;
++  for (const QString &dir : desktopDirs) {
++    QDirIterator it(dir, QStringList("*.desktop"),
++                    QDir::Files | QDir::NoDotAndDotDot,
++                    QDirIterator::Subdirectories);
++    while (it.hasNext()) {
++      it.next();
++      appNames.append(it.fileName());
++    }
+   }
++  
+   return appNames;
+ }
+ //---------------------------------------------------------------------------
+@@ -259,12 +265,16 @@ QStringList FileUtils::getApplicationNames() {
+  */
+ QList<DesktopFile> FileUtils::getApplications() {
+   QList<DesktopFile> apps;
+-  QDirIterator it("/usr/share/applications", QStringList("*.desktop"),
+-                  QDir::Files | QDir::NoDotAndDotDot,
+-                  QDirIterator::Subdirectories);
+-  while (it.hasNext()) {
+-    it.next();
+-    apps.append(DesktopFile(it.filePath()));
++  const QStringList desktopDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
++  qDebug() << "dde-file-manager getApplications desktopDirs:" << desktopDirs;
++  for (const QString &dir : desktopDirs) {
++    QDirIterator it(dir, QStringList("*.desktop"),
++                    QDir::Files | QDir::NoDotAndDotDot,
++                    QDirIterator::Subdirectories);
++    while (it.hasNext()) {
++      it.next();
++      apps.append(DesktopFile(it.filePath()));
++    }
+   }
+   return apps;
+ }
+diff --git a/dde-file-manager-lib/shutil/mimesappsmanager.cpp b/dde-file-manager-lib/shutil/mimesappsmanager.cpp
+index c6149702..c9e53630 100644
+--- a/dde-file-manager-lib/shutil/mimesappsmanager.cpp
++++ b/dde-file-manager-lib/shutil/mimesappsmanager.cpp
+@@ -542,14 +542,9 @@ QStringList MimesAppsManager::getrecommendedAppsFromMimeWhiteList(const DUrl &ur
+ 
+ QStringList MimesAppsManager::getApplicationsFolders()
+ {
+-    QStringList desktopFolders;
+-    desktopFolders << QString("/usr/share/applications/")
+-                   << QString("/usr/local/share/applications/")
+-                   << QString("/usr/share/gnome/applications/")
+-                   << QString("/var/lib/flatpak/exports/share/applications")
+-                   << QDir::homePath() + QString("/.local/share/flatpak/exports/share/applications")
+-                   << QDir::homePath() + QString( "/.local/share/applications" );
+-    return desktopFolders;
++    QStringList paths = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
++    qDebug() << "dde-file-manager getApplicationsFolders:" << paths;
++    return paths;
+ }
+ 
+ QString MimesAppsManager::getMimeAppsCacheFile()
+-- 
+2.21.0
+
diff --git a/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.pixmaps-paths.patch b/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.pixmaps-paths.patch
new file mode 100644
index 000000000000..582760e6db2a
--- /dev/null
+++ b/pkgs/desktops/deepin/dde-file-manager/dde-file-manager.pixmaps-paths.patch
@@ -0,0 +1,38 @@
+From 084c3cfcf4995c109ca2e96f042fe341f925b0b4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jos=C3=A9=20Romildo=20Malaquias?= <malaquias@gmail.com>
+Date: Thu, 16 May 2019 19:00:52 -0300
+Subject: [PATCH 4/4] Use xdg to look for pixmap icons
+
+---
+ dde-file-manager-lib/shutil/fileutils.cpp | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/dde-file-manager-lib/shutil/fileutils.cpp b/dde-file-manager-lib/shutil/fileutils.cpp
+index d6a0573a..e912e7c2 100644
+--- a/dde-file-manager-lib/shutil/fileutils.cpp
++++ b/dde-file-manager-lib/shutil/fileutils.cpp
+@@ -362,11 +362,16 @@ QIcon FileUtils::searchAppIcon(const DesktopFile &app,
+   }
+ 
+   // Last chance
+-  QDir appIcons("/usr/share/pixmaps","", 0, QDir::Files | QDir::NoDotAndDotDot);
+-  QStringList iconFiles = appIcons.entryList();
+-  QStringList searchIcons = iconFiles.filter(name);
+-  if (searchIcons.count() > 0) {
+-    return QIcon("/usr/share/pixmaps/" + searchIcons.at(0));
++  const QStringList dirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
++  qDebug() << "searchAppIcon: last chance: look for pixmaps at: " << dirs;
++  for (const QString &dir : dirs) {
++    const QString path = dir + QDir::separator() + "pixmaps";
++    QDir appIcons(path,"", 0, QDir::Files | QDir::NoDotAndDotDot);
++    QStringList iconFiles = appIcons.entryList();
++    QStringList searchIcons = iconFiles.filter(name);
++    if (searchIcons.count() > 0) {
++      return QIcon(path + QDir::separator() + searchIcons.at(0));
++    }
+   }
+ 
+   // Default icon
+-- 
+2.21.0
+
diff --git a/pkgs/desktops/deepin/dde-file-manager/default.nix b/pkgs/desktops/deepin/dde-file-manager/default.nix
new file mode 100644
index 000000000000..44964b65c9d7
--- /dev/null
+++ b/pkgs/desktops/deepin/dde-file-manager/default.nix
@@ -0,0 +1,251 @@
+{ stdenv, fetchFromGitHub, pkgconfig, avfs, dde-daemon, dde-dock,
+  dde-polkit-agent, dde-qt-dbus-factory, deepin, deepin-anything,
+  deepin-desktop-schemas, deepin-gettext-tools, deepin-movie-reborn,
+  deepin-shortcut-viewer, deepin-terminal, dtkcore, dtkwidget,
+  ffmpegthumbnailer, file, glib, gnugrep, gsettings-qt, gvfs,
+  jemalloc, kcodecs, libX11, libsecret, polkit, polkit-qt, poppler,
+  procps, qmake, qt5integration, qtmultimedia, qtsvg, qttools,
+  qtx11extras, runtimeShell, samba, shadow, taglib, udisks2-qt5,
+  xdg-user-dirs, xorg, zlib, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dde-file-manager";
+  version = "4.8.6.2";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "1qw9slssvy6c4j9czyqrhlr3pq6hzxybb86darja2vka84zmvwip";
+  };
+
+  nativeBuildInputs = [
+    deepin.setupHook
+    qmake
+    qttools
+    pkgconfig
+    deepin-gettext-tools
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    avfs
+    dde-daemon
+    dde-dock
+    dde-polkit-agent
+    dde-qt-dbus-factory
+    deepin-anything
+    deepin-desktop-schemas
+    deepin-movie-reborn.dev
+    deepin-shortcut-viewer
+    deepin-terminal
+    dtkcore
+    dtkwidget
+    ffmpegthumbnailer
+    file
+    glib.bin
+    glib.dev
+    gnugrep
+    gsettings-qt
+    gvfs
+    jemalloc
+    kcodecs
+    libsecret
+    polkit
+    polkit-qt
+    poppler
+    procps
+    qt5integration
+    qtmultimedia
+    qtsvg
+    qtx11extras
+    samba
+    taglib
+    udisks2-qt5
+    xdg-user-dirs
+    xorg.libX11
+    xorg.libxcb
+    xorg.xcbutil
+    xorg.xcbutilwm
+    xorg.xorgproto
+    zlib
+  ];
+
+  patches = [
+    ./dde-file-manager.fix-paths.patch
+    ./dde-file-manager.fix-mime-cache-paths.patch
+    ./dde-file-manager.pixmaps-paths.patch
+  ];
+
+  postPatch = ''
+    searchHardCodedPaths
+
+    patchShebangs dde-desktop/translate_generation.sh
+    patchShebangs dde-desktop/translate_ts2desktop.sh
+    patchShebangs dde-file-manager-lib/generate_translations.sh
+    patchShebangs dde-file-manager/generate_translations.sh
+    patchShebangs dde-file-manager/translate_ts2desktop.sh
+    patchShebangs usb-device-formatter/generate_translations.sh
+    patchShebangs usb-device-formatter/translate_ts2desktop.sh
+
+    # x-terminal-emulator is a virtual package in Debian systems. The
+    # terminal emulator is configured by Debian's alternative system.
+    # It is not available on NixOS. Use deepin-terminal instead
+    sed -i -e "s,x-terminal-emulator,deepin-terminal," \
+      dde-file-manager-lib/shutil/fileutils.cpp
+
+    sed -i -e "s,\$\$\\[QT_INSTALL_LIBS\\],$out/lib," \
+       dde-file-manager-lib/dde-file-manager-lib.pro \
+       dde-file-thumbnail-tool/common.pri \
+       common/common.pri
+
+    sed -i '/^QMAKE_PKGCONFIG_DESTDIR/i QMAKE_PKGCONFIG_PREFIX = $$PREFIX' \
+       dde-file-manager-lib/dde-file-manager-lib.pro
+
+    fixPath ${dde-dock} /usr/include/dde-dock \
+      dde-dock-plugins/disk-mount/disk-mount.pro
+
+    # treefrog is not available in NixOS, and I am not sure if it is really needed
+    #fixPath $ {treefrog-framework} /usr/include/treefrog \
+    #  dde-sharefiles/appbase.pri
+
+    fixPath ${deepin-anything} /usr/share/dbus-1/interfaces \
+      dde-file-manager-lib/dbusinterface/dbusinterface.pri
+
+    sed -i -e "s,\$\$system(\$\$PKG_CONFIG --variable libdir deepin-anything-server-lib),$out/lib," \
+      deepin-anything-server-plugins/dde-anythingmonitor/dde-anythingmonitor.pro
+
+    fixPath ${dde-daemon} /usr/lib/deepin-daemon/desktop-toggle \
+      dde-zone/mainwindow.h
+
+    fixPath ${deepin-gettext-tools} /usr/bin/deepin-desktop-ts-convert \
+      dde-desktop/translate_desktop2ts.sh \
+      dde-desktop/translate_ts2desktop.sh \
+      dde-file-manager/translate_desktop2ts.sh \
+      dde-file-manager/translate_ts2desktop.sh \
+      usb-device-formatter/translate_desktop2ts.sh \
+      usb-device-formatter/translate_ts2desktop.sh
+
+    fixPath ${avfs} /usr/bin/mountavfs dde-file-manager-lib/shutil/fileutils.cpp
+    fixPath ${avfs} /usr/bin/umountavfs dde-file-manager-lib/shutil/fileutils.cpp
+
+    fixPath ${deepin-terminal} /usr/bin/deepin-terminal \
+      dde-file-manager-lib/shutil/fileutils.cpp
+
+    fixPath $out /usr/share/dde-file-manager \
+      dde-sharefiles/appbase.pri \
+      dde-sharefiles/dde-sharefiles.pro
+
+    fixPath $out /usr/share/usb-device-formatter \
+      usb-device-formatter/main.cpp
+
+    fixPath $out /usr/share/applications \
+      dde-file-manager/mips/dde-file-manager-autostart.desktop \
+      dde-desktop/development.pri
+
+    fixPath $out /usr/bin \
+      dbusservices/com.deepin.dde.desktop.service \
+      dde-desktop/data/com.deepin.dde.desktop.service \
+      dde-desktop/dbus/filedialog/com.deepin.filemanager.filedialog.service \
+      dde-desktop/dbus/filemanager1/org.freedesktop.FileManager.service \
+      dde-file-manager-daemon/dbusservice/com.deepin.filemanager.daemon.service \
+      dde-file-manager-daemon/dbusservice/dde-filemanager-daemon.service \
+      dde-file-manager-daemon/dde-file-manager-daemon.pro \
+      dde-file-manager-lib/dde-file-manager-lib.pro \
+      dde-file-manager-lib/pkexec/com.deepin.pkexec.dde-file-manager.policy \
+      dde-file-manager/dde-file-manager-xdg-autostart.desktop \
+      dde-file-manager/dde-file-manager.desktop \
+      dde-file-manager/dde-file-manager.pro \
+      dde-file-manager/mips/dde-file-manager-autostart.desktop \
+      dde-file-manager/mips/dde-file-manager.desktop \
+      dde-file-manager/pkexec/com.deepin.pkexec.dde-file-manager.policy \
+      usb-device-formatter/pkexec/com.deepin.pkexec.usb-device-formatter.policy \
+      usb-device-formatter/usb-device-formatter.desktop \
+      usb-device-formatter/usb-device-formatter.pro
+      fixPath $out /etc \
+      dde-file-manager/dde-file-manager.pro \
+      dde-file-manager-daemon/dde-file-manager-daemon.pro
+
+    fixPath $out /usr \
+      common/common.pri \
+      dde-desktop/dbus/filedialog/filedialog.pri \
+      dde-desktop/dbus/filemanager1/filemanager1.pri \
+      dde-desktop/development.pri \
+      dde-dock-plugins/disk-mount/disk-mount.pro \
+      dde-file-manager-daemon/dde-file-manager-daemon.pro \
+      usb-device-formatter/usb-device-formatter.pro
+
+    sed -i -e "s,xdg-user-dir,${xdg-user-dirs}/bin/xdg-user-dir," \
+      dde-file-manager/dde-xdg-user-dirs-update
+
+    sed -i -e "s,Exec=dde-file-manager,Exec=$out/bin/dde-file-manager," \
+      dde-file-manager/dde-file-manager.desktop
+
+    sed -i -e "s,Exec=gio,Exec=${glib.bin}/bin/gio," \
+      dde-desktop/data/applications/dde-trash.desktop \
+      dde-desktop/data/applications/dde-computer.desktop
+
+    sed -i -e "s,/usr/lib/gvfs/gvfsd,${gvfs}/libexec/gvfsd," \
+      dde-file-manager-lib/gvfs/networkmanager.cpp
+
+    sed -i -e "s,/usr/sbin/smbd,${samba}/bin/smbd," \
+           -e "s,/usr/sbin/groupadd,${shadow}/bin/groupadd," \
+           -e "s,/usr/sbin/adduser,${shadow}/bin/adduser," \
+      dde-file-manager-daemon/usershare/usersharemanager.cpp
+
+    sed -i -e 's,startDetached("deepin-shortcut-viewer",startDetached("${deepin-shortcut-viewer}/bin/deepin-shortcut-viewer",' \
+      dde-file-manager-lib/controllers/appcontroller.cpp
+
+    sed -i -e 's,/bin/bash,${runtimeShell},' \
+           -e 's,\<ps\>,${procps}/bin/ps,' \
+           -e 's,\<grep\>,${gnugrep}/bin/grep,' \
+      utils/utils.cpp \
+      dde-file-manager-lib/controllers/fileeventprocessor.cpp
+
+    # The hard coded path in `QString("/etc/xdg/%1/%2")` in
+    # dde-file-manager-lib/interfaces/dfmsettings.cpp
+    # does not needed a fix because all the standard locations
+    # are tried before faling back to /etc/xdg.
+
+    # I do not know yet how to deal with:
+    #   dde-file-manager-lib/sw_label/llsdeepinlabellibrary.h:        return "/usr/lib/sw_64-linux-gnu/dde-file-manager/libllsdeeplabel.so";
+    #   dde-file-manager-lib/sw_label/filemanagerlibrary.h:        return "/usr/lib/sw_64-linux-gnu/dde-file-manager/libfilemanager.so";
+    #   dde-file-manager-lib/sw_label/libinstall.sh:mkdir /usr/lib/sw_64-linux-gnu/dde-file-manager
+    #   dde-file-manager-lib/sw_label/libinstall.sh:cp libfilemanager.so libllsdeeplabel.so /usr/lib/sw_64-linux-gnu/dde-file-manager
+    # They are not present on my installations of Deepin Linux, Arch Linux and Ubuntu. Can they be ignored?
+
+    # Notes:
+    # - As file-roller is looked in the path using QStandardPaths::findExecutable, it is not been added as a dependency.
+    # - deepin-qt5config is a dependency exclusive to the Deepin Linux distribution. No other distribution has it, according to repology.
+  '';
+
+  qmakeFlags = [
+    "QMAKE_CFLAGS_ISYSTEM="
+
+    # Disable ffmpeg
+    "CONFIG+=DISABLE_FFMPEG"
+  ];
+
+  preBuild = ''
+    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${zlib}/lib";
+    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libX11}/lib";
+  '';
+
+  postFixup = ''
+    # debuging
+    unset LD_LIBRARY_PATH
+    searchForUnresolvedDLL $out
+    searchHardCodedPaths $out
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "File manager and desktop module for Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/dde-file-manager;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/pkgs/desktops/deepin/deepin-movie-reborn/default.nix b/pkgs/desktops/deepin/deepin-movie-reborn/default.nix
index 914e77d85157..ef47603f817b 100644
--- a/pkgs/desktops/deepin/deepin-movie-reborn/default.nix
+++ b/pkgs/desktops/deepin/deepin-movie-reborn/default.nix
@@ -14,6 +14,8 @@ stdenv.mkDerivation rec {
     sha256 = "1qh079j4c2n33z0ykv87af9vfkmdxxrv6dy54wdqdpr7vrhn89gb";
   };
 
+  outputs = [ "out" "dev" ];
+
   nativeBuildInputs = [
     cmake
     pkgconfig
diff --git a/pkgs/desktops/deepin/default.nix b/pkgs/desktops/deepin/default.nix
index ccc2270a8edf..49114330f135 100644
--- a/pkgs/desktops/deepin/default.nix
+++ b/pkgs/desktops/deepin/default.nix
@@ -11,6 +11,7 @@ let
     dde-calendar = callPackage ./dde-calendar { };
     dde-daemon = callPackage ./dde-daemon { };
     dde-dock = callPackage ./dde-dock { };
+    dde-file-manager = callPackage ./dde-file-manager { };
     dde-network-utils = callPackage ./dde-network-utils { };
     dde-polkit-agent = callPackage ./dde-polkit-agent { };
     dde-qt-dbus-factory = callPackage ./dde-qt-dbus-factory { };