Menu secundário
Publicado por João Gabriel (última atualização em 03/02/2021)
[ Hits: 2.018 ]
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]}"
retira espaços em branco de arquivos
Carrega o VNC em uma tela do X11 separada e com mouse para canhotos
Redimensionador automático de imagens
Baixando arquivos do MediaFire
Script para ripar CDs de audio e codificar as faixas para MP3
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
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Programa fora de escala na tela do pc (10)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)
O programa assinador digital (1)









