Ported from http://bugs.kde.org/show_bug.cgi?id=94075 diff -Naur kdebase-3.5.6/konsole/konsole.orig/konsole.cpp kdebase-3.5.6/konsole/konsole/konsole.cpp --- kdebase-3.5.6/konsole/konsole.orig/konsole.cpp 2007-04-18 23:57:04.000000000 +0200 +++ kdebase-3.5.6/konsole/konsole/konsole.cpp 2007-04-19 00:01:55.000000000 +0200 @@ -114,6 +114,7 @@ #include #include #include +#include #include #include @@ -268,6 +269,7 @@ ,sessionNumberMapper(0) ,sl_sessionShortCuts(0) ,s_workDir(workdir) +,m_filterData(0) { isRestored = b_inRestore; connect( &m_closeTimeout, SIGNAL(timeout()), this, SLOT(slotCouldNotClose())); @@ -346,6 +348,8 @@ Konsole::~Konsole() { + delete m_filterData; + sessions.first(); while(sessions.current()) { @@ -718,6 +722,11 @@ m_copyClipboard->plug(m_rightButton); m_pasteClipboard->plug(m_rightButton); + + m_openSelection = new KPopupMenu(this); + m_rightButton->insertItem( i18n("&Open.."), m_openSelection ); + connect(m_openSelection, SIGNAL(aboutToShow()), SLOT(slotOpenSelection())); + if (m_signals) m_rightButton->insertItem(i18n("&Send Signal"), m_signals); @@ -3953,6 +3962,34 @@ m_finddialog->result(); } +void Konsole::slotOpenSelection() +{ + delete m_filterData; + + m_openSelection->clear(); + disconnect(m_openSelection, SIGNAL(activated(int)), this, SLOT(slotOpenURI(int))); + + QString selection = se->getEmulation()->getSelection(); + QString curdir = baseURL().path(); + + if ( QFile::exists( curdir + selection ) ) { + selectedURL = QString(curdir + selection); + } else { + selectedURL = QString(selection); + } + + m_filterData = new KURIFilterData( selectedURL ); + KURIFilter::self()->filterURI( *(m_filterData) ); + m_openSelection->insertItem( SmallIconSet( m_filterData->iconName() ),i18n( "%1" ).arg(m_filterData->uri().url()), 1 ); + + connect(m_openSelection, SIGNAL(activated(int)), SLOT(slotOpenURI(int))); +} + +void Konsole::slotOpenURI(int) +{ + (void) new KRun( m_filterData->uri() ); +} + void Konsole::slotFindNext() { if( !m_finddialog ) { diff -Naur kdebase-3.5.6/konsole/konsole.orig/konsole.h kdebase-3.5.6/konsole/konsole/konsole.h --- kdebase-3.5.6/konsole/konsole.orig/konsole.h 2007-01-15 12:32:17.000000000 +0100 +++ kdebase-3.5.6/konsole/konsole/konsole.h 2007-04-19 00:01:55.000000000 +0200 @@ -64,6 +64,7 @@ class KRadioAction; class KTabWidget; class QToolButton; +class KURIFilterData; // Defined in main.C const char *konsole_shell(QStrList &args); @@ -203,6 +204,9 @@ void loadScreenSessions(); void updateFullScreen(bool on); + void slotOpenSelection(); + void slotOpenURI(int n); + void slotSaveSettings(); void slotSaveSessionsProfile(); void slotConfigureNotifications(); @@ -365,6 +369,7 @@ KAction *m_print; KAction *m_quit; KAction *m_tabDetachSession; + KPopupMenu *m_openSelection; KActionCollection *m_shortcuts; @@ -375,6 +380,7 @@ bool m_find_first; bool m_find_found; QString m_find_pattern; + QString selectedURL; int cmd_serial; int cmd_first_screen; @@ -438,6 +444,7 @@ QString s_workDir; QColor m_tabColor; + KURIFilterData* m_filterData; }; class QSpinBox; diff -Naur kdebase-3.5.6/konsole/konsole.orig/TEmulation.cpp kdebase-3.5.6/konsole/konsole/TEmulation.cpp --- kdebase-3.5.6/konsole/konsole.orig/TEmulation.cpp 2007-01-15 12:32:17.000000000 +0100 +++ kdebase-3.5.6/konsole/konsole/TEmulation.cpp 2007-04-18 23:58:59.000000000 +0200 @@ -395,6 +395,11 @@ QApplication::clipboard()->setText(t); } +QString TEmulation::getSelection() { + if (connected) return scr->getSelText(true); + return QString::null; +} + void TEmulation::streamHistory(QTextStream* stream) { scr->streamHistory(stream); } diff -Naur kdebase-3.5.6/konsole/konsole.orig/TEmulation.h kdebase-3.5.6/konsole/konsole/TEmulation.h --- kdebase-3.5.6/konsole/konsole.orig/TEmulation.h 2006-10-01 19:32:08.000000000 +0200 +++ kdebase-3.5.6/konsole/konsole/TEmulation.h 2007-04-18 23:58:59.000000000 +0200 @@ -59,6 +59,7 @@ virtual void clearSelection(); virtual void copySelection(); + virtual QString getSelection(); virtual void onSelectionBegin(const int x, const int y, const bool columnmode); virtual void onSelectionExtend(const int x, const int y); virtual void setSelection(const bool preserve_line_breaks);