mirror of
https://github.com/nickrunning/wechat-selkies.git
synced 2026-05-14 10:11:59 +00:00
feat: auto-integrate desktop shortcuts into openbox right-click menu
- Scan .desktop files from ~/Desktop/ on startup and dynamically add them to the openbox menu (/config/.config/openbox/menu.xml) - Resolve icon names to actual paths under /config/proot-apps/ with fallback to system icons, preferring 256x256 resolution - Escape XML entities in name, exec command, and icon path - Only reconfigure openbox when menu content actually changes - Update README.md and README_en.md with new feature description
This commit is contained in:
@@ -8,10 +8,52 @@ if [ ! -f /config/.config/openbox/rc.xml ] || grep -A20 "<dock>" /config/.config
|
||||
openbox --reconfigure
|
||||
fi
|
||||
|
||||
# update openbox menu if differs from default
|
||||
if [ ! -f /config/.config/openbox/menu.xml ] || ! cmp /defaults/menu.xml /config/.config/openbox/menu.xml; then
|
||||
mkdir -p /config/.config/openbox
|
||||
cp /defaults/menu.xml /config/.config/openbox/menu.xml
|
||||
# generate openbox menu
|
||||
mkdir -p /config/.config/openbox
|
||||
cp /defaults/menu.xml /tmp/menu.xml
|
||||
|
||||
if ls "$HOME/Desktop/"*.desktop >/dev/null 2>&1; then
|
||||
for desktop_file in "$HOME/Desktop/"*.desktop; do
|
||||
name=$(grep -E "^Name=" "$desktop_file" | head -n 1 | cut -d "=" -f 2-)
|
||||
exec_cmd=$(grep -E "^Exec=" "$desktop_file" | head -n 1 | cut -d "=" -f 2-)
|
||||
icon=$(grep -E "^Icon=" "$desktop_file" | head -n 1 | cut -d "=" -f 2-)
|
||||
|
||||
# strip %U, %u, %F, %f
|
||||
exec_cmd=$(echo "$exec_cmd" | sed 's/ %[fFuU]//g')
|
||||
|
||||
# resolve icon path if it's just a name (not an absolute path)
|
||||
if [ -n "$icon" ] && [ "${icon#/}" = "$icon" ]; then
|
||||
icon_resolved=""
|
||||
# search in proot-apps icons (prefer 256x256)
|
||||
for size in 256x256 512x512 128x128 64x64 48x48 scalable; do
|
||||
found=$(find /config/proot-apps/*/usr/share/icons/hicolor/"$size"/apps/"$icon".* 2>/dev/null | head -n 1)
|
||||
if [ -n "$found" ]; then
|
||||
icon_resolved="$found"
|
||||
break
|
||||
fi
|
||||
done
|
||||
# fallback: search system icons
|
||||
if [ -z "$icon_resolved" ]; then
|
||||
found=$(find /usr/share/icons/hicolor/*/apps/"$icon".* 2>/dev/null | head -n 1)
|
||||
[ -n "$found" ] && icon_resolved="$found"
|
||||
fi
|
||||
[ -n "$icon_resolved" ] && icon="$icon_resolved"
|
||||
fi
|
||||
|
||||
# handle missing icon
|
||||
[ -z "$icon" ] && icon="/usr/share/pixmaps/xterm-color_48x48.xpm"
|
||||
|
||||
# escape XML entities
|
||||
exec_cmd=$(echo "$exec_cmd" | sed 's/&/\&/g; s/</\</g; s/>/\>/g')
|
||||
name=$(echo "$name" | sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g')
|
||||
icon=$(echo "$icon" | sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g')
|
||||
|
||||
sed -i "/<menu id=\"root-menu\" label=\"MENU\">/a \\<item label=\"${name}\" icon=\"${icon}\"><action name=\"Execute\"><command>${exec_cmd}</command></action></item>" /tmp/menu.xml
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ! -f /config/.config/openbox/menu.xml ] || ! cmp /tmp/menu.xml /config/.config/openbox/menu.xml; then
|
||||
cp /tmp/menu.xml /config/.config/openbox/menu.xml
|
||||
openbox --reconfigure
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user