deepin定制deepin-terminal
<h1 id="一-背景介绍">一. 背景介绍</h1><p>本人以前在win10上经常使用xshell来登陆服务器。xshell提供了很丰富的功能和快捷键。个人比较喜欢的包括三个功能</p>
<ul>
<li>终端透明</li>
<li>双击时根据分隔符选中文字</li>
<li>突出显示</li>
</ul>
<p>但是自从使用deepin作为主力操作系统以后,固执地使用原创应用而非第三方应用的执念一直伴随着我。所以deepin-terminal成为我使用频率最高的应用。但是deepin-terminal相对于xshell这种重量级的专业终端来说,不仅轻量,功能也相对单一。</p>
<p>比如deepin-terminal虽然可以通过设置来实现透明,但是缺少设置透明的快捷键。在deepin15.11 里面还可以通过ctrl+滑轮来调整,但是在deepin 20+版本里,干脆直接取消了透明快捷操作方式,直接放到终端设置里面。</p>
<p>这让喜欢通过快捷键直接调整透明度,以达到单个屏幕复用,可视多个窗口的我极为抓狂。</p>
<p>求救N次无果后,最终决定自己重新编译,来实现自己想要的功能。</p>
<p>本篇博客的操作过程,就是以此为背景,<strong>为deepin-terminal增加一个透明度快捷键的功能</strong>。</p>
<h1 id="二-操作过程">二. 操作过程</h1>
<p>github上,deepin-terminal项目的readme给了言简意赅的编译过程。先安装依赖,然后创建编译目录,最后编译和安装。</p>
<h2 id="1-首先安装依赖环境">1. 首先安装依赖环境</h2>
<p><code>sudo apt-get intall cmake pkg-config qtbase5-dev qtbase5-private-dev qttools-dev-tools libdtkwidget-dev lxqt-build-tools libdframeworkdbus-dev libutf8proc-devlibatspi2.0-dev libglib2.0-dev libsecret-1-dev</code></p>
<h2 id="2-然后下载源码">2. 然后下载源码</h2>
<p><code>git clone https://github.com/linuxdeepin/deepin-terminal.git</code></p>
<blockquote>
<p>本篇博客使用的版本是:5.4.0.12</p>
</blockquote>
<h2 id="3-理清思路">3. 理清思路</h2>
<p>本人并没有强大的cpp和qt编程背景,直接面向源码和搜索引擎。</p>
<p>在半个月反复啃了几次源码之后,稍微理出一些头绪。</p>
<p>deepin-terminal的代码相对稳定,添加一个快捷键应该不难。</p>
<p>在原有代码基础上,最大程度保持代码风格的同时,添加相应的功能代码就可以。</p>
<blockquote>
<p>这里不得不感谢官方开发人员们统一的编码风格和强大的注释。注释真的很重要。</p>
</blockquote>
<p>总结一下修改过程:</p>
<ul>
<li>首先要在deepin-terminal的“设置”选项中,添加一个“透明度快捷键”的选项</li>
<li>其次把该快捷键绑定到一个可以改变终端的信号上</li>
</ul>
<p>细化一下过程:</p>
<ul>
<li>deepin-terminal的“设置”是通过json文件生成</li>
<li>json中是英文,因此需要翻译成中文</li>
<li>在窗口功能中绑定快捷键盘以及信号处理函数</li>
</ul>
<p>进一步细化:</p>
<ul>
<li>deepin-terminal-5.4.0.12/src/assets/other/default-config.json 该文件就是”设置“面板的生成文件。在这里按照规则添加对应的内容</li>
<li>deepin-terminal-5.4.0.12/src/settings/settings_translation.cpp 该程序文件功能是把default-config.json中指定的英文内容翻译出来</li>
<li>deepin-terminal-5.4.0.12/translations/deepin-terminal_zh_CN.ts 该文件指定了要把英文到中文的翻译内容。需注意翻译文件的行号</li>
<li>deepin-terminal-5.4.0.12/src/main/mainwindow.cpp 该文件的主要负责绑定快捷键与处理快捷键的信号</li>
<li>deepin-terminal-5.4.0.12/src/main/mainwindow.h 该文件声明mainwindow.cpp自定义的快捷键信号处理方法</li>
</ul>
<h2 id="4-正式编码">4. 正式编码</h2>
<p>我在摸索前进的过程中,实现了两个版本。</p>
<p>第一个版本主要实现了同一个终端实例情况下,当前标签页通过快捷键实现”半透明“和”不透明“的功能,而其他标签保持默认。这里添加了两个快捷键。</p>
<p>第二个版本主要实现了同一个终端实例情况下,所有标签页保持状态同步,即都透明或者都不透明,仅一个快捷键实现状态翻转(类似于xshell)。</p>
<h3 id="41-第一个版本">4.1 第一个版本</h3>
<p><strong>1. 修改源码文件:deepin-terminal-5.4.0.12/src/settings/settings_translation.cpp</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">auto shell_profile = QObject::tr("Shell profile");
Q_UNUSED(shell_profile);
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">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);
</code></pre>
<blockquote>
<p>注意变量名的命名规则:</p>
<p>shortcuts_terminal_seventy_percent_opacityName和shortcuts_terminal_one_hundred_percent_opacityName</p>
<p>参照本文件内部其他行</p>
</blockquote>
<p>保存退出。</p>
<p><strong>2. 修改源码文件:deepin-terminal-5.4.0.12/src/assets/other/default-config.json</strong></p>
<p>在该文件的配置段内容</p>
<pre><code class="language-json">{
"key": "copy",
"name": "Copy",
"type": "shortcut",
"default":"Ctrl+Shift+C"
},
</code></pre>
<p>的下面,添加新的内容</p>
<pre><code class="language-json">{
"key": "opaque",
"name": "Opaque",
"type": "shortcut",
"default": "Alt+e"
},
{
"key": "translucent",
"name": "Translucent",
"type": "shortcut",
"default": "Alt+r"
},
</code></pre>
<p>保存退出。</p>
<p><strong>3. 修改源码:deepin-terminal-5.4.0.12/src/main/mainwindow.cpp</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">connect(createNewShotcut("shortcuts.terminal.copy"), &QShortcut::activated, this, &MainWindow::slotShortcutCopy);
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">connect(createNewShotcut("shortcuts.terminal.opaque"), &QShortcut::activated, this, &MainWindow::slotShortcutOpaque);
connect(createNewShotcut("shortcuts.terminal.translucent"), &QShortcut::activated, this, &MainWindow::slotShortcutTranslucent);
</code></pre>
<p>保存退出。</p>
<p><strong>同时还需要添加功能实现</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">void MainWindow::slotShortcutCopy()
{
TermWidgetPage *page = currentPage();
if (page) {
page->copyClipboard();
}
}
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">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();
}
}
</code></pre>
<p>保存退出。</p>
<p><strong>4. 修改源码:deepin-terminal-5.4.0.12/src/main/mainwindow.h</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">void slotShortcutCopy();
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">void slotShortcutOpaque();
void slotShortcutTranslucent();
</code></pre>
<p>保存退出。</p>
<p><strong>5.编译和安装</strong></p>
<pre><code class="language-shell">cd build
cmake ..
make
sudo make install
</code></pre>
<p><strong>6. 最终效果</strong></p>
<p>设置界面如下图:</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202101/597042-20210129121505861-22195574.png"></p>
<p>按下<code>alt+r</code>快捷键:</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202101/597042-20210129122817670-615084217.png"></p>
<p>按下<code>alt+e</code>快捷键:</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202101/597042-20210129122858592-51378900.png"></p>
<h3 id="42-第二个版本">4.2 第二个版本</h3>
<p>该版本只需要用一个快捷键是实现状态翻转。</p>
<p>思路如下:通过快捷键设置了终端透明以后,同时写入配置文件,通过修改配置文件来是判断和实现状态翻转。</p>
<p><strong>1. 修改源码:deepin-terminal-5.4.0.12/src/settings/settings_translation.cpp</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">auto shell_profile = QObject::tr("Shell profile");
Q_UNUSED(shell_profile);
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">auto shortcuts_terminal_seventy_percent_opacityName = QObject::tr("Opacity fast");
Q_UNUSED(shortcuts_terminal_seventy_percent_opacityName);
</code></pre>
<blockquote>
<p>注意变量名的命名规则:shortcuts_terminal_opacity_fastName</p>
</blockquote>
<p>保存退出</p>
<p><strong>2.修改源码:deepin-terminal-5.4.0.12/src/assets/other/default-config.json</strong></p>
<p>在该文件的配置段</p>
<pre><code class="language-json">{
"key": "copy",
"name": "Copy",
"type": "shortcut",
"default":"Ctrl+Shift+C"
},
</code></pre>
<p>的下面,添加以下新的内容:</p>
<pre><code class="language-json">{
"key": "opacity_fast",
"name": "Opacity fast",
"type": "shortcut",
"default": "Alt+r"
},
</code></pre>
<p>保存退出。</p>
<p><strong>3.修改文件:deepin-terminal-5.4.0.12/translations/deepin-terminal_zh_CN.ts</strong></p>
<p>在该文件的配置内容</p>
<pre><code class="language-xml"><message>
<location filename="../src/settings/settings_translation.cpp" line="85"/>
<location filename="../src/main/mainwindow.cpp" line="2181"/>
<source>Copy</source>
<translation>复制</translation>
</message>
</code></pre>
<p>的下面,添加以下新的内容:</p>
<pre><code class="language-xml"><message>
<location filename="../src/settings/settings_translation.cpp" line="159"/>
<source>Opacity fast</source>
<translation>透明快捷键</translation>
</message>
</code></pre>
<blockquote>
<p>需要注意:line=xxx,根据settings_translation.cpp里面添加新内容后的实际情况修改。</p>
</blockquote>
<p>保存退出。</p>
<p><strong>4.修改文件:deepin-terminal-5.4.0.12/src/main/mainwindow.cpp</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">connect(createNewShotcut("shortcuts.terminal.copy"), &QShortcut::activated, this, &MainWindow::slotShortcutCopy);
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">connect(createNewShotcut("shortcuts.terminal.opacity_fast"), &QShortcut::activated, this, &MainWindow::slotShortcutOpacityFast);
</code></pre>
<p><strong>还需要添加一下具体的功能实现代码</strong></p>
<p>在该文件的内容</p>
<pre><code class="language-cpp">void MainWindow::slotShortcutCopy()
{
TermWidgetPage *page = currentPage();
if (page) {
page->copyClipboard();
}
}
</code></pre>
<p>的下面,添加新的内容:</p>
<pre><code class="language-cpp">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();
}
}
</code></pre>
<blockquote>
<p>这段才是真正的透明功能的实现</p>
</blockquote>
<p>保存退出。</p>
<blockquote>
<p><code>Settings::instance()->settings->option("basic.interface.opacity")->value().toInt()</code>,</p>
<p>Settings::instance()->settings->option("basic.interface.opacity")->setValue();</p>
<p>可以参照官方说明文档,https://docs.deepin.org/pages/c763f4/</p>
</blockquote>
<p><strong>5.修改文件:deepin-terminal-5.4.0.12/src/main/mainwindow.h</strong></p>
<p>在该文件的内容:</p>
<pre><code class="language-cpp">void slotShortcutCopy();
</code></pre>
<p>的下面,添加以下新的内容:</p>
<pre><code class="language-cpp">void slotShortcutOpacityFast();
</code></pre>
<p>保存退出。</p>
<p><strong>6. 编译安装</strong></p>
<pre><code class="language-shell">cd build
cmake ..
make
sudo make install
</code></pre>
<p><strong>7. 效果如下</strong></p>
<p>设置界面如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202101/597042-20210130111514509-1939212775.png"></p>
<p>通过<code>alt+r</code>,即可实现”透明“和”不透明“的状态翻转。</p>
<p>如果透明时,可以发现透明状态栏跟随变化(如下图),主要是因为这个翻转是通过写配置文件实现。</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202101/597042-20210130111645467-613075682.png"></p>
<h1 id="三-写在后面">三. 写在后面</h1>
<p><strong>首先声明,本文属我个人原创,转载请著名出处。如果文中有侵权现象,请联系作者删除。</strong></p>
<p>到现在为止,通过个人的努力,基本完成了deepin-terminal的透明度快捷键功能添加。虽然代码添加的比较拙劣,也不知道会不会造成什么bug,但是平常使用应该是没什么问题了。这个过程花费了我将近半个月,期间断断续续放弃与拾起。回头看一下整个过程感觉其实不那么难。</p>
<p>弄清楚过程以后,思路就变得清晰明了。如果有不会的东西,检索一下,一般也能看得懂。</p>
<p>本人对deepin-terminal的需求,就如同文章开头写的,不仅仅限于一个透明快捷键。希望官方能够不断的更新,我个人也会不断地学习跟实践,实现更多的个性化定制功能。</p><br><br>
来源:https://www.cnblogs.com/liwanliangblog/p/14348593.html
頁:
[1]