#!/bin/bash # # nanodesk-menumaker - generate menu from .desktop files for jwm # declare -A APPS_NAME declare -A APPS_ICON declare -A APPS_EXEC declare -A CATEGORIES_APPS # excluding 'Audio' and 'Video' because they are kind of redundant with 'AudioVideo' FREEDESKTOP_CATEGORIES="AudioVideo Development Education Game Graphics Network Office Science Settings System Utility" get_desktop_entry() { # only get [Desktop Entry] section # explanation https://stackoverflow.com/a/52957039 sed -n '/\[Desktop Entry\]/,/.*:\[.*\]/ {//!p}' } # Main freedesktop categories we iterate through later # https://specifications.freedesktop.org/menu-spec/latest/apa.html # put filename in front of its content with awk # https://www.unix.com/302929136-post4.html?s=5d91d8bbc9c7a884772b0b84b3ca6c3f # # dumping all files into a variable is much faster then grepping each file by file # sed for remove path from filename: sed 's/^\/.*\/\(.*\.desktop:\)/\1/' # awk remove path from filename: https://stackoverflow.com/a/55149591 DESKTOPFILES="$(awk '{n=split(FILENAME,array,"/"); split(array[n],arraym,"."); print arraym[1]":" $0 }' /usr/share/applications/*.desktop $HOME/.local/share/applications/*.desktop | get_desktop_entry |grep -E ':Name=|:Icon=|:Categories=|:NoDisplay=|:Exec=' )" APPS_NODISPLAY="$(echo "$DESKTOPFILES" | grep "NoDisplay=true" | cut -d : -f1 | xargs | tr ' ' '|')" APPS="$(echo "$DESKTOPFILES" | grep -vE "$APPS_NODISPLAY" | cut -d : -f1 | uniq)" # put the apps into the freedesktop categories for category in $FREEDESKTOP_CATEGORIES do # echo === CATEGORY $category === CATEGORIES_APPS[$category]="$(echo "$DESKTOPFILES" | grep -i $category | cut -d : -f1 | uniq | xargs)" # echo ${CATEGORIES_APPS[$category]} done for appname in $APPS do APPS_NAME[$appname]="$(echo "$DESKTOPFILES" | grep -E "^$appname.*Name=" | cut -d = -f2)" APPS_ICON[$appname]="$(echo "$DESKTOPFILES" | grep -E "^$appname.*Icon=" | cut -d = -f2)" APPS_EXEC[$appname]="$(echo "$DESKTOPFILES" | grep -E "^$appname.*Exec=" | cut -d = -f2)" done # #echo "$APPS" #echo ${!APPS_NAME[@]} #echo ${APPS_NAME[xfce4-web-browser]} #echo ${APPS_ICON[xfce4-web-browser]} #echo ${APPS_EXEC[xfce4-web-browser]} #echo ${APPS_CAT[xfce4-web-browser]} #echo "$DESKTOPFILES" # jwm config output cat < EOF for category in $FREEDESKTOP_CATEGORIES do # test "$category" == "AudioVideo" && category="Multimedia" #echo -e "appname: $appname \nName: ${APPS_NAME[$appname]}\nIcon: ${APPS_ICON[$appname]}\nExec: ${APPS_EXEC[$appname]}\nCategories: ${APPS_CAT[$appname]}\n---" test -n "${CATEGORIES_APPS[$category]}" && cat < EOF for app in ${CATEGORIES_APPS[$category]} do echo " "${APPS_EXEC[$app]}"" done test -n "${CATEGORIES_APPS[$category]}" && echo "" done echo ""