Skip to content

Commit 613e207

Browse files
committed
feat: create custom setting so the user may define a terminal app himself, and auto-detect terminal app if the setting is yet empty
Refs #2363
1 parent 6ce846b commit 613e207

File tree

4 files changed

+223
-114
lines changed

4 files changed

+223
-114
lines changed

source/apphelpers.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ TWinControlHelper = class helper for TWinControl
208208
asCopyTableWindowHeight, asCopyTableWindowWidth, asCopyTableColumns, asCopyTableKeys, asCopyTableForeignKeys,
209209
asCopyTableData, asCopyTableRecentFilter, asServerVersion, asServerVersionFull, asLastConnect,
210210
asConnectCount, asRefusedCount, asSessionCreated, asDoUsageStatistics,
211-
asLastUsageStatisticCall, asWheelZoom, asDisplayBars, asMySQLBinaries, asCustomSnippetsDirectory,
211+
asLastUsageStatisticCall, asWheelZoom, asDisplayBars, asMySQLBinaries, asTerminal, asCustomSnippetsDirectory,
212212
asPromptSaveFileOnTabClose, asRestoreTabs, asTabCloseOnDoubleClick, asTabCloseOnMiddleClick, asTabsInMultipleLines, asTabIconsGrayscaleMode,
213213
asWarnUnsafeUpdates, asQueryGridLongSortRowNum,
214214
asCompletionProposal, asCompletionProposalInterval, asCompletionProposalSearchOnMid, asCompletionProposalWidth, asCompletionProposalNbLinesInWindow, asAutoUppercase,
@@ -3769,6 +3769,7 @@ constructor TAppSettings.Create;
37693769
InitSetting(asWheelZoom, 'WheelZoom', 0, True);
37703770
InitSetting(asDisplayBars, 'DisplayBars', 0, true);
37713771
InitSetting(asMySQLBinaries, 'MySQL_Binaries', 0, False, '');
3772+
InitSetting(asTerminal, 'Terminal', 0, False, '');
37723773
InitSetting(asSequalSuggestWindowWidth, 'SequalSuggestWindowWidth', 500);
37733774
InitSetting(asSequalSuggestWindowHeight, 'SequalSuggestWindowHeight', 400);
37743775
InitSetting(asSequalSuggestPrompt, 'SequalSuggestPrompt', 0, False, '');

source/main.pas

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3782,9 +3782,38 @@ procedure TMainForm.actDropObjectsExecute(Sender: TObject);
37823782

37833783
procedure TMainForm.actLaunchCommandlineExecute(Sender: TObject);
37843784
var
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+
37883817
begin
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

Comments
 (0)