deepin20.9文件管理器改造
1. 概述
本篇博客主要介绍在deepin20.9上改造deepin20.9自带版本(5.9.2)文件管理器,与《deepinV23编译文件管理器改造》不同的是,那个是6.0.40的版本,代码重构过,架构清晰。
主要实现的功能:
- 文件管理器可以通过ctrl+d快捷键删除文件
- 桌面可以通过ctrl+d快捷键删除文件
- 桌面可以通过ctrl+shift+n创建目录
2. 操作过程
建议先在deepinv20.9虚拟机操作,确认一切都正常以后,可以用于正式环境。
2.1 获取deepin文件管理器代码
取消仓库里面对源码源的注释:sudo vim /etc/apt/sources.list
,内容如下
## Generated by deepin-installer
deb https://community-packages.deepin.com/deepin/ apricot main contrib non-free
deb-src https://community-packages.deepin.com/deepin/ apricot main contrib non-free
终端执行:
cd ~/Documents
apt source dde-file-manager
cd dde-file-manager-5.9.2/
sudo apt build-dep .
至此,已经下载到源代码,以及编译需要的环境
2.2 修改代码
2.2.1 文件管理器实现ctrl+d删除文件
找到源码位置:vim ./src/dde-file-manager-lib/views/dfileview.cpp
,大概在如下代码块下,增加代码
case Qt::ControlModifier:
switch (event->key()) {
case Qt::Key_N: {
DUrlList list;
for (const DUrl &url : urls) {
const DAbstractFileInfoPointer &info = DFileService::instance()->createFileInfo(this, url);
if (info && info->canFetch())
list << url;
}
appController->actionNewWindow(dMakeEventPointer<DFMUrlListBaseEvent>(this, list.isEmpty() ? DUrlList() << DUrl() : list));
return;
}
//liwl,2024/03/22,begin。以下这部分代码,直接拷贝本文件中case Qt::Key_Delete: 部分代码即可
case Qt::Key_D:{
QString rootPath = rootUrl().toLocalFile();
if (FileUtils::isGvfsMountFile(rootPath) || deviceListener->isInRemovableDeviceFolder(rootPath) || VaultController::isVaultFile(rootPath)) {
appController->actionCompleteDeletion(dMakeEventPointer<DFMUrlListBaseEvent>(this, urls));
} else {
if (urls.size() > 0) {
QString filepath = urls.front().toLocalFile();
if (VaultController::isVaultFile(filepath) && !d->isVaultDelSigConnected) {
d->isVaultDelSigConnected = true;
}
}
if (rootUrl().isTrashFile() && rootUrl() != DUrl::fromTrashFile("/"))
break;
appController->actionDelete(dMakeEventPointer<DFMUrlListBaseEvent>(this, urls));
}
break;
}
//end
2.2.2 桌面实现ctrl+d删除文件
找到源码位置:vim ./src/dde-desktop/view/canvasgridview.cpp
,大概在如下代码块下,增加代码
case Qt::ControlModifier:
switch (event->key()) {
case Qt::Key_Minus:
decreaseIcon();
return;
case Qt::Key_Equal:
increaseIcon();
return;
//liwl,2024/03/22,begin,同样拷贝case Qt::Key_Delete:内容即可
case Qt::Key_D: {
if (canDeleted && !selectUrlsMap.contains(rootUrl.toString()) && !selectUrls.isEmpty()) {
DFileService::instance()->moveToTrash(this, selectUrls);
}
return;
}
//end
case Qt::Key_H: {
//更改显示隐藏状态
bool whetherShowHiddenFiles{ GridManager::instance()->getWhetherShowHiddenFiles() };
GridManager::instance()->setWhetherShowHiddenFiles(!whetherShowHiddenFiles);
//同步刷新,交由GridViewManager调用updateHiddenItems
emit GridManager::instance()->sigSyncOperation(GridManager::soHidenSwitch);
return;
}
2.2.3 桌面实现ctrl+shift+n创建目录
找到源码位置:vim ./src/dde-desktop/view/canvasgridview.cpp
,大概在如下代码块下,增加代码
case Qt::ControlModifier | Qt::ShiftModifier:
if (event->key() == Qt::Key_N) {
if (itemDelegate()->editingIndex().isValid()) {
return;
}
//liwl,2024/03/23,begin,这部分代码是个人研究所写,水平有限
auto dirUrl = currentUrl();
clearSelection();
appController->actionNewFolder(dMakeEventPointer<DFMUrlBaseEvent>(this, dirUrl));
// end
return;
}
if (event->key() == Qt::Key_Question) {
// appController->actionShowHotkeyHelp(fmevent);
return;
}
if (event->key() == Qt::Key_Plus) {
increaseIcon();
return;
}
break;
2.3 编译安装
完成上面代码修改以后,开始进行编译安装,具体操作,参考源码目录下的README.md
$ cd dde-file-manager
$ mkdir build
$ cd build
$ qmake ../filemanager.pro
$ make
$ sudo make install
2.4 移植使用
编译完成后的build/./src/dde-file-manager-lib/libdde-file-manager.so
文件,是实现了上述代码修改的功能的库
需要文件管理器能够实现ctrl+d功能,需要用这个库替换掉之前的库即可
sudo cp /usr/lib/x86_64-linux-gnu/libdde-file-manager.so.1.8.2 /usr/lib/x86_64-linux-gnu/libdde-file-manager.so.1.8.2.bak
sudo cp libdde-file-manager.so /usr/lib/x86_64-linux-gnu/libdde-file-manager.so.1.8.2
#不注销就可以生效
编译完成后的build/src/dde-desktop/dde-desktop
文件,是实现 代码修改后,功能增加的二进制文件
需要桌面实现上述2个更能的,需要用此文件替换之前的二进制文件
sudo cp /usr/bin/dde-desktop /usr/bin/dde-desktop.bak
sudo cp dde-desktop /usr/bin/dde-desktop.new
sudo ln -fs /usr/bin/dde-desktop.new /usr/bin/dde-desktop
#注销生效