{"id":55206,"date":"2020-01-15T00:00:00","date_gmt":"2020-01-14T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/alternativnoe-upravlenie-oknami-v-linux"},"modified":"2020-02-18T14:03:18","modified_gmt":"2020-02-18T11:03:18","slug":"alternativnoe-upravlenie-oknami-v-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","title":{"rendered":"Gerenciamento alternativo de janelas no Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Eu sou do tipo que atribui a troca de layout ao Caps Lock, porque n\u00e3o tenho paci\u00eancia para pressionar duas teclas quando posso usar uma s\u00f3. Eu at\u00e9 gostaria de ter duas teclas desnecess\u00e1rias: uma eu usaria para ativar o layout em ingl\u00eas e a segunda para o russo. Mas a segunda tecla desnecess\u00e1ria \u00e9 a que chama o menu de contexto, que \u00e9 t\u00e3o desnecess\u00e1ria que muitas fabricantes de notebooks a removem. Ent\u00e3o tenho que me contentar com o que existe. <\/p>\n<p><\/p>\n<p>E tamb\u00e9m n\u00e3o quero ficar procurando os \u00edcones das janelas na barra de tarefas ao trocar de janelas, tentando reconhecer os nomes enquanto deslizo por <em>Alt+Tab<\/em>, passando pelos desktops e assim por diante. Eu quero pressionar uma combina\u00e7\u00e3o de teclas (idealmente uma s\u00f3, mas n\u00e3o h\u00e1 mais teclas desnecess\u00e1rias livres) e imediatamente acessar a janela que preciso. Por exemplo assim:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: Firefox<\/li>\n<li>Alt+D: Firefox (Navega\u00e7\u00e3o Privada)<\/li>\n<li>Alt+T: Terminal<\/li>\n<li>Alt+M: Calculadora<\/li>\n<li>Alt+E: IntelliJ Idea<\/li>\n<li>e assim por diante.<\/li>\n<\/ul>\n<p><\/p>\n<p>Al\u00e9m disso, ao pressionar, por exemplo, <em>Alt+M<\/em> eu quero ver a calculadora, independentemente de a programa\u00e7\u00e3o estar aberta ou n\u00e3o. Se estiver aberta, a janela deve receber o foco; se n\u00e3o, a programa\u00e7\u00e3o precisa ser iniciada e o foco deve ser transferido assim que ela carregar.<\/p>\n<p><\/p>\n<p>Para casos que n\u00e3o s\u00e3o cobertos pelo cen\u00e1rio anterior, eu quero ter combina\u00e7\u00f5es de teclas universais, \u00e0s quais posso facilmente atribuir qualquer uma das janelas abertas. Por exemplo, tenho 10 combina\u00e7\u00f5es atribu\u00eddas a <em>Alt+1<\/em> at\u00e9 <em>Alt+0<\/em>, que n\u00e3o est\u00e3o ligadas a nenhum programa. Eu posso simplesmente pressionar <em>Alt+1<\/em> e a janela que est\u00e1 atualmente em foco receber\u00e1 o foco ao pressionar <em>Alt+1<\/em>.<\/p>\n<p><\/p>\n<p>Abaixo, uma descri\u00e7\u00e3o de mais algumas funcionalidades e uma resposta sobre como isso pode ser feito. Mas j\u00e1 vou avisar que essa personaliza\u00e7\u00e3o \u2018para si mesmo\u2019 pode causar uma forte depend\u00eancia e at\u00e9 um processo de abstin\u00eancia quando for necess\u00e1rio usar Windows, Mac OS ou at\u00e9 mesmo um computador com Linux de outra pessoa.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Na verdade, se pensarmos bem, usamos poucas programa\u00e7\u00f5es no dia a dia. Navegador, terminal, IDE, algum mensageiro, gerenciador de arquivos, calculadora e, talvez, isso seja praticamente tudo. N\u00e3o \u00e9 necess\u00e1rio ter tantas combina\u00e7\u00f5es de teclas para cobrir 95% das tarefas di\u00e1rias.<\/p>\n<p><\/p>\n<p>Para programas que t\u00eam v\u00e1rias janelas abertas, uma delas pode ser designada como principal. Por exemplo, se v\u00e1rias janelas do IntelliJ Idea est\u00e3o abertas, atribu\u00eddas a <em>Alt+E<\/em>. Em condi\u00e7\u00f5es normais, ao pressionar <em>Alt+E<\/em> alguma janela deste programa ser\u00e1 aberta, provavelmente a que foi aberta primeiro. No entanto, se pressionar <em>Alt+E<\/em> Quando uma das janelas deste programa j\u00e1 estiver em foco, essa janela ser\u00e1 designada como principal e receber\u00e1 o foco em combina\u00e7\u00f5es de teclas subsequentes. <\/p>\n<p><\/p>\n<p>A janela principal pode ser redesignada. Para isso, a combina\u00e7\u00e3o deve primeiro ser redefinida e, em seguida, outra janela pode ser definida como a principal. Para redefinir a combina\u00e7\u00e3o, \u00e9 preciso pressionar a pr\u00f3pria combina\u00e7\u00e3o e depois uma combina\u00e7\u00e3o especial de redefini\u00e7\u00e3o, que eu a configurei como <em>Alt+Backspace<\/em>. Isso acionar\u00e1 um script que cancelar\u00e1 a atribui\u00e7\u00e3o da janela principal para a combina\u00e7\u00e3o anterior. Depois, pode-se designar uma nova janela principal, conforme descrito no par\u00e1grafo anterior. A redefini\u00e7\u00e3o de uma janela vinculada para combina\u00e7\u00f5es universais acontece da mesma forma.<\/p>\n<p><\/p>\n<p>A introdu\u00e7\u00e3o ficou longa, mas queria primeiro explicar o que faremos e depois como fazer.<\/p>\n<p><\/p>\n<h2 id=\"dlya-teh-komu-nadoelo-chitat\">Para aqueles que est\u00e3o cansados de ler<\/h2>\n<p><\/p>\n<p>Resumindo, o link para os scripts estar\u00e1 no final do artigo.<\/p>\n<p><\/p>\n<p>Mas ainda assim, n\u00e3o ser\u00e1 poss\u00edvel instalar e usar imediatamente. Ser\u00e1 preciso entender primeiro como o script encontra a janela correta. Sem isso, n\u00e3o ser\u00e1 poss\u00edvel indicar ao script para onde exatamente o foco deve ser enviado. E \u00e9 necess\u00e1rio entender o que fazer se, de repente, a janela adequada n\u00e3o for encontrada.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, n\u00e3o vou me concentrar em como configurar a execu\u00e7\u00e3o de scripts ao pressionar combina\u00e7\u00f5es de teclas. Por exemplo, no KDE, isso est\u00e1 em Configura\u00e7\u00f5es do Sistema \u2192 Atalhos \u2192 Atalhos Personalizados. Em outros gerenciadores de janelas, isso tamb\u00e9m deve existir.<\/p>\n<p><\/p>\n<h2 id=\"znakomstvo-s-wmctrl\">Introdu\u00e7\u00e3o ao wmctrl<\/h2>\n<p><\/p>\n<p><em>Wmctrl<\/em> \u00e9 uma ferramenta de linha de comando para interagir com o X Window Manager. Este \u00e9 um programa chave para o script. Vamos dar uma olhada r\u00e1pida em como us\u00e1-lo.<\/p>\n<p><\/p>\n<p>Para come\u00e7ar, vamos exibir a lista de janelas abertas:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -lx\n0x01e0000e -1 plasmashell.plasmashell             N\/A Desktop \u2014 Plasma\n0x01e0001e -1 plasmashell.plasmashell             N\/A Plasma\n0x03a00001  0 skype.Skype                         N\/A Skype\n0x04400003  0 Navigator.Firefox                   N\/A Google Tradutor - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Melhores publica\u00e7\u00f5es do dia \/ Habr - Mozilla Firefox (Navega\u00e7\u00e3o Privada)\n...<\/code><\/pre>\n<p><\/p>\n<p>Op\u00e7\u00e3o <em>--selector<\/em> exibe uma lista de todas as janelas abertas, e <em>-x<\/em> adiciona ao output o nome da classe (<em>skype.Skype<\/em>, <em>Navigator.Firefox<\/em> etc). Precisamos aqui do id da janela (coluna 1), nome da classe (coluna 3) e t\u00edtulo da janela (a \u00faltima coluna).<\/p>\n<p><\/p>\n<p>Voc\u00ea pode tentar ativar uma janela usando a op\u00e7\u00e3o <em>-a<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -a skype.Skype -x<\/code><\/pre>\n<p><\/p>\n<p>Se tudo ocorreu conforme o planejado, a janela do Skype deve aparecer na tela. Se em vez da op\u00e7\u00e3o <em>-x<\/em> usar a op\u00e7\u00e3o <em>-i<\/em>, ent\u00e3o em vez do nome da classe, podemos especificar o id da janela. O problema com o id \u00e9 que ele muda a cada vez que o aplicativo \u00e9 iniciado e n\u00e3o podemos sab\u00ea-lo de antem\u00e3o. Por outro lado, esse atributo identifica claramente a janela, o que pode ser importante quando o aplicativo abre mais de uma janela. Sobre isso mais adiante.<\/p>\n<p><\/p>\n<p>Neste est\u00e1gio, precisamos lembrar que iremos procurar a janela necess\u00e1ria usando regex a partir da sa\u00edda <em>wmctrl -lx<\/em>. Mas isso n\u00e3o significa que precisamos usar algo complicado. Geralmente, o nome da classe ou o t\u00edtulo da janela \u00e9 suficiente. <\/p>\n<p><\/p>\n<p>Basicamente, a ideia principal j\u00e1 deve estar clara. Nas configura\u00e7\u00f5es de hotkeys\/atalhos globais para seu gerenciador de janelas, configuramos a combina\u00e7\u00e3o desejada para executar o script.<\/p>\n<p><\/p>\n<h2 id=\"kak-polzovatsya-skriptami\">Como usar scripts<\/h2>\n<p><\/p>\n<p>Primeiro, precisamos instalar as utilidades de linha de comando <em>wmctrl<\/em> e <em>xdotool<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get install wmctrl xdotool<\/code><\/pre>\n<p><\/p>\n<p>Em seguida, precisamos baixar os scripts e adicion\u00e1-los ao <em>$PATH<\/em>. Eu geralmente os coloco em <em>~\/bin<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd ~\/bin\n$ git clone https:\/\/github.com\/masyamandev\/Showwin-script.git\n$ ln -s .\/Showwin-script\/showwin showwin\n$ ln -s .\/Showwin-script\/showwinDetach showwinDetach<\/code><\/pre>\n<p><\/p>\n<p>Se o diret\u00f3rio <em>~\/bin<\/em> n\u00e3o existia, precisamos cri\u00e1-lo e reiniciar (ou fazer logoff), caso contr\u00e1rio, <em>~\/bin<\/em> n\u00e3o ser\u00e1 adicionado ao <em>$PATH<\/em>. Se tudo estiver feito corretamente, os scripts devem estar dispon\u00edveis no console e a conclus\u00e3o autom\u00e1tica deve funcionar ao pressionar Tab.<\/p>\n<p><\/p>\n<p>O script principal <strong>showwin<\/strong> recebe 2 par\u00e2metros: o primeiro \u00e9 o regex, pelo qual procuraremos a janela desejada, e o segundo par\u00e2metro \u00e9 o comando a ser executado se a janela desejada n\u00e3o for encontrada. <\/p>\n<p><\/p>\n<p>Podemos tentar executar o script, por exemplo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ showwin \"Mozilla Firefox$\" firefox<\/code><\/pre>\n<p><\/p>\n<p>Se o Firefox estiver instalado, ele deve receber o foco. Mesmo que o Firefox n\u00e3o tenha sido iniciado, ele deve ter sido iniciado.<\/p>\n<p><\/p>\n<p>Se funcionar, podemos tentar configurar a execu\u00e7\u00e3o de comandos em combina\u00e7\u00f5es. Nas configura\u00e7\u00f5es de hotkeys\/atalhos globais, adicionamos:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: showwin \u00abMozilla Firefox$\u00bb firefox<\/li>\n<li>Alt+D: showwin \u00abMozilla Firefox (Navega\u00e7\u00e3o Privada)$\u00bb \u00abfirefox -private-window\u00bb<\/li>\n<li>Alt+C: showwin \u00abchromium-browser.Navegador Chromium N*\u00bb chromium-browser<\/li>\n<li>Alt+X: showwin \u00abchromium-browser.Navegador Chromium I*\u00bb \u00abchromium-browser -incognito\u00bb<\/li>\n<li>Alt+S: showwin \u00abskype.Skype\u00bb skypeforlinux<\/li>\n<li>Alt+E: showwin \u00abjetbrains-idea\u00bb idea.sh<\/li>\n<\/ul>\n<p><\/p>\n<p>E assim por diante. Cada um pode configurar as combina\u00e7\u00f5es de teclas e softwares da maneira que preferir.<br \/>\nSe tudo estiver correto, com as combina\u00e7\u00f5es mencionadas acima, poderemos alternar entre janelas com um simples pressionar de teclas.<\/p>\n<p><\/p>\n<p>Desculpe, amantes do Chrome: uma janela normal n\u00e3o pode ser diferenciada da janela an\u00f4nima a partir da sa\u00edda. <em>wmctrl<\/em> n\u00e3o \u00e9 poss\u00edvel, pois eles t\u00eam nomes de classes e t\u00edtulos de janelas iguais. Nos regex sugeridos, os caracteres N* e I* s\u00e3o necess\u00e1rios apenas para que esses regex sejam distintos entre si e para que possamos designar janelas principais diferentes.<\/p>\n<p><\/p>\n<p>Para redefinir a janela principal da combina\u00e7\u00e3o anterior (na verdade, para o regex que <strong>showwin<\/strong> foi chamado pela \u00faltima vez), \u00e9 necess\u00e1rio chamar o script <strong>showwinDetach<\/strong>. Este script est\u00e1 atribu\u00eddo \u00e0 combina\u00e7\u00e3o de teclas <em>Alt+Backspace<\/em>. <\/p>\n<p><\/p>\n<p>O script <strong>showwin<\/strong> tem mais uma fun\u00e7\u00e3o. Quando chamado com um \u00fanico par\u00e2metro (neste caso, o par\u00e2metro \u00e9 simplesmente um identificador), ele n\u00e3o verifica o regex e considera todas as janelas adequadas. Isso pode parecer in\u00fatil, mas dessa forma podemos designar qualquer janela como principal e alternar rapidamente para ela.<\/p>\n<p><\/p>\n<p>Eu configurei as seguintes combina\u00e7\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+1: showwin \u00abCustomKey1\u00bb<\/li>\n<li>Alt+2: showwin \u00abCustomKey2\u00bb<\/li>\n<li>\u2026<\/li>\n<li>Alt+0: showwin \u00abCustomKey0\u00bb<\/li>\n<li>Alt+Backspace: showwinDetach<\/li>\n<\/ul>\n<p><\/p>\n<p>Dessa forma, posso vincular qualquer janela \u00e0s combina\u00e7\u00f5es <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Basta pressionar <em>Alt+1<\/em> para vincular a janela atual a essa combina\u00e7\u00e3o. Posso desfazer a vincula\u00e7\u00e3o pressionando <em>Alt+1<\/em>, e ent\u00e3o <em>Alt+Backspace<\/em>. Ou fechar a janela, isso tamb\u00e9m funciona.<\/p>\n<p><\/p>\n<p>A seguir, vou falar um pouco sobre detalhes t\u00e9cnicos. Voc\u00ea pode n\u00e3o ler isso e simplesmente tentar configurar e ver como funciona. Mas eu ainda recomendaria entender os scripts de outras pessoas antes de execut\u00e1-los em seu computador :).<\/p>\n<p><\/p>\n<h2 id=\"kak-razlichat-raznye-okna-odnogo-prilozheniya\">Como diferenciar janelas diferentes de um aplicativo<\/h2>\n<p><\/p>\n<p>Basicamente, o primeiro exemplo \u00abwmctrl -a skype.Skype -x\u00bb funcionou e pode ser usado. Mas vamos dar mais uma olhada no exemplo com o Firefox, onde duas janelas est\u00e3o abertas:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">0x04400003  0 Navigator.Firefox                   N\/A Google Tradutor - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A As melhores publica\u00e7\u00f5es do dia \/ Habr - Mozilla Firefox (Navega\u00e7\u00e3o Privada)<\/code><\/pre>\n<p><\/p>\n<p>A primeira janela \u00e9 o modo normal, e a segunda \u00e9 a Navega\u00e7\u00e3o Privada. Gostar\u00edamos de considerar essas janelas como aplicativos diferentes e alternar entre elas usando diferentes combina\u00e7\u00f5es de teclas. <\/p>\n<p><\/p>\n<p>Precisamos complicar o script que alterna as janelas. Eu usei a seguinte solu\u00e7\u00e3o: listar todas as janelas, fazer <em>grep<\/em> por regex, pegar a primeira linha usando <em>head<\/em>, extrair a primeira coluna (isso ser\u00e1 o id da janela) usando <em>cut<\/em>, alternar para a janela pelo id.<\/p>\n<p><\/p>\n<p>Aqui deveria ter uma piada sobre express\u00f5es regulares e dois problemas, mas na verdade n\u00e3o estou usando nada complicado. Preciso de regex para poder indicar o final da linha (s\u00edmbolo \u00ab$\u00bb) e diferenciar \u00abMozilla Firefox$\u00bb de \u00abMozilla Firefox (Navega\u00e7\u00e3o Privada)$\u00bb.<\/p>\n<p><\/p>\n<p>A equipe se parece aproximadamente com isso:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -i -a `wmctrl -lx | grep -i \"Mozilla Firefox$\" | head -1 | cut -d\" \" -f1`<\/code><\/pre>\n<p><\/p>\n<p>Aqui j\u00e1 podemos deduzir a segunda caracter\u00edstica do script: se o grep n\u00e3o retornar nada, significa que o aplicativo desejado n\u00e3o est\u00e1 aberto e precisa ser iniciado com o comando do segundo par\u00e2metro. E depois, verificar periodicamente se a janela necess\u00e1ria foi aberta, para dar foco a ela. N\u00e3o vou me detiver muito nisso, quem precisar, pode consultar os c\u00f3digos-fonte.<\/p>\n<p><\/p>\n<h2 id=\"kogda-okna-prilozheniya-ne-razlichimy\">Quando as janelas do aplicativo n\u00e3o s\u00e3o distingu\u00edveis<\/h2>\n<p><\/p>\n<p>Ent\u00e3o, aprendemos a dar foco \u00e0 janela do aplicativo desejado. Mas e se houver mais de uma janela do aplicativo aberta? A qual delas devemos dar foco? O script acima provavelmente dar\u00e1 foco \u00e0 primeira janela aberta. No entanto, gostar\u00edamos de mais flexibilidade. Seria bom poder lembrar exatamente qual janela precisamos e alternar para essa janela.<\/p>\n<p><\/p>\n<p>A ideia era a seguinte: se quisermos lembrar uma janela espec\u00edfica para uma combina\u00e7\u00e3o de teclas, devemos pressionar essa combina\u00e7\u00e3o quando a janela desejada estiver em foco. Assim, nas press\u00f5es futuras dessa combina\u00e7\u00e3o, o foco ser\u00e1 dado a essa janela. Enquanto a janela n\u00e3o for fechada ou n\u00e3o fizermos um reset para essa combina\u00e7\u00e3o do script. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<p>O algoritmo do script <strong>showwin<\/strong> \u00e9 aproximadamente assim:<\/p>\n<p><\/p>\n<ul>\n<li>Verificar se j\u00e1 lembramos anteriormente do id da janela \u00e0 qual devemos dar foco.<br \/>\nSe lembramos e essa janela ainda existir, ent\u00e3o damos foco a ela e sa\u00edmos. <\/li>\n<li>Verificamos qual janela est\u00e1 atualmente em foco e, se ela se encaixar em nossa solicita\u00e7\u00e3o, lembramos seu id para poder voltar a ela mais tarde e sa\u00edmos.<\/li>\n<li>Passamos para alguma janela adequada, se existir, ou abrimos o aplicativo desejado.<\/li>\n<\/ul>\n<p><\/p>\n<p>Para saber qual janela est\u00e1 agora em foco, podemos usar a ferramenta de console xdotool, convertendo sua sa\u00edda para o formato hexadecimal:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ printf \"0xx\" `xdotool getwindowfocus`<\/code><\/pre>\n<p><\/p>\n<p>\u00c9 mais f\u00e1cil lembrar de algo no bash criando arquivos em um sistema de arquivos virtual que reside na mem\u00f3ria. No Ubuntu, isso est\u00e1 conectado por padr\u00e3o em <em>\/dev\/shm\/<\/em>. Sobre outras distribui\u00e7\u00f5es, n\u00e3o posso dizer nada, espero que algo semelhante tamb\u00e9m exista. Podemos verificar com o comando:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ mount -l | grep tmpfs<\/code><\/pre>\n<p><\/p>\n<p>O script criar\u00e1 diret\u00f3rios vazios nesta pasta, assim: <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX\/$WINDOW_ID<\/em>. Al\u00e9m disso, a cada chamada ele criar\u00e1 um symlink <em>\/dev\/shm\/$USER\/showwin\/showwin_last<\/em> para <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX<\/em>. Isso ser\u00e1 necess\u00e1rio para que, se necess\u00e1rio, possamos remover o id da janela para uma determinada combina\u00e7\u00e3o com o uso do script. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<h2 id=\"chto-mozhno-uluchshit\">O que pode ser melhorado<\/h2>\n<p><\/p>\n<p>Primeiramente, os scripts precisam ser configurados manualmente. Certamente, devido \u00e0 necessidade de entender e fazer muitas coisas manualmente, muitos de voc\u00eas podem nem tentar configurar o sistema. Se houvesse a possibilidade de simplesmente instalar um pacote e configurar tudo de forma mais simples, isso provavelmente ganharia alguma popularidade. E quem sabe, acabaria sendo inclu\u00eddo nos distribui\u00e7\u00f5es padr\u00e3o.<\/p>\n<p><\/p>\n<p>E, talvez, seja mais f\u00e1cil fazer isso. Se a partir do ID da janela \u00e9 poss\u00edvel descobrir o ID do processo que a criou, e a partir do ID do processo saber qual comando o gerou, poderia ser poss\u00edvel automatizar a configura\u00e7\u00e3o. Na verdade, eu n\u00e3o investiguei se o que escrevi neste par\u00e1grafo \u00e9 vi\u00e1vel. O fato \u00e9 que, pessoalmente, estou satisfeito com a forma como funciona atualmente. Mas se algu\u00e9m al\u00e9m de mim achar o m\u00e9todo conveniente e encontrar uma maneira de melhor\u00e1-lo, eu ficaria feliz em usar a melhor solu\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Outro problema, como j\u00e1 mencionei, \u00e9 que em alguns casos as janelas n\u00e3o podem ser distinguidas uma da outra. At\u00e9 agora, s\u00f3 observei isso com o modo inc\u00f3gnito no Chrome\/Chromium, mas, possivelmente, h\u00e1 outros casos semelhantes. No pior cen\u00e1rio, sempre existem combina\u00e7\u00f5es universais. <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Novamente, utilizo o Firefox e, pessoalmente, este problema n\u00e3o \u00e9 significativo para mim.<\/p>\n<p><\/p>\n<p>Mas um problema significativo para mim \u00e9 que, no trabalho, utilizo Mac OS e n\u00e3o consegui configurar nada semelhante. A utilidade <em>wmctrl<\/em> parece que consegui instalar, mas ela n\u00e3o funciona bem no Mac OS. Algo pode ser feito com o aplicativo <em>Automator<\/em>, mas ele trava tanto que \u00e9 inconveniente at\u00e9 mesmo quando est\u00e1 funcionando. Tamb\u00e9m n\u00e3o consegui configurar combina\u00e7\u00f5es de teclas para que funcionassem em todos os programas. Se por acaso algu\u00e9m encontrar uma solu\u00e7\u00e3o \u2014 ficaria feliz em utiliz\u00e1-la.<\/p>\n<p><\/p>\n<h2 id=\"vmesto-zaklyucheniya\">Em conclus\u00e3o<\/h2>\n<p><\/p>\n<p>Surpreendentemente, consegui escrever muitas palavras sobre uma funcionalidade que, \u00e0 primeira vista, parecia simples. Queria transmitir a ideia sem sobrecarregar o texto, mas ainda n\u00e3o pensei em como contar de forma mais simples. Talvez em formato de v\u00eddeo fosse melhor, mas aqui isso n\u00e3o \u00e9 bem aceito.<\/p>\n<p><\/p>\n<p>Falei um pouco sobre o que est\u00e1 por tr\u00e1s do script e como configur\u00e1-lo. N\u00e3o entrei em detalhes sobre o script em si, mas ele tem apenas 50 linhas, portanto n\u00e3o \u00e9 dif\u00edcil de entender. <\/p>\n<p><\/p>\n<p>Espero que algu\u00e9m experimente essa ideia e, talvez, at\u00e9 a avalie. Posso dizer que o script foi escrito h\u00e1 cerca de 3 anos e \u00e9 MUITO conveniente para mim. T\u00e3o conveniente que causa um s\u00e9rio desconforto ao trabalhar em computadores de outras pessoas. E com meu MacBook de trabalho. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/masyamandev\/Showwin-script\">Link para os scripts<\/a><\/noindex><\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483846\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443. \u042f \u0431\u044b \u0434\u0430\u0436\u0435 \u0445\u043e\u0442\u0435\u043b 2 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: \u043e\u0434\u043d\u0443 \u0431\u044b \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438, \u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u0439. \u041d\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55206","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-14T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Controle alternativo de janelas no Linux | ProHoster","description":"Sou uma dessas pessoas que configura o Caps Lock para alternar o layout, porque \u00e9 pregui\u00e7a de pressionar 2 teclas quando se pode pressionar uma.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster","og:description":"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-14T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55206","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:48:29","updated":"2022-09-30 14:18:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=55206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55206\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=55206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=55206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=55206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}