From 5c4fddc6a5d766fd62a4d3b89b49d5e4ffdee6ba Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 29 Aug 2012 09:13:42 +0200 Subject: [PATCH] Detect Linux terminal by checking a number of known terminals. Change the behaviour of defaultTerminalEmulator() to already return the run option in line with terminalEmulator(). Change the QLineEdit in settings to an editable combo offering the available terminals. Change-Id: I333ef08ad06934bcd9fcafb50ff1eced1af6293a Reviewed-by: Nikolai Kosjar --- src/libs/utils/consoleprocess.h | 1 + src/libs/utils/consoleprocess_unix.cpp | 62 +++++++++++++++++++--- src/plugins/coreplugin/generalsettings.cpp | 11 ++-- src/plugins/coreplugin/generalsettings.ui | 8 ++- 4 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/libs/utils/consoleprocess.h b/src/libs/utils/consoleprocess.h index 949db8fc637..0be84b8f2f2 100644 --- a/src/libs/utils/consoleprocess.h +++ b/src/libs/utils/consoleprocess.h @@ -87,6 +87,7 @@ public: #else void setSettings(QSettings *settings); static QString defaultTerminalEmulator(); + static QStringList availableTerminalEmulators(); static QString terminalEmulator(const QSettings *settings); static void setTerminalEmulator(QSettings *settings, const QString &term); #endif diff --git a/src/libs/utils/consoleprocess_unix.cpp b/src/libs/utils/consoleprocess_unix.cpp index 4c514455676..c2f88cf1f9c 100644 --- a/src/libs/utils/consoleprocess_unix.cpp +++ b/src/libs/utils/consoleprocess_unix.cpp @@ -277,21 +277,71 @@ void ConsoleProcess::stubExited() emit wrapperStopped(); } +struct Terminal { + const char *binary; + const char *options; +}; + +static const Terminal knownTerminals[] = +{ + {"xterm", "-e"}, + {"aterm", "-e"}, + {"Eterm", "-e"}, + {"rxvt", "-e"}, + {"urxvt", "-e"}, + {"xfce4-terminal", "-x"}, + {"konsole", "--nofork -e"}, + {"gnome-terminal", "-x"} +}; + QString ConsoleProcess::defaultTerminalEmulator() { #ifdef Q_OS_MAC - return QLatin1String("/usr/X11/bin/xterm"); + return QLatin1String("/usr/X11/bin/xterm -e"); #else - return QLatin1String("xterm"); + const Environment env = Environment::systemEnvironment(); + const int terminalCount = int(sizeof(knownTerminals) / sizeof(knownTerminals[0])); + for (int i = 0; i < terminalCount; ++i) { + QString result = env.searchInPath(QLatin1String(knownTerminals[i].binary)); + if (!result.isEmpty()) { + result += QLatin1Char(' '); + result += QLatin1String(knownTerminals[i].options); + return result; + } + } + return QLatin1String("xterm -e"); +#endif +} + +QStringList ConsoleProcess::availableTerminalEmulators() +{ +#ifdef Q_OS_MAC + return QStringList(defaultTerminalEmulator()); +#else + QStringList result; + const Environment env = Environment::systemEnvironment(); + const int terminalCount = int(sizeof(knownTerminals) / sizeof(knownTerminals[0])); + for (int i = 0; i < terminalCount; ++i) { + QString terminal = env.searchInPath(QLatin1String(knownTerminals[i].binary)); + if (!terminal.isEmpty()) { + terminal += QLatin1Char(' '); + terminal += QLatin1String(knownTerminals[i].options); + result.push_back(terminal); + } + } + result.sort(); + return result; #endif } QString ConsoleProcess::terminalEmulator(const QSettings *settings) { - const QString dflt = defaultTerminalEmulator() + QLatin1String(" -e"); - if (!settings) - return dflt; - return settings->value(QLatin1String("General/TerminalEmulator"), dflt).toString(); + if (settings) { + const QString value = settings->value(QLatin1String("General/TerminalEmulator")).toString(); + if (!value.isEmpty()) + return value; + } + return defaultTerminalEmulator(); } void ConsoleProcess::setTerminalEmulator(QSettings *settings, const QString &term) diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index a6ab371b2b3..d8d98a8feec 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -113,10 +113,13 @@ QWidget *GeneralSettings::createPage(QWidget *parent) m_page->colorButton->setColor(StyleHelper::requestedBaseColor()); m_page->reloadBehavior->setCurrentIndex(EditorManager::instance()->reloadSetting()); #ifdef Q_OS_UNIX - m_page->terminalEdit->setText(ConsoleProcess::terminalEmulator(settings)); + const QStringList availableTerminals = ConsoleProcess::availableTerminalEmulators(); + const QString currentTerminal = ConsoleProcess::terminalEmulator(settings); + m_page->terminalComboBox->addItems(availableTerminals); + m_page->terminalComboBox->lineEdit()->setText(currentTerminal); #else m_page->terminalLabel->hide(); - m_page->terminalEdit->hide(); + m_page->terminalComboBox->hide(); m_page->resetTerminalButton->hide(); #endif @@ -175,7 +178,7 @@ void GeneralSettings::apply() EditorManager::instance()->setReloadSetting(IDocument::ReloadSetting(m_page->reloadBehavior->currentIndex())); #ifdef Q_OS_UNIX ConsoleProcess::setTerminalEmulator(Core::ICore::settings(), - m_page->terminalEdit->text()); + m_page->terminalComboBox->lineEdit()->text()); #ifndef Q_OS_MAC Utils::UnixUtils::setFileBrowser(Core::ICore::settings(), m_page->externalFileBrowserEdit->text()); #endif @@ -200,7 +203,7 @@ void GeneralSettings::resetInterfaceColor() void GeneralSettings::resetTerminal() { #if defined(Q_OS_UNIX) - m_page->terminalEdit->setText(ConsoleProcess::defaultTerminalEmulator() + QLatin1String(" -e")); + m_page->terminalComboBox->lineEdit()->setText(ConsoleProcess::defaultTerminalEmulator()); #endif } diff --git a/src/plugins/coreplugin/generalsettings.ui b/src/plugins/coreplugin/generalsettings.ui index 960d05b098d..08b42c94e0b 100644 --- a/src/plugins/coreplugin/generalsettings.ui +++ b/src/plugins/coreplugin/generalsettings.ui @@ -124,7 +124,11 @@ - + + + true + + @@ -305,7 +309,7 @@ colorButton resetButton languageBox - terminalEdit + terminalComboBox resetTerminalButton externalFileBrowserEdit resetFileBrowserButton