From 1e453b05e9f3039d48614003270eb02e8e7f4b02 Mon Sep 17 00:00:00 2001 From: mintty Date: Sun, 22 Oct 2017 18:57:17 +0200 Subject: [PATCH] revamp deployment of shortcuts, scripts, and context menu entries --- config-distros.sh | 247 +++++++++++++++++++++++++++------------------- 1 file changed, 148 insertions(+), 99 deletions(-) diff --git a/config-distros.sh b/config-distros.sh index 3373347..41ef855 100755 --- a/config-distros.sh +++ b/config-distros.sh @@ -3,41 +3,71 @@ contextmenu=false remove=false case "$1" in --contextmenu) contextmenu=true - shift;; --contextmenu-remove) - contextmenu=true - remove=true - shift;; -shortcuts-remove) - remove=true - shift;; + remove=true + shift;; +-contextmenu) + contextmenu=true + 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*) + 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*) + 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 + 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 $* + cmd /c echo $* } while read line; do echo "$line"; done < mkbat.bat @@ -45,7 +75,7 @@ while read line; do echo "$line"; done < mkbat.bat echo Creating %1.bat echo @echo off> %1.bat -echo rem Start mintty terminal for WSL package %distro% in current directory>> %1.bat +echo rem Start mintty terminal for WSL package %name% in current directory>> %1.bat echo %target% -i "%icon%" %minttyargs% %bridgeargs%>> %1.bat echo Created %1.bat @@ -56,104 +86,123 @@ PATH=/bin:$PATH 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 "No WSL packages registered" >&2) | +(regtool list "$lxss" 2>/dev/null && echo || echo "No WSL packages registered" >&2) | while read guid do + 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"` - if [ -r "$PROGRAMFILES/WindowsApps/$instdir/images/icon.ico" ] - then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico" - else icon="%LOCALAPPDATA%/wsltty/wsl.ico" - fi - root="$basepath/rootfs" - else icon="%LOCALAPPDATA%/lxss/bash.ico" - root="$basepath" - fi - echoc "distro $distro" - echoc "- guid $guid" - echoc "- (launcher $launcher)" - echoc "- icon $icon" - echoc "- root $root" + 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"` + if [ -r "$ProgramW6432/WindowsApps/$instdir/images/icon.ico" ] + then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico" + else icon="%LOCALAPPDATA%/wsltty/wsl.ico" + fi + root="$basepath/rootfs" + else + icon="%LOCALAPPDATA%/lxss/bash.ico" + root="$basepath" + fi - target='%LOCALAPPDATA%\wsltty\bin\mintty.exe' - minttyargs='--wsl --rootfs="'"$root"'" -h err --configdir="%APPDATA%\wsltty" -o Locale=C -o Charset=UTF-8 /bin/wslbridge ' - #if [ -z "$launch" ] - #then bridgeargs='-t /bin/bash' - #else bridgeargs='-l "'"$launch"'" -t /bin/bash' - #fi - bridgeargs='--distro-guid "'"$guid"'" -t /bin/bash' + minttyargs='--wsl --rootfs="'"$root"'" -h err --configdir="%APPDATA%\wsltty" -o Locale=C -o Charset=UTF-8 /bin/wslbridge ' + minttyargs='--WSL="'"$distro"'" -h err --configdir="%APPDATA%\wsltty"' + #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' - export target minttyargs bridgeargs icon - export distro + ok=true;; + "") # WSL default installation + distro= + name=WSL + icon="%LOCALAPPDATA%/wsltty/wsl.ico" + minttyargs='--WSL= -h err --configdir="%APPDATA%\wsltty"' + bridgeargs='-t' + + ok=true;; + esac + echoc "distro '$distro'" + echoc "- name '$name'" + echoc "- guid $guid" + echoc "- (launcher $launcher)" + echoc "- icon $icon" + echoc "- root $root" + target='%LOCALAPPDATA%\wsltty\bin\mintty.exe' + bridgeargs=" " + + if $ok + then + export target minttyargs bridgeargs icon if $contextmenu then - # create context menu entry + # context menu entries #cmd /C mkcontext "$name" direckey='HKEY_CURRENT_USER\Software\Classes\Directory' if $remove then - reg delete "$direckey\\shell\\$name" /f - reg delete "$direckey\\Background\\shell\\$name" /f + reg delete "$direckey\\shell\\$name" /f + reg delete "$direckey\\Background\\shell\\$name" /f else - reg add "$direckey\\shell\\$name" /d "$name in Mintty Here" /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 in Mintty Here" /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 + 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 fi else - + # invocation shortcuts and scripts if $remove then - cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$name ~ in Mintty.lnk" - cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" - cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat" + 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 - # create desktop/start menu shortcut - cscript /nologo mkshortcut.vbs "/name:$name in Mintty" - # copy to Start Menu WSLtty subfolder - rem cmd /C mkdir "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty\\WinUser" - cmd /C copy "$name in Mintty.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" + # 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" - # create command-line launch script - cmd /C mkbat.bat "$name" - #cmd /C mkbat.bat "$name in Mintty" - # copy to WSLtty home and to WindowsApps launch folder - cmd /C copy "$name.bat" "%LOCALAPPDATA%\\wsltty\\$name.bat" - cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" + # launch script in . -> WSLtty home, WindowsApps launch folder + cmd /C mkbat.bat "$name" + cmd /C copy "$name.bat" "%LOCALAPPDATA%\\wsltty\\$name.bat" + cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" - # prepare versions to target WSL home directory - bridgeargs="-C~ $bridgeargs" + # prepare versions to target WSL home directory + #bridgeargs="-C~ $bridgeargs" + minttyargs="$minttyargs -~" - # create optional addition desktop shortcut - cscript /nologo mkshortcut.vbs "/name:$name ~ in Mintty" - # copy to Start Menu - cmd /C copy "$name ~ in Mintty.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs" + # desktop shortcut in ~ -> Start Menu + cscript /nologo mkshortcut.vbs "/name:$name Terminal" + cmd /C copy "$name Terminal.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs" - # create command-line launch script - cmd /C mkbat.bat "$name~" - #cmd /C mkbat.bat "$name~ in Mintty" - # copy to WSLtty home and to WindowsApps launch folder - cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\wsltty\\$name~.bat" - cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat" + # default desktop shortcut in ~ -> Desktop + if [ "$name" = "WSL" ] + then cmd /C copy "$name Terminal.lnk" "%USERPROFILE%\\Desktop" + fi + + # launch script in ~ -> WSLtty home, WindowsApps launch folder + cmd /C mkbat.bat "$name~" + cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\wsltty\\$name~.bat" + cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat" fi - fi;; - esac + fi + fi done