mirror of
https://github.com/mintty/wsltty.git
synced 2025-11-04 17:11:54 +00:00
Compare commits
119 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24c450ea82 | ||
|
|
639ed3da8f | ||
|
|
7940883bd6 | ||
|
|
b60bcc15da | ||
|
|
0a38ed1126 | ||
|
|
5136d7e878 | ||
|
|
0d39faaaf6 | ||
|
|
d61e551236 | ||
|
|
3f60e3f48c | ||
|
|
a207cae3a8 | ||
|
|
79c3f9e450 | ||
|
|
75c67869bf | ||
|
|
7776748081 | ||
|
|
bac370cfce | ||
|
|
975dbb9398 | ||
|
|
432b71d2fd | ||
|
|
1b41dfa1e0 | ||
|
|
336db2f19b | ||
|
|
1f67e41333 | ||
|
|
0520b71e1f | ||
|
|
92b982690e | ||
|
|
f0a3449ada | ||
|
|
3d4055a63b | ||
|
|
2fb994604a | ||
|
|
5da3a053a9 | ||
|
|
ad65aa9931 | ||
|
|
c9acce8d76 | ||
|
|
1533c27b36 | ||
|
|
3e3eaf6e31 | ||
|
|
482df018c9 | ||
|
|
23fc790c26 | ||
|
|
e5c67ecc7c | ||
|
|
20075c6378 | ||
|
|
05ce002fc6 | ||
|
|
cc37c6c2d5 | ||
|
|
5ef4879be2 | ||
|
|
97699c2010 | ||
|
|
4316b754da | ||
|
|
b8171d61a6 | ||
|
|
d7f14146fd | ||
|
|
46ee1b4c1c | ||
|
|
27a9ce6f42 | ||
|
|
e88e60a786 | ||
|
|
dfeaf49ae9 | ||
|
|
fd81d580d6 | ||
|
|
3281c12216 | ||
|
|
46ab74d6b4 | ||
|
|
a5b546ee4a | ||
|
|
fc8e7cda45 | ||
|
|
b23a0a4b3d | ||
|
|
a2414e0dc7 | ||
|
|
963a40d919 | ||
|
|
017b05c48c | ||
|
|
52b03a43d9 | ||
|
|
26a1abb148 | ||
|
|
e7709798c5 | ||
|
|
37c5e0dc40 | ||
|
|
55c034ec66 | ||
|
|
df054073ef | ||
|
|
ace39cbd03 | ||
|
|
e9b2e108f7 | ||
|
|
f66c87cc62 | ||
|
|
36e0d9c58a | ||
|
|
5db1916332 | ||
|
|
8911503a87 | ||
|
|
55792acd8d | ||
|
|
b8330e46d8 | ||
|
|
65553b90ef | ||
|
|
2fb7d02091 | ||
|
|
4c7eb01b93 | ||
|
|
0fd1dd9077 | ||
|
|
64c2d04b56 | ||
|
|
e283f413ba | ||
|
|
4ce4b11094 | ||
|
|
84c16fb927 | ||
|
|
65bf9273ad | ||
|
|
36a39d99de | ||
|
|
be761f3aab | ||
|
|
c3b062c00b | ||
|
|
149b1a6f1a | ||
|
|
9fd7a1135b | ||
|
|
92a7cceae2 | ||
|
|
1ef83d72e1 | ||
|
|
9be0b3ec10 | ||
|
|
276fb6ae88 | ||
|
|
288c56a3d2 | ||
|
|
082eb760eb | ||
|
|
d5cc2bfe77 | ||
|
|
1e453b05e9 | ||
|
|
ee8d3b0678 | ||
|
|
2f69d2740d | ||
|
|
4a55503707 | ||
|
|
48f69cb11f | ||
|
|
0a39c664e2 | ||
|
|
fecb6c49af | ||
|
|
b017982c19 | ||
|
|
f6016239df | ||
|
|
b5349bf6db | ||
|
|
3b1ecb2e01 | ||
|
|
beed642144 | ||
|
|
a3c32980e7 | ||
|
|
e6ce36e2bd | ||
|
|
d865b01135 | ||
|
|
1e7bb5fc6e | ||
|
|
8ffb732330 | ||
|
|
0d1f0875be | ||
|
|
d7c73fb40e | ||
|
|
1049ca2baf | ||
|
|
088f3bc06b | ||
|
|
28dfd66e09 | ||
|
|
3b6a356585 | ||
|
|
195f4069b4 | ||
|
|
9b3b1a89aa | ||
|
|
4e937486f5 | ||
|
|
a9a9ad5155 | ||
|
|
b4a26196eb | ||
|
|
4bca6510b5 | ||
|
|
01274fc94c | ||
|
|
d7c156c2fa |
@@ -1,4 +1,4 @@
|
||||
mintty is copyright 2008-13 Andy Koppe, 2015-16 Thomas Wolff.
|
||||
mintty is copyright 2008-13 Andy Koppe, 2015-18 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
|
||||
@@ -26,3 +28,12 @@ The program icon is the apps/utilities-terminal icon from KDE's Oxygen theme,
|
||||
retrieved from http://websvn.kde.org/trunk/KDE/kdebase/runtime/pics/oxygen.
|
||||
Thanks to the KDE artists for their sleek design. The Oxygen icons are licensed
|
||||
under the terms of the LGPLv3; see LICENSE.Oxygen for details.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Ryan Prichard
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
217
README.md
217
README.md
@@ -1,60 +1,203 @@
|
||||
Mintty as a terminal for Bash on Ubuntu on Windows / WSL.
|
||||
Mintty as a terminal for WSL (Windows Subsystem for Linux).
|
||||
|
||||
<img align=right src=wsltty.png>
|
||||
|
||||
### Overview ###
|
||||
|
||||
Run the [installer](https://github.com/mintty/wsltty/releases) to install
|
||||
* wsltty package components (see below) in the user’s application folder (where WSL is also installed)
|
||||
* an empty wsltty “home directory” to enable storage of a mintty config file
|
||||
* Start Menu and Desktop shortcuts to start a WSL bash (with some variations, see below)
|
||||
* optional context menu entries for Windows Explorer to start a WSL bash in the respective folder
|
||||
* install/uninstall context menu items from Start Menu subfolder
|
||||
* `wsl*.bat` scripts to invoke wsltty manually (with some variations and invocation options, see below)
|
||||
* an uninstall script that can be invoked manually to remove shortcuts and context menu entries
|
||||
WSLtty components
|
||||
* wsltty package components (see below) in the user’s local application folder
|
||||
`%LOCALAPPDATA%`
|
||||
* a wsltty configuration directory in the user’s application folder `%APPDATA%`
|
||||
(“home”-located configuration files from a previously installed version
|
||||
will be migrated to the new default location)
|
||||
* Start Menu shortcuts to start WSL terminals
|
||||
* `*.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`
|
||||
|
||||
---
|
||||
|
||||
### 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.
|
||||
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.
|
||||
|
||||
#### 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.
|
||||
|
||||
#### Installation to non-default locations ####
|
||||
|
||||
(For experts)
|
||||
Within the installation process, provide parameters to the script `install.bat`.
|
||||
The optional first parameter designates the installation target,
|
||||
the optional second parameter designates the configuration directory.
|
||||
|
||||
### Installation with other package management environments ###
|
||||
|
||||
#### Chocolatey ####
|
||||
|
||||
If you use the [Chocolatey package manager](https://chocolatey.org/),
|
||||
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`
|
||||
|
||||
#### Scoop ####
|
||||
|
||||
If you use the [Scoop package manager](https://scoop.sh/),
|
||||
* `scoop bucket add extras`
|
||||
|
||||
then, invoke one of
|
||||
* `scoop install wsltty`
|
||||
* `scoop update wsltty`
|
||||
|
||||
#### Windows Appx package ####
|
||||
|
||||
A Windows Appx package and certificate is available in the [wsltty.appx](https://github.com/mintty/wsltty.appx/) repository.
|
||||
|
||||
<br clear=all>
|
||||
|
||||
---
|
||||
|
||||
### Invocation ###
|
||||
|
||||
WSLtty can be invoked with
|
||||
* installed Start Menu shortcuts (or Desktop shortcuts if copied there)
|
||||
* *.bat scripts (optionally with WSL command as parameters)
|
||||
* 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 2 ####
|
||||
|
||||
Due to some incompatible changes by Microsoft, wslbridge cannot connect
|
||||
in WSL 2 mode at this time.
|
||||
Workaround:
|
||||
* `wsl --set-default-version 1`
|
||||
|
||||
---
|
||||
|
||||
### Configuration ###
|
||||
|
||||
#### Command line scripts wsl*.bat ####
|
||||
|
||||
WSLtty installs the following scripts in its application folder `%LOCALAPPDATA%\wsltty`:
|
||||
* `wsl.bat` to start a WSL bash in the current folder/directory
|
||||
* `wsl~.bat` to start a WSL bash in the WSL user home
|
||||
* `wsl-l.bat` to start a WSL login bash
|
||||
|
||||
To enable invocation of these scripts from WIN+R or from cmd.exe,
|
||||
copy them from `%LOCALAPPDATA%\wsltty` into `%SYSTEMROOT%\System32`,
|
||||
renaming them as desired.
|
||||
(The package does not do this to avoid trouble with missing admin privileges.)
|
||||
|
||||
#### Start Menu and Desktop shortcuts ####
|
||||
|
||||
The Start Menu subfolder WSLtty offers three shortcuts:
|
||||
* `WSL Bash % in Mintty` to start a WSL bash in the Windows %USERPROFILE% home
|
||||
* `WSL Bash ~ in Mintty` to start a WSL bash in the WSL user home
|
||||
* `WSL Bash -l in Mintty` to start a WSL login bash
|
||||
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`)
|
||||
|
||||
To ensure a login bash to start in your Linux home directory,
|
||||
add a `cd` command to your `$HOME/.profile` on Linux side.
|
||||
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
|
||||
|
||||
One Desktop shortcut is installed:
|
||||
* `WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`)
|
||||
|
||||
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.
|
||||
If 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
|
||||
* `WSL.bat` and `WSL~.bat` to start the default WSL distribution
|
||||
|
||||
Given that `%LOCALAPPDATA%\Microsoft\WindowsApps` is in your PATH,
|
||||
the scripts can be invoked from cmd.exe, PowerShell, or via WIN+R.
|
||||
|
||||
#### Context menu entries ####
|
||||
|
||||
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`:
|
||||
* <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 default. You can replace it with your preferred fallback icon
|
||||
by replacing the icon file `%LOCALAPPDATA%\wsltty\wsl.ico`.
|
||||
|
||||
#### Mintty settings ####
|
||||
|
||||
Mintty can maintain its configuration file in various locations,
|
||||
with the following precedence:
|
||||
* file given with mintty option `-c`
|
||||
* `%LOCALAPPDATA%\wsltty\home\%USERNAME%\.minttyrc`
|
||||
* `%LOCALAPPDATA%\wsltty\home\%USERNAME%\.config\mintty\config`
|
||||
* 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.
|
||||
* `%HOME%\.minttyrc` (usage deprecated with wsltty)
|
||||
* `%HOME%\.config\mintty\config` (usage deprecated with wsltty)
|
||||
* `%APPDATA%\mintty\config`
|
||||
* `%LOCALAPPDATA%\wsltty\etc\minttyrc`
|
||||
* `%LOCALAPPDATA%\wsltty\etc\minttyrc` (usage deprecated with wsltty)
|
||||
|
||||
Note that the `%APPDATA%\mintty\config` option provides the possibility
|
||||
to maintain common mintty settings for various installations (like
|
||||
wsltty, Cygwin, MinGW/msys, Git for Windows, MinEd for Windows).
|
||||
Note:
|
||||
* `%APPDATA%\wsltty\config` is the new 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
|
||||
wsltty software installation location.
|
||||
* The `%APPDATA%\mintty\config` option provides the possibility to
|
||||
maintain common mintty settings for various installations (like
|
||||
wsltty, Cygwin, MinGW/msys, Git for Windows, MinEd for Windows).
|
||||
* (About deprecated options) By default, `%HOME%` would refer to the
|
||||
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.
|
||||
|
||||
### Components ###
|
||||
#### Shell selection and Login shell ####
|
||||
|
||||
For mintty, see the [Mintty homepage](http://mintty.github.io/).
|
||||
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.
|
||||
|
||||
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):
|
||||
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" /bin/bash -l`
|
||||
|
||||
---
|
||||
|
||||
### Components and Credits ###
|
||||
|
||||
For mintty, see the [Mintty homepage](http://mintty.github.io/)
|
||||
(with further screenshots),
|
||||
the [Mintty manual page](http://mintty.github.io/mintty.1.html),
|
||||
<br>and the [Mintty Wiki](https://github.com/mintty/mintty/wiki),
|
||||
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)).
|
||||
|
||||
For interacting with WSL, it uses [wslbridge](https://github.com/rprichard/wslbridge).
|
||||
|
||||
Many thanks for this enabling gateway go especially to Ryan Prichard.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
add default to context menu.lnk
Executable file
BIN
add default to context menu.lnk
Executable file
Binary file not shown.
Binary file not shown.
@@ -1,59 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem See comments in install.bat about changing the installation directory.
|
||||
set installdir=%LOCALAPPDATA%\wsltty
|
||||
|
||||
|
||||
if "%1"=="/U" goto remove
|
||||
if "%1"=="/u" goto remove
|
||||
|
||||
|
||||
:add
|
||||
rem add to Explorer context menu
|
||||
|
||||
set userdirname=HKEY_CURRENT_USER\Software\Classes\Directory\shell
|
||||
set userdirpane=HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell
|
||||
|
||||
rem WSL in Mintty
|
||||
set label=WSL in Mintty
|
||||
rem set here=in this directory
|
||||
set here=Here
|
||||
|
||||
rem WSL icon
|
||||
set icon=%LOCALAPPDATA%\lxss\bash.ico
|
||||
|
||||
rem WSL target shell
|
||||
set shell=/bin/bash
|
||||
|
||||
rem Mintty invocation
|
||||
set cmd=%installdir%\bin\mintty.exe
|
||||
set cset=-o Locale=C -o Charset=UTF-8
|
||||
set opts=--wsl
|
||||
set arg=/bin/wslbridge -t %shell%
|
||||
set target0=\"%cmd%\" %opts% %cset% -i \"%icon%\" %arg%
|
||||
rem set target1=\"%cmd%\" %opts% %cset% -i \"%icon%\" /bin/dash -c \"cd '%%1'; exec %arg%\"
|
||||
set target1=\"%cmd%\" %opts% %cset% -i \"%icon%\" --dir \"%%1\" %arg%
|
||||
|
||||
rem Registry entries
|
||||
reg add "%userdirname%\wsltty" /d "%label% %here%" /f
|
||||
reg add "%userdirname%\wsltty" /v Icon /d "%icon%" /f
|
||||
reg add "%userdirname%\wsltty\command" /d "%target1%" /f
|
||||
reg add "%userdirpane%\wsltty" /d "%label% %here%" /f
|
||||
reg add "%userdirpane%\wsltty" /v Icon /d "%icon%" /f
|
||||
reg add "%userdirpane%\wsltty\command" /d "%target0%" /f
|
||||
|
||||
goto end
|
||||
|
||||
|
||||
:remove
|
||||
rem remove from Explorer context menu
|
||||
|
||||
rem delete Explorer context menu
|
||||
set userdirname=HKEY_CURRENT_USER\Software\Classes\Directory\shell
|
||||
set userdirpane=HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell
|
||||
|
||||
reg delete "%userdirname%\wsltty" /f
|
||||
reg delete "%userdirpane%\wsltty" /f
|
||||
|
||||
|
||||
:end
|
||||
317
config-distros.sh
Executable file
317
config-distros.sh
Executable file
@@ -0,0 +1,317 @@
|
||||
#! /bin/sh
|
||||
|
||||
# set some paths; capital variables are for the mkshortcut.exe case,
|
||||
# not for the (deprecated) mkshortcut.vbs case
|
||||
|
||||
case "$installdir" in
|
||||
?*) custominst=true;;
|
||||
"") custominst=false;;
|
||||
esac
|
||||
|
||||
INSTDIR=${installdir:-$LOCALAPPDATA/wsltty}
|
||||
INSTDIR=`cd "$INSTDIR"; pwd`
|
||||
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":$SYSTEMROOT/System32
|
||||
|
||||
contextmenu=false
|
||||
remove=false
|
||||
alldistros=true
|
||||
config=true
|
||||
|
||||
case "/$0" in
|
||||
*/wsl*)
|
||||
config=false;;
|
||||
esac
|
||||
|
||||
case "$1" in
|
||||
-info)
|
||||
config=false
|
||||
shift;;
|
||||
-shortcuts-remove)
|
||||
remove=true
|
||||
shift;;
|
||||
-contextmenu)
|
||||
contextmenu=true
|
||||
shift;;
|
||||
-contextmenu-default)
|
||||
contextmenu=true
|
||||
alldistros=false
|
||||
shift;;
|
||||
-contextmenu-remove)
|
||||
contextmenu=true
|
||||
remove=true
|
||||
direckey='/HKEY_CURRENT_USER/Software/Classes/Directory'
|
||||
|
||||
regtool list "$direckey/shell" 2>/dev/null |
|
||||
while read name
|
||||
do
|
||||
case `regtool get "$direckey/shell/$name/command/"` in
|
||||
*bin\\mintty.exe*/bin/wslbridge*|*bin\\mintty.exe*--WSL*)
|
||||
regtool remove "$direckey/shell/$name/command"
|
||||
regtool remove "$direckey/shell/$name"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
regtool list "$direckey/Background/shell" 2>/dev/null |
|
||||
while read name
|
||||
do
|
||||
case `regtool get "$direckey/Background/shell/$name/command/"` in
|
||||
*bin\\mintty.exe*/bin/wslbridge*|*bin\\mintty.exe*--WSL*)
|
||||
regtool remove "$direckey/Background/shell/$name/command"
|
||||
regtool remove "$direckey/Background/shell/$name"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
exit
|
||||
shift;;
|
||||
esac
|
||||
|
||||
# test w/o WSL: call this script with REGTOOLFAKE=true dash config-distros.sh
|
||||
if ${REGTOOLFAKE:-false}
|
||||
then
|
||||
regtool () {
|
||||
case "$1" in
|
||||
-*) shift;;
|
||||
esac
|
||||
key=`echo $2 | sed -e 's,.*{\(.*\)}.*,\1,' -e t -e d`
|
||||
case "$1.$2" in
|
||||
list.*)
|
||||
if $contextmenu
|
||||
then echo "{0}"
|
||||
else echo "{1}"; echo "{2}"
|
||||
fi;;
|
||||
get.*/DistributionName)
|
||||
echo "distro$key";;
|
||||
get.*/BasePath)
|
||||
echo "C:\\Program\\{$key}\\State";;
|
||||
get.*/PackageFamilyName)
|
||||
echo "distro{$key}";;
|
||||
get.*/PackageFullName)
|
||||
echo "C:\\Program\\{$key}";;
|
||||
esac
|
||||
}
|
||||
fi
|
||||
|
||||
# dash built-in echo enforces interpretation of \t etc
|
||||
echoc () {
|
||||
cmd /c echo $*
|
||||
}
|
||||
|
||||
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
|
||||
fi
|
||||
|
||||
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"
|
||||
cmd /C copy "add to context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
|
||||
cmd /C copy "add default to context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
|
||||
cmd /C copy "remove from context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
|
||||
cmd /C copy "configure WSL shortcuts.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
|
||||
fi
|
||||
|
||||
lxss="/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Lxss"
|
||||
schema="/HKEY_CURRENT_USER/Software/Classes/Local Settings/Software/Microsoft/Windows/CurrentVersion/AppModel/SystemAppData"
|
||||
|
||||
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
|
||||
{*)
|
||||
distro=`regtool get "$lxss/$guid/DistributionName"`
|
||||
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"`
|
||||
# get actual executable path (may not match $distro) from app manifest
|
||||
manifest="$ProgramW6432/WindowsApps/$instdir/AppxManifest.xml"
|
||||
psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable'
|
||||
executable=`appex "$manifest"`
|
||||
if [ -r "$ProgramW6432/WindowsApps/$instdir/$executable" ]
|
||||
then icon="%PROGRAMFILES%/WindowsApps/$instdir/$executable"
|
||||
elif [ -r "$ProgramW6432/WindowsApps/$instdir/images/icon.ico" ]
|
||||
then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico"
|
||||
else icon="$installdir"'\wsl.ico'
|
||||
fi
|
||||
root="$basepath/rootfs"
|
||||
elif [ -f "$basepath/$distro.exe" ]
|
||||
then
|
||||
icon="$basepath/$distro.exe"
|
||||
root="$basepath/rootfs"
|
||||
else
|
||||
icon="%LOCALAPPDATA%/lxss/bash.ico"
|
||||
root="$basepath"
|
||||
fi
|
||||
|
||||
#minttyargs='--wsl --rootfs="'"$root"'" --configdir="'"$configdir"'" -o Locale=C -o Charset=UTF-8 /bin/wslbridge '
|
||||
minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"'
|
||||
MINTARGS='--WSL="'"$distro"'" --configdir="'"$CONFDIR"'"'
|
||||
#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'
|
||||
|
||||
ok=true;;
|
||||
DefaultDistribution|"") # WSL default installation
|
||||
distro=
|
||||
name=WSL
|
||||
icon="$installdir"'\wsl.ico'
|
||||
minttyargs='--WSL= --configdir="'"$configdir"'"'
|
||||
MINTARGS='--WSL= --configdir="'"$CONFDIR"'"'
|
||||
bridgeargs='-t'
|
||||
|
||||
ok=true;;
|
||||
esac
|
||||
echoc "distro '$distro'"
|
||||
echoc "- name '$name'"
|
||||
echoc "- guid $guid"
|
||||
echoc "- (launcher $launcher)"
|
||||
echoc "- icon $icon"
|
||||
echoc "- root $root"
|
||||
bridgeargs=" " # deprecated
|
||||
|
||||
if $ok && [ -n "$distro" ]
|
||||
then # fix #163: backend missing +x with certain mount options
|
||||
echo Setting +x wslbridge-backend for distro "'$distro'"
|
||||
(cd "$INSTDIR"; cd bin; wsl.exe -d "$distro" chmod +x wslbridge-backend)
|
||||
# (cd "$LOCALAPPDATA/wsltty/bin"; wsl.exe -d "$distro" chmod +x wslbridge-backend)
|
||||
# (cd ... ; "$SYSTEMROOT/System32/bash.exe" "$guid" -c chmod +x wslbridge-backend)
|
||||
fi
|
||||
|
||||
if $ok && $config
|
||||
then
|
||||
export 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\\$keyname" /f
|
||||
reg delete "$direckey\\Background\\shell\\$keyname" /f
|
||||
else
|
||||
reg add "$direckey\\shell\\$keyname" /d "$name Terminal" /f
|
||||
reg add "$direckey\\shell\\$keyname" /v Icon /d "$icon" /f
|
||||
cmd /C reg add "$direckey\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f
|
||||
reg add "$direckey\\Background\\shell\\$keyname" /d "$name Terminal" /f
|
||||
reg add "$direckey\\Background\\shell\\$keyname" /v Icon /d "$icon" /f
|
||||
cmd /C reg add "$direckey\\Background\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f
|
||||
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"
|
||||
else
|
||||
# desktop shortcut in %USERPROFILE% -> Start Menu - WSLtty
|
||||
##cscript /nologo mkshortcut.vbs "/name:$name Terminal %"
|
||||
mkshortcut.exe -n "$name Terminal %" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE%
|
||||
cmd /C 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"
|
||||
|
||||
# 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"
|
||||
mkshortcut.exe -n "$name Terminal" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE%
|
||||
cmd /C 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"
|
||||
#cmd /C 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"`
|
||||
cmd /C 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"
|
||||
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
|
||||
|
||||
BIN
configure WSL shortcuts.lnk
Executable file
BIN
configure WSL shortcuts.lnk
Executable file
Binary file not shown.
140
install.bat
140
install.bat
@@ -1,61 +1,139 @@
|
||||
@echo off
|
||||
|
||||
rem If you change the installation directory,
|
||||
rem it also needs to be adapted in
|
||||
rem - the Shortcut links *.lnk
|
||||
rem - the cmd invocation scripts wsl*.bat
|
||||
|
||||
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
|
||||
|
||||
|
||||
:deploy
|
||||
|
||||
mkdir "%installdir%"
|
||||
|
||||
rem clean up previous installation artefacts
|
||||
del /Q "%installdir%\*.bat"
|
||||
del /Q "%installdir%\*.lnk"
|
||||
|
||||
copy LICENSE.mintty "%installdir%"
|
||||
copy LICENSE.wslbridge "%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%"
|
||||
rem copy "WSL Terminal.lnk" "%installdir%"
|
||||
rem copy "WSL Terminal %%.lnk" "%installdir%"
|
||||
copy config-distros.sh "%installdir%"
|
||||
|
||||
rem copy mkshortcut.vbs "%installdir%"
|
||||
|
||||
rem allow persistent customization of default icon:
|
||||
if not exist "%installdir%\wsl.ico" copy tux.ico "%installdir%\wsl.ico"
|
||||
|
||||
copy uninstall.bat "%installdir%"
|
||||
|
||||
copy wsl.bat "%installdir%"
|
||||
copy wsl~.bat "%installdir%"
|
||||
copy wsl-l.bat "%installdir%"
|
||||
copy "config-context-menu.bat" "%installdir%"
|
||||
copy "add to context menu.lnk" "%installdir%"
|
||||
copy "remove from context menu.lnk" "%installdir%"
|
||||
rem does not work without admin rights:
|
||||
rem copy wsl.bat "%SYSTEMROOT%\System32"
|
||||
rem copy wsl~.bat "%SYSTEMROOT%\System32"
|
||||
rem copy wsl-l.bat "%SYSTEMROOT%\System32"
|
||||
if not exist "%installdir%\bin" goto instbin
|
||||
rem move previous programs possibly in use out of the way
|
||||
del /Q "%installdir%\bin\*.old"
|
||||
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"
|
||||
|
||||
:instbin
|
||||
mkdir "%installdir%\bin"
|
||||
copy cygwin1.dll "%installdir%\bin"
|
||||
copy cygwin-console-helper.exe "%installdir%\bin"
|
||||
rem copy dash.exe "%installdir%\bin"
|
||||
copy mintty.exe "%installdir%\bin"
|
||||
copy wslbridge.exe "%installdir%\bin"
|
||||
copy wslbridge-backend "%installdir%\bin"
|
||||
|
||||
rem create "home directory" to enable storage of config file
|
||||
mkdir "%installdir%\home
|
||||
mkdir "%installdir%\home\%USERNAME%"
|
||||
copy dash.exe "%installdir%\bin"
|
||||
copy regtool.exe "%installdir%\bin"
|
||||
copy zoo.exe "%installdir%\bin"
|
||||
|
||||
copy mkshortcut.exe "%installdir%"\bin
|
||||
copy cygpopt-0.dll "%installdir%"\bin
|
||||
copy cygiconv-2.dll "%installdir%"\bin
|
||||
copy cygintl-8.dll "%installdir%"\bin
|
||||
|
||||
rem create system config directory and copy config archive
|
||||
mkdir "%installdir%\usr\share\mintty\lang"
|
||||
copy lang.zoo "%installdir%\usr\share\mintty\lang"
|
||||
mkdir "%installdir%\usr\share\mintty\themes"
|
||||
copy themes.zoo "%installdir%\usr\share\mintty\themes"
|
||||
mkdir "%installdir%\usr\share\mintty\sounds"
|
||||
copy sounds.zoo "%installdir%\usr\share\mintty\sounds"
|
||||
mkdir "%installdir%\usr\share\mintty\info"
|
||||
copy charnames.txt "%installdir%\usr\share\mintty\info"
|
||||
mkdir "%installdir%\usr\share\mintty\icon"
|
||||
copy tux.ico "%installdir%\usr\share\mintty\icon"
|
||||
copy mintty.ico "%installdir%\usr\share\mintty\icon"
|
||||
|
||||
:shortcuts
|
||||
|
||||
rem create Start Menu Folder
|
||||
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty
|
||||
mkdir "%smf%"
|
||||
echo on
|
||||
copy "wsltty home & help.url" "%smf%"
|
||||
copy "WSL Bash %% in Mintty.lnk" "%smf%"
|
||||
copy "WSL Bash ~ in Mintty.lnk" "%smf%"
|
||||
copy "WSL Bash -l in Mintty.lnk" "%smf%"
|
||||
mkdir "%smf%\context menu shortcuts"
|
||||
copy "add to context menu.lnk" "%smf%\context menu shortcuts"
|
||||
copy "remove from context menu.lnk" "%smf%\context menu shortcuts"
|
||||
|
||||
rem create Desktop Shorcuts
|
||||
copy "WSL Bash %% in Mintty.lnk" "%USERPROFILE%\Desktop"
|
||||
copy "WSL Bash ~ in Mintty.lnk" "%USERPROFILE%\Desktop"
|
||||
rem clean up previous installation
|
||||
del /Q "%smf%\*.lnk"
|
||||
|
||||
copy "wsltty home & help.url" "%smf%"
|
||||
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%"
|
||||
rem copy "WSL Terminal.lnk" "%smf%"
|
||||
rem copy "WSL Terminal %%.lnk" "%smf%"
|
||||
rem clean up previous installation
|
||||
rmdir /S /Q "%smf%\context menu shortcuts"
|
||||
|
||||
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
|
||||
|
||||
|
||||
:migrate configuration
|
||||
|
||||
rem migrate old config resource files to new config dir
|
||||
if exist "%configdir%" goto configfile
|
||||
if not exist "%oldconfigdir%" goto configfile
|
||||
if exist "%oldhomedir%\.minttyrc" copy "%oldhomedir%\.minttyrc" "%oldconfigdir%\config" && del "%oldhomedir%\.minttyrc"
|
||||
xcopy /E /I /Y "%oldconfigdir%" "%configdir%" && rmdir /S /Q "%oldconfigdir%"
|
||||
rmdir "%oldhomedir%\.config"
|
||||
:configfile
|
||||
if exist "%configdir%\config" goto deloldhome
|
||||
if exist "%oldhomedir%\.minttyrc" copy "%oldhomedir%\.minttyrc" "%configdir%\config" && del "%oldhomedir%\.minttyrc"
|
||||
:deloldhome
|
||||
rmdir "%oldhomedir%"
|
||||
rmdir "%oldroot%\home"
|
||||
|
||||
|
||||
:userconfig
|
||||
|
||||
rem create user config directory and subfolders
|
||||
mkdir "%configdir%\lang"
|
||||
mkdir "%configdir%\themes"
|
||||
mkdir "%configdir%\sounds"
|
||||
|
||||
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"
|
||||
|
||||
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
|
||||
|
||||
|
||||
:end
|
||||
|
||||
249
makefile
249
makefile
@@ -1,22 +1,64 @@
|
||||
#############################################################################
|
||||
# default: generate all
|
||||
all: check pkg
|
||||
# build a wsltty installer package:
|
||||
# configure ver=... and minttyver= in this makefile
|
||||
# make targets:
|
||||
# make [all] build a distributable installer (default)
|
||||
# make pkg build an installer, bypassing the system checks
|
||||
# make wsltty build the software, using the local copy of mintty
|
||||
|
||||
|
||||
# wsltty release
|
||||
ver=0.7.0
|
||||
ver=3.0.2.3
|
||||
|
||||
# wsltty appx release - must have 4 parts!
|
||||
verx=3.0.2.3
|
||||
|
||||
# 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
|
||||
minver=2.7.0
|
||||
#minver=master
|
||||
minttyver=3.0.2
|
||||
|
||||
# wslbridge backend version
|
||||
wslbridgever=0.2.1
|
||||
# wslbridge frontend version
|
||||
# release 0.2.0 does not have cygwin_internal(CW_SYNC_WINENV) yet;
|
||||
# therefore using "master" below
|
||||
#wslbridge-frontend=wslbridge-frontend
|
||||
# release 0.2.1 is updated and complete, no separate frontend build needed:
|
||||
wslbridge-frontend=
|
||||
# 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
|
||||
|
||||
all-wsltty.appx: appx
|
||||
|
||||
#############################################################################
|
||||
# target checking and some defs
|
||||
@@ -39,69 +81,196 @@ wget=curl -R -L --connect-timeout 55 -O
|
||||
wgeto=curl -R -L --connect-timeout 55
|
||||
|
||||
#############################################################################
|
||||
# system check;
|
||||
# for now, let's enforce Cygwin 32-Bit as the container for wsltty
|
||||
# just in case there is a 32-Bit WSL released (-> 32 bit), and to ensure
|
||||
# the path name drag-and-drop adaptation works (-> cygwin, not msys)
|
||||
# system check:
|
||||
# - ensure the path name drag-and-drop adaptation works (-> Cygwin, not MSYS)
|
||||
# - 64 Bit (x86_64) for more stable invocation (avoid fork issues)
|
||||
|
||||
check:
|
||||
# checking suitable host environment; run `make pkg` to bypass
|
||||
# check cygwin (vs msys) for proper drag-and-drop paths:
|
||||
uname | grep CYGWIN
|
||||
# check 32 bit (vs 64 bit) to ensure 32-Bit Windows support, just in case:
|
||||
uname -m | grep i686
|
||||
# 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
|
||||
|
||||
#############################################################################
|
||||
# patch version information for appx package configuration
|
||||
|
||||
fix-verx:
|
||||
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 patched AppxManifest.xml
|
||||
|
||||
#############################################################################
|
||||
# generation
|
||||
|
||||
wslbridge: wslbridge-backend $(wslbridge-frontend)
|
||||
wslbridge: $(wslbridge)
|
||||
|
||||
wslbridge-backend:
|
||||
wslbridge-package:
|
||||
$(wget) https://github.com/rprichard/wslbridge/releases/download/$(wslbridgever)/wslbridge-$(wslbridgever)-$(sys).tar.gz
|
||||
tar xvzf wslbridge-$(wslbridgever)-$(sys).tar.gz
|
||||
mkdir -p bin
|
||||
cp wslbridge-$(wslbridgever)-$(sys)/wslbridge* bin/
|
||||
cp wslbridge-$(wslbridgever)-$(sys)/LICENSE.txt LICENSE.wslbridge
|
||||
tr -d '\015' < wslbridge-$(wslbridgever)-$(sys)/LICENSE.txt > LICENSE.wslbridge
|
||||
|
||||
wslbridge-frontend:
|
||||
$(wgeto) https://github.com/rprichard/wslbridge/archive/master.zip -o wslbridge-master.zip
|
||||
unzip -o wslbridge-master.zip
|
||||
cd wslbridge-master/frontend; make
|
||||
strip wslbridge-master/out/wslbridge.exe
|
||||
wslbridge-source: wslbridge-$(wslbridge-commit).zip
|
||||
unzip -o wslbridge-$(wslbridge-commit).zip
|
||||
cd wslbridge-$(wslbridge-commit)/backend; patch -T -p1 < ../../wslbridge-backend-static.patch
|
||||
tr -d '\015' < wslbridge-$(wslbridge-commit)/LICENSE.txt > LICENSE.wslbridge
|
||||
|
||||
wslbridge-$(wslbridge-commit).zip:
|
||||
$(wgeto) https://github.com/rprichard/wslbridge/archive/$(wslbridge-commit).zip -o wslbridge-$(wslbridge-commit).zip
|
||||
|
||||
wslbridge-frontend: wslbridge-source
|
||||
echo ------------- Compiling wslbridge frontend
|
||||
cd wslbridge-$(wslbridge-commit)/frontend; make
|
||||
strip wslbridge-$(wslbridge-commit)/out/wslbridge.exe
|
||||
mkdir -p bin
|
||||
cp wslbridge-master/out/wslbridge.exe bin/
|
||||
cp wslbridge-master/LICENSE.txt LICENSE.wslbridge
|
||||
cp wslbridge-$(wslbridge-commit)/out/wslbridge.exe bin/
|
||||
|
||||
mintty:
|
||||
$(wgeto) https://github.com/mintty/mintty/archive/$(minver).zip -o mintty-$(minver).zip
|
||||
unzip -o mintty-$(minver).zip
|
||||
cd mintty-$(minver)/src; make LDFLAGS="-static -static-libgcc -s"
|
||||
#wslbridge-backend: wslbridge-source
|
||||
# tweak dependency to support build testing on non-Windows 10:
|
||||
backend-bin=wslbridge-$(wslbridge-commit)/out/wslbridge-backend
|
||||
backend-src=wslbridge-$(wslbridge-commit)/backend/wslbridge-backend.cc
|
||||
wslbridge-backend: $(backend-bin) wslbridge-source
|
||||
$(backend-bin): $(backend-src)
|
||||
echo ------------- Compiling wslbridge backend
|
||||
cd wslbridge-$(wslbridge-commit)/backend; if uname -m | grep x86_64; then cmd /C wsl make; else wslbridge make; fi
|
||||
mkdir -p bin
|
||||
cp mintty-$(minver)/bin/mintty.exe bin/
|
||||
cp mintty-$(minver)/LICENSE LICENSE.mintty
|
||||
cp wslbridge-$(wslbridge-commit)/out/wslbridge-backend bin/
|
||||
|
||||
cygwin:
|
||||
mintty-get:
|
||||
$(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip
|
||||
unzip -o mintty-$(minttyver).zip
|
||||
cp mintty-$(minttyver)/icon/terminal.ico mintty.ico
|
||||
|
||||
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)"
|
||||
|
||||
mintty-build:
|
||||
# ensure rebuild of version-specific check and message
|
||||
rm -f mintty-$(minttyver)/bin/*/windialog.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
|
||||
rm -f mintty-$(minttyver)/bin/*/windialog.o
|
||||
# build mintty
|
||||
cd mintty-$(minttyver)/src; make $(appxbuild) $(appxversion)
|
||||
mkdir -p bin
|
||||
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
||||
strip bin/mintty.exe
|
||||
|
||||
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 ../../
|
||||
# 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 sounds info
|
||||
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/
|
||||
|
||||
cygwin: mkshortcutexe
|
||||
mkdir -p bin
|
||||
cp /bin/cygwin1.dll bin/
|
||||
cp /bin/cygwin-console-helper.exe bin/
|
||||
#cp /bin/dash.exe bin/
|
||||
cp /bin/dash.exe bin/
|
||||
cp /bin/regtool.exe bin/
|
||||
cp /bin/zoo.exe bin/
|
||||
|
||||
wsltty:
|
||||
mkshortcutexe: bin/mkshortcut.exe
|
||||
|
||||
pkg: wslbridge mintty cygwin wsltty
|
||||
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/dash.exe rel/
|
||||
cp bin/regtool.exe rel/
|
||||
cp bin/mintty.exe rel/
|
||||
cp bin/zoo.exe rel/
|
||||
cp lang.zoo rel/
|
||||
cp themes.zoo rel/
|
||||
cp sounds.zoo rel/
|
||||
cp charnames.txt rel/
|
||||
cp bin/wslbridge.exe rel/
|
||||
cp bin/wslbridge-backend rel/
|
||||
cp bin/mkshortcut.exe rel/
|
||||
cp bin/cygpopt-0.dll rel/
|
||||
cp bin/cygiconv-2.dll rel/
|
||||
cp bin/cygintl-8.dll rel/
|
||||
cp LICENSE.* rel/
|
||||
cp VERSION rel/
|
||||
cp *.lnk rel/
|
||||
cp *.ico rel/
|
||||
cp *.url rel/
|
||||
cp *.bat rel/
|
||||
cp *.sh rel/
|
||||
cp *.vbs rel/
|
||||
|
||||
cab: cop
|
||||
cd rel; iexpress /n wsltty.SED
|
||||
|
||||
install: cop installbat
|
||||
|
||||
installbat:
|
||||
cd rel; cmd /C install
|
||||
|
||||
ver:
|
||||
echo $(ver) > VERSION
|
||||
|
||||
mintty: mintty-get mintty-build
|
||||
|
||||
mintty-usr: mintty-get mintty-appx
|
||||
|
||||
# local wsltty build target:
|
||||
wsltty: wslbridge cygwin mintty-build mintty-pkg
|
||||
|
||||
# standalone wsltty package build target:
|
||||
pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg cab
|
||||
|
||||
# appx package contents target:
|
||||
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx
|
||||
|
||||
# appx package target:
|
||||
appx: wsltty-appx fix-verx
|
||||
sh ./build.sh
|
||||
|
||||
#############################################################################
|
||||
# end
|
||||
|
||||
42
makewinx.cfg
42
makewinx.cfg
@@ -23,9 +23,9 @@ UserQuietInstCmd=%UserQuietInstCmd%
|
||||
SourceFiles=SourceFiles
|
||||
|
||||
[Strings]
|
||||
InstallPrompt=Install Mintty terminal for WSL / Ubuntu on Windows?
|
||||
InstallPrompt=Install Mintty terminal for WSL (Windows Subsystem for Linux)?
|
||||
DisplayLicense=
|
||||
FinishMessage=Mintty for WSL installed - for documentation see https://github.com/mintty/mintty/wiki/Tips
|
||||
FinishMessage=Mintty for WSL installed - for documentation and configuration see https://github.com/mintty/wsltty
|
||||
TargetName=wsltty-%version%-install.exe
|
||||
FriendlyName=wsltty
|
||||
AppLaunched=cmd.exe /c install.bat
|
||||
@@ -39,18 +39,28 @@ FILE3="wslbridge.exe"
|
||||
FILE4="wslbridge-backend"
|
||||
FILE5="LICENSE.mintty"
|
||||
FILE6="LICENSE.wslbridge"
|
||||
FILE7="WSL Bash % in Mintty.lnk"
|
||||
FILE8="WSL Bash ~ in Mintty.lnk"
|
||||
FILE9="WSL Bash -l in Mintty.lnk"
|
||||
FILE10="wsl.bat"
|
||||
FILE11="wsl~.bat"
|
||||
FILE12="wsl-l.bat"
|
||||
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="config-context-menu.bat"
|
||||
FILE15="tux.ico"
|
||||
FILE16="add to context menu.lnk"
|
||||
FILE17="remove from context menu.lnk"
|
||||
FILE18="wsltty home & help.url"
|
||||
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="sounds.zoo"
|
||||
FILE24="mintty.ico"
|
||||
FILE25="mkshortcut.exe"
|
||||
FILE26="cygpopt-0.dll"
|
||||
FILE27="cygiconv-2.dll"
|
||||
FILE28="cygintl-8.dll"
|
||||
|
||||
[SourceFiles]
|
||||
SourceFiles0=.
|
||||
@@ -75,4 +85,14 @@ SourceFiles0=.
|
||||
%FILE16%=
|
||||
%FILE17%=
|
||||
%FILE18%=
|
||||
%FILE19%=
|
||||
%FILE20%=
|
||||
%FILE21%=
|
||||
%FILE22%=
|
||||
%FILE23%=
|
||||
%FILE24%=
|
||||
%FILE25%=
|
||||
%FILE26%=
|
||||
%FILE27%=
|
||||
%FILE28%=
|
||||
|
||||
|
||||
814
mkshortcut.c
Normal file
814
mkshortcut.c
Normal 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);
|
||||
}
|
||||
58
mkshortcut.vbs
Executable file
58
mkshortcut.vbs
Executable file
@@ -0,0 +1,58 @@
|
||||
rem cscript mkshortcut.vbs [/param:arg] /target:link
|
||||
|
||||
rem /target:%LOCALAPPDATA%\wsltty\bin\mintty.exe
|
||||
rem /workingdir:%USERPROFILE%
|
||||
rem /icon:%LOCALAPPDATA%\wsltty\wsl.ico
|
||||
rem deprecated: /icon:%LOCALAPPDATA%\lxss\bash.ico
|
||||
rem deprecated: %
|
||||
rem /arguments:--wsl -o Locale=C -o Charset=UTF-8 /bin/wslbridge -t /bin/bash
|
||||
rem deprecated: ~
|
||||
rem /arguments:--wsl -o Locale=C -o Charset=UTF-8 /bin/wslbridge -C~ -t /bin/bash
|
||||
rem deprecated: -l
|
||||
rem /arguments:--wsl -o Locale=C -o Charset=UTF-8 /bin/wslbridge -t /bin/bash -l
|
||||
|
||||
rem General - Name:
|
||||
name = Wscript.Arguments.Named("name") & ".lnk"
|
||||
set wshell = WScript.CreateObject("WScript.Shell")
|
||||
wscript.echo "Creating " & name
|
||||
set lnk = wshell.CreateShortcut(name)
|
||||
|
||||
rem Target:
|
||||
rem lnk.TargetPath = Wscript.Arguments.Named("target")
|
||||
rem lnk.Arguments = Wscript.Arguments.Named("arguments")
|
||||
|
||||
lnk.TargetPath = wshell.ExpandEnvironmentStrings("%target%")
|
||||
minttyargs = wshell.ExpandEnvironmentStrings("%minttyargs%")
|
||||
bridgeargs = wshell.ExpandEnvironmentStrings("%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 Icon:
|
||||
rem icon = Wscript.Arguments.Named("icon")
|
||||
rem rem iconoffset = Wscript.Arguments.Named("iconoffset")
|
||||
rem rem icon = icon & ", " & iconoffset
|
||||
icon = wshell.ExpandEnvironmentStrings("%icon%")
|
||||
rem wscript.echo "icon: " & icon
|
||||
lnk.IconLocation = icon
|
||||
rem rem lnk.IconLocation = "%LOCALAPPDATA%\lxss\bash.ico"
|
||||
rem lnk.IconLocation = "%LOCALAPPDATA%\wsltty\wsl.ico"
|
||||
|
||||
rem Shorcut key:
|
||||
rem lnk.HotKey = "ALT+CTRL+W"
|
||||
|
||||
rem Run:
|
||||
rem 1: Normal 7: Minimized 3: Maximized
|
||||
rem lnk.WindowStyle = 1
|
||||
|
||||
rem Comment:
|
||||
rem lnk.IconLocation = Wscript.Arguments.Named("desc")
|
||||
rem lnk.Description = "WSLtty"
|
||||
|
||||
lnk.Save
|
||||
wscript.echo "Created " & name
|
||||
wscript.echo
|
||||
Binary file not shown.
@@ -1,8 +1,6 @@
|
||||
@echo off
|
||||
|
||||
rem See comments in install.bat about changing the installation directory.
|
||||
|
||||
set installdir=%LOCALAPPDATA%\wsltty
|
||||
if "%installdir%" == "" set installdir=%LOCALAPPDATA%\wsltty
|
||||
|
||||
|
||||
:shortcuts
|
||||
@@ -11,20 +9,27 @@ rem delete Start Menu Folder
|
||||
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty
|
||||
rmdir /S /Q "%smf%"
|
||||
|
||||
rem delete Desktop Shortcuts
|
||||
del "%USERPROFILE%\Desktop\WSL Bash % in Mintty.lnk"
|
||||
del "%USERPROFILE%\Desktop\WSL Bash ~ in Mintty.lnk"
|
||||
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%
|
||||
bin\dash.exe config-distros.sh -shortcuts-remove
|
||||
|
||||
|
||||
:explorer context menu
|
||||
|
||||
call "%installdir%\config-context-menu.bat" /U
|
||||
cd %installdir%
|
||||
bin\dash.exe config-distros.sh -contextmenu-remove
|
||||
|
||||
|
||||
:undeploy
|
||||
|
||||
cd %installdir%
|
||||
rem currently not removing software
|
||||
rem in any case, at least the config file (home\...) should not be removed
|
||||
|
||||
|
||||
:end
|
||||
|
||||
12
wsl-l.bat
12
wsl-l.bat
@@ -1,12 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Start mintty terminal for WSL in home directory
|
||||
|
||||
rem To enable invocation of this script from WIN+R or from cmd.exe,
|
||||
rem you may want to copy this script into "%SYSTEMROOT%\System32"
|
||||
|
||||
rem You may want a variant of this script without trailing "-l"
|
||||
rem to start in the current directory from cmd.exe
|
||||
|
||||
"%LOCALAPPDATA%\wsltty\bin\mintty.exe" --wsl -o Locale=C -o Charset=UTF-8 -i "%LOCALAPPDATA%\lxss\bash.ico" /bin/wslbridge -t /bin/bash -l
|
||||
|
||||
12
wsl.bat
12
wsl.bat
@@ -1,12 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Start mintty terminal for WSL in home directory
|
||||
|
||||
rem To enable invocation of this script from WIN+R or from cmd.exe,
|
||||
rem you may want to copy this script into "%SYSTEMROOT%\System32"
|
||||
|
||||
rem You may want a variant of this script without trailing "-l"
|
||||
rem to start in the current directory from cmd.exe
|
||||
|
||||
"%LOCALAPPDATA%\wsltty\bin\mintty.exe" --wsl -o Locale=C -o Charset=UTF-8 -i "%LOCALAPPDATA%\lxss\bash.ico" /bin/wslbridge -t /bin/bash
|
||||
|
||||
76
wslbridge-backend-static.patch
Normal file
76
wslbridge-backend-static.patch
Normal file
@@ -0,0 +1,76 @@
|
||||
diff -rup old/Makefile new/Makefile
|
||||
--- old/Makefile 2018-05-06 01:12:36.000000000 +0200
|
||||
+++ new/Makefile 2019-07-24 22:29:12.874257700 +0200
|
||||
@@ -8,7 +8,9 @@ all : ../out/wslbridge-backend
|
||||
-static-libgcc -static-libstdc++ \
|
||||
-D_GNU_SOURCE \
|
||||
-DWSLBRIDGE_VERSION=$(shell cat ../VERSION.txt) \
|
||||
- -Wall -O2 $< ../common/SocketIo.cc -o $@ -lutil -pthread
|
||||
+ -Wall -O2 $< ../common/SocketIo.cc -o $@ \
|
||||
+ -ldl -lutil -static -pthread \
|
||||
+ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
|
||||
$(STRIP) $@
|
||||
|
||||
clean:
|
||||
diff -rup old/wslbridge-backend.cc new/wslbridge-backend.cc
|
||||
--- old/wslbridge-backend.cc 2018-05-06 01:12:36.000000000 +0200
|
||||
+++ new/wslbridge-backend.cc 2019-07-24 22:55:25.324307400 +0200
|
||||
@@ -494,6 +494,58 @@ static void frontendVersionCheck(const c
|
||||
|
||||
} // namespace
|
||||
|
||||
+#define getpwuid _getpwuid
|
||||
+
|
||||
+#include <dlfcn.h>
|
||||
+typedef struct passwd * (*__getpwuid_t)(int uid);
|
||||
+
|
||||
+struct passwd * getpwuid(int uid)
|
||||
+{
|
||||
+ void * dl = dlopen(0, 0);
|
||||
+printf("dlopen %p\n", dl);
|
||||
+ if (dl) {
|
||||
+ struct passwd * (*__getpwuid)(int uid) =
|
||||
+ (__getpwuid_t)dlsym(dl, "getpwuid");
|
||||
+printf("dlsym %p\n", __getpwuid);
|
||||
+ if (__getpwuid)
|
||||
+ return __getpwuid(uid);
|
||||
+ }
|
||||
+
|
||||
+ FILE * pwd = fopen("/etc/passwd", "r");
|
||||
+ if (pwd) {
|
||||
+ char pwbuf[222];
|
||||
+ static struct passwd pw;
|
||||
+ pw.pw_shell = 0;
|
||||
+ while (fgets(pwbuf, sizeof pwbuf, pwd)) {
|
||||
+ char * sep = strchr(pwbuf, ':');
|
||||
+ if (!sep) continue;
|
||||
+ sep = strchr(++sep, ':');
|
||||
+ if (!sep) continue;
|
||||
+ int pwuid;
|
||||
+ if (sscanf(sep, ":%d:", &pwuid) == 1 && pwuid == uid) {
|
||||
+ // pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
|
||||
+ // ^
|
||||
+ sep = strchr(++sep, ':');
|
||||
+ if (!sep) continue;
|
||||
+ sep = strchr(++sep, ':');
|
||||
+ if (!sep) continue;
|
||||
+ sep = strchr(++sep, ':');
|
||||
+ if (!sep) continue;
|
||||
+ sep = strchr(++sep, ':');
|
||||
+ if (!sep) continue;
|
||||
+ pw.pw_shell = ++sep;
|
||||
+ sep = strchr(++sep, '\n');
|
||||
+ if (sep)
|
||||
+ *sep = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ fclose(pwd);
|
||||
+ return &pw;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
// If the backend crashes, it prints a message to its stderr, which is a
|
||||
BIN
wsltty.png
Normal file
BIN
wsltty.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
12
wsl~.bat
12
wsl~.bat
@@ -1,12 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Start mintty terminal for WSL in home directory
|
||||
|
||||
rem To enable invocation of this script from WIN+R or from cmd.exe,
|
||||
rem you may want to copy this script into "%SYSTEMROOT%\System32"
|
||||
|
||||
rem You may want a variant of this script without trailing "-l"
|
||||
rem to start in the current directory from cmd.exe
|
||||
|
||||
"%LOCALAPPDATA%\wsltty\bin\mintty.exe" --wsl -o Locale=C -o Charset=UTF-8 -i "%LOCALAPPDATA%\lxss\bash.ico" /bin/wslbridge -C~ -t /bin/bash
|
||||
|
||||
Reference in New Issue
Block a user