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