diff options
Diffstat (limited to 'client/browser/qtermwidget/src/Session.cpp')
-rw-r--r-- | client/browser/qtermwidget/src/Session.cpp | 1022 |
1 files changed, 0 insertions, 1022 deletions
diff --git a/client/browser/qtermwidget/src/Session.cpp b/client/browser/qtermwidget/src/Session.cpp deleted file mode 100644 index c45e7a1d..00000000 --- a/client/browser/qtermwidget/src/Session.cpp +++ /dev/null @@ -1,1022 +0,0 @@ -/* - This file is part of Konsole - - Copyright (C) 2006-2007 by Robert Knight <robertknight@gmail.com> - Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - 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 "Session.h" - -// Standard -#include <assert.h> -#include <stdlib.h> - -// Qt -#include <QtGui/QApplication> -#include <QtCore/QByteRef> -#include <QtCore/QDir> -#include <QtCore/QFile> -#include <QtCore/QRegExp> -#include <QtCore/QStringList> -#include <QtCore> - -#include "Pty.h" -#include "TerminalDisplay.h" -#include "ShellCommand.h" -#include "Vt102Emulation.h" - - -using namespace Konsole; - -int Session::lastSessionId = 0; - -Session::Session() : - _shellProcess(0) - , _emulation(0) - , _monitorActivity(false) - , _monitorSilence(false) - , _notifiedActivity(false) - , _autoClose(true) - , _wantedClose(false) - , _silenceSeconds(10) - , _addToUtmp(false) // disabled by default because of a bug encountered on certain systems - // which caused Konsole to hang when closing a tab and then opening a new - // one. A 'QProcess destroyed while still running' warning was being - // printed to the terminal. Likely a problem in KPty::logout() - // or KPty::login() which uses a QProcess to start /usr/bin/utempter - , _flowControl(true) - , _fullScripting(false) - , _sessionId(0) -// , _zmodemBusy(false) -// , _zmodemProc(0) -// , _zmodemProgress(0) - , _hasDarkBackground(false) -{ - //prepare DBus communication -// new SessionAdaptor(this); - _sessionId = ++lastSessionId; -// QDBusConnection::sessionBus().registerObject(QLatin1String("/Sessions/")+QString::number(_sessionId), this); - - //create teletype for I/O with shell process - _shellProcess = new Pty(); - - //create emulation backend - _emulation = new Vt102Emulation(); - - connect( _emulation, SIGNAL( titleChanged( int, const QString & ) ), - this, SLOT( setUserTitle( int, const QString & ) ) ); - connect( _emulation, SIGNAL( stateSet(int) ), - this, SLOT( activityStateSet(int) ) ); -// connect( _emulation, SIGNAL( zmodemDetected() ), this , -// SLOT( fireZModemDetected() ) ); - connect( _emulation, SIGNAL( changeTabTextColorRequest( int ) ), - this, SIGNAL( changeTabTextColorRequest( int ) ) ); - connect( _emulation, SIGNAL(profileChangeCommandReceived(const QString&)), - this, SIGNAL( profileChangeCommandReceived(const QString&)) ); - // TODO - // connect( _emulation,SIGNAL(imageSizeChanged(int,int)) , this , - // SLOT(onEmulationSizeChange(int,int)) ); - - //connect teletype to emulation backend - _shellProcess->setUtf8Mode(_emulation->utf8()); - - connect( _shellProcess,SIGNAL(receivedData(const char*,int)),this, - SLOT(onReceiveBlock(const char*,int)) ); - connect( _emulation,SIGNAL(sendData(const char*,int)),_shellProcess, - SLOT(sendData(const char*,int)) ); - connect( _emulation,SIGNAL(lockPtyRequest(bool)),_shellProcess,SLOT(lockPty(bool)) ); - connect( _emulation,SIGNAL(useUtf8Request(bool)),_shellProcess,SLOT(setUtf8Mode(bool)) ); - - - connect( _shellProcess,SIGNAL(done(int)), this, SLOT(done(int)) ); - - //setup timer for monitoring session activity - _monitorTimer = new QTimer(this); - _monitorTimer->setSingleShot(true); - connect(_monitorTimer, SIGNAL(timeout()), this, SLOT(monitorTimerDone())); -} - -WId Session::windowId() const -{ - // Returns a window ID for this session which is used - // to set the WINDOWID environment variable in the shell - // process. - // - // Sessions can have multiple views or no views, which means - // that a single ID is not always going to be accurate. - // - // If there are no views, the window ID is just 0. If - // there are multiple views, then the window ID for the - // top-level window which contains the first view is - // returned - - if ( _views.count() == 0 ) - return 0; - else - { - QWidget* window = _views.first(); - - Q_ASSERT( window ); - - while ( window->parentWidget() != 0 ) - window = window->parentWidget(); - - return window->winId(); - } -} - -void Session::setDarkBackground(bool darkBackground) -{ - _hasDarkBackground = darkBackground; -} -bool Session::hasDarkBackground() const -{ - return _hasDarkBackground; -} -bool Session::isRunning() const -{ - return _shellProcess->isRunning(); -} - -void Session::setCodec(QTextCodec* codec) -{ - emulation()->setCodec(codec); -} - -void Session::setProgram(const QString& program) -{ - _program = ShellCommand::expand(program); -} -void Session::setInitialWorkingDirectory(const QString& dir) -{ - _initialWorkingDir = ShellCommand::expand(dir); -} -void Session::setArguments(const QStringList& arguments) -{ - _arguments = ShellCommand::expand(arguments); -} - -QList<TerminalDisplay*> Session::views() const -{ - return _views; -} - -void Session::addView(TerminalDisplay* widget) -{ - Q_ASSERT( !_views.contains(widget) ); - - _views.append(widget); - - if ( _emulation != 0 ) - { - // connect emulation - view signals and slots - connect( widget , SIGNAL(keyPressedSignal(QKeyEvent*)) , _emulation , - SLOT(sendKeyEvent(QKeyEvent*)) ); - connect( widget , SIGNAL(mouseSignal(int,int,int,int)) , _emulation , - SLOT(sendMouseEvent(int,int,int,int)) ); - connect( widget , SIGNAL(sendStringToEmu(const char*)) , _emulation , - SLOT(sendString(const char*)) ); - - // allow emulation to notify view when the foreground process - // indicates whether or not it is interested in mouse signals - connect( _emulation , SIGNAL(programUsesMouseChanged(bool)) , widget , - SLOT(setUsesMouse(bool)) ); - - widget->setUsesMouse( _emulation->programUsesMouse() ); - - widget->setScreenWindow(_emulation->createWindow()); - } - - //connect view signals and slots - QObject::connect( widget ,SIGNAL(changedContentSizeSignal(int,int)),this, - SLOT(onViewSizeChange(int,int))); - - QObject::connect( widget ,SIGNAL(destroyed(QObject*)) , this , - SLOT(viewDestroyed(QObject*)) ); -//slot for close - QObject::connect(this, SIGNAL(finished()), widget, SLOT(close())); - -} - -void Session::viewDestroyed(QObject* view) -{ - TerminalDisplay* display = (TerminalDisplay*)view; - - Q_ASSERT( _views.contains(display) ); - - removeView(display); -} - -void Session::removeView(TerminalDisplay* widget) -{ - _views.removeAll(widget); - - disconnect(widget,0,this,0); - - if ( _emulation != 0 ) - { - // disconnect - // - key presses signals from widget - // - mouse activity signals from widget - // - string sending signals from widget - // - // ... and any other signals connected in addView() - disconnect( widget, 0, _emulation, 0); - - // disconnect state change signals emitted by emulation - disconnect( _emulation , 0 , widget , 0); - } - - // close the session automatically when the last view is removed - if ( _views.count() == 0 ) - { - close(); - } -} - -void Session::run() -{ - //check that everything is in place to run the session - if (_program.isEmpty()) - qDebug() << "Session::run() - program to run not set."; - if (_arguments.isEmpty()) - qDebug() << "Session::run() - no command line arguments specified."; - - // Upon a KPty error, there is no description on what that error was... - // Check to see if the given program is executable. - QString exec = QFile::encodeName(_program); - - // if 'exec' is not specified, fall back to default shell. if that - // is not set then fall back to /bin/sh - if ( exec.isEmpty() ) - exec = getenv("SHELL"); - if ( exec.isEmpty() ) - exec = "/bin/sh"; - - // if no arguments are specified, fall back to shell - QStringList arguments = _arguments.join(QChar(' ')).isEmpty() ? - QStringList() << exec : _arguments; - QString pexec = exec; - - if ( pexec.isEmpty() ) { - qDebug()<<"can not execute "<<exec<<endl; - QTimer::singleShot(1, this, SIGNAL(finished())); - return; - } - - QString cwd_save = QDir::currentPath(); - if (!_initialWorkingDir.isEmpty()) - _shellProcess->setWorkingDirectory(_initialWorkingDir); - else - _shellProcess->setWorkingDirectory(QDir::homePath()); - - _shellProcess->setXonXoff(_flowControl); - _shellProcess->setErase(_emulation->getErase()); - - // this is not strictly accurate use of the COLORFGBG variable. This does not - // tell the terminal exactly which colors are being used, but instead approximates - // the color scheme as "black on white" or "white on black" depending on whether - // the background color is deemed dark or not - QString backgroundColorHint = _hasDarkBackground ? "COLORFGBG=15;0" : "COLORFGBG=0;15"; - - int result = _shellProcess->start(QFile::encodeName(_program), - arguments, - _environment << backgroundColorHint, - windowId(), - _addToUtmp); - - if (result < 0) - { - return; - } - - _shellProcess->setWriteable(false); // We are reachable via kwrited. - - emit started(); -} - -void Session::setUserTitle( int what, const QString &caption ) -{ - //set to true if anything is actually changed (eg. old _nameTitle != new _nameTitle ) - bool modified = false; - - // (btw: what=0 changes _userTitle and icon, what=1 only icon, what=2 only _nameTitle - if ((what == 0) || (what == 2)) - { - if ( _userTitle != caption ) { - _userTitle = caption; - modified = true; - } - } - - if ((what == 0) || (what == 1)) - { - if ( _iconText != caption ) { - _iconText = caption; - modified = true; - } - } - - if (what == 11) - { - QString colorString = caption.section(';',0,0); - qDebug() << __FILE__ << __LINE__ << ": setting background colour to " << colorString; - QColor backColor = QColor(colorString); - if (backColor.isValid()){// change color via \033]11;Color\007 - if (backColor != _modifiedBackground) - { - _modifiedBackground = backColor; - - // bail out here until the code to connect the terminal display - // to the changeBackgroundColor() signal has been written - // and tested - just so we don't forget to do this. - Q_ASSERT( 0 ); - - emit changeBackgroundColorRequest(backColor); - } - } - } - - if (what == 30) - { - if ( _nameTitle != caption ) { - setTitle(Session::NameRole,caption); - return; - } - } - - if (what == 31) - { - QString cwd=caption; - cwd=cwd.replace( QRegExp("^~"), QDir::homePath() ); - emit openUrlRequest(cwd); - } - - // change icon via \033]32;Icon\007 - if (what == 32) - { - if ( _iconName != caption ) { - _iconName = caption; - - modified = true; - } - } - - if (what == 50) - { - emit profileChangeCommandReceived(caption); - return; - } - - if ( modified ) - emit titleChanged(); -} - -QString Session::userTitle() const -{ - return _userTitle; -} -void Session::setTabTitleFormat(TabTitleContext context , const QString& format) -{ - if ( context == LocalTabTitle ) - _localTabTitleFormat = format; - else if ( context == RemoteTabTitle ) - _remoteTabTitleFormat = format; -} -QString Session::tabTitleFormat(TabTitleContext context) const -{ - if ( context == LocalTabTitle ) - return _localTabTitleFormat; - else if ( context == RemoteTabTitle ) - return _remoteTabTitleFormat; - - return QString(); -} - -void Session::monitorTimerDone() -{ - //FIXME: The idea here is that the notification popup will appear to tell the user than output from - //the terminal has stopped and the popup will disappear when the user activates the session. - // - //This breaks with the addition of multiple views of a session. The popup should disappear - //when any of the views of the session becomes active - - - //FIXME: Make message text for this notification and the activity notification more descriptive. - if (_monitorSilence) { -// KNotification::event("Silence", ("Silence in session '%1'", _nameTitle), QPixmap(), -// QApplication::activeWindow(), -// KNotification::CloseWhenWidgetActivated); - emit stateChanged(NOTIFYSILENCE); - } - else - { - emit stateChanged(NOTIFYNORMAL); - } - - _notifiedActivity=false; -} - -void Session::activityStateSet(int state) -{ - if (state==NOTIFYBELL) - { - QString s; s.sprintf("Bell in session '%s'",_nameTitle.toAscii().data()); - - emit bellRequest( s ); - } - else if (state==NOTIFYACTIVITY) - { - if (_monitorSilence) { - _monitorTimer->start(_silenceSeconds*1000); - } - - if ( _monitorActivity ) { - //FIXME: See comments in Session::monitorTimerDone() - if (!_notifiedActivity) { -// KNotification::event("Activity", ("Activity in session '%1'", _nameTitle), QPixmap(), -// QApplication::activeWindow(), -// KNotification::CloseWhenWidgetActivated); - _notifiedActivity=true; - } - } - } - - if ( state==NOTIFYACTIVITY && !_monitorActivity ) - state = NOTIFYNORMAL; - if ( state==NOTIFYSILENCE && !_monitorSilence ) - state = NOTIFYNORMAL; - - emit stateChanged(state); -} - -void Session::onViewSizeChange(int /*height*/, int /*width*/) -{ - updateTerminalSize(); -} -void Session::onEmulationSizeChange(int lines , int columns) -{ - setSize( QSize(lines,columns) ); -} - -void Session::updateTerminalSize() -{ - QListIterator<TerminalDisplay*> viewIter(_views); - - int minLines = -1; - int minColumns = -1; - - // minimum number of lines and columns that views require for - // their size to be taken into consideration ( to avoid problems - // with new view widgets which haven't yet been set to their correct size ) - const int VIEW_LINES_THRESHOLD = 2; - const int VIEW_COLUMNS_THRESHOLD = 2; - - //select largest number of lines and columns that will fit in all visible views - while ( viewIter.hasNext() ) - { - TerminalDisplay* view = viewIter.next(); - if ( view->isHidden() == false && - view->lines() >= VIEW_LINES_THRESHOLD && - view->columns() >= VIEW_COLUMNS_THRESHOLD ) - { - minLines = (minLines == -1) ? view->lines() : qMin( minLines , view->lines() ); - minColumns = (minColumns == -1) ? view->columns() : qMin( minColumns , view->columns() ); - } - } - - // backend emulation must have a _terminal of at least 1 column x 1 line in size - if ( minLines > 0 && minColumns > 0 ) - { - _emulation->setImageSize( minLines , minColumns ); - _shellProcess->setWindowSize( minLines , minColumns ); - } -} - -void Session::refresh() -{ - // attempt to get the shell process to redraw the display - // - // this requires the program running in the shell - // to cooperate by sending an update in response to - // a window size change - // - // the window size is changed twice, first made slightly larger and then - // resized back to its normal size so that there is actually a change - // in the window size (some shells do nothing if the - // new and old sizes are the same) - // - // if there is a more 'correct' way to do this, please - // send an email with method or patches to konsole-devel@kde.org - - const QSize existingSize = _shellProcess->windowSize(); - _shellProcess->setWindowSize(existingSize.height(),existingSize.width()+1); - _shellProcess->setWindowSize(existingSize.height(),existingSize.width()); -} - -bool Session::sendSignal(int signal) -{ - return _shellProcess->kill(signal); -} - -void Session::close() -{ - _autoClose = true; - _wantedClose = true; - if (!_shellProcess->isRunning() || !sendSignal(SIGHUP)) - { - // Forced close. - QTimer::singleShot(1, this, SIGNAL(finished())); - } -} - -void Session::sendText(const QString &text) const -{ - _emulation->sendText(text); -} - -Session::~Session() -{ - delete _emulation; - delete _shellProcess; -// delete _zmodemProc; -} - -void Session::setProfileKey(const QString& key) -{ - _profileKey = key; - emit profileChanged(key); -} -QString Session::profileKey() const { return _profileKey; } - -void Session::done(int exitStatus) -{ - if (!_autoClose) - { - _userTitle = ("<Finished>"); - emit titleChanged(); - return; - } - if (!_wantedClose && (exitStatus || _shellProcess->signalled())) - { - QString message; - - if (_shellProcess->normalExit()) - message.sprintf ("Session '%s' exited with status %d.", _nameTitle.toAscii().data(), exitStatus); - else if (_shellProcess->signalled()) - { - if (_shellProcess->coreDumped()) - { - - message.sprintf("Session '%s' exited with signal %d and dumped core.", _nameTitle.toAscii().data(), _shellProcess->exitSignal()); - } - else { - message.sprintf("Session '%s' exited with signal %d.", _nameTitle.toAscii().data(), _shellProcess->exitSignal()); - } - } - else - message.sprintf ("Session '%s' exited unexpectedly.", _nameTitle.toAscii().data()); - - //FIXME: See comments in Session::monitorTimerDone() -// KNotification::event("Finished", message , QPixmap(), -// QApplication::activeWindow(), -// KNotification::CloseWhenWidgetActivated); - } - emit finished(); -} - -Emulation* Session::emulation() const -{ - return _emulation; -} - -QString Session::keyBindings() const -{ - return _emulation->keyBindings(); -} - -QStringList Session::environment() const -{ - return _environment; -} - -void Session::setEnvironment(const QStringList& environment) -{ - _environment = environment; -} - -int Session::sessionId() const -{ - return _sessionId; -} - -void Session::setKeyBindings(const QString &id) -{ - _emulation->setKeyBindings(id); -} - -void Session::setTitle(TitleRole role , const QString& newTitle) -{ - if ( title(role) != newTitle ) - { - if ( role == NameRole ) - _nameTitle = newTitle; - else if ( role == DisplayedTitleRole ) - _displayTitle = newTitle; - - emit titleChanged(); - } -} - -QString Session::title(TitleRole role) const -{ - if ( role == NameRole ) - return _nameTitle; - else if ( role == DisplayedTitleRole ) - return _displayTitle; - else - return QString(); -} - -void Session::setIconName(const QString& iconName) -{ - if ( iconName != _iconName ) - { - _iconName = iconName; - emit titleChanged(); - } -} - -void Session::setIconText(const QString& iconText) -{ - _iconText = iconText; - //kDebug(1211)<<"Session setIconText " << _iconText; -} - -QString Session::iconName() const -{ - return _iconName; -} - -QString Session::iconText() const -{ - return _iconText; -} - -void Session::setHistoryType(const HistoryType &hType) -{ - _emulation->setHistory(hType); -} - -const HistoryType& Session::historyType() const -{ - return _emulation->history(); -} - -void Session::clearHistory() -{ - _emulation->clearHistory(); -} - -QStringList Session::arguments() const -{ - return _arguments; -} - -QString Session::program() const -{ - return _program; -} - -// unused currently -bool Session::isMonitorActivity() const { return _monitorActivity; } -// unused currently -bool Session::isMonitorSilence() const { return _monitorSilence; } - -void Session::setMonitorActivity(bool _monitor) -{ - _monitorActivity=_monitor; - _notifiedActivity=false; - - activityStateSet(NOTIFYNORMAL); -} - -void Session::setMonitorSilence(bool _monitor) -{ - if (_monitorSilence==_monitor) - return; - - _monitorSilence=_monitor; - if (_monitorSilence) - { - _monitorTimer->start(_silenceSeconds*1000); - } - else - _monitorTimer->stop(); - - activityStateSet(NOTIFYNORMAL); -} - -void Session::setMonitorSilenceSeconds(int seconds) -{ - _silenceSeconds=seconds; - if (_monitorSilence) { - _monitorTimer->start(_silenceSeconds*1000); - } -} - -void Session::setAddToUtmp(bool set) -{ - _addToUtmp = set; -} - -void Session::setFlowControlEnabled(bool enabled) -{ - if (_flowControl == enabled) - return; - - _flowControl = enabled; - - if (_shellProcess) - _shellProcess->setXonXoff(_flowControl); - - emit flowControlEnabledChanged(enabled); -} -bool Session::flowControlEnabled() const -{ - return _flowControl; -} -//void Session::fireZModemDetected() -//{ -// if (!_zmodemBusy) -// { -// QTimer::singleShot(10, this, SIGNAL(zmodemDetected())); -// _zmodemBusy = true; -// } -//} - -//void Session::cancelZModem() -//{ -// _shellProcess->sendData("\030\030\030\030", 4); // Abort -// _zmodemBusy = false; -//} - -//void Session::startZModem(const QString &zmodem, const QString &dir, const QStringList &list) -//{ -// _zmodemBusy = true; -// _zmodemProc = new KProcess(); -// _zmodemProc->setOutputChannelMode( KProcess::SeparateChannels ); -// -// *_zmodemProc << zmodem << "-v" << list; -// -// if (!dir.isEmpty()) -// _zmodemProc->setWorkingDirectory(dir); -// -// _zmodemProc->start(); -// -// connect(_zmodemProc,SIGNAL (readyReadStandardOutput()), -// this, SLOT(zmodemReadAndSendBlock())); -// connect(_zmodemProc,SIGNAL (readyReadStandardError()), -// this, SLOT(zmodemReadStatus())); -// connect(_zmodemProc,SIGNAL (finished(int,QProcess::ExitStatus)), -// this, SLOT(zmodemFinished())); -// -// disconnect( _shellProcess,SIGNAL(block_in(const char*,int)), this, SLOT(onReceiveBlock(const char*,int)) ); -// connect( _shellProcess,SIGNAL(block_in(const char*,int)), this, SLOT(zmodemRcvBlock(const char*,int)) ); -// -// _zmodemProgress = new ZModemDialog(QApplication::activeWindow(), false, -// i18n("ZModem Progress")); -// -// connect(_zmodemProgress, SIGNAL(user1Clicked()), -// this, SLOT(zmodemDone())); -// -// _zmodemProgress->show(); -//} - -/*void Session::zmodemReadAndSendBlock() -{ - _zmodemProc->setReadChannel( QProcess::StandardOutput ); - QByteArray data = _zmodemProc->readAll(); - - if ( data.count() == 0 ) - return; - - _shellProcess->sendData(data.constData(),data.count()); -} -*/ -/* -void Session::zmodemReadStatus() -{ - _zmodemProc->setReadChannel( QProcess::StandardError ); - QByteArray msg = _zmodemProc->readAll(); - while(!msg.isEmpty()) - { - int i = msg.indexOf('\015'); - int j = msg.indexOf('\012'); - QByteArray txt; - if ((i != -1) && ((j == -1) || (i < j))) - { - msg = msg.mid(i+1); - } - else if (j != -1) - { - txt = msg.left(j); - msg = msg.mid(j+1); - } - else - { - txt = msg; - msg.truncate(0); - } - if (!txt.isEmpty()) - _zmodemProgress->addProgressText(QString::fromLocal8Bit(txt)); - } -} -*/ -/* -void Session::zmodemRcvBlock(const char *data, int len) -{ - QByteArray ba( data, len ); - - _zmodemProc->write( ba ); -} -*/ -/* -void Session::zmodemFinished() -{ - if (_zmodemProc) - { - delete _zmodemProc; - _zmodemProc = 0; - _zmodemBusy = false; - - disconnect( _shellProcess,SIGNAL(block_in(const char*,int)), this ,SLOT(zmodemRcvBlock(const char*,int)) ); - connect( _shellProcess,SIGNAL(block_in(const char*,int)), this, SLOT(onReceiveBlock(const char*,int)) ); - - _shellProcess->sendData("\030\030\030\030", 4); // Abort - _shellProcess->sendData("\001\013\n", 3); // Try to get prompt back - _zmodemProgress->transferDone(); - } -} -*/ -void Session::onReceiveBlock( const char* buf, int len ) -{ - _emulation->receiveData( buf, len ); - emit receivedData( QString::fromLatin1( buf, len ) ); -} - -QSize Session::size() -{ - return _emulation->imageSize(); -} - -void Session::setSize(const QSize& size) -{ - if ((size.width() <= 1) || (size.height() <= 1)) - return; - - emit resizeRequest(size); -} -int Session::foregroundProcessId() const -{ - return _shellProcess->foregroundProcessGroup(); -} -int Session::processId() const -{ - return _shellProcess->pid(); -} - -SessionGroup::SessionGroup() - : _masterMode(0) -{ -} -SessionGroup::~SessionGroup() -{ - // disconnect all - connectAll(false); -} -int SessionGroup::masterMode() const { return _masterMode; } -QList<Session*> SessionGroup::sessions() const { return _sessions.keys(); } -bool SessionGroup::masterStatus(Session* session) const { return _sessions[session]; } - -void SessionGroup::addSession(Session* session) -{ - _sessions.insert(session,false); - - QListIterator<Session*> masterIter(masters()); - - while ( masterIter.hasNext() ) - connectPair(masterIter.next(),session); -} -void SessionGroup::removeSession(Session* session) -{ - setMasterStatus(session,false); - - QListIterator<Session*> masterIter(masters()); - - while ( masterIter.hasNext() ) - disconnectPair(masterIter.next(),session); - - _sessions.remove(session); -} -void SessionGroup::setMasterMode(int mode) -{ - _masterMode = mode; - - connectAll(false); - connectAll(true); -} -QList<Session*> SessionGroup::masters() const -{ - return _sessions.keys(true); -} -void SessionGroup::connectAll(bool connect) -{ - QListIterator<Session*> masterIter(masters()); - - while ( masterIter.hasNext() ) - { - Session* master = masterIter.next(); - - QListIterator<Session*> otherIter(_sessions.keys()); - while ( otherIter.hasNext() ) - { - Session* other = otherIter.next(); - - if ( other != master ) - { - if ( connect ) - connectPair(master,other); - else - disconnectPair(master,other); - } - } - } -} -void SessionGroup::setMasterStatus(Session* session , bool master) -{ - bool wasMaster = _sessions[session]; - _sessions[session] = master; - - if ( !wasMaster && !master - || wasMaster && master ) - return; - - QListIterator<Session*> iter(_sessions.keys()); - while ( iter.hasNext() ) - { - Session* other = iter.next(); - - if ( other != session ) - { - if ( master ) - connectPair(session,other); - else - disconnectPair(session,other); - } - } -} -void SessionGroup::connectPair(Session* master , Session* other) -{ -// qDebug() << k_funcinfo; - - if ( _masterMode & CopyInputToAll ) - { - qDebug() << "Connection session " << master->nameTitle() << "to" << other->nameTitle(); - - connect( master->emulation() , SIGNAL(sendData(const char*,int)) , other->emulation() , - SLOT(sendString(const char*,int)) ); - } -} -void SessionGroup::disconnectPair(Session* master , Session* other) -{ -// qDebug() << k_funcinfo; - - if ( _masterMode & CopyInputToAll ) - { - qDebug() << "Disconnecting session " << master->nameTitle() << "from" << other->nameTitle(); - - disconnect( master->emulation() , SIGNAL(sendData(const char*,int)) , other->emulation() , - SLOT(sendString(const char*,int)) ); - } -} - -//#include "moc_Session.cpp" |