Menu secundário

Publicado por João Gabriel (última atualização em 03/02/2021)

[ Hits: 1.754 ]

Download menu-sec




Uma forma de utilizar o ROFI ou o dmenu juntamente com arquivos DESKTOP para criar um menu secundário, separado do principal.

  



Esconder código-fonte

#!/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]}"

Scripts recomendados

Conexão e Desconexão ADSL automáticas no Slackware

Adiciona imagens ao email

Listas em shell

Snake [ALFA] em Shell Script

Script para backup


  

Comentários
[1] Comentário enviado por maurixnovatrento em 04/02/2021 - 11:48h


Bem bacana.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts