#!/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 (#prettify hidelist file hidelist="$(cat "${DIRECTORY}/data/hidelist" | sort | uniq | sed '/^[[:space:]]*$/d')" echo "$hidelist" > "${DIRECTORY}/data/hidelist" ) & (if cat ~/.config/autostart/pi-apps-updater.desktop | grep -q installedonly ;then "${DIRECTORY}/install" fi) & 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 while true;do LIST="$("${DIRECTORY}/preload" $guimode)" #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 output="$(echo -e "$LIST" | yad --center --title='Pi-Apps' --width=310 --height=400 --no-headers \ --text="$motd" --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=tip:HD --print-column=3 --tooltip-column=4 \ --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' \ )" 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 [ -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 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 output="$(echo -e "$LIST" | xlunch -WoCS -s 64 --bc 000000A0 --tc ffffffff --pc 6060ffff --hc 60606010 \ -p "Search: " -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 exit 0 fi fi output="$(echo "$output" | sed '/^$/d')" echo "Output: ${output}EOO" done case $button in 1) echo "User exited." exit 0 ;; 0) echo "Details" 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 \ $whichbutton \ --button=''!"${DIRECTORY}/icons/up.png"!'View previous App':6 \ --button=''!"${DIRECTORY}/icons/down.png"!'View next App':8 \ --button=Back!"${DIRECTORY}/icons/back.png":0 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 ];then echo 'previous app' #convert $output into number, then subtract 1 from it lsoutput="$(echo "$(ls "${DIRECTORY}/apps")" | grep -vxE "$(cat "${DIRECTORY}/data/hidelist" | tr '\n' '|')")" 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 lsoutput="$(echo "$(ls "${DIRECTORY}/apps")" | grep -vxE "$(cat "${DIRECTORY}/data/hidelist" | tr '\n' '|')")" 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}." elif [ $button == 10 ];then echo "edit $output" "${DIRECTORY}/createapp" "$output" else echo 'unknown button. Exiting now.' exit 0 fi ;; 2) uninstall "$output" #clear output var to prompt main window to open next output='' ;; 4) install "$output" #clear output var to prompt main window to open next output='' ;; *) error "Unknown button: $button" ;; esac done