1. 程式人生 > >deepin-terminal改造之路

deepin-terminal改造之路

[toc] # 1. 背景介紹 deepin-terminal是我在使用deepin作業系統的時候主要的生產力工具。隨著新版本系統的不斷優化迭代,deepin-terminal從一開始的gtk設計變成了ddk設計,使得應用與作業系統的風格更加統一。 當然我是比較關注deepin-terminal的功能的,簡單實用即可。以前經常使用xshell,對於xshell這個重量級的工具來說,deepin-terminal的功能相對單一,但是很多xshell的功能,又想在deepin-terminal上用到,該怎麼辦? 呼籲官方多次,但是版本的釋出,功能的增加都需要很長的週期,沒有辦法,自己下載原始碼摸索一下,看看能否自己實現自己的需求了。 ddk的程式設計,需要有C++,Qt等基礎知識,同時可能還需要關注一下官方dtk的介面。對於C++和Qt,我只瞭解一點點,硬著頭皮上了。萬事開頭難,前後堅持了大概1個多月吧,頗有成效。下面就分享一下我的deepin-terminal學習和改造之路。 **宣告:本篇部落格內容僅限於個人學習和應用,切勿商用,違規自究!如有侵權,請聯絡我刪除!轉載請註明出處!** # 2. 下載原始碼 本篇原始碼下載地址:https://github.com/linuxdeepin/deepin-terminal/tree/5.4.0.13 下載zip檔案後,解壓到指定目錄 > 本人解壓到:/home/liwl/,解壓後可以看到目錄/home/liwl/deepin-terminal-5.4.0.13 # 3. 依賴檢查及安裝 `cd /home/liwl/deepin-terminal-5.4.0.13`, 可以先閱讀該目錄下的README.md內容,便於瞭解整個過程 **首先是檢查依賴** 在該目錄下執行`sudo apt build-dep .`,即可檢查和安裝依賴關係 **編譯和安裝** 在該目錄下執行`mkdir build; cd build; cmake ..; make; sudo install make` 就是整個編譯和安裝的過程了,簡單明瞭 **特別注意:為了能夠很好的展示效果,建議先解除安裝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** # 4. 改造之路 本人基本完成了以下功能特性: + 添加了“終端透明度”的快捷鍵設定選項 + 添加了“雙擊可選中的特殊符號”的設定選項 + 添加了“啟動初始目錄”的設定選項 + 添加了“顯示設定介面”的快捷鍵設定選項 + 右鍵添加了“翻譯”的選項 + 右鍵添加了“使用文字編輯器開啟”的選項 + 加粗了游標下劃線 + 修改了預設Dark主題配色 + 替換了一個內建主題 未完成的需求: + 快捷鍵切換主題 + 突出顯示敏感內容 + 彈窗或者側邊欄顯示翻譯內容 + 雙擊選中中文句子 ## 4.1 終端透明度快捷鍵 ### 4.1.1 設定面板增加選項內容 在“設定“面板裡面新增選項,需要通過一個json檔案配置,原始碼在編譯過程中會自動解析該json檔案,生成介面元件 該json就是:/home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json 本人慾把”終端透明度“快捷鍵設定在”複製“前面,所以保持json裡面的內容也在其前面。 在default-config.json檔案中找到以下內容: ```json { "key": "copy", "name": "Copy", "type": "shortcut", "default": "Ctrl+Shift+C" }, ``` 修改為: ```json { "key": "opacity", "name": "Opacity", "type": "shortcut", "default": "Alt+r" }, { "key": "copy", "name": "Copy", "type": "shortcut", "default": "Ctrl+Shift+C" }, ``` 儲存並退出 ### 4.1.2 新增配置解析內容 vim 開啟檔案:/home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp,在最後一行大括號上面,新增內容: ```cpp auto shortcuts_terminal_opacityName = QObject::tr("Opacity"); Q_UNUSED(shortcuts_terminal_opacityName); ``` > 注意參照該檔案的其他部分內容修改,即注意shortcuts_terminal_opacityName為何如何書寫 儲存並退出 ### 4.1.3 功能實現 這部分主要是三個步驟: 其一,在`void MainWindow:initShortcuts()`方法的內部,新增以下內容: ```cpp connect(createNewShotcut("shortcuts.terminal.opacity"),&QShortcut::activated,this,&MainWindow::slotShortcutOpacity); //這是增加的部分,注意分號不要丟了 //copy connect(createNewShotcut("shortcuts.terminal.copy"), &QShortcut::activated, this, &MainWindow::slotShortcutCopy); ``` 其二,在`void MainWindow::slotShortcutCopy()方法的上面`,實現`slotShortcutOpacity()` ```cpp void MainWindow::slotShortcutOpacity(){ TermWidgetPage *page = currentPage(); if (page){ if (Settings::instance()->settings->option("basic.interface.opacity")->value().toInt() == 100) { page->setTerminalOpacity(0.85); Settings::instance()->settings->option("basic.interface.opacity")->setValue(85); }else{ page->setTerminalOpacity(1.0); Settings::instance()->settings->option("basic.interface.opacity")->setValue(100); } page->focusCurrentTerm();//這個必須有,否則無法聚焦 } }//這個方法是新增的內容 void MainWindow::slotShortcutCopy() { TermWidgetPage *page = currentPage(); if (page) { page->copyClipboard(); } } ``` 其三,在mainwindow.h新增方法的宣告 ```cpp void slotShortcutOpacity();//這是新增的內容 void slotShortcutBuiltinCopy(); ``` 儲存並退出 ### 4.1.4 編譯安裝 ```shell cd /home/liwl/deepin-terminal-5.4.0.13/build cmake .. make sudo install make # 預設安裝的路徑是/usr/local/bin/下 ``` > 編譯安裝的過程,在本篇以下內容全部通用,下文不再贅述 ### 4.1.5 效果展示 ![](https://img2020.cnblogs.com/blog/597042/202103/597042-20210302152150608-1775436271.png) ## 4.2 雙擊可選中的特殊符號 該功能在實用性很強,Konsole和xshell都有相關的設定選項,但是deepin-terminal並沒有此功能設定,導致終端在某些使用場景中效率較低。 本部分主要就是實現該功能,把功能選項新增到“高階設定-游標”部分 ### 4.2.1 設定面板增加選項內容 首先修改json檔案:vim /home/liwl/deepin-terminal-5.4.0.13/src/assets/other/default-config.json,新增部分如下: ```json { "key": "auto_copy_selection", "type": "checkbox", "text": "Copy on select", "default": true }, { "key": "word_characters", "name": "Word characters", "type": "lineedit" } ``` 儲存並退出 ### 4.2.2 新增配置解析內容 vim /home/liwl/deepin-terminal-5.4.0.13/src/settings/settings_translation.cpp 在最後一行的花括號上,新增以下內容: ```cpp auto advanced_cursor_word_charactersText = QObject::tr("Word characters"); Q_UNUSED(advanced_cursor_word_charactersText); ``` > 注意advanced_cursor_word_charactersText寫法,參照該檔案其他部分內容 儲存並退出 ### 4.2.3 功能實現 本部分主要包括以下幾個步驟: 其一,編輯檔案:vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/qtermwidget.h 新增以下內容: ```cpp QFont getTerminalFont(); void setTerminalOpacity(qreal level); //add by [email protected],begin void setTerminalWordCharacters(const QString &wc); //add by [email protected],end void setTerminalBackgroundImage(QString backgroundImage); // environment void setEnvironment(const QStringList &environment); ``` 其二,編輯檔案:vim /home/liwl/deepin-terminal-5.4.0.13/3rdparty/terminalwidget/lib/qtermwidget.cpp 新增以下內容: ```cpp void QTermWidget::setTerminalOpacity(qreal level) { m_impl->m_terminalDisplay->setOpacity(level); } //add by [email protected],begin void QTermWidget::setTerminalWordCharacters(const QString &wc) { m_impl->m_terminalDisplay->setWordCharacters(wc); } //add by [email protected],end void QTermWidget::setTerminalBackgroundImage(QString backgroundImage) { m_impl->m_terminalDisplay->setBackgroundImage(backgroundImage); } ``` 其三,編輯檔案,vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.h,新增方法宣告: ```cpp // 修改游標形狀 void setCursorShape(int shape); //add by [email protected],begin void setTermWordCharacters(const QString &wc); //add by [email protected],end void setPressingScroll(bool enable); ``` 其四,編輯檔案:vim /home/liwl/deepin-terminal-5.4.0.13/src/views/termwidget.cpp 在`void TermWidget::setCursorShare(int share)`方法下新增以下內容: ```cpp /******************************************************************************* 1. @函式: setTermWordCharacters 2. @作者: liwl 3. @日期: 2021-03-02 4. @說明: 設定雙擊可選中的分隔符 *******************************************************************************/ void TermWidget::setTermWordCharacters(const QString &wc) { setTerminalWordCharacters(wc); } ``` 在`void TermWidget::onSettingValueChanged(const QString &keyName)`方法中的新增以下內容: ```cpp //add by liwl@2021-03-02,begin if (keyName == "advanced.cursor.word_characters") { setTermWordCharacters(Settings::instance()->wordCharacters()); return ; } //add by liwl@2021-03-02,en ``` 其五,編輯檔案,/home/liwl/deepin-terminal-5.4.0.13/src/settings/settings.h,新增相關方法宣告 ```cpp QString fontName(); //add by [email protected],begin QString wordCharacters() const;//這裡是屬性的宣告 //add by [email protected],end int fontSize(); ``` ```cpp void backgroundBlurChanged(bool enabled); //add by [email protected],begin void wordCharactersChanged(QString wordCharacters);//這裡是訊號的宣告 //add by [email protected],end void pressingScrollChanged(bool enabled); ``` 其六,編輯檔案:vim /home/liwl/Documents/liwl_dev/deepin-terminal_modify_by_liwl/src/settings/settings.cpp 在`void Settings::initConnection()`方法中,新增以下內容: ```cpp QPointer