diff --git a/README.md b/README.md index e751f0c..fcc1540 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,28 @@ make sudo make install -# AppImage +# Nautilus script - terminal-here + +This script will open a elokab-Terminal in the current directory. + +Save this script under $HOME/.local/nautilus/scripts/terminal-here. Make sure that + +you give this file executable permission. { chmod +x terminal-here } + + #!/bin/bash + + if [ "$NAUTILUS_SCRIPT_CURRENT_URI" == "x-nautilus-desktop:///" ]; then + DIR=$HOME + else + DIR=`echo $NAUTILUS_SCRIPT_CURRENT_URI | sed 's/^file:\/\///' | sed 's/%20/ /g'` + fi + + elokab-terminal --working-directory "$DIR" + + exit 0 + + +# AppImage v:02 x86_64 diff --git a/elokab-terminal/buttonColor/buttoncolor.cpp b/elokab-terminal/buttonColor/buttoncolor.cpp index 80a18a6..5b4afb0 100755 --- a/elokab-terminal/buttonColor/buttoncolor.cpp +++ b/elokab-terminal/buttonColor/buttoncolor.cpp @@ -30,8 +30,9 @@ ButtonColor::ButtonColor(const QString &text, bool showAlphaChannel, QColor colo tButtonColor->setFocusPolicy(Qt::StrongFocus); tButtonPicker->setAutoRaise(true); tButtonPicker->setIcon(QIcon::fromTheme("color-picker",QIcon(":/icons/color-picker"))); - tButtonColor->setIconSize(QSize(32,16)); - tButtonColor->setMinimumWidth(48); + tButtonPicker->setIconSize(QSize(16,16)); + tButtonColor->setIconSize(QSize(24,16)); + tButtonColor->setMinimumWidth(36); setLayout(layout); layout->addWidget(mLabel); @@ -50,7 +51,7 @@ void ButtonColor::setColor(QColor color) { m_color=color; - QPixmap pix(32,16); + QPixmap pix(26,16); pix.fill(Qt::transparent); QPainter p; @@ -60,7 +61,7 @@ void ButtonColor::setColor(QColor color) p.setPen(this->palette().shadow().color()); p.drawRect(pix.rect()); p.setPen(this->palette().light().color()); - p.drawRect(-1,-1,32,16); + p.drawRect(-1,-1,26,16); // pix.fill(m_color); tButtonColor->setIcon(pix); } diff --git a/elokab-terminal/main.cpp b/elokab-terminal/main.cpp index 48c6c29..49b0886 100755 --- a/elokab-terminal/main.cpp +++ b/elokab-terminal/main.cpp @@ -8,14 +8,19 @@ void helpMe() { + printf("Usage: elokab-terminal [OPTION]\n"); + puts("elokab-terminal v: 0.3 \n" ); puts("OPTION:\n"); - puts(" -h --help Print this help.\n"); - puts(" -w --working-directory Start session with specified work directory.\n"); - puts(" -e, --execute Execute command instead of shel\n"); - puts(" -b, --hide-border FramelessWindow no border\n"); + puts(" -h --help Print this help.\n"); + puts(" -w --working-directory Start session with specified work directory.\n"); + puts(" -e, --execute Execute command instead of shel\n"); + puts(" -b, --hide-border FramelessWindow no border\n"); + puts(" -t, --on-top On top hint\n"); + puts(" -g, --geometry Run in specific dimensions ex: 0,0,800,600 \n"); } + int main(int argc, char *argv[]) { QApplication a(argc, argv); @@ -23,9 +28,9 @@ int main(int argc, char *argv[]) setenv("TERM", "xterm", 1); // TODO/FIXME: why? - a.setApplicationName("elokab-terminal"); + a.setApplicationName("elokab-terminal"); a.setOrganizationName("elokab"); - a.setApplicationVersion("0.1"); + a.setApplicationVersion("0.3"); /// جلب ترجمة البرنامج من مجلد البرنامج @@ -62,35 +67,72 @@ int main(int argc, char *argv[]) QIcon icon=QIcon::fromTheme("terminal",QIcon(":/icons/terminal.png")); a.setWindowIcon(icon); //------------------------------------argument------------------------------------------------- - QString workdir= QDir::currentPath(),command; + QString workdir,command,geometry; bool framless=false; + bool ontop=false; QStringList args = a.arguments(); if(args.count()>1) { + for (int i = 0; i < args.count(); ++i) { + + QString arg = args.at(i); + if (arg == "-h" || arg == "--help" ) {helpMe();return 0; } + + else if (arg == "-w" || arg == "--working-directory" ) { + + if(i+1>args.count()-1){helpMe();return 0;} + QDir dir(args.at(i+1)); + if(dir.exists()) workdir=args.at(i+1); + + } + + else if (arg == "-e" ||arg == "-x" || arg == "--execute"|| arg == "--command" ) { + if(i+1>args.count()-1){helpMe();return 0;} + command=args.at(i+1); + } + + else if (arg == "-b" || arg == "--hide-border" ) {framless=true;} + + else if (arg == "-g" || arg == "--geometry" ) { + if(i+1>args.count()-1){helpMe();return 0;} + geometry=args.at(i+1); + } + else if (arg == "-t" || arg == "--on-top" ) {ontop=true;} - QString arg = args.at(1); - if (arg == "-h" || arg == "--help" ) {helpMe();return 0; } - else if (arg == "-w" || arg == "--working-directory" ) {workdir=args.at(2);} - else if (arg == "-e" ||arg == "-x" || arg == "--execute"|| arg == "--command" ) {command=args.at(2);} - else if (arg == "-b" || arg == "--hide-border" ) {framless=true;} - else { - QDir dir(arg); + + // qWarning() << "echo Unknown option: " << args; helpMe(); return 0; + // command= "echo \"Unknown option: " + arg+"\n"+ help+"\""; + + + } + + if(workdir.isEmpty()) + { + + QDir dir(args.at(1)); if(dir.exists()) - workdir=arg; - else - qWarning() << "echo Unknown option: " << args; helpMe(); return 0; - // command= "echo \"Unknown option: " + arg+"\n"+ help+"\""; - } + workdir=args.at(1); + } + } // qWarning() << "echo Unknown option: " << args; qDebug()< MainWindow::MainWindow(const QString &wDir, const QString &command, - bool framless, + bool framless, + const QString &geometry, + bool ontop, QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow),numTab(0) + ui(new Ui::MainWindow) { this->setAttribute(Qt::WA_TranslucentBackground,true); - - - if(framless) - setWindowFlags( Qt::FramelessWindowHint /*| Qt::WindowStaysOnTopHint*/); - + setAutoFillBackground(true); + ui->setupUi(this); + setupActions(); +//Framless Border + if(framless && ontop) + setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + else if(framless && !ontop) + setWindowFlags( Qt::FramelessWindowHint /*| Qt::WindowStaysOnTopHint*/); + else if(!framless && ontop) + setWindowFlags( /*Qt::FramelessWindowHint |*/ Qt::WindowStaysOnTopHint); + + + //Geometry + QStringList list=geometry.split(","); + if(!geometry.isEmpty()&& list.count()==4){ + int _x=QString(list.at(0)).toInt(); + int _y=QString(list.at(1)).toInt(); + int _w=QString(list.at(2)).toInt(); + int _h=QString(list.at(3)).toInt(); + qDebug()<<"MainWindow Geometry:"<<_x<<_y<<_w<<_h; + setGeometry(_x,_y,_w,_h); + }else{ + QSettings setting; + restoreGeometry(setting.value("Geometry").toByteArray()); + } - setAutoFillBackground(true); - ui->setupUi(this); - setupActions(); - QSettings setting; - restoreGeometry(setting.value("Geometry").toByteArray()); const QClipboard *clipboard = QApplication::clipboard(); connect(clipboard ,SIGNAL(dataChanged()),this,SLOT(clipboardChanged())); @@ -133,26 +150,22 @@ void MainWindow::setupActions() } -void MainWindow::on_actionTest_triggered() -{ - termWidget()->clear(); -termWidget()->zoomIn(); -} + void MainWindow::copySelectedText() { - termWidget()->CopySelection(); + termWidget()->CopySelection(); } void MainWindow::pastText() { const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); + const QMimeData *mimeData = clipboard->mimeData(); - if (mimeData->hasText()) { - QString text =mimeData->text(); - termWidget()->sendText(text); - } + if (mimeData->hasText()) { + QString text =mimeData->text(); + termWidget()->sendText(text); + } } void MainWindow::clipboardChanged() @@ -161,25 +174,25 @@ void MainWindow::clipboardChanged() const QMimeData *mimeData = clipboard->mimeData(); if(mimeData->hasText()){ if(!mimeData->text().isEmpty()) - emit clipboardAvailable(true); + emit clipboardAvailable(true); else emit clipboardAvailable(false); }else{ - emit clipboardAvailable(false); + emit clipboardAvailable(false); } } void MainWindow::customContextMenu(QPoint) { -// QMenu menu; -// menu.addAction(actionCopy); -// menu.addAction(actionPast); + // QMenu menu; + // menu.addAction(actionCopy); + // menu.addAction(actionPast); mMenu->exec(QCursor::pos()); } void MainWindow::addNewTab(const QString &wDir, const QString &command) { - numTab++; + QTermWidget *terminaleWidget=new QTermWidget(0,this); @@ -190,36 +203,46 @@ void MainWindow::addNewTab(const QString &wDir, const QString &command) QSettings setting; QFont f= setting.value("Font",font).value(); - int color=setting.value("ColorSheme",0).toInt(); + // int color=setting.value("ColorSheme",0).toInt(); int spos=setting.value("ScrollBar",0).toInt(); -// QColor fcolor=setting.value("FontColor",QColor(255,255,255)).value(); -// QColor bcolor=setting.value("BackColor",QColor(0,0,0)).value(); -int opacity=setting.value("Opacity",100).toInt(); + // QColor fcolor=setting.value("FontColor",QColor(255,255,255)).value(); + // QColor bcolor=setting.value("BackColor",QColor(0,0,0)).value(); + int opacity=setting.value("Opacity",100).toInt(); QString shell=setting.value("Shell",QString()).toString(); terminaleWidget-> setShellProgram(shell); terminaleWidget->setTerminalFont(f); + //TODO FIXME terminaleWidget->setColorScheme(4); terminaleWidget->setScrollBarPosition(spos); terminaleWidget->setInitialWorkingDirectory(wDir); terminaleWidget->startShellProgram(); -terminaleWidget->setTerminalOpacity(qreal(opacity)/100); + terminaleWidget->setTerminalOpacity(qreal(opacity)/100); if(!command.isEmpty()) { - // terminaleWidget-> setShellProgram(command); - terminaleWidget->getOutputFromCommand(command); + // terminaleWidget-> setShellProgram(command); + terminaleWidget->getOutputFromCommand(command); } terminaleWidget->setContextMenuPolicy(Qt::CustomContextMenu); QIcon icon=QIcon::fromTheme("terminal",QIcon(":/icons/terminal.png")); - ui->tabWidget->addTab(terminaleWidget,icon,tr("Shell ")+QString::number(numTab)); + ui->tabWidget->addTab(terminaleWidget,icon,terminaleWidget->title()); connect(terminaleWidget,SIGNAL(selectionAvailable(bool)),actionCopy,SLOT(setEnabled(bool))); connect(terminaleWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(customContextMenu(QPoint))); + connect(terminaleWidget,SIGNAL(titleChanged(QString)),this,SLOT(changeTitle(QString))); ui->tabWidget->setCurrentWidget(terminaleWidget); -terminaleWidget->setFocus(); + terminaleWidget->setFocus(); +} + +void MainWindow::changeTitle(const QString &txt) +{ + qDebug()<<"titleChanged"<tabWidget->currentIndex(); + ui->tabWidget->setTabText(index,termWidget()->title()); } QTermWidget *MainWindow::termWidget() @@ -234,37 +257,39 @@ QTermWidget *MainWindow::termWidget() void MainWindow::closeTab(int index) { QTermWidget *w= qobject_cast( ui->tabWidget->widget(index)); -// if (w->sessionIsruning()){ -// QMessageBox msgBox; -// msgBox.setText("The document has been modified."); -// msgBox.setInformativeText("Do you want to save your changes?"); -// msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); -// msgBox.setDefaultButton(QMessageBox::No); -// int ret = msgBox.exec(); -// if(ret==QMessageBox::No) -// return; - -// } - w->close(); - delete w; + // if (w->sessionIsruning()){ + // QMessageBox msgBox; + // msgBox.setText("The document has been modified."); + // msgBox.setInformativeText("Do you want to save your changes?"); + // msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + // msgBox.setDefaultButton(QMessageBox::No); + // int ret = msgBox.exec(); + // if(ret==QMessageBox::No) + // return; + + // } + w->close(); + delete w; } -void MainWindow::tabChanged(int /*index*/) +void MainWindow::tabChanged(int index) { - ui->tabWidget->setTabsClosable(ui->tabWidget->count()-1); + ui->tabWidget->setTabsClosable(ui->tabWidget->count()-1); + setWindowTitle(termWidget()->title()); + ui->tabWidget->setTabText(index,termWidget()->title()); } void MainWindow::zoomIn() { for (int i = 0; i < ui->tabWidget->count(); ++i) - { + { QTermWidget *termWidget= qobject_cast(ui->tabWidget->widget(i)); - if(termWidget) - { - termWidget->zoomIn(); - } + if(termWidget) + { + termWidget->zoomIn(); + } } } @@ -272,14 +297,14 @@ void MainWindow::zoomIn() void MainWindow::zoomOut() { for (int i = 0; i < ui->tabWidget->count(); ++i) - { + { QTermWidget *termWidget= qobject_cast(ui->tabWidget->widget(i)); - if(termWidget) - { - termWidget->zoomOut(); - } + if(termWidget) + { + termWidget->zoomOut(); + } } } @@ -292,25 +317,25 @@ void MainWindow::settingShow() QFont font=dlg->getFont(); int colorIndex=dlg->getColorSheme(); int spos=dlg->getScrollBar(); -// QColor bColor=dlg->getBcolor(); -// QColor fColor=dlg->getFcolor(); + // QColor bColor=dlg->getBcolor(); + // QColor fColor=dlg->getFcolor(); int opacity=dlg->getOpacity(); for (int i = 0; i < ui->tabWidget->count(); ++i) - { + { QTermWidget *termWidget= qobject_cast(ui->tabWidget->widget(i)); - if(termWidget) - { - termWidget->setTerminalFont(font); + if(termWidget) + { + termWidget->setTerminalFont(font); - termWidget->setScrollBarPosition(spos); + termWidget->setScrollBarPosition(spos); - termWidget->setColorScheme(4); + termWidget->setColorScheme(4); - termWidget->setTerminalOpacity(qreal(opacity)/100); + termWidget->setTerminalOpacity(qreal(opacity)/100); - } + } } } @@ -318,9 +343,9 @@ void MainWindow::settingShow() void MainWindow::aboutShow() { -// QMessageBox::about(this, QString("Elokab-terminal ") + QApplication::applicationVersion(), tr("A lightweight terminal emulator")); + // QMessageBox::about(this, QString("Elokab-terminal ") + QApplication::applicationVersion(), tr("A lightweight terminal emulator")); QMessageBox::about(this, tr("About Elokab-terminal"), tr("

Elokab-terminal %1

A lightweight terminal emulator" - "

See elkirtasse.sourceforge.net for more information.

© About Zakaria

").arg(QApplication::applicationVersion())); + "

See github for more information.

© Abouzakaria

").arg(QApplication::applicationVersion())); } diff --git a/elokab-terminal/mainwindow.h b/elokab-terminal/mainwindow.h index 031327c..25c1e8f 100755 --- a/elokab-terminal/mainwindow.h +++ b/elokab-terminal/mainwindow.h @@ -16,12 +16,14 @@ class MainWindow : public QMainWindow explicit MainWindow(const QString &wDir=QDir::homePath(), const QString &command=QString(), bool framless=false, + const QString &geometry=QString(), + bool ontop=false, QWidget *parent = 0); ~MainWindow(); signals: void clipboardAvailable(bool); private slots: - void on_actionTest_triggered(); + void setupActions(); @@ -36,9 +38,12 @@ private slots: void customContextMenu(QPoint); void addNewTab(const QString &wDir=QDir::homePath(), const QString &command=QString()); + + void changeTitle(const QString &txt); + QTermWidget *termWidget(); void closeTab(int index); - void tabChanged(int); + void tabChanged(int index); void zoomOut(); void zoomIn(); void settingShow(); @@ -56,14 +61,13 @@ private slots: QAction *mZoomIn; QAction *mActSetting; -QAction *mActAbout; -QAction *mActAboutQt; -QAction *mActQuit; + QAction *mActAbout; + QAction *mActAboutQt; + QAction *mActQuit; + + QMenu *mMenu; -QMenu *mMenu; - int numTab; - bool mFramless; }; #endif // MAINWINDOW_H diff --git a/elokab-terminal/settingdialog.cpp b/elokab-terminal/settingdialog.cpp index be217ed..e3aa38b 100755 --- a/elokab-terminal/settingdialog.cpp +++ b/elokab-terminal/settingdialog.cpp @@ -34,7 +34,7 @@ SettingDialog::SettingDialog(QWidget *parent) : QFont f= setting.value("Font",font).value(); int colorSheme=setting.value("ColorSheme",0).toInt(); int sPos=setting.value("ScrollBar",0).toInt(); - QString txt=setting.value("Shell","/bin/bash").toString(); + QString txt=setting.value("Shell").toString(); int opacity=setting.value("Opacity",100).toInt(); diff --git a/elokab-terminal/settingdialog.ui b/elokab-terminal/settingdialog.ui index 1df08c8..d9f6b29 100755 --- a/elokab-terminal/settingdialog.ui +++ b/elokab-terminal/settingdialog.ui @@ -7,7 +7,7 @@ 0 0 490 - 586 + 500 @@ -271,7 +271,7 @@ - /bin/bash + diff --git a/library/eterminal/qtermwidget.cpp b/library/eterminal/qtermwidget.cpp index 488f2a4..879bbc2 100755 --- a/library/eterminal/qtermwidget.cpp +++ b/library/eterminal/qtermwidget.cpp @@ -23,6 +23,7 @@ #include #include #include +#include // Konsole #include "Session.h" #include "TerminalDisplay.h" @@ -137,7 +138,7 @@ void QTermWidget::init() connect(m_impl->m_session, SIGNAL(finished()), this, SLOT(sessionFinished())); connect(m_impl->m_terminalDisplay, SIGNAL(selectionAvailable(bool)), this, SIGNAL(selectionAvailable(bool))); - + connect(m_impl->m_session, SIGNAL(titleChanged()), this, SLOT(changeTitle())); } @@ -146,7 +147,17 @@ QTermWidget::~QTermWidget() m_impl->m_session->close(); emit destroyed(); } +void QTermWidget::changeTitle() +{ + + if ( m_impl->m_session ){ + QString tit=m_impl->m_session->userTitle(); + m_title=tit; + emit titleChanged(tit); + } + +} void QTermWidget::setTerminalFont(QFont &font) { diff --git a/library/eterminal/qtermwidget.h b/library/eterminal/qtermwidget.h index a8ed3b9..23c0c2c 100755 --- a/library/eterminal/qtermwidget.h +++ b/library/eterminal/qtermwidget.h @@ -108,7 +108,8 @@ class QTermWidget : public QWidget void setTerminalOpacity(qreal level); QColor bColor; - +QString m_title; +QString title(){return m_title;} public slots: @@ -121,14 +122,14 @@ public slots: void receivedData( const QString& text ); void selectionAvailable(bool); - +void titleChanged( const QString& text); protected: virtual void resizeEvent(QResizeEvent *); protected slots: void sessionFinished(); void onDataReceived(const QString&); - +void changeTitle(); private: void setZoom(int step); void init();