mirror of
https://github.com/Swordfish90/cool-retro-term.git
synced 2025-02-23 05:18:44 +00:00
243 lines
5.3 KiB
C++
243 lines
5.3 KiB
C++
|
/*
|
||
|
This file is part of Konsole QML plugin,
|
||
|
which is a terminal emulator from KDE.
|
||
|
|
||
|
Copyright 2013 by Dmitry Zagnoyko <hiroshidi@gmail.com>
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
|
02110-1301 USA.
|
||
|
*/
|
||
|
|
||
|
// Own
|
||
|
#include "ksession.h"
|
||
|
|
||
|
// Qt
|
||
|
#include <QTextCodec>
|
||
|
|
||
|
// Konsole
|
||
|
#include "KeyboardTranslator.h"
|
||
|
#include "TerminalDisplay.h"
|
||
|
|
||
|
|
||
|
KSession::KSession(QObject *parent) :
|
||
|
QObject(parent), m_session(createSession("KSession"))
|
||
|
{
|
||
|
connect(m_session, SIGNAL(finished()), this, SLOT(sessionFinished()));
|
||
|
|
||
|
m_session->run();
|
||
|
}
|
||
|
|
||
|
KSession::~KSession()
|
||
|
{
|
||
|
if (m_session) {
|
||
|
m_session->close();
|
||
|
m_session->disconnect();
|
||
|
delete m_session;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KSession::setTitle(QString name)
|
||
|
{
|
||
|
m_session->setTitle(Session::NameRole, name);
|
||
|
}
|
||
|
|
||
|
|
||
|
Session *KSession::createSession(QString name)
|
||
|
{
|
||
|
Session *session = new Session();
|
||
|
|
||
|
session->setTitle(Session::NameRole, name);
|
||
|
|
||
|
/* Thats a freaking bad idea!!!!
|
||
|
* /bin/bash is not there on every system
|
||
|
* better set it to the current $SHELL
|
||
|
* Maybe you can also make a list available and then let the widget-owner decide what to use.
|
||
|
* By setting it to $SHELL right away we actually make the first filecheck obsolete.
|
||
|
* But as iam not sure if you want to do anything else ill just let both checks in and set this to $SHELL anyway.
|
||
|
*/
|
||
|
session->setProgram("/bin/bash");
|
||
|
|
||
|
//session->setProgram(getenv("SHELL"));
|
||
|
|
||
|
QStringList args("");
|
||
|
session->setArguments(args);
|
||
|
session->setAutoClose(true);
|
||
|
|
||
|
session->setCodec(QTextCodec::codecForName("UTF-8"));
|
||
|
|
||
|
session->setFlowControlEnabled(true);
|
||
|
session->setHistoryType(HistoryTypeBuffer(1000));
|
||
|
|
||
|
session->setDarkBackground(true);
|
||
|
|
||
|
session->setKeyBindings("");
|
||
|
|
||
|
return session;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
int KSession::getRandomSeed()
|
||
|
{
|
||
|
return m_session->sessionId() * 31;
|
||
|
}
|
||
|
|
||
|
void KSession::addView(KTerminalDisplay *displa)
|
||
|
{
|
||
|
m_session->addView(displa);
|
||
|
}
|
||
|
|
||
|
void KSession::sessionFinished()
|
||
|
{
|
||
|
emit finished();
|
||
|
}
|
||
|
|
||
|
void KSession::selectionChanged(bool textSelected)
|
||
|
{
|
||
|
Q_UNUSED(textSelected)
|
||
|
}
|
||
|
|
||
|
void KSession::startShellProgram()
|
||
|
{
|
||
|
if ( m_session->isRunning() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_session->run();
|
||
|
}
|
||
|
|
||
|
int KSession::getShellPID()
|
||
|
{
|
||
|
return m_session->processId();
|
||
|
}
|
||
|
|
||
|
void KSession::changeDir(const QString &dir)
|
||
|
{
|
||
|
/*
|
||
|
this is a very hackish way of trying to determine if the shell is in
|
||
|
the foreground before attempting to change the directory. It may not
|
||
|
be portable to anything other than Linux.
|
||
|
*/
|
||
|
QString strCmd;
|
||
|
strCmd.setNum(getShellPID());
|
||
|
strCmd.prepend("ps -j ");
|
||
|
strCmd.append(" | tail -1 | awk '{ print $5 }' | grep -q \\+");
|
||
|
int retval = system(strCmd.toStdString().c_str());
|
||
|
|
||
|
if (!retval) {
|
||
|
QString cmd = "cd " + dir + "\n";
|
||
|
sendText(cmd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KSession::setEnvironment(const QStringList &environment)
|
||
|
{
|
||
|
m_session->setEnvironment(environment);
|
||
|
}
|
||
|
|
||
|
|
||
|
void KSession::setShellProgram(const QString &progname)
|
||
|
{
|
||
|
if (!m_session)
|
||
|
return;
|
||
|
|
||
|
m_session->setProgram(progname);
|
||
|
}
|
||
|
|
||
|
void KSession::setWorkingDirectory(const QString &dir)
|
||
|
{
|
||
|
if (!m_session)
|
||
|
return;
|
||
|
|
||
|
m_session->setInitialWorkingDirectory(dir);
|
||
|
}
|
||
|
|
||
|
void KSession::setArgs(QStringList &args)
|
||
|
{
|
||
|
if (!m_session)
|
||
|
return;
|
||
|
|
||
|
m_session->setArguments(args);
|
||
|
}
|
||
|
|
||
|
void KSession::setTextCodec(QTextCodec *codec)
|
||
|
{
|
||
|
if (!m_session)
|
||
|
return;
|
||
|
|
||
|
m_session->setCodec(codec);
|
||
|
}
|
||
|
|
||
|
void KSession::setHistorySize(int lines)
|
||
|
{
|
||
|
if (lines < 0)
|
||
|
m_session->setHistoryType(HistoryTypeFile());
|
||
|
else
|
||
|
m_session->setHistoryType(HistoryTypeBuffer(lines));
|
||
|
}
|
||
|
|
||
|
void KSession::sendText(QString text)
|
||
|
{
|
||
|
m_session->sendText(text);
|
||
|
}
|
||
|
|
||
|
void KSession::sendKey(int rep, int key, int mod) const
|
||
|
{
|
||
|
Qt::KeyboardModifier kbm = Qt::KeyboardModifier(mod);
|
||
|
|
||
|
QKeyEvent qkey(QEvent::KeyPress, key, kbm);
|
||
|
|
||
|
while (rep > 0){
|
||
|
m_session->sendKey(&qkey);
|
||
|
--rep;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KSession::setFlowControlEnabled(bool enabled)
|
||
|
{
|
||
|
m_session->setFlowControlEnabled(enabled);
|
||
|
}
|
||
|
|
||
|
bool KSession::flowControlEnabled()
|
||
|
{
|
||
|
return m_session->flowControlEnabled();
|
||
|
}
|
||
|
|
||
|
void KSession::setKeyBindings(const QString &kb)
|
||
|
{
|
||
|
m_session->setKeyBindings(kb);
|
||
|
emit changedKeyBindings(kb);
|
||
|
}
|
||
|
|
||
|
QString KSession::getKeyBindings()
|
||
|
{
|
||
|
return m_session->keyBindings();
|
||
|
}
|
||
|
|
||
|
|
||
|
QStringList KSession::availableKeyBindings()
|
||
|
{
|
||
|
return KeyboardTranslatorManager::instance()->allTranslators();
|
||
|
}
|
||
|
|
||
|
QString KSession::keyBindings()
|
||
|
{
|
||
|
return m_session->keyBindings();
|
||
|
}
|
||
|
|
||
|
|