ADD: split terminal window layout option and smart terminal-panel synchronization

This commit is contained in:
Peter P. Lupo 2026-05-20 15:50:49 -04:00
commit e8ad445cdf
8 changed files with 529 additions and 32 deletions

View file

@ -10,7 +10,7 @@ set -e
# release - compile in release mode (using by default)
# path to lazbuild
export lazbuild=$(which lazbuild)
export lazbuild="$(which lazbuild) --pcp=$(pwd)/.lazarus --lazarusdir=/usr/lib/lazarus"
# Set up widgetset: gtk2 or qt or qt5 or cocoa
# Set up processor architecture: i386 or x86_64

View file

@ -62,6 +62,7 @@ type
function WriteStr(const Str: string): Integer; override;
function SetCurrentDir(const Path: String): Boolean; override;
function SetScreenSize(aCols, aRows: Integer): Boolean; override;
function GetChildPid: THandle; override;
end;
implementation
@ -217,5 +218,10 @@ begin
end;
end;
function TPtyDevice.GetChildPid: THandle;
begin
Result := FChildPid;
end;
end.

View file

@ -43,6 +43,8 @@ type
function WriteStr(const Str: string): Integer; virtual; abstract;
function SetCurrentDir(const Path: String): Boolean; virtual; abstract;
function SetScreenSize(aCols, aRows: Integer): Boolean; virtual; abstract;
function GetChildPid: THandle; virtual; abstract;
property ChildPid: THandle read GetChildPid;
property OnRxBuf: TOnRxBuf read FOnRxBuf write FOnRxBuf;
property Connected: Boolean read FConnected write SetConnected default False;
end;

View file

@ -58,6 +58,7 @@ type
function WriteStr(const Str: string): Integer; override;
function SetCurrentDir(const Path: String): Boolean; override;
function SetScreenSize(aCols, aRows: Integer): Boolean; override;
function GetChildPid: THandle; override;
end;
implementation
@ -470,5 +471,10 @@ end;
initialization
Initialize;
function TPtyDevice.GetChildPid: THandle;
begin
Result := 0; // Not fully implemented for Windows pseudo console here
end;
end.

View file

@ -1,4 +1,4 @@
{
{
Double Commander
-------------------------------------------------------------------------
Licence : GNU GPL v 2.0
@ -723,6 +723,15 @@ type
HidingTrayIcon: Boolean; // @true if the icon is in the process of hiding
nbLeft, nbRight: TFileViewNotebook;
cmdConsole: TVirtualTerminal;
pnlTermContainerLeft, pnlTermContainerRight: TPanel;
tlbTermLeft, tlbTermRight: TPanel;
cmdConsoleLeft, cmdConsoleRight: TVirtualTerminal;
splitTermLeft, splitTermRight: TSplitter;
btnTermLinkLeft, btnTermDirLeft: TSpeedButton;
btnTermLinkRight, btnTermDirRight: TSpeedButton;
FTerminalSyncTimer: TTimer;
FLastTermCwdLeft: String;
FLastTermCwdRight: String;
FCommands: TMainCommands;
FInitializedView: Boolean;
{en
@ -756,6 +765,12 @@ type
FDelayedEventCtr: Integer;
FDelayedWMMove, FDelayedWMSize: Boolean;
function GetActivePtyDevice: TCustomPtyDevice;
function GetActiveConsole: TVirtualTerminal;
procedure TerminalSyncTimerTimer(Sender: TObject);
procedure TermLinkButtonClick(Sender: TObject);
procedure TermDirButtonClick(Sender: TObject);
procedure UpdateTermSyncButtons(AIsLeft: Boolean);
procedure DelayedEvent(Data: PtrInt);
procedure CheckCommandLine(ShiftEx: TShiftState; var Key: Word);
@ -952,6 +967,8 @@ var
frmMain: TfrmMain;
onFileViewUpdated: TFileViewUpdatedHandler;
Cons: TCustomPtyDevice = nil;
ConsLeft: TCustomPtyDevice = nil;
ConsRight: TCustomPtyDevice = nil;
implementation
@ -972,6 +989,9 @@ uses
uColumnsFileView, dmHigh, uFileSourceOperationMisc
{$IFDEF MSWINDOWS}
, uShellFileSource, uNetworkThread
{$ENDIF}
{$IF DEFINED(UNIX) and not DEFINED(DARWIN)}
, BaseUnix
{$ENDIF}
;
@ -4871,11 +4891,22 @@ begin
if Assigned(onFileViewUpdated) then
onFileViewUpdated(FileView);
{if (fspDirectAccess in FileView.FileSource.GetProperties) then
if (fspDirectAccess in FileView.FileSource.GetProperties) then
begin
if gTermWindow and gTermWindowSplit then
begin
if gTermWindow and Assigned(Cons) then
Cons.Terminal.SetCurrentDir(FileView.CurrentPath);
end;}
if (TFileViewPage(FileView.NotebookPage).Notebook = nbLeft) and Assigned(ConsLeft) then
begin
if gTermSyncModeLeft = 1 then
ConsLeft.SetCurrentDir(FileView.CurrentPath);
end
else if (TFileViewPage(FileView.NotebookPage).Notebook = nbRight) and Assigned(ConsRight) then
begin
if gTermSyncModeRight = 1 then
ConsRight.SetCurrentDir(FileView.CurrentPath);
end;
end;
end;
end;
end;
@ -4919,7 +4950,20 @@ begin
FileView.SetFocus;
if (fspDirectAccess in FileView.FileSource.GetProperties) then
begin
if gTermWindow and Assigned(Cons) then
if gTermWindow and gTermWindowSplit then
begin
if (TFileViewPage(FileView.NotebookPage).Notebook = nbLeft) and Assigned(ConsLeft) then
begin
if gTermSyncModeLeft = 1 then
ConsLeft.SetCurrentDir(FileView.CurrentPath);
end
else if (TFileViewPage(FileView.NotebookPage).Notebook = nbRight) and Assigned(ConsRight) then
begin
if gTermSyncModeRight = 1 then
ConsRight.SetCurrentDir(FileView.CurrentPath);
end;
end
else if gTermWindow and Assigned(Cons) then
Cons.SetCurrentDir(FileView.CurrentPath);
end;
end;
@ -5461,37 +5505,434 @@ begin
end; // if Destination<>tclNone then
end;
procedure TfrmMain.TerminalSyncTimerTimer(Sender: TObject);
var
Target: AnsiString;
begin
if not gTermWindowSplit then Exit;
if Assigned(ConsLeft) and (gTermSyncModeLeft = 2) then
begin
{$IF DEFINED(UNIX) and not DEFINED(DARWIN)}
Target := fpReadLink('/proc/' + IntToStr(ConsLeft.ChildPid) + '/cwd');
if Target <> FLastTermCwdLeft then
begin
FLastTermCwdLeft := Target;
if (Target <> '') and (Target <> nbLeft.ActivePage.FileView.CurrentPath) then
begin
nbLeft.ActivePage.FileView.CurrentPath := Target;
end;
end;
{$ENDIF}
end;
if Assigned(ConsRight) and (gTermSyncModeRight = 2) then
begin
{$IF DEFINED(UNIX) and not DEFINED(DARWIN)}
Target := fpReadLink('/proc/' + IntToStr(ConsRight.ChildPid) + '/cwd');
if Target <> FLastTermCwdRight then
begin
FLastTermCwdRight := Target;
if (Target <> '') and (Target <> nbRight.ActivePage.FileView.CurrentPath) then
begin
nbRight.ActivePage.FileView.CurrentPath := Target;
end;
end;
{$ENDIF}
end;
end;
procedure TfrmMain.UpdateTermSyncButtons(AIsLeft: Boolean);
var
BtnLink, BtnDir: TSpeedButton;
SyncMode: Integer;
begin
if AIsLeft then
begin
BtnLink := btnTermLinkLeft;
BtnDir := btnTermDirLeft;
SyncMode := gTermSyncModeLeft;
end
else
begin
BtnLink := btnTermLinkRight;
BtnDir := btnTermDirRight;
SyncMode := gTermSyncModeRight;
end;
if not Assigned(BtnLink) or not Assigned(BtnDir) then Exit;
// Set Down states based on SyncMode
case SyncMode of
1: // Panel to Terminal
begin
BtnLink.Down := True;
BtnDir.Down := False;
end;
2: // Terminal to Panel
begin
BtnLink.Down := True;
BtnDir.Down := True;
end;
else // Detached
begin
BtnLink.Down := False;
end;
end;
// Update Captions and Hints
if BtnLink.Down then
begin
BtnLink.Caption := #$F0#$9F#$94#$97; // '🔗' (Link)
BtnLink.Hint := 'Link Enabled (Click to Unlink)';
end
else
begin
BtnLink.Caption := #$E2#$9B#$93#$EF#$B8#$8F#$E2#$80#$8D#$F0#$9F#$92#$A5; // '⛓️‍💥' (Broken Chain / Unlink)
BtnLink.Hint := 'Link Disabled (Click to Link)';
end;
if BtnDir.Down then
begin
BtnDir.Caption := #$F0#$9F#$A1#$85; // '🡅' (Arrow Up)
BtnDir.Hint := 'Sync Direction: Terminal to Panel (Click to change)';
end
else
begin
BtnDir.Caption := #$F0#$9F#$A1#$87; // '🡇' (Arrow Down)
BtnDir.Hint := 'Sync Direction: Panel to Terminal (Click to change)';
end;
end;
procedure TfrmMain.TermLinkButtonClick(Sender: TObject);
var
IsLeft: Boolean;
BtnLink, BtnDir: TSpeedButton;
begin
IsLeft := (Sender = btnTermLinkLeft);
if IsLeft then
begin
BtnLink := btnTermLinkLeft;
BtnDir := btnTermDirLeft;
end
else
begin
BtnLink := btnTermLinkRight;
BtnDir := btnTermDirRight;
end;
if BtnLink.Down then
begin
// If Link was turned ON, determine state from Direction button
if BtnDir.Down then
begin
if IsLeft then gTermSyncModeLeft := 2 else gTermSyncModeRight := 2;
end
else
begin
if IsLeft then gTermSyncModeLeft := 1 else gTermSyncModeRight := 1;
end;
// Initialize/sync immediately when turned on
if IsLeft then
begin
if (gTermSyncModeLeft = 1) and Assigned(ConsLeft) then
ConsLeft.SetCurrentDir(nbLeft.ActivePage.FileView.CurrentPath)
else if (gTermSyncModeLeft = 2) and Assigned(ConsLeft) then
FLastTermCwdLeft := ''; // Force polling timer to sync CWD immediately
end
else
begin
if (gTermSyncModeRight = 1) and Assigned(ConsRight) then
ConsRight.SetCurrentDir(nbRight.ActivePage.FileView.CurrentPath)
else if (gTermSyncModeRight = 2) and Assigned(ConsRight) then
FLastTermCwdRight := '';
end;
end
else
begin
// Link turned OFF
if IsLeft then gTermSyncModeLeft := 0 else gTermSyncModeRight := 0;
end;
UpdateTermSyncButtons(IsLeft);
end;
procedure TfrmMain.TermDirButtonClick(Sender: TObject);
var
IsLeft: Boolean;
BtnLink, BtnDir: TSpeedButton;
begin
IsLeft := (Sender = btnTermDirLeft);
if IsLeft then
begin
BtnLink := btnTermLinkLeft;
BtnDir := btnTermDirLeft;
end
else
begin
BtnLink := btnTermLinkRight;
BtnDir := btnTermDirRight;
end;
// If Link is ON, update sync mode and trigger immediate sync
if BtnLink.Down then
begin
if BtnDir.Down then
begin
if IsLeft then gTermSyncModeLeft := 2 else gTermSyncModeRight := 2;
// Sync immediately: Terminal to Panel
if IsLeft then FLastTermCwdLeft := '' else FLastTermCwdRight := '';
end
else
begin
if IsLeft then gTermSyncModeLeft := 1 else gTermSyncModeRight := 1;
// Sync immediately: Panel to Terminal
if IsLeft then
begin
if Assigned(ConsLeft) then
ConsLeft.SetCurrentDir(nbLeft.ActivePage.FileView.CurrentPath);
end
else
begin
if Assigned(ConsRight) then
ConsRight.SetCurrentDir(nbRight.ActivePage.FileView.CurrentPath);
end;
end;
end;
UpdateTermSyncButtons(IsLeft);
end;
function TfrmMain.GetActivePtyDevice: TCustomPtyDevice;
begin
if gTermWindow and gTermWindowSplit then
begin
if TFileViewPage(ActiveFrame.NotebookPage).Notebook = nbLeft then
Result := ConsLeft
else
Result := ConsRight;
end
else if gTermWindow then
Result := Cons
else
Result := nil;
end;
function TfrmMain.GetActiveConsole: TVirtualTerminal;
begin
if gTermWindow and gTermWindowSplit then
begin
if TFileViewPage(ActiveFrame.NotebookPage).Notebook = nbLeft then
Result := cmdConsoleLeft
else
Result := cmdConsoleRight;
end
else if gTermWindow then
Result := cmdConsole
else
Result := nil;
end;
procedure TfrmMain.ToggleConsole;
begin
if gTermWindow then
if gTermWindow and gTermWindowSplit then
begin
// Split terminals enabled
if not Assigned(pnlTermContainerLeft) then
begin
if not Assigned(cmdConsole) then
begin
cmdConsole:= TVirtualTerminal.Create(pgConsole);
cmdConsole.Parent:= pgConsole;
cmdConsole.Align:= alClient;
cmdConsole.ShowHint:= False;
end;
FontOptionsToFont(gFonts[dcfConsole], cmdConsole.Font); //We set the font here because if we're coming back from configuration the font in options, we'll later pass here to affect that font if ever displayed.
if not Assigned(Cons) then
begin
Cons:= TPtyDevice.Create(Self);
cmdConsole.PtyDevice:= Cons;
Cons.Connected:= True;
end;
end
else
pnlTermContainerLeft := TPanel.Create(Self);
pnlTermContainerLeft.Parent := pnlLeft;
pnlTermContainerLeft.Align := alBottom;
pnlTermContainerLeft.Height := 200;
pnlTermContainerLeft.BevelOuter := bvNone;
splitTermLeft := TSplitter.Create(Self);
splitTermLeft.Parent := pnlLeft;
splitTermLeft.Align := alBottom;
splitTermLeft.Height := 5;
splitTermLeft.ResizeAnchor := akBottom;
tlbTermLeft := TPanel.Create(Self);
tlbTermLeft.Parent := pnlTermContainerLeft;
tlbTermLeft.Align := alTop;
tlbTermLeft.Height := 24;
tlbTermLeft.BevelOuter := bvNone;
btnTermLinkLeft := TSpeedButton.Create(Self);
btnTermLinkLeft.Parent := tlbTermLeft;
btnTermLinkLeft.Align := alLeft;
btnTermLinkLeft.Width := 36;
btnTermLinkLeft.ShowHint := True;
btnTermLinkLeft.GroupIndex := 10;
btnTermLinkLeft.AllowAllUp := True;
btnTermLinkLeft.Flat := gInterfaceFlat;
btnTermLinkLeft.OnClick := @TermLinkButtonClick;
btnTermDirLeft := TSpeedButton.Create(Self);
btnTermDirLeft.Parent := tlbTermLeft;
btnTermDirLeft.Align := alLeft;
btnTermDirLeft.Width := 36;
btnTermDirLeft.ShowHint := True;
btnTermDirLeft.GroupIndex := 11;
btnTermDirLeft.AllowAllUp := True;
btnTermDirLeft.Flat := gInterfaceFlat;
btnTermDirLeft.OnClick := @TermDirButtonClick;
// Initialize the button states and captions/hints based on the loaded sync mode
UpdateTermSyncButtons(True);
cmdConsoleLeft := TVirtualTerminal.Create(pnlTermContainerLeft);
cmdConsoleLeft.Parent := pnlTermContainerLeft;
cmdConsoleLeft.Align := alClient;
cmdConsoleLeft.ShowHint := False;
end;
FontOptionsToFont(gFonts[dcfConsole], cmdConsoleLeft.Font);
if not Assigned(ConsLeft) then
begin
if Assigned(cmdConsole) then
begin
cmdConsole.Hide;
FreeAndNil(cmdConsole);
end;
FreeAndNil(Cons);
ConsLeft := TPtyDevice.Create(Self);
cmdConsoleLeft.PtyDevice := ConsLeft;
ConsLeft.Connected := True;
end;
nbConsole.Visible:= gTermWindow;
ConsoleSplitter.Visible:= gTermWindow;
if not Assigned(pnlTermContainerRight) then
begin
pnlTermContainerRight := TPanel.Create(Self);
pnlTermContainerRight.Parent := pnlRight;
pnlTermContainerRight.Align := alBottom;
pnlTermContainerRight.Height := 200;
pnlTermContainerRight.BevelOuter := bvNone;
splitTermRight := TSplitter.Create(Self);
splitTermRight.Parent := pnlRight;
splitTermRight.Align := alBottom;
splitTermRight.Height := 5;
splitTermRight.ResizeAnchor := akBottom;
tlbTermRight := TPanel.Create(Self);
tlbTermRight.Parent := pnlTermContainerRight;
tlbTermRight.Align := alTop;
tlbTermRight.Height := 24;
tlbTermRight.BevelOuter := bvNone;
btnTermLinkRight := TSpeedButton.Create(Self);
btnTermLinkRight.Parent := tlbTermRight;
btnTermLinkRight.Align := alLeft;
btnTermLinkRight.Width := 36;
btnTermLinkRight.ShowHint := True;
btnTermLinkRight.GroupIndex := 20;
btnTermLinkRight.AllowAllUp := True;
btnTermLinkRight.Flat := gInterfaceFlat;
btnTermLinkRight.OnClick := @TermLinkButtonClick;
btnTermDirRight := TSpeedButton.Create(Self);
btnTermDirRight.Parent := tlbTermRight;
btnTermDirRight.Align := alLeft;
btnTermDirRight.Width := 36;
btnTermDirRight.ShowHint := True;
btnTermDirRight.GroupIndex := 21;
btnTermDirRight.AllowAllUp := True;
btnTermDirRight.Flat := gInterfaceFlat;
btnTermDirRight.OnClick := @TermDirButtonClick;
// Initialize the button states and captions/hints based on the loaded sync mode
UpdateTermSyncButtons(False);
cmdConsoleRight := TVirtualTerminal.Create(pnlTermContainerRight);
cmdConsoleRight.Parent := pnlTermContainerRight;
cmdConsoleRight.Align := alClient;
cmdConsoleRight.ShowHint := False;
end;
FontOptionsToFont(gFonts[dcfConsole], cmdConsoleRight.Font);
if not Assigned(ConsRight) then
begin
ConsRight := TPtyDevice.Create(Self);
cmdConsoleRight.PtyDevice := ConsRight;
ConsRight.Connected := True;
end;
pnlTermContainerLeft.Visible := True;
splitTermLeft.Visible := True;
pnlTermContainerRight.Visible := True;
splitTermRight.Visible := True;
// Start polling timer for terminal-to-panel sync
if not Assigned(FTerminalSyncTimer) then
begin
FTerminalSyncTimer := TTimer.Create(Self);
FTerminalSyncTimer.Interval := 1000;
FTerminalSyncTimer.OnTimer := @TerminalSyncTimerTimer;
end;
FTerminalSyncTimer.Enabled := True;
// Destroy single terminal if it exists
if Assigned(cmdConsole) then
begin
cmdConsole.Hide;
FreeAndNil(cmdConsole);
end;
FreeAndNil(Cons);
nbConsole.Visible := False;
ConsoleSplitter.Visible := False;
end
else if gTermWindow and not gTermWindowSplit then
begin
// Single terminal enabled
if not Assigned(cmdConsole) then
begin
cmdConsole:= TVirtualTerminal.Create(pgConsole);
cmdConsole.Parent:= pgConsole;
cmdConsole.Align:= alClient;
cmdConsole.ShowHint:= False;
end;
FontOptionsToFont(gFonts[dcfConsole], cmdConsole.Font); //We set the font here because if we're coming back from configuration the font in options, we'll later pass here to affect that font if ever displayed.
if not Assigned(Cons) then
begin
Cons:= TPtyDevice.Create(Self);
cmdConsole.PtyDevice:= Cons;
Cons.Connected:= True;
end;
nbConsole.Visible := True;
ConsoleSplitter.Visible := True;
// Stop polling timer when using single terminal
if Assigned(FTerminalSyncTimer) then
FTerminalSyncTimer.Enabled := False;
// Hide/destroy split terminals
if Assigned(pnlTermContainerLeft) then
begin
pnlTermContainerLeft.Visible := False;
splitTermLeft.Visible := False;
pnlTermContainerRight.Visible := False;
splitTermRight.Visible := False;
end;
if Assigned(FTerminalSyncTimer) then
FTerminalSyncTimer.Enabled := False;
end
else
begin
// No terminal enabled
if Assigned(cmdConsole) then
begin
cmdConsole.Hide;
FreeAndNil(cmdConsole);
end;
FreeAndNil(Cons);
nbConsole.Visible := False;
ConsoleSplitter.Visible := False;
// Hide split terminals
if Assigned(pnlTermContainerLeft) then
begin
pnlTermContainerLeft.Visible := False;
splitTermLeft.Visible := False;
pnlTermContainerRight.Visible := False;
splitTermRight.Visible := False;
end;
if Assigned(FTerminalSyncTimer) then
FTerminalSyncTimer.Enabled := False;
end;
end;
procedure TfrmMain.ShowOptionsLayout(Data: PtrInt);
@ -5506,6 +5947,10 @@ begin
if MessageDlg(rsMsgTerminalDisabled, mtWarning, [mbYes, mbNo], 0, mbYes) = mrYes then
Application.QueueAsyncCall(@ShowOptionsLayout, 0);
end
else if gTermWindowSplit then
begin
// Fullscreen toggle not currently supported for split terminals
end
else if nbConsole.Height < (nbConsole.Height + pnlNotebooks.Height - 1) then
begin
nbConsole.Height := nbConsole.Height + pnlNotebooks.Height;

View file

@ -190,8 +190,22 @@ inherited frmOptionsLayout: TfrmOptionsLayout
Width = 152
BorderSpacing.Top = 2
Caption = 'Show te&rminal window'
OnChange = cbTermWindowChange
TabOrder = 18
end
object cbTermSplit: TCheckBox
AnchorSideLeft.Control = cbTermWindow
AnchorSideTop.Control = cbTermWindow
AnchorSideTop.Side = asrBottom
Left = 28
Height = 22
Top = 460
Width = 320
BorderSpacing.Left = 16
BorderSpacing.Top = 2
Caption = 'Show separate terminal under each file panel'
TabOrder = 19
end
object cbFreespaceInd: TCheckBox
AnchorSideTop.Control = cbShowShortDriveFreeSpace
AnchorSideTop.Side = asrBottom
@ -204,26 +218,26 @@ inherited frmOptionsLayout: TfrmOptionsLayout
TabOrder = 9
end
object cbProgInMenuBar: TCheckBox
AnchorSideTop.Control = cbTermWindow
AnchorSideTop.Control = cbTermSplit
AnchorSideTop.Side = asrBottom
Left = 12
Height = 22
Top = 460
Top = 484
Width = 236
BorderSpacing.Top = 2
Caption = 'Show common progress in menu bar'
TabOrder = 19
TabOrder = 20
end
object cbPanelOfOperations: TCheckBox
AnchorSideTop.Control = cbProgInMenuBar
AnchorSideTop.Side = asrBottom
Left = 12
Height = 22
Top = 484
Top = 508
Width = 248
BorderSpacing.Top = 2
Caption = 'Show panel of operation in background'
TabOrder = 20
TabOrder = 21
end
object cbShowDriveFreeSpace: TCheckBox
AnchorSideTop.Control = cbShowDrivesListButton

View file

@ -53,12 +53,14 @@ type
cbShowTabHeader: TCheckBox;
cbShowTabs: TCheckBox;
cbTermWindow: TCheckBox;
cbTermSplit: TCheckBox;
cbTwoDiskPanels: TCheckBox;
cbShowShortDriveFreeSpace: TCheckBox;
chkShowMiddleToolBar: TCheckBox;
gbScreenLayout: TGroupBox;
procedure cbShowDiskPanelChange(Sender: TObject);
procedure cbShowDriveFreeSpaceChange(Sender: TObject);
procedure cbTermWindowChange(Sender: TObject);
protected
procedure Load; override;
function Save: TOptionsEditorSaveFlags; override;
@ -88,6 +90,12 @@ begin
if not(cbShowDriveFreeSpace.Checked) then cbShowShortDriveFreeSpace.Checked:= false;
end;
procedure TfrmOptionsLayout.cbTermWindowChange(Sender: TObject);
begin
cbTermSplit.Enabled := cbTermWindow.Checked;
if not(cbTermWindow.Checked) then cbTermSplit.Checked := False;
end;
class function TfrmOptionsLayout.GetIconIndex: Integer;
begin
Result := 7;
@ -116,6 +124,8 @@ begin
cbFlatInterface.Checked := gInterfaceFlat;
cbLogWindow.Checked := gLogWindow;
cbTermWindow.Checked := gTermWindow;
cbTermSplit.Checked := gTermWindowSplit;
cbTermSplit.Enabled := gTermWindow;
cbShowDriveFreeSpace.Checked := gDriveFreeSpace;
cbFreespaceInd.Checked := gDriveInd;
cbProgInMenuBar.Checked := gProgInMenuBar;
@ -143,6 +153,7 @@ begin
gInterfaceFlat := cbFlatInterface.Checked;
gLogWindow := cbLogWindow.Checked;
gTermWindow := cbTermWindow.Checked;
gTermWindowSplit := cbTermSplit.Checked;
gDriveFreeSpace := cbShowDriveFreeSpace.Checked;
gDriveInd := cbFreespaceInd.Checked;
gProgInMenuBar := cbProgInMenuBar.Checked;

View file

@ -298,6 +298,7 @@ var
gCmdLine,
gLogWindow,
gTermWindow,
gTermWindowSplit,
gKeyButtons,
gInterfaceFlat,
gDriveInd,
@ -310,6 +311,9 @@ var
gShortFormatDriveInfo: Boolean;
gDrivesListButtonOptions: TDrivesListButtonOptions;
gSeparateTree: Boolean;
// 0 = Detach, 1 = Sync Panel->Terminal, 2 = Sync Terminal->Panel
gTermSyncModeLeft: Integer;
gTermSyncModeRight: Integer;
{ Toolbar }
gMiddleToolBarFlat,
@ -2023,6 +2027,9 @@ begin
gCmdLine := True;
gLogWindow := False;
gTermWindow := False;
gTermWindowSplit := False;
gTermSyncModeLeft := 0; // Detach
gTermSyncModeRight := 0; // Detach
gKeyButtons := True;
gInterfaceFlat := True;
gDriveInd := False;
@ -2958,6 +2965,9 @@ begin
gCmdLine := GetValue(Node, 'CmdLine', gCmdLine);
gLogWindow := GetValue(Node, 'LogWindow', gLogWindow);
gTermWindow := GetValue(Node, 'TermWindow', gTermWindow);
gTermWindowSplit := GetValue(Node, 'TermWindowSplit', gTermWindowSplit);
gTermSyncModeLeft := GetValue(Node, 'TermSyncModeLeft', gTermSyncModeLeft);
gTermSyncModeRight := GetValue(Node, 'TermSyncModeRight', gTermSyncModeRight);
gKeyButtons := GetValue(Node, 'KeyButtons', gKeyButtons);
gInterfaceFlat := GetValue(Node, 'InterfaceFlat', gInterfaceFlat);
gDriveFreeSpace := GetValue(Node, 'DriveFreeSpace', gDriveFreeSpace);
@ -3675,6 +3685,9 @@ begin
SetValue(Node, 'CmdLine', gCmdLine);
SetValue(Node, 'LogWindow', gLogWindow);
SetValue(Node, 'TermWindow', gTermWindow);
SetValue(Node, 'TermWindowSplit', gTermWindowSplit);
SetValue(Node, 'TermSyncModeLeft', gTermSyncModeLeft);
SetValue(Node, 'TermSyncModeRight', gTermSyncModeRight);
SetValue(Node, 'KeyButtons', gKeyButtons);
SetValue(Node, 'InterfaceFlat', gInterfaceFlat);
SetValue(Node, 'DriveFreeSpace', gDriveFreeSpace);