deepin-terminal改造之路
阿新 • • 發佈:2021-03-02
[toc]
# 1. 背景介紹
deepin-terminal是我在使用deepin作業系統的時候主要的生產力工具。隨著新版本系統的不斷優化迭代,deepin-terminal從一開始的gtk設計變成了ddk設計,使得應用與作業系統的風格更加統一。
當然我是比較關注deepin-terminal的功能的,簡單實用即可。以前經常使用xshell,對於xshell這個重量級的工具來說,deepin-terminal的功能相對單一,但是很多xshell的功能,又想在deepin-terminal上用到,該怎麼辦?
呼籲官方多次,但是版本的釋出,功能的增加都需要很長的週期,沒有辦法,自己下載原始碼摸索一下,看看能否自己實現自己的需求了。
ddk的程式設計,需要有C++,Qt等基礎知識,同時可能還需要關注一下官方dtk的介面。對於C++和Qt,我只瞭解一點點,硬著頭皮上了。萬事開頭難,前後堅持了大概1個多月吧,頗有成效。下面就分享一下我的deepin-terminal學習和改造之路。
**宣告:本篇部落格內容僅限於個人學習和應用,切勿商用,違規自究!如有侵權,請聯絡我刪除!轉載請註明出處!**
# 2. 下載原始碼
本篇原始碼下載地址:https://github.com/linuxdeepin/deepin-terminal/tree/5.4.0.13
下載zip檔案後,解壓到指定目錄
> 本人解壓到:/home/liwl/,解壓後可以看到目錄/home/liwl/deepin-terminal-5.4.0.13
# 3. 依賴檢查及安裝
`cd /home/liwl/deepin-terminal-5.4.0.13`,
可以先閱讀該目錄下的README.md內容,便於瞭解整個過程
**首先是檢查依賴**
在該目錄下執行`sudo apt build-dep .`,即可檢查和安裝依賴關係
**編譯和安裝**
在該目錄下執行`mkdir build; cd build; cmake ..; make; sudo install make`
就是整個編譯和安裝的過程了,簡單明瞭
**特別注意:為了能夠很好的展示效果,建議先解除安裝deepin-terminal,因為系統自帶的deepin-terminal執行路徑是:/usr/bin/deepin-terminal,而手動編譯的deepin-terminal安裝路徑在/usr/local/bin/deepin-terminal,自帶的deepin-terminal可能會影響手動編譯的。另外,編譯安裝結束後,建議通過啟動器上面的終端圖示啟動,避免使用快捷鍵啟動。也可以嘗試修改CMakeFile.txt,把手動編譯的deepin-terminal安裝到/usr/bin/目錄下,覆蓋系統自帶deepin-terminal**
# 4. 改造之路
本人基本完成了以下功能特性:
+ 添加了“終端透明度”的快捷鍵設定選項
+ 添加了“雙擊可選中的特殊符號”的設定選項
+ 添加了“啟動初始目錄”的設定選項
+ 添加了“顯示設定介面”的快捷鍵設定選項
+ 右鍵添加了“翻譯”的選項
+ 右鍵添加了“使用文字編輯器開啟”的選項
+ 加粗了游標下劃線
+ 修改了預設Dark主題配色
+ 替換了一個內建主題
未完成的需求:
+ 快捷鍵切換主題
+ 突出顯示敏感內容
+ 彈窗或者側邊欄顯示翻譯內容
+ 雙擊選中中文句子
## 4.1 終端透明度快捷鍵
### 4.1.1 設定面板增加選項內容
在“設定“面板裡面新增選項,需要通過一個json檔案配置,原始碼在編譯過程中會自動解析該json檔案,生成介面元件
該json就是:/home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json
本人慾把”終端透明度“快捷鍵設定在”複製“前面,所以保持json裡面的內容也在其前面。
在default-config.json檔案中找到以下內容:
```json
{
"key": "copy",
"name": "Copy",
"type": "shortcut",
"default": "Ctrl+Shift+C"
},
```
修改為:
```json
{
"key": "opacity",
"name": "Opacity",
"type": "shortcut",
"default": "Alt+r"
},
{
"key": "copy",
"name": "Copy",
"type": "shortcut",
"default": "Ctrl+Shift+C"
},
```
儲存並退出
### 4.1.2 新增配置解析內容
vim 開啟檔案:/home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp,在最後一行大括號上面,新增內容:
```cpp
auto shortcuts_terminal_opacityName = QObject::tr("Opacity");
Q_UNUSED(shortcuts_terminal_opacityName);
```
> 注意參照該檔案的其他部分內容修改,即注意shortcuts_terminal_opacityName為何如何書寫
儲存並退出
### 4.1.3 功能實現
這部分主要是三個步驟:
其一,在`void MainWindow:initShortcuts()`方法的內部,新增以下內容:
```cpp
connect(createNewShotcut("shortcuts.terminal.opacity"),&QShortcut::activated,this,&MainWindow::slotShortcutOpacity); //這是增加的部分,注意分號不要丟了
//copy
connect(createNewShotcut("shortcuts.terminal.copy"), &QShortcut::activated, this, &MainWindow::slotShortcutCopy);
```
其二,在`void MainWindow::slotShortcutCopy()方法的上面`,實現`slotShortcutOpacity()`
```cpp
void MainWindow::slotShortcutOpacity(){
TermWidgetPage *page = currentPage();
if (page){
if (Settings::instance()->settings->option("basic.interface.opacity")->value().toInt() == 100) {
page->setTerminalOpacity(0.85);
Settings::instance()->settings->option("basic.interface.opacity")->setValue(85);
}else{
page->setTerminalOpacity(1.0);
Settings::instance()->settings->option("basic.interface.opacity")->setValue(100);
}
page->focusCurrentTerm();//這個必須有,否則無法聚焦
}
}//這個方法是新增的內容
void MainWindow::slotShortcutCopy()
{
TermWidgetPage *page = currentPage();
if (page) {
page->copyClipboard();
}
}
```
其三,在mainwindow.h新增方法的宣告
```cpp
void slotShortcutOpacity();//這是新增的內容
void slotShortcutBuiltinCopy();
```
儲存並退出
### 4.1.4 編譯安裝
```shell
cd /home/liwl/deepin-terminal-5.4.0.13/build
cmake ..
make
sudo install make
# 預設安裝的路徑是/usr/local/bin/下
```
> 編譯安裝的過程,在本篇以下內容全部通用,下文不再贅述
### 4.1.5 效果展示
![](https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152150608-1775436271.png)
## 4.2 雙擊可選中的特殊符號
該功能在實用性很強,Konsole和xshell都有相關的設定選項,但是deepin-terminal並沒有此功能設定,導致終端在某些使用場景中效率較低。
本部分主要就是實現該功能,把功能選項新增到“高階設定-游標”部分
### 4.2.1 設定面板增加選項內容
首先修改json檔案:vim /home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json,新增部分如下:
```json
{
"key": "auto_copy_selection",
"type": "checkbox",
"text": "Copy on select",
"default": true
},
{
"key": "word_characters",
"name": "Word characters",
"type": "lineedit"
}
```
儲存並退出
### 4.2.2 新增配置解析內容
vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp
在最後一行的花括號上,新增以下內容:
```cpp
auto advanced_cursor_word_charactersText = QObject::tr("Word characters");
Q_UNUSED(advanced_cursor_word_charactersText);
```
> 注意advanced_cursor_word_charactersText寫法,參照該檔案其他部分內容
儲存並退出
### 4.2.3 功能實現
本部分主要包括以下幾個步驟:
其一,編輯檔案:vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/qtermwidget.h
新增以下內容:
```cpp
QFont getTerminalFont();
void setTerminalOpacity(qreal level);
//add by [email protected],begin
void setTerminalWordCharacters(const QString &wc);
//add by [email protected],end
void setTerminalBackgroundImage(QString backgroundImage);
// environment
void setEnvironment(const QStringList &environment);
```
其二,編輯檔案:vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/qtermwidget.cpp
新增以下內容:
```cpp
void QTermWidget::setTerminalOpacity(qreal level)
{
m_impl->m_terminalDisplay->setOpacity(level);
}
//add by [email protected],begin
void QTermWidget::setTerminalWordCharacters(const QString &wc)
{
m_impl->m_terminalDisplay->setWordCharacters(wc);
}
//add by [email protected],end
void QTermWidget::setTerminalBackgroundImage(QString backgroundImage)
{
m_impl->m_terminalDisplay->setBackgroundImage(backgroundImage);
}
```
其三,編輯檔案,vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.h,新增方法宣告:
```cpp
// 修改游標形狀
void setCursorShape(int shape);
//add by [email protected],begin
void setTermWordCharacters(const QString &wc);
//add by [email protected],end
void setPressingScroll(bool enable);
```
其四,編輯檔案:vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.cpp
在`void TermWidget::setCursorShare(int share)`方法下新增以下內容:
```cpp
/*******************************************************************************
1. @函式: setTermWordCharacters
2. @作者: liwl
3. @日期: 2021-03-02
4. @說明: 設定雙擊可選中的分隔符
*******************************************************************************/
void TermWidget::setTermWordCharacters(const QString &wc)
{
setTerminalWordCharacters(wc);
}
```
在`void TermWidget::onSettingValueChanged(const QString &keyName)`方法中的新增以下內容:
```cpp
//add by liwl@2021-03-02,begin
if (keyName == "advanced.cursor.word_characters") {
setTermWordCharacters(Settings::instance()->wordCharacters());
return ;
}
//add by liwl@2021-03-02,en
```
其五,編輯檔案,/home/liwl/deepin-terminal-5.4.0.13/src/settings/settings.h,新增相關方法宣告
```cpp
QString fontName();
//add by [email protected],begin
QString wordCharacters() const;//這裡是屬性的宣告
//add by [email protected],end
int fontSize();
```
```cpp
void backgroundBlurChanged(bool enabled);
//add by [email protected],begin
void wordCharactersChanged(QString wordCharacters);//這裡是訊號的宣告
//add by [email protected],end
void pressingScrollChanged(bool enabled);
```
其六,編輯檔案:vim /home/liwl/Documents/liwl_dev/deepin-terminal_modify_by_liwl/src/settings/settings.cpp
在`void Settings::initConnection()`方法中,新增以下內容:
```cpp
QPointer