本人之前在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給了言簡意賅的編譯過程。先安裝依賴,而後建立編譯目錄,最後編譯和安裝。服務器
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
函數
git clone https://github.com/linuxdeepin/deepin-terminal.git
學習
本篇博客使用的版本是:5.4.0.12ui
本人並無強大的cpp和qt編程背景,直接面向源碼和搜索引擎。
在半個月反覆啃了幾回源碼以後,稍微理出一些頭緒。
deepin-terminal的代碼相對穩定,添加一個快捷鍵應該不難。
在原有代碼基礎上,最大程度保持代碼風格的同時,添加相應的功能代碼就能夠。
這裏不得不感謝官方開發人員們統一的編碼風格和強大的註釋。註釋真的很重要。
總結一下修改過程:
細化一下過程:
進一步細化:
我在摸索前進的過程當中,實現了兩個版本。
第一個版本主要實現了同一個終端實例狀況下,當前標籤頁經過快捷鍵實現」半透明「和」不透明「的功能,而其餘標籤保持默認。這裏添加了兩個快捷鍵。
第二個版本主要實現了同一個終端實例狀況下,全部標籤頁保持狀態同步,即都透明或者都不透明,僅一個快捷鍵實現狀態翻轉(相似於xshell)。
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
快捷鍵:
該版本只須要用一個快捷鍵是實現狀態翻轉。
思路以下:經過快捷鍵設置了終端透明之後,同時寫入配置文件,經過修改配置文件來是判斷和實現狀態翻轉。
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的需求,就如同文章開頭寫的,不只僅限於一個透明快捷鍵。但願官方可以不斷的更新,我我的也會不斷地學習跟實踐,實現更多的個性化定製功能。