一. 背景介紹
本人以前在win10上經常使用xshell來登陸伺服器。xshell提供了很豐富的功能和快捷鍵。個人比較喜歡的包括三個功能
- 終端透明
- 雙擊時根據分隔符選中文字
- 突出顯示
但是自從使用deepin作為主力作業系統以後,固執地使用原創應用而非第三方應用的執念一直伴隨著我。所以deepin-terminal成為我使用頻率最高的應用。但是deepin-terminal相對於xshell這種重量級的專業終端來說,不僅輕量,功能也相對單一。
比如deepin-terminal雖然可以通過設定來實現透明,但是缺少設定透明的快捷鍵。在deepin15.11 裡面還可以通過ctrl+滑輪來調整,但是在deepin 20+版本里,乾脆直接取消了透明快捷操作方式,直接放到終端設定裡面。
這讓喜歡通過快捷鍵直接調整透明度,以達到單個螢幕複用,可視多個視窗的我極為抓狂。
求救N次無果後,最終決定自己重新編譯,來實現自己想要的功能。
本篇部落格的操作過程,就是以此為背景,為deepin-terminal增加一個透明度快捷鍵的功能。
二. 操作過程
github上,deepin-terminal專案的readme給了言簡意賅的編譯過程。先安裝依賴,然後建立編譯目錄,最後編譯和安裝。
1. 首先安裝依賴環境
sudo apt-get intall cmake pkg-config qtbase5-dev qtbase5-private-dev qttools-dev-tools libdtkwidget-dev lxqt-build-tools libdframeworkdbus-dev libutf8proc-dev libatspi2.0-dev libglib2.0-dev libsecret-1-dev
2. 然後下載原始碼
git clone https://github.com/linuxdeepin/deepin-terminal.git
本篇部落格使用的版本是:5.4.0.12
3. 理清思路
本人並沒有強大的cpp和qt程式設計背景,直接面向原始碼和搜尋引擎。
在半個月反覆啃了幾次原始碼之後,稍微理出一些頭緒。
deepin-terminal的程式碼相對穩定,新增一個快捷鍵應該不難。
在原有程式碼基礎上,最大程度保持程式碼風格的同時,新增相應的功能程式碼就可以。
這裡不得不感謝官方開發人員們統一的編碼風格和強大的註釋。註釋真的很重要。
總結一下修改過程:
- 首先要在deepin-terminal的“設定”選項中,新增一個“透明度快捷鍵”的選項
- 其次把該快捷鍵繫結到一個可以改變終端的訊號上
細化一下過程:
- deepin-terminal的“設定”是通過json檔案生成
- json中是英文,因此需要翻譯成中文
- 在視窗功能中繫結快捷鍵盤以及訊號處理函式
進一步細化:
- deepin-terminal-5.4.0.12/src/assets/other/default-config.json 該檔案就是”設定“皮膚的生成檔案。在這裡按照規則新增對應的內容
- deepin-terminal-5.4.0.12/src/settings/settings_translation.cpp 該程式檔案功能是把default-config.json中指定的英文內容翻譯出來
- deepin-terminal-5.4.0.12/translations/deepin-terminal_zh_CN.ts 該檔案指定了要把英文到中文的翻譯內容。需注意翻譯檔案的行號
- deepin-terminal-5.4.0.12/src/main/mainwindow.cpp 該檔案的主要負責繫結快捷鍵與處理快捷鍵的訊號
- deepin-terminal-5.4.0.12/src/main/mainwindow.h 該檔案宣告mainwindow.cpp自定義的快捷鍵訊號處理方法
4. 正式編碼
我在摸索前進的過程中,實現了兩個版本。
第一個版本主要實現了同一個終端例項情況下,當前標籤頁通過快捷鍵實現”半透明“和”不透明“的功能,而其他標籤保持預設。這裡新增了兩個快捷鍵。
第二個版本主要實現了同一個終端例項情況下,所有標籤頁保持狀態同步,即都透明或者都不透明,僅一個快捷鍵實現狀態翻轉(類似於xshell)。
4.1 第一個版本
1. 修改原始碼檔案:deepin-terminal-5.4.0.12/src/settings/settings_translation.cpp
在該檔案的內容
auto shell_profile = QObject::tr("Shell profile");
Q_UNUSED(shell_profile);
的下面,新增新的內容:
auto shortcuts_terminal_seventy_percent_opacityName = QObject::tr("Translucent");
Q_UNUSED(shortcuts_terminal_seventy_percent_opacityName);
auto shortcuts_terminal_one_hundred_percent_opacityName = QObject::tr("Opaque");
Q_UNUSED(shortcuts_terminal_one_hundred_percent_opacityName);
注意變數名的命名規則:
shortcuts_terminal_seventy_percent_opacityName和shortcuts_terminal_one_hundred_percent_opacityName
參照本檔案內部其他行
儲存退出。
2. 修改原始碼檔案:deepin-terminal-5.4.0.12/src/assets/other/default-config.json
在該檔案的配置段內容
{
"key": "copy",
"name": "Copy",
"type": "shortcut",
"default": "Ctrl+Shift+C"
},
的下面,新增新的內容
{
"key": "opaque",
"name": "Opaque",
"type": "shortcut",
"default": "Alt+e"
},
{
"key": "translucent",
"name": "Translucent",
"type": "shortcut",
"default": "Alt+r"
},
儲存退出。
3. 修改原始碼:deepin-terminal-5.4.0.12/src/main/mainwindow.cpp
在該檔案的內容
connect(createNewShotcut("shortcuts.terminal.copy"), &QShortcut::activated, this, &MainWindow::slotShortcutCopy);
的下面,新增新的內容:
connect(createNewShotcut("shortcuts.terminal.opaque"), &QShortcut::activated, this, &MainWindow::slotShortcutOpaque);
connect(createNewShotcut("shortcuts.terminal.translucent"), &QShortcut::activated, this, &MainWindow::slotShortcutTranslucent);
儲存退出。
同時還需要新增功能實現
在該檔案的內容
void MainWindow::slotShortcutCopy()
{
TermWidgetPage *page = currentPage();
if (page) {
page->copyClipboard();
}
}
的下面,新增新的內容:
void MainWindow::slotShortcutOpaque()
{
TermWidgetPage *page = currentPage();
if (page) {
page->setTerminalOpacity(1);
page->focusCurrentTerm();
}
}
void MainWindow::slotShortcutTranslucent()
{
TermWidgetPage *page = currentPage();
if (page) {
page->setTerminalOpacity(0.5);
page->focusCurrentTerm();
}
}
儲存退出。
4. 修改原始碼:deepin-terminal-5.4.0.12/src/main/mainwindow.h
在該檔案的內容
void slotShortcutCopy();
的下面,新增新的內容:
void slotShortcutOpaque();
void slotShortcutTranslucent();
儲存退出。
5. 編譯和安裝
cd build
cmake ..
make
sudo make install
6. 最終效果
設定介面如下圖:
按下alt+r
快捷鍵:
按下alt+e
快捷鍵:
4.2 第二個版本
該版本只需要用一個快捷鍵是實現狀態翻轉。
思路如下:通過快捷鍵設定了終端透明以後,同時寫入配置檔案,通過修改配置檔案來是判斷和實現狀態翻轉。
1. 修改原始碼:deepin-terminal-5.4.0.12/src/settings/settings_translation.cpp
在該檔案的內容
auto shell_profile = QObject::tr("Shell profile");
Q_UNUSED(shell_profile);
的下面,新增新的內容:
auto shortcuts_terminal_seventy_percent_opacityName = QObject::tr("Opacity fast");
Q_UNUSED(shortcuts_terminal_seventy_percent_opacityName);
注意變數名的命名規則:shortcuts_terminal_opacity_fastName
儲存退出
2.修改原始碼:deepin-terminal-5.4.0.12/src/assets/other/default-config.json
在該檔案的配置段
{
"key": "copy",
"name": "Copy",
"type": "shortcut",
"default": "Ctrl+Shift+C"
},
的下面,新增以下新的內容:
{
"key": "opacity_fast",
"name": "Opacity fast",
"type": "shortcut",
"default": "Alt+r"
},
儲存退出。
3.修改檔案:deepin-terminal-5.4.0.12/translations/deepin-terminal_zh_CN.ts
在該檔案的配置內容
<message>
<location filename="../src/settings/settings_translation.cpp" line="85"/>
<location filename="../src/main/mainwindow.cpp" line="2181"/>
<source>Copy</source>
<translation>複製</translation>
</message>
的下面,新增以下新的內容:
<message>
<location filename="../src/settings/settings_translation.cpp" line="159"/>
<source>Opacity fast</source>
<translation>透明快捷鍵</translation>
</message>
需要注意:line=xxx,根據settings_translation.cpp裡面新增新內容後的實際情況修改。
儲存退出。
4.修改檔案:deepin-terminal-5.4.0.12/src/main/mainwindow.cpp
在該檔案的內容
connect(createNewShotcut("shortcuts.terminal.copy"), &QShortcut::activated, this, &MainWindow::slotShortcutCopy);
的下面,新增新的內容:
connect(createNewShotcut("shortcuts.terminal.opacity_fast"), &QShortcut::activated, this, &MainWindow::slotShortcutOpacityFast);
還需要新增一下具體的功能實現程式碼
在該檔案的內容
void MainWindow::slotShortcutCopy()
{
TermWidgetPage *page = currentPage();
if (page) {
page->copyClipboard();
}
}
的下面,新增新的內容:
void MainWindow::slotShortcutOpacityFast()
{
TermWidgetPage *page = currentPage();
if (page) {
if (Settings::instance()->settings->option("basic.interface.opacity")->value().toInt() == 100) {
page->setTerminalOpacity(0.7);
Settings::instance()->settings->option("basic.interface.opacity")->setValue(70);
}else{
page->setTerminalOpacity(1.0);
Settings::instance()->settings->option("basic.interface.opacity")->setValue(100);
}
page->focusCurrentTerm();
}
}
這段才是真正的透明功能的實現
儲存退出。
Settings::instance()->settings->option("basic.interface.opacity")->value().toInt()
,Settings::instance()->settings->option("basic.interface.opacity")->setValue();
可以參照官方說明文件,https://docs.deepin.org/pages/c763f4/
5.修改檔案:deepin-terminal-5.4.0.12/src/main/mainwindow.h
在該檔案的內容:
void slotShortcutCopy();
的下面,新增以下新的內容:
void slotShortcutOpacityFast();
儲存退出。
6. 編譯安裝
cd build
cmake ..
make
sudo make install
7. 效果如下
設定介面如下:
通過alt+r
,即可實現”透明“和”不透明“的狀態翻轉。
如果透明時,可以發現透明狀態列跟隨變化(如下圖),主要是因為這個翻轉是通過寫配置檔案實現。
三. 寫在後面
首先宣告,本文屬我個人原創,轉載請著名出處。如果文中有侵權現象,請聯絡作者刪除。
到現在為止,通過個人的努力,基本完成了deepin-terminal的透明度快捷鍵功能新增。雖然程式碼新增的比較拙劣,也不知道會不會造成什麼bug,但是平常使用應該是沒什麼問題了。這個過程花費了我將近半個月,期間斷斷續續放棄與拾起。回頭看一下整個過程感覺其實不那麼難。
弄清楚過程以後,思路就變得清晰明瞭。如果有不會的東西,檢索一下,一般也能看得懂。
本人對deepin-terminal的需求,就如同文章開頭寫的,不僅僅限於一個透明快捷鍵。希望官方能夠不斷的更新,我個人也會不斷地學習跟實踐,實現更多的個性化定製功能。