Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- ##
- # Author: Mikhaylov Anton aka anion155 <[email protected]>
- ##
- ## Usage string
- USAGE="Usage: $0 [-h] [-c] [-d] [-t] [-r] -f <launcher_name> [-o <order_of_actions>] -- <Actions>
- -f <launcher_name> Name of the launcher to change, can be with out expansion
- -o <order_of_actions> Order of actions wich must be separated by ';', ' ' or ','. Example:
- 'FirstItem SecondItem;ThirdItem/ForthItem'.
- <Actions> String for every adding action.
- Example:
- 'ActionName\\Name=New Action\\Name[ru_RU]=Новое действие\\Exec=whoiam'
- Format:
- After action name follow all lines you want. 'OnlyShowIn=Unity;' isn't neccecery line.
- '\\' is symbol of the new line.
- -c Delete all actions before adding.
- -d Copy file from /usr/share/applications/ folder.
- -t Test launch. Print result in stdout insteed launcher.
- -r Restore backup.
- -h This prompt \n"
- ## Messages
- ERROR="$0: Error:"
- WARNING="$0: Warning:"
- ## System vars
- SYS_FOLDER='/usr/share/applications'
- USER_FOLDER="$HOME/.local/share/applications"
- ## Launcher name
- declare LAUNCHER_NAME
- ## Source file
- declare SOURCE
- ## Target file
- declare TARGET
- ## Backup file
- declare BACKUP
- ## Silence of the script
- SILENCE='/dev/null'
- ## Clean file from other actions
- CLEAN_FILE=false
- ## Copy file from /usr/share/applications
- FORCE_USE_FROM_SYS=false
- ## Print result in stdout insteed real file
- TEST=false
- ## Restore from backup
- RESTORE=false
- ## Old actions
- declare -a OLD_ORDER
- declare -a OLD_ACTION_NAME
- declare OLD_ACTIONS_CONTENT
- ## Added actions
- declare -a ORDER
- declare -a ACTION_NAME
- declare -a ACTION_CONTENT
- declare ACTIONS_COUNT
- ## Options check and parse
- while getopts ":chf:dto:r" opt; do
- case "$opt" in
- "h") echo -e "$USAGE"; exit 0;;
- "f")
- OPTARG="$(basename $OPTARG)"
- if [ ${OPTARG:${#OPTARG}-8} == '.desktop' ]; then
- OPTARG=${OPTARG:0:${#OPTARG}-8}
- fi
- if [ -f "$USER_FOLDER/$OPTARG.desktop" ]; then
- SOURCE="$USER_FOLDER"
- elif [ -f "$SYS_FOLDER/$OPTARG.desktop" ]; then
- SOURCE="$SYS_FOLDER"
- else
- echo "$ERROR Invalid launcher name $OPTARG. Launcher must be in $SYS_FOLDER or in $USER_FOLDER folder!"
- exit 1
- fi
- LAUNCHER_NAME="$OPTARG"
- ;;
- "o") ORDER=( `echo $OPTARG | sed -e 's/,/ /g;s/;/ /g'` );;
- "c") CLEAN_FILE=true;;
- "d") FORCE_USE_FROM_SYS=true;;
- "r") RESTORE=true;;
- "t") TEST=true;;
- "?") echo "$ERROR Invalid option $OPTARG. Try '$0 -h' for help"; exit 1;;
- *) echo "$ERROR Unknown error while processing options"; exit 1;;
- esac
- done
- i=$OPTIND
- index=0
- while [ $i -le $# ]; do
- action="${!i}"
- ACTION_NAME[$index]="`echo $action | cut -d\\\\ -f1`"
- k=0
- while [ $k -lt $index ]; do
- if [[ "${ACTION_NAME[$k]}" == "${ACTION_NAME[$index]}" ]]; then
- echo "$ERROR Action initialization should be carried out only once!"
- exit 1
- fi
- ((k++))
- done
- ACTION_CONTENT[$index]="`echo $action | cut -d\\\\ -f2- | sed -e 's/\\\\/\n/g'`"
- ((i++))
- ((index++))
- done
- ACTIONS_COUNT=$index
- unset i
- unset index
- unset k
- ## Invalid arguments
- if ! ( $TEST || ( $RESTORE && [ "$LAUNCHER_NAME" ] ) || [ "$SOURCE" ] ); then
- echo "$ERROR Invalid options. Try '$0 -h' for help"
- exit 1
- fi
- ## Restore backup
- if $RESTORE; then
- if [ -f "$USER_FOLDER/$LAUNCHER_NAME.desktop" ]; then
- cp "$USER_FOLDER/$LAUNCHER_NAME.desktop"{'.backup',}
- exit 0
- else
- echo "$WARNING Backup for $LAUNCHER_NAME made by this script doesn't exist."
- exit 2
- fi
- fi
- ## Initiate target
- if $TEST; then
- SILENCE='1'
- else
- ## Make new file, if $SOURCE in root directory, and backup file
- if [ -f "$USER_FOLDER/$LAUNCHER_NAME.desktop" ]; then
- cp "$USER_FOLDER/$LAUNCHER_NAME.desktop"{,'.backup'}
- fi
- if $FORCE_USE_FROM_SYS || [[ "$SOURCE" == "$SYS_FOLDER" ]]; then
- cp {"$SYS_FOLDER","$USER_FOLDER"}"/$LAUNCHER_NAME.desktop"
- fi
- ## Target
- TARGET="$USER_FOLDER/$LAUNCHER_NAME.desktop"
- fi
- if ! ( $CLEAN_FILE || $TEST ) && [ "$SOURCE" ]; then
- ## Initializade file
- OLD_ORDER=( `cat "$TARGET" | sed -e '/^Actions=/!d' -e 's/^Actions=//' -e 's/\;/ /'` )
- OLD_ACTION_NAME=( `cat "$TARGET" | sed -e '/^\[Desktop Action /!d' | cut -d\ -f3 | sed -e 's/\]//'` )
- OLD_ACTIONS_CONTENT="`cat "$TARGET" | awk '/^\[[^\]]+\]/{a=0}/^\[Desktop Action*/{a=1}{if(a)print}'`"
- i=0
- while [ $i -lt $ACTIONS_COUNT ]; do
- k=0
- while [ $k -lt ${#OLD_ACTION_NAME} ]; do
- if [[ "${ACTION_NAME[$i]}" == "${OLD_ACTION_NAME[$k]}" ]]; then
- echo "$ERROR Action initialization should be carried out only once!"
- exit 1
- fi
- ((k++))
- done
- ((i++))
- done
- unset i
- unset k
- fi
- if ! $TEST; then
- ## Clean up file from actions
- sed -e '/^Actions=/d' "$TARGET" --in-place
- awk '/^\[[^\]]+\]/{a=0}/^\[Desktop Action*/{a=1}{if(!a)print}' "$TARGET" | tee "$TARGET" >/dev/null
- fi
- ## Echo actions order
- echo -e -n '\nActions=' | tee -a "$TARGET" 2>/dev/null >&$SILENCE
- if ! $TEST; then
- i=0
- while [ $i -lt ${#OLD_ORDER[@]} ]; do
- echo -n "${OLD_ORDER[$i]};" | tee -a "$TARGET" 2>/dev/null >&$SILENCE
- ((i++))
- done
- fi
- i=0
- if [ "$ORDER" ]; then
- buf=( ${ORDER[@]} )
- else
- buf=( ${ACTION_NAME[@]} )
- fi
- while [ $i -lt ${#buf[@]} ]; do
- echo -n "${buf[$i]};" | tee -a "$TARGET" 2>/dev/null >&$SILENCE
- ((i++))
- done
- echo -e -n "\n" | tee -a "$TARGET" 2>/dev/null >&$SILENCE
- unset buf
- ## Echo actions content
- if ! $TEST; then
- echo -e -n "\n$OLD_ACTIONS_CONTENT" | tee -a "$TARGET" 2>/dev/null >&$SILENCE
- fi
- i=0
- while [ $i -lt $ACTIONS_COUNT ]; do
- NAMES="`echo -e "${ACTION_CONTENT[$i]}" | sed -e '/^Name/!d'`"
- EXEC="`echo -e "${ACTION_CONTENT[$i]}" | sed -e '/Exec=/!d'`"
- ONLYSHOWIN="`echo -e "${ACTION_CONTENT[$i]}" | sed -e '/^OnlyShowIn=/!d'`"
- if ! [ $ONLYSHOWIN ]; then
- ONLYSHOWIN='OnlyShowIn=Unity;'
- fi
- echo -e -n "\n[Desktop Action ${ACTION_NAME[$i]}]\n$NAMES\n$EXEC\n$ONLYSHOWIN\n" | tee -a "$TARGET" 2>/dev/null >&$SILENCE
- ((i++))
- done
- unset i
- unset NAMES
- unset EXEC
- unset ONLYSHOWIN
- if ! $TEST; then
- desktop-file-validate "$TARGET"
- fi
Advertisement
Add Comment
Please, Sign In to add comment