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
#註銷生效