julho 25, 2019

Exibindo (apenas) o número da área de trabalho no painel do Xfce

Uma das coisas que sempre me incomodou no painel do Xfce, é a falta de um plugin que exibisse apenas o número da área de trabalho atual, como existe, por exemplo, no painel do LXDE. Se você também se incomodava com isso, "seus problemas acabaram"!

Aviso!

Essa dica foi testada apenas no Debian (Buster e Sid), onde a versão do Xfce ainda é a 4.12. Pode ser que funcione com a versão intermediária 4.13, mas não posso garantir que funcionará com a 4.14 quando ela for lançada em agosto.

Para resolver esse problema, vamos precisar garantir que temos algumas coisas instaladas:

sudo apt install xfce4-genmon-plugin wmctrl

Se estiver tudo instalado, o primeiro passo é adicionar o plugin Monitor Genérico ao painel e posicioná-lo no local de sua preferência. Aqui, eu deixei assim as minhas configurações de itens no painel:

Como a função do plugin Monitor Genérico é exibir textos (e imagens!) oriundos da saída de um comando do shell, nós temos que editar as propriedades do plugin e incluir, em "Comando", justamente o comando que nós queremos que o shell execute:

sh -c "echo $(wmctrl -d | grep \* | awk '{print $1 + 1}')"

Também podemos ajustar a fonte do texto que será exibido e intervalo de tempo entre execuções do plugin Monitor Genérico, como pode ser visto na imagem abaixo.

Depois, é só fechar e está pronto!

O número da área de trabalho atual agora aparece no local que eu determinei e será atualizado a cada 0,25s, acompanhando as mudanças de área de trabalho que eu fizer, seja por menu de contexto, abrindo uma aplicação em outra área de trabalho, usando o atalho Ctrl+Alt+setas_de_direção, etc.

 

Entendendo os comandos

Para entender o que nós fizemos, vamos analisar cada parte do comando que nós inserimos no plugin Monitor Genérico.

sh -c " os comandos " 

A primeira parte é o comando sh -c, que é um executor do shell acrescido da opção -c, de "comando". Deste modo, eu posso mandar o shell executar tudo que vier a seguir (entre aspas).

wmctrl -d

O wmctrl é uma ferramenta muito útil para obtermos diversas informações sobre o gerenciador de janelas (no caso do Xfce, o xfwm4). Especificamente a opção -d serve para listar todas as áreas de trabalho sob controle do gerenciador de janelas.

Eu estou no i3wm, não no Xfce, mas o conceito é o mesmo. Se eu executar o comando wmctrl em um terminal, ele me retornará uma lista de áreas de trabalho. Na imagem, você pode ver que eu estou com 5 áreas de trabalho ativas (começando a contar de "0"), e uma delas está marcada com um asterisco (*).

Esta é a minha área de trabalho atual, a que eu estou usando no momento, no caso, a terceira.

Mas eu não quero uma lista de áreas de trabalho, eu quero apenas a atual. Por isso, precisamos fazer a saída desse comando ser enviada para o comando seguinte através de um "pipe", representada pela barra vertical |.

O comando que irá retornar apenas a linha que me interessa é o grep, que serve justamente para retornar linhas de um texto que correspondam a um padrão.

wmctrl -d | grep \*

No nosso caso, nós queremos a única linha que possui um "*", mas tem uma pegadinha aí. O asterisco é considerado pelo grep como um wildcard, um símbolo para indicar qualquer ou nenhuma correspondência na busca por um padrão. Por esse motivo, nós usamos a barra invertida (\), para que o grep entenda que aquele asterisco é literalmente um asterisco.

No terminal, este seria o retorno dessa parte do comando:

Interessante, mas ainda não é o que nós queremos. Nós precisamos do número que aparece no começo da linha retornada. Além disso, como a contagem das áreas de trabalho começa em "0", esse número precisa ser acrescido de "1".

Dentre as várias opções de comandos que poderiam resolver o problema, eu optei por um dos meus preferidos, o awk.

wmctrl -d | grep \* | awk '{ print $1 + 1 }'

O awk (oficialmente gawk) não é exatamente um comando, mas uma linguagem completa para processamento de textos. Como não vamos entrar em muitos detalhes nesse artigo, basta compreender que o awk irá executar o seu comando interno print para exibir o primeiro campo da linha de texto que o grep mandar para ele através do segundo pipe.

Por padrão, o awk divide linhas de texto em "campos" separados por um ou mais espaços. Deste modo, o primeiro campo da linha é exatamente o número da área de trabalho, e basta somarmos "1" para que ele corresponda ao valor que nós queremos. Esta seria a saída do comando no terminal:

Esse é o número que nós queremos!

Finalmente, para que ele seja exibido no painel, através do plugin Monitor Genérico, nós utilizamos o comando echo...

sh -c "echo $(wmctrl -d | grep \* | awk '{print $1 + 1}')"

A rigor, bastaria que o comando fosse assim:

sh -c "wmctrl -d | grep \* | awk '{print $1 + 1}'"

Porque, como vimos nas imagens, ele já retorna um texto. Mas, como nós podemos querer adicionar mais alguma coisa além do número retornado, eu preferi utilizar uma substituição de comando, que é quando a saída de um comando substitui o comando em si, e eu fiz isso usando a sintaxe $( ... ).

Assim, eu posso fazer algo como...

Com este resultado no Xfce:

 

 

Dúvidas? Outras soluções? Críticas? Correções?

Fique à vontade para usar os comentários!

 

 

Nenhum comentário:

Postar um comentário

O sistema de comentários do Blogspot é um lixo e praticamente me obriga a liberar ou moderar todos os comentários. Portanto, eu peço perdão antecipadamente caso o seu comentário demore para aparecer.

Mas não se acanhe por causa disso! :-)