@@ -3782,9 +3782,38 @@ procedure TMainForm.actDropObjectsExecute(Sender: TObject);
37823782
37833783procedure TMainForm.actLaunchCommandlineExecute(Sender: TObject);
37843784var
3785- path, log, cmd: String;
3785+ path, log, cmd, MySQLArgs, TerminalArgs : String;
37863786 Conn: TDBConnection;
37873787 P: TProcess;
3788+ SpacePos: Integer;
3789+
3790+ function DetectTerminal: string;
3791+ const
3792+ // Order matters: best/most common first
3793+ // Only those supporting the -e argument. User may customize a different one.
3794+ CANDIDATES: array[0..5] of string = (
3795+ 'x-terminal-emulator', // Debian/Ubuntu alternatives. May expand to one which does not have -e.
3796+ 'konsole',
3797+ 'xfce4-terminal',
3798+ 'lxterminal',
3799+ 'tilix',
3800+ 'xterm'
3801+ );
3802+ var
3803+ Term: string;
3804+ begin
3805+ Result := '';
3806+ for Term in CANDIDATES do
3807+ begin
3808+ // Searches in PATH and returns full path or empty string
3809+ Result := FindDefaultExecutablePath(Term);
3810+ if not Result.IsEmpty then
3811+ Exit; // Found a usable terminal
3812+ end;
3813+ if Result.IsEmpty then
3814+ raise Exception.Create('Could not detect terminal - please configure it in preferences');
3815+ end;
3816+
37883817begin
37893818 // Launch mysql.exe
37903819 Conn := ActiveConnection;
@@ -3801,31 +3830,50 @@ procedure TMainForm.actLaunchCommandlineExecute(Sender: TObject);
38013830 end else begin
38023831 log := cmd + Conn.Parameters.GetExternalCliArguments(Conn, nbTrue);
38033832 LogSQL(f_('Launching command line: %s', [log]), lcInfo);
3833+ MySQLArgs := Conn.Parameters.GetExternalCliArguments(Conn, nbFalse);
38043834
38053835 P := TProcess.Create(nil);
38063836 try
3807- {$IF defined( WINDOWS) }
3837+ {$IFDEF WINDOWS}
38083838 P.Executable := path + cmd;
3809- P.Parameters.Add(Conn.Parameters.GetExternalCliArguments(Conn, nbFalse) );
3839+ P.Parameters.Add(MySQLArgs );
38103840 P.Options := P.Options + [poNewConsole]; // Windows only, opens console
38113841
3812- {$ElseIf defined(LINUX)}
3813- P.Executable := 'x-terminal-emulator';
3814- P.Parameters.Add('-e');
3815- P.Parameters.Add(path + cmd + ' ' + Conn.Parameters.GetExternalCliArguments(Conn, nbFalse));
3842+ {$Else}
3843+ P.Executable := AppSettings.ReadString(asTerminal);
3844+ if P.Executable.IsEmpty then begin
3845+ P.Executable := DetectTerminal;
3846+ P.Parameters.Add('-e');
3847+ P.Parameters.Add(path + cmd + ' ' + MySQLArgs);
3848+ end
3849+ else begin
3850+ SpacePos := Pos(' ', P.Executable);
3851+ if SpacePos > 0 then begin
3852+ TerminalArgs := Copy(P.Executable, SpacePos+1);
3853+ P.Executable := Copy(P.Executable, 1, SpacePos-1);
3854+ if TerminalArgs.Contains('%s') then begin
3855+ TerminalArgs := StringReplace(TerminalArgs, '%s', path + cmd + ' ' + MySQLArgs, []);
3856+ P.Parameters.Add(TerminalArgs);
3857+ end
3858+ else begin
3859+ P.Parameters.Add(TerminalArgs);
3860+ P.Parameters.Add(path + cmd + ' ' + MySQLArgs);
3861+ end;
3862+ end
3863+ else begin
3864+ P.Parameters.Add('-e');
3865+ P.Parameters.Add(path + cmd + ' ' + MySQLArgs);
3866+ end;
3867+ end;
38163868 P.Options := P.Options + [poWaitOnExit];
3817-
3818- {$ElseIf defined(DARWIN)}
3819- P.Executable := '/usr/bin/open';
3820- P.Parameters.Add('-a');
3821- P.Parameters.Add('Terminal');
3822- P.Parameters.Add(path + cmd + ' ' + Conn.Parameters.GetExternalCliArguments(Conn, nbFalse));
38233869 {$ENDIF}
38243870
38253871 P.Execute;
3826- finally
3827- P.Free;
3872+ except
3873+ on E:Exception do
3874+ ErrorDialog(E.Message);
38283875 end;
3876+ P.Free;
38293877
38303878 end;
38313879 end;
0 commit comments