本人之前在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的需求,就如同文章开头写的,不只仅限于一个透明快捷键。但愿官方可以不断的更新,我我的也会不断地学习跟实践,实现更多的个性化定制功能。