一. 背景介紹
本人以前在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的需求,就如同文章開頭寫的,不僅僅限於一個透明快捷鍵。希望官方能夠不斷的更新,我個人也會不斷地學習跟實踐,實現更多的個性化定制功能。