diff --git a/terminal/bundles/org.eclipse.terminal.connector.local/src/org/eclipse/terminal/connector/local/launcher/LocalLauncherDelegate.java b/terminal/bundles/org.eclipse.terminal.connector.local/src/org/eclipse/terminal/connector/local/launcher/LocalLauncherDelegate.java index 6ef0a48795f..8e638cd36e0 100644 --- a/terminal/bundles/org.eclipse.terminal.connector.local/src/org/eclipse/terminal/connector/local/launcher/LocalLauncherDelegate.java +++ b/terminal/bundles/org.eclipse.terminal.connector.local/src/org/eclipse/terminal/connector/local/launcher/LocalLauncherDelegate.java @@ -105,8 +105,10 @@ public CompletableFuture execute(Map properties) { properties.put(ITerminalsConnectorConstants.PROP_FORCE_NEW, Boolean.TRUE); } + boolean hadWorkingDirectoryBefore = properties + .containsKey(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR); // Initialize the local terminal working directory. - if (!properties.containsKey(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR)) { + if (!hadWorkingDirectoryBefore) { // By default, start the local terminal in the users home directory String initialCwd = IPreferenceKeys.getPreferences() .getString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD); @@ -213,7 +215,7 @@ public CompletableFuture execute(Map properties) { } } } - if (dir != null) { + if (!hadWorkingDirectoryBefore && dir != null) { properties.put(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR, dir); String basename = new Path(dir).lastSegment(); diff --git a/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/TerminalService.java b/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/TerminalService.java index a7ecbc39d2a..53ee1ca3fab 100644 --- a/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/TerminalService.java +++ b/terminal/bundles/org.eclipse.terminal.view.ui/src/org/eclipse/terminal/view/ui/internal/TerminalService.java @@ -14,9 +14,11 @@ import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; @@ -250,6 +252,7 @@ protected ITerminalConnector createTerminalConnector(Map propert public CompletableFuture openConsole(final Map properties) { Assert.isNotNull(properties); final boolean restoringView = fRestoringView; + AtomicReference> endOperation = new AtomicReference<>(null); return executeServiceOperation(properties, new TerminalServiceRunnable() { @Override public void run(TerminalViewId tvid, String title, ITerminalConnector connector, Object data) @@ -261,7 +264,14 @@ public void run(TerminalViewId tvid, String title, ITerminalConnector connector, fRestoringView = true; consoleViewManager.showConsoleView(tvid); fRestoringView = false; - doRun(tvid, title, connector, data); + + // To make sure that the terminals started by showConsoleView() are started first, + // we have to delay starting the current one with executeServiceOperation() + // (add the operation at the end of the queue) + endOperation.set(executeServiceOperation( + (tvid2, title2, connector2, data2) -> doRun(tvid, title, connector, data), tvid, title, + connector, data)); + } } @@ -294,7 +304,8 @@ private void doRun(TerminalViewId tvid, String title, ITerminalConnector connect console.setData("properties", properties); //$NON-NLS-1$ } } - }); + }).thenCompose(o -> Objects.>requireNonNullElse(endOperation.get(), + CompletableFuture.completedFuture(o))); } @Override