mirror of
				https://github.com/mintty/wsltty.git
				synced 2025-10-31 15:12:08 +00:00 
			
		
		
		
	Fix missing icons for distros
Instead of looking for `images\icon.ico` in `$instdir` for each distro, instead check inside AppxManifest.xml for the executable name and point to it for the shortcut icon as suggested in https://github.com/mintty/wsltty/issues/110#issuecomment-395999015.
This commit is contained in:
		| @@ -1,230 +1,233 @@ | ||||
| #! /bin/sh | ||||
|  | ||||
| PATH=/bin:$PATH | ||||
|  | ||||
| contextmenu=false | ||||
| remove=false | ||||
| alldistros=true | ||||
| config=true | ||||
|  | ||||
| case "`basename $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 | ||||
| #! /bin/sh | ||||
|  | ||||
| PATH=/bin:$PATH | ||||
|  | ||||
| contextmenu=false | ||||
| remove=false | ||||
| alldistros=true | ||||
| config=true | ||||
|  | ||||
| case "`basename $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 | ||||
|  | ||||
| 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 || echo "No WSL packages registered" >&2) | | ||||
| ( | ||||
|   if $alldistros | ||||
|   then  regtool list "$lxss" 2>/dev/null | ||||
|   else  true | ||||
|   fi && echo || echo "No WSL packages registered" >&2) | | ||||
| while read guid | ||||
| do | ||||
|   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 "$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 | ||||
|  | ||||
|     minttyargs='--wsl --rootfs="'"$root"'" --configdir="%APPDATA%\wsltty" -o Locale=C -o Charset=UTF-8 /bin/wslbridge ' | ||||
|     minttyargs='--WSL="'"$distro"'" --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' | ||||
|  | ||||
|     ok=true;; | ||||
|   "")	# WSL default installation | ||||
|     distro= | ||||
|     name=WSL | ||||
|     icon="%LOCALAPPDATA%/wsltty/wsl.ico" | ||||
|     minttyargs='--WSL= --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 && $config | ||||
|   then | ||||
|     export target minttyargs bridgeargs icon | ||||
|  | ||||
|     if $contextmenu | ||||
|     then | ||||
|       # 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 | ||||
|       else | ||||
|         reg add "$direckey\\shell\\$name" /d "$name Terminal" /f | ||||
|         reg add "$direckey\\shell\\$name" /v Icon /d "$icon" /f | ||||
|         cmd /C reg add "$direckey\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f | ||||
|         reg add "$direckey\\Background\\shell\\$name" /d "$name Terminal" /f | ||||
|         reg add "$direckey\\Background\\shell\\$name" /v Icon /d "$icon" /f | ||||
|         cmd /C reg add "$direckey\\Background\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f | ||||
|       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 %" | ||||
|         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" "%LOCALAPPDATA%\\wsltty\\$name.bat" | ||||
|         cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" | ||||
|  | ||||
|         # prepare versions to target WSL home directory | ||||
|         #bridgeargs="-C~ $bridgeargs" | ||||
|         minttyargs="$minttyargs -~" | ||||
|  | ||||
|         # desktop shortcut in ~ -> Start Menu | ||||
|         cscript /nologo mkshortcut.vbs "/name:$name Terminal" | ||||
|         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" | ||||
|         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 | ||||
|   fi | ||||
| done | ||||
| /EOB | ||||
| fi | ||||
|  | ||||
| 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 || echo "No WSL packages registered" >&2) | | ||||
| ( | ||||
|   if $alldistros | ||||
|   then  regtool list "$lxss" 2>/dev/null | ||||
|   else  true | ||||
|   fi && echo || echo "No WSL packages registered" >&2) | | ||||
| while read guid | ||||
| do | ||||
|   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 the app manifest | ||||
|   	manifest="$ProgramW6432/WindowsApps/$instdir/AppxManifest.xml" | ||||
|   	psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable' | ||||
|   	executable=`powershell "$psh_cmd"` | ||||
|  | ||||
|   	# remove trailing newline that above command introduces | ||||
|   	executable="${executable%"${executable##*[![:space:]]}"}" | ||||
|   	if [ -r "$ProgramW6432/WindowsApps/$instdir/$executable" ] | ||||
|   	then	icon="%PROGRAMFILES%\\WindowsApps\\$instdir\\$executable" | ||||
|   	else	icon="%LOCALAPPDATA%/wsltty/wsl.ico" | ||||
|   	fi | ||||
|  | ||||
|     minttyargs='--wsl --rootfs="'"$root"'" --configdir="%APPDATA%\wsltty" -o Locale=C -o Charset=UTF-8 /bin/wslbridge ' | ||||
|     minttyargs='--WSL="'"$distro"'" --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' | ||||
|  | ||||
|     ok=true;; | ||||
|   "")	# WSL default installation | ||||
|     distro= | ||||
|     name=WSL | ||||
|     icon="%LOCALAPPDATA%/wsltty/wsl.ico" | ||||
|     minttyargs='--WSL= --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 && $config | ||||
|   then | ||||
|     export target minttyargs bridgeargs icon | ||||
|  | ||||
|     if $contextmenu | ||||
|     then | ||||
|       # 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 | ||||
|       else | ||||
|         reg add "$direckey\\shell\\$name" /d "$name Terminal" /f | ||||
|         reg add "$direckey\\shell\\$name" /v Icon /d "$icon" /f | ||||
|         cmd /C reg add "$direckey\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f | ||||
|         reg add "$direckey\\Background\\shell\\$name" /d "$name Terminal" /f | ||||
|         reg add "$direckey\\Background\\shell\\$name" /v Icon /d "$icon" /f | ||||
|         cmd /C reg add "$direckey\\Background\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f | ||||
|       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 %" | ||||
|         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" "%LOCALAPPDATA%\\wsltty\\$name.bat" | ||||
|         cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" | ||||
|  | ||||
|         # prepare versions to target WSL home directory | ||||
|         #bridgeargs="-C~ $bridgeargs" | ||||
|         minttyargs="$minttyargs -~" | ||||
|  | ||||
|         # desktop shortcut in ~ -> Start Menu | ||||
|         cscript /nologo mkshortcut.vbs "/name:$name Terminal" | ||||
|         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" | ||||
|         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 | ||||
|   fi | ||||
| done | ||||
|   | ||||
		Reference in New Issue
	
	Block a user