deepin定製deepin-terminal

運維筆記發表於2021-01-30

一. 背景介紹

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

相關文章