Skip to content

Commit

Permalink
Add support of edit /etc/wsl.conf (#4)
Browse files Browse the repository at this point in the history
  • Loading branch information
emeric-martineau authored Jun 5, 2022
1 parent 29a52ee commit 6d9b332
Show file tree
Hide file tree
Showing 16 changed files with 656 additions and 177 deletions.
14 changes: 13 additions & 1 deletion DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,19 @@ when you double click, a window with run command, stdout and stderr
## Edit wslconfig file

In tool bar, click on:

![WSLConfig toolbar button](images/screenshot/edit-wslconfig-file-toolbar.jpg)

then a new window is displayed:
![WSLConfig](images/screenshot/edit-wslconfig-file)

![WSLConfig](images/screenshot/edit-wslconfig-file.jpg)

## Edit /etc/wsl.conf file

On runnig distribution, right click on :

![Popup menu](images/screenshot/edit-etc-wsl-conf-popup-menu.jpg)

then a new window is displayed:

![WSLConfig Etc WSL.conf](images/screenshot/edit-etc-wsl-conf.jpg)
1 change: 0 additions & 1 deletion TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,5 @@

# Misc

* Edit /etc/wsl.conf of a distribution
* Save size & position of main window
* Add i18n support
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/screenshot/edit-etc-wsl-conf.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/images/info.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 48 additions & 11 deletions src/mainwindow.lfm
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
object WslGuiToolMainWindow: TWslGuiToolMainWindow
Left = 2924
Left = -1772
Height = 441
Top = 376
Width = 722
Top = 301
Width = 720
Caption = 'WSL GUI Tool'
ClientHeight = 441
ClientWidth = 722
ClientWidth = 720
DesignTimePPI = 120
Icon.Data = {
47AC01000000010006000000000001002000D926000066000000808000000100
Expand Down Expand Up @@ -3447,7 +3447,7 @@ object WslGuiToolMainWindow: TWslGuiToolMainWindow
Left = 0
Height = 69
Top = 0
Width = 722
Width = 720
ButtonHeight = 64
ButtonWidth = 65
Caption = 'ToolBar1'
Expand Down Expand Up @@ -3546,20 +3546,20 @@ object WslGuiToolMainWindow: TWslGuiToolMainWindow
Caption = 'ToolButton1'
Style = tbsSeparator
end
object ToolButton3: TToolButton
object ToolButtonWslconfigEdit: TToolButton
Left = 464
Hint = 'Edit global .wslconfig file'
Top = 2
Caption = 'ToolButtonWslconfigEdit'
Caption = 'Edit global WSL config'
ImageIndex = 9
OnClick = ToolButton3Click
OnClick = ToolButtonWslconfigEditClick
end
end
object WslDistributionList: TListView
Left = 0
Height = 372
Top = 69
Width = 722
Width = 720
Align = alClient
AutoSortIndicator = True
Columns = <
Expand Down Expand Up @@ -5207,6 +5207,11 @@ object WslGuiToolMainWindow: TWslGuiToolMainWindow
Enabled = False
OnClick = PopupMenuDefaultClick
end
object PopupMenuEditEtcWslConf: TMenuItem
Caption = '&Edit /etc/wsl.conf'
Enabled = False
OnClick = PopupMenuEditEtcWslConfClick
end
end
object ImageListPopupMenu: TImageList
Left = 72
Expand Down Expand Up @@ -5360,7 +5365,7 @@ object WslGuiToolMainWindow: TWslGuiToolMainWindow
Left = 240
Top = 312
Bitmap = {
4C69060000001000000010000000101010FF060606FF060606FF060606FF0606
4C69070000001000000010000000101010FF060606FF060606FF060606FF0606
06FF060606FF060606FF060606FF060606FF060606FF060606FF060606FF0606
06FF060606FF0E0E0EFF0E0E0E060A0A0AFF1E1E1EBB21212163212121632121
2163212121632121216321212163212121632121216321212163212121632121
Expand Down Expand Up @@ -5552,7 +5557,39 @@ object WslGuiToolMainWindow: TWslGuiToolMainWindow
FFFF0101DAC800008C780101604F0101604F00008A770000DAC50000FFFF0000
BD9C00001A0A0000000000000000000000000000000000000000000000000101
51320303B09A0101EFDA0202FDFD0202FDFD0101F3DA0101B397010151320000
0200000000000000000000000000
0200000000000000000000000000000000000000000000000000000000005F3A
0C62F59721FCF39621FFF39620FFF39520FFF39620FFF39520FB673F0D6D1E12
041E000000000000000000000000000000000000000000000000B57B1BB5F496
20FFF39621FFF39621FFF39620FFF39620FFF39620FFF39620FFF29520FFD38A
1ED70000000000000000000000000000000000000000C5791AC9F39621FFF396
21FFF39721FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF396
21FFC27719C9251604150000000000000000B5771AB5F39620FFF39621FFF396
21FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF396
21FFF49621FFEF9F23EF000000005B380C62F19520FFF39621FFF39621FFF396
21FFF39621FFF39621FFF9C380FFF9C380FFF39621FFF39621FFF39621FFF396
21FFF39621FFF29520FF5E3A0C62F19420FBF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF7B96AFFF7B96AFFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF49620FBF39621FFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFFBD7AAFFFBD7AAFFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF39620FFF39621FFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFFBD7AAFFFBD7AAFFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF39620FFF39620FFF39620FFF39621FFF39621FFF396
21FFF39621FFF39621FFFBD7AAFFFBD7AAFFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF39620FFF49620FCF39620FFF39621FFF39621FFF396
21FFF39621FFF39621FFFBD7AAFFFBD7AAFFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FFF39520FA68400D6EF39620FFF39621FFF39621FFF396
21FFF39621FFF39621FFFBD7AAFFFBD7AAFFF39621FFF39621FFF39621FFF396
21FFF39621FFF39621FF67400D6D1E12041ED38A1ED7F39621FFF39621FFF396
21FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF396
21FFF39621FFFAA223FF1E12041E0000000000000000C17719C9F39621FFF396
21FFF39721FFF39621FFF39621FFF39621FFF39621FFF39721FFF39621FFF396
20FFC47819C9150D0215000000000000000000000000150C0215ED9621EFF396
21FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFF39621FFFAA1
23FF150D02150000000000000000000000000000000000000000000000005D3A
0C61F19520FAF39621FFF39621FFF39621FFF39520FFF39620FA673F0D6D1D12
041E000000000000000000000000
}
end
end
59 changes: 54 additions & 5 deletions src/mainwindow.pas
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ interface
// Process
BackgroundProcessProgressBar, Process, processresultdisplay,
// Wslconfig
WslConfigEditWindow;
WslConfigGlobal, WslconfigParameterCtrl, WslConfigEditWindow,
// /etc/wsl.conf
WslConfigDistribution;

type

Expand All @@ -27,6 +29,7 @@ TWslGuiToolMainWindow = class(TForm)
IconListWslDistributionList: TImageList;
ImageListStatusbar: TImageList;
ImageListPopupMenu: TImageList;
PopupMenuEditEtcWslConf: TMenuItem;
PopupMenuRunCommandWithUser: TMenuItem;
PopupMenuProperties: TMenuItem;
PopupMenuDefault: TMenuItem;
Expand All @@ -36,7 +39,7 @@ TWslGuiToolMainWindow = class(TForm)
ExportDialog: TSaveDialog;
TimerRefreshDistributionList: TTimer;
ToolButton1: TToolButton;
ToolButton3: TToolButton;
ToolButtonWslconfigEdit: TToolButton;
ToolButtonDuplicate: TToolButton;
ToolButtonUnregisterDistribution: TToolButton;
ToolButtonExport: TToolButton;
Expand All @@ -56,11 +59,12 @@ TWslGuiToolMainWindow = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormWindowStateChange(Sender: TObject);
procedure PopupMenuDefaultClick(Sender: TObject);
procedure PopupMenuEditEtcWslConfClick(Sender: TObject);
procedure PopupMenuRunCommandWithUserClick(Sender: TObject);
procedure StatusBar1DrawPanel(StatusBar: TStatusBar; {%H-}Panel: TStatusPanel;
const Rect: TRect);
procedure TimerRefreshDistributionListTimer(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButtonWslconfigEditClick(Sender: TObject);
procedure ToolButtonAboutClick(Sender: TObject);
procedure ToolButtonDuplicateClick(Sender: TObject);
procedure ToolButtonExportClick(Sender: TObject);
Expand All @@ -84,6 +88,7 @@ TWslGuiToolMainWindow = class(TForm)
procedure SetStatusbarExport(DistributionName: string);
procedure SetStatusbarImport(DistributionName: string);
procedure SetStatusbarError(Message: string);
procedure SetStatusbarInfo(Message: string);
procedure SetStatusbarUnregister(DistributionName: string);

// Refresh distribution list
Expand Down Expand Up @@ -128,6 +133,7 @@ TWslGuiToolMainWindow = class(TForm)
STATUSBAR_OK_IMAGE_INDEX = 3;
STATUSBAR_UNREGISTER_IMAGE_INDEX = 4;
STATUSBAR_CANCEL_IMAGE_INDEX = 5;
STATUSBAR_INFO_IMAGE_INDEX = 6;

implementation

Expand Down Expand Up @@ -283,6 +289,31 @@ procedure TWslGuiToolMainWindow.PopupMenuDefaultClick(Sender: TObject);
TimerRefreshDistributionList.Enabled := true;
end;

procedure TWslGuiToolMainWindow.PopupMenuEditEtcWslConfClick(Sender: TObject);
var
WslConfigForm: TFormWslconfigEdit;
WslParameters: TWslconfigEntryParameterList;
begin
WslParameters := GenerateWslConfigForDistribution;

WslConfigForm := TFormWslconfigEdit.CreateWslConfigForm(
Self,
Format('/etc/wsl.conf of %s', [WslDistributionList.Selected.Caption]),
'\\wsl$\' + WslDistributionList.Selected.Caption + '\etc\wsl.conf',
WslParameters,
false);

if WslConfigForm.ShowModal = mrOk
then begin
UpdateEtcWslConf(WslDistributionList.Selected.Caption, WslConfigForm.Data.Text);
SetStatusbarInfo('Content of wsl.conf file was copied in /etc/wsl.conf.');
end;

WslConfigForm.Free;

WslParameters.Free;
end;

procedure TWslGuiToolMainWindow.PopupMenuRunCommandWithUserClick(Sender: TObject
);
var RunForm : TFormRunCommandWithUser;
Expand Down Expand Up @@ -339,13 +370,22 @@ procedure TWslGuiToolMainWindow.TimerRefreshDistributionListTimer(
RefreshWslDistributionInList(Sender);
end;

procedure TWslGuiToolMainWindow.ToolButton3Click(Sender: TObject);
procedure TWslGuiToolMainWindow.ToolButtonWslconfigEditClick(Sender: TObject);
var
WslConfigForm: TFormWslconfigEdit;
WslParameters: TWslconfigEntryParameterList;
begin
WslConfigForm := TFormWslconfigEdit.Create(Self);
WslParameters := GenerateWslConfigForUser;

WslConfigForm := TFormWslconfigEdit.CreateWslConfigForm(
Self,
'Global WSL2 configuration',
GetUserDir + '.wslconfig',
WslParameters);
WslConfigForm.ShowModal;
WslConfigForm.Free;

WslParameters.Free;
end;

procedure TWslGuiToolMainWindow.RefreshWslDistributionInList(Sender: TObject);
Expand Down Expand Up @@ -674,6 +714,7 @@ procedure TWslGuiToolMainWindow.ManageOneSelectedItemInListView(Item: TListItem;
ToolButtonStop.Enabled := false;
PopupMenuStop.Enabled := false;
ToolButtonDuplicate.Enabled := false;
PopupMenuEditEtcWslConf.Enabled := false;
end;

ManageOneDistributionActionWithoutState(Selected);
Expand Down Expand Up @@ -712,6 +753,7 @@ procedure TWslGuiToolMainWindow.ManageOneDistributionActionWithState(running: bo
ToolButtonStop.Enabled := running;
PopupMenuStop.Enabled := running;
PopupMenuRunCommandWithUser.Enabled := not running;
PopupMenuEditEtcWslConf.Enabled := running;
end;

procedure TWslGuiToolMainWindow.SetStatusbarExport(DistributionName: string);
Expand All @@ -735,6 +777,13 @@ procedure TWslGuiToolMainWindow.SetStatusbarError(Message: string);
BackgroundProcessProgressBar.Refresh;
end;

procedure TWslGuiToolMainWindow.SetStatusbarInfo(Message: string);
begin
StatusbarMessage := Message;
StatusbarImageIndex := STATUSBAR_INFO_IMAGE_INDEX;
BackgroundProcessProgressBar.Refresh;
end;

procedure TWslGuiToolMainWindow.SetStatusbarUnregister(DistributionName: string);
begin
StatusbarMessage := Format('Unregister distribution "%s" in progress...', [DistributionName]);
Expand Down
40 changes: 39 additions & 1 deletion src/wslcommandline.pas
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
interface

uses
Classes, SysUtils, Process, fgl, Regexpr, ComObj, ShellApi;
Classes, SysUtils, Process, fgl, Regexpr, ComObj, ShellApi, StrUtils;

type
// A WSL distribution
Expand Down Expand Up @@ -36,6 +36,8 @@ function ExportDistribution(Name: string; ExportFileName: string): TProcess;
function ImportDistribution(Name: string; InstallLocationPath: string; Version: Integer; FileName: string): TProcess;
// Unregister a distribution
function UnregisterDistribution(Name: string): TProcess;
// Update wsl.conf file
function UpdateEtcWslConf(DistributionName: string; Data: string): boolean;

implementation

Expand Down Expand Up @@ -264,5 +266,41 @@ function UnregisterDistribution(Name: string): TProcess;
Result := WslProcess;
end;

function UpdateEtcWslConf(DistributionName: string; Data: string): boolean;
var
// Use to run WSL binary
WslProcess: TProcess;
begin
Result := false;

// Remove CR
Data := ReplaceStr(Data, #13, '');

WslProcess := TProcess.Create(nil);

WslProcess.Executable := 'wsl';
WslProcess.Parameters.Add('--user');
WslProcess.Parameters.Add('root');
WslProcess.Parameters.Add('--distribution');
WslProcess.Parameters.Add(DistributionName);
WslProcess.Parameters.Add('eval');
WslProcess.Parameters.Add('echo '''+ Data + ''' > /etc/wsl.conf');

// TODO return stderr

WslProcess.Options := WslProcess.Options + [poWaitOnExit];
WslProcess.ShowWindow := swoHIDE;

WslProcess.Execute;

if WslProcess.ExitStatus = 0
then begin
Result := true;
end;

WslProcess.Free;

end;

end.

Loading

0 comments on commit 6d9b332

Please sign in to comment.