Existe uma maneira de simular um evento “Close” em várias janelas usando o terminal?

11

Eu respondi no Ask Ubuntu Saia de todas as instâncias de gnome-terminal através de um comando mas como todos vocês podem ler gnome-terminal não parece ter uma chamada SIG que eu poderia usar para simular esse evento "Fechar". Então, isso me levou a perguntar, existe uma maneira no GNOME / KDE / LXDE / {colocar sua janela / gerenciador / ambiente de desktop aqui} para simular o evento "Click in close button"? Eu tenho leia diferentes perguntas que poderia ter alguma relação com isso, mas não responda isso.

O que estou procurando é um comando global (se existir) para fazer isso em diferentes cenários. Se não existir, explique como funciona o botão "Fechar".

Usos possíveis:

  • Eu abro um conjunto de aplicações para uma tarefa determinada, e quero fechar todas elas (quando não são mais usadas) em um único traço / comando sem suprimir qualquer Você quer salvar seu trabalho? alertas.
  • Feche todas as instâncias de gnome-terminal , mas avise-me se ainda houver processo filho em execução.
  • Nada mais me vem à mente agora ...
por Braiam 01.08.2013 / 17:25

3 respostas

14

Acredito que a página man relacionada, XKillClient . Você pode usar xdotool para simular o botão fechar sendo clicado de um terminal como esse.

Exemplo

Supondo que eu tenha um gnome-terminal aberto e seu nome seja "saml @ grinchy: / home".

  1. Obtenha o ID da janela

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Envie um Alt + F4

    $ xdotool windowactivate --sync 96488188 key --clearmodifiers \
         --delay 100 alt+F4
    

Você pode juntá-los incorporando o primeiro comando no segundo:

$ xdotool windowactivate --sync $( ...1st command...) key --clearmodifiers \
         --delay 100 alt+F4

Você pode economizar permitindo que xdotool faça as duas coisas ao mesmo tempo:

$ xdotool search --name "saml@grinchy:~" key alt+f4

Globalmente

Você pode adaptar o que forneci para executá-lo em janelas com o mesmo nome:

$ xdotool search --name "saml@grinchy:~"
96488779
96468996

Ou no Windows por outros atributos. Você pode usar xwininfo para saber mais sobre uma determinada janela. Execute e depois clique na janela de interesse:

$ xwininfo

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x5c04d4b "saml@grinchy:~"

  Absolute upper-left X:  14
  Absolute upper-left Y:  74
  Relative upper-left X:  14
  Relative upper-left Y:  74
  Width: 941
  Height: 361
  Depth: 32
  Visual: 0x62
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x5c00003 (not installed)
  Bit Gravity State: NorthWestGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +14+74  -485+74  -485-465  +14-465
  -geometry 132x24+14+74

Outras ferramentas úteis ao lidar com as janelas do X11 são xdpyinfo & %código%. xprop pode ser usado para descobrir informações sobre o servidor X. Então você pode descobrir qual janela tem foco:

$ xdpyinfo |grep focus
focus:  window 0x5c00005, revert to Parent

xdpyinfo e xprop podem receber uma opção xwininfo para que você possa fornecer a ID da janela em que está interessado, em vez de precisar clicar nela:

$ xprop -id 0x5c00001|grep -i class
WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal"

Referências

por 01.08.2013 / 18:06
1

Eu achei que xdotool era esquisito / com bugs, às vezes ele fecha a janela de primeiro plano em vez daquela que deveria ser fechada. Isso parece ser devido ao modo como as chaves são enviadas depois de trazer a janela para o primeiro plano em vez de enviar diretamente os eventos da janela, e isso é um problema muito chato. Sugiro usar wmctrl , que fecha diretamente uma janela sem enviar pressionamentos de teclas.

Você pode fechar uma janela diretamente combinando com o nome, por exemplo ambos fecharão a janela "Untitled Document 1 - gedit":

wmctrl -c "gedit"
wmctrl -c "Untitled"

Você pode usar a opção -F para considerar apenas correspondências exatas:

wmctrl -F -c "Untitled Document 1 - gedit"

Ou você pode fornecer o código diretamente:

wmctrl -i -c "121634821"

Mais exemplos / documentação de uso podem ser encontrados aqui .

Uma coisa que eu acho muito útil é a capacidade de xdotool de esperar até que haja um resultado usando o argumento --sync . Combinando os dois em um comando é feito assim:

xdotool search --sync --name "gedit" | xargs wmctrl -i -c

Se você estiver usando um Mac, provavelmente precisará do parâmetro -I{} :

xdotool search --sync --name "gedit" | xargs -I{} wmctrl -i -c {}

Se você quiser oferecer suporte a várias janelas, deverá informar xargs para chamar wmctrl com, no máximo, 1 argumento a cada vez com a opção -n . wmctrl não suporta explicitamente várias janelas como argumentos:

xdotool search --sync --name "gedit" | xargs -I{} -n 1 wmctrl -i -c {}

Isso irá esperar até que haja pelo menos uma dessas janelas e, em seguida, fechar todas elas.

    
por 03.12.2015 / 17:50
-1

pkill (1) deve ser o que você precisa.

    
por 01.08.2013 / 17:28