1
0
mirror of https://github.com/mintty/wsltty.git synced 2025-11-04 00:51:52 +00:00

Compare commits

...

19 Commits
3.3.0 ... 3.4.7

Author SHA1 Message Date
mintty
a332cf8eaa 3.4.7 2021-03-18 19:38:25 +01:00
mintty
07aa6c692d fix rebased patch; restore backend patch part 2021-03-18 19:38:07 +01:00
mintty
74dad091ce rebase patch; add setlocale patch (#273) 2021-03-16 12:07:18 +01:00
mintty
8d896ceb36 3.4.5 2021-02-17 14:29:07 +01:00
mintty
90cf6f5d15 align install file names for better sorting in release area (fixed) 2020-12-27 18:57:32 +01:00
mintty
2cd6d190d6 align install file names for better sorting in release area 2020-12-20 23:24:36 +01:00
mintty
38b8a5e93d 3.4.4 2020-12-20 23:12:13 +01:00
mintty
105d0b4ec5 uninstall: skip backend stuff, fix del parameters (~#263) 2020-11-13 12:35:13 +01:00
mintty
6c5a0f1fba support and describe local installation (from repository) without installer 2020-11-13 12:14:40 +01:00
mintty
f31eae1a41 add missing patch to repository 2020-11-12 14:33:51 +01:00
mintty
600e6e69ba instructions for installation from archive (#250) 2020-11-11 12:06:01 +01:00
mintty
9c9b88d416 3.4.3 2020-11-11 11:59:08 +01:00
mintty
9feb6b7187 build also cab file to circumvent anti-virus issues with installer (#250) 2020-11-11 11:49:57 +01:00
mintty
416fcd1d0d 3.4.2 2020-11-04 18:39:06 +01:00
mintty
2457a1fb10 doc build (#247) 2020-10-24 17:39:42 +02:00
mintty
8e09414b4b 3.4.1 2020-10-24 17:22:10 +02:00
mintty
4a0b7328da document uninstallation (#258) 2020-10-13 14:53:25 +02:00
mintty
afd3d6d9e8 hint to workaround for #197;
some minor tweaks
2020-09-04 11:58:28 +02:00
mintty
9c6d75b09e add details for installation cygwin for an installation from source 2020-08-27 14:59:12 +02:00
6 changed files with 406 additions and 62 deletions

View File

@@ -0,0 +1,253 @@
diff -rup old/src/wslbridge2-backend.cpp new/src/wslbridge2-backend.cpp
--- old/src/wslbridge2-backend.cpp 2020-10-18 15:03:06.000000000 +0000
+++ new/src/wslbridge2-backend.cpp 2021-03-18 18:31:35.684184400 +0000
@@ -21,6 +21,7 @@
#include <termios.h>
#include <unistd.h>
#include <wordexp.h>
+#include <limits.h> // PIPE_BUF
#include <string>
#include <vector>
@@ -321,6 +322,9 @@ int main(int argc, char *argv[])
/* Use dupped master fd to read OR write */
const int mfd_dp = dup(mfd);
assert(mfd_dp > 0);
+#ifdef debug_to_input
+ FILE * debug = fdopen(mfd_dp, "w"); // for fprintf
+#endif
struct pollfd fds[] = {
{ ioSockets.inputSock, POLLIN, 0 },
@@ -330,6 +334,7 @@ int main(int argc, char *argv[])
ssize_t readRet = 0, writeRet = 0;
char data[1024]; /* Buffer to hold raw data from pty */
+ assert(sizeof data <= PIPE_BUF);
do
{
@@ -340,8 +345,86 @@ int main(int argc, char *argv[])
if (fds[0].revents & POLLIN)
{
readRet = recv(ioSockets.inputSock, data, sizeof data, 0);
- if (readRet > 0)
- writeRet = write(mfd_dp, data, readRet);
+
+ char * s = data;
+ int len = readRet;
+ writeRet = 1;
+ while (writeRet > 0 && len > 0)
+ {
+ if (!*s)
+ {
+ // dispatch NUL escaped inband information
+ s++;
+ len--;
+
+ if (len < 9 && s + 9 >= data + sizeof data)
+ {
+ // make room for additional loading
+ memcpy(data, s, len);
+ s = data;
+ }
+
+ // ensure 1 more byte is loaded to dispatch on
+ if (!len)
+ {
+ readRet = recv(ioSockets.inputSock, s, 1, 0);
+ if (readRet > 0)
+ {
+ len += readRet;
+ }
+ else
+ {
+ writeRet = -1;
+ break;
+ }
+ }
+ if (*s == 2)
+ {
+ // STX: escaped NUL
+ s++;
+ len--;
+ writeRet = write(mfd_dp, "", 1);
+ }
+ else if (*s == 16)
+ {
+ // DLE: terminal window size change
+ s++;
+ len--;
+ // ensure 8 more bytes are loaded for winsize
+ while (readRet > 0 && len < 8)
+ {
+ readRet = recv(ioSockets.inputSock, s + len, 8 - len, 0);
+ if (readRet > 0)
+ {
+ len += readRet;
+ }
+ }
+ if (readRet <= 0)
+ {
+ writeRet = -1;
+ break;
+ }
+ struct winsize * winsp = (struct winsize *)s;
+ s += 8;
+ len -= 8;
+ winsp->ws_xpixel = 0;
+ winsp->ws_ypixel = 0;
+ ret = ioctl(mfd, TIOCSWINSZ, winsp);
+ if (ret != 0)
+ perror("ioctl(TIOCSWINSZ)");
+ }
+ }
+ else
+ {
+ int n = strnlen(s, len);
+ writeRet = write(mfd_dp, s, n);
+ if (writeRet > 0)
+ {
+ s += writeRet;
+ len -= writeRet;
+ }
+ }
+ }
}
/* Resize window when buffer received in control socket */
diff -rup old/src/wslbridge2.cpp new/src/wslbridge2.cpp
--- old/src/wslbridge2.cpp 2020-10-18 15:03:06.000000000 +0000
+++ new/src/wslbridge2.cpp 2021-02-26 17:45:28.437040700 +0000
@@ -57,32 +57,85 @@ union IoSockets
/* global variable */
static union IoSockets g_ioSockets = { 0, 0, 0 };
+
+#define dont_debug_inband
+#define dont_use_controlsocket
+
static void resize_window(int signum)
{
+#ifdef use_controlsocket
+#warning this may crash for unknown reason, maybe terminate the backend
struct winsize winp;
+ ioctl(STDIN_FILENO, TIOCGWINSZ, &winp);
/* Send terminal window size to control socket */
- ioctl(STDIN_FILENO, TIOCGWINSZ, &winp);
send(g_ioSockets.controlSock, &winp, sizeof winp, 0);
+#else
+ static char wins[2 + sizeof(struct winsize)] = {0, 16};
+ static struct winsize * winsp = (struct winsize *)&wins[2];
+ ioctl(STDIN_FILENO, TIOCGWINSZ, winsp);
+
+#ifdef debug_inband
+ /* Send terminal window size inband, visualized as ESC sequence */
+ char resizesc[55];
+ //sprintf(resizesc, "\e_8;%u;%u\a", winsp->ws_row, winsp->ws_col);
+ sprintf(resizesc, "^[_8;%u;%u^G", winsp->ws_row, winsp->ws_col);
+ send(g_ioSockets.inputSock, resizesc, strlen(resizesc), 0);
+#else
+ /* Send terminal window size inband, with NUL escape */
+ send(g_ioSockets.inputSock, wins, sizeof wins, 0);
+#endif
+#endif
}
static void* send_buffer(void *param)
{
int ret;
char data[1024];
-
- struct pollfd fds = { STDIN_FILENO, POLLIN, 0 };
+ assert(sizeof data <= PIPE_BUF);
while (1)
{
+#ifdef use_poll
+ // we could poll on a single channel but we don't need to
+ static struct pollfd fds = { STDIN_FILENO, POLLIN, 0 };
ret = poll(&fds, 1, -1);
if (fds.revents & POLLIN)
+#else
+ if (1)
+#endif
{
ret = read(STDIN_FILENO, data, sizeof data);
- if (ret > 0)
- ret = send(g_ioSockets.inputSock, data, ret, 0);
- else
+
+ char * s = data;
+ int len = ret;
+ while (ret > 0 && len > 0)
+ {
+ if (!*s)
+ {
+ // send NUL STX
+#ifdef debug_inband
+ ret = send(g_ioSockets.inputSock, (void*)"nul", 3, 0);
+#else
+ static char NUL_STX[] = {0, 2};
+ ret = send(g_ioSockets.inputSock, NUL_STX, 2, 0);
+#endif
+ s++;
+ len--;
+ }
+ else
+ {
+ int n = strnlen(s, len);
+ ret = send(g_ioSockets.inputSock, s, n, 0);
+ if (ret > 0)
+ {
+ s += ret;
+ len -= ret;
+ }
+ }
+ }
+ if (ret <= 0)
break;
}
}
@@ -164,6 +217,7 @@ int main(int argc, char *argv[])
if (GetWindowsBuild() < 17763)
fatal("Windows 10 version is older than minimal requirement.\n");
+ setlocale(LC_ALL, "");
#ifdef __CYGWIN__
cygwin_internal(CW_SYNC_WINENV);
#endif
@@ -529,13 +583,6 @@ int main(int argc, char *argv[])
g_ioSockets.controlSock = AcceptLocSock(controlSocket);
}
- /* Create thread to send window size through control socket */
- struct sigaction act = {};
- act.sa_handler = resize_window;
- act.sa_flags = SA_RESTART;
- ret = sigaction(SIGWINCH, &act, NULL);
- assert(ret == 0);
-
/* Create thread to send input buffer to input socket */
pthread_t tidInput;
ret = pthread_create(&tidInput, nullptr, send_buffer, nullptr);
@@ -548,6 +595,17 @@ int main(int argc, char *argv[])
termState.enterRawMode();
+ /* Create thread to send window size through control socket */
+ struct sigaction act = {};
+ act.sa_handler = resize_window;
+ act.sa_flags = SA_RESTART;
+ ret = sigaction(SIGWINCH, &act, NULL);
+ assert(ret == 0);
+
+ /* Notify initial size in case it's changed since starting */
+ //resize_window(0);
+ kill(getpid(), SIGWINCH);
+
/*
* wsltty#254: WORKAROUND: Terminates input thread forcefully
* when output thread exits. Need some inter-thread syncing.

View File

@@ -35,11 +35,23 @@ You may need to open the Properties of the installer first, tab “General”
section “Security” (if available) and select “Unblock”,
to enable the “Run anyway” button.
#### Installation from archive ####
In case a local anti-virus guard barfs about the wsltty installer, the
release also contains a `.cab` file. Download it, open it, extract its files
to some temporary deployment directory, and invoke `install.bat` from there.
#### Installation from source repository ####
Checkout the wsltty repository, or download the source archive, unpack and rename the directory to `wsltty`.
Invoke `make`, then `make install`.
Note this has to be done within a Cygwin environment.
Install Alpine WSL from the Microsoft Store.
Invoke `make build`, then `make install`.
Note this has to be done within a Cygwin environment. A minimal Cygwin
environment for this purpose would be installed with the
[Cygwin installer](https://cygwin.com/setup-x86_64.exe)
from [cygwin.com](https://cygwin.com/),
with additional packages `make`, `gcc-g++`, `unzip`, `zoo`, `patch`, (`lcab`).
#### Installation to non-default locations ####
@@ -74,7 +86,12 @@ then, invoke one of
A Windows Appx package and certificate is available in the [wsltty.appx](https://github.com/mintty/wsltty.appx/) repository.
<br clear=all>
### Uninstallation ###
To uninstall wsltty desktop, start menu, and context menu integration:
Open a Windows `cmd`, go into the wsltty installation folder:
`cd %LOCALAPPDATA%\wsltty` and run the `uninstall` script.
To uninstall wsltty software completely, remove the installation folder manually.
---
@@ -105,6 +122,21 @@ If wsltty fails with an error message that mentions a disk mount path (e.g. `/mn
workarounds may be the shutdown of the WSL V2 virtual machine (`wsl --shutdown` on the distro)
or turning off “fast startup” in the Windows power settings (#246, #248).
#### WSL shell starting issues ####
With WSL V2, an additional background shell is run which may cause trouble
for example when setting up automatic interaction between Windows side and
WSL side
(see https://github.com/mintty/wsltty/issues/197#issuecomment-687030527).
As a workaround, the following may be added to (the beginning of) the
WSL shell initialization script `.bashrc` (adapt for other shells):
```
# work around https://github.com/mintty/wsltty/issues/197
if [[ -n "$WSL_DISTRO_NAME" ]]; then
command -v cmd.exe > /dev/null || exit
fi
```
---
### Configuration ###
@@ -112,7 +144,7 @@ or turning off “fast startup” in the Windows power settings (#246, #248).
#### Start Menu and Desktop shortcuts ####
In the Start Menu, the following shortcuts are installed:
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`)
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig` or `wsl -s`)
* For each installed WSL distribution, for example `Ubuntu`, a shortcut like <img align=absmiddle height=40 src=ubuntu1.png>`Ubuntu Terminal` to start in the WSL user home
In the Start Menu subfolder WSLtty, the following additional shortcuts are installed:
@@ -120,7 +152,7 @@ In the Start Menu subfolder WSLtty, the following additional shortcuts are insta
* For each installed WSL distribution, for example `Ubuntu`, a shortcut like <img align=absmiddle height=40 src=ubuntu1.png>`Ubuntu Terminal %` to start in the Windows %USERPROFILE% home
One Desktop shortcut is installed:
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`)
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig` or `wsl -s`)
Other, distribution-specific shortcuts can be copied to the desktop
from the Start Menu if desired.
@@ -181,7 +213,7 @@ with the following precedence:
* `%LOCALAPPDATA%\wsltty\etc\minttyrc` (usage deprecated with wsltty)
Note:
* `%APPDATA%\wsltty\config` is the new user configuration file location.
* `%APPDATA%\wsltty\config` is the user configuration file location.
Further subdirectories of `%APPDATA%\wsltty` are used for language,
themes, and sounds resource configuration.
Note the distinction from `%LOCALAPPDATA%\wsltty` which is the default
@@ -193,7 +225,7 @@ Note:
root directory of the cygwin standalone installation hosting wsltty.
So `%HOME%` would mean `%LOCALAPPDATA%\wsltty\home\%USERNAME%`.
If you define `HOME` at Windows level, this changes accordingly.
Note, however, that the WSL `HOME` is a completely different setting.
Note, however, that the WSL `$HOME` is a completely different setting.
#### Shell selection and Login shell ####
@@ -211,6 +243,24 @@ a shell pathname and an optional `-l` parameter
---
### WSL locale setup and character encoding ###
Character encoding setup by locale setting is propagated from the terminal
towards WSL. So you can select your favourite locale with configuration
options or with command-line options, for example in a copied dedicated
desktop shortcut.
If for example you wish to run WSL in GB18030 encoding, you may set options
`Locale=zh_CN` and `Charset=GB18030` and the WSL shell will adopt that
setting, provided that the selected locale is configured to be available
in the locale database of the WSL distribution.
This can be achieved in Ubuntu with the following commands:
* `sudo mkdir -p /var/lib/locales/supported.d`
* `sudo echo zh_CN.GB18030 GB18030 >> /var/lib/locales/supported.d/local`
* `sudo locale-gen`
---
### Components and Credits ###
For mintty, see the [Mintty homepage](http://mintty.github.io/)

View File

@@ -1 +1 @@
3.3.0
3.4.7

View File

@@ -14,10 +14,10 @@ copy () {
}
delete () {
from=/F
to="$1"
from="$1"
to="$1" # same again, to fill parameter
export from to
cmd /c cmd2.bat del
cmd /c cmd2.bat del/F
}
compare () {
@@ -291,7 +291,7 @@ config () {
echoc "- root $root"
wdir=%USERPROFILE%
if $ok && [ -n "$distro" ]
if $ok && ! $remove && [ -n "$distro" ]
then # fix #163: backend missing +x with certain mount options
echo Setting +x wslbridge2 backends for distro "'$distro'"
(cd "$INSTDIR"; cd bin; PATH="${WINDIR}/Sysnative:${PATH}" wsl.exe -d "$distro" chmod +x wslbridge2-backend)

139
makefile
View File

@@ -4,25 +4,51 @@
# make targets:
# make [all] build a distributable installer (default)
# make pkg build an installer, bypassing the system checks
# make build build the software (no installer)
# make install install wsltty locally from build (no installer needed)
# make wsltty build the software, using the local copy of mintty
# wsltty release
ver=3.3.0
ver=3.4.7
# wsltty appx release - must have 4 parts!
verx=3.3.0.0
verx=3.4.7.0
##############################
# mintty release version
minttyver=3.3.0
# wslbridge2 release version
#repo=Biswa96/wslbridge2
#wslbridgever=0.5
minttyver=3.4.7
##############################
# wslbridge2 repository
repo=Biswa96/wslbridge2
# wslbridge2 master release version
wslbridgever=0.6
# wslbridge2 latest version
#archive=master
#wslbridgedir=wslbridge2-$(archive)
# wslbridge2 branch or commit version (from fix-window-resize branch) and dir
#commit=70e0dcea1db122d076ce1578f2a45280cc92d09f
#commit=8b6dd7ee2b3102d72248990c21764c5cf86c6612
#archive=$(commit)
#wslbridgedir=wslbridge2-$(archive)
# wslbridge2 fork repository and version
#repo=mintty/wslbridge2
#wslbridgever=0.5.1
# wslbridge2 release or fork archive and dir
archive=v$(wslbridgever)
wslbridgedir=wslbridge2-$(wslbridgever)
repo=mintty/wslbridge2
wslbridgever=0.5.1
##############################
@@ -108,7 +134,7 @@ fix-verx:
# clear binaries
clean:
rm -fr wslbridge2-$(wslbridgever)/bin
rm -fr $(wslbridgedir)/bin
rm -fr bin
#############################################################################
@@ -116,20 +142,22 @@ clean:
wslbridge: $(wslbridge)
wslbridge2-$(wslbridgever).zip:
$(wgeto) https://github.com/$(repo)/archive/v$(wslbridgever).zip -o wslbridge2-$(wslbridgever).zip
$(wslbridgedir).zip:
$(wgeto) https://github.com/$(repo)/archive/$(archive).zip -o $(wslbridgedir).zip
wslbridge-source: wslbridge2-$(wslbridgever).zip
unzip -ou wslbridge2-$(wslbridgever).zip
cp wslbridge2-$(wslbridgever)/LICENSE LICENSE.wslbridge2
wslbridge-source: $(wslbridgedir).zip
unzip -o $(wslbridgedir).zip
cp $(wslbridgedir)/LICENSE LICENSE.wslbridge2
# patch
cd $(wslbridgedir); patch -p1 < ../0001-notify-size-change-inband.patch
wslbridge-frontend: wslbridge-source
echo ------------- Compiling wslbridge2 frontend
mkdir -p bin
# frontend build
cd wslbridge2-$(wslbridgever)/src; make -f Makefile.frontend RELEASE=1
cd $(wslbridgedir)/src; make -f Makefile.frontend RELEASE=1
# extract binaries
cp wslbridge2-$(wslbridgever)/bin/wslbridge2.exe bin/
cp $(wslbridgedir)/bin/wslbridge2.exe bin/
windir=$(shell cd "${WINDIR}"; pwd)
@@ -140,9 +168,9 @@ wslbridge-backend: wslbridge-source
# provide dependencies for backend build
PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe -u root $(BuildDistr) $(shell env | grep http_proxy=) apk add make g++ linux-headers < /dev/null
# invoke backend build
cd wslbridge2-$(wslbridgever)/src; PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe $(BuildDistr) make -f Makefile.backend RELEASE=1 < /dev/null
cd $(wslbridgedir)/src; PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe $(BuildDistr) make -f Makefile.backend RELEASE=1 < /dev/null
# extract binaries
cp wslbridge2-$(wslbridgever)/bin/wslbridge2-backend bin/
cp $(wslbridgedir)/bin/wslbridge2-backend bin/
mintty-get:
$(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip
@@ -214,38 +242,48 @@ appx-bin:
cp /bin/cygwin1.dll bin/
cp /bin/cygwin-console-helper.exe bin/
cop: ver
mkdir -p rel
rm -f rel/wsltty-$(ver)-install-$(arch).exe
sed -e "s,%version%,$(ver)," -e "s,%arch%,$(arch)," makewinx.cfg > rel/wsltty.SED
cp bin/cygwin1.dll rel/
cp bin/cygwin-console-helper.exe rel/
cp bin/dash.exe rel/
cp bin/regtool.exe rel/
cp bin/mintty.exe rel/
cp bin/zoo.exe rel/
cp lang.zoo rel/
cp themes.zoo rel/
cp sounds.zoo rel/
cp charnames.txt rel/
cp bin/wslbridge2.exe rel/
cp bin/wslbridge2-backend rel/
cp mkshortcut.vbs rel/
#cp bin/mkshortcut.exe rel/
#cp bin/cygpopt-0.dll rel/
#cp bin/cygiconv-2.dll rel/
#cp bin/cygintl-8.dll rel/
cp LICENSE.* rel/
cp VERSION rel/
cp *.lnk rel/
cp *.ico rel/
cp *.url rel/
cp *.bat rel/
cp *.sh rel/
cp *.vbs rel/
CAB=wsltty-$(ver)-$(arch)
cab: cop
copcab: ver
mkdir -p $(CAB)
cp bin/cygwin1.dll $(CAB)/
cp bin/cygwin-console-helper.exe $(CAB)/
cp bin/dash.exe $(CAB)/
cp bin/regtool.exe $(CAB)/
cp bin/mintty.exe $(CAB)/
cp bin/zoo.exe $(CAB)/
cp lang.zoo $(CAB)/
cp themes.zoo $(CAB)/
cp sounds.zoo $(CAB)/
cp charnames.txt $(CAB)/
cp bin/wslbridge2.exe $(CAB)/
cp bin/wslbridge2-backend $(CAB)/
cp mkshortcut.vbs $(CAB)/
#cp bin/mkshortcut.exe $(CAB)/
#cp bin/cygpopt-0.dll $(CAB)/
#cp bin/cygiconv-2.dll $(CAB)/
#cp bin/cygintl-8.dll $(CAB)/
cp LICENSE.* $(CAB)/
cp VERSION $(CAB)/
cp *.lnk $(CAB)/
cp *.ico $(CAB)/
cp *.url $(CAB)/
cp *.bat $(CAB)/
cp config-distros.sh $(CAB)/
cp mkshortcut.vbs $(CAB)/
cop: copcab
mkdir -p rel
cp -fl $(CAB)/* rel/
installer: cop
# prepare build of installer
rm -f rel/$(CAB)-install.exe
sed -e "s,%version%,$(ver)," -e "s,%arch%,$(arch)," makewinx.cfg > rel/wsltty.SED
# build installer
cd rel; iexpress /n wsltty.SED
# build cab archive
lcab -r $(CAB) rel/$(CAB).cab
install: cop installbat
@@ -262,8 +300,11 @@ mintty-usr: mintty-get mintty-appx
# local wsltty build target:
wsltty: wslbridge cygwin mintty-build mintty-pkg
# build software without installer:
build: wslbridge cygwin mintty-get mintty-build mintty-pkg
# standalone wsltty package build target:
pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg cab
pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg installer
# appx package contents target:
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx

View File

@@ -26,7 +26,7 @@ SourceFiles=SourceFiles
InstallPrompt=Install Mintty terminal for WSL (Windows Subsystem for Linux)?
DisplayLicense=
FinishMessage=Mintty for WSL installed - for documentation and configuration see https://github.com/mintty/wsltty
TargetName=wsltty-%version%-install-%arch%.exe
TargetName=wsltty-%version%-%arch%-install.exe
FriendlyName=wsltty
AppLaunched=cmd.exe /c install.bat
PostInstallCmd=<None>