deepin定製deepin-terminal

一. 背景介紹

本人之前在win10上常用xshell來登錄服務器。xshell提供了很豐富的功能和快捷鍵。我的比較喜歡的包括三個功能linux

  • 終端透明
  • 雙擊時根據分隔符選中文字
  • 突出顯示

可是自從使用deepin做爲主力操做系統之後,執拗地使用原創應用而非第三方應用的執念一直伴隨着我。因此deepin-terminal成爲我使用頻率最高的應用。可是deepin-terminal相對於xshell這種重量級的專業終端來講,不只輕量,功能也相對單一。git

好比deepin-terminal雖然能夠經過設置來實現透明,可是缺乏設置透明的快捷鍵。在deepin15.11 裏面還能夠經過ctrl+滑輪來調整,可是在deepin 20+版本里,乾脆直接取消了透明快捷操做方式,直接放到終端設置裏面。github

這讓喜歡經過快捷鍵直接調整透明度,以達到單個屏幕複用,可視多個窗口的我極爲抓狂。shell

求救N次無果後,最終決定本身從新編譯,來實現本身想要的功能。編程

本篇博客的操做過程,就是以此爲背景,爲deepin-terminal增長一個透明度快捷鍵的功能json

二. 操做過程

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.12ui

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

相關文章
相關標籤/搜索