Menu secundário

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

[ Hits: 1.616 ]

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

Browser - use rofi para acessar páginas na web

Enviar gráficos 2D pela janela de chat no Kopete

Script para copiar DVD

Raizes de equações do 2o grau no dc

Jogo da velha


  

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