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