3

deepin定制deepin-terminal

 3 years ago
source link: http://www.cnblogs.com/liwanliangblog/p/14348593.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一. 背景介绍

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

设置界面如下图:

AvqIrim.png!mobile

按下 alt+r 快捷键:

mInEvm7.png!mobile

按下 alt+e 快捷键:

M7FnEnN.png!mobile

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

设置界面如下:

YbmYZna.png!mobile

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

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

rmAV7nA.png!mobile

三. 写在后面

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK