 d1f55ffeb8
			
		
	
	
		d1f55ffeb8
		
			
		
	
	
	
	
		
			
			It may be useful to create AppVM-specific menu entries in AppVM itself. It may be an application installed there (in /usr/local, or using snap QubesOS/qubes-issues#2766), but it may be also some user custom shortcut. To support this, dom0 will accept menu entries also from TemplateBasedVMs. But to avoid duplicates, qubes.GetAppmenus service should send only menu entries actually stored in that VM, not inherited from its template. To distingush them, first check what type of persistence this VM has (from qubesdb-read /qubes-vm-persistence). If it's rw-only, send only entries stored on /rw. To make it more robust, use $XDG_DATA_DIRS and $XDG_DATA_HOME to discover directories, instead of looking only for /usr/{,local/}share/applications. This makes snap and flatpak handled for free. Fixes QubesOS/qubes-issues#4152
		
			
				
	
	
		
			52 righe
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			52 righe
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # shellcheck disable=SC2016
 | |
| 
 | |
| # send .desktop files from directories persisting across VM restarts, specifically:
 | |
| #  - any directory in case of "full" persistence
 | |
| #  - directories stored on /rw in case of "rw-only" persistence
 | |
| #  - nothing, otherwise
 | |
| 
 | |
| if [ -z "$XDG_DATA_HOME" ]; then
 | |
|     XDG_DATA_HOME="$HOME/.local/share"
 | |
| fi
 | |
| if [ -z "$XDG_DATA_DIRS" ]; then
 | |
|     XDG_DATA_DIRS="/usr/local/share/:/usr/share/"
 | |
| fi
 | |
| 
 | |
| # if read fails for some reason, default to full
 | |
| persistence=$(qubesdb-read /qubes-vm-persistence || echo full)
 | |
| rw_devno=$(stat -c %D /rw)
 | |
| 
 | |
| apps_dirs_to_consider=( "$XDG_DATA_HOME" )
 | |
| old_IFS="$IFS"
 | |
| IFS=:
 | |
| # shellcheck disable=SC2206
 | |
| apps_dirs_to_consider+=( $XDG_DATA_DIRS )
 | |
| IFS="$old_IFS"
 | |
| 
 | |
| apps_dirs=()
 | |
| for dir in "${apps_dirs_to_consider[@]}"; do
 | |
|     if [ "$persistence" = "full" ]; then
 | |
|         apps_dirs+=( "$dir/applications" )
 | |
|     elif [ "$persistence" = "rw-only" ] && \
 | |
|             [ "$(stat -c %D "$dir")" = "$rw_devno" ]; then
 | |
|         apps_dirs+=( "$dir/applications" )
 | |
|     fi
 | |
| done
 | |
| 
 | |
| if [ "${#apps_dirs[@]}" -eq "0" ]; then
 | |
|     # nothing to send, exit early to not let `find` browse the current
 | |
|     # directory
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| find "${apps_dirs[@]}" -name '*.desktop' -print0 2>/dev/null | \
 | |
|          xargs -0 awk '
 | |
|          BEGINFILE { entry="" }
 | |
|          /^\[/ { if (tolower($0) != "\[desktop entry\]") nextfile } 
 | |
|          /^Exec=/ { entry = entry FILENAME ":Exec=qubes-desktop-run " FILENAME "\n"; next }
 | |
|          /^NoDisplay *= *true$/ { entry=""; nextfile }
 | |
|          /=/ { entry = entry FILENAME ":" $0 "\n" }
 | |
|          ENDFILE { print entry }
 | |
|          ' 2> /dev/null
 |