Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FileSystem dock: Fix opening a Linux terminal #88173

Merged
merged 1 commit into from
Feb 15, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions editor/filesystem_dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2128,7 +2128,8 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
terminal_emulators.push_back(terminal_emulator_setting);
}

String arguments = EDITOR_GET("filesystem/external_programs/terminal_emulator_flags");
String flags = EDITOR_GET("filesystem/external_programs/terminal_emulator_flags");
String arguments = flags;
if (arguments.is_empty()) {
// NOTE: This default value is ignored further below if the terminal executable is `powershell` or `cmd`,
// due to these terminals requiring nonstandard syntax to start in a specified folder.
Expand All @@ -2138,16 +2139,13 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
#ifdef LINUXBSD_ENABLED
String chosen_terminal_emulator;
for (const String &terminal_emulator : terminal_emulators) {
String pipe;
List<String> test_args; // Required for `execute()`, as it doesn't accept `Vector<String>`.
test_args.push_back("-v");
test_args.push_back(terminal_emulator);
// Silence command name being printed when found. (stderr is already silenced by `OS::execute()` by default.)
// FIXME: This doesn't appear to silence stdout.
test_args.push_back(">");
test_args.push_back("/dev/null");
int exit_code = 0;
const Error err = OS::get_singleton()->execute("command", test_args, nullptr, &exit_code);
if (err == OK && exit_code == EXIT_SUCCESS) {
test_args.push_back("-cr");
test_args.push_back("command -v " + terminal_emulator);
const Error err = OS::get_singleton()->execute("bash", test_args, &pipe);
// Check if a path to the terminal executable exists.
if (err == OK && pipe.contains("/")) {
chosen_terminal_emulator = terminal_emulator;
break;
} else if (err == ERR_CANT_FORK) {
Expand All @@ -2164,8 +2162,14 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
// Prepend default arguments based on the terminal emulator name.
// Use `String.ends_with()` so that installations in non-default paths
// or `/usr/local/bin` are detected correctly.
if (chosen_terminal_emulator.ends_with("konsole")) {
terminal_emulator_args.push_back("--workdir");
if (flags.is_empty()) {
if (chosen_terminal_emulator.ends_with("konsole")) {
terminal_emulator_args.push_back("--workdir");
} else if (chosen_terminal_emulator.ends_with("gnome-terminal")) {
terminal_emulator_args.push_back("--working-directory");
} else if (chosen_terminal_emulator.ends_with("urxvt")) {
terminal_emulator_args.push_back("-cd");
}
}
#endif

Expand Down
Loading