diff --git a/src/Application.cpp b/src/Application.cpp index d7731f487..25fbe8860 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -79,6 +79,8 @@ MainWindow* Application::newMainWindow() connect( window , SIGNAL(newSessionRequest(Profile::Ptr,const QString&,ViewManager*)), this , SLOT(createSession(Profile::Ptr,const QString&,ViewManager*))); + connect( window , SIGNAL(newSSHSessionRequest(Profile::Ptr,const KUrl&,ViewManager*)), + this , SLOT(createSSHSession(Profile::Ptr,const KUrl&,ViewManager*))); connect( window , SIGNAL(newWindowRequest(Profile::Ptr,const QString&)), this , SLOT(createWindow(Profile::Ptr,const QString&)) ); connect( window->viewManager() , SIGNAL(viewDetached(Session*)) , this , SLOT(detachView(Session*)) ); @@ -320,5 +322,30 @@ Session* Application::createSession(Profile::Ptr profile, const QString& directo return session; } +Session* Application::createSSHSession(Profile::Ptr profile, const KUrl& url, ViewManager* view) +{ + if (!profile) + profile = SessionManager::instance()->defaultProfile(); + + Session* session = SessionManager::instance()->createSession(profile); + + session->sendText("ssh "); + + if ( url.port() > -1 ) + session->sendText("-p " + QString::number(url.port()) + ' ' ); + if ( url.hasUser() ) + session->sendText(url.user() + '@'); + if ( url.hasHost() ) + session->sendText(url.host() + '\r'); + + // create view before starting the session process so that the session doesn't suffer + // a change in terminal size right after the session starts. some applications such as GNU Screen + // and Midnight Commander don't like this happening + view->createView(session); + session->run(); + + return session; +} + #include "Application.moc" diff --git a/src/Application.h b/src/Application.h index 094457835..d4f379bf1 100644 --- a/src/Application.h +++ b/src/Application.h @@ -71,6 +71,7 @@ public: private slots: Session* createSession(Profile::Ptr profile, const QString& directory , ViewManager* view); + Session* createSSHSession(Profile::Ptr profile, const KUrl& url, ViewManager* view); void createWindow(Profile::Ptr profile , const QString& directory); void detachView(Session* session); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index e328ec227..6242ddc57 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -333,11 +333,13 @@ QString MainWindow::activeSessionDir() const void MainWindow::openUrls(const QList& urls) { - // TODO Implement support for SSH bookmarks here foreach( const KUrl& url , urls ) { if ( url.isLocalFile() ) emit newSessionRequest( _defaultProfile , url.path() , _viewManager ); + + else if ( url.protocol() == "ssh" ) + emit newSSHSessionRequest( _defaultProfile , url , _viewManager ); } } diff --git a/src/MainWindow.h b/src/MainWindow.h index c55ae551a..9f9523f16 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -111,6 +111,17 @@ class MainWindow : public KXmlGuiWindow const QString& directory, ViewManager* view); + /** + * Emitted by the main window to request the creation of a new SSH session. + * + * @param profile The profile to use to create the new session. + * @param URL URL for the new session + * @param view The view manager owned by this main window + */ + void newSSHSessionRequest(Profile::Ptr profile, + const KUrl& url, + ViewManager* view); + /** * Emitted by the main window to request the creation of a * new session in a new window.