You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			366 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
			
		
		
	
	
			366 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
#!/bin/bash
 | 
						|
DIRECTORY="$(readlink -f "$(dirname "$0")")"
 | 
						|
 | 
						|
function error {
 | 
						|
  echo -e "\e[91m$1\e[39m"
 | 
						|
  exit 1
 | 
						|
}
 | 
						|
 | 
						|
[ -z "$(yad --help)" ] && error "YAD needs to be installed to run pi-apps."
 | 
						|
 | 
						|
#check for updates in background
 | 
						|
("${DIRECTORY}/updater" 1>/dev/null) &
 | 
						|
 | 
						|
#Variable 1 is used to view the details of the specified app
 | 
						|
if [ ! -z "$1" ];then
 | 
						|
  output="$1"
 | 
						|
fi
 | 
						|
 | 
						|
#hide Chromium Widevine & Back to Chromium v78 on existing TwisterOS installs
 | 
						|
if [ -f "${DIRECTORY}/data/hidelist" ] || [ ! -d "${DIRECTORY}/data/categories" ];then
 | 
						|
  "${DIRECTORY}/install"
 | 
						|
  rm "${DIRECTORY}/data/hidelist"
 | 
						|
fi
 | 
						|
 | 
						|
#rename 'Vivaldi web browser' to Vivaldi
 | 
						|
#(find "$DIRECTORY" -name 'Vivaldi '* | while read f; do mv -v "$f" "$(echo "${f}" | sed 's/ web browser//g')"; done
 | 
						|
#if [ ! -z "$(cat "$DIRECTORY/data/preload/LIST" | grep 'Vivaldi web browser')" ];then
 | 
						|
#  rm -rf "$DIRECTORY/data/preload"
 | 
						|
#fi
 | 
						|
#) &
 | 
						|
 | 
						|
(if cat ~/.config/autostart/pi-apps-updater.desktop | grep -q installedonly ;then
 | 
						|
  "${DIRECTORY}/install"
 | 
						|
fi) &
 | 
						|
 | 
						|
rm -f "${DIRECTORY}/apps/Doom 3/install" &>/dev/null
 | 
						|
 | 
						|
install() {
 | 
						|
  app="$1"
 | 
						|
  #terminal title text
 | 
						|
  linecount="$(echo "$app" | wc -l)"
 | 
						|
  if [ $linecount -eq 1 ];then
 | 
						|
    title="Installing $app"
 | 
						|
  elif [ $linecount -le 4 ];then
 | 
						|
    title="Installing $(echo "$app" | tr '\n' '|' | sed -i 's/|/, /g')"
 | 
						|
  else
 | 
						|
    title="Installing several apps"
 | 
						|
  fi
 | 
						|
  "${DIRECTORY}/etc/terminal-run" '
 | 
						|
    if "'"${DIRECTORY}/manage"'" multi-install "'"$app"'" ; then
 | 
						|
      echo -e "\nClosing in 30 seconds."
 | 
						|
      sleep 30
 | 
						|
    else
 | 
						|
      echo -e "\nClose this window to exit."
 | 
						|
      read enter #technically you could press Enter to exit.
 | 
						|
    fi
 | 
						|
    ' "$title"
 | 
						|
  sleep 1
 | 
						|
  while ps -C manage &>/dev/null;do sleep 0.1; done
 | 
						|
}
 | 
						|
 | 
						|
uninstall() {
 | 
						|
  app="$1"
 | 
						|
  #terminal title text
 | 
						|
  linecount="$(echo "$app" | wc -l)"
 | 
						|
  if [ $linecount -eq 1 ];then
 | 
						|
    title="Uninstalling $app"
 | 
						|
  elif [ $linecount -le 4 ];then
 | 
						|
    title="Uninstalling $(echo "$app" | tr '\n' '|' | sed -i 's/|/, /g')"
 | 
						|
  else
 | 
						|
    title="Uninstalling several apps"
 | 
						|
  fi
 | 
						|
  "${DIRECTORY}/etc/terminal-run" '
 | 
						|
    if "'"${DIRECTORY}/manage"'" multi-uninstall "'"$app"'" ; then
 | 
						|
      echo -e "\nClosing in 30 seconds."
 | 
						|
      sleep 30
 | 
						|
    else
 | 
						|
      echo -e "\nClose this window to exit."
 | 
						|
      read enter #technically you could press Enter to exit.
 | 
						|
    fi
 | 
						|
    ' "$title"
 | 
						|
  sleep 1
 | 
						|
  while ps -C manage &>/dev/null;do sleep 0.1; done
 | 
						|
}
 | 
						|
 | 
						|
motd="$(echo -e "$(wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps-announcements/main/message | shuf -n 1)")"
 | 
						|
 | 
						|
#app list mode. Allowed values: 'yad', 'xlunch'
 | 
						|
guimode="$(cat "${DIRECTORY}/data/settings/App List Style")"
 | 
						|
[ -z "$guimode" ] && guimode=yad
 | 
						|
#mode=yad
 | 
						|
 | 
						|
prefix=''
 | 
						|
 | 
						|
while true;do
 | 
						|
  LIST="$("${DIRECTORY}/preload" $guimode $prefix)"
 | 
						|
  #LIST="$(cat "${DIRECTORY}/data/preload/LIST")"
 | 
						|
  #echo "$LIST"
 | 
						|
  
 | 
						|
  #if output is not empty then assume button pressed was Details
 | 
						|
  button=0
 | 
						|
  
 | 
						|
  while [ -z "$output" ];do
 | 
						|
    
 | 
						|
    if [ "$guimode" == yad ];then
 | 
						|
      if [ -z "$prefix" ];then
 | 
						|
        buttons=("--button=Install!${DIRECTORY}/icons/install.png:4" \
 | 
						|
        "--button=Uninstall!${DIRECTORY}/icons/uninstall.png:2" \
 | 
						|
        "--button=Details!${DIRECTORY}/icons/info.png!View more about the selected software:0" )
 | 
						|
      else
 | 
						|
        buttons=("--button=!${DIRECTORY}/icons/back.png!Back:3" \
 | 
						|
        "--button=!${DIRECTORY}/icons/install.png!Install:4" \
 | 
						|
        "--button=!${DIRECTORY}/icons/uninstall.png!Uninstall:2" \
 | 
						|
        "--button=!${DIRECTORY}/icons/info.png!Details:0" )
 | 
						|
      fi
 | 
						|
      
 | 
						|
      output="$(echo -e "$LIST" | yad --center --title='Pi-Apps'"$([ ! -z "$prefix" ] && echo ": $(echo "$prefix" | tr '/' '>')")" --width=310 --height=400 --no-headers \
 | 
						|
        --text="$([ -z "$prefix" ] && echo "$motd" || echo "Viewing $(echo "$prefix" | tr '/' '>') category")" --image="${DIRECTORY}/icons/logo-64.png" --image-on-top \
 | 
						|
        --list --multiple --separator='\n' --window-icon="${DIRECTORY}/icons/logo.png" \
 | 
						|
        --column=:IMG --column=:IMG --column=Name --column=Sysname:HD --column=tip:HD \
 | 
						|
        --print-column=4 --tooltip-column=5 \
 | 
						|
        "${buttons[@]}" \
 | 
						|
      )"
 | 
						|
      
 | 
						|
      button=$? #get exit code to determine which button was pressed
 | 
						|
      echo "Button: ${button}"
 | 
						|
      if [ $button -eq 252 ];then #if window manager x was pressed
 | 
						|
        exit 0
 | 
						|
      fi
 | 
						|
      if [ "$button" == 3 ];then
 | 
						|
        #back button
 | 
						|
        break
 | 
						|
      fi
 | 
						|
      if [ -z "$output" ];then
 | 
						|
        echo "output variable empty!"
 | 
						|
        yad --center --title='Pi-Apps' --width=310 \
 | 
						|
          --window-icon="${DIRECTORY}/icons/logo.png" \
 | 
						|
          --text="Mind reading is not supported.
 | 
						|
    (You didn"\'"t select an App)" \
 | 
						|
          --button=OK:0
 | 
						|
      fi
 | 
						|
      
 | 
						|
    elif [ "$guimode" == xlunch ];then
 | 
						|
      if [ ! -d "${DIRECTORY}/xlunch" ] || [ ! -f /usr/bin/xlunch ];then
 | 
						|
        sudo rm -rf /usr/bin/xlunch "$DIRECTORY/xlunch" 2>/dev/null
 | 
						|
        sudo apt install -y libimlib2-dev libx11-dev
 | 
						|
        cd "$DIRECTORY"
 | 
						|
        git clone https://github.com/Tomas-M/xlunch
 | 
						|
        cd "$DIRECTORY/xlunch"
 | 
						|
        make -j8
 | 
						|
        sudo make install
 | 
						|
        sudo rm -f /usr/share/applications/genentries.desktop
 | 
						|
        cd $HOME
 | 
						|
        if [ ! -f /usr/bin/xlunch ];then
 | 
						|
          error "xlunch should be installed now, but /usr/bin/xlunch does not exist!"
 | 
						|
        fi
 | 
						|
      fi
 | 
						|
      #xlunch compiled
 | 
						|
      
 | 
						|
      screen_width="$(xdpyinfo | grep 'dimensions:' | tr 'x' '\n' | tr ' ' '\n' | sed -n 7p)"
 | 
						|
      screen_height="$(xdpyinfo | grep 'dimensions:' | tr 'x' '\n' | tr ' ' '\n' | sed -n 8p)"
 | 
						|
      height=700
 | 
						|
      width=800
 | 
						|
      xposition=$(((screen_width/2)-(width/2)))
 | 
						|
      yposition=$(((screen_height/2)-(height/2)))
 | 
						|
      
 | 
						|
      if false;then
 | 
						|
        scrot -a "$((xposition+1)),$((yposition+33)),${width},${height}" blur.png #blur_init.png
 | 
						|
        convert -blur 10x5 ~/blur.png ~/blur.png
 | 
						|
      fi
 | 
						|
      
 | 
						|
      if [ ! -z "$prefix" ];then
 | 
						|
        echo "Adding back button to xlunch..."
 | 
						|
        LIST="Back;${DIRECTORY}/icons/back-64.png;./
 | 
						|
$LIST"
 | 
						|
        LIST="$(echo "$LIST" | grep .)"
 | 
						|
      fi
 | 
						|
      echo "$LIST"
 | 
						|
      
 | 
						|
      if [ -z "$prefix" ];then
 | 
						|
        searchbox="Search: "
 | 
						|
      else
 | 
						|
        searchbox="Viewing $(echo "$prefix" | tr '/' '>'). Search: "
 | 
						|
      fi
 | 
						|
      
 | 
						|
      output="$(echo -e "$LIST" | xlunch -WoCS -s 64 --bc 000000A0 --tc ffffffff --pc 6060ffff --hc 60606010 \
 | 
						|
        -p "$searchbox" -a -c 2 --title "Pi-Apps: Raspberry Pi app store" \
 | 
						|
        --icon "${DIRECTORY}/icons/logo.png" --scrollbarcolor ffffff40 --scrollindicatorcolor 0000ff80\
 | 
						|
        --width $width --height $height --xposition $xposition --yposition $yposition \
 | 
						|
        --button "${DIRECTORY}/icons/logo-128.png;;$((($width/2)-(128/2))),0;"
 | 
						|
        #-g ~/blur.png
 | 
						|
        )"
 | 
						|
      button=0
 | 
						|
      
 | 
						|
      if [ -z "$output" ];then
 | 
						|
        error "xlunch did not report any selected apps!"
 | 
						|
      fi
 | 
						|
    else
 | 
						|
      error "Unrecognized app list style '$guimode'!"
 | 
						|
    fi
 | 
						|
    output="$(echo "$output" | sed '/^$/d')"
 | 
						|
    echo "Output: ${output}EOO"
 | 
						|
    
 | 
						|
  done
 | 
						|
  #output variable populated
 | 
						|
  
 | 
						|
  case $button in
 | 
						|
 | 
						|
    1)
 | 
						|
      echo "User exited."
 | 
						|
      exit 0
 | 
						|
      ;;
 | 
						|
    3)
 | 
						|
      echo "Back"
 | 
						|
      prefix="$(dirname "$prefix" | tr -d '.')"
 | 
						|
      ;;
 | 
						|
    0)
 | 
						|
      echo "Details"
 | 
						|
      if echo "$output" | grep -q '/' ;then
 | 
						|
        #folder
 | 
						|
        if [ "$output" == './' ];then
 | 
						|
          echo "Back"
 | 
						|
          prefix="$(dirname "$prefix" | tr -d '.')"
 | 
						|
        else
 | 
						|
          prefix="$prefix/$output"
 | 
						|
          prefix="${prefix::-1}"
 | 
						|
          prefix="$(echo "$prefix" | sed 's+^/++')"
 | 
						|
        fi
 | 
						|
        echo "Prefix is $prefix"
 | 
						|
        output=''
 | 
						|
      else
 | 
						|
        #app
 | 
						|
        
 | 
						|
        output="$(echo "$output" | head -n1)"
 | 
						|
        if [ ! -z "$(cat "${DIRECTORY}/data/installed-packages/${output}")" ];then
 | 
						|
          installedpackages="
 | 
						|
This app installed these packages: $(cat "${DIRECTORY}/data/installed-packages/${output}" | sort | uniq | tr '\n' ' ')"
 | 
						|
        else
 | 
						|
          installedpackages=''
 | 
						|
        fi
 | 
						|
        
 | 
						|
        description="$(cat "${DIRECTORY}/apps/${output}/description" || echo 'Description unavailable')"
 | 
						|
        
 | 
						|
        text="$(echo "$(cat "${DIRECTORY}/apps/${output}/description" || echo "Description unavailable")" | head -n1)
 | 
						|
Current status: $(cat "${DIRECTORY}/data/status/${output}" || echo 'Uninstalled')
 | 
						|
Website: $(cat "${DIRECTORY}/apps/${output}/website" || echo 'unavailable')
 | 
						|
$(echo "$description" | grep -v "$(echo "$description" | head -n1)")
 | 
						|
$installedpackages"
 | 
						|
        
 | 
						|
        #if already installed then no need to provide install button. And vice versa.
 | 
						|
        whichbutton="$(
 | 
						|
        if [ "$(cat "${DIRECTORY}/data/settings/Show Edit button")" == 'Yes' ];then
 | 
						|
          echo "--button=Edit!${DIRECTORY}/icons/edit.png:10"
 | 
						|
        fi
 | 
						|
        if [ ! -f "${DIRECTORY}/data/status/${output}" ];then
 | 
						|
          #Taking a chance here. If status file is nonexistent, assume uninstalled.
 | 
						|
          echo "--button=Install!${DIRECTORY}/icons/install.png:4"
 | 
						|
        elif [ "$(cat "${DIRECTORY}/data/status/${output}")" == 'installed' ];then
 | 
						|
          echo "--button=Uninstall!${DIRECTORY}/icons/uninstall.png:2"
 | 
						|
        elif [ "$(cat "${DIRECTORY}/data/status/${output}")" == 'uninstalled' ];then
 | 
						|
          echo "--button=Install!${DIRECTORY}/icons/install.png:4"
 | 
						|
        else
 | 
						|
          #if status is corrupted or unknown, then show both buttons
 | 
						|
          echo "--button=Uninstall!${DIRECTORY}/icons/uninstall.png:2 --button=Install!${DIRECTORY}/icons/install.png:4"
 | 
						|
        fi
 | 
						|
        )"
 | 
						|
        
 | 
						|
        echo "$text" | yad --text-info --fontname=12 --wrap --show-uri \
 | 
						|
          --image="${DIRECTORY}/apps/${output}/icon-64.png" --image-on-top \
 | 
						|
          --title="Details of ${output}" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=700 --height=300 \
 | 
						|
          --button=Back!"${DIRECTORY}/icons/back.png":0 \
 | 
						|
          --button=''!"${DIRECTORY}/icons/up.png"!'View previous App':6 \
 | 
						|
          --button=''!"${DIRECTORY}/icons/down.png"!'View next App':8 \
 | 
						|
          $whichbutton
 | 
						|
        button=$? #get exit code to determine which button was pressed
 | 
						|
        echo "Button: ${button}"
 | 
						|
        
 | 
						|
        if [ $button == 0 ];then
 | 
						|
          echo 'Back' #do nothing, as user requested to go back
 | 
						|
          #clear app var
 | 
						|
          output=''
 | 
						|
        elif [ $button == 4 ];then
 | 
						|
          app="$output"
 | 
						|
          install "$app"
 | 
						|
        elif [ $button == 2 ];then
 | 
						|
          app="$output"
 | 
						|
          uninstall "$app"
 | 
						|
        elif [ $button == 6 ] || [ $button == 8 ];then
 | 
						|
          #previous or next app clicked
 | 
						|
          lsoutput="$(echo "$LIST" | grep -v '/' | grep -v '(' | grep -v *'\n App folder' | awk -F ';' '{print $NF}' | uniq)"
 | 
						|
          echo "$lsoutput"
 | 
						|
          
 | 
						|
          if [ $button == 6 ];then
 | 
						|
            echo 'previous app'
 | 
						|
            
 | 
						|
            #convert $output into number, then subtract 1 from it
 | 
						|
            number="$(echo "$lsoutput" | grep -nx "$output" | cut -f1 -d: )"
 | 
						|
            
 | 
						|
            lastline="$(echo "$lsoutput" | wc -l)"
 | 
						|
            
 | 
						|
            if [ $(($number - 1)) -lt '1' ];then
 | 
						|
              newnumber=$lastline
 | 
						|
            else
 | 
						|
              newnumber=$(($number - 1))
 | 
						|
            fi
 | 
						|
            
 | 
						|
            output="$(echo "$lsoutput" | sed -n "${newnumber}p")"
 | 
						|
            
 | 
						|
            echo "Line number was ${number}, but now is ${newnumber}. Name is ${output}."
 | 
						|
          elif [ $button == 8 ];then
 | 
						|
            echo 'next app'
 | 
						|
            
 | 
						|
            #convert $output into number, then add 1 to it
 | 
						|
            number="$(echo "$lsoutput" | grep -nx "$output" | cut -f1 -d: )"
 | 
						|
            
 | 
						|
            echo "Line number was ${number}, but now is ${newnumber}. Name is ${output}."
 | 
						|
            
 | 
						|
            lastline="$(echo "$lsoutput" | wc -l)"
 | 
						|
            
 | 
						|
            if [ $(($number + 1)) -gt $lastline ];then
 | 
						|
              newnumber=1
 | 
						|
            else
 | 
						|
              newnumber=$(($number + 1))
 | 
						|
            fi
 | 
						|
            
 | 
						|
            output="$(echo "$lsoutput" | sed -n "${newnumber}p")"
 | 
						|
            
 | 
						|
            echo "Line number was ${number}, but now is ${newnumber}. Name is ${output}."
 | 
						|
          fi
 | 
						|
        elif [ $button == 10 ];then
 | 
						|
          echo "edit $output"
 | 
						|
          "${DIRECTORY}/createapp" "$output"
 | 
						|
        else
 | 
						|
          echo 'unknown button. Exiting now.'
 | 
						|
          exit 0
 | 
						|
        fi
 | 
						|
      fi
 | 
						|
      ;;
 | 
						|
    2)
 | 
						|
      #uninstal
 | 
						|
      if ! echo "$output" | grep -q '/' ;then
 | 
						|
        uninstall "$output"
 | 
						|
        #clear output var to prompt main window to open next
 | 
						|
      else
 | 
						|
        motd="Sorry, you can"\'"t uninstall folders."
 | 
						|
        prefix=''
 | 
						|
      fi
 | 
						|
      output=''
 | 
						|
      ;;
 | 
						|
    4)
 | 
						|
      #install
 | 
						|
      if ! echo "$output" | grep -q '/' ;then
 | 
						|
        install "$output"
 | 
						|
        #clear output var to prompt main window to open next
 | 
						|
      else
 | 
						|
        motd="Sorry, you can"\'"t install folders."
 | 
						|
        prefix=''
 | 
						|
      fi
 | 
						|
      output=''
 | 
						|
      ;;
 | 
						|
    *)
 | 
						|
    error "Unknown button: $button"
 | 
						|
    ;;
 | 
						|
  esac
 | 
						|
done
 |