Gerenciamento alternativo de janelas no Linux

Eu sou um daqueles que coloca os layouts de alternância do Caps Lock porque tenho preguiça de pressionar duas teclas quando você pode pressionar uma. Eu gostaria de duas chaves desnecessárias: eu usaria uma para ativar o layout em inglês e a segunda para o russo. Mas a segunda chave desnecessária é uma chamada ao menu de contexto, que é tão desnecessário que é cortado por muitos fabricantes de laptops. Então você precisa se contentar com o que tem.


E quando troco de janela, não quero procurar seus ícones na barra de tarefas, ver os nomes ao percorrer Alt + Tab , percorrer as áreas de trabalho etc. Desejo pressionar uma combinação de teclas (idealmente, existe uma, mas não há teclas desnecessárias gratuitas) ) e entre imediatamente na janela que eu preciso. Por exemplo, assim:


  • Alt + F: Firefox
  • Alt + D: Firefox (Navegação Privada)
  • Alt + T: Terminal
  • Alt + M: Calculadora
  • Alt + E: Idéia IntelliJ
  • etc.

Além disso, pressionando, por exemplo, Alt + M, desejo ver a calculadora, independentemente de este programa estar em execução no momento. Se estiver em execução, sua janela precisará receber foco e, se não estiver, inicie o programa desejado e transfira o foco quando carregar.


Para casos que não são cobertos pelo cenário anterior, desejo ter atalhos de teclado universais aos quais você pode atribuir facilmente qualquer uma das janelas abertas. Por exemplo, tenho 10 combinações atribuídas de Alt + 1 a Alt + 0 que não estão vinculadas a nenhum programa. Eu posso simplesmente pressionar Alt + 1 e a janela que está atualmente em foco receberá foco quando Alt + 1 for pressionado.


Abaixo do corte, uma descrição de mais alguns recursos e uma resposta sobre como fazer isso. Mas avisarei imediatamente que essa personalização "para você" pode causar um forte vício e até quebrar, se necessário, usar Windows, Mac OS ou até mesmo o computador de outra pessoa com Linux.


De fato, se você pensar bem, não usamos muitos programas todos os dias. Um navegador, terminal, IDE, algum tipo de mensageiro, gerenciador de arquivos, calculadora e, talvez, quase isso. Não são necessárias muitas combinações de teclas para cobrir 95% das tarefas diárias.


Para programas com várias janelas abertas, uma delas pode ser atribuída como principal. Por exemplo, várias janelas do IntelliJ Idea estão abertas, atribuídas a Alt + E. Em condições normais, pressionar Alt + E abrirá uma janela deste programa, provavelmente a que foi aberta primeiro. No entanto, se você pressionar Alt + E quando uma das janelas deste programa já estiver em foco, essa janela será atribuída como principal e o foco será transferido para ele após o pressionamento subsequente da combinação.


A janela principal pode ser reatribuída. Para fazer isso, primeiro você precisa redefinir a combinação e depois atribuir outra janela a ela como a principal. Para redefinir uma combinação, é necessário pressionar a própria combinação e, em seguida, uma combinação especial de redefinição, eu a designei a Alt + Backspace . Isso invocará um script que desassociará a janela principal da combinação anterior. E então você pode atribuir uma nova janela principal como descrito no parágrafo anterior. Redefinir uma janela vinculada a combinações universais é semelhante.


A introdução acabou sendo longa, mas eu queria primeiro dizer o que faríamos e depois explicar como fazê-lo.


Para quem está cansado de ler


Em resumo, um link para os scripts no final do artigo.


Mas, mesmo assim, ele não funcionará e será instalado e usado imediatamente. Primeiro, você precisa descobrir como o script encontra a janela certa. Sem isso, não funcionará para dizer exatamente ao script onde focar. E você precisa entender o que fazer se de repente uma janela adequada não for encontrada.


E não vou me concentrar em como configurar a execução do script pressionando as combinações de teclas. Por exemplo, no KDE, isso está em Configurações do sistema → Atalhos → Atalhos personalizados. Em outros gerenciadores de janelas, isso também deve ser.


Apresentando o wmctrl


Wmctrl é um utilitário de console para interagir com o X Window Manager. Este é um programa de script chave. Vamos dar uma olhada rápida em como você pode usá-lo.


Primeiro, liste as janelas abertas:


$ wmctrl -lx 0x01e0000e -1 plasmashell.plasmashell N/A Desktop — Plasma 0x01e0001e -1 plasmashell.plasmashell N/A Plasma 0x03a00001 0 skype.Skype N/A Skype 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) ... 

A opção -l exibe uma lista de todas as janelas abertas e -x adiciona o nome da classe ( skype.Skype , Navigator.Firefox , etc.) à saída. Vamos precisar do ID da janela (coluna 1), do nome da classe (coluna 3) e do nome da janela (última coluna).


Você pode tentar ativar alguma janela usando a opção -a :


 $ wmctrl -a skype.Skype -x 

Se tudo correu conforme o planejado, uma janela do Skype deve aparecer na tela. Se você usar a opção -i em vez da opção -x , poderá especificar o ID da janela em vez do nome da classe. Com o id, o problema é que o ID da janela muda toda vez que o aplicativo é iniciado e não podemos conhecê-lo com antecedência. Por outro lado, esse atributo indica exclusivamente uma janela, o que pode ser importante quando um aplicativo abre mais de uma janela. Sobre isso um pouco mais.


Nesse estágio, precisamos lembrar que procuraremos a janela desejada usando regex de acordo com a saída de wmctrl -lx . Mas isso não significa que devemos usar algo complicado. Normalmente, um nome de classe ou janela é suficiente.


Em princípio, a ideia básica já deve estar clara. Nas configurações globais de teclas de atalho / atalhos para o seu gerenciador de janelas, configuramos a combinação desejada para executar o script.


Como usar scripts


Primeiro, você precisa instalar os utilitários do console wmctrl e xdotool :


 $ sudo apt-get install wmctrl xdotool 

Em seguida, você precisa baixar os scripts e adicioná-los ao $ PATH . Eu costumo colocá-los em ~ / bin :


 $ cd ~/bin $ git clone https://github.com/masyamandev/Showwin-script.git $ ln -s ./Showwin-script/showwin showwin $ ln -s ./Showwin-script/showwinDetach showwinDetach 

Se não havia um diretório ~ / bin , ele deve ser criado e reinicializado (ou conectado), caso contrário, ~ / bin não entrará em $ PATH . Se tudo for feito corretamente, os scripts deverão estar acessíveis no console e a conclusão da guia funcionará.


O script principal do showwin usa 2 parâmetros: o primeiro é regex, pelo qual procuraremos a janela desejada, e o segundo parâmetro é o comando que deve ser executado se a janela desejada não for encontrada.


Você pode tentar executar um script, por exemplo:


 $ showwin "Mozilla Firefox$" firefox 

Se o Firefox estiver instalado, o foco deve ser dado à sua janela. Mesmo que o Firefox não estivesse em execução, ele deveria ter começado.


Se acabou, você pode tentar configurar a execução de comandos em uma combinação. Nas configurações globais de teclas de atalho / atalhos, adicione:


  • Alt + F: firefox do showwin "Mozilla Firefox $"
  • Alt + D: showwin "Mozilla Firefox (Navegação Privada) $" "firefox -private-window"
  • Alt + C: showwin "navegador de cromo. Navegador de cromo N *" navegador de cromo
  • Alt + X: showwin "navegador de cromo. Navegador de cromo I *" "navegador de cromo-incógnito"
  • Alt + S: showwin "skype.Skype" skypeforlinux
  • Alt + E: showwin "jetbrains-idea" idea.sh

E assim por diante: combinações de chaves e software que todos podem configurar conforme necessário.
Se tudo der certo, de acordo com as combinações acima, podemos alternar entre janelas com um simples toque de tecla.


Vou decepcionar os amantes do cromo: é incógnito distinguir uma janela comum da saída wmctrl , eles têm os mesmos nomes de classe e cabeçalhos de janela. No regex proposto, os caracteres N * e I * são necessários apenas para que esses regulares diferam entre si e possam ser atribuídas janelas diferentes como as principais.


Para redefinir a janela principal da combinação anterior (na verdade, para regex, que showwin foi chamado pela última vez), você precisa chamar o script showwinDetach . Eu tenho esse script atribuído à combinação de teclas Alt + Backspace .


O script showwin tem outro recurso. Quando é chamado com um parâmetro (nesse caso, o parâmetro é apenas um identificador), ele não verifica a regex e considera todas as janelas adequadas. Em si, isso parece inútil, no entanto, dessa maneira, podemos designar qualquer janela como a principal e mudar rapidamente para essa janela específica.


Eu configurei essas combinações:


  • Alt + 1: showwin "CustomKey1"
  • Alt + 2: showwin "CustomKey2"
  • ...
  • Alt + 0: showwin "CustomKey0"
  • Alt + Backspace: showwinDetach

Dessa forma, posso vincular qualquer janela às combinações Alt + 1 ... Alt + 0 . Pressionando Alt + 1 , vinculo a janela atual a essa combinação. É possível desassociar pressionando Alt + 1 e Alt + Backspace . Ou feche a janela, isso também funciona.


Além disso, vou contar alguns detalhes técnicos. Você não pode lê-los, mas apenas tente configurar e ver. Mas eu ainda recomendaria entender os scripts de outras pessoas antes de executá-los no seu computador :).


Como distinguir diferentes janelas de um aplicativo


Em princípio, o primeiro exemplo de "wmctrl -a skype.Skype -x" estava funcionando e pode ser usado. Mas vejamos novamente o exemplo do Firefox, no qual duas janelas estão abertas:


 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) 

A primeira janela é o modo normal e a segunda é a Navegação Privada. Gostaria de considerar essas janelas como aplicativos diferentes e alternar para elas usando diferentes combinações de teclas.


Você precisa complicar o script que alterna entre janelas. Eu usei esta solução: exiba uma lista de todas as janelas, faça grep por regex, pegue a primeira linha com a cabeça , obtenha a primeira coluna (esta será a identificação da janela) com corte , alterne para a janela por identificação.


Deve haver uma piada sobre expressões regulares e dois problemas, mas, na verdade, não uso nada complicado. Preciso de regulares para poder indicar o final da linha (o caractere "$") e distinguir entre "Mozilla Firefox $" e "Mozilla Firefox (Navegação Privada) $".


O comando é mais ou menos assim:


 $ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1` 

Aqui você já pode adivinhar o segundo recurso do script: se o grep não retornou nada, o aplicativo desejado não será aberto e você precisará iniciá-lo executando o comando a partir do segundo parâmetro. E verifique periodicamente se a janela direita foi aberta para dar foco. Não vou me concentrar nisso, aqueles que precisam olharão para a fonte.


Quando as janelas do aplicativo não são distinguíveis


Portanto, aprendemos a transferir o foco para a janela do aplicativo desejado. Mas e se mais de uma janela de um aplicativo estiver aberta? Em qual devo me concentrar? O script acima passará, provavelmente, para a primeira janela aberta. No entanto, gostaríamos de ter mais flexibilidade. Gostaria de lembrar de qual janela precisamos e mudar para essa janela.


A idéia era a seguinte: se queremos lembrar uma certa janela para uma combinação de teclas, precisamos pressionar essa combinação quando a janela desejada estiver em foco. No futuro, quando você clicar nessa combinação, o foco será dedicado a essa janela específica. Até a janela fechar ou fazer uma redefinição para essa combinação de scripts showwinDetach .


O algoritmo de script showwin é algo como isto:


  • Verifique se lembramos anteriormente do ID da janela para a qual o foco deve ser passado.
    Se você se lembra e essa janela ainda existe, transferimos o foco para ela e saímos.
  • Examinamos qual janela está atualmente em foco e, se ela se encaixa em nossa solicitação, lembraremos de seu ID para ir para ela no futuro e sair.
  • Passamos para pelo menos uma janela adequada, se ela existe, ou abrimos o aplicativo desejado.

Você pode descobrir qual janela está atualmente em foco usando o utilitário do console xdotool, convertendo sua saída para o formato hexadecimal:


 $ printf "0x%08x" `xdotool getwindowfocus` 

Lembrar de algo no bash é a maneira mais fácil de criar arquivos em um sistema de arquivos virtual na memória. No Ubuntu, isso é conectado por padrão em / dev / shm / . Não posso dizer nada sobre outras distribuições, espero que isso também exista. Você pode ver o comando:


 $ mount -l | grep tmpfs 

O script criará diretórios vazios nesta pasta, assim: / dev / shm / $ USER / showwin / $ SEARCH_REGEX / $ WINDOW_ID . Além disso, a cada chamada, ele criará o link simbólico / dev / shm / $ USER / showwin / showwin_last em / dev / shm / $ USER / showwin / $ SEARCH_REGEX . Isso será necessário para remover o ID da janela de uma combinação específica, se necessário, usando o script showwinDetach .


O que pode ser melhorado


Primeiro, os scripts devem ser configurados manualmente. Certamente, devido à necessidade de aprofundar e fazer muito com as mãos, muitos de vocês nem tentarão configurar o sistema. Se fosse possível colocar o pacote e configurar tudo mais facilmente, talvez isso ganhasse alguma popularidade. E aí, olhe para as distribuições padrão, elas cortariam o aplicativo.


E talvez mais fácil possa ser feito. Se o ID da janela permitir que você encontre o ID do processo que o criou e o ID do processo para descobrir qual equipe o criou, você poderá automatizar a configuração. De fato, não entendi se o que escrevi neste parágrafo é possível. O fato é que para mim, pessoalmente, combina com a forma como funciona agora. Mas se, para alguém que não seja eu, toda a abordagem parece conveniente e alguém a aprimora, ficarei feliz em usar a melhor solução.


Outro problema, como já escrevi, é que, em alguns casos, as janelas não podem ser distinguidas uma da outra. Até agora, eu só vi isso com o modo anônimo em cromo / cromo, mas talvez em algum outro lugar haja algo semelhante. Em casos extremos, sempre há uma variante das combinações universais Alt + 1 ... Alt + 0 . Novamente, eu uso o Firefox e, para mim, pessoalmente, esse problema não é significativo.


Mas um problema significativo para mim é que eu uso o Mac OS no trabalho e não consigo configurar nada disso lá. Parece ser capaz de fornecer o utilitário wmctrl , mas realmente não funciona no Mac OS. Algo pode ser feito com o aplicativo Automator , mas é tão lento que não é conveniente usá-lo mesmo quando funciona. Também não consegui configurar as combinações de teclas para que funcionassem em todos os programas. Se de repente alguém aparecer com uma solução, ficarei feliz em usá-la.


Em vez de uma conclusão


Revelou-se inesperadamente muitas palavras para uma funcionalidade aparentemente simples. Eu queria transmitir a idéia e não sobrecarregar o texto, mas ainda não descobri como explicar isso com mais facilidade. Talvez fosse melhor no formato de vídeo, mas eles não gostam disso.


Eu falei um pouco sobre o que está por trás do script e como configurá-lo. Eu não entrei nos detalhes do próprio script, mas são apenas 50 linhas, não é difícil de entender.


Espero que alguém tente essa idéia e talvez até a aprecie. Posso dizer por mim mesmo que o script foi escrito há cerca de 3 anos e é MUITO conveniente para mim. É tão conveniente que causa um grande desconforto ao trabalhar com computadores de outras pessoas. E com um macbook funcional.


Link de script

Source: https://habr.com/ru/post/pt483846/


All Articles