五感渐失 發表於 2021-3-2 15:36:00

deepin-terminal改造之路

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1. 背景介绍</li><li>2. 下载源码</li><li>3. 依赖检查及安装</li><li>4. 改造之路<ul><li>4.1 终端透明度快捷键<ul><li>4.1.1 设置面板增加选项内容</li><li>4.1.2 添加配置解析内容</li><li>4.1.3 功能实现</li><li>4.1.4 编译安装</li><li>4.1.5 效果展示</li></ul></li><li>4.2 双击可选中的特殊符号<ul><li>4.2.1 设置面板增加选项内容</li><li>4.2.2 添加配置解析内容</li><li>4.2.3 功能实现</li><li>4.2.4 效果展示</li></ul></li><li>4.3 启动初始目录<ul><li>4.3.1 设置面板增加选项内容</li><li>4.3.2 添加配置解析内容</li><li>4.3.3 功能代码实现</li><li>4.3.4 效果展示</li></ul></li><li>4.4 显示设置界面<ul><li>4.4.1 修改设置面板的显示</li><li>4.4.2 添加配置解析内容</li><li>4.4.3 功能代码实现</li><li>4.4.4 效果展示</li></ul></li><li>4.5 右键翻译<ul><li>4.5.1 功能实现</li><li>4.5.2 效果展示</li></ul></li><li>4.6 右键文本编辑器打开<ul><li>4.6.1 功能实现</li><li>4.6.2 效果展示</li></ul></li><li>4.7 光标下划线加粗<ul><li>4.7.1 修改设置面板的显示</li><li>4.7.2 代码修改</li><li>4.7.3 效果展示</li></ul></li><li>4.8 修改主题配色</li></ul></li></ul></div><p></p>
<h1 id="1-背景介绍">1. 背景介绍</h1>
<p>deepin-terminal是我在使用deepin操作系统的时候主要的生产力工具。随着新版本系统的不断优化迭代,deepin-terminal从一开始的gtk设计变成了ddk设计,使得应用与操作系统的风格更加统一。</p>
<p>当然我是比较关注deepin-terminal的功能的,简单实用即可。以前经常使用xshell,对于xshell这个重量级的工具来说,deepin-terminal的功能相对单一,但是很多xshell的功能,又想在deepin-terminal上用到,该怎么办?</p>
<p>呼吁官方多次,但是版本的发布,功能的增加都需要很长的周期,没有办法,自己下载源码摸索一下,看看能否自己实现自己的需求了。</p>
<p>ddk的编程,需要有C++,Qt等基础知识,同时可能还需要关注一下官方dtk的接口。对于C++和Qt,我只了解一点点,硬着头皮上了。万事开头难,前后坚持了大概1个多月吧,颇有成效。下面就分享一下我的deepin-terminal学习和改造之路。</p>
<p></p>
<p>deepin20.1版本升级到20.2之后,deepin-terminal无法正常打开,需要重新编译。<br>
编译过程发现报错,解决方式如下:<br>
在报错的源码文件中,添加头文件:#include&lt;QPainterPath&gt;,然后重新编译<br>
如果安装之后依然无法使用,需要删除系统中deepin-terminal全部文件,重新编译安装即可<br>
注:使用root用户执行<code>find / -name deepin-terminal 2&gt;/dev/null|egrep usr|xargs rm -rf</code></p>
<p><strong>声明:本篇博客内容仅限于个人学习和应用,切勿商用,违规自究!如有侵权,请联系我删除!转载请注明出处!</strong></p>
<h1 id="2-下载源码">2. 下载源码</h1>
<p>本篇源码下载地址:https://github.com/linuxdeepin/deepin-terminal/tree/5.4.0.13</p>
<p>下载zip文件后,解压到指定目录</p>
<blockquote>
<p>本人解压到:/home/liwl/,解压后可以看到目录/home/liwl/deepin-terminal-5.4.0.13</p>
</blockquote>
<h1 id="3-依赖检查及安装">3. 依赖检查及安装</h1>
<p><code>cd/home/liwl/deepin-terminal-5.4.0.13</code>,</p>
<p>可以先阅读该目录下的README.md内容,便于了解整个过程</p>
<p><strong>首先是检查依赖</strong></p>
<p>在该目录下执行<code>sudo apt build-dep .</code>,即可检查和安装依赖关系</p>
<p><strong>编译和安装</strong></p>
<p>在该目录下执行<code>mkdir build; cd build; cmake ..; make; sudo install make</code></p>
<p>就是整个编译和安装的过程了,简单明了</p>
<p><strong>特别注意:为了能够很好的展示效果,建议先卸载deepin-terminal,因为系统自带的deepin-terminal执行路径是:/usr/bin/deepin-terminal,而手动编译的deepin-terminal安装路径在/usr/local/bin/deepin-terminal,自带的deepin-terminal可能会影响手动编译的。另外,编译安装结束后,建议通过启动器上面的终端图标启动,避免使用快捷键启动。也可以尝试修改CMakeFile.txt,把手动编译的deepin-terminal安装到/usr/bin/目录下,覆盖系统自带deepin-terminal</strong></p>
<h1 id="4-改造之路">4. 改造之路</h1>
<p>本人基本完成了以下功能特性:</p>
<ul>
<li>添加了“终端透明度”的快捷键设置选项</li>
<li>添加了“双击可选中的特殊符号”的设置选项</li>
<li>添加了“启动初始目录”的设置选项</li>
<li>添加了“显示设置界面”的快捷键设置选项</li>
<li>右键添加了“翻译”的选项</li>
<li>右键添加了“使用文本编辑器打开”的选项</li>
<li>加粗了光标下划线</li>
<li>修改了默认Dark主题配色</li>
<li>替换了一个内置主题</li>
</ul>
<p>未完成的需求:</p>
<ul>
<li>快捷键切换主题</li>
<li>突出显示敏感内容</li>
<li>弹窗或者侧边栏显示翻译内容</li>
<li>双击选中中文句子</li>
</ul>
<h2 id="41-终端透明度快捷键">4.1 终端透明度快捷键</h2>
<h3 id="411-设置面板增加选项内容">4.1.1 设置面板增加选项内容</h3>
<p>在“设置“面板里面添加选项,需要通过一个json文件配置,源码在编译过程中会自动解析该json文件,生成界面组件</p>
<p>该json就是:/home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json</p>
<p>本人欲把”终端透明度“快捷键设置在”复制“前面,所以保持json里面的内容也在其前面。</p>
<p>在default-config.json文件中找到以下内容:</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",
    "name":        "Opacity",
    "type":        "shortcut",
        "default":        "Alt+r"
},
{
    "key": "copy",
    "name":        "Copy",
    "type":        "shortcut",
    "default":        "Ctrl+Shift+C"
},
</code></pre>
<p>保存并退出</p>
<h3 id="412-添加配置解析内容">4.1.2 添加配置解析内容</h3>
<p>vim 打开文件:/home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp,在最后一行大括号上面,添加内容:</p>
<pre><code class="language-cpp">auto shortcuts_terminal_opacityName = QObject::tr("Opacity");
Q_UNUSED(shortcuts_terminal_opacityName);
</code></pre>
<blockquote>
<p>注意参照该文件的其他部分内容修改,即注意shortcuts_terminal_opacityName为何如何书写</p>
</blockquote>
<p>保存并退出</p>
<h3 id="413-功能实现">4.1.3 功能实现</h3>
<p>这部分主要是三个步骤:</p>
<p>其一,在<code>void MainWindow:initShortcuts()</code>方法的内部,添加以下内容:</p>
<pre><code class="language-cpp">connect(createNewShotcut("shortcuts.terminal.opacity"),&amp;QShortcut::activated,this,&amp;MainWindow::slotShortcutOpacity); //这是增加的部分,注意分号不要丢了

//copy
connect(createNewShotcut("shortcuts.terminal.copy"), &amp;QShortcut::activated, this, &amp;MainWindow::slotShortcutCopy);
</code></pre>
<p>其二,在<code>void MainWindow::slotShortcutCopy()方法的上面</code>,实现<code>slotShortcutOpacity()</code></p>
<pre><code class="language-cpp">void MainWindow::slotShortcutOpacity(){
      TermWidgetPage *page = currentPage();
      if (page){
                if (Settings::instance()-&gt;settings-&gt;option("basic.interface.opacity")-&gt;value().toInt() == 100) {
                        page-&gt;setTerminalOpacity(0.85);
                        Settings::instance()-&gt;settings-&gt;option("basic.interface.opacity")-&gt;setValue(85);
                }else{
                        page-&gt;setTerminalOpacity(1.0);
                        Settings::instance()-&gt;settings-&gt;option("basic.interface.opacity")-&gt;setValue(100);
                }
                page-&gt;focusCurrentTerm();//这个必须有,否则无法聚焦
      }
}//这个方法是添加的内容

void MainWindow::slotShortcutCopy()
{
    TermWidgetPage *page = currentPage();
    if (page) {
      page-&gt;copyClipboard();
    }
}
</code></pre>
<p>其三,在mainwindow.h添加方法的声明</p>
<pre><code class="language-cpp">void slotShortcutOpacity();//这是添加的内容
void slotShortcutBuiltinCopy();
</code></pre>
<p>保存并退出</p>
<h3 id="414-编译安装">4.1.4 编译安装</h3>
<pre><code class="language-shell">cd /home/liwl/deepin-terminal-5.4.0.13/build
cmake ..
make
sudo install make
# 默认安装的路径是/usr/local/bin/下
</code></pre>
<blockquote>
<p>编译安装的过程,在本篇以下内容全部通用,下文不再赘述</p>
</blockquote>
<h3 id="415-效果展示">4.1.5 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152150608-1775436271.png"></p>
<h2 id="42-双击可选中的特殊符号">4.2 双击可选中的特殊符号</h2>
<p>该功能在实用性很强,Konsole和xshell都有相关的设置选项,但是deepin-terminal并没有此功能设置,导致终端在某些使用场景中效率较低。</p>
<p>本部分主要就是实现该功能,把功能选项添加到“高级设置-光标”部分</p>
<h3 id="421-设置面板增加选项内容">4.2.1 设置面板增加选项内容</h3>
<p>首先修改json文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json,添加部分如下:</p>
<pre><code class="language-json">{
        "key": "auto_copy_selection",
        "type": "checkbox",
        "text": "Copy on select",
        "default": true
},
{
        "key": "word_characters",
        "name": "Word characters",
        "type": "lineedit"
}
</code></pre>
<p>保存并退出</p>
<h3 id="422-添加配置解析内容">4.2.2 添加配置解析内容</h3>
<p>vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp</p>
<p>在最后一行的花括号上,添加以下内容:</p>
<pre><code class="language-cpp">auto advanced_cursor_word_charactersText = QObject::tr("Word characters");
Q_UNUSED(advanced_cursor_word_charactersText);
</code></pre>
<blockquote>
<p>注意advanced_cursor_word_charactersText写法,参照该文件其他部分内容</p>
</blockquote>
<p>保存并退出</p>
<h3 id="423-功能实现">4.2.3 功能实现</h3>
<p>本部分主要包括以下几个步骤:</p>
<p>其一,编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/qtermwidget.h</p>
<p>添加以下内容:</p>
<pre><code class="language-cpp">QFont getTerminalFont();
void setTerminalOpacity(qreal level);

//add by liwl@2021.03.02,begin
void setTerminalWordCharacters(const QString &amp;wc);
//add by liwl@2021.03.02,end

void setTerminalBackgroundImage(QString backgroundImage);
// environment
void setEnvironment(const QStringList &amp;environment);
</code></pre>
<p>其二,编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/qtermwidget.cpp</p>
<p>添加以下内容:</p>
<pre><code class="language-cpp">void QTermWidget::setTerminalOpacity(qreal level)
{
    m_impl-&gt;m_terminalDisplay-&gt;setOpacity(level);
}

//add by liwl@2021.03.02,begin
void QTermWidget::setTerminalWordCharacters(const QString &amp;wc)
{
    m_impl-&gt;m_terminalDisplay-&gt;setWordCharacters(wc);
}
//add by liwl@2021.03.02,end

void QTermWidget::setTerminalBackgroundImage(QString backgroundImage)
{
    m_impl-&gt;m_terminalDisplay-&gt;setBackgroundImage(backgroundImage);
}
</code></pre>
<p>其三,编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.h,添加方法声明:</p>
<pre><code class="language-cpp">// 修改光标形状
void setCursorShape(int shape);
//add by liwl@2021.03.02,begin
void setTermWordCharacters(const QString &amp;wc);
//add by liwl@2021.03.02,end
void setPressingScroll(bool enable);
</code></pre>
<p>其四,编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.cpp</p>
<p>在<code>void TermWidget::setCursorShare(int share)</code>方法下添加以下内容:</p>
<pre><code class="language-cpp">/*******************************************************************************
1. @函数:    setTermWordCharacters
2. @作者:    liwl
3. @日期:    2021-03-02
4. @说明:    设置双击可选中的分隔符
*******************************************************************************/
void TermWidget::setTermWordCharacters(const QString &amp;wc)
{
      setTerminalWordCharacters(wc);
}
</code></pre>
<p>在<code>void TermWidget::onSettingValueChanged(const QString &amp;keyName)</code>方法中的添加以下内容:</p>
<pre><code class="language-cpp">//add by liwl@2021-03-02,begin
if (keyName == "advanced.cursor.word_characters") {
        setTermWordCharacters(Settings::instance()-&gt;wordCharacters());
        return ;
}
//add by liwl@2021-03-02,en
</code></pre>
<p>其五,编辑文件,/home/liwl/deepin-terminal-5.4.0.13/src/settings/settings.h,添加相关方法声明</p>
<pre><code class="language-cpp">QString fontName();
//add by liwl@2021.03.02,begin
QString wordCharacters() const;//这里是属性的声明
//add by liwl@2021.03.02,end
int fontSize();
</code></pre>
<pre><code class="language-cpp">void backgroundBlurChanged(bool enabled);
//add by liwl@2021.03.02,begin
void wordCharactersChanged(QString wordCharacters);//这里是信号的声明
//add by liwl@2021.03.02,end
void pressingScrollChanged(bool enabled);
</code></pre>
<p>其六,编辑文件:vim /home/liwl/Documents/liwl_dev/deepin-terminal_modify_by_liwl/src/settings/settings.cpp</p>
<p>在<code>void Settings::initConnection()</code>方法中,添加以下内容:</p>
<pre><code class="language-cpp">QPointer&lt;DSettingsOption&gt; cursorBlink = settings-&gt;option("advanced.cursor.cursor_blink");
connect(cursorBlink, &amp;Dtk::Core::DSettingsOption::valueChanged, this, [ = ](QVariant value) {
        emit cursorBlinkChanged(value.toBool());
});

//add by liwl@2021.03.02,begin
QPointer&lt;DSettingsOption&gt; wordCharacters = settings-&gt;option("advanced.cursor.word_characters");
connect(wordCharacters, &amp;Dtk::Core::DSettingsOption::valueChanged, this, [ = ](QVariant value) {
    emit wordCharactersChanged(value.toString());
});
//add by liwl@2021.03.02,end
</code></pre>
<p>在<code>void Settings::colorScheme() const</code>方法下面,添加以下内容:</p>
<pre><code class="language-cpp">/*******************************************************************************
1. @函数:    wordCharacters
2. @作者:    liwl
3. @日期:    2021-03-02
4. @说明:    设置界面获取双击可选中的符号
*******************************************************************************/
QString Settings::wordCharacters() const
{
    return settings-&gt;option("advanced.cursor.word_characters")-&gt;value().toString();
}
</code></pre>
<p>保存退出,<strong>编译一次</strong></p>
<p><strong>中文翻译</strong></p>
<p>这里有个问题,设置界面"Word characters"未翻译,进行以下操作:</p>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/translations/deepin-terminal_zh_CN.ts,修改</p>
<pre><code class="language-xml">&lt;message&gt;
        &lt;location filename="../src/settings/settings_translation.cpp" line="161"/&gt;
        &lt;source&gt;Word characters&lt;/source&gt;
        &lt;translation type="unfinished"&gt;&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>为</p>
<pre><code class="language-xml">&lt;message&gt;
        &lt;location filename="../src/settings/settings_translation.cpp" line="161"/&gt;
    &lt;source&gt;Word characters&lt;/source&gt;
    &lt;translation&gt;双击可选中的特殊符号&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>保存退出后,再重新进行编译安装操作</p>
<h3 id="424-效果展示">4.2.4 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152310948-387059532.png"></p>
<h2 id="43-启动初始目录">4.3 启动初始目录</h2>
<p>deepin-terminal默认启动目录是用户的home目录,但是当前版本没有提供启动初始目录的设置选项。如果经常在某个目录下工作 ,通过终端进入该目录,不断地cd有些繁琐,直接设置一个deepin-terminal初始目录,显得更加高效和人性化。</p>
<p>本部分主要实现该功能。</p>
<h3 id="431-设置面板增加选项内容">4.3.1 设置面板增加选项内容</h3>
<p>本篇把“启动初始目录”的设置选项,放置在“基础设置-界面”区域下</p>
<p>编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json</p>
<p>修改内容为:</p>
<pre><code class="language-json">{
    "key":        "work_directory",
    "name":        "Work directory",
    "type":        "lineedit"
},
{                                                               
        "key": "opacity",                                             
        "name": "Opacity",                                          
        "type": "slider",                                             
        "max": 100,                                                   
        "min": 20,                                                   
        "default": 100                                                
},
</code></pre>
<p>保存并退出</p>
<h3 id="432-添加配置解析内容">4.3.2 添加配置解析内容</h3>
<p>编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp</p>
<p>在最后一行花括号上面,添加以下内容:</p>
<pre><code class="language-cpp">auto basic_interface_work_directoryName = QObject::tr("Work directory");
Q_UNUSED(basic_interface_work_directoryName);
</code></pre>
<p>保存退出</p>
<p><strong>添加中文翻译</strong></p>
<p>首先编译一下:</p>
<pre><code class="language-shell">cd /home/liwl/deepin-terminal-5.4.0.13/build
cmake ..
make
</code></pre>
<p>然后修改翻译文件:</p>
<p><code>vim /home/liwl/deepin-terminal-5.4.0.13/translations/deepin-terminal_zh_CN.ts</code></p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/settings/settings_translation.cpp" line="163"/&gt;
    &lt;source&gt;Work directory&lt;/source&gt;
    &lt;translation type="unfinished"&gt;&lt;/translation&gt;
&lt;/message
</code></pre>
<p>上面内容修改为以下内容:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/settings/settings_translation.cpp" line="163"/&gt;
    &lt;source&gt;Work directory&lt;/source&gt;
    &lt;translation&gt;启动初始目录&lt;/translation&gt;
&lt;/message
</code></pre>
<p>然后再进行一次编译即可</p>
<h3 id="433-功能代码实现">4.3.3 功能代码实现</h3>
<p>本部分主要包括以下几个步骤:</p>
<p>其一,编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings.h</p>
<p>修改为以下内容:</p>
<pre><code class="language-cpp">QString fontName();
//add by liwl@2021.03.02,begin
QString wordCharacters() const;
QString workDirectory() const;
//add by liwl@2021.03.02,end
int fontSize();
</code></pre>
<pre><code class="language-cpp">void backgroundBlurChanged(bool enabled);
//add by liwl@2021.03.02,begin
void wordCharactersChanged(QString wordCharacters);
void workDirectoryChanged(QString workDirectory);
//add by liwl@2021.03.02,end
void pressingScrollChanged(bool enabled);
</code></pre>
<p>其二,编辑文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings.cpp</p>
<p>修改为以下内容:</p>
<pre><code class="language-cpp">QPointer&lt;DSettingsOption&gt; cursorBlink = settings-&gt;option("advanced.cursor.cursor_blink");
connect(cursorBlink, &amp;Dtk::Core::DSettingsOption::valueChanged, this, [ = ](QVariant value) {
    emit cursorBlinkChanged(value.toBool());
});

//add by liwl@2021.03.02,begin
QPointer&lt;DSettingsOption&gt; wordCharacters = settings-&gt;option("advanced.cursor.word_characters");
connect(wordCharacters, &amp;Dtk::Core::DSettingsOption::valueChanged, this, [ = ](QVariant value) {
    emit wordCharactersChanged(value.toString());
});
QPointer&lt;DSettingsOption&gt; workDirectory = settings-&gt;option("basic.interface.work_directory");
connect(workDirectory, &amp;Dtk::Core::DSettingsOption::valueChanged, this, [ = ](QVariant value) {
    emit workDirectoryChanged(value.toString());
});
//add by liwl@2021.03.02,end

QPointer&lt;DSettingsOption&gt; backgroundBlur = settings-&gt;option("advanced.window.blurred_background");
connect(backgroundBlur, &amp;Dtk::Core::DSettingsOption::valueChanged, this, [ = ](QVariant value) {
    emit backgroundBlurChanged(value.toBool());
});
</code></pre>
<p>在 settings.cpp的<code>QSting Settings::wordCharacters() const</code>方法下,添加以下内容:</p>
<pre><code class="language-cpp">/*******************************************************************************
1. @函数:    wordCharacters
2. @作者:    liwl
3. @日期:    2021-03-02
4. @说明:    设置界面获取终端启动初始目录
*******************************************************************************/
QString Settings::workDirectory() const
{
      return settings::option("basic.interface.work_directory")-&gt;value().toString();
}
</code></pre>
<p>其三,编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.cpp</p>
<p>把以下内容:</p>
<pre><code class="language-cpp">// WorkingDir
    if (m_properties.contains(WorkingDir)) {
      setWorkingDirectory(m_properties.toString());
    }
</code></pre>
<p>修改为:</p>
<pre><code class="language-cpp">// WorkingDir
    if (m_properties.contains(WorkingDir)) {
      setWorkingDirectory(m_properties.toString());
    }//else add by liwl@2021.02.20
    else{
      QString default_work_diretory = Settings::instance()-&gt;workDirectory();
      QFileInfo file(default_work_diretory);
      if (file.exists())
              setWorkingDirectory(default_work_diretory);
    }//add by liwl end
</code></pre>
<p>保存退出, <strong>编译安装</strong></p>
<h3 id="434-效果展示">4.3.4 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152342982-1684213008.png"></p>
<h2 id="44-显示设置界面">4.4 显示设置界面</h2>
<p>在Konsole获取其他很多应用软件,都有通过快捷键打开设置的选项,deepin-terminal提供了两种打开“设置”的方式:右键,菜单选项</p>
<p>本部分实现了通过快捷键打开“设置”面板,把该设置选项放置在“基础设置-其他”区域内。</p>
<h3 id="441-修改设置面板的显示">4.4.1 修改设置面板的显示</h3>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json</p>
<p>修改内容如下:</p>
<pre><code class="language-json">{
    "key":        "display_shortcuts",
    "name":        "Display shortcuts",
    "type":        "shortcut",
    "default":        "Ctrl+Shift+?"
},
{
    "key":        "display_setting",
    "name":        "Display setting",
    "type":        "shortcut",
    "default":        "Ctrl+,"
},
</code></pre>
<p>保存退出</p>
<h3 id="442-添加配置解析内容">4.4.2 添加配置解析内容</h3>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp</p>
<p>在该文件最后一行的花括号上面,添加以下内容:</p>
<pre><code class="language-cpp">auto shortcuts_advanced_display_settingName = QObject::tr("Display setting");
Q_UNUSED(shortcuts_advanced_display_settingName);
</code></pre>
<p>保存退出</p>
<p><strong>添加中文翻译</strong></p>
<p>首先编译一下:</p>
<pre><code class="language-shell">cd /home/liwl/deepin-terminal-5.4.0.13/build
cmake ..
make
</code></pre>
<p>然后修改翻译文件:</p>
<p><code>vim /home/liwl/deepin-terminal-5.4.0.13/translations/deepin-terminal_zh_CN.ts</code></p>
<p>修改以下内容:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/settings/settings_translation.cpp" line="165"/&gt;
    &lt;source&gt;Display setting&lt;/source&gt;
    &lt;translation type="unfinished"&gt;&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>为:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/settings/settings_translation.cpp" line="165"/&gt;
    &lt;source&gt;Display setting&lt;/source&gt;
    &lt;translation&gt;显示设置界面&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>保存退出后,<strong>再次编译</strong></p>
<h3 id="443-功能代码实现">4.4.3 功能代码实现</h3>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/src/main/mainwindow.cpp</p>
<p>修改内容如下:</p>
<pre><code class="language-cpp">    // close_other_workspaces
    connect(createNewShotcut("shortcuts.tab.close_other_workspaces"), &amp;QShortcut::activated, this, &amp;MainWindow::slotShortcutCloseOtherWorkspaces);

    //opacity.add by liwl@2021.03.01,begin
    connect(createNewShotcut("shortcuts.terminal.opacity"), &amp;QShortcut::activated, this, &amp;MainWindow::slotShortcutOpacity);
      connect(createNewShotcut("shortcuts.advanced.display_setting"),&amp;QShortcut::activated,Service::instance(),&amp;Service::slotShowSettingsDialog);
    //opacity.add by liwl@2021.03.01,end

    // copy
    connect(createNewShotcut("shortcuts.terminal.copy"), &amp;QShortcut::activated, this, &amp;MainWindow::slotShortcutCopy);
</code></pre>
<p>保存退出后,<strong>编译安装</strong></p>
<h3 id="444-效果展示">4.4.4 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152411631-203878712.png"></p>
<h2 id="45-右键翻译">4.5 右键翻译</h2>
<p>本部分主要实现了选中内容后,右键-翻译,通过浏览器打开翻译界面,显示翻译结果</p>
<h3 id="451-功能实现">4.5.1 功能实现</h3>
<p>编辑文件,vim /home/liwl/Documents/liwl_dev/deepin-terminal_modify_by_liwl/src/views/termwidget.cpp</p>
<p>在<code>void TermWidget::addMenuActions(const QPoint &amp;pos)</code>方法内,修改内容如下:</p>
<pre><code class="language-cpp">if (!m_menu-&gt;isEmpty()) {                                                            
    m_menu-&gt;addSeparator();                                                         
}                                                                                    
                                                                                          
//add by liwl@2021.03.02,begin                                                   
if (!selectedText().isEmpty()){                                                   
    m_menu-&gt;addAction(tr("Transfer"),this,){                           
            QString strurl = "https://fanyi.baidu.com/#en/zh/" + selectedText();
            QDesktopServices::openUrl(strurl);
            }
}
//add by liwl@2021.03.02,end
</code></pre>
<p>保存退出,<strong>执行一次编译</strong></p>
<p><strong>中文翻译</strong></p>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/translations/termwidget.cpp</p>
<p>修改以下内容:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/views/termwidget.cpp" line="416"/&gt;
    &lt;source&gt;Transfer&lt;/source&gt;
    &lt;translation type="unfinished"&gt;&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>为:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/views/termwidget.cpp" line="416"/&gt;
    &lt;source&gt;Transfer&lt;/source&gt;
    &lt;translation&gt;翻译&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>保存退出后,<strong>编译安装</strong></p>
<h3 id="452-效果展示">4.5.2 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152429161-882721497.png"></p>
<h2 id="46-右键文本编辑器打开">4.6 右键文本编辑器打开</h2>
<p>本部分主要实现把复制的内容,使用文本编辑器打开</p>
<h3 id="461-功能实现">4.6.1 功能实现</h3>
<p>功能实现已经很简单,在4.5.1的基础上修改代码,如下:</p>
<p>vim /home/liwl/Documents/liwl_dev/deepin-terminal_modify_by_liwl/src/views/termwidget.cpp</p>
<pre><code class="language-cpp">if (!selectedText().isEmpty()) {
    m_menu-&gt;addAction(tr("Transfer"), this, {
      QString strurl = "https://fanyi.baidu.com/#en/zh/" + selectedText();
      QDesktopServices::openUrl(QUrl(strurl));
   });

   //add by liwl@2021.03.02,begin
   m_menu-&gt;addAction(tr("Open by deepin-editor"),this, {
         QFile tmpFile;
         QString tmpFileName("/tmp/tmp.txt");
         tmpFile.setFileName(tmpFileName);
         if (tmpFile.open(QIODevice::WriteOnly|QIODevice::Text)){
                    QTextStream stream(&amp;tmpFile);
                stream &lt;&lt; selectedText()&lt;&lt;"\n";
                tmpFile.close();
            };
            QString cmd = QString("xdg-open /tmp/tmp.txt");
            system(cmd.toStdString().c_str());
    });// add by liwl@2021.03.02,end
}
</code></pre>
<p>因为代码中用到了QTextStream,所以必须添加头文件:</p>
<pre><code class="language-cpp">#include &lt;QTextStream&gt;
</code></pre>
<p>保存退出,<strong>编译一次</strong></p>
<blockquote>
<p>这段代码写的比较渣,本意是想把剪切板的内容使用文本编辑器直接打开,而非使用文本编辑器打开文件</p>
</blockquote>
<p><strong>中文翻译</strong></p>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/translations/deepin-terminal_zh_CN.ts</p>
<p>修改以下内容:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/views/termwidget.cpp" line="426"/&gt;
    &lt;source&gt;Open by deepin-editor&lt;/source&gt;
    &lt;translation type="unfinished"&gt;&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>为:</p>
<pre><code class="language-xml">&lt;message&gt;
    &lt;location filename="../src/views/termwidget.cpp" line="426"/&gt;
    &lt;source&gt;Open by deepin-editor&lt;/source&gt;
    &lt;translation&gt;使用文本编辑器打开&lt;/translation&gt;
&lt;/message&gt;
</code></pre>
<p>保存退出后,<strong>编译安装</strong></p>
<h3 id="462-效果展示">4.6.2 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152447586-1980820325.png"></p>
<h2 id="47-光标下划线加粗">4.7 光标下划线加粗</h2>
<p>deepin-terminal的光标下划线很细,在终端和vim模式下存在感很低,很多时候因为看不到光标在哪里而不得不寻找半天,拉低效率。</p>
<h3 id="471-修改设置面板的显示">4.7.1 修改设置面板的显示</h3>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json,</p>
<p>修改为以下内容:</p>
<pre><code class="language-json">{
    "key":        "cursor_share",
    "name":        "Cursor style",
    "type":        "buttongroup",
    "items": ["▐","▂","|"],
    "default":0,
    "i18n_skip_keys": ["items"]
},
</code></pre>
<h3 id="472-代码修改">4.7.2 代码修改</h3>
<p>编辑文件,vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/TerminalDisplay.cpp,</p>
<p>修改源码:</p>
<pre><code class="language-cpp">else if ( _cursorShape == Emulation::KeyboardCursorShape::UnderlineCursor )
        painter.drawLine(QLineF(
                  QPointF(cursorRect.left(),
                            cursorRect.bottom()),
                              QPointF(cursorRect.right(),
                            cursorRect.bottom())));
</code></pre>
<p>为:</p>
<pre><code class="language-cpp">else if ( _cursorShape == Emulation::KeyboardCursorShape::UnderlineCursor )
       {
                        for (int i = 0; i &lt;= 3; ++i)
                                      painter.drawLine(QLineF( QPointF(cursorRect.left(), cursorRect.bottom()+i), QPointF(cursorRect.right(), cursorRect.bottom()+i)));
      }

</code></pre>
<p>即用一个for循环,多画3条线实现加粗,保存退出,<strong>编译安装</strong></p>
<h3 id="473-效果展示">4.7.3 效果展示</h3>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152513582-1488207580.png"></p>
<h2 id="48-修改主题配色">4.8 修改主题配色</h2>
<p>本部分主要介绍如何修改主题配色,主要操作目录为:</p>
<p><code>cd /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/color-schemes</code></p>
<p>该目录定义了deepin-terminal的Dark主题,Light主题,还有内置的其他10个主题</p>
<p>如果修改某个主题的配色,比如修改Dark的主题配色,只需要编辑Dark.colorscheme文件</p>
<p>那么如何替换掉内置主题呢?</p>
<p>比如我想把内置的第二个主题Empathy换成Breeze主题,操作如下:</p>
<p>把BreezeModified.colorscheme文件内部的</p>
<pre><code class="language-shell">




















</code></pre>
<p>配置字段下面的Color参数值,替换掉Theme2.colorscheme中相应配置字段下面的Color参数即可。</p>
<p>然后修改文件:vim /home/liwl/deepin-terminal-5.4.0.13/src/main/mainwindow.h</p>
<p>把</p>
<pre><code class="language-cpp">static constexpr const char *THEME_TWO_NAME               = "Breeze";
</code></pre>
<p>保存退出,<strong>编译安装即可</strong></p>
<p>这里不在赘述详细的操作过程,仅贴2张效果图</p>
<p>修改前:</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152653644-321549641.png"></p>
<p>修改后:</p>
<p><img src="https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152619533-1136102988.png"></p><br><br>
来源:https://www.cnblogs.com/liwanliangblog/p/14469250.html
頁: [1]
查看完整版本: deepin-terminal改造之路