aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/experimental/lumina-terminal
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/experimental/lumina-terminal')
-rw-r--r--src-qt5/experimental/lumina-terminal/TermWindow.cpp316
-rw-r--r--src-qt5/experimental/lumina-terminal/TermWindow.h73
-rw-r--r--src-qt5/experimental/lumina-terminal/TerminalWidget.cpp570
-rw-r--r--src-qt5/experimental/lumina-terminal/TerminalWidget.h73
-rw-r--r--src-qt5/experimental/lumina-terminal/TrayIcon.cpp173
-rw-r--r--src-qt5/experimental/lumina-terminal/TrayIcon.h59
-rw-r--r--src-qt5/experimental/lumina-terminal/TtyProcess.cpp381
-rw-r--r--src-qt5/experimental/lumina-terminal/TtyProcess.h87
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_af.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ar.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_az.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_bg.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_bn.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_bs.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ca.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_cs.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_cy.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_da.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_de.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_el.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_GB.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_ZA.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_es.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_et.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_eu.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_fa.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_fi.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr_CA.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_gl.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_he.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_hi.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_hr.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_hu.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_id.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_is.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_it.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ja.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ka.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ko.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_lt.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_lv.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_mk.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_mn.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ms.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_mt.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_nb.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_nl.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_pa.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_pl.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt_BR.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ro.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ru.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_sk.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_sl.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_sr.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_sv.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_sw.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_ta.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_tg.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_th.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_tr.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_uk.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_uz.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_vi.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_CN.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_HK.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_TW.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/i18n/l-terminal_zu.ts45
-rw-r--r--src-qt5/experimental/lumina-terminal/lumina-terminal.desktop9
-rw-r--r--src-qt5/experimental/lumina-terminal/lumina-terminal.pro102
-rw-r--r--src-qt5/experimental/lumina-terminal/main.cpp47
73 files changed, 4680 insertions, 0 deletions
diff --git a/src-qt5/experimental/lumina-terminal/TermWindow.cpp b/src-qt5/experimental/lumina-terminal/TermWindow.cpp
new file mode 100644
index 00000000..812d3679
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TermWindow.cpp
@@ -0,0 +1,316 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "TermWindow.h"
+//#include "ui_TermWindow.h"
+
+#include <QDesktopWidget>
+#include <QDebug>
+#include <QTimer>
+#include <QApplication>
+#include <QVBoxLayout>
+#include "TerminalWidget.h"
+
+// ===============
+// PUBLIC
+// ===============
+TermWindow::TermWindow(QSettings *set) : QWidget(0, Qt::Window | Qt::BypassWindowManagerHint){//, ui(new Ui::TermWindow){
+ this->setWindowOpacity(0.85);
+ CLOSING = false; //internal flag
+ settings = set;
+ //Create the Window
+ this->setLayout(new QVBoxLayout());
+ this->setCursor(Qt::SplitVCursor);
+ tabWidget = new QTabWidget(this);
+ tabWidget->clear(); //just in case
+ tabWidget->setCursor(Qt::ArrowCursor);
+ tabWidget->setTabBarAutoHide(true);
+ tabWidget->setTabsClosable(true);
+ tabWidget->setMovable(true);
+ tabWidget->setUsesScrollButtons(true);
+ tabWidget->setFocusPolicy(Qt::ClickFocus);
+ this->layout()->addWidget(tabWidget);
+ //Setup the animation
+ ANIM = new QPropertyAnimation(this, "geometry", this);
+ ANIM->setDuration(300); //1/3 second animation
+ connect(ANIM, SIGNAL(finished()), this, SLOT(AnimFinished()) );
+ activeTimer = new QTimer(this);
+ activeTimer->setInterval(50);
+ activeTimer->setSingleShot(true);
+ connect(activeTimer, SIGNAL(timeout()), this, SLOT(activeStatusChanged()) );
+ connect(QApplication::instance(), SIGNAL(applicationStateChanged(Qt::ApplicationState)), activeTimer, SLOT(start()) );
+ //Create the keyboard shortcuts
+ //hideS = new QShortcut(QKeySequence(Qt::Key_Escape),this);
+ closeS = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q),this);
+ newTabS = new QShortcut(QKeySequence::AddTab,this);
+ closeTabS = new QShortcut(QKeySequence::Close,this);
+ prevTabS = new QShortcut(QKeySequence::PreviousChild,this);
+ nextTabS = new QShortcut(QKeySequence::NextChild,this);
+ //Print out all the keyboard shortcuts onto the screen
+ qDebug() << "New Tab Shortcut:" << QKeySequence::keyBindings(QKeySequence::AddTab);
+ qDebug() << "Close Tab Shortcut:" << QKeySequence::keyBindings(QKeySequence::Close);
+ qDebug() << "Next Tab Shortcut:" << QKeySequence::keyBindings(QKeySequence::NextChild);
+ qDebug() << "Previous Tab Shortcut:" << QKeySequence::keyBindings(QKeySequence::PreviousChild);
+ //Connect the signals/slots
+ connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(Close_Tab(int)) );
+ connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(focusOnWidget()) );
+ connect(closeTabS, SIGNAL(activated()), this, SLOT(Close_Tab()) );
+ connect(newTabS, SIGNAL(activated()), this, SLOT(New_Tab()) );
+ //connect(hideS, SIGNAL(activated()), this, SLOT(HideWindow()) );
+ connect(closeS, SIGNAL(activated()), this, SLOT(CloseWindow()) );
+ connect(prevTabS, SIGNAL(activated()), this, SLOT(Prev_Tab()) );
+ connect(nextTabS, SIGNAL(activated()), this, SLOT(Next_Tab()) );
+ //Now set the defaults
+ screennum = 0; //default value
+ setTopOfScreen(true); //default value
+ if(settings->contains("lastSize")){
+ //qDebug() << "Re-use last size:" << settings->value("lastSize").toSize();
+ this->resize( settings->value("lastSize").toSize() );
+ CalculateGeom();
+ //qDebug() << "After size:" << this->size();
+ }
+
+ //this->resize(this->width(),300);
+ //this->setMinimumSize(20, 300);
+
+}
+
+
+TermWindow::~TermWindow(){
+
+}
+
+void TermWindow::cleanup(){
+ //called right before the window is closed
+ //Make sure to close any open tabs/processes
+ CLOSING = true;
+ for(int i=0; i<tabWidget->count(); i++){
+ static_cast<TerminalWidget*>(tabWidget->widget(i))->aboutToClose();
+ }
+}
+
+void TermWindow::OpenDirs(QStringList dirs){
+ for(int i=0; i<dirs.length(); i++){
+ //Open a new tab for each directory
+ TerminalWidget *page = new TerminalWidget(tabWidget, dirs[i]);
+ QString ID = GenerateTabID();
+ page->setWhatsThis(ID);
+ tabWidget->addTab(page, ID);
+ tabWidget->setCurrentWidget(page);
+ QTimer::singleShot(500, this, SLOT(focusOnWidget()));//page->setFocus();
+ qDebug() << "New Tab:" << ID << dirs[i];
+ connect(page, SIGNAL(ProcessClosed(QString)), this, SLOT(Close_Tab(QString)) );
+ }
+}
+
+void TermWindow::setCurrentScreen(int num){
+ screennum = num;
+ QTimer::singleShot(0,this, SLOT(ReShowWindow()));
+}
+
+void TermWindow::setTopOfScreen(bool ontop){
+ onTop = ontop;
+ this->layout()->setContentsMargins(0, (onTop ? 0 : 3), 0, (onTop ? 3 : 0));
+ tabWidget->setTabPosition(onTop ? QTabWidget::South : QTabWidget::North);
+ QTimer::singleShot(0,this, SLOT(ReShowWindow()));
+}
+
+// =======================
+// PUBLIC SLOTS
+// =======================
+void TermWindow::ShowWindow(){
+ if(animRunning>=0){ return; } //something running
+ animRunning = 1;
+ this->hide();
+ QApplication::processEvents();
+ CalculateGeom();
+ //Now setup the animation
+ ANIM->setEndValue(this->geometry());
+ if(onTop){ //use top edge
+ ANIM->setStartValue( QRect(this->x(), this->y(), this->width(), 0) ); //same location - no height
+ }else{
+ ANIM->setStartValue( QRect(this->x(), this->geometry().bottom(), this->width(), 0) ); //same location - no height
+ }
+ this->show();
+ //qDebug() << "Start Animation" << ANIM->startValue() << ANIM->endValue();
+ ANIM->start();
+}
+
+void TermWindow::HideWindow(){
+ if(animRunning>=0){ return; } //something running
+ //Now setup the animation
+ //Note: Do *not* use the private settings/variables because it may be changing right now - use the current geometry *ONLY*
+ animRunning = 0;
+ ANIM->setStartValue(this->geometry());
+ QDesktopWidget *desk = QApplication::desktop();
+ int screen = desk->screenNumber(this); //which screen it is currently on
+ if(desk->availableGeometry(screen).top() == this->geometry().top()){ //use top edge
+ ANIM->setEndValue( QRect(this->x(), this->y(), this->width(), 0) ); //same location - no height
+ }else{
+ ANIM->setEndValue( QRect(this->x(), this->y()+this->height(), this->width(), 0) ); //same location - no height
+ }
+ this->show();
+ ANIM->start();
+}
+
+void TermWindow::CloseWindow(){
+ if(animRunning>=0){ return; } //something running
+ //Now setup the animation
+ animRunning = 2;
+ ANIM->setStartValue(this->geometry());
+ if(onTop){ //use top edge
+ ANIM->setEndValue( QRect(this->x(), this->y(), this->width(), 0) ); //same location - no height
+ }else{
+ ANIM->setEndValue( QRect(this->x(), this->geometry().bottom(), this->width(), 0) ); //same location - no height
+ }
+ this->show();
+ ANIM->start();
+}
+
+void TermWindow::ReShowWindow(){
+ if(this->isVisible()){
+ HideWindow(); //start with same animation as hide
+ animRunning = 3; //flag as a re-show (hide, then show);
+ }else{
+ //Already hidden, just show it
+ ShowWindow();
+ }
+}
+// =======================
+// PRIVATE
+// =======================
+void TermWindow::CalculateGeom(){
+ //qDebug() << "Calculating Geom:" << this->size();
+ QDesktopWidget *desk = QApplication::desktop();
+ if(desk->screenCount() <= screennum){ screennum = desk->primaryScreen(); } //invalid screen detected
+ //Now align the window with the proper screen edge
+ QRect workarea = desk->availableGeometry(screennum); //this respects the WORKAREA property
+ if(onTop){
+ this->setGeometry( workarea.x(), workarea.y(), workarea.width(), this->height()); //maintain current hight of window
+
+ }else{
+ this->setGeometry( workarea.x(), workarea.y() + workarea.height() - this->height(), workarea.width(), this->height()); //maintain current hight of window
+ }
+ this->setFixedWidth(this->width()); //Make sure the window is not re-sizeable in the width dimension
+ this->setMinimumHeight(0);
+}
+
+QString TermWindow::GenerateTabID(){
+ //generate a unique ID for this new tab
+ int num = 1;
+ for(int i=0; i<tabWidget->count(); i++){
+ if(tabWidget->widget(i)->whatsThis().toInt() >= num){ num = tabWidget->widget(i)->whatsThis().toInt()+1; }
+ }
+ return QString::number(num);
+}
+
+// =======================
+// PRIVATE SLOTS
+// =======================
+
+//Tab Interactions
+void TermWindow::New_Tab(){
+ OpenDirs(QStringList() << QDir::homePath());
+}
+
+void TermWindow::Close_Tab(int tab){
+ qDebug() << "Close Tab:" << tab;
+ if(tab<0){ tab = tabWidget->currentIndex(); }
+ static_cast<TerminalWidget*>(tabWidget->widget(tab))->aboutToClose();
+ tabWidget->widget(tab)->deleteLater(); //delete the page within the tag
+ tabWidget->removeTab(tab); // remove the tab itself
+ //Let the tray know when the last terminal is closed
+ if(tabWidget->count() < 1){
+ emit TerminalFinished();
+ }
+}
+
+void TermWindow::Close_Tab(QString ID){
+ //Close a tab based on it's ID instead of it's tab number
+ qDebug() << "Close Tab by ID:" << ID;
+ for(int i=0; i<tabWidget->count(); i++){
+ if(tabWidget->widget(i)->whatsThis()==ID){
+ qDebug() << " - Start close by number:" << i;
+ Close_Tab(i);
+ return; //all done
+ }
+ }
+}
+
+void TermWindow::Next_Tab(){
+ qDebug() << "Next Tab";
+ int next = tabWidget->currentIndex()+1;
+ if(next>=tabWidget->count()){ next = 0; }
+ tabWidget->setCurrentIndex(next);
+}
+
+void TermWindow::Prev_Tab(){
+ qDebug() << "Previous Tab";
+ int next = tabWidget->currentIndex()-1;
+ if(next<0){ next = tabWidget->count()-1; }
+ tabWidget->setCurrentIndex(next);
+}
+
+void TermWindow::focusOnWidget(){
+ if(tabWidget->currentWidget()!=0){
+ //qDebug() << "Focus on Widget";
+ tabWidget->currentWidget()->setFocus();
+ }
+}
+
+//Animation finishing
+void TermWindow::AnimFinished(){
+ if(animRunning <0){ return; } //nothing running
+ if(animRunning==0){
+ //Hide Event
+ this->hide(); //need to hide the whole thing now
+ this->setGeometry( ANIM->startValue().toRect() ); //reset back to initial size after hidden
+ emit TerminalHidden();
+ }else if(animRunning==1){
+ //Show Event
+ this->activateWindow();
+ tabWidget->currentWidget()->setFocus();
+ emit TerminalVisible();
+ }else if(animRunning==2){
+ //Close Event
+ this->hide(); //need to hide the whole thing now
+ emit TerminalClosed();
+ }else if(animRunning>2){
+ //Re-Show event
+ this->hide();
+ this->setGeometry( ANIM->startValue().toRect() ); //reset back to initial size after hidden
+ //Now re-show it
+ QTimer::singleShot(0,this, SLOT(ShowWindow()));
+ }
+ animRunning = -1; //done
+}
+
+void TermWindow::activeStatusChanged(){
+ if(animRunning>=0){ return; } //ignore this event - already changing
+ QWidget *active = QApplication::activeWindow();
+ if(active==0 && this->isVisible()){ HideWindow(); }
+}
+
+// ===================
+// PROTECTED
+// ===================
+void TermWindow::mouseMoveEvent(QMouseEvent *ev){
+ //Note: With mouse tracking turned off, this event only happens when the user is holding down the mouse button
+ if(onTop){
+ //Move the bottom edge to the current point
+ if( (ev->globalPos().y() - this->y()) < 50){ return; } //quick check that the window is not smaller than 20 pixels
+ QRect geom = this->geometry();
+ geom.setBottom(ev->globalPos().y());
+ this->setGeometry(geom);
+ }else{
+ //Move the top edge to the current point
+ if( (this->y() + this->height() -ev->globalPos().y()) < 50){ return; } //quick check that the window is not smaller than 20 pixels
+ QRect geom = this->geometry();
+ geom.setTop(ev->globalPos().y());
+ this->setGeometry(geom);
+ }
+ settings->setValue("lastSize",this->geometry().size());
+}
diff --git a/src-qt5/experimental/lumina-terminal/TermWindow.h b/src-qt5/experimental/lumina-terminal/TermWindow.h
new file mode 100644
index 00000000..5f583126
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TermWindow.h
@@ -0,0 +1,73 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_UTILITIES_TERMINAL_MAIN_WINDOW_H
+#define _LUMINA_DESKTOP_UTILITIES_TERMINAL_MAIN_WINDOW_H
+
+#include <QWidget>
+#include <QPropertyAnimation>
+#include <QTabWidget>
+#include <QDir>
+#include <QShortcut>
+#include <QMouseEvent>
+#include <QSettings>
+
+class TermWindow : public QWidget{
+ Q_OBJECT
+public:
+ TermWindow(QSettings *set);
+ ~TermWindow();
+
+ void cleanup(); //called right before the window is closed
+ void OpenDirs(QStringList);
+
+ void setCurrentScreen(int num = 0);
+ void setTopOfScreen(bool ontop);
+
+public slots:
+ void ShowWindow();
+ void HideWindow();
+ void CloseWindow();
+ void ReShowWindow();
+
+private:
+ QTabWidget *tabWidget;
+ QSettings *settings;
+ QShortcut *hideS, *closeS, *newTabS, *closeTabS, *prevTabS, *nextTabS;
+ int screennum;
+ bool onTop, CLOSING;
+ QPropertyAnimation *ANIM;
+ int animRunning; //internal flag for what animation is currently running
+ QTimer *activeTimer;
+
+ //Calculate the window geometry necessary based on screen/location
+ void CalculateGeom();
+ QString GenerateTabID();
+
+private slots:
+ //Tab Interactions
+ void New_Tab();
+ void Close_Tab(int tab = -1);
+ void Close_Tab(QString ID); //alternate form of the close routine - based on tab ID
+ void Next_Tab();
+ void Prev_Tab();
+ void focusOnWidget();
+ //Animation finishing
+ void AnimFinished();
+ //Window focus/active status changed
+ void activeStatusChanged();
+
+protected:
+ void mouseMoveEvent(QMouseEvent*);
+
+signals:
+ void TerminalHidden();
+ void TerminalVisible();
+ void TerminalClosed();
+ void TerminalFinished();
+};
+
+#endif
diff --git a/src-qt5/experimental/lumina-terminal/TerminalWidget.cpp b/src-qt5/experimental/lumina-terminal/TerminalWidget.cpp
new file mode 100644
index 00000000..7601ae9f
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TerminalWidget.cpp
@@ -0,0 +1,570 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "TerminalWidget.h"
+
+#include <QProcessEnvironment>
+#include <QDebug>
+#include <QApplication>
+#include <QScrollBar>
+#include <QTextBlock>
+
+#include <LuminaXDG.h>
+
+#define DEBUG 0
+
+//Special control code ending symbols (aside from letters)
+
+TerminalWidget::TerminalWidget(QWidget *parent, QString dir) : QTextEdit(parent){
+ //Setup the text widget
+ closing = false;
+ QPalette P = this->palette();
+ P.setColor(QPalette::Base, Qt::black);
+ P.setColor(QPalette::Text, Qt::white);
+ this->setPalette(P);
+ this->setLineWrapMode(QTextEdit::WidgetWidth);
+ this->setAcceptRichText(false);
+ this->setOverwriteMode(true);
+ this->setFocusPolicy(Qt::StrongFocus);
+ this->setTabStopWidth( 8 * this->fontMetrics().width(" ") ); //8 character spaces per tab (UNIX standard)
+ this->setTabChangesFocus(false);
+ //this->setWordWrapMode(QTextOption::NoWrap);
+ this->setContextMenuPolicy(Qt::CustomContextMenu);
+ resizeTimer = new QTimer(this);
+ resizeTimer->setInterval(20);
+ resizeTimer->setSingleShot(true);
+ connect(resizeTimer, SIGNAL(timeout()), this, SLOT(updateTermSize()) );
+ DEFFMT = this->textCursor().charFormat(); //save the default structure for later
+ DEFFMT.setForeground(Qt::white);
+ CFMT = DEFFMT; //current format
+ selCursor = this->textCursor(); //used for keeping track of selections
+ lastCursor = this->textCursor();
+ startrow = endrow = -1;
+ altkeypad = false;
+ QFontDatabase FDB;
+ QStringList fonts = FDB.families(QFontDatabase::Latin);
+ for(int i=0; i<fonts.length(); i++){
+ if(FDB.isFixedPitch(fonts[i]) && FDB.isSmoothlyScalable(fonts[i]) ){ this->setFont(QFont(fonts[i])); qDebug() << "Using Font:" << fonts[i]; break; }
+ //if(FDB.isSmoothlyScalable(fonts[i]) ){ this->setFont(QFont(fonts[i])); qDebug() << "Using Font:" << fonts[i]; break; }
+ }
+ //Create/open the TTY port
+ PROC = new TTYProcess(this);
+ //qDebug() << "Open new TTY";
+ //int fd;
+ bool ok = PROC->startTTY( QProcessEnvironment::systemEnvironment().value("SHELL","/bin/sh"), QStringList(), dir);
+ //qDebug() << " - opened:" << ok;
+ this->setEnabled(false);
+ contextMenu = new QMenu(this);
+ copyA = contextMenu->addAction(LXDG::findIcon("edit-copy"), tr("Copy Selection"), this, SLOT(copySelection()) );
+ pasteA = contextMenu->addAction(LXDG::findIcon("edit-paste"), tr("Paste"), this, SLOT(pasteSelection()) );
+ //Connect the signals/slots
+ connect(PROC, SIGNAL(readyRead()), this, SLOT(UpdateText()) );
+ connect(PROC, SIGNAL(processClosed()), this, SLOT(ShellClosed()) );
+
+}
+
+TerminalWidget::~TerminalWidget(){
+ aboutToClose();
+}
+
+void TerminalWidget::setTerminalFont(QFont font){
+
+ this->setFont(font);
+}
+
+void TerminalWidget::aboutToClose(){
+ closing = true;
+ if(PROC->isOpen()){ PROC->closeTTY(); } //TTY PORT
+
+}
+
+// ==================
+// PRIVATE
+// ==================
+void TerminalWidget::InsertText(QString txt){
+ if(txt.isEmpty()){ return; }
+ //qDebug() << "Insert Text:" << txt << "Cursor Pos:" << this->textCursor().position() << "Column:" << this->textCursor().columnNumber();
+ QTextCursor cur = this->textCursor();
+ cur.setCharFormat(CFMT);
+ this->setTextCursor(cur); //ensure the current cursor has the proper format
+ this->insertPlainText(txt);
+ /*cur.setPosition( this->textCursor().position(), QTextCursor::KeepAnchor);
+ //cur.setCharFormat(CFMT);
+ //Now make sure the new characters are the right color
+ QList<QTextEdit::ExtraSelection> sels = this->extraSelections();
+ QTextEdit::ExtraSelection sel;
+ sel.format = CFMT;
+ sel.cursor = cur;
+ sels << sel;
+ this->setExtraSelections(sels);*/
+ if(DEBUG){
+ qDebug() << "Insert Text:"<< txt << "Font Color:" << CFMT.foreground() << "Background Color:" << CFMT.background() << "Font Weight:" << CFMT.fontWeight();
+ }
+}
+
+void TerminalWidget::applyData(QByteArray data){
+ this->setEnabled(true);
+ if(DEBUG){ qDebug() << "Got Data: " << data; }
+ //Make sure the current cursor is the right cursor
+ if(this->textCursor()==selCursor){ this->setTextCursor(lastCursor); }
+ //Iterate through the data and apply it when possible
+ QByteArray chars;
+ //qDebug() << "Data:" << data;
+ for(int i=0; i<data.size(); i++){
+ if( data.at(i)=='\b' ){
+ //Backspace
+ if(!chars.isEmpty()){ chars.chop(1); }
+ else{
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }
+
+ //}else if( data.at(i)=='\t' ){
+ //chars.append(" ");
+ }else if( data.at(i)=='\x1B' ){
+ //Flush current text buffer to widget
+ if(!chars.isEmpty()){ InsertText(chars); chars.clear(); }
+ //ANSI Control Code start
+ //Look for the end of the code
+ int end = -1;
+ for(int j=1; j<(data.size()-i) && end<0; j++){
+ if(QChar(data.at(i+j)).isLetter() || (QChar(data.at(i+j)).isSymbol() && data.at(i+j)!=';') ){ end = j; }
+ else if(data.at(i+j)=='\x1B'){ end = j-1; } //start of the next control code
+ }
+ if(end<0){ return; } //skip everything else - no end to code found
+ applyANSI(data.mid(i+1, end));
+ //qDebug() << "Code:" << data.mid(i+1, end) << "Next Char:" << data[i+end+2];
+ i+=end; //move the final loop along - already handled these bytes
+
+ }else if( data.at(i) == '\r' ){
+ //Move cursor to end of line
+ //qDebug() << "Got a return char";
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::EndOfLine, QTextCursor::MoveAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }else{
+ chars.append(data.at(i)); //Add the character to the buffer
+ }
+ } //end loop over data
+ if(!chars.isEmpty()){ InsertText(chars); }
+}
+
+void TerminalWidget::applyANSI(QByteArray code){
+ //Note: the first byte is often the "[" character
+ //qDebug() << "Handle ANSI:" << code;
+ if(code.length()==1){
+ //KEYPAD MODES
+ if(code.at(0)=='='){ altkeypad = true; }
+ else if(code.at(0)=='>'){ altkeypad = false; }
+ else{
+ qDebug() << "Unhandled ANSI Code:" << code;
+ }
+
+ }else if(code.startsWith("[") && code.contains("@")){
+ code = code.remove(0, code.indexOf("@")+1);
+ InsertText(code); //insert character (cursor position already accounted for with other systems)
+ }else if(code.startsWith("[")){
+ // VT100 ESCAPE CODES
+ //CURSOR MOVEMENT
+ if( code.endsWith("A") ){ //Move Up
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Up, QTextCursor::MoveAnchor, num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("B")){ //Move Down
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("C")){ //Move Forward
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("D")){ //Move Back
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("E")){ //Move Next/down Lines (go toward end)
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::NextRow, QTextCursor::MoveAnchor, num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("F")){ //Move Previous/up Lines (go to beginning)
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::PreviousRow, QTextCursor::MoveAnchor, num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("G")){ //Move to specific column
+ int num = 1;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ QTextCursor cur = this->textCursor();
+ cur.setPosition(num);
+ this->setTextCursor(cur);
+ }else if(code.endsWith("H") || code.endsWith("f") ){ //Move to specific position (row/column)
+ int mid = code.indexOf(";");
+ if(mid>1){
+ int numR, numC; numR = numC = 1;
+ if(mid >=2){ numR = code.mid(1,mid-1).toInt(); }
+ if(mid < code.size()-1){ numC = code.mid(mid+1,code.size()-mid-2).toInt(); }
+
+ if(startrow>=0 && endrow>=0){
+ if(numR == startrow){ numR = 0;}
+ else if(numR==endrow){ numR = this->document()->lineCount()-1; }
+ }
+ qDebug() << "Set Text Position (absolute):" << "Code:" << code << "Row:" << numR << "Col:" << numC;
+ //qDebug() << " - Current Pos:" << this->textCursor().position() << "Line Count:" << this->document()->lineCount();
+ //if(!this->textCursor().movePosition(QTextCursor::Start, QTextCursor::MoveAnchor,1) ){ qDebug() << "Could not go to start"; }
+ QTextCursor cur(this->textCursor());
+ cur.setPosition(QTextCursor::Start, QTextCursor::MoveAnchor); //go to start of document
+ //qDebug() << " - Pos After Start Move:" << cur.position();
+ if( !cur.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, numR) ){ qDebug() << "Could not go to row:" << numR; }
+ //qDebug() << " - Pos After Down Move:" << cur.position();
+ if( !cur.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, numC) ){ qDebug() << "Could not go to col:" << numC; }
+ /*this->textCursor().setPosition( this->document()->findBlockByLineNumber(numR).position() );
+ qDebug() << " - Pos After Row Move:" << this->textCursor().position();
+ if( !this->textCursor().movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, numC) ){ qDebug() << "Could not go to col:" << numC; }*/
+ //qDebug() << " - Ending Pos:" << cur.position();
+ this->setTextCursor(cur);
+ }else{
+ //Go to home position
+ this->moveCursor(QTextCursor::Start);
+ }
+
+ // CURSOR MANAGEMENT
+ }else if(code.endsWith("r")){ //Tag top/bottom lines as perticular numbers
+ int mid = code.indexOf(";");
+ qDebug() << "New Row Codes:" << code << "midpoint:" << mid;
+ if(mid>1){
+ if(mid >=2){ startrow = code.mid(1,mid-1).toInt(); }
+ if(mid < code.size()-1){ endrow = code.mid(mid+1,code.size()-mid-2).toInt(); }
+ }
+ qDebug() << "New Row Codes:" << startrow << endrow;
+ // DISPLAY CLEAR CODES
+ }else if(code.endsWith("J")){ //ED - Erase Display
+ int num = 0;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ //qDebug() << "Erase Display:" << num;
+ if(num==1){
+ //Clear from cursor to beginning of screen
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Start, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }else if(num==2){
+ //Clear the whole screen
+ qDebug() << "Clear Screen:" << this->document()->lineCount();
+ this->clear();
+ }else{
+ //Clear from cursor to end of screen
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::End, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }
+ }else if(code.endsWith("K")){ //EL - Erase in Line
+ int num = 0;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ //qDebug() << "Erase Number" << num;
+ //Now determine what should be cleared based on code
+ if(num==1){
+ //Clear from current cursor to beginning of line
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }else if(num==2){
+ //Clear the entire line
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor, 1);
+ cur.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }else{
+ //Clear from current cursor to end of line
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }
+ }else if(code.endsWith("g")){
+ //Tab Clear codes (0 or 3 only)
+ int num = 0;
+ if(code.size()>2){ num = code.mid(1, code.size()-2).toInt(); } //everything in the middle
+ if(num==0){ //clear current column (delete key analogue)
+ QTextCursor cur = this->textCursor();
+ cur.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 1);
+ cur.removeSelectedText();
+ this->setTextCursor(cur);
+ }else if(num==3){ //clear all
+ this->clear();
+ }
+ //SCROLL MOVEMENT CODES
+ //}else if(code.endsWith("S")){ // SU - Scroll Up
+ //qDebug() << "Scroll Up:" << code;
+ //}else if(code.endsWith("T")){ // SD - Scroll Down
+ //qDebug() << "Scroll Down:" << code;
+
+ // GRAPHICS RENDERING
+ }else if(code.endsWith("m")){
+ //Format: "[<number>;<number>m" (no limit to sections separated by ";")
+ //qDebug() << "Got Graphics Code:" << code;
+ code.chop(1); //chop the "m" off the end
+ int start = 1;
+ int end = code.indexOf(";");
+ while(end>start){
+ //qDebug() << "Color Code:" << code << start << end << code.mid(start, end-start);
+ applyANSIColor(code.mid(start, end-start).toInt());
+ //Now update the iterators and try again
+ start = end;
+ end = code.indexOf(";",start); //go to the next one
+ //qDebug() << "Next end:" << end;
+ }
+ //Need the last section as well
+ end = code.size();
+ if(start>1){ start ++; }
+ //qDebug() << "Color Code:" << code << start << end << code.mid(start, end-start);
+ if(end>start){ applyANSIColor(code.mid(start, end-start).toInt());}
+ else{ applyANSIColor(0); }
+
+
+ // GRAPHICS MODES
+ //}else if(code.endsWith("h")){
+
+ //}else if(code.endsWith("l")){
+
+ }else{
+ qDebug() << "Unhandled Control Code:" << code;
+ }
+
+ } //End VT100 control codes
+ else{
+ qDebug() << "Unhandled Control Code:" << code;
+ }
+}
+
+void TerminalWidget::applyANSIColor(int code){
+ //qDebug() << "Apply Color code:" << code;
+ if(code <=0){ CFMT = DEFFMT; } //Reset back to default
+ else if(code==1){ CFMT.setFontWeight(75); } //BOLD font
+ else if(code==2){ CFMT.setFontWeight(25); } //Faint font (smaller than normal by a bit)
+ else if(code==3){ CFMT.setFontWeight(75); } //Italic font
+ else if(code==4){ CFMT.setFontUnderline(true); } //Underline
+ //5-6: Blink text (unsupported)
+ //7: Reverse foreground/background (unsupported)
+ //8: Conceal (unsupported)
+ else if(code==9){ CFMT.setFontStrikeOut(true); } //Crossed out
+ //10-19: Change font family (unsupported)
+ //20: Fraktur Font (unsupported)
+ //21: Bold:off or Underline:Double (unsupported)
+ else if(code==22){ CFMT.setFontWeight(50); } //Normal weight
+ //23: Reset font (unsupported)
+ else if(code==24){ CFMT.setFontUnderline(false); } //disable underline
+ //25: Disable blinking (unsupported)
+ //26: Reserved
+ //27: Reset reversal (7) (unsupported)
+ //28: Reveal (cancel 8) (unsupported)
+ else if(code==29){ CFMT.setFontStrikeOut(false); } //Not Crossed out
+ else if(code>=30 && code<=39){
+ //Set the font color
+ QColor color;
+ if(code==30){color=QColor(Qt::black); }
+ else if(code==31){ color=QColor(Qt::red); }
+ else if(code==32){ color=QColor(Qt::green); }
+ else if(code==33){ color=QColor(Qt::yellow); }
+ else if(code==34){ color=QColor(Qt::blue); }
+ else if(code==35){ color=QColor(Qt::magenta); }
+ else if(code==36){ color=QColor(Qt::cyan); }
+ else if(code==37){ color=QColor(Qt::white); }
+ //48: Special extended color setting (unsupported)
+ else if(code==39){ color= DEFFMT.foreground().color(); } //reset to default color
+ QBrush brush = CFMT.foreground();
+ color.setAlpha(255); //fully opaque
+ brush.setColor(color);
+ CFMT.setForeground( brush );
+ //this->setTextColor(color); //just in case the format is not used
+ }
+ else if(code>=40 && code<=49){
+ //Set the font color
+ QColor color;
+ if(code==40){color=QColor(Qt::black); }
+ else if(code==41){ color=QColor(Qt::red); }
+ else if(code==42){ color=QColor(Qt::green); }
+ else if(code==43){ color=QColor(Qt::yellow); }
+ else if(code==44){ color=QColor(Qt::blue); }
+ else if(code==45){ color=QColor(Qt::magenta); }
+ else if(code==46){ color=QColor(Qt::cyan); }
+ else if(code==47){ color=QColor(Qt::white); }
+ //48: Special extended color setting (unsupported)
+ else if(code==49){ color= DEFFMT.background().color(); } //reset to default color
+ QBrush brush = CFMT.background();
+ color.setAlpha(255); //fully opaque
+ brush.setColor(color);
+ CFMT.setBackground( brush );
+ }
+ //50: Reserved
+ //51: Framed
+ //52: Encircled
+ else if(code==53){ CFMT.setFontOverline(true); } //enable overline
+ //54: Not framed/circled (51/52)
+ else if(code==55){ CFMT.setFontOverline(false); } //disable overline
+ //56-59: Reserved
+ //60+: Not generally supported (special code for particular terminals such as aixterm)
+ else{ qDebug() << "Unknown Color Code:" << code; }
+}
+
+//Outgoing Data parsing
+void TerminalWidget::sendKeyPress(int key){
+ QByteArray ba;
+ //if(this->textCursor()==selCursor){ this->setTextCursor(lastCursor); }
+ //int fromEnd = this->document()->characterCount() - this->textCursor().position();
+ //Check for special keys
+ switch(key){
+ case Qt::Key_Delete:
+ ba.append("\e[3~");
+ break;
+ case Qt::Key_Backspace:
+ ba.append("\x08");
+ break;
+ case Qt::Key_Left:
+ if(altkeypad){ ba.append("^[D"); }
+ else{ ba.append("\x1b[D"); }
+ break;
+ case Qt::Key_Right:
+ if(altkeypad){ ba.append("^[C"); }
+ else{ ba.append("\x1b[C"); }
+ break;
+ case Qt::Key_Up:
+ if(altkeypad){ ba.append("^[A"); }
+ else{ ba.append("\x1b[A"); }
+ break;
+ case Qt::Key_Down:
+ if(altkeypad){ ba.append("^[B"); }
+ else{ ba.append("\x1b[B"); }
+ break;
+ case Qt::Key_Home:
+ ba.append("\x1b[H");
+ break;
+ case Qt::Key_End:
+ ba.append("\x1b[F");
+ break;
+ }
+ //qDebug() << "Forward Input:" << ba;
+ if(!ba.isEmpty()){ PROC->writeTTY(ba); }
+}
+
+// ==================
+// PRIVATE SLOTS
+// ==================
+void TerminalWidget::UpdateText(){
+ //read the data from the process
+ //qDebug() << "UpdateText";
+ if(!PROC->isOpen()){ return; }
+ applyData(PROC->readTTY());
+ //adjust the scrollbar as needed
+ this->ensureCursorVisible();
+}
+
+void TerminalWidget::ShellClosed(){
+ if(!closing){
+ emit ProcessClosed(this->whatsThis());
+ }
+}
+
+void TerminalWidget::copySelection(){
+ QApplication::clipboard()->setText( selCursor.selectedText() );
+}
+
+void TerminalWidget::pasteSelection(){
+ QString text = QApplication::clipboard()->text();
+ if(!text.isEmpty()){
+ QByteArray ba; ba.append(text); //avoid any byte conversions
+ PROC->writeTTY(ba);
+ }
+}
+
+void TerminalWidget::updateTermSize(){
+ if(!PROC->isOpen()){ return; }
+ QSize pix = this->size(); //pixels
+ QSize chars;
+ chars.setWidth( pix.width()/this->fontMetrics().width("W") );
+ chars.setHeight( pix.height()/this->fontMetrics().lineSpacing() );
+
+ PROC->setTerminalSize(chars,pix);
+}
+
+// ==================
+// PROTECTED
+// ==================
+void TerminalWidget::keyPressEvent(QKeyEvent *ev){
+
+ if(ev->text().isEmpty() || ev->text()=="\b" ){
+ sendKeyPress(ev->key());
+ }else{
+ QByteArray ba; ba.append(ev->text()); //avoid any byte conversions
+ //qDebug() << "Forward Input:" << ba;
+ PROC->writeTTY(ba);
+ }
+
+ ev->ignore();
+}
+
+void TerminalWidget::mousePressEvent(QMouseEvent *ev){
+ this->setFocus();
+ this->activateWindow();
+ if(ev->button()==Qt::RightButton){
+ QTextEdit::mousePressEvent(ev);
+ }else if(ev->button()==Qt::MiddleButton){
+ pasteSelection();
+ }else if(ev->button()==Qt::LeftButton){
+ if(this->textCursor()!=selCursor){ lastCursor = this->textCursor(); }
+ selCursor = this->cursorForPosition(ev->pos());
+ }
+ Q_UNUSED(ev);
+}
+
+void TerminalWidget::mouseMoveEvent(QMouseEvent *ev){
+ //qDebug() << "MouseMove Event" << ev->button() << ev->buttons() << Qt::LeftButton;
+ if(ev->buttons().testFlag(Qt::LeftButton) ){
+ selCursor.setPosition(this->cursorForPosition(ev->pos()).position(), QTextCursor::KeepAnchor);
+ if(selCursor.hasSelection()){ this->setTextCursor(selCursor); }
+ //qDebug() << "Mouse Movement:" << selCursor.hasSelection();
+ }else{
+ QTextEdit::mouseMoveEvent(ev);
+ }
+}
+
+void TerminalWidget::mouseReleaseEvent(QMouseEvent *ev){
+ if(ev->button()==Qt::LeftButton){
+ selCursor.setPosition(this->cursorForPosition(ev->pos()).position(), QTextCursor::KeepAnchor);
+ if(selCursor.hasSelection()){ this->setTextCursor(selCursor); }
+ else{ this->setTextCursor(lastCursor); }
+ }else if(ev->button()==Qt::RightButton){
+ copyA->setEnabled( selCursor.hasSelection() );
+ pasteA->setEnabled( !QApplication::clipboard()->text().isEmpty() );
+ contextMenu->popup( this->mapToGlobal(ev->pos()) );
+ }
+ Q_UNUSED(ev);
+}
+
+void TerminalWidget::mouseDoubleClickEvent(QMouseEvent *ev){
+ Q_UNUSED(ev);
+}
+
+void TerminalWidget::resizeEvent(QResizeEvent *ev){
+ resizeTimer->start();
+ QTextEdit::resizeEvent(ev);
+}
diff --git a/src-qt5/experimental/lumina-terminal/TerminalWidget.h b/src-qt5/experimental/lumina-terminal/TerminalWidget.h
new file mode 100644
index 00000000..616919c3
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TerminalWidget.h
@@ -0,0 +1,73 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_UTILITIES_TERMINAL_PROCESS_WIDGET_H
+#define _LUMINA_DESKTOP_UTILITIES_TERMINAL_PROCESS_WIDGET_H
+
+#include <QTextEdit>
+#include <QKeyEvent>
+#include <QResizeEvent>
+#include <QSocketNotifier>
+#include <QTimer>
+#include <QMenu>
+#include <QClipboard>
+
+#include "TtyProcess.h"
+
+class TerminalWidget : public QTextEdit{
+ Q_OBJECT
+public:
+ TerminalWidget(QWidget *parent =0, QString dir="");
+ ~TerminalWidget();
+
+ void setTerminalFont(QFont);
+ void aboutToClose();
+
+private:
+ TTYProcess *PROC;
+ QTimer *resizeTimer;
+ QTextCharFormat DEFFMT, CFMT; //default/current text format
+ QTextCursor selCursor, lastCursor;
+ QMenu *contextMenu;
+ QAction *copyA, *pasteA;
+ int selectionStart;
+ bool closing;
+
+ //Incoming Data parsing
+ void InsertText(QString);
+ void applyData(QByteArray data); //overall data parsing
+ void applyANSI(QByteArray code); //individual code application
+ void applyANSIColor(int code); //Add the designated color code to the CFMT structure
+
+ //Outgoing Data parsing
+ void sendKeyPress(int key);
+
+ //Special incoming data flags
+ int startrow, endrow; //indexes for the first/last row ("\x1b[A;Br" CC)
+ bool altkeypad;
+private slots:
+ void UpdateText();
+ void ShellClosed();
+
+ void copySelection();
+ void pasteSelection();
+
+ void updateTermSize();
+
+signals:
+ void ProcessClosed(QString);
+
+protected:
+ void keyPressEvent(QKeyEvent *ev);
+ void mousePressEvent(QMouseEvent *ev);
+ void mouseMoveEvent(QMouseEvent *ev);
+ void mouseReleaseEvent(QMouseEvent *ev);
+ void mouseDoubleClickEvent(QMouseEvent *ev);
+ //void contextMenuEvent(QContextMenuEvent *ev);
+ void resizeEvent(QResizeEvent *ev);
+};
+
+#endif
diff --git a/src-qt5/experimental/lumina-terminal/TrayIcon.cpp b/src-qt5/experimental/lumina-terminal/TrayIcon.cpp
new file mode 100644
index 00000000..5198146e
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TrayIcon.cpp
@@ -0,0 +1,173 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "TrayIcon.h"
+
+#include <QDir>
+#include <QDesktopWidget>
+
+#include <LUtils.h>
+
+TrayIcon::TrayIcon() : QSystemTrayIcon(){
+ //Create the child widgets here
+ settings = new QSettings("lumina-desktop","lumina-terminal");
+ this->setContextMenu(new QMenu());
+ ScreenMenu = new QMenu();
+ connect(ScreenMenu, SIGNAL(triggered(QAction*)), this, SLOT(ChangeScreen(QAction*)) );
+ TERM = new TermWindow(settings);
+ //Load the current settings
+ TERM->setTopOfScreen(settings->value("TopOfScreen",true).toBool());
+ TERM->setCurrentScreen(settings->value("OnScreen",0).toInt());
+ connect(TERM, SIGNAL(TerminalHidden()), this, SLOT(TermHidden()));
+ connect(TERM, SIGNAL(TerminalVisible()), this, SLOT(TermVisible()));
+ connect(TERM, SIGNAL(TerminalClosed()), this, SLOT(startCleanup()));
+ connect(TERM, SIGNAL(TerminalFinished()), this, SLOT(stopApplication()));
+ connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(TrayActivated(QSystemTrayIcon::ActivationReason)) );
+}
+
+TrayIcon::~TrayIcon(){
+ delete TERM;
+ delete ScreenMenu;
+}
+
+// =============
+// PUBLIC
+// =============
+void TrayIcon::parseInputs(QStringList inputs){
+ //Note that this is only run on the primary process - otherwise inputs are sent to the slotSingleInstance() below
+ termVisible = !inputs.contains("-toggle"); //will automatically show the terminal on first run, even if "-toggle" is set
+
+ setupContextMenu();
+ updateIcons();
+ inputs = adjustInputs(inputs); //will adjust termVisible as necessary
+ if(inputs.isEmpty()){ inputs << QDir::homePath(); } //always start up with one terminal minimum
+ TERM->OpenDirs(inputs);
+ if(termVisible){ QTimer::singleShot(0, TERM, SLOT(ShowWindow())); }
+}
+
+// =================
+// PUBLIC SLOTS
+// =================
+void TrayIcon::slotSingleInstance(QStringList inputs){
+ //Note that this is only run for a secondary process forwarding its inputs
+ //qDebug() << "Single Instance Event:" << inputs << termVisible;
+ bool visible = termVisible;
+ inputs = adjustInputs(inputs); //will adjust termVisible as necessary
+ if(!inputs.isEmpty()){ TERM->OpenDirs(inputs); }
+ //Only adjust the window if there was a change in the visibility status
+ //qDebug() << "Set Visible:" << termVisible;
+ if(!visible && termVisible){ QTimer::singleShot(0, TERM, SLOT(ShowWindow())); }
+ else if(visible && !termVisible){ QTimer::singleShot(0, TERM, SLOT(HideWindow())); }
+}
+
+void TrayIcon::updateIcons(){
+ this->setIcon(LXDG::findIcon("utilities-terminal",""));
+}
+
+// ================
+// PRIVATE
+// ================
+QStringList TrayIcon::adjustInputs(QStringList inputs){
+ bool hasHide = false;
+ //Look for the special CLI flags just for the tray icon and trim them out
+ for(int i=0; i<inputs.length(); i++){
+ if(inputs[i]=="-toggle"){ hasHide = termVisible; inputs.removeAt(i); i--; } //toggle the visibility
+ else if(inputs[i]=="-show"){ hasHide = false; inputs.removeAt(i); i--; } //change the visibility
+ else if(inputs[i]=="-hide"){ hasHide = true; inputs.removeAt(i); i--; } //change the visibility
+ else{
+ //Must be a directory - convert to an absolute path and check for existance
+ inputs[i] = LUtils::PathToAbsolute(inputs[i]);
+ QFileInfo info(inputs[i]);
+ if(!info.exists()){
+ qDebug() << "Directory does not exist: " << inputs[i];
+ inputs.removeAt(i);
+ i--;
+ }else if(!info.isDir()){
+ //Must be some kind of file, open the parent directory
+ inputs[i] = inputs[i].section("/",0,-2);
+ }
+ }
+ }
+ termVisible = !hasHide;
+ return inputs;
+}
+
+// ================
+// PRIVATE SLOTS
+// ================
+void TrayIcon::startCleanup(){
+ TERM->cleanup();
+}
+
+void TrayIcon::stopApplication(){
+ QApplication::exit(0);
+}
+
+void TrayIcon::ChangeTopBottom(bool ontop){
+ TERM->setTopOfScreen(ontop);
+ settings->setValue("TopOfScreen",ontop); //save for later
+}
+
+void TrayIcon::ChangeScreen(QAction *act){
+ int screen = act->whatsThis().toInt();
+ TERM->setCurrentScreen(screen);
+ settings->setValue("OnScreen",screen);
+ updateScreenMenu();
+}
+
+void TrayIcon::setupContextMenu(){
+ this->contextMenu()->clear();
+ this->contextMenu()->addAction(LXDG::findIcon("edit-select",""), tr("Trigger Terminal"), this, SLOT(ToggleVisibility()) );
+ this->contextMenu()->addSeparator();
+ QAction * act = this->contextMenu()->addAction(tr("Top of Screen"), this, SLOT(ChangeTopBottom(bool)) );
+ act->setCheckable(true);
+ act->setChecked(settings->value("TopOfScreen",true).toBool() );
+ this->contextMenu()->addMenu(ScreenMenu);
+ this->contextMenu()->addSeparator();
+ this->contextMenu()->addAction(LXDG::findIcon("application-exit",""), tr("Close Terminal"), this, SLOT(stopApplication()) );
+ updateScreenMenu();
+}
+
+void TrayIcon::updateScreenMenu(){
+ ScreenMenu->clear();
+ QDesktopWidget *desk = QApplication::desktop();
+ int cscreen = settings->value("OnScreen",0).toInt();
+ if(cscreen>=desk->screenCount()){ cscreen = desk->primaryScreen(); }
+ ScreenMenu->setTitle(tr("Move To Monitor"));
+ for(int i=0; i<desk->screenCount(); i++){
+ if(i!=cscreen){
+ QAction *act = new QAction( QString(tr("Monitor %1")).arg(QString::number(i+1)),ScreenMenu);
+ act->setWhatsThis(QString::number(i));
+ ScreenMenu->addAction(act);
+ }
+ }
+ ScreenMenu->setVisible(!ScreenMenu->isEmpty());
+ ScreenMenu->setEnabled(!ScreenMenu->isEmpty());
+}
+
+void TrayIcon::TrayActivated(QSystemTrayIcon::ActivationReason reason){
+ switch(reason){
+ case QSystemTrayIcon::Context:
+ this->contextMenu()->popup(this->geometry().center());
+ break;
+ default:
+ ToggleVisibility();
+ }
+}
+
+//Slots for the window visibility
+void TrayIcon::ToggleVisibility(){
+ if(termVisible){ QTimer::singleShot(0, TERM, SLOT(HideWindow())); }
+ else{ QTimer::singleShot(0, TERM, SLOT(ShowWindow())); }
+}
+
+void TrayIcon::TermHidden(){
+ termVisible = false;
+}
+
+void TrayIcon::TermVisible(){
+ termVisible = true;
+}
diff --git a/src-qt5/experimental/lumina-terminal/TrayIcon.h b/src-qt5/experimental/lumina-terminal/TrayIcon.h
new file mode 100644
index 00000000..961aaa90
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TrayIcon.h
@@ -0,0 +1,59 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_UTILITIES_TERMINAL_TRAY_ICON_H
+#define _LUMINA_DESKTOP_UTILITIES_TERMINAL_TRAY_ICON_H
+// QT Includes
+#include <QApplication>
+#include <QSystemTrayIcon>
+#include <QMenu>
+#include <QTimer>
+#include <QSettings>
+
+#include <LuminaXDG.h>
+
+#include "TermWindow.h"
+
+class TrayIcon : public QSystemTrayIcon {
+ Q_OBJECT
+
+public:
+ TrayIcon();
+ ~TrayIcon();
+
+ //First run
+ void parseInputs(QStringList); //Note that this is only run on the primary process - otherwise it gets sent to the singleInstance slot below
+
+public slots:
+ void slotSingleInstance(QStringList inputs = QStringList());
+ void updateIcons();
+
+private:
+ bool termVisible;
+ TermWindow *TERM;
+ QMenu *ScreenMenu;
+ QStringList adjustInputs(QStringList);
+ QSettings *settings;
+private slots:
+ //Action Buttons
+ void startCleanup();
+ void stopApplication();
+ void ChangeTopBottom(bool ontop);
+ void ChangeScreen(QAction*);
+
+ //Tray Updates
+ void setupContextMenu();
+ void updateScreenMenu();
+ void TrayActivated(QSystemTrayIcon::ActivationReason);
+
+ //Slots for the window visibility
+ void ToggleVisibility();
+ void TermHidden();
+ void TermVisible();
+
+};
+
+#endif
diff --git a/src-qt5/experimental/lumina-terminal/TtyProcess.cpp b/src-qt5/experimental/lumina-terminal/TtyProcess.cpp
new file mode 100644
index 00000000..b6ef8f6d
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TtyProcess.cpp
@@ -0,0 +1,381 @@
+#include "TtyProcess.h"
+
+#include <QDir>
+#include <QProcessEnvironment>
+#include <QTimer>
+
+#define DEBUG 1
+
+TTYProcess::TTYProcess(QObject *parent) : QObject(parent){
+ childProc = 0;
+ sn = 0;
+ ttyfd = 0;
+ starting = true;
+ fixReply = -1;
+}
+
+TTYProcess::~TTYProcess(){
+ closeTTY(); //make sure everything is closed properly
+}
+
+// === PUBLIC ===
+bool TTYProcess::startTTY(QString prog, QStringList args, QString workdir){
+ if(workdir=="~"){ workdir = QDir::homePath(); }
+ QDir::setCurrent(workdir);
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ setenv("TERM","vt220-color",1);//"vt102-color",1); //vt100: VT100 emulation support (QTerminal sets "xterm" here)
+
+ //setenv("TERMINFO","/etc/termcap",0);
+ unsetenv("WINDOWID");
+ //unsetenv("TERMCAP");
+ //setenv("TERMCAP","/etc/termcap",1);
+ //setenv("TERMCAP","vt220-color",1);
+ //setenv("TERMCAP","vt102|vt220-color|dec vt102:' :do=^J:co#80:li#24:cl=50\E[;H\E[2J: :le=^H:bs:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A: :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m: :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:is=\E[1;24r\E[24;1H: :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:ks=\E[?1h\E=:ke=\E[?1l\E>: :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H: :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=5\EM:vt#3: :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:vs=\E[?7l:ve=\E[?7h: :mi:al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4l:im=\E[4h:' vi $*",1);
+ /*setenv("TERMCAP","'vt220-color' :do=2\E[B:co#80:li#24:cl=50\E[H\E[J:sf=2*\ED:\
+ :le=^H:bs:am:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\
+ :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
+ :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:\
+ :is=\E>\E[?1;3;4;5l\E[?7;8h\E[1;24r\E[24;1H:\
+ :if=/usr/share/tabset/vt100:nw=2\EE:ho=\E[H:\
+ :as=2\E(0:ae=2\E(B:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||:\
+ :rs=\E>\E[?1;3;4;5l\E[?7;8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\
+ :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=\177:\
+ :k0=\EOy:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:\
+ :k6=\EOu:k7=\EOv:k8=\EOl:k9=\EOw:k;=\EOx:@8=\EOM:\
+ :K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:pt:sr=2*\EM:xn:\
+ :sc=2\E7:rc=2\E8:cs=5\E[%i%d;%dr:UP=2\E[%dA:DO=2\E[%dB:RI=2\E[%dC:\
+ :LE=2\E[%dD:ct=2\E[3g:st=2\EH:ta=^I:ms:bl=^G:cr=^M:eo:it#8:\
+ :RA=\E[?7l:SA=\E[?7h:po=\E[5i:pf=\E[4i:",1); //see /etc/termcap as well */
+ QStringList filter = env.keys().filter("XTERM");
+ for(int i=0; i<filter.length(); i++){ unsetenv(filter[i].toLocal8Bit().data()); }
+ //if(env.contains("TERM")){ unsetenv("TERM"); }
+ //else if(env.contains
+ //Turn the program/arguments into C-compatible arrays
+ char cprog[prog.length()]; strcpy(cprog, prog.toLocal8Bit().data());
+ char *cargs[args.length()+2];
+ QByteArray nullarray;
+ for(int i=0; i<args.length()+2; i++){
+ // First arg needs to be the program
+ if ( i == 0 ) {
+ cargs[i] = new char[ prog.toLocal8Bit().size()+1];
+ strcpy( cargs[i], prog.toLocal8Bit().data() );
+ } else if(i<args.length()){
+ cargs[i] = new char[ args[i].toLocal8Bit().size()+1];
+ strcpy( cargs[i], args[i].toLocal8Bit().data() );
+ }else{
+ cargs[i] = NULL;
+ }
+ }
+ if(DEBUG){ qDebug() << "PTY Start:" << prog; }
+ //Launch the process attached to a new PTY
+ int FD = 0;
+ pid_t tmp = LaunchProcess(FD, cprog, cargs);
+ if(DEBUG){
+ qDebug() << " - PID:" << tmp;
+ qDebug() << " - FD:" << FD;
+ }
+ if(tmp<0){ return false; } //error
+ else{
+ childProc = tmp;
+ //Load the file for close notifications
+ //TO-DO
+ //Watch the socket for activity
+ sn= new QSocketNotifier(FD, QSocketNotifier::Read);
+ sn->setEnabled(true);
+ connect(sn, SIGNAL(activated(int)), this, SLOT(checkStatus(int)) );
+ ttyfd = FD;
+ if(DEBUG){ qDebug() << " - PTY:" << ptsname(FD); }
+ starting = true;
+ return true;
+ }
+}
+
+void TTYProcess::closeTTY(){
+ int junk;
+ if(0==waitpid(childProc, &junk, WNOHANG)){
+ kill(childProc, SIGKILL);
+ }
+ if(ttyfd!=0 && sn!=0){
+ sn->setEnabled(false);
+ ::close(ttyfd);
+ ttyfd = 0;
+ emit processClosed();
+ }
+}
+
+void TTYProcess::writeTTY(QByteArray output){
+ //qDebug() << "Write:" << output;
+ static QList<QByteArray> knownFixes;
+ if(knownFixes.isEmpty()){ knownFixes << "\x1b[C" << "\x1b[D" << "\b" << "\x7F" << "\x08"; }//<<"\x1b[H"<<"\x1b[F"; }
+ fixReply = knownFixes.indexOf(output);
+ ::write(ttyfd, output.data(), output.size());
+}
+
+QByteArray TTYProcess::readTTY(){
+ QByteArray BA;
+ //qDebug() << "Read TTY";
+ if(sn==0){ return BA; } //not setup yet
+ char buffer[64];
+ ssize_t rtot = read(sn->socket(),&buffer,64);
+ //buffer[rtot]='\0';
+ BA = QByteArray(buffer, rtot);
+ //qDebug() << " - Got Data:" << BA;
+ if(!fragBA.isEmpty()){
+ //Have a leftover fragment, include this too
+ BA = BA.prepend(fragBA);
+ fragBA.clear();
+ }
+ bool bad = true;
+ BA = CleanANSI(BA, bad);
+ if(bad){
+ //incomplete fragent - read some more first
+ fragBA = BA;
+ return readTTY();
+ }else{
+ if(DEBUG){ qDebug() << "Read Data:" << BA; }
+ //BUG BYPASS - 12/7/16
+ //If the PTY gets input fairly soon after starting, the PTY will re-print the initial line(s)
+ if(starting && !BA.contains("\n") ){
+ //qDebug() << "Starting phase 1:" << BA;
+ writeTTY("tset\n"); //Terminal Setup utility (uses the TERM env variable)
+ BA.clear();
+ }else if(starting){
+ //qDebug() << "Starting phase 2:" << BA;
+ BA.remove(0, BA.indexOf("\n")+1);
+ starting = false;
+ }
+ //Apply known fixes for replies to particular inputs (mostly related to cursor position *within* the current line)
+ // This appears to be primarily from the concept that the cursor position is always at the end of the line (old VT limitation?)
+ // so almost all these fixes are for cursor positioning within the current line
+ if(fixReply >= 0){
+ if(DEBUG){ qDebug() << "Fix Reply:" <<fixReply << BA; }
+ switch(fixReply){
+ case 0: //Right arrow ("\x1b[C") - PTY reply re-prints the next character rather than moving the cursor
+ if(BA.length()>0){
+ BA.remove(0,1);
+ BA.prepend("\x1b[C"); //just move the cursor - don't re-print that 1 character
+ }
+ break;
+ case 1: //Left arrow ("\x1b[D") - PTY erases the previous character instead of moving the cursor
+ if(BA.startsWith("\b")){
+ BA.remove(0,1);
+ BA.prepend("\x1b[D"); //just move the cursor - don't send the "back" character (\b)
+ }
+ break;
+ case 2: //Backspace or delete - PTY works fine if on the end of the line, but when in the middle of a line it will backpace a number of times after clearing (same as left arrow issue)
+ case 3:
+ case 4:
+ if(BA.contains("\x1b[K")){
+ while(BA.indexOf("\x1b[K") < BA.lastIndexOf("\b") ){
+ BA.replace( BA.lastIndexOf("\b"), 1, "\x1b[D"); //just move the cursor left - don't send the "back" character (\b)
+ }
+ }
+ break;
+ case 5: //Home Key
+ BA = "\x1b[H";
+ break;
+ case 6: //End Key
+ BA = "\x1b[F";
+ break;
+ }
+ fixReply = -1; //done with the fix - resume normal operations
+ if(DEBUG){ qDebug() << " - Fixed:" << BA; }
+ }
+ return BA;
+ }
+}
+
+void TTYProcess::setTerminalSize(QSize chars, QSize pixels){
+ if(ttyfd==0){ return; }
+ struct winsize c_sz;
+ c_sz.ws_row = chars.height();
+ c_sz.ws_col = chars.width();
+ c_sz.ws_xpixel = pixels.width();
+ c_sz.ws_ypixel = pixels.height();
+ if( ioctl(ttyfd, TIOCSWINSZ, &ws) ){
+ qDebug() << "Error settings terminal size";
+ }else{
+ //qDebug() <<"Set Terminal Size:" << pixels << chars;
+ }
+}
+
+bool TTYProcess::isOpen(){
+ return (ttyfd!=0);
+}
+
+QByteArray TTYProcess::CleanANSI(QByteArray raw, bool &incomplete){
+ incomplete = true;
+ //qDebug() << "Clean ANSI Data:" << raw;
+ //IN_LINE TERMINAL COLOR CODES (ANSI Escape Codes) "\x1B[<colorcode>m"
+ // - Just remove them for now
+
+ //Special XTERM encoding (legacy support)
+ int index = raw.indexOf("\x1B]");
+ while(index>=0){
+ //The end character of this sequence is the Bell command ("\x07")
+ int end = raw.indexOf("\x07");
+ if(end<0){ return raw; } //incomplete raw array
+ raw = raw.remove(index, end-index+1);
+ index = raw.indexOf("\x1B]");
+ }
+
+ // GENERIC ANSI CODES ((Make sure the output is not cut off in the middle of a code)
+ index = raw.indexOf("\x1B");
+ while(index>=0){
+ //CURSOR MOVEMENT
+ int end = 0;
+ for(int i=1; i<raw.size() && end==0; i++){
+ if(raw.size() < index+i){ return raw; }//cut off - go back for more data
+ //qDebug() << "Check Char:" << raw.at(index+i);
+ if( QChar(raw.at(index+i)).isLetter() ){
+ end = i; //found the end of the control code
+ }
+ }
+ index = raw.indexOf("\x1B",index+1); //now find the next one
+ }
+
+ // SYSTEM BELL
+ index = raw.indexOf("\x07");
+ while(index>=0){
+ //qDebug() << "Remove Bell:" << index;
+ raw = raw.remove(index,1);
+ index = raw.indexOf("\x07");
+ }
+ //VT220(?) print character code (cut out the code, leave the character)
+ index=raw.indexOf("\x1b[@");
+ while(index>=0){
+ raw = raw.remove(index,3);
+ index = raw.indexOf("\x1b[@");
+ }
+
+ //VT102 Identify request
+ index = raw.indexOf("\x1b[Z");
+ while(index>=0){
+ raw = raw.remove(index,3);
+ index = raw.indexOf("\x1b[Z");
+ //Also send the proper reply to this identify request right away
+ writeTTY("\x1b[/Z");
+ }
+ //Terminal Status request
+ index = raw.indexOf("\x1b[5n");
+ while(index>=0){
+ raw = raw.remove(index,4);
+ index = raw.indexOf("\x1b[5n");
+ //Also send the proper reply to this identify request right away
+ writeTTY("\x1b[c"); //everything ok
+ }
+ //Terminal Identify request
+ index = raw.indexOf("\x1b[c");
+ while(index>=0){
+ raw = raw.remove(index,3);
+ index = raw.indexOf("\x1b[c");
+ //Also send the proper reply to this identify request right away
+ writeTTY("\x1b[1c"); //VT220 reply code
+ }
+ //Terminal Identify request (xterm/termcap?)
+ /*index = raw.indexOf("\x1b[P");
+ while(index>=0){
+ raw = raw.remove(index,3);
+ index = raw.indexOf("\x1b[P");
+ //Also send the proper reply to this identify request right away
+ qDebug() << " - Got XTERM/TERMCAP identify request ([P)";
+ writeTTY("\x1b[/Z");
+ }*/
+
+ incomplete = false;
+ return raw;
+}
+
+// === PRIVATE ===
+pid_t TTYProcess::LaunchProcess(int& fd, char *prog, char **child_args){
+ //Returns: -1 for errors, positive value (file descriptor) for the master side of the TTY to watch
+ //First open/setup a new pseudo-terminal file/device on the system (master side)
+ //fd = posix_openpt(O_RDWR | O_NOCTTY); //open read/write
+ pid_t PID = forkpty( &fd, 0, 0, 0);
+ if(PID==0){
+ //Child process
+ int rc = execvp(prog, child_args);
+ //::close(fds); //no need to keep original file descriptor open any more
+ exit(rc);
+ }else{
+ //Master process
+ return PID;
+ }
+ /*if(fd<0){ return -1; } //could not create pseudo-terminal
+ int rc = grantpt(fd); //set permissions
+ if(rc!=0){ return -1; }
+ rc = unlockpt(fd); //unlock file (ready for use)
+ //rc = fchown(fd, getuid(), getgid());
+ setupTtyFd(fd);
+ if(rc!=0){ return -1; }
+ //Now fork, return the Master device and setup the child
+ pid_t PID = fork();
+ if(PID==0){
+ //SLAVE/child
+ int fds = ::open(ptsname(fd), O_RDWR | O_NOCTTY); //open slave side read/write
+ rc = fchown(fds, getuid(), getgid());
+ ::close(fd); //close the master side from the slave thread
+
+ //Adjust the slave side mode to SANE
+ setupTtyFd(fds);
+ //Change the controlling terminal in child thread to the slave PTY
+ ::close(0); //close current terminal standard input
+ ::close(1); //close current terminal standard output
+ ::close(2); //close current terminal standard error
+ dup(fds); // Set slave PTY as standard input (0);
+ dup(fds); // Set slave PTY as standard output (1);
+ dup(fds); // Set slave PTY as standard error (2);
+
+ setsid(); //Make current process new session leader (so we can set controlling terminal)
+ ioctl(0,TIOCSCTTY, 1); //Set the controlling terminal to the slave PTY
+
+ //Execute the designated program
+ //rc = execvp("tset", NULL);
+ rc = execvp(prog, child_args);
+ ::close(fds); //no need to keep original file descriptor open any more
+ exit(rc);
+ }*/
+ //MASTER thread (or error)
+ return PID;
+}
+
+void TTYProcess::setupTtyFd(int fd){
+ struct termios TSET;
+ tcgetattr(fd, &TSET); //read the current settings
+ cfmakesane(&TSET); //set the SANE mode on the settings ( RAW: cfmakeraw(&TSET); )
+ //Set Input Modes
+ //TSET.c_iflag |= IGNPAR; //ignore parity errors
+ //TSET.c_iflag &= ~(IGNBRK | PARMRK | ISTRIP | ICRNL | IXON | IXANY | IXOFF); //ignore special characters
+ //TSET.c_iflag &= IUTF8; //enable UTF-8 support
+ //Set Local Modes
+ //TSET.c_lflag &= (ECHO | ECHONL | ECHOKE); //Echo inputs (normal, newline, and KILL character line break)
+ //TSET.c_lflag &= ~ICANON ; //non-canonical mode (individual inputs - not a line-at-a-time)
+ //Set Control Modes
+ //TSET.c_cflag |= CLOCAL; //Local Terminal Connection (non-modem)
+ //TSET.c_lflag &= ~IEXTEN;
+ //TSET.c_cflag &= ~(CSIZE | PARENB);
+ //TSET.c_cflag |= CS8;
+ //tt.c_oflag &= ~OPOST; // disable special output processing
+ //Set Output Modes
+ //TSET.c_oflag |= OPOST;
+ //TSET.c_oflag |= OXTABS;
+ TSET.c_cc[VTIME] = 0; // timeout
+ //Now apply the settings
+ tcsetattr(fd, TCSANOW, &TSET); //apply the changed settings
+}
+
+// === PRIVATE SLOTS ===
+void TTYProcess::checkStatus(int sock){
+ //This is run when the socket gets activated
+ if(sock!=ttyfd){
+
+ }
+ //Make sure the child PID is still active
+ int junk;
+ if(0!=waitpid(childProc, &junk, WNOHANG)){
+ this->closeTTY(); //clean up everything else
+ }else{
+ emit readyRead();
+ }
+}
diff --git a/src-qt5/experimental/lumina-terminal/TtyProcess.h b/src-qt5/experimental/lumina-terminal/TtyProcess.h
new file mode 100644
index 00000000..42684112
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/TtyProcess.h
@@ -0,0 +1,87 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is basically a replacement for QProcess, where all process/terminal outputs
+// are redirected and not just the standard input/output channels. This allows it
+// to be used for terminal-like apps (shells) which directly modify the terminal output
+// rather than stick to input/output channels for communication.
+//===========================================
+// IMPLEMENTATION NOTE
+//======================
+// The process requires/uses ANSI control codes (\x1B[<something>) for special operations
+// such as moving the cursor, erasing characters, etc..
+// It is recommended that you pair this class with the graphical "TerminalWidget.h" class
+// or some other ANSI-compatible display widget.
+//===========================================
+#ifndef _LUMINA_DESKTOP_UTILITIES_TERMINAL_TTY_PROCESS_WIDGET_H
+#define _LUMINA_DESKTOP_UTILITIES_TERMINAL_TTY_PROCESS_WIDGET_H
+
+#include <QDebug>
+#include <QSocketNotifier>
+#include <QKeyEvent>
+
+//Standard C library functions for PTY access/setup
+#include <stdlib.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <libutil.h>
+
+class TTYProcess : public QObject{
+ Q_OBJECT
+public:
+ TTYProcess(QObject *parent = 0);
+ ~TTYProcess();
+
+ bool startTTY(QString prog, QStringList args = QStringList(), QString workdir = "~");
+ void closeTTY();
+
+ //Primary read/write functions
+ void writeTTY(QByteArray output);
+ QByteArray readTTY();
+
+ //Setup the terminal size (characters and pixels)
+ void setTerminalSize(QSize chars, QSize pixels);
+
+ //Status update checks
+ bool isOpen();
+
+ //Functions for handling ANSI escape codes (typically not used by hand)
+ QByteArray CleanANSI(QByteArray, bool &incomplete);
+
+private:
+ pid_t childProc;
+ int ttyfd;
+ QSocketNotifier *sn;
+ QByteArray fragBA; //fragment ByteArray
+ bool starting;
+ int fixReply; //flag for detecting particular inputs and "fixing" the reply to it as needed
+
+ //====================================
+ // C Library function for setting up the PTY
+ // Inputs:
+ // int &fd: (output) file descriptor for the master PTY (positive integer if valid)
+ // char *prog: program to run
+ // char **args: program arguments
+ // Returns:
+ // -1 for errors, child process PID (positive integer) if successful
+ //====================================
+ pid_t LaunchProcess(int& fd, char *prog, char **child_args);
+ void setupTtyFd(pid_t fd);
+
+private slots:
+ void checkStatus(int);
+
+signals:
+ void readyRead();
+ void processClosed();
+};
+
+#endif
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_af.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_af.ts
new file mode 100644
index 00000000..3b15b029
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_af.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="af_ZA">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ar.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ar.ts
new file mode 100644
index 00000000..1ecc3145
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ar.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ar_EG">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_az.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_az.ts
new file mode 100644
index 00000000..ab5b56bc
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_az.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="az_AZ">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bg.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bg.ts
new file mode 100644
index 00000000..cde31900
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bg.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bg_BG">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bn.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bn.ts
new file mode 100644
index 00000000..9097c03d
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bn.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bn_BD">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bs.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bs.ts
new file mode 100644
index 00000000..af47e3ba
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_bs.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bs_BA">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ca.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ca.ts
new file mode 100644
index 00000000..c99bbf27
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ca.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ca_ES">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Copia la selecció</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Enganxa</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Activa el terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>A dalt de tot de la pantalla</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Tanca el terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Desplaça al monitor</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Monitor %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_cs.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_cs.ts
new file mode 100644
index 00000000..2ad36a83
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_cs.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="cs_CZ">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Kopírovat výběr</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Vložit</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Spustit terminál</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Nahoře na obrazovce</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Zavřít terminál</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Přesunout na obrazovku</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Obrazovka %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_cy.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_cy.ts
new file mode 100644
index 00000000..a06a1461
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_cy.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="cy_GB">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_da.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_da.ts
new file mode 100644
index 00000000..18990a04
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_da.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="da">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Kopiér valgte</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Indsæt</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Udløs terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Øverst på skærmen</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Luk terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Flyt til skærm</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Skærm %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_de.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_de.ts
new file mode 100644
index 00000000..041be5a7
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_de.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="de_DE">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Auswahl kopieren</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Einfügen</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Oben am Bildschirm</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Terminal schließen</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Monitor %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_el.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_el.ts
new file mode 100644
index 00000000..2efd8fe8
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_el.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="el_GR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Αντιγραφή Επιλογής</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Επικόλληση</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Εμφάνιση/Απόκρυψη Γραμμής Εντολών</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Επάνω Μέρος της Οθόνης</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Κλείσιμο Γραμμής Εντολών</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Μετακίνηση στην Οθόνη</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Οθόνη %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_GB.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_GB.ts
new file mode 100644
index 00000000..99b84253
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_GB.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_GB">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_ZA.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_ZA.ts
new file mode 100644
index 00000000..4b623bf9
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_en_ZA.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_ZA">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_es.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_es.ts
new file mode 100644
index 00000000..aa46327c
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_es.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es_ES">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_et.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_et.ts
new file mode 100644
index 00000000..b728da20
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_et.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="et_EE">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_eu.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_eu.ts
new file mode 100644
index 00000000..8ce0109f
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_eu.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="eu_ES">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fa.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fa.ts
new file mode 100644
index 00000000..9699380f
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fa.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fa_IR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fi.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fi.ts
new file mode 100644
index 00000000..e2267e94
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fi.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fi_FI">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr.ts
new file mode 100644
index 00000000..5e2fab13
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr_CA.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr_CA.ts
new file mode 100644
index 00000000..5854840a
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_fr_CA.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_CA">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_gl.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_gl.ts
new file mode 100644
index 00000000..559b5579
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_gl.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="gl_ES">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_he.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_he.ts
new file mode 100644
index 00000000..0ffdc091
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_he.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="he_IL">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hi.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hi.ts
new file mode 100644
index 00000000..2a702315
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hi.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hi_IN">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hr.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hr.ts
new file mode 100644
index 00000000..4ce13144
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hr.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hr_HR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hu.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hu.ts
new file mode 100644
index 00000000..5fba3d17
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_hu.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hu_HU">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Kijelöltés másolása</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Beillesztés</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Terminál Kiszögezése</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Képernyő tetejére</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Terminál bezárása</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Monitorra mozgatás</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>%1. montior</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_id.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_id.ts
new file mode 100644
index 00000000..4eb7642d
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_id.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="id_ID">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_is.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_is.ts
new file mode 100644
index 00000000..6fe84485
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_is.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="is_IS">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_it.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_it.ts
new file mode 100644
index 00000000..2c88a58c
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_it.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="it_IT">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Copia selezione</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Incolla</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Azione eseguita da terminale</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Alto dello schermo</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Chiudi terminale</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Spostarsi sullo schermo</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Schermo %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ja.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ja.ts
new file mode 100644
index 00000000..81b6ca9e
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ja.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ja_JP">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>選択された範囲をコピー</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>貼り付け</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>画面の最上部に表示</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>端末を閉じる</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>選択したモニターへ移動</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>モニター %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ka.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ka.ts
new file mode 100644
index 00000000..55fb9b6c
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ka.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ka_GE">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ko.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ko.ts
new file mode 100644
index 00000000..0c6e3f07
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ko.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ko_KR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_lt.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_lt.ts
new file mode 100644
index 00000000..c0acd806
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_lt.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="lt_LT">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Kopijuoti žymėjimą</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Įdėti</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Perjungti terminalą</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Ekrano viršuje</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Užverti terminalą</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Perkelti į monitorių</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Monitorius %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_lv.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_lv.ts
new file mode 100644
index 00000000..539cc1ad
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_lv.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="lv_LV">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mk.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mk.ts
new file mode 100644
index 00000000..47e0efd6
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mk.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="mk_MK">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mn.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mn.ts
new file mode 100644
index 00000000..d31a4617
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mn.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="mn_MN">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ms.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ms.ts
new file mode 100644
index 00000000..06408c44
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ms.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ms_MY">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mt.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mt.ts
new file mode 100644
index 00000000..b18f7eb5
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_mt.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="mt_MT">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_nb.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_nb.ts
new file mode 100644
index 00000000..300214c3
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_nb.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nb_NO">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_nl.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_nl.ts
new file mode 100644
index 00000000..5e9c63dd
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_nl.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nl_NL">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pa.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pa.ts
new file mode 100644
index 00000000..2f478abb
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pa.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pa_IN">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pl.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pl.ts
new file mode 100644
index 00000000..52453174
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pl.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pl_PL">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Kopiuj</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Wklej</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Uruchom terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Górna krawędź ekranu</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Zamknij terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Przenieś na monitor</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Monitor %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt.ts
new file mode 100644
index 00000000..26e200d4
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pt_BR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt_BR.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt_BR.ts
new file mode 100644
index 00000000..1f3f6996
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_pt_BR.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pt_BR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Copiar seleção</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Colar</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Gatilhar Terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Topo da tela</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Fechar Terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Mover para o Monitor</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Monitor %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ro.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ro.ts
new file mode 100644
index 00000000..9f6811a6
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ro.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ro_RO">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ru.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ru.ts
new file mode 100644
index 00000000..8e298489
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ru.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ru_RU">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Копировать выбранное</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Вставить</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation>Запуск терминала</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation>Всегда наверху</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Закрыть терминал</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Переместить на экран</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Экран: %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sk.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sk.ts
new file mode 100644
index 00000000..bd12e022
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sk.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sk_SK">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sl.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sl.ts
new file mode 100644
index 00000000..c7b29746
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sl.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sl_SI">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sr.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sr.ts
new file mode 100644
index 00000000..db230f12
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sr.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sr_RS">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sv.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sv.ts
new file mode 100644
index 00000000..5f6ea3bd
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sv.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sv_SE">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation>Kopiera markering</translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation>Klistra in</translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation>Stäng terminal</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation>Flytta till skärm</translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation>Skärm %1</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sw.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sw.ts
new file mode 100644
index 00000000..7aa406a3
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_sw.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sw_TZ">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ta.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ta.ts
new file mode 100644
index 00000000..e6da4e4a
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_ta.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ta_IN">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_tg.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_tg.ts
new file mode 100644
index 00000000..16976b60
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_tg.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="tg_TJ">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_th.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_th.ts
new file mode 100644
index 00000000..35b1b00b
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_th.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="th_TH">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_tr.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_tr.ts
new file mode 100644
index 00000000..8311f8a0
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_tr.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="tr_TR">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_uk.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_uk.ts
new file mode 100644
index 00000000..e4bf575d
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_uk.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="uk_UA">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_uz.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_uz.ts
new file mode 100644
index 00000000..ed0d17de
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_uz.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="uz_UZ">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_vi.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_vi.ts
new file mode 100644
index 00000000..2f5d2d9c
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_vi.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="vi_VN">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_CN.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_CN.ts
new file mode 100644
index 00000000..c899062c
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_CN.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_CN">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_HK.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_HK.ts
new file mode 100644
index 00000000..a809bad6
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_HK.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_HK">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_TW.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_TW.ts
new file mode 100644
index 00000000..7d136d08
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zh_TW.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_TW">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zu.ts b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zu.ts
new file mode 100644
index 00000000..1e330c7d
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/i18n/l-terminal_zu.ts
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zu_ZA">
+<context>
+ <name>TerminalWidget</name>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="61"/>
+ <source>Copy Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TerminalWidget.cpp" line="62"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrayIcon</name>
+ <message>
+ <location filename="../TrayIcon.cpp" line="123"/>
+ <source>Trigger Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="125"/>
+ <source>Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="130"/>
+ <source>Close Terminal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="139"/>
+ <source>Move To Monitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../TrayIcon.cpp" line="142"/>
+ <source>Monitor %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/experimental/lumina-terminal/lumina-terminal.desktop b/src-qt5/experimental/lumina-terminal/lumina-terminal.desktop
new file mode 100644
index 00000000..7d11a19d
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/lumina-terminal.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Exec=lumina-terminal %F
+Icon=utilities-terminal
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=Utility;
+Name=Lumina Terminal
+Comment=Dropdown
diff --git a/src-qt5/experimental/lumina-terminal/lumina-terminal.pro b/src-qt5/experimental/lumina-terminal/lumina-terminal.pro
new file mode 100644
index 00000000..5216372c
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/lumina-terminal.pro
@@ -0,0 +1,102 @@
+include("$${PWD}/../../OS-detect.pri")
+
+QT += core gui widgets network
+
+TARGET = lumina-terminal
+target.path = $${L_BINDIR}
+
+#include all the special classes from the Lumina tree
+include(../../core/libLumina/LUtils.pri) #includes LUtils
+include(../../core/libLumina/LuminaXDG.pri)
+include(../../core/libLumina/LuminaSingleApplication.pri)
+include(../../core/libLumina/LuminaThemes.pri)
+
+HEADERS += TrayIcon.h \
+ TermWindow.h \
+ TerminalWidget.h \
+ TtyProcess.h
+
+SOURCES += main.cpp \
+ TrayIcon.cpp \
+ TermWindow.cpp \
+ TerminalWidget.cpp \
+ TtyProcess.cpp
+
+
+LIBS += -lutil
+
+
+TRANSLATIONS = i18n/l-terminal_af.ts \
+ i18n/l-terminal_ar.ts \
+ i18n/l-terminal_az.ts \
+ i18n/l-terminal_bg.ts \
+ i18n/l-terminal_bn.ts \
+ i18n/l-terminal_bs.ts \
+ i18n/l-terminal_ca.ts \
+ i18n/l-terminal_cs.ts \
+ i18n/l-terminal_cy.ts \
+ i18n/l-terminal_da.ts \
+ i18n/l-terminal_de.ts \
+ i18n/l-terminal_el.ts \
+ i18n/l-terminal_en_GB.ts \
+ i18n/l-terminal_en_ZA.ts \
+ i18n/l-terminal_es.ts \
+ i18n/l-terminal_et.ts \
+ i18n/l-terminal_eu.ts \
+ i18n/l-terminal_fa.ts \
+ i18n/l-terminal_fi.ts \
+ i18n/l-terminal_fr.ts \
+ i18n/l-terminal_fr_CA.ts \
+ i18n/l-terminal_gl.ts \
+ i18n/l-terminal_he.ts \
+ i18n/l-terminal_hi.ts \
+ i18n/l-terminal_hr.ts \
+ i18n/l-terminal_hu.ts \
+ i18n/l-terminal_id.ts \
+ i18n/l-terminal_is.ts \
+ i18n/l-terminal_it.ts \
+ i18n/l-terminal_ja.ts \
+ i18n/l-terminal_ka.ts \
+ i18n/l-terminal_ko.ts \
+ i18n/l-terminal_lt.ts \
+ i18n/l-terminal_lv.ts \
+ i18n/l-terminal_mk.ts \
+ i18n/l-terminal_mn.ts \
+ i18n/l-terminal_ms.ts \
+ i18n/l-terminal_mt.ts \
+ i18n/l-terminal_nb.ts \
+ i18n/l-terminal_nl.ts \
+ i18n/l-terminal_pa.ts \
+ i18n/l-terminal_pl.ts \
+ i18n/l-terminal_pt.ts \
+ i18n/l-terminal_pt_BR.ts \
+ i18n/l-terminal_ro.ts \
+ i18n/l-terminal_ru.ts \
+ i18n/l-terminal_sk.ts \
+ i18n/l-terminal_sl.ts \
+ i18n/l-terminal_sr.ts \
+ i18n/l-terminal_sv.ts \
+ i18n/l-terminal_sw.ts \
+ i18n/l-terminal_ta.ts \
+ i18n/l-terminal_tg.ts \
+ i18n/l-terminal_th.ts \
+ i18n/l-terminal_tr.ts \
+ i18n/l-terminal_uk.ts \
+ i18n/l-terminal_uz.ts \
+ i18n/l-terminal_vi.ts \
+ i18n/l-terminal_zh_CN.ts \
+ i18n/l-terminal_zh_HK.ts \
+ i18n/l-terminal_zh_TW.ts \
+ i18n/l-terminal_zu.ts
+
+dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/
+dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/
+
+desktop.files=lumina-terminal.desktop
+desktop.path=$${L_SHAREDIR}/applications/
+
+INSTALLS += target desktop
+
+WITH_I18N{
+ INSTALLS += dotrans
+}
diff --git a/src-qt5/experimental/lumina-terminal/main.cpp b/src-qt5/experimental/lumina-terminal/main.cpp
new file mode 100644
index 00000000..a316ff35
--- /dev/null
+++ b/src-qt5/experimental/lumina-terminal/main.cpp
@@ -0,0 +1,47 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include <QSystemTrayIcon>
+#include <QDebug>
+
+#include <LuminaSingleApplication.h>
+#include <LuminaThemes.h>
+
+#include <unistd.h>
+
+#include "TrayIcon.h"
+int main(int argc, char *argv[]) {
+ LTHEME::LoadCustomEnvSettings();
+ LSingleApplication a(argc, argv, "lumina-terminal");
+ if( !a.isPrimaryProcess() ){ return 0; } //poked the current process instead
+
+ //First make sure a system tray is available
+ qDebug() << "Checking for system tray";
+ bool ready = false;
+ for(int i=0; i<60 && !ready; i++){
+ ready = QSystemTrayIcon::isSystemTrayAvailable();
+ if(!ready){
+ //Pause for 5 seconds
+ sleep(5); //don't worry about stopping event handling - nothing really running yet
+ }
+ }
+ if(!ready){
+ qDebug() << "Could not find any available system tray after 5 minutes: exiting....";
+ return 1;
+ }
+
+ //Now go ahead and setup the app
+ //LuminaThemeEngine theme(&a);
+ QApplication::setQuitOnLastWindowClosed(false);
+
+ //Now start the tray icon
+ TrayIcon tray;
+ QObject::connect(&a, SIGNAL(InputsAvailable(QStringList)), &tray, SLOT(slotSingleInstance(QStringList)) );
+ //QObject::connect(&theme, SIGNAL(updateIcons()), &tray, SLOT(updateIcons()) );
+ tray.parseInputs(a.inputlist);
+ tray.show();
+ return a.exec();
+}
bgstack15