1
0
mirror of https://github.com/mintty/wsltty.git synced 2025-11-01 07:31:56 +00:00

Compare commits

...

170 Commits

Author SHA1 Message Date
Thomas Wolff
ec0b5560ee 2025-09-02 00:00:00 +00:00
mintty
2cd1819d8b 3.8.0.3 2025-08-30 00:00:00 +00:00
Thomas Wolff
bbe0dd4e56 3.8.0.2, workaround for corrupted display (mintty/mintty#1332) 2025-08-28 00:00:00 +00:00
mintty
39151ffe8e hints to prevent display corruption 2025-08-27 00:00:00 +00:00
mintty
25460e4bbd project page refers to display glitches explicitly (mintty/mintty#1332) 2025-08-26 00:00:00 +00:00
mintty
a7f1720a22 fix missing git upload 2025-08-24 00:00:00 +00:00
mintty
92210d81d7 3.8.0 2025-08-22 00:00:00 +00:00
mintty
c0094d675f 3.8.0 2025-08-22 00:00:00 +00:00
mintty
e863c572ef deploy terminfo files, in order to support pty mode for wsl.exe 2025-08-20 00:00:00 +00:00
mintty
92edf8b257 simplify installer build file 2025-08-20 00:00:00 +00:00
mintty
d09d08d518 tweak README; sort package references according to update status 2025-08-20 00:00:00 +00:00
Thomas Wolff
7074ff02b9 3.7.8 2025-03-29 00:00:00 +00:00
Thomas Wolff
4e0bbddcc0 revise command-line launch scripts, support arguments (#365) 2025-03-29 00:00:00 +00:00
Thomas Wolff
68e11e5775 revise command-line launch scripts, support arguments (#365) 2025-03-29 00:00:00 +00:00
Thomas Wolff
36c134820b 3.7.7 2024-12-21 14:34:46 +01:00
Thomas Wolff
ef2ab5f6e4 3.7.7 2024-12-21 13:59:07 +01:00
mintty
ee57a229b0 3.7.6.2 2024-12-02 14:00:14 +01:00
mintty
3c7d8f3a18 fix git handling for mintty download 2024-12-02 13:59:48 +01:00
mintty
937058f703 provide script to refresh shortcut icon after renaming installation dir (#359) 2024-11-23 12:29:17 +01:00
mintty
52b6a57e09 2024-11-23 12:23:38 +01:00
mintty
d7b4840c92 portable installation supports Unicode folder names 2024-11-23 04:52:47 +01:00
mintty
05a439b5b0 fix handling of empty/non-empty folder parameters 2024-11-23 04:52:25 +01:00
mintty
a7b8792e76 tweak portable install; support renaming installation dir (#359) 2024-11-22 17:11:02 +01:00
mintty
440fbec6c7 2024-11-22 17:09:52 +01:00
mintty
49d7a79941 support portable installation into folder with space (#359) 2024-11-22 17:09:10 +01:00
mintty
6261ec43ec supported update installation into selected folder (#359) 2024-11-22 17:07:45 +01:00
Thomas Wolff
033d9aceb2 update home page section on Requirements 2024-11-18 19:17:09 +01:00
mintty
be4e7fef44 download mintty via git; fix wsltty version info 2024-10-10 22:54:54 +02:00
mintty
a2df28017b 3.7.6 2024-10-10 22:35:16 +02:00
mintty
09972471b9 add rluetzner's patch Get VmId from registry (#356) 2024-10-10 22:33:39 +02:00
mintty
c13340b328 decouple wslbridge build from download to support build of patched version 2024-10-10 22:32:18 +02:00
mintty
8d7ffa75bb 3.7.5 2024-09-17 10:56:47 +02:00
mintty
305fd0f273 2024-09-17 10:56:29 +02:00
mintty
fb1bf601e9 3.7.4 2024-07-03 19:23:59 +02:00
mintty
adc7036609 3.7.3 2024-06-29 00:08:29 +02:00
mintty
fef944e1bb 3.7.2 2024-06-27 05:23:41 +02:00
mintty
d40e5919af 3.7.1 2024-02-24 21:53:35 +01:00
mintty
a141e760f4 project page (README): add section to «Build installers» (#345) 2023-12-24 11:30:34 +01:00
mintty
14f6d1e631 homepage: clarifications on different installers 2023-11-25 00:31:26 +01:00
mintty
e189d87a2c 3.7.0.2, with wslbridge2 0.12 fixing WSL 2 v2 issues (#343, #342) 2023-11-23 00:53:03 +01:00
mintty
399dff4226 hint to downgrade WSL to release 1.3.17 (#343) 2023-11-20 08:43:52 +01:00
mintty
8fbee63214 tune notice of patch version that makes WSL access fail 2023-11-16 18:58:02 +01:00
mintty
effb0ce46a project page: add hint to WSL V2 problem (#343) 2023-11-16 04:22:00 +01:00
mintty
ca4670bd44 3.7.0 2023-11-14 01:09:23 +01:00
mintty
ab84d5bbde 3.6.5 2023-09-03 13:06:35 +02:00
mintty
943d83da69 add package check links for 3rd-party installers 2023-03-30 11:47:37 +02:00
mintty
0be30273f5 project page tweaks 2023-03-30 11:30:39 +02:00
mintty
e8177d77d7 2023-03-25 05:13:33 +01:00
mintty
756f5f5844 3.6.4 2023-03-25 04:58:07 +01:00
mintty
bbbef4fc89 install emoji deployment scripts 2023-03-24 10:09:49 +01:00
mintty
eee9516a23 3.6.1.2 build 2022-11-08 23:15:40 +01:00
mintty
449a310d90 update to wslbridge2 0.9 (to fix #302), drop patches;
update to mintty 3.6.1
2022-10-30 11:30:07 +01:00
mintty
87aa168b41 CI: install build environment 2022-04-01 00:05:05 +02:00
mintty
9de7d8d6f1 CI control file 2022-03-31 21:46:17 +02:00
mintty
c91ec886b5 3.6.0 2022-03-25 19:28:34 +01:00
mintty
4caa2c34eb portable installation (#306) 2022-03-22 15:54:28 +01:00
mintty
73fcc66790 fix previous change 2022-03-01 00:11:44 +01:00
mintty
5cee2c341b installer: support customized install dirs via environment vars (#304) 2022-02-28 09:49:30 +01:00
mintty
ea570a191e (#304) 2022-02-19 23:50:24 +01:00
mintty
2dd099265d mention winget package 2022-02-05 22:52:32 +01:00
mintty
2ddd2cd1ff add 41575379b4
as a patch: add COM instance for new lifted WSL service
2022-02-03 21:00:40 +01:00
mintty
d1fa49985b add wsltty quiet installer (microsoft/winget-pkgs#40573) 2022-01-18 19:37:26 +01:00
mintty
76fad756e1 3.5.1 2021-09-03 22:37:00 +02:00
mintty
600df69bb8 3.5.1 2021-09-03 22:05:59 +02:00
mintty
97dc68d64a ensure wsltty-specific recompile for mintty -V message (#284) 2021-05-11 00:57:26 +02:00
mintty
9469b2b5f5 3.5.0.2 2021-05-01 19:16:58 +02:00
mintty
5b27a3d3c8 update to wslbridge 0.8, matching the updated patch 2021-04-27 21:46:31 +02:00
mintty
ab46c2b1b0 Merge pull request #282 from Biswa96/master
update wslbridge2 patch file, to catch up with wslbridge2 0.8, to fix #281
2021-04-27 21:44:37 +02:00
Biswapriyo Nath
2e56730282 update wslbridge2 patch file 2021-04-27 23:42:59 +05:30
mintty
d67ce45c3e 3.5.0 2021-04-15 18:07:12 +02:00
mintty
6e74ab4d5b filter out "docker" default distributions from configuration (#277) 2021-04-09 10:29:21 +02:00
mintty
ee4e403f4c filter out "docker" distributions from configuration (#277) 2021-04-07 14:30:15 +02:00
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
mintty
47ede36283 3.3.0 2020-08-06 20:50:20 +02:00
mintty
b488a82a52 3.3.0 2020-08-06 19:58:27 +02:00
mintty
cadefd0ec0 3.2.0 2020-06-20 19:51:21 +02:00
mintty
0b4418399b 3.1.8 2020-06-11 16:39:39 +02:00
mintty
1f4de96e01 notes on curing various WSL startup issues (#246, #248) 2020-06-02 22:45:05 +02:00
mintty
1d8c80a6d4 disclaimer for choco and scoop installation instructions (~240) 2020-04-29 17:49:49 +02:00
mintty
e85b7fbb6a add note about Windows Defender settings (#239) 2020-04-17 13:05:55 +02:00
mintty
ae9dff3427 3.1.4.2 2020-04-02 15:00:32 +02:00
mintty
b8ad6553c4 fix installer: invoke configuration (#232), shortcuts generation (#237, #162),
usernames with spaces (#230) and other chars (#213), #162 generate shortcuts
2020-04-02 14:44:32 +02:00
mintty
8964534a5c 2020-04-02 14:44:21 +02:00
mintty
70b6f4cc45 fix imported distros fix (#226) 2020-04-01 20:27:19 +02:00
mintty
223671ce0d Merge pull request #236 from Conduitry/fix-fallback-icon
fix fallback icon in generated shortcuts
2020-04-01 20:25:09 +02:00
Conduitry
37032d79fa fix fallback icon in generated shortcuts 2020-03-30 01:13:25 -04:00
mintty
bbee0d6339 3.1.4 2020-03-07 19:05:28 +01:00
Thomas Wolff
00c4c2f20b tweak removal of ALL previous shortcuts, also on reconfigure (#218) 2020-03-05 14:15:57 +01:00
Thomas Wolff
9ae697ac20 fix cd /D "%installdir%" for drive changing (#223) 2020-03-05 11:07:31 +01:00
mintty
6397307878 3.1.0.3; fix wsl invocation from cygwin32 2020-02-15 13:44:53 +01:00
Thomas Wolff
67b1596fd2 Merge branch 'master' of https://github.com/mintty/wsltty 2020-01-20 15:49:58 +01:00
Thomas Wolff
433b11c47b remove ALL shortcut lnk and bat files (#218) 2020-01-20 15:49:04 +01:00
Thomas Wolff
2aace74c9d additional quoting for CMD variables (#213) 2020-01-20 15:47:56 +01:00
mintty
afa230733a ConPTY support via bundling with cygwin 3.1.0 2019-12-17 01:04:08 +01:00
mintty
40fe1db02c 2019-12-02 22:10:53 +01:00
Thomas Wolff
b6800f7762 2019-12-02 16:39:56 +01:00
Thomas Wolff
8a3f7d19df adapt removal ref to previous installer (now arch-specific) 2019-12-02 15:48:08 +01:00
Thomas Wolff
4f6e12741a fix icon access 2019-12-02 15:18:13 +01:00
Thomas Wolff
bc7e612b0c login mode (#196, #191, #70, #56, #37) 2019-11-29 17:29:20 +01:00
Thomas Wolff
2aefc8ae13 3.1.0; support 32-bit build; propagate proxy to backend for package download 2019-11-25 16:35:07 +01:00
Thomas Wolff
83a9c12fc6 update to wslbridge2 release v0.5 2019-10-30 14:48:44 +01:00
Thomas Wolff
79d9ab6f70 ensure backend build dependencies 2019-10-14 17:42:13 +02:00
mintty
49e57f64bf 3.0.6 2019-10-06 16:36:19 +02:00
mintty
3793d84b4d 2019-10-02 20:04:48 +02:00
mintty
c439d4fbdc mention login parameter "-" explicitly (#191) 2019-10-02 16:12:42 +02:00
mintty
08adea1fb4 Windows requirement (#192) 2019-10-02 11:19:38 +02:00
mintty
3320dbc55a 3.0.5 VERSION 2019-10-02 01:00:08 +02:00
mintty
3c47f24dbc 3.0.5 2019-10-02 00:57:48 +02:00
mintty
eacede80ba improve section Configuration (#188) 2019-09-12 14:09:08 +02:00
mintty
d8ec165954 improve description of installed shortcuts and scripts for invocation 2019-09-12 14:07:24 +02:00
mintty
66768d2ab4 2019-09-12 13:53:33 +02:00
mintty
fabdf1ec30 uninstall to remove desktop shortcut (#184) 2019-08-12 18:12:58 +02:00
mintty
0799e4a69a revert using mkshortcut.c 2019-08-07 23:48:03 +02:00
mintty
24c450ea82 fix mkshortcut dependencies 2019-08-07 20:51:34 +02:00
mintty
639ed3da8f fix and polish install tweaks 2019-08-07 20:37:08 +02:00
mintty
7940883bd6 continue: consider custom $installdir (#180), using mkshortcut.exe;
deploy tweaked mkshortcut, drop mkshortcut.vbs,
under the assumption that the VBS would cause false virus alerts (#181, #182)
2019-08-07 17:12:14 +02:00
mintty
b60bcc15da 2019-08-07 16:41:01 +02:00
mintty
0a38ed1126 consider custom $installdir (#180);
introduce mkshortcut.exe, preparing to drop mkshortcut.vbs (incomplete),
under the assumption that this may cause false virus alerts (#181, #182)
2019-08-07 00:03:33 +02:00
mintty
5136d7e878 3.0.2.2 beta 2019-07-24 23:32:05 +02:00
mintty
0d39faaaf6 deploy uninstall.bat in installation directory (#170, ~#175, ~#15) 2019-07-24 23:30:49 +02:00
mintty
d61e551236 backend patch v3, linking properly (#169), with dlopen for getpwuid (#156) 2019-07-24 23:06:41 +02:00
mintty
3f60e3f48c find proper icon and rootfs for wsldl-built distros (#169) 2019-07-24 22:38:36 +02:00
mintty
a207cae3a8 3.0.2 2019-07-13 11:20:31 +02:00
mintty
79c3f9e450 ensure cmd.exe is available in PATH during installation/configuration (#172) 2019-07-07 19:07:48 +02:00
mintty
75c67869bf instruction to disable WSL 2 (#171) 2019-07-03 13:06:30 +02:00
mintty
7776748081 do without powershell to determine the exe with the icon 2019-05-28 22:31:08 +02:00
mintty
bac370cfce Merge pull request #111 from caksoylar/patch-1
use icon from exe if determined from manifest
2019-05-28 22:30:26 +02:00
mintty
975dbb9398 3.0.1.2 2019-05-28 19:49:33 +02:00
mintty
432b71d2fd 3.0.1 2019-05-28 07:33:38 +02:00
mintty
1b41dfa1e0 determine Desktop folder from registry (#166) 2019-05-22 10:40:41 +02:00
mintty
336db2f19b package sounds (mintty/mintty#711) 2019-05-03 05:01:28 +02:00
mintty
1f67e41333 avoid %USERPROFILE% (#166) 2019-05-02 16:53:33 +02:00
mintty
0520b71e1f improve description to configure shortcuts and context menu entries (#166) 2019-05-02 16:04:58 +02:00
mintty
92b982690e facilitate build testing on non-Windows 10 2019-05-02 16:04:22 +02:00
mintty
f0a3449ada static linking of wslbridge-backend to make it work in all distros (#156),
own (partial) implementation of getpwuid to this aim
2019-05-01 11:01:10 +02:00
mintty
3d4055a63b chmod +x wslbridge-backend for all distros (#163) 2019-05-01 10:59:21 +02:00
mintty
2fb994604a 3.0.0 2019-04-11 16:13:49 +02:00
mintty
5da3a053a9 1.9.8 2019-03-15 11:01:28 +01:00
mintty
ad65aa9931 1.9.7 2019-03-15 00:50:56 +01:00
mintty
c9acce8d76 generic parameter list (#147) 2019-02-18 17:13:31 +01:00
mintty
1533c27b36 allow WSL commands as parameters to .bat invocation scripts (#147) 2019-02-17 13:47:51 +01:00
mintty
3e3eaf6e31 1.9.6 2019-01-20 19:53:22 +01:00
mintty
482df018c9 deploy two icons (#132) 2019-01-20 19:52:40 +01:00
mintty
23fc790c26 deploy two icons, allow previous icon to persist (#132),
do not deploy WSL default .lnk files anymore
2019-01-20 19:49:49 +01:00
mintty
e5c67ecc7c tweak registry key names to avoid collision with existing keys and enable context menu invocation of default WSL (#141) 2019-01-06 12:08:25 +01:00
mintty
20075c6378 allow persistent customization of default icon (#132) 2019-01-01 14:53:48 +01:00
Cem Aksoylar
fc8e7cda45 slashes in paths consistency 2018-06-20 23:29:57 -07:00
Cem Aksoylar
b23a0a4b3d restore deleted root definition, fallback to icon.ico first 2018-06-20 23:29:41 -07:00
Cem Aksoylar
a2414e0dc7 restore tabs 2018-06-20 23:13:38 -07:00
Cem Aksoylar
963a40d919 restore missing fi 2018-06-10 16:06:43 -07:00
Cem Aksoylar
017b05c48c fix EOL, restore misdeleted chunk on original L138-141, tabs to spaces 2018-06-10 12:15:21 -07:00
C Aksoylar
52b03a43d9 Fix missing icons for distros
Instead of looking for `images\icon.ico` in `$instdir` for each distro, instead check inside AppxManifest.xml for the executable name and point to it for the shortcut icon as suggested in https://github.com/mintty/wsltty/issues/110#issuecomment-395999015.
2018-06-10 11:35:20 -07:00
22 changed files with 2838 additions and 329 deletions

View File

@@ -0,0 +1,226 @@
diff --git a/src/wslbridge2-backend.cpp b/src/wslbridge2-backend.cpp
index 8b86cc6..63a19e5 100644
--- a/src/wslbridge2-backend.cpp
+++ b/src/wslbridge2-backend.cpp
@@ -17,6 +17,7 @@
#include <sys/wait.h>
#include <unistd.h>
#include <wordexp.h>
+#include <limits.h> // PIPE_BUF
#include <string>
#include <vector>
@@ -196,6 +197,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
{
@@ -206,8 +208,85 @@ 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 --git a/src/wslbridge2.cpp b/src/wslbridge2.cpp
index 300ad57..3ba9096 100644
--- a/src/wslbridge2.cpp
+++ b/src/wslbridge2.cpp
@@ -43,19 +43,41 @@ union IoSockets
/* global variable */
static volatile union IoSockets g_ioSockets = { 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, (char *)&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];
+ assert(sizeof data <= PIPE_BUF);
while (1)
{
@@ -65,8 +87,33 @@ static void* send_buffer(void *param)
closesocket(g_ioSockets.inputSock);
break;
}
- if (!send(g_ioSockets.inputSock, data, ret, 0))
- break;
+ 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;
+ }
+ }
+ }
}
pthread_exit(&ret);
@@ -480,16 +527,6 @@ int main(int argc, char *argv[])
g_ioSockets.controlSock = win_local_accept(controlSock);
}
- /* Capture window resize signal and send buffer to control socket */
- {
- struct sigaction act;
- memset(&act, 0, sizeof 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);
@@ -502,6 +539,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

@@ -0,0 +1,62 @@
diff -rup src/sav/GetVmId.cpp src/GetVmId.cpp
--- src/sav/GetVmId.cpp 2021-04-27 13:50:51.000000000 +0000
+++ src/GetVmId.cpp 2022-02-03 19:43:53.684999800 +0000
@@ -46,11 +46,24 @@ void ComInit(void)
EOAC_STATIC_CLOAKING, NULL);
assert(hRes == 0);
- hRes = CoCreateInstance(CLSID_LxssUserSession,
+ // First try with COM server in lifted WSL service
+ hRes = CoCreateInstance(CLSID_WslService,
NULL,
CLSCTX_LOCAL_SERVER,
- IID_ILxssUserSession,
+ IID_IWSLService,
(PVOID *)&wslSession);
+
+
+ // Now try with COM server in system WSL service
+ if (FAILED(hRes))
+ {
+ hRes = CoCreateInstance(CLSID_LxssUserSession,
+ NULL,
+ CLSCTX_LOCAL_SERVER,
+ IID_ILxssUserSession,
+ (PVOID *)&wslSession);
+ }
+
assert(hRes == 0);
}
diff -rup src/sav/LxssUserSession.hpp src/LxssUserSession.hpp
--- src/sav/LxssUserSession.hpp 2021-04-27 13:50:51.000000000 +0000
+++ src/LxssUserSession.hpp 2022-02-03 19:45:22.846298200 +0000
@@ -11,14 +11,26 @@
#ifndef LXSSUSERSESSION_H
#define LXSSUSERSESSION_H
-/* Class identifier */
+// COM IDs for lifted WSL service
+static const GUID CLSID_WslService = {
+ 0xF122531F,
+ 0x326B,
+ 0x4514,
+ { 0x85, 0xAE, 0xDC, 0x99, 0xD3, 0x1D, 0x82, 0x56 } };
+
+static const GUID IID_IWSLService = {
+ 0x50047071,
+ 0x122C,
+ 0x4CAD,
+ { 0x9C, 0x93, 0x94, 0x72, 0x0E, 0xB7, 0x7B, 0x06 } };
+
+// COM IDs for system WSL service
static const GUID CLSID_LxssUserSession = {
0x4F476546,
0xB412,
0x4579,
{ 0xB6, 0x4C, 0x12, 0x3D, 0xF3, 0x31, 0xE3, 0xD6 } };
-/* Interface identifier */
static const GUID IID_ILxssUserSession = {
0x536A6BCF,
0xFE04,

View File

@@ -0,0 +1,40 @@
--- wslbridge2/src/wslbridge2.cpp 2024-10-10 20:20:21.931891800 +0000
+++ wslbridge2-0.12/src/wslbridge2.cpp 2024-10-08 09:31:35.954145800 +0000
@@ -228,6 +228,26 @@ static void start_dummy(std::wstring wsl
CloseHandle(pi.hThread);
}
+bool GetIdFromRegistry(GUID *guid) {
+ HKEY hKeyRoot = HKEY_LOCAL_MACHINE;
+ std::wstring subKey = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\HostComputeService\\VolatileStore\\ComputeSystem";
+ HKEY hKey;
+ if (RegOpenKeyEx(hKeyRoot, subKey.c_str(), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
+ DWORD index = 0;
+ WCHAR keyName[256];
+ DWORD keyNameSize = sizeof(keyName) / sizeof(keyName[0]);
+
+ while (RegEnumKeyEx(hKey, index, keyName, &keyNameSize, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS) {
+ RegCloseKey(hKey);
+ std::wstring id = L"{" + std::wstring(keyName) + L"}";
+ return IIDFromString(id.c_str(), guid) == S_OK;
+ }
+ RegCloseKey(hKey);
+ }
+ return false;
+}
+
+
int main(int argc, char *argv[])
{
/* Minimum requirement Windows 10 build 17763 aka. version 1809 */
@@ -387,8 +407,8 @@ int main(int argc, char *argv[])
if (LiftedWSLVersion)
start_dummy(wslPath, wslCmdLine, distroName, debugMode);
- const HRESULT hRes = GetVmId(&DistroId, &VmId, LiftedWSLVersion);
- if (hRes != 0)
+ const bool hRes = GetIdFromRegistry(&VmId);
+ if (!hRes)
fatal("GetVmId: %s\n", GetErrorMessage(hRes).c_str());
inputSock = win_vsock_create();

View File

@@ -1,4 +1,4 @@
mintty is copyright 2008-13 Andy Koppe, 2015-18 Thomas Wolff.
mintty is copyright 2008-23 Andy Koppe, 2015-23 Thomas Wolff.
Licensed under the terms of the GNU General Public License version 3 or later,
amended with the bundling clause to clarify ambiguous interpretation.
@@ -17,6 +17,8 @@ See LICENSE.PuTTY for PuTTY's copyright notice, contributors, and license.
The sources of PuTTY 0.60 can be downloaded from
ftp://ftp.chiark.greenend.org.uk/users/sgtatham/putty-0.60.
The minibidi algorithm is under MIT license as quoted in the source file.
Sixel code (sixel.c) is relicensed under GPL like mintty with the
permission of its author (kmiya@culti); Sixel colour conversion code
(sixel_hls.c) is licensed by its author Ross Combs under the license
@@ -31,3 +33,7 @@ The colour schemes / theme files bundled with mintty are included
under various licenses. The source and license or permission are
quoted in the respective theme files.
Bell sounds files are included, mostly under the creative commons license
(https://creativecommons.org/publicdomain/zero/1.0/), see also the README
in the sounds subdirectory.

View File

@@ -1,22 +0,0 @@
The MIT License (MIT)
Copyright (c) 2016 Ryan Prichard
Copyright (c) 2017-2018 Google LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.

674
LICENSE.wslbridge2 Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

277
README.md
View File

@@ -11,29 +11,125 @@ WSLtty components
(“home”-located configuration files from a previously installed version
will be migrated to the new default location)
* Start Menu shortcuts to start WSL terminals
* Desktop shorcut to start a terminal for the default WSL distribution
* `*.bat` scripts to invoke WSL terminals from the command line
* optional context menu entries for Windows Explorer to start WSL terminals in the respective folder
* install/uninstall context menu items from Start Menu subfolder `WSLtty`
---
### Launching WSL ###
Since wsltty 3.8.0, mintty launches WSL using the native Windows launcher
gateway `wsl.exe` by default.
Proper display in certain cases depends on an up-to-date version of the
Windows conpty layer. Its version currently deployed with Windows has
unfortunately still some problems. There are two ways to fix this:
* Revert to the previous launching method for now. The problem is that
this way of launching WSL does not appear to work on some users systems.
For this solution, configure this in config file `%APPDATA%/wsltty/config`.
`WSLbridge=2`
* Update the Windows conpty layer manually, by replacing
`%SYSTEMROOT%/System32/conhost.exe` following the instructions in the
[mintty wiki, section Interaction with WSL](https://github.com/mintty/mintty/wiki/Tips#interaction-with-wsl-and-other-windows-programs).
#### Launcher and display interworking background ####
The approach to use wsl.exe directly used to fail because the
_conhost_ layer hooked into the workflow used to obstruct transparent
terminal operation in multiple ways.
The _conhost_ layer has meanwhile been modernised, including the _conpty_
layer, and its enforced detour through the Windows console API has
been dropped, in the course of the Windows Terminal project.
The new _conhost_, however, has not yet been deployed with Windows
(as of summer 2025) and will probably not be deployed with Windows 10 anymore.
So in order to get fully transparent terminal interaction between WSL
and wsltty, the updated _conhost_ needs to be patched into Windows
manually, following the instructions linked above,
to patch OpenConsole into your Windows as conhost replacement.
#### The wslbridge approach ####
To connect to WSL, wsltty used wslbridge2, which uses undocumented
Windows APIs that have been changed various times, so wslbridge2 needed
to catch up with incompatible changes, particularly to support WSL V2.
(See e.g. issue #343; to work with WSL V2, wsltty 2.0.0 needed a WSL update
to [release 1.3.17](https://github.com/microsoft/WSL/releases/tag/1.3.17).)
Since release 3.0.5, WSLtty requires Windows version 1809 (the November 2018 release).
By end of 2024, wsltty works again with recent updates of the WSL subsystem.
Configuration option `WSLbridge=2` switches back to the previous
wslbridge launching approach; the wslbridge2 gateway is still deployed
with wsltty for that matter. (If for a very old Windows 10 version you
still need the original wslbridge gateway, set `WSLbridge=1` and
deploy it manually.)
---
### Installation from this repository ###
#### WSLtty installer ([Download](https://github.com/mintty/wsltty/releases) standalone installation) ####
Run the [installer](https://github.com/mintty/wsltty/releases) to install
the components listed above.
From the [release downloads](https://github.com/mintty/wsltty/releases),
run the wsltty-VERSION-x86_64-install.exe installer to install
the components listed above. Make sure to select a 64-bit installer
on a 64-bit system.
If Windows complains with a “Windows protected your PC” popup,
you may need to click “Run anyway” to proceed with the installation.
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.
#### WSLtty Portable installer
For a portable installation, e.g. on a USB stick, choose the
“-install-portable.exe” file for download. Installation will prompt
for a portable installation folder interactively.
For example, choosing `U:\opt` will create and use folder
`U:\opt\wsltty` both as installation directory and configuration directory.
Portable installation does not install any start menu or desktop shortcuts
and no context menu entries. It creates a shortcut in the selected
portable installation folder to start the default WSL distribution.
Note: For an update installation, either the parent directory or the target
directory itself can be selected.
Note: If you rename or move the installation directory, the icon of the
“WSL Terminal Portable” shortcut will not work anymore; re-run the
install-portable.bat script in the installation folder to refresh it.
#### 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,
or `install-portable.bat` for a portable installation.
#### Quiet installer ####
The wsltty-VERSION-x86_64-install-quiet.exe installer is intended for
integration in another installation framework.
#### Installation from source repository ####
Download or checkout the wsltty repository.
Invoke `make`, then `make install`.
Note this has to be done within a Cygwin environment.
Checkout the wsltty repository, or download the source archive, unpack and rename the directory to `wsltty`.
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`).
#### Build installers ####
Install a minimal Cygwin environment plus the additional packages as
listed for «Installation from source repository».
Invoke `make pkg` or just `make`.
#### Installation to non-default locations ####
@@ -44,16 +140,20 @@ the optional second parameter designates the configuration directory.
### Installation with other package management environments ###
#### Chocolatey ####
Note: These are 3rd-party packages, not managed by this repository.
If you use the [Chocolatey package manager](https://chocolatey.org/),
#### Windows Package Manager ####
([Check package](https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Mintty/WSLtty))
To install wsltty from the
[Windows Package Manager Community Repository](https://github.com/microsoft/winget-pkgs),
invoke one of
<img height=222 align=right src=https://github.com/mintty/wsltty.appx/raw/master/wsltty.appx.png>
* `choco install wsltty`
* `choco upgrade wsltty`
* `winget install wsltty`
* `winget upgrade wsltty`
#### Scoop ####
([Check package](https://scoop.sh/#/apps?q=wsltty))
If you use the [Scoop package manager](https://scoop.sh/),
* `scoop bucket add extras`
@@ -61,11 +161,20 @@ then, invoke one of
* `scoop install wsltty`
* `scoop update wsltty`
#### Windows Appx package ####
#### Chocolatey ####
A Windows Appx package and certificate is available in the [wsltty.appx](https://github.com/mintty/wsltty.appx/) repository.
([Check package](https://community.chocolatey.org/packages/wsltty))
If you use the [Chocolatey package manager](https://chocolatey.org/),
invoke one of
* `choco install wsltty`
* `choco upgrade wsltty`
<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.
---
@@ -73,12 +182,44 @@ A Windows Appx package and certificate is available in the [wsltty.appx](https:/
WSLtty can be invoked with
* installed Start Menu shortcuts (or Desktop shortcuts if copied there)
* *.bat scripts
* *.bat scripts (optionally with WSL command as parameters) (see [Command line scripts](#command-line-scripts-wslbat) below)
* Explorer context menu (if installed from the Start Menu `WSLtty` subfolder)
Starting the mintty terminal directly from the WSLtty installation location
is discouraged because that would bypass essential options.
#### WSL V2 ####
Terminal communication with WSL via its modes V1 or V2 is handled
automatically by wsltty (mintty and the wslbridge2 gateway).
#### Starting issues ####
If wsltty fails with an
`Error: Could not fork child process: Resource temporarily unavailable`...,
its runtime may be affected by some over-ambitious virus defense strategy.
For example, with Windows Defender, option “Force randomization for images”
should be disabled.
If wsltty fails with an error message that mentions a disk mount path (e.g. `/mnt/c`),
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 ###
@@ -86,28 +227,36 @@ is discouraged because that would bypass essential options.
#### Start Menu and Desktop shortcuts ####
In the Start Menu, the following shortcuts are installed:
* For each installed WSL distribution D, D` Terminal` to start in the WSL user home
* `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 shortcuts are installed:
* For each installed WSL distribution D, D` Terminal %` to start in the Windows %USERPROFILE% home
* `WSL Terminal %` to start the default WSL distribution in the Windows %USERPROFILE% home
In the Start Menu subfolder WSLtty, the following additional shortcuts are installed:
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal %` to start the default WSL distribution in the Windows %USERPROFILE% home
* 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:
* `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.
The Start menu folder WSLtty contains the link
<img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`configure WSL shortcuts`.
This function is initially run when wsltty is installed.
It should be rerun after adding or removing WSL distributions,
in order to create the respective set of shortcuts in the Start menu.
#### Command line scripts `wsl*.bat` ####
WSLtty installs the following scripts into `%LOCALAPPDATA%\Microsoft\WindowsApps`
(and a copy in its application folder `%LOCALAPPDATA%\wsltty`):
* For each installed WSL distribution D, D`.bat` to start in the current folder/directory
* For each installed WSL distribution D, D`~.bat` to start in the WSL user home
* For each installed WSL distribution, e.g. Ubuntu, a command script like `Ubuntu.bat` to start in the current folder/directory
* For each installed WSL distribution, e.g. Ubuntu, a command script like `Ubuntu~.bat` to start in the WSL user home
* `WSL.bat` and `WSL~.bat` to start the default WSL distribution
The scripts accept an optional invocation command (since 3.7.8).
Given that `%LOCALAPPDATA%\Microsoft\WindowsApps` is in your PATH,
the scripts can be invoked from cmd.exe, PowerShell, or via WIN+R.
@@ -117,9 +266,23 @@ WSLtty provides context menu entries for all installed WSL distributions
and one for the configured default distribution,
to start a respective WSL terminal in a specific folder from an Explorer window.
They are not installed by default.
To add launch entries for the default or all WSL distributions to the
Explorer context menu, or remove them, run the respective script from the
Start Menu subfolder `WSLtty`.
Start Menu subfolder `WSLtty`:
* <img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`add default to context menu`
adds context menu entries for the default WSL distribution
* <img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`add to context menu`
adds context menu entries for all WSL distributions
* <img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`remove from context menu`
removes context menu entries for WSL distributions
#### Icon ####
Wsltty installation and the mintty terminal try to use the icon of the
respective WSL distribution. If it cannot be determined, a penguin icon
is used as a fallback. You can replace it with your preferred default icon
by replacing the icon file `%LOCALAPPDATA%\wsltty\wsl.ico`.
#### Mintty settings ####
@@ -127,14 +290,15 @@ Mintty can maintain its configuration file in various locations,
with the following precedence:
* file given with mintty option `-c` (not used by wsltty default installation)
* file `config` in directory given with mintty option `--configdir`
* This is `%APPDATA%\wsltty\config` in the default wsltty installation.
* **`%APPDATA%\wsltty\config`** in the default wsltty installation
* `%HOME%\.minttyrc` (usage deprecated with wsltty)
* `%HOME%\.config\mintty\config` (usage deprecated with wsltty)
* `%APPDATA%\mintty\config`
* common config file for all mintty installation instances
* **`%APPDATA%\mintty\config`**
* `%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
@@ -146,21 +310,56 @@ 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.
#### Emoji deployment ####
Mintty and the wsltty package do not bundle actual emoji graphics but
there are scripts to support easy download and deployment.
If you have another instance of mintty installed (e.g. in cygwin)
and have emojis deployed already in the common config folder
`%APPDATA%\mintty\emojis`, they will be reused by wsltty.
To deploy emojis standalone for wsltty, use the scripts installed in
`%APPDATA%\wsltty\emojis` within WSL:
* `cd $(wslpath "$APPDATA/wsltty/emojis")`
* `getemojis` to provide emoji graphics as listed by Unicode.org
* `getflags` to provide emoji flag graphics (extending Unicode dynamically) from various sources
#### Shell selection and Login shell ####
The WSLtty deployment does not impose a shell preference anymore.
However, the intermediate gateways (`wslbridge` and its backend and the `bash.exe` Windows launcher)
are also involved.
The WSLtty deployment does not impose a shell preference;
it invokes the users default shell in login mode by the final `-` parameter:
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" -`
To invoke your favourite shell or launch the shell in login mode,
you may append a shell pathname and an optional `-l` parameter
to the mintty invocation (in shortcuts, scripts, or context menu entries):
You may tweak shortcuts, scripts, or context menu entries as follows:
To launch a default shell in non-login mode, remove the final dash.
To invoke your preferred shell, replace the final dash with
a shell pathname and an optional `-l` parameter
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" /bin/bash -l`
---
### 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/)
@@ -170,7 +369,13 @@ the [Mintty manual page](http://mintty.github.io/mintty.1.html),
including a [Hints and Tips page](https://github.com/mintty/mintty/wiki/Tips).
It is based on [Cygwin](http://cygwin.com)
and includes its runtime library ([sources](http://mirrors.dotsrc.org/cygwin/x86/release/cygwin)).
and includes its runtime library ([sources](http://mirrors.dotsrc.org/cygwin/x86_64/release/cygwin)).
For interacting with WSL, [wslbridge](https://github.com/rprichard/wslbridge)
used to be the gateway prototype.
Many thanks for this enabling gateway go to Ryan Prichard.
For later changes in WSL, particularly WSL mode V2, the new gateway
[wslbridge2](https://github.com/Biswa96/wslbridge2) was used instead.
Many thanks for this further development and maintenance go to Biswapriyo Nath.
For interacting with WSL, it uses [wslbridge](https://github.com/rprichard/wslbridge).
Many thanks for this enabling gateway go especially to Ryan Prichard.

View File

@@ -1 +1 @@
1.9.5
3.8.0.3

31
appveyor.yml Normal file
View File

@@ -0,0 +1,31 @@
# This file is part of wsltty project
# Build image; of course wsltty has nothing to do with Visual Studio -
# this is just the name of Appveyor's build environment image
# that also contains cygwin
image: Visual Studio 2022
# Version format
version: "#{build}"
# Do not increment build number after pull requests
pull_requests:
do_not_increment_build_number: true
# Do not start a new build when a new Git tag is created
skip_tags: true
init:
- cmd: |
set PATH=C:\cygwin64;C:\cygwin64\bin;%windir%\System32
setup-x86_64 -q -P unzip -P zoo -P patch -P lcab
winget install Alpine
build_script:
- cmd: |
make
test_script:
- cmd: |
bin\mintty.exe --log mintty.log --exec echo hello mintty
grep echo mintty.log

1
cmd2.bat Executable file
View File

@@ -0,0 +1 @@
%1 "%from%" "%to%"

View File

@@ -1,9 +1,54 @@
#! /bin/sh
# dash built-in echo enforces interpretation of \t etc
echoc () {
#cmd /c echo $*
printf '%s\n' "$*"
}
copy () {
from="$1"
to="$2"
export from to
cmd /c cmd2.bat copy
}
delete () {
from="$1"
to="$1" # same again, to fill parameter
export from to
cmd /c cmd2.bat del/F
}
compare () {
from="$1"
to="$2"
export from to
cmd /c cmd2.bat comp/M
}
case "$installdir" in
?*) custominst=true;;
"") custominst=false;;
esac
INSTDIR="${installdir:-$LOCALAPPDATA/wsltty}"
echoc "Installing wsltty into $INSTDIR"
INSTDIR=`cd "$INSTDIR"; pwd`
installcop=${installdir:-"$LOCALAPPDATA\\wsltty"}
installdir=${installdir:-'%LOCALAPPDATA%\wsltty'}
target="$installdir"'\bin\mintty.exe'
case "$INSTDIR" in
*/) TARGETPATH="$INSTDIR"bin/mintty.exe;;
*) TARGETPATH="$INSTDIR"/bin/mintty.exe;;
esac
CONFDIR="${configdir:-$APPDATA/wsltty}"
configdir=${configdir:-'%APPDATA%\wsltty'}
PATH=/bin:"$PATH"
PATH=/bin:"$PATH":$SYSTEMROOT/System32
contextmenu=false
remove=false
@@ -19,9 +64,14 @@ case "$1" in
-info)
config=false
shift;;
-shortcuts)
shift;;
-shortcuts-remove)
remove=true
shift;;
-default)
alldistros=false
shift;;
-contextmenu)
contextmenu=true
shift;;
@@ -59,6 +109,26 @@ case "$1" in
shift;;
esac
if $config && ! $contextmenu
then
# remove shortcut entries in Start menu and cmd-line bat shortcuts
(cd "$INSTDIR"
for lnk in *.lnk
do
if compare "$lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk"
then delete "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk"
fi
done
for bat in *.bat
do
if compare "$bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$bat"
then delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$bat"
fi
done
)
fi
# test w/o WSL: call this script with REGTOOLFAKE=true dash config-distros.sh
if ${REGTOOLFAKE:-false}
then
@@ -85,33 +155,94 @@ regtool () {
}
fi
# dash built-in echo enforces interpretation of \t etc
echoc () {
cmd /c echo $*
mkbat () {
echo Creating "$1.bat"
while read line; do echo "$line"; done <<-\/EOB > "$1".bat
@echo off
rem Start mintty terminal for WSL
rem get basename of this script file,
rem use it to select WSL distribution and homedir flag
set dist=%~n0
rem start in current directory
set cdir=
rem if script name ends with ~, extract WSL distribution and param -~
if "%dist:~-1%" == "~" set cdir=-~ && set dist=%dist:~0,-1%
rem map WSL default distribution
if "%dist%" == "WSL" set dist=
rem check if we have an explicit -d DIST parameter
if "%1" == "-d" set dist=%2 && shift && shift
chcp 65001 > nul:
if "%1" == "" goto login
:cmd
"%LOCALAPPDATA%/wsltty/bin/mintty.exe" -i "%LOCALAPPDATA%/wsltty/wsl.ico" --WSL="%dist%" --configdir="%APPDATA%/wsltty" %cdir% %*
goto end
:login
"%LOCALAPPDATA%/wsltty/bin/mintty.exe" -i "%LOCALAPPDATA%/wsltty/wsl.ico" --WSL="%dist%" --configdir="%APPDATA%/wsltty" %cdir% -
:end
/EOB
}
if $config
then while read line; do echo "$line"; done <</EOB > mkbat.bat
@echo off
echo Creating %1.bat
echo @echo off> %1.bat
echo rem Start mintty terminal for WSL package %name% in current directory>> %1.bat
echo %target% -i "%icon%" %minttyargs% %bridgeargs%>> %1.bat
/EOB
if $custominst && $config && ! $remove
then
#mkshortcut.exe -n "add to context menu" -a "$installdir/config-distros.sh -contextmenu" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
#mkshortcut.exe -n "add default to context menu" -a "$installdir/config-distros.sh -contextmenu-default" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
#mkshortcut.exe -n "remove from context menu" -a "$installdir/config-distros.sh -contextmenu-remove" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
#mkshortcut.exe -n "configure WSL shortcuts" -a "$installdir/config-distros.sh" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
icon='%SystemRoot%\System32\filemgmt.dll'
wdir="$installdir"
target="$installdir/bin/dash.exe"
minttyargs="/config-distros.sh"
bridgeargs=
export icon wdir target minttyargs bridgeargs
cscript /nologo mkshortcut.vbs "/name:configure WSL shortcuts" "/min:true"
bridgeargs=-contextmenu
cscript /nologo mkshortcut.vbs "/name:add to context menu" "/min:true"
bridgeargs=-contextmenu-default
cscript /nologo mkshortcut.vbs "/name:add default to context menu" "/min:true"
bridgeargs=-contextmenu-remove
cscript /nologo mkshortcut.vbs "/name:remove from context menu" "/min:true"
copy "add to context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
copy "add default to context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
copy "remove from context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
copy "configure WSL shortcuts.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
# restore target
target="$installdir"'\bin\mintty.exe'
fi
lxss="/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Lxss"
schema="/HKEY_CURRENT_USER/Software/Classes/Local Settings/Software/Microsoft/Windows/CurrentVersion/AppModel/SystemAppData"
#(regtool list "$lxss" 2>/dev/null && echo || echo "No WSL packages registered" >&2) |
(
if $alldistros
then regtool list "$lxss" 2>/dev/null
else true
fi && echo || echo "No WSL packages registered" >&2) |
while read guid
do
appex () {
while read line
do
case "$line" in
*Application*Executable*)
for item in $line
do case "$item" in
Executable=*)
eval $item
echo "$Executable"
break;;
esac
done
break;;
esac
done < $*
}
config () {
guid="$1"
ok=false
case $guid in
{*)
@@ -119,113 +250,208 @@ do
case "$distro" in
Legacy)
name="Bash on Windows"
launch=
launcher="$SYSTEMROOT/System32/bash.exe"
;;
*) name="$distro"
launch="$distro"
launcher="$LOCALAPPDATA/Microsoft/WindowsApps/$distro.exe"
;;
esac
basepath=`regtool get "$lxss/$guid/BasePath"`
if package=`regtool -q get "$lxss/$guid/PackageFamilyName"`
then
instdir=`regtool get "$schema/$package/Schemas/PackageFullName"`
if [ -r "$ProgramW6432/WindowsApps/$instdir/images/icon.ico" ]
then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico"
else icon="$installdir"'\wsl.ico'
distrinst=`regtool get "$schema/$package/Schemas/PackageFullName"`
# get actual executable path (may not match $distro) from app manifest
manifest="$ProgramW6432/WindowsApps/$distrinst/AppxManifest.xml"
psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable'
executable=`appex "$manifest"`
if [ -r "$ProgramW6432/WindowsApps/$distrinst/$executable" ]
then icon="$ProgramW6432/WindowsApps/$distrinst/$executable"
elif [ -r "$ProgramW6432/WindowsApps/$distrinst/images/icon.ico" ]
then icon="$ProgramW6432/WindowsApps/$distrinst/images/icon.ico"
else icon="$installcop"'\wsl.ico'
fi
root="$basepath/rootfs"
else
icon="%LOCALAPPDATA%/lxss/bash.ico"
elif [ -f "$basepath/$distro.exe" ]
then
icon="$basepath/$distro.exe"
root="$basepath/rootfs"
elif [ -d "$LOCALAPPDATA/lxss" ]
then
# legacy "Bash on Windows"
icon="$LOCALAPPDATA/lxss/bash.ico"
root="$basepath"
else
# imported distro? (#226, #236)
icon="$installcop"'\wsl.ico'
root="$basepath/rootfs"
fi
minttyargs='--wsl --rootfs="'"$root"'" --configdir="'"$configdir"'" -o Locale=C -o Charset=UTF-8 /bin/wslbridge '
# invocation parameters for mintty
minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"'
#if [ -z "$launch" ]
#then bridgeargs='-t /bin/bash'
#else bridgeargs='-l "'"$launch"'" -t /bin/bash'
#fi
bridgeargs='--distro-guid "'"$guid"'" -t /bin/bash'
bridgeargs='--distro-guid "'"$guid"'" -t'
# MINTARGS deprecated; used for mkshortcut.exe rather than mkshortcut.vbs
MINTARGS='--WSL="'"$distro"'" --configdir="'"$CONFDIR"'"'
# invocation commands (deprecated for mintty, used for start menu scripts)
#bridgeargs='--distro-guid "'"$guid"'" -t'
ok=true;;
"") # WSL default installation
DefaultDistribution|"") # WSL default installation
distro=
name=WSL
icon="$installdir"'\wsl.ico'
icon="$installcop"'\wsl.ico'
minttyargs='--WSL= --configdir="'"$configdir"'"'
bridgeargs='-t'
MINTARGS='--WSL= --configdir="'"$CONFDIR"'"'
#bridgeargs='-t'
ok=true;;
esac
bridgeargs=" -" # now used to request login mode
echoc "distro '$distro'"
echoc "- name '$name'"
echoc "- guid $guid"
echoc "- (launcher $launcher)"
echoc "- icon $icon"
echoc "- root $root"
target="$installdir"'\bin\mintty.exe'
bridgeargs=" "
wdir=%USERPROFILE%
case "$name" in
docker*) echo skipping docker system
return;;
esac
case "$root" in
*\\Docker*) echo skipping docker system
return;;
esac
if $ok && ! $remove && [ -n "$distro" ]
then # fix #163: backend missing +x with certain mount options
echo Setting +x wslbridge2 backend for distro "'$distro'"
(cd "$INSTDIR"; cd bin; PATH="${WINDIR}/Sysnative:${PATH}" wsl.exe -d "$distro" chmod +x wslbridge2-backend)
# (cd "$LOCALAPPDATA/wsltty/bin"; wsl.exe -d "$distro" chmod +x wslbridge2-backend)
# (cd ... ; "$SYSTEMROOT/System32/bash.exe" "$guid" -c chmod +x wslbridge2-backend)
fi
if $ok && $config
then
export target minttyargs bridgeargs icon
export wdir name target minttyargs bridgeargs icon
if $contextmenu
then
# context menu entries
#cmd /C mkcontext "$name"
direckey='HKEY_CURRENT_USER\Software\Classes\Directory'
keyname="${name}_Terminal"
if $remove
then
reg delete "$direckey\\shell\\$name" /f
reg delete "$direckey\\Background\\shell\\$name" /f
# obsolete; handled above
reg delete "$direckey\\shell\\$keyname" /f
reg delete "$direckey\\Background\\shell\\$keyname" /f
else
reg add "$direckey\\shell\\$name" /d "$name Terminal" /f
reg add "$direckey\\shell\\$name" /v Icon /d "$icon" /f
cmd /C reg add "$direckey\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f
reg add "$direckey\\Background\\shell\\$name" /d "$name Terminal" /f
reg add "$direckey\\Background\\shell\\$name" /v Icon /d "$icon" /f
cmd /C reg add "$direckey\\Background\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f
direckey='/HKEY_CURRENT_USER/Software/Classes/Directory'
echoc Registry setting "$direckey/[Background/]shell/$keyname"
target="$installcop"'\bin\mintty.exe'
regtool add "$direckey/shell"
regtool add "$direckey/shell/$keyname"
regtool set "$direckey/shell/$keyname/" -s "$name Terminal"
regtool set "$direckey/shell/$keyname/Icon" -s "$icon"
regtool add "$direckey/shell/$keyname/command"
regtool set "$direckey/shell/$keyname/command/" -s "\"$target\" -i \"$icon\" --dir \"%1\" $MINTARGS $bridgeargs"
regtool add "$direckey/Background/shell"
regtool add "$direckey/Background/shell/$keyname"
regtool set "$direckey/Background/shell/$keyname/" -s "$name Terminal"
regtool set "$direckey/Background/shell/$keyname/Icon" -s "$icon"
regtool add "$direckey/Background/shell/$keyname/command"
regtool set "$direckey/Background/shell/$keyname/command/" -s "\"$target\" -i \"$icon\" $MINTARGS $bridgeargs"
fi
else
# invocation shortcuts and scripts
if $remove
then
cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk"
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat"
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat"
delete "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk"
delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$name.bat"
delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$name~.bat"
if [ "$name" = "WSL" ]
then
# determine actual Desktop folder
desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop'
desktop=`regtool get "$desktopkey"`
case "$desktop" in
%USERPROFILE%*) desktop="$USERPROFILE${desktop#%USERPROFILE%}";;
esac
delete "$desktop\\$name Terminal.lnk"
fi
else
# desktop shortcut in %USERPROFILE% -> Start Menu - WSLtty
cscript /nologo mkshortcut.vbs "/name:$name Terminal %"
cmd /C copy "$name Terminal %.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
#mkshortcut.exe -n "$name Terminal %" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE%
copy "$name Terminal %.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
# launch script in . -> WSLtty home, WindowsApps launch folder
cmd /C mkbat.bat "$name"
cmd /C copy "$name.bat" "$installdir"
cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps"
#cmd /C mkbat.bat "$name"
mkbat "$name"
copy "$name.bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps"
# store backup copies in installation dir
if [ "$PWD" != "$INSTDIR" ]
then
copy "$name Terminal %.lnk" "$installcop"
copy "$name.bat" "$installcop"
fi
# prepare versions to target WSL home directory
#bridgeargs="-C~ $bridgeargs"
minttyargs="$minttyargs -~"
MINTARGS="$MINTARGS -~"
# desktop shortcut in ~ -> Start Menu
cscript /nologo mkshortcut.vbs "/name:$name Terminal"
cmd /C copy "$name Terminal.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs"
#mkshortcut.exe -n "$name Terminal" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE%
copy "$name Terminal.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs"
# default desktop shortcut in ~ -> Desktop
if [ "$name" = "WSL" ]
then cmd /C copy "$name Terminal.lnk" "%USERPROFILE%\\Desktop"
then
#copy "$name Terminal.lnk" "$USERPROFILE\\Desktop"
#copy "$name Terminal.lnk" "$APPDATA\\..\\Desktop\\"
# the above does not work reliably (see #166)
# determine actual Desktop folder
desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop'
desktop=`regtool get "$desktopkey"`
case "$desktop" in
%USERPROFILE%*) desktop="$USERPROFILE${desktop#%USERPROFILE%}";;
esac
copy "$name Terminal.lnk" "$desktop\\"
fi
# launch script in ~ -> WSLtty home, WindowsApps launch folder
cmd /C mkbat.bat "$name~"
cmd /C copy "$name~.bat" "$installdir"
cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps"
#cmd /C mkbat.bat "$name~"
mkbat "$name~"
copy "$name~.bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps"
# store backup copies in installation dir
if [ "$PWD" != "$INSTDIR" ]
then
copy "$name Terminal.lnk" "$installcop"
copy "$name~.bat" "$installcop"
fi
fi
fi
fi
}
# ensure proper parameter passing to cmd /C
chcp.com 65001 # just in case; seems to work without as well
# configure for all distros, plus default distro
for guid in `
if $alldistros
then regtool list "$lxss" 2>/dev/null
else echo DefaultDistribution
fi || echo "No WSL packages registered" >&2
`
do config $guid
done

3
dequote.bat Executable file
View File

@@ -0,0 +1,3 @@
@echo off
rem https://ss64.com/nt/syntax-dequote.html
for /f "delims=" %%A in ('echo %%%1%%') do set %1=%%~A

54
install-portable.bat Executable file
View File

@@ -0,0 +1,54 @@
@echo off
chcp 65001 > nul
if not exist "WSL Terminal Portable.lnk" goto install
echo Rebuilding WSL Terminal Portable shortcut
set instdir=%~dp0
goto shortcut
:install
echo Installing WSL Terminal Portable
echo Select target folder in popup dialog ...
set sel="Select folder to place installation of portable wsltty"
for /f "usebackq delims=" %%f in (`powershell "(new-object -COM Shell.Application).BrowseForFolder(0, '%sel%', 0, 0).self.path"`) do set f=%%f
set instdir=%f%\wsltty
if exist %f%\LICENSE.mintty set instdir=%f%
if "%f%"=="" (
echo No installation selected
pause
exit
) else if not exist "%f%" (
echo Invalid installation folder %instdir%
pause
exit
)
rem call main installation
call install "%instdir%" "%instdir%" /P
rem this already changes into "%instdir%"
rem copy additional portable installation files
rem do this after call install as that deletes previous .bat files
copy "%~dp0\install-portable.bat" .
dir "%instdir%"\install-portable.bat
:shortcut
rem create shortcut
cd /D "%instdir%"
rem set drive-relative path for shortcut working directory and icon
set instpath=%instdir:~2%
set target=%%COMSPEC%%
set minttyargs=/C bin\mintty.exe --WSL= --icon=/wsl.ico --configdir=. -~
set bridgeargs= -
rem set wdir=%instpath%
rem let mkshortcut set working directory to empty:
set wdir=.
set icon=%instpath%\wsl.ico
cscript /nologo mkshortcut.vbs "/name:WSL Terminal Portable"

View File

@@ -1,73 +1,108 @@
@echo off
set refinstalldir=%%LOCALAPPDATA%%\wsltty
set installdir=%LOCALAPPDATA%\wsltty
set refconfigdir=%%APPDATA%%\wsltty
set configdir=%APPDATA%\wsltty
set oldroot=%installdir%
set oldhomedir=%installdir%\home\%USERNAME%
set oldconfigdir=%oldhomedir%\.config\mintty
if not "%1" == "" set refinstalldir=%1 && set installdir=%1
if not "%2" == "" set refconfigdir=%2 && set configdir=%2
if "%installdir%" == "" set installdir="%LOCALAPPDATA%\wsltty"
if "%configdir%" == "" set configdir="%APPDATA%\wsltty"
call dequote installdir
call dequote configdir
set oldroot="%installdir%"
set oldhomedir="%installdir%\home\%USERNAME%"
call dequote oldroot
call dequote oldhomedir
set oldconfigdir="%oldhomedir%\.config\mintty"
call dequote oldconfigdir
rem override installdir, configdir if parameters given
set arg1=%1
call dequote arg1
if "%arg1%" == "%%arg1%%" goto deploy
set refinstalldir=%arg1%
set installdir=%arg1%
set arg2=%2
call dequote arg2
if "%arg2%" == "%%arg2%%" goto deploy
set refconfigdir=%arg2%
set configdir=%arg2%
:deploy
mkdir "%installdir%"
mkdir "%installdir%" 2> nul:
rem clean up previous installation artefacts
del /Q "%installdir%\*.bat"
del /Q "%installdir%\*.lnk"
copy LICENSE.mintty "%installdir%"
copy LICENSE.wslbridge "%installdir%"
copy LICENSE.wslbridge2 "%installdir%"
copy "add to context menu.lnk" "%installdir%"
copy "add default to context menu.lnk" "%installdir%"
copy "remove from context menu.lnk" "%installdir%"
copy "configure WSL shortcuts.lnk" "%installdir%"
copy "WSL Terminal.lnk" "%installdir%"
copy "WSL Terminal %%.lnk" "%installdir%"
copy wsl.ico "%installdir%"
rem copy "WSL Terminal.lnk" "%installdir%"
rem copy "WSL Terminal %%.lnk" "%installdir%"
copy config-distros.sh "%installdir%"
copy mkshortcut.vbs "%installdir%"
copy cmd2.bat "%installdir%"
copy dequote.bat "%installdir%"
rem allow persistent customization of default icon:
if not exist "%installdir%\wsl.ico" copy tux.ico "%installdir%\wsl.ico"
copy uninstall.bat "%installdir%"
if not exist "%installdir%\bin" goto instbin
rem move previous programs possibly in use out of the way
del /Q "%installdir%\bin\*.old"
del /Q "%installdir%\bin\*.old" 2> nul:
ren "%installdir%\bin\cygwin1.dll" cygwin1.dll.old
ren "%installdir%\bin\cygwin-console-helper.exe" cygwin-console-helper.exe.old
ren "%installdir%\bin\mintty.exe" mintty.exe.old
ren "%installdir%\bin\wslbridge.exe" wslbridge.exe.old
ren "%installdir%\bin\wslbridge-backend" wslbridge-backend.old
del /Q "%installdir%\bin\*.old"
ren "%installdir%\bin\wslbridge2.exe" wslbridge2.exe.old
ren "%installdir%\bin\wslbridge2-backend" wslbridge2-backend.old
del /Q "%installdir%\bin\*.old" 2> nul:
:instbin
mkdir "%installdir%\bin"
mkdir "%installdir%\bin" 2> nul:
copy cygwin1.dll "%installdir%\bin"
copy cygwin-console-helper.exe "%installdir%\bin"
copy mintty.exe "%installdir%\bin"
copy wslbridge.exe "%installdir%\bin"
copy wslbridge-backend "%installdir%\bin"
copy wslbridge2.exe "%installdir%\bin"
copy wslbridge2-backend "%installdir%\bin"
copy dash.exe "%installdir%\bin"
copy regtool.exe "%installdir%\bin"
copy zoo.exe "%installdir%\bin"
rem create system config directory and copy config archive
mkdir "%installdir%\usr\share\mintty\lang"
rem copy mkshortcut.exe "%installdir%"\bin
rem copy cygpopt-0.dll "%installdir%"\bin
rem copy cygiconv-2.dll "%installdir%"\bin
rem copy cygintl-8.dll "%installdir%"\bin
rem create system config directory and copy config archive and scripts
mkdir "%installdir%\usr\share\mintty\lang" 2> nul:
copy lang.zoo "%installdir%\usr\share\mintty\lang"
mkdir "%installdir%\usr\share\mintty\themes"
mkdir "%installdir%\usr\share\mintty\themes" 2> nul:
copy themes.zoo "%installdir%\usr\share\mintty\themes"
mkdir "%installdir%\usr\share\mintty\info"
mkdir "%installdir%\usr\share\mintty\sounds" 2> nul:
copy sounds.zoo "%installdir%\usr\share\mintty\sounds"
mkdir "%installdir%\usr\share\mintty\info" 2> nul:
copy charnames.txt "%installdir%\usr\share\mintty\info"
mkdir "%installdir%\usr\share\mintty\icon"
copy wsl.ico "%installdir%\usr\share\mintty\icon"
mkdir "%installdir%\usr\share\mintty\icon" 2> nul:
copy tux.ico "%installdir%\usr\share\mintty\icon"
copy mintty.ico "%installdir%\usr\share\mintty\icon"
mkdir "%installdir%\usr\share\mintty\emojis" 2> nul:
copy getemojis "%installdir%\usr\share\mintty\emojis" 2> nul:
copy getflags "%installdir%\usr\share\mintty\emojis" 2> nul:
mkdir "%installdir%\usr\share\terminfo" 2> nul:
copy terminfo.zoo "%installdir%\usr\share\terminfo"
rem create Start Menu Folder
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty
mkdir "%smf%"
set smf="%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty"
call dequote smf
mkdir "%smf%" 2> nul:
rem clean up previous installation
del /Q "%smf%\*.lnk"
@@ -77,16 +112,21 @@ copy "add to context menu.lnk" "%smf%"
copy "add default to context menu.lnk" "%smf%"
copy "remove from context menu.lnk" "%smf%"
copy "configure WSL shortcuts.lnk" "%smf%"
copy "WSL Terminal.lnk" "%smf%"
copy "WSL Terminal %%.lnk" "%smf%"
rem copy "WSL Terminal.lnk" "%smf%"
rem copy "WSL Terminal %%.lnk" "%smf%"
rem clean up previous installation
rmdir /S /Q "%smf%\context menu shortcuts"
rmdir /S /Q "%smf%\context menu shortcuts" 2> nul:
rem unpack config files in system config directory
cd /D "%installdir%\usr\share\mintty\lang"
"%installdir%\bin\zoo" xO lang
cd /D "%installdir%\usr\share\mintty\themes"
"%installdir%\bin\zoo" xO themes
cd /D "%installdir%\usr\share\mintty\sounds"
"%installdir%\bin\zoo" xO sounds
cd /D "%installdir%\usr\share\terminfo"
"%installdir%\bin\zoo" xO terminfo
cd /D "%installdir%"
:migrate configuration
@@ -101,24 +141,54 @@ rmdir "%oldhomedir%\.config"
if exist "%configdir%\config" goto deloldhome
if exist "%oldhomedir%\.minttyrc" copy "%oldhomedir%\.minttyrc" "%configdir%\config" && del "%oldhomedir%\.minttyrc"
:deloldhome
rmdir "%oldhomedir%"
rmdir "%oldroot%\home"
rmdir "%oldhomedir%" 2> nul:
rmdir "%oldroot%\home" 2> nul:
:userconfig
rem create user config directory and subfolders
mkdir "%configdir%\lang"
mkdir "%configdir%\sounds"
mkdir "%configdir%\themes"
rem create user config directory and subfolders, copy scripts
mkdir "%configdir%\lang" 2> nul:
mkdir "%configdir%\themes" 2> nul:
mkdir "%configdir%\sounds" 2> nul:
mkdir "%configdir%\emojis" 2> nul:
copy "%installdir%\usr\share\mintty\emojis\getemojis" "%configdir%\emojis" 2> nul:
copy "%installdir%\usr\share\mintty\emojis\getflags" "%configdir%\emojis" 2> nul:
goto noetc
rem 3.8.0.2: create global config file for troubleshooting
mkdir "%installdir%\etc" 2> nul:
echo ###########################>"%installdir%\etc\minttyrc"
echo # Troubleshooting>>"%installdir%\etc\minttyrc"
echo # To work around a pty interworking issue between wsl and cygwin,>>"%installdir%\etc\minttyrc"
echo # we need to apply this configuration for now:>>"%installdir%\etc\minttyrc"
echo Baud=999999>>"%installdir%\etc\minttyrc"
goto etcok
:noetc
rem 3.8.0.3: remove previous troubleshooting patch
if exist "%installdir%\etc\minttyrc" del "%installdir%\etc\minttyrc"
if exist "%installdir%\etc" rmdir "%installdir%\etc"
:etcok
rem create config file if it does not yet exist
if not exist "%configdir%\config" echo # To use common configuration in %%APPDATA%%\mintty, simply remove this file>"%configdir%\config"
if exist "%configdir%\config" goto appconfig
echo # To use common configuration in %%APPDATA%%\mintty, simply remove this file>"%configdir%\config"
if "%3" == "/P" echo # Do not remove this file for WSLtty Portable>>"%configdir%\config"
:appconfig
rem skip configuration for WSLtty Portable
if "%3" == "/P" goto end
rem distro-specific stuff: shortcuts and launch scripts
cd "%installdir%"
bin\dash.exe "%installdir%\config-distros.sh"
rem bin\dash.exe "%installdir%\config-distros.sh" -contextmenu
cd /D "%installdir%"
echo Configuring for WSL distributions
bin\dash.exe "config-distros.sh"
rem rem bin\dash.exe "config-distros.sh" -contextmenu
:end

319
makefile
View File

@@ -4,62 +4,88 @@
# 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=1.9.5
##############################
# mintty and wsltty release versions
wslttyver=3.8.0.3
# wsltty appx release - must have 4 parts!
verx=1.9.5.0
minttyver=3.8.0
minrepo=git@github.com:mintty/mintty.git
##############################
# wsltty appx release (obsolete) - must have 4 parts!
appxver=$(wslttyver).1
##############################
# wslbridge2 repository and release version
repo=Biswa96/wslbridge2
wslbridgever=0.13
# 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)
# wslbridge2 latest version
#archive=master
#wslbridgedir=wslbridge2-$(archive)
# wslbridge2 branch or commit version (from fix-window-resize branch) and dir
#commit=70e0dcea1db122d076ce1578f2a45280cc92d09f
#commit=8b6dd7ee2b3102d72248990c21764c5cf86c6612
# trying post-0.12 WSL V2 patches:
#commit=5b2b652d1a7355b004e7860b4370a585737e5ac9
#commit=274530b35a05df203d3a69f0e28d5015844f39bd
# pixel size patch + fix (retagged as 0.13):
#commit=a7162d852ff438d2d5a8dd8dae61795addb3d980
#archive=$(commit)
#wslbridgedir=wslbridge2-$(archive)
##############################
# mintty branch or commit version
#minttyver=master
# wslbridge branch or commit to build from source;
wslbridge=wslbridge-source wslbridge-frontend wslbridge-backend
##############################
# build backend on a musl-libc-based distribution
# (reportedly not needed anymore but untested)
BuildDistr=-d Alpine
##############################
# Windows SDK version for appx
WINSDKKEY=/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Microsoft/.NET Framework Platform/Setup/Multi-Targeting Pack
WINSDKVER=`regtool list '$(WINSDKKEY)' | sed -e '$$ q' -e d`
##############################
# mintty release version
minttyver=2.9.5
# or mintty branch or commit version
#minttyver=master
##############################
# wslbridge binary package; may be overridden below
wslbridge=wslbridge-package
wslbridgever=0.2.4
# or wslbridge branch or commit to build from source;
# also set wslbridge-commit
wslbridge=wslbridge-frontend wslbridge-backend
# release 0.2.0 does not have cygwin_internal(CW_SYNC_WINENV) yet:
#wslbridge-commit=master
# use --distro-guid option (merged into 0.2.4):
#wslbridge-commit=cb22e3f6f989cefe5b6599d3c04422ded74db664
# after 0.2.4, from branch login-mode:
wslbridge-commit=04a060505860915c99bc336dbeb80269771a80b7
# after 0.2.4, from branch wslpath:
wslbridge-commit=29df86d87135caec8424c08f031ce121a3a39ae1
# after 0.2.4, merged wslpath branch:
wslbridge-commit=06fb7acba28d7f37611f3911685af214739895a0
# after 0.2.4, with --backend option:
wslbridge-commit=47b41bec6c32da58ab01de9345087b1a4fd836e3
#############################################################################
# default target
all: all-$(notdir $(CURDIR))
all-wsltty: check pkg
# targets and version checking
all-wsltty: check committed pkg
all-wsltty.appx: appx
committed:
if git status -suno | sed -e "s,^..,," | grep .; then false; fi
#############################################################################
# target checking and some defs
@@ -85,74 +111,112 @@ wgeto=curl -R -L --connect-timeout 55
# - ensure the path name drag-and-drop adaptation works (-> Cygwin, not MSYS)
# - 64 Bit (x86_64) for more stable invocation (avoid fork issues)
check:
arch:=$(shell uname -m)
check: # checkarch
echo Building for:
echo $(arch) | grep .
# checking suitable host environment; run `make pkg` to bypass
# check cygwin (vs msys) for proper drag-and-drop paths:
uname | grep CYGWIN
checkarch:
# check 32 bit to ensure 32-Bit Windows support, just in case:
#uname -m | grep i686
# check 64 bit to provide 64-Bit stability support:
uname -m | grep x86_64
#uname -m | grep x86_64
#############################################################################
# patch version information for appx package configuration
fix-verx:
fix-appxver:
echo patching $(WINSDKVER) into Launcher config
cd Launcher; sed -i~ -e "/<supportedRuntime / s,Version=v[.0-9]*,Version=$(WINSDKVER)," app.config
echo patched app.config
cd Launcher; sed -i~ -e "/<TargetFrameworkVersion>/ s,v[.0-9]*,$(WINSDKVER)," Launcher.csproj
echo patched Launcher.csproj
echo patching $(verx) into app config
sed -i~ -e '/<Identity / s,Version="[.0-9]*",Version="$(verx)",' AppxManifest.xml
echo patching $(appxver) into app config
sed -i~ -e '/<Identity / s,Version="[.0-9]*",Version="$(appxver)",' AppxManifest.xml
echo patched AppxManifest.xml
#############################################################################
# clear binaries
clean:
rm -fr $(wslbridgedir)/bin
rm -fr bin
#############################################################################
# generation
wslbridge: $(wslbridge)
wslbridge-package:
$(wget) https://github.com/rprichard/wslbridge/releases/download/$(wslbridgever)/wslbridge-$(wslbridgever)-$(sys).tar.gz
tar xvzf wslbridge-$(wslbridgever)-$(sys).tar.gz
$(wslbridgedir).zip:
$(wgeto) https://github.com/$(repo)/archive/$(archive).zip -o $(wslbridgedir).zip
wslbridge-source: $(wslbridgedir).zip
unzip -o $(wslbridgedir).zip
cp $(wslbridgedir)/LICENSE LICENSE.wslbridge2
# the following two patches are obsolete with wslbridge2 v0.9
# patch to fix #220
# test case in mintty: (sleep 0.1; echo -e "\e[31;80t") & wslbridge2
#cd $(wslbridgedir); patch -p1 < ../0001-notify-size-change-inband.patch
# patch to https://github.com/Biswa96/wslbridge2/commit/41575379b416703c49e2687e957440239a4cdfb7
#cd $(wslbridgedir); patch -p0 < ../0002-add-com-for-lifted-wsl.patch
# patch to fix WSL 2 launching, again
# this was replaced with another patch upstream
#cd $(wslbridgedir); patch -p1 < ../0012-get-vmid-from-registry.patch
# patch to add WINCH/pty pixel size support (Biswa96/wslbridge2#44)
#cd $(wslbridgedir); patch -p1 < ../0013-pty-pixel-size.patch
# patch to fix the pixel patch of 0.13
#cd $(wslbridgedir); patch -p1 < ../0013-pty-pixel-size-fix.patch
wslbridge-frontend:
echo ------------- Compiling wslbridge2 frontend
mkdir -p bin
cp wslbridge-$(wslbridgever)-$(sys)/wslbridge* bin/
tr -d '\015' < wslbridge-$(wslbridgever)-$(sys)/LICENSE.txt > LICENSE.wslbridge
# frontend build
cd $(wslbridgedir)/src; make -f Makefile.frontend RELEASE=1
# extract binaries
cp $(wslbridgedir)/bin/wslbridge2.exe bin/
wslbridge-source: wslbridge-$(wslbridge-commit).zip
unzip -o wslbridge-$(wslbridge-commit).zip
tr -d '\015' < wslbridge-$(wslbridge-commit)/LICENSE.txt > LICENSE.wslbridge
windir=$(shell cd "${WINDIR}"; pwd)
wslbridge-$(wslbridge-commit).zip:
$(wgeto) https://github.com/rprichard/wslbridge/archive/$(wslbridge-commit).zip -o wslbridge-$(wslbridge-commit).zip
wslbridge-frontend: wslbridge-source
cd wslbridge-$(wslbridge-commit)/frontend; make
strip wslbridge-$(wslbridge-commit)/out/wslbridge.exe
wslbridge-backend:
echo ------------- Compiling wslbridge2 backend
#uname -m | grep x86_64
mkdir -p bin
cp wslbridge-$(wslbridge-commit)/out/wslbridge.exe bin/
# 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 $(wslbridgedir)/src; PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe $(BuildDistr) make -f Makefile.backend RELEASE=1 < /dev/null
# extract binaries
cp $(wslbridgedir)/bin/wslbridge2-backend bin/
wslbridge-backend: wslbridge-source
cd wslbridge-$(wslbridge-commit)/backend; if uname -m | grep x86_64; then cmd /C wsl make; else wslbridge make; fi
mkdir -p bin
cp wslbridge-$(wslbridge-commit)/out/wslbridge-backend bin/
mintty-get: mintty-git # mintty-download or mintty-git
cp mintty-$(minttyver)/icon/terminal.ico mintty.ico
mintty-get:
mintty-download:
$(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip
unzip -o mintty-$(minttyver).zip
mintty-git:
test -d mintty-$(minttyver) || git clone --branch $(minttyver) --depth 1 $(minrepo) mintty-$(minttyver)
cd mintty-$(minttyver); git checkout $(minttyver)
wslbuild=LDFLAGS="-static -static-libgcc -s"
appxbuild=$(wslbuild) CCOPT=-DWSLTTY_APPX
wslversion=VERSION_SUFFIX=" wsltty $(ver)" WSLTTY_VERSION="$(ver)"
appxversion=VERSION_SUFFIX=" wsltty appx $(verx)" WSLTTY_VERSION="$(verx)"
wslversion=VERSION_SUFFIX=" wsltty $(wslttyver)" WSLTTY_VERSION="$(wslttyver)"
appxversion=VERSION_SUFFIX=" wsltty appx $(appxver)" WSLTTY_VERSION="$(appxver)"
mintty-build:
# ensure rebuild of version-specific check and message
rm -f mintty-$(minttyver)/bin/*/windialog.o
rm -f mintty-$(minttyver)/bin/*/winmain.o
# build mintty
cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion)
mkdir -p bin
cp mintty-$(minttyver)/bin/mintty.exe bin/
strip bin/mintty.exe
mintty-build-appx:
# ensure rebuild of version-specific check and message
@@ -161,25 +225,37 @@ mintty-build-appx:
cd mintty-$(minttyver)/src; make $(appxbuild) $(appxversion)
mkdir -p bin
cp mintty-$(minttyver)/bin/mintty.exe bin/
strip bin/mintty.exe
terminfoxt=78/xterm 78/xterm-vt220 78/xterm-256color 78/xterm-direct
terminfovt=76/vt100 76/vt220 76/vt340 76/vt420 76/vt525
terminfomt=6d/mintty 6d/mintty-direct
terminfo=$(terminfoxt) $(terminfovt) $(terminfomt)
mintty-pkg:
cp mintty-$(minttyver)/LICENSE LICENSE.mintty
cd mintty-$(minttyver)/lang; zoo a lang *.po; mv lang.zoo ../../
cd mintty-$(minttyver)/themes; zoo a themes *[!~]; mv themes.zoo ../../
cd mintty-$(minttyver)/sounds; zoo a sounds *.wav *.WAV *.md; mv sounds.zoo ../../
cd /usr/share/terminfo; zoo a /tmp/terminfo $(terminfo)
mv /tmp/terminfo.zoo .
# add charnames.txt to support "Character Info"
cd mintty-$(minttyver)/src; sh ./mknames
cp mintty-$(minttyver)/src/charnames.txt .
mintty-appx:
mkdir -p usr/share/mintty
cd usr/share/mintty; mkdir -p lang themes info
cd usr/share/mintty; mkdir -p lang themes sounds info emojis
cp mintty-$(minttyver)/lang/*.po usr/share/mintty/lang/
cp mintty-$(minttyver)/themes/*[!~] usr/share/mintty/themes/
cp mintty-$(minttyver)/sounds/*.wav usr/share/mintty/sounds/
cp mintty-$(minttyver)/sounds/*.WAV usr/share/mintty/sounds/
# add charnames.txt to support "Character Info"
cd mintty-$(minttyver)/src; sh ./mknames
cp mintty-$(minttyver)/src/charnames.txt usr/share/mintty/info/
cp /usr/share/mintty/emojis/get*[!~] usr/share/mintty/emojis/
cygwin:
cygwin: # mkshortcutexe
mkdir -p bin
cp /bin/cygwin1.dll bin/
cp /bin/cygwin-console-helper.exe bin/
@@ -187,37 +263,85 @@ cygwin:
cp /bin/regtool.exe bin/
cp /bin/zoo.exe bin/
mkshortcutexe: bin/mkshortcut.exe
bin/mkshortcut.exe: mkshortcut.c
echo mksh
gcc -o bin/mkshortcut mkshortcut.c -lpopt -lole32 /usr/lib/w32api/libuuid.a
cp /bin/cygpopt-0.dll bin/
cp /bin/cygiconv-2.dll bin/
cp /bin/cygintl-8.dll bin/
appx-bin:
mkdir -p bin
cp /bin/cygwin1.dll bin/
cp /bin/cygwin-console-helper.exe bin/
cop: ver
mkdir -p rel
rm -fr rel/wsltty-$(ver)-install.exe
sed -e "s,%version%,$(ver)," 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 charnames.txt rel/
cp bin/wslbridge.exe rel/
cp bin/wslbridge-backend 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-$(wslttyver)-$(arch)
cab: cop
cd rel; iexpress /n wsltty.SED
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 terminfo.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)/
cp mintty-$(minttyver)/tools/get*[!~] $(CAB)/
cop: copcab
mkdir -p rel
cp -fl $(CAB)/* rel/
installer: cop cab normal-installer silent-installer portable-installer
cab:
# build cab archive
lcab -r $(CAB) rel/$(CAB).cab
normal-installer:
# prepare build of installer
rm -f rel/$(CAB)-install.exe
sed -e "s,%version%,$(wslttyver)," -e "s,%arch%,$(arch)," makewinx.cfg > rel/wsltty.SED
# build installer
cd rel; iexpress /n /q wsltty.SED
silent-installer:
# prepare build of installer
rm -f rel/$(CAB)-install-quiet.exe
cd rel; sed -e "/ShowInstallProgramWindow/ s/0/1/" -e "/HideExtractAnimation/ s/0/1/" -e "/InstallPrompt/ s/=.*/=/" -e "/FinishMessage/ s/=.*/=/" -e "/TargetName/ s/install.exe/install-quiet.exe/" wsltty.SED > wsltty-quiet.SED
# build installer
cd rel; iexpress /n /q wsltty-quiet.SED
InstallPrompt=Install Mintty terminal for WSL Portable?
FinishMessage=Mintty for WSL Portable installation finished
portable-installer:
# prepare build of installer
rm -f rel/$(CAB)-install-portable.exe
cd rel; sed -e "/InstallPrompt/ s/=.*/=$(InstallPrompt)/" -e "/FinishMessage/ s/=.*/=$(FinishMessage)/" -e "/AppLaunched/ s/install/install-portable/" -e "/TargetName/ s/install.exe/install-portable.exe/" wsltty.SED > wsltty-portable.SED
# build installer
cd rel; iexpress /n /q wsltty-portable.SED
install: cop installbat
@@ -225,7 +349,7 @@ installbat:
cd rel; cmd /C install
ver:
echo $(ver) > VERSION
echo $(wslttyver) > VERSION
mintty: mintty-get mintty-build
@@ -234,14 +358,17 @@ 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
# appx package target:
appx: wsltty-appx fix-verx
appx: wsltty-appx fix-appxver
sh ./build.sh
#############################################################################

View File

@@ -1,5 +1,5 @@
[Version]
Class=IEXPRESS
Class=IExpress
SEDVersion=3
[Options]
@@ -23,70 +23,50 @@ UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles
[Strings]
InstallPrompt=Install Mintty terminal for WSL (Windows Subsystem for Linux)?
InstallPrompt=Install Mintty terminal for WSL?
DisplayLicense=
FinishMessage=Mintty for WSL installed - for documentation see https://github.com/mintty/wsltty
TargetName=wsltty-%version%-install.exe
FinishMessage=Mintty for WSL installed - for documentation and configuration see https://github.com/mintty/wsltty
TargetName=wsltty-%version%-%arch%-install.exe
FriendlyName=wsltty
AppLaunched=cmd.exe /c install.bat
PostInstallCmd=<None>
AdminQuietInstCmd=
UserQuietInstCmd=
FILE0="cygwin1.dll"
FILE1="cygwin-console-helper.exe"
FILE2="mintty.exe"
FILE3="wslbridge.exe"
FILE4="wslbridge-backend"
FILE5="LICENSE.mintty"
FILE6="LICENSE.wslbridge"
FILE7="config-distros.sh"
FILE8="configure WSL shortcuts.lnk"
FILE9="charnames.txt"
FILE10="VERSION"
FILE11="dash.exe"
FILE12="regtool.exe"
FILE13="install.bat"
FILE14="uninstall.bat"
FILE15="wsl.ico"
FILE16="add to context menu.lnk"
FILE17="add default to context menu.lnk"
FILE18="remove from context menu.lnk"
FILE19="wsltty home & help.url"
FILE20="zoo.exe"
FILE21="lang.zoo"
FILE22="themes.zoo"
FILE23="WSL Terminal %.lnk"
FILE24="WSL Terminal.lnk"
FILE25="mkshortcut.vbs"
[SourceFiles]
SourceFiles0=.
[SourceFiles0]
%FILE0%=
%FILE1%=
%FILE2%=
%FILE3%=
%FILE4%=
%FILE5%=
%FILE6%=
%FILE7%=
%FILE8%=
%FILE9%=
%FILE10%=
%FILE11%=
%FILE12%=
%FILE13%=
%FILE14%=
%FILE15%=
%FILE16%=
%FILE17%=
%FILE18%=
%FILE19%=
%FILE20%=
%FILE21%=
%FILE22%=
%FILE23%=
%FILE24%=
%FILE25%=
cygwin1.dll=
cygwin-console-helper.exe=
mintty.exe=
wslbridge2.exe=
wslbridge2-backend=
LICENSE.mintty=
LICENSE.wslbridge2=
config-distros.sh=
configure WSL shortcuts.lnk=
charnames.txt=
VERSION=
dash.exe=
regtool.exe=
install.bat=
uninstall.bat=
tux.ico=
add to context menu.lnk=
add default to context menu.lnk=
remove from context menu.lnk=
wsltty home & help.url=
zoo.exe=
lang.zoo=
themes.zoo=
sounds.zoo=
terminfo.zoo=
mintty.ico=
mkshortcut.vbs=
dequote.bat=
cmd2.bat=
install-portable.bat=
getemojis=
getflags=

814
mkshortcut.c Normal file
View File

@@ -0,0 +1,814 @@
/* This is a tweaked version of mkshortcut.c -- create a Windows shortcut
Changes:
* Facilitate path entries starting with Windows environment variables.
(works for working directory and icon location but not for target path)
* Do not barf on Windows path syntax.
*/
#include <sys/cygwin.h>
#include <string.h>
#include <wchar.h>
#define dont_debug_cygwin_create_path
/* Preserve leading Windows environment variable for shortcut entries.
So e.g. %USERPROFILE% is not pseudo-resolved to some subdirectory
but can be used as working directory.
NOTE:
This works for working directory and icon location but not for the
target path which is still polluted with a drive prefix by Windows.
*/
void * _cygwin_create_path (int line, cygwin_conv_path_t what, const void *from)
{
what &= CCP_CONVTYPE_MASK;
void * to = cygwin_create_path(what, from);
if (what == CCP_WIN_W_TO_POSIX ? *(wchar_t*)from == '%' : *(char*)from == '%') {
if (what == CCP_POSIX_TO_WIN_W) {
to = wcschr(to, '%') ?: to;
} else {
to = strchr(to, '%') ?: to;
}
}
#ifdef debug_cygwin_create_path
switch (what) {
case CCP_POSIX_TO_WIN_A:
printf("[%d] %s -> %s\n", line, from, to);
break;
case CCP_POSIX_TO_WIN_W:
printf("[%d] %s -> %ls\n", line, from, to);
break;
case CCP_WIN_A_TO_POSIX:
printf("[%d] %s -> %s\n", line, from, to);
break;
case CCP_WIN_W_TO_POSIX:
printf("[%d] %ls -> %s\n", line, from, to);
break;
}
#endif
return to;
}
#define cygwin_create_path(what, from) _cygwin_create_path(__LINE__, what, from)
/* mkshortcut.c -- create a Windows shortcut
*
* Copyright (c) 2002 Joshua Daniel Franklin
*
* Unicode-enabled by (C) 2015 Thomas Wolff
* semantic changes:
Allow dir to be empty (legal in shortcut)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* See the COPYING file for full license information.
*
* Exit values
* 1: user error (syntax error)
* 2: system error (out of memory, etc.)
* 3: windows error (interface failed)
*
* Compile with: gcc -o mkshortcut mkshortcut.c -lpopt -lole32 /usr/lib/w32api/libuuid.a
* (You'd need to uncomment the moved to common.h lines.)
*
*/
#if HAVE_CONFIG_H
# include "config.h"
#endif
//#include "common.h"
#include <stdio.h>
#include <popt.h>
#include <sys/stat.h>
#include <errno.h>
#define PACKAGE_VERSION "*"
#include <locale.h>
#include <wchar.h>
#define NOCOMATTRIBUTE
#include <shlobj.h>
#include <olectl.h>
/* moved to common.h */
/*
#include <stdio.h>
#include <popt.h>
*/
#include <sys/cygwin.h>
#include <string.h> // strlen
static const char versionID[] = PACKAGE_VERSION;
static const char revID[] =
"$Id$";
static const char copyrightID[] =
"Copyright (c) 2002\nJoshua Daniel Franklin. All rights reserved.\nLicensed under GPL v2.0\n";
typedef struct optvals_s
{
int icon_flag;
int unix_flag;
int windows_flag;
int allusers_flag;
int desktop_flag;
int smprograms_flag;
int show_flag;
int offset;
char *name_arg;
char *desc_arg;
char *dir_name_arg;
char *argument_arg;
char *target_arg;
char *icon_name_arg;
} optvals;
static int mkshortcut (optvals opts);
static void printTopDescription (FILE * f, char *name);
static void printBottomDescription (FILE * f, char *name);
static const char *getVersion ();
static void usage (FILE * f, char *name);
static void help (FILE * f, char *name);
static void version (FILE * f, char *name);
static void license (FILE * f, char *name);
static char *program_name;
static poptContext optCon;
static WCHAR *
towcs (const char * s)
{
int sizew = (strlen (s) * 2 + 1); // worst case: surrogates
WCHAR * ws = malloc (sizew * sizeof (WCHAR));
mbstowcs (ws, s, sizew);
return ws;
}
int
main (int argc, const char **argv)
{
const char **rest;
int rc;
int ec = 0;
optvals opts;
const char *tmp_str;
int icon_offset_flag;
const char *arg;
struct poptOption helpOptionsTable[] = {
{"help", 'h', POPT_ARG_NONE, NULL, '?',
"Show this help message", NULL},
{"usage", '\0', POPT_ARG_NONE, NULL, 'u',
"Display brief usage message", NULL},
{"version", 'v', POPT_ARG_NONE, NULL, 'v',
"Display version information", NULL},
{"license", '\0', POPT_ARG_NONE, NULL, 'l',
"Display licensing information", NULL},
{NULL, '\0', 0, NULL, 0, NULL, NULL}
};
struct poptOption generalOptionsTable[] = {
{"arguments", 'a', POPT_ARG_STRING, NULL, 'a',
"Use arguments ARGS", "ARGS"},
{"desc", 'd', POPT_ARG_STRING, NULL, 'd',
"Text for description/tooltip (defaults to POSIX path of TARGET)",
"DESC"},
{"icon", 'i', POPT_ARG_STRING, NULL, 'i',
"Icon file for link to use", "ICONFILE"},
{"iconoffset", 'j', POPT_ARG_INT, &(opts.offset), 'j',
"Offset of icon in icon file (default is 0)", NULL},
{"name", 'n', POPT_ARG_STRING, NULL, 'n',
"Name for link (defaults to TARGET)", "NAME"},
{"show", 's', POPT_ARG_STRING, NULL, 's',
"Window to show: normal, minimized, maximized", "norm|min|max"},
{"workingdir", 'w', POPT_ARG_STRING, NULL, 'w',
"Set working directory (defaults to directory path of TARGET)", "PATH"},
{"allusers", 'A', POPT_ARG_VAL, &(opts.allusers_flag), 1,
"Use 'All Users' instead of current user for -D,-P", NULL},
{"desktop", 'D', POPT_ARG_VAL, &(opts.desktop_flag), 1,
"Create link relative to 'Desktop' directory", NULL},
{"smprograms", 'P', POPT_ARG_VAL, &(opts.smprograms_flag), 1,
"Create link relative to Start Menu 'Programs' directory", NULL},
{NULL, '\0', 0, NULL, 0, NULL, NULL}
};
struct poptOption opt[] = {
{NULL, '\0', POPT_ARG_INCLUDE_TABLE, generalOptionsTable, 0,
"General options", NULL},
{NULL, '\0', POPT_ARG_INCLUDE_TABLE, helpOptionsTable, 0,
"Help options", NULL},
{NULL, '\0', 0, NULL, 0, NULL, NULL}
};
setlocale (LC_CTYPE, "");
tmp_str = strrchr (argv[0], '/');
if (tmp_str == NULL)
{
tmp_str = strrchr (argv[0], '\\');
}
if (tmp_str == NULL)
{
tmp_str = argv[0];
}
else
{
tmp_str++;
}
if ((program_name = strdup (tmp_str)) == NULL)
{
fprintf (stderr, "%s: memory allocation error\n", argv[0]);
exit (2);
}
icon_offset_flag = 0;
opts.offset = 0;
opts.icon_flag = 0;
opts.unix_flag = 0;
opts.windows_flag = 0;
opts.allusers_flag = 0;
opts.desktop_flag = 0;
opts.smprograms_flag = 0;
opts.show_flag = SW_SHOWNORMAL;
opts.target_arg = NULL;
opts.argument_arg = NULL;
opts.name_arg = NULL;
opts.desc_arg = NULL;
opts.dir_name_arg = NULL;
opts.icon_name_arg = NULL;
/* Parse options */
optCon = poptGetContext (NULL, argc, argv, opt, 0);
poptSetOtherOptionHelp (optCon, "[OPTION]* TARGET");
while ((rc = poptGetNextOpt (optCon)) > 0)
{
switch (rc)
{
case '?':
help (stdout, program_name);
goto exit;
case 'u':
usage (stdout, program_name);
goto exit;
case 'v':
version (stdout, program_name);
goto exit;
case 'l':
license (stdout, program_name);
goto exit;
case 'd':
if (arg = poptGetOptArg (optCon))
{
if ((opts.desc_arg = strdup (arg)) == NULL)
{
fprintf (stderr, "%s: memory allocation error\n",
program_name);
ec = 2;
goto exit;
}
}
break;
case 'i':
opts.icon_flag = 1;
if (arg = poptGetOptArg (optCon))
{
opts.icon_name_arg = (char *) cygwin_create_path (
CCP_POSIX_TO_WIN_A, arg);
if (opts.icon_name_arg == NULL)
{
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
program_name, strerror (errno));
ec = 2;
goto exit;
}
}
break;
case 'j':
icon_offset_flag = 1;
break;
case 'n':
if (arg = poptGetOptArg (optCon))
{
if ((opts.name_arg = strdup (arg)) == NULL)
{
fprintf (stderr, "%s: memory allocation error\n",
program_name);
ec = 2;
goto exit;
}
}
break;
case 's':
if (arg = poptGetOptArg (optCon))
{
if (strcmp (arg, "min") == 0)
{
opts.show_flag = SW_SHOWMINNOACTIVE;
}
else if (strcmp (arg, "max") == 0)
{
opts.show_flag = SW_SHOWMAXIMIZED;
}
else if (strcmp (arg, "norm") == 0)
{
opts.show_flag = SW_SHOWNORMAL;
}
else
{
fprintf (stderr, "%s: %s not valid for show window\n",
program_name, arg);
ec = 2;
goto exit;
}
}
break;
case 'w':
if (arg = poptGetOptArg (optCon))
{
if ((opts.dir_name_arg = strdup (arg)) == NULL)
{
fprintf (stderr, "%s: memory allocation error\n",
program_name);
ec = 2;
goto exit;
}
}
break;
case 'a':
if (arg = poptGetOptArg (optCon))
{
if ((opts.argument_arg = strdup (arg)) == NULL)
{
fprintf (stderr, "%s: memory allocation error\n",
program_name);
ec = 2;
goto exit;
}
}
break;
// case 'A'
// case 'D'
// case 'P' all handled by popt itself
}
}
if (icon_offset_flag & !opts.icon_flag)
{
fprintf (stderr,
"%s: --iconoffset|-j only valid in conjuction with --icon|-i\n",
program_name);
usage (stderr, program_name);
ec = 1;
goto exit;
}
if (opts.smprograms_flag && opts.desktop_flag)
{
fprintf (stderr,
"%s: --smprograms|-P not valid in conjuction with --desktop|-D\n",
program_name);
usage (stderr, program_name);
ec = 1;
goto exit;
}
if (rc < -1)
{
fprintf (stderr, "%s: bad argument %s: %s\n",
program_name, poptBadOption (optCon, POPT_BADOPTION_NOALIAS),
poptStrerror (rc));
ec = 1;
goto exit;
}
rest = poptGetArgs (optCon);
if (rest && *rest)
{
if ((opts.target_arg = strdup (*rest)) == NULL)
{
fprintf (stderr, "%s: memory allocation error\n", program_name);
ec = 2;
goto exit;
}
rest++;
if (rest && *rest)
{
fprintf (stderr, "%s: Too many arguments: ", program_name);
while (*rest)
fprintf (stderr, "%s ", *rest++);
fprintf (stderr, "\n");
usage (stderr, program_name);
ec = 1;
}
else
{
// THE MEAT GOES HERE
ec = mkshortcut (opts);
}
}
else
{
fprintf (stderr, "%s: TARGET not specified\n", program_name);
usage (stderr, program_name);
ec = 1;
}
exit:
return ec;
}
static char *
xstrncat (char **dest, const char *add)
{
size_t n = strlen (add);
size_t len = strlen (*dest) + n + 1;
char *s = (char *) realloc (*dest, len * sizeof (char));
if (!s)
{
fprintf (stderr, "%s: out of memory\n", program_name);
exit (2);
}
*dest = s;
return strncat (*dest, add, n);
}
int
mkshortcut (optvals opts)
{
char * link_name = NULL;
WCHAR * exe_name = NULL;
WCHAR * dir_name = NULL;
WCHAR * desc = NULL;
char * buf_str;
char * tmp_str;
char * base_str;
int tmp;
/* For OLE interface */
LPITEMIDLIST id;
HRESULT hres;
IShellLinkW * shell_link;
IPersistFile * persist_file;
exe_name = (WCHAR *) cygwin_create_path (CCP_POSIX_TO_WIN_W, opts.target_arg);
if (!exe_name)
{
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
program_name, strerror (errno));
return 2;
}
#ifdef colon_stuff
/* If there's a colon in the TARGET, it should be a URL */
if (strchr (opts.target_arg, ':') != NULL)
{
/* Nope, somebody's trying a W32 path */
if (opts.target_arg[1] == ':')
{
fprintf (stderr, "%s: all paths must be in POSIX format\n",
program_name);
usage (stderr, program_name);
return 1;
}
dir_name = L"";
}
/* Convert TARGET to win32 path */
else
#endif
{
buf_str = strdup (opts.target_arg);
if (opts.dir_name_arg != NULL)
/* Get a working dir from 'w' option */
{
#ifdef colon_stuff
if (strchr (opts.dir_name_arg, ':') != NULL)
{
fprintf (stderr, "%s: all paths must be in POSIX format\n",
program_name);
usage (stderr, program_name);
return 1;
}
#endif
dir_name = (WCHAR *) cygwin_create_path (CCP_POSIX_TO_WIN_W,
opts.dir_name_arg);
if (!dir_name)
{
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
program_name, strerror (errno));
return 2;
}
}
else
/* Allow dir to be empty (legal in shortcut) */
{
dir_name = L"";
}
}
/* Generate a name for the link if not given */
if (opts.name_arg == NULL)
{
/* Strip trailing /'s if any */
buf_str = strdup (opts.target_arg);
base_str = buf_str;
tmp_str = buf_str;
tmp = strlen (buf_str) - 1;
while (strrchr (buf_str, '/') == (buf_str + tmp))
{
buf_str[tmp] = '\0';
tmp--;
}
/* Get basename */
while (*buf_str)
{
if (*buf_str == '/')
tmp_str = buf_str + 1;
buf_str++;
}
link_name = strdup (tmp_str);
}
/* User specified a name, so check it and convert */
else
{
if (opts.desktop_flag || opts.smprograms_flag)
{
/* Cannot have absolute path relative to Desktop/SM Programs */
if (opts.name_arg[0] == '/')
{
fprintf (stderr,
"%s: absolute pathnames not allowed with -D/-P\n",
program_name);
usage (stderr, program_name);
return 1;
}
}
/* Sigh. Another W32 path */
#ifdef colon_stuff
if (strchr (opts.name_arg, ':') != NULL)
{
fprintf (stderr, "%s: all paths must be in POSIX format\n",
program_name);
usage (stderr, program_name);
return 1;
}
#endif
link_name = (char *) cygwin_create_path (
CCP_POSIX_TO_WIN_A | CCP_RELATIVE, opts.name_arg);
// passing multi-byte characters transparently per byte
if (!link_name)
{
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
program_name, strerror (errno));
return 2;
}
}
/* Add suffix to link name if necessary */
if (strlen (link_name) > 4)
{
tmp = strlen (link_name) - 4;
if (strncmp (link_name + tmp, ".lnk", 4) != 0)
xstrncat (&link_name, ".lnk");
}
else
xstrncat (&link_name, ".lnk");
/* Prepend relative path if necessary */
if (opts.desktop_flag)
{
char local_buf[MAX_PATH];
buf_str = strdup (link_name);
if (!opts.allusers_flag)
SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id);
else
SHGetSpecialFolderLocation (NULL, CSIDL_COMMON_DESKTOPDIRECTORY, &id);
SHGetPathFromIDList (id, local_buf);
/* Make sure Win95 without "All Users" has output */
if (strlen (local_buf) == 0)
{
SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id);
SHGetPathFromIDList (id, local_buf);
}
link_name = strdup (local_buf);
xstrncat (&link_name, "\\");
xstrncat (&link_name, buf_str);
}
if (opts.smprograms_flag)
{
char local_buf[MAX_PATH];
buf_str = strdup (link_name);
if (!opts.allusers_flag)
SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id);
else
SHGetSpecialFolderLocation (NULL, CSIDL_COMMON_PROGRAMS, &id);
SHGetPathFromIDList (id, local_buf);
/* Make sure Win95 without "All Users" has output */
if (strlen (local_buf) == 0)
{
SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id);
SHGetPathFromIDList (id, local_buf);
}
link_name = strdup (local_buf);
xstrncat (&link_name, "\\");
xstrncat (&link_name, buf_str);
}
/* Make link name Unicode-compliant */
WCHAR * widename = towcs (link_name);
/* After Windows 7, saving link to relative path fails; work around that */
#ifdef corrupt_memory
WCHAR widepath[MAX_PATH];
hres = GetFullPathNameW (widename, sizeof (widepath), widepath, NULL);
if (hres == 0)
{
fprintf (stderr, "%s: Could not qualify link name\n", program_name);
return 2;
}
#else
WCHAR * widepath = (WCHAR *) cygwin_create_path (CCP_POSIX_TO_WIN_W, link_name);
#endif
link_name = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX, widepath);
/* Setup description text */
if (opts.desc_arg != NULL)
{
desc = towcs (opts.desc_arg);
}
else
{
/* Put the POSIX path in the "Description", just to be nice */
desc = towcs (cygwin_create_path (CCP_WIN_A_TO_POSIX, exe_name));
if (!desc)
{
fprintf (stderr, "%s: error converting win32 path to posix (%s)\n",
program_name, strerror (errno));
return 2;
}
}
/* Beginning of Windows interface */
hres = OleInitialize (NULL);
if (hres != S_FALSE && hres != S_OK)
{
fprintf (stderr, "%s: Could not initialize OLE interface\n",
program_name);
return 3;
}
hres =
CoCreateInstance (&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
&IID_IShellLinkW, (void **) &shell_link);
if (SUCCEEDED (hres))
{
hres =
shell_link->lpVtbl->QueryInterface (shell_link, &IID_IPersistFile,
(void **) &persist_file);
if (SUCCEEDED (hres))
{
shell_link->lpVtbl->SetPath (shell_link, exe_name);
shell_link->lpVtbl->SetDescription (shell_link, desc);
shell_link->lpVtbl->SetWorkingDirectory (shell_link, dir_name);
if (opts.argument_arg)
shell_link->lpVtbl->SetArguments (shell_link,
towcs (opts.argument_arg));
if (opts.icon_flag)
shell_link->lpVtbl->SetIconLocation (shell_link,
towcs (opts.icon_name_arg),
opts.offset);
if (opts.show_flag != SW_SHOWNORMAL)
shell_link->lpVtbl->SetShowCmd (shell_link, opts.show_flag);
hres = persist_file->lpVtbl->Save (persist_file, widepath, TRUE);
if (!SUCCEEDED (hres))
{
fprintf (stderr,
"%s: Saving \"%s\" failed; does the target directory exist?\n",
program_name, link_name);
return 3;
}
persist_file->lpVtbl->Release (persist_file);
shell_link->lpVtbl->Release (shell_link);
/* If we are creating shortcut for all users, ensure it is readable by all users */
if (opts.allusers_flag)
{
char *posixpath = (char *) cygwin_create_path (
CCP_WIN_W_TO_POSIX | CCP_ABSOLUTE, widepath);
if (posixpath && *posixpath)
{
struct stat statbuf;
if (stat (posixpath, &statbuf))
{
fprintf (stderr,
"%s: stat \"%s\" failed\n",
program_name, posixpath);
}
else if (chmod (posixpath, statbuf.st_mode|S_IRUSR|S_IRGRP|S_IROTH))
{
fprintf (stderr,
"%s: chmod \"%s\" failed\n",
program_name, posixpath);
}
}
}
return 0;
}
else
{
fprintf (stderr, "%s: QueryInterface failed\n", program_name);
return 3;
}
}
else
{
fprintf (stderr, "%s: CoCreateInstance failed\n", program_name);
return 3;
}
}
static const char *
getVersion ()
{
return versionID;
}
static void
printTopDescription (FILE * f, char *name)
{
char s[20];
fprintf (f, "%s is part of cygutils version %s\n", name, getVersion ());
fprintf (f, " create a Windows shortcut\n\n");
}
static void
printBottomDescription (FILE * f, char *name)
{
fprintf (f,
"\nNOTE: All filename arguments must be in unix (POSIX) format\n");
}
static void
printLicense (FILE * f, char *name)
{
fprintf (f,
"This program is free software: you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published by\n"
"the Free Software Foundation, either version 3 of the License, or\n"
"(at your option) any later version.\n\n"
"This program is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License for more details.\n\n"
"You should have received a copy of the GNU General Public License\n"
"along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"
"See the COPYING file for full license information.\n");
}
static void
usage (FILE * f, char *name)
{
poptPrintUsage (optCon, f, 0);
}
static void
help (FILE * f, char *name)
{
printTopDescription (f, name);
poptPrintHelp (optCon, f, 0);
printBottomDescription (f, name);
}
static void
version (FILE * f, char *name)
{
printTopDescription (f, name);
fprintf (f, copyrightID);
}
static void
license (FILE * f, char *name)
{
printTopDescription (f, name);
printLicense (f, name);
}

View File

@@ -1,7 +1,7 @@
rem cscript mkshortcut.vbs [/param:arg] /target:link
rem cscript mkshortcut.vbs [/param:arg] /target:link
rem /target:%LOCALAPPDATA%\wsltty\bin\mintty.exe
rem /workingdir:%USERPROFILE%
rem /wdir:%USERPROFILE%
rem /icon:%LOCALAPPDATA%\wsltty\wsl.ico
rem deprecated: /icon:%LOCALAPPDATA%\lxss\bash.ico
rem deprecated: %
@@ -24,13 +24,22 @@ rem lnk.Arguments = Wscript.Arguments.Named("arguments")
lnk.TargetPath = wshell.ExpandEnvironmentStrings("%target%")
minttyargs = wshell.ExpandEnvironmentStrings("%minttyargs%")
bridgeargs = wshell.ExpandEnvironmentStrings("%bridgeargs%")
lnk.Arguments = minttyargs & bridgeargs
lnk.Arguments = minttyargs & " " & bridgeargs
rem wscript.echo "minttyargs: " & minttyargs
rem wscript.echo lnk.Arguments
rem Start in:
rem lnk.WorkingDirectory = Wscript.Arguments.Named("workingdir")
lnk.WorkingDirectory = "%USERPROFILE%"
rem Working directory; Arguments.Named would take "/wdir:C:\..." parameters
rem wdir = Wscript.Arguments.Named("wdir")
rem Working directory; function ExpandEnvironmentStrings cannot pass empty
wdir = wshell.ExpandEnvironmentStrings("%wdir%")
if IsEmpty(wdir) then
lnk.WorkingDirectory = "%USERPROFILE%"
elseif wdir = "." then
lnk.WorkingDirectory = ""
else
lnk.WorkingDirectory = wdir
end if
rem Icon:
rem icon = Wscript.Arguments.Named("icon")
@@ -46,7 +55,12 @@ rem Shorcut key:
rem lnk.HotKey = "ALT+CTRL+W"
rem Run:
rem 1: Normal 7: Minimized 3: Maximized
rem lnk.WindowStyle = 1
min = Wscript.Arguments.Named("min")
if min then
lnk.WindowStyle = 7
end if
rem Comment:
rem lnk.IconLocation = Wscript.Arguments.Named("desc")

View File

Before

Width:  |  Height:  |  Size: 472 KiB

After

Width:  |  Height:  |  Size: 472 KiB

BIN
tux1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
ubuntu1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,34 +1,32 @@
@echo off
if "%installdir%" == "" set installdir=%LOCALAPPDATA%\wsltty
if "%installdir%" == "" set installdir="%LOCALAPPDATA%\wsltty"
call dequote installdir
:shortcuts
rem delete Start Menu Folder
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty
set smf="%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty"
call dequote smf
rmdir /S /Q "%smf%"
rem delete Desktop Shortcuts (not installed anymore)
rem del "%USERPROFILE%\Desktop\WSL % in Mintty.lnk"
rem del "%USERPROFILE%\Desktop\WSL ~ in Mintty.lnk"
:start menu
cd %installdir%
cd /D "%installdir%"
bin\dash.exe config-distros.sh -shortcuts-remove
:explorer context menu
cd %installdir%
cd /D "%installdir%"
bin\dash.exe config-distros.sh -contextmenu-remove
:undeploy
cd %installdir%
cd /D "%installdir%"
rem currently not removing software