Pular para o conteúdo

Menu secundário

Uma forma de utilizar o ROFI ou o dmenu juntamente com arquivos DESKTOP para criar um menu secundário, separado do principal.
João Gabriel goll72
Hits: 2.332 Categoria: Shell Script Subcategoria: Miscelânea
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Uma forma de utilizar o ROFI ou o dmenu juntamente com arquivos DESKTOP para criar um menu secundário, separado do principal.
Download menu-sec Enviar nova versão

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]}"

Import com timer

Script de compilação do kernel 3.3.4 no Ubuntu 11.10 64 bits

Manutenção de rede

Utilitario de montagem

Resolvendo NO_PUBKEY

Contribuir com comentário

Entre na sua conta para comentar.