deepin定制deepin-terminal

摘要:
就我个人而言,我喜欢三个功能终端。透明双击时,所选文本将根据分隔符突出显示。然而,由于Deepin已被用作主操作系统,5.4.0.123。我没有很强的cpp和qt编程背景,所以我可以添加相应的函数代码。接下来,将快捷键绑定到可以改变终端的信号上,并细化以下过程:因此,需要将其翻译成中文,在窗口功能中绑定快捷键,并进一步细化信号处理功能:
一. 背景介绍

本人以前在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. 最终效果

设置界面如下图:

deepin定制deepin-terminal第1张

按下alt+r快捷键:

deepin定制deepin-terminal第2张

按下alt+e快捷键:

deepin定制deepin-terminal第3张

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. 效果如下

设置界面如下:

deepin定制deepin-terminal第4张

通过alt+r,即可实现”透明“和”不透明“的状态翻转。

如果透明时,可以发现透明状态栏跟随变化(如下图),主要是因为这个翻转是通过写配置文件实现。

deepin定制deepin-terminal第5张

三. 写在后面

首先声明,本文属我个人原创,转载请著名出处。如果文中有侵权现象,请联系作者删除。

到现在为止,通过个人的努力,基本完成了deepin-terminal的透明度快捷键功能添加。虽然代码添加的比较拙劣,也不知道会不会造成什么bug,但是平常使用应该是没什么问题了。这个过程花费了我将近半个月,期间断断续续放弃与拾起。回头看一下整个过程感觉其实不那么难。

弄清楚过程以后,思路就变得清晰明了。如果有不会的东西,检索一下,一般也能看得懂。

本人对deepin-terminal的需求,就如同文章开头写的,不仅仅限于一个透明快捷键。希望官方能够不断的更新,我个人也会不断地学习跟实践,实现更多的个性化定制功能。

免责声明:文章转载自《deepin定制deepin-terminal》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vivado/FPGA 使用小纪HTML5+CSS3学习笔记(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]

对动态链接库的概念其实还很模糊,自己的理解是:把一些常用的代码,如函数,类等,编译成一个"包"即DLL(WINDOWS下)或者SO(LINUX下)文件,然后供其它程序使用时直接调用里面封闭的函数即可,实现的代码的重用,也节省了硬盘空间(这点可能是次要的吧).在WIDOWS下利用VC++可方便的生成DLL,在LINUX下则需要通过各种编译命令来实现,对于像我...

[小技巧]window10删除此电脑左侧栏中的非磁盘文件夹

一、问题说明    在初始的 此电脑 中,有置顶的文件夹栏,包含图片、视频、下载等多个文件夹 二、解决方式    通过 WIN+R 键,输入 regedit 后确认,打开注册表。定位到  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions  中...

Jmeter(八)

 ------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.com/du-hong/p/13037317.html ----------------------------------------------------...

Linux CA

CA(Certificate Authority)证书颁发机构主要负责证书的颁发、管理以及归档和吊销。证书内包含了拥有证书者的姓名、地址、电子邮件帐号、公钥、证书有效期、发放证书的CA、CA的数字签名等信息。证书主要有三大功能:加密、签名、身份验证。 1.什么是CA认证? CA认证,即CA认证机构,为电子签名相关各方提供真实性、可靠性验证的行为。 2.什么...

阿花宝宝 Java 笔记 之 初识java

1.记事本开发一个Java程序  编写源程序   源程序以.java为后缀名  编译     javac  编译后生成的文件以.class为后缀名  运行     java 运行编译后生成的.class文件2.java程序框架public class Hello{ public static void main(String[] args){  //注释  ...

SpringCloud Alibaba系列(二) Nacos配置中心-分类配置

愿你生命中有够多的云翳,造就一个美好的黄昏    欢迎关注公众号【渣男小四】,一个喜欢技术更喜欢艺术的青年 一.介绍   SpringCloud Alibaba Nacos Config配置中心有三种配置方法,分别为:     1.Data ID配置方案     2.Group配置方案     3.NameSpace配置方案 二.开始   1.D...