Existe uma maneira de simular um evento "Fechar" em várias janelas usando o terminal?

15

Eu respondi no Ask Ubuntu Feche todas as instâncias do gnome-terminalcomando via comando, mas como todos vocês podem ler gnome-terminal, parece que não houve uma SIGchamada 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 de área de trabalho / ambiente aqui} para simular o evento "Clique no botão fechar"? Eu li perguntas diferentes que poderiam ter alguma relação com isso, mas não respondo a isso.

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

Utilizações possíveis:

Braiam
fonte

Respostas:

16

Acredito que a página de manual relacionada seja XKillClient . Você pode usar xdotoolpara simular o botão Fechar sendo clicado em um terminal como esse.

Exemplo

Supondo que eu tenho um gnome-terminalaberto e seu nome é "saml @ grinchy: / home".

  1. Obter 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 reuni-los incorporando o primeiro comando no segundo:

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

Você pode salvar a si mesmo deixando xdotoolas duas coisas ao mesmo tempo:

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

Globalmente

Você pode adaptar o que forneço 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 xwininfopara descobrir mais sobre uma janela específica. Execute-o e clique na janela de seu 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 janelas X11 são xdpyinfo& xprop. xdpyinfopode ser usado para descobrir informações sobre o servidor X. Assim, você pode descobrir qual janela tem foco:

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

xprope xwininfopode -idalternar para que você possa fornecer o ID da janela em que está interessado, em vez de precisar clicar nele:

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

Referências

slm
fonte
Eu acho que podemos simplificar ainda mais usando xdotool search --name "saml@grinchy:~" key alt+f4, problema é que eu não encontrei como fazer isso com várias janelas que têm o mesmo nome ...
Braiam
@Braiam - há algo único sobre eles? Quando você invoca a janela, pode dizer ao GNOME como deseja que os títulos sejam.
Slm
@Braiam - por exemplo:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm
1
Estou tentando usar o exemplo fornecido aqui para enviar o key alt+F4para todas as janelas (se o redimensionamento pode ser feito, por que não alt + F4), mas sem sorte. E obrigado: D.
Braiam
1
O mouse está superestimado: /. E resolvi a questão, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4procurarei por qualquer janela que tenha gedit, terminal ou escritório em seu nome de título e envie o comando alt + F4.
Braiam
1

Achei xdotoolesquisito / com bugs, às vezes fecha a janela do primeiro plano em vez da janela que deve ser fechada. Isso parece dever-se à maneira como as chaves são enviadas após trazer a janela para o primeiro plano, em vez de enviar diretamente os eventos da janela, e é um problema muito irritante. Eu sugiro usar wmctrl, que fecha diretamente uma janela sem enviar pressionamentos de tecla.

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 -Fopção para considerar apenas correspondências exatas:

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

Ou você pode fornecer o ID diretamente:

wmctrl -i -c "121634821"

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

Uma coisa que eu acho muito útil é xdotoola capacidade de esperar até que haja um resultado usando o --syncargumento. A combinação do comando dois em um é feita assim:

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

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

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

Se você deseja oferecer suporte a várias janelas, você deve pedir xargspara ligar wmctrlcom no máximo 1 argumento de cada vez com a -nopção wmctrlnão suporta explicitamente várias janelas como argumentos:

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

Isso aguardará até que exista pelo menos uma janela desse tipo e feche todas elas.

jmiserez
fonte
Vou receber a caixa de diálogo "Tem certeza"?
Braiam
@ Braiam Sim, você vai, eu apenas testei. Somente se um programa estiver sendo executado no terminal (por exemplo top), é claro, o mesmo que clicar no botão Fechar.
jmiserez
Corri xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cem Trusty, e começou Software Updater. A partir de agora, o Atualizador de Software não será exibido corretamente. Apenas a barra de título é exibida. Reinstalar o gerenciador de atualizações não ajudou.
Jarno
Logicamente, sair e voltar à sessão do Xfce ajudou.
Jarno
Não consigo encontrar o "gedit" com os utilitários xdotool ou xprop. É verdade apenas para "gedit", posso encontrar outros programas. O comando xdotool search --sync --name "gedit" não retorna resultado. Alguém pode ajudar? Ubuntu 17
Gonki
-1

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

Schaiba
fonte
3
Não, ele não simulará o evento "Fechar" em nenhum dos meus testes (abra um gedit, o LibreOffice e o terminal, escreva alguma coisa, envie o comando), se eu usar a --signalopção não é diferente de killou killall. Estou esperando o que você deseja salvar? alerta.
Braiam
Você está certo, parece que eu interpretei errado sua pergunta.
schaiba