/
mxfb-menu-generator
executable file
·224 lines (186 loc) · 7.64 KB
/
mxfb-menu-generator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#!/bin/bash
### mxfb-menu-generator: a tiny script to Create a (non dynamic) fluxbox menu using information on .desktop files, released by PPC, 7/10/2020, under GPLv3
### Modified by MX Linux Devs for use in MX-Fluxbox August 2021
### How to use this script:
### 1. Copy the script below and paste it into your text editor, saving it in your Home as MXFB_menu_generator.sh
### 2. Navigate to that file, right click it > Proprieties > "Permissions" tab > Check the last field, to allow this script to run as a program
### 3. Add the following entry to your menu to access "All Categories" anywhere you want
#######################################################################################
#[submenu] (All Apps)
# [include] (~/.fluxbox/submenus/full_menu)
# [separator]
# [include] (~/.fluxbox/full_menu)
# [end]
#######################################################################################
### 4.- Now click Menu > All apps > Update menu. Wait for some seconds while the menu is generated
#ensure subfolder menu exists
if [ -d "$HOME/.fluxbox/submenus" ]; then
mkdir -p "$HOME/.fluxbox/submenus"
fi
#exit if in chroot
if [ "$UID" = "0" ]; then
echo "mxfb-menu-generator: in a chroot, exiting..."
exit 0
fi
#exit if menu generation toggled off
if [ "$1" = "auto" ]; then
if [ -e "$HOME/.fluxbox/mxfb-menu-generator-disabled.chk" ]; then
exit 0
fi
fi
#check time since last build
time=0
now=$(date +"%s")
if [ -e "$HOME/.fluxbox/submenus/full_menu" ]; then
time=$(stat --format %Y $HOME/.fluxbox/submenus/full_menu)
fi
if [ $(($now-$time)) -lt 5 ]; then
exit 0
fi
Encoding=UTF-8
#
# use session locale
SESSION_LANG=$(sed -n '/^Language=/{s///; s/[.].*/.UTF-8/;p;q}' ~/.dmrc 2>/dev/null) ;
LANG=${SESSION_LANG:=$LANG}
# i18n - Internationalization
#export TEXTDOMAIN=mxfb-accessories
export TEXTDOMAIN=mx-desktop-menu-l10n
export TEXTDOMAINDIR="/usr/share/locale"
CATEGORIES="Accessories Development Games Graphics Internet Multimedia Office System Settings"
ALLAPPS=$(gettext "All Applications")
[ "$ALLAPPS" = "All Applications" ] && ALLAPPS="All Apps"
echo Please wait, creating menu file - stored in ~/.fluxbox/submenus/full_menu ...
if [ ! -d $HOME/.fluxbox ]; then
mkdir -p $HOME/.fluxbox
fi
cd $HOME/.fluxbox/
mkdir -p submenus
touch submenus/full_menu
FILE="$HOME/.fluxbox/submenus/full_menu"
#echo
#echo If you want to insert this 'All categories' sub-menu into your MXFB menu:
#echo 'rootMenu > Settings > Configure > Menu'
#echo and insert, anywhere you want, this code:
#echo ' [submenu] (All apps)'
#echo ' [include] (~/.fluxbox/submenus/full_menu)'
#echo ' [separator] '
#echo ' [exec] (Update Menu) {mxfb-menu-generator} '
#echo ' [end]'
#echo
#Get system language (to allow localization):
lang=${LANG%%_*}
#Loop through all .desktop files in the applications folder
#lang=fr
LIST="/usr/share/applications/*.desktop"
if [ -n "$(find /var/lib/flatpak/exports/share/applications/ -name *.desktop 2>/dev/null)" ]; then
LIST="$LIST /var/lib/flatpak/exports/share/applications/*.desktop"
fi
if [ -n "$(find $HOME/.local/share/applications/ -name *.desktop 2>/dev/null)" ]; then
LIST="$LIST $HOME/.local/share/applications/*.desktop"
fi
if [ -n "$(find $HOME/.local/share/flatpak/exports/share/applications/ -name *.desktop 2>/dev/null)" ]; then
LIST="$LIST $HOME/.local/share/flatpak/exports/share/applications/*.desktop"
fi
if [ -n "$(find /usr/share/applications/antix/ -name *.desktop 2>/dev/null)" ]; then
LIST="$LIST /usr/share/applications/antix/*.desktop"
fi
for file in $LIST
do
if [ -f "$file" ]; then
name1=$(grep -o -m 1 '^Name=.*' "$file")
### localized menu entries generator (slows the script down, but produces nearly perfect localized menus):
name2=$name1
translated_name1=$(grep -o -m 1 "^Name\[$lang\]=.*" "$file")
[ -z "$translated_name1" ] && note="No localized name found, using the original one" || name2=$translated_name1
#if the desktop file has the string "Desktop Action" simple use the original untranslated name, to avoid using a translation that's not the name of the app, but the action it does
grep -q "Desktop Action" "$file" && name2=$name1
name1=$name2
### end of localized menu entries generator
name=$(echo $name1|sed 's/.*\=//')
command1="$(grep -o -m 1 '^Exec=.*' "$file")"
command=$(echo "$command1" |sed -E 's/Exec\=//g')
name=$(echo "$name" |sed 's/[()]//g')
terminal=$(grep -o -m 1 'Terminal=.*' "$file")
if [[ $terminal == *"true"* ]]; then
command=$(echo x-terminal-emulator -e $command)
fi
categories=$(grep -o -m 1 'Categories=.*' "$file")
nodisplay=$(grep -o -m 1 'NoDisplay=.*' "$file")
if [[ $nodisplay == *"rue"* ]]; then
Note="not adding this entry to menu because it has a nodisplay flag"
else
echo "[exec] ("$name ")" "{" $command "}" $categories
fi
fi
done > /tmp/list.txt
sort /tmp/list.txt > ~/.fluxbox/pre-global-menu.txt
rm $FILE
#fix for repeated synaptic menu entry- first instance does not run, so, delete it:
sed -i '/{ synaptic }/d' ~/.fluxbox/pre-global-menu.txt
#### Now divide applications into categories:
#This array has all the available .desktop file categories we want to have on the menu (note: the "." is a quick and dirty workaround, so the script ignores entry nr 0):
array1=( . Utility Development Game Graphics Network AudioVideo Office System Settings)
#This array corresponds to the previous one, but it's the "user friendly name" that shows on the menu- NOTE: this can be translated to any language!
array2=( . $CATEGORIES)
#Begin LOCALIZATION OF Category sub-menus to a language - pt, add equivalent section for other languages:
# if [[ $lang == *"pt"* ]];
# then
# array2=( . Acessórios Desenvolvimento Jogos Graficos Internet Multimédia Escritório Sistema 'Definições globais')
# echo A criar submenus em Português
# fi
#End LOCALIZATION OF Category sub-menus
#Create the header of the file
echo "[begin] ($ALLAPPS)" >> $FILE
#Loop through the array- the last number below has to match the number of entries on $array1
for i in {1..9};
do
#Create a submenu entry for the current item on $array2
echo "[submenu] ($(gettext "${array2[$i]}"))" >> $FILE
#Nested loop to check if the item on the current line of the "pre-global-menu.txt" file matches the current item on $array1, if it matches, add it to the "$FILE" file
while read p; do
if [[ $p =~ ${array1[$i]} ]]
then
echo $p >> $FILE
fi
done <~/.fluxbox/pre-global-menu.txt ;
echo '[end]' >> $FILE ;
done
#Process only entries that don't fit anywhere else:
sed -i '/Utility/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/Development/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/Game/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/Graphics/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/AudioVideo/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/Office/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/System/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/Settings/d' ~/.fluxbox/pre-global-menu.txt
sed -i '/Network/d' ~/.fluxbox/pre-global-menu.txt
#check if the file is not empty, create last submenu and populate it
file="~/.fluxbox/pre-global-menu.txt"
if [ -s "$file" ]
then
note="empty file, do nothing"
else
echo "[submenu] ($(gettext "Other"))" >> $FILE
while read p; do
echo $p >> $FILE
done <~/.fluxbox/pre-global-menu.txt ;
echo '[end]' >> $FILE
fi
###Fix menu errors, so Libreoffice, etc, work without errors
delete="%U"
sed -e s/$delete//g -i $FILE
delete="%u"
sed -e s/$delete//g -i $FILE
delete="%F"
sed -e s/$delete//g -i $FILE
delete="%f"
sed -e s/$delete//g -i $FILE
echo Menu file created and ready to be used
#if fluxbox running, reload menu
test=$(ps -aux)
if [[ "$test" == *"startfluxbox" ]]; then
fluxbox-remote restart
killall -SIGUSR1 conky 2>/dev/null
fi
exit 0