Menu secundário
Publicado por João Gabriel (última atualização em 03/02/2021)
[ Hits: 2.037 ]
Uma forma de utilizar o ROFI ou o dmenu juntamente com arquivos DESKTOP para criar um menu secundário, separado do principal.
#!/usr/bin/env bash
# Script para ler arquivos DESKTOP em um diretório, sendo usado juntamente
# com o ROFI/dmenu para criar um menu secundário, separado do principal.
#
# Requer PCRE, ROFI/dmenu
#
# 11/20 - por goll72
# Se você quiser deixar o diretório com os arquivos DESKTOP dentro de /usr/share/applications/,
# use um diretòrio oculto, senão as entradas DESKTOP que você criar aparecerão no menu principal.
# Você pode chamar o script com "dir=<DIRETÓRIO> script" para mudar o diretório utilizado.
dir=${dir:-/usr/share/applications/.games/}
for i in "$dir"/*.desktop; do
IFS=$'\n'
# O arquivo DESKTOP deve cumprir às normas da Desktop Entry Specification
desktop-file-validate "$i" >/dev/null 2>&1 || continue
# Apenas entradas com Type=Application são usadas no momento.
# Com a opção NoDisplay=true, a entrada não aparecerá no menu.
pcregrep '(NoDisplay=true|(?!Type=Application))' >/dev/null <<< "$i" || continue
# Mesmo não sendo requirido pela DES, é preciso uma opção Exec nas entradas
pcregrep 'Exec=' >/dev/null <<< "$i" && continue
# Salva o conteúdo do arquivo DESKTOP atual numa variável
progfile="$(<"$i")"
# Retira os prefixos das linhas Name= e Exec=
# E adiciona os conteúdos das linhas a um array
progname="${gamefile##*$'\n'Name=}"
progname="${gamename%%$'\n'*}"
prognameA+=("$gamename")
progexec="${gamefile##*$'\n'Exec=}"
progexec="${gamexec%%$'\n'*}"
progexecA+=("$gamexec")
done
# Adiciona os nomes dos itens que estão no array a uma variavél
# Os nomes são separados por \n (linefeed)
for i in "${!prognameA[@]}"; do
proglist+="${prognameA[$i]}"$'\n'
done
# Se você usa ROFI, use o primeiro item e comente o segundo
# Se você usa dmenu, use o segundo item e comente o primeiro.
#menusel=$(printf '%s' "$gamelist" | rofi -dmenu -i)
menusel=$(printf '%s' "$gamelist" | dmenu#!/usr/bin/env bash
# Script para ler arquivos DESKTOP em um diretório, sendo usado juntamente
# com o ROFI/dmenu para criar um menu secundário, separado do principal.
#
# Requer PCRE, ROFI/dmenu
#
# 11/20 - por goll72
# Se você quiser deixar o diretório com os arquivos DESKTOP dentro de /usr/share/applications/,
# use um diretòrio oculto, senão as entradas DESKTOP que você criar aparecerão no menu principal.
# Você pode chamar o script com "dir=<DIRETÓRIO> script" para mudar o diretório utilizado.
dir=${dir:-/usr/share/applications/.games/}
for i in "$dir"/*.desktop; do
IFS=$'\n'
# O arquivo DESKTOP deve cumprir às normas da Desktop Entry Specification
desktop-file-validate "$i" >/dev/null 2>&1 || continue
# Apenas entradas com Type=Application são usadas no momento.
# Com a opção NoDisplay=true, a entrada não aparecerá no menu.
pcregrep '(NoDisplay=true|(?!Type=Application))' >/dev/null <<< "$i" || continue
# Mesmo não sendo requirido pela DES, é preciso uma opção Exec nas entradas
pcregrep 'Exec=' >/dev/null <<< "$i" && continue
# Salva o conteúdo do arquivo DESKTOP atual numa variável
progfile="$(<"$i")"
# Retira os prefixos das linhas Name= e Exec=
# E adiciona os conteúdos das linhas a um array
progname="${gamefile##*$'\n'Name=}"
progname="${gamename%%$'\n'*}"
prognameA+=("$gamename")
progexec="${gamefile##*$'\n'Exec=}"
progexec="${gamexec%%$'\n'*}"
progexecA+=("$gamexec")
done
# Adiciona os nomes dos itens que estão no array a uma variavél
# Os nomes são separados por \n (linefeed)
for i in "${!prognameA[@]}"; do
proglist+="${prognameA[$i]}"$'\n'
done
# Se você usa ROFI, use o primeiro item e comente o segundo
# Se você usa dmenu, use o segundo item e comente o primeiro.
#menusel=$(printf '%s' "$gamelist" | rofi -dmenu -i)
menusel=$(printf '%s' "$gamelist" | dmenu)
# O script morre se não houverem entradas no diretório ou se nada for selecionado no ROFI/dmenu
if [ -z "$menusel" ] || [[ $proglist != *"$menusel"* ]]; then
exit
fi
# Obtém o indíce do item selecionado
for i in "${!prognameA[@]}"; do
[ "${prognameA[$i]}" = "$menusel" ] && curindex=$i
done
# Executa o item selecionado, baseado no índice
exec "${progexecA[$curindex]}")
# O script morre se não houverem entradas no diretório ou se nada for selecionado no ROFI/dmenu
if [ -z "$menusel" ] || [[ $proglist != *"$menusel"* ]]; then
exit
fi
# Obtém o indíce do item selecionado
for i in "${!prognameA[@]}"; do
[ "${prognameA[$i]}" = "$menusel" ] && curindex=$i
done
# Executa o item selecionado, baseado no índice
exec "${progexecA[$curindex]}"
KDE 4.1.1 no Slackware Linux 12.1
Convertendo vídeos flv para avi
Como ver/ouvir vídeo/áudio via Terminal de modo prático
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (6)
O programa assinador digital (5)









