C'è un modo per simulare un evento "Chiudi" su varie finestre usando il terminale?


15

Ho risposto su Chiedi a Ubuntu Esci da tutte le istanze di gnome-terminaltramite un comando, ma come tutti puoi leggere gnome-terminalnon sembra avere una SIGchiamata che potrei usare per simulare questo evento "Chiudi". Quindi questo mi porta a chiedere: c'è un modo in GNOME / KDE / LXDE / {metti qui la tua finestra / desktop manager / ambiente} per simulare l'evento "Fai clic sul pulsante Chiudi"? Ho letto diverse domande che potrebbero avere qualche relazione con questo, ma non rispondo.

Quello che sto cercando è un comando globale (se esiste) per farlo in diversi scenari. Se non esiste, spiega come funziona il pulsante "Chiudi".

Usi possibili:

Risposte:


16

Credo che la relativa pagina man sia, XKillClient . È possibile utilizzare xdotoolper simulare il pulsante di chiusura su cui si fa clic da un terminale in questo modo.

Esempio

Supponendo che io abbia un gnome-terminalopen e il suo nome è "saml @ grinchy: / home".

  1. Ottieni l'ID della finestra

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

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

Puoi metterli insieme incorporando il primo comando nel secondo:

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

Puoi salvarti lasciando xdotoolentrambi allo stesso tempo:

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

A livello globale

Puoi adattare ciò che ti ho fornito per eseguirlo su Windows con lo stesso nome:

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

O su Windows con altri attributi. Puoi usare xwininfoper saperne di più su una finestra particolare. Eseguilo e fai clic sulla finestra di 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

Altri strumenti utili quando si ha a che fare con le finestre X11 sono xdpyinfo& xprop. xdpyinfopuò essere usato per trovare informazioni sul server X. Quindi puoi capire quale finestra ha il focus:

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

xprope xwininfopuoi fare un -idpassaggio in modo da poter fornire loro l'ID finestra che ti interessa invece di dover fare clic su di esso:

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

Riferimenti


Penso che possiamo semplificare ancora di più usando xdotool search --name "saml@grinchy:~" key alt+f4, il problema è che non ho trovato il modo di farlo con diverse finestre che hanno lo stesso nome ...
Braiam

@Braiam - c'è qualcosa di unico in loro? Quando invochi la finestra puoi dire a GNOME come vuoi che siano i titoli.
slm

@Braiam - ad esempio:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm

1
Sto provando a usare l' esempio fornito qui per inviare key alt+F4a tutte le finestre (se il ridimensionamento può essere fatto, perché non alt + F4), ma senza fortuna. E grazie: D.
Braiam

1
Il mouse è sopravvalutato: /. E ho risolto la domanda, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4cercherò qualsiasi finestra che abbia gedit, terminale o ufficio nel nome del titolo e invii il comando alt + F4.
Braiam,

1

Ho scoperto xdotooldi essere traballante / buggy, a volte chiude la finestra in primo piano invece di quella che dovrebbe essere chiusa. Ciò sembra essere dovuto al modo in cui le chiavi vengono inviate dopo aver portato la finestra in primo piano anziché inviare direttamente gli eventi della finestra, ed è un problema molto fastidioso. Suggerisco di usare wmctrl, che chiude direttamente una finestra senza inviare i tasti.

Puoi chiudere direttamente una finestra facendo corrispondere il nome, ad esempio entrambi chiuderanno la finestra "Untitled Document 1 - gedit":

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

Puoi utilizzare l' -Fopzione per considerare solo le corrispondenze esatte:

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

Oppure puoi dare l'id direttamente:

wmctrl -i -c "121634821"

Altri esempi di utilizzo / documentazione sono disponibili qui .

Una cosa che trovo molto utile è xdotoolla capacità di aspettare fino a quando non ci sarà un risultato usando l' --syncargomento. La combinazione dei due in un comando viene eseguita in questo modo:

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

Se sei su un Mac, probabilmente avrai bisogno del -I{}parametro:

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

Se vuoi supportare più finestre, dovresti dire xargsdi chiamare wmctrlal massimo 1 argomento ogni volta con l' -nopzione. wmctrlnon supporta esplicitamente più finestre come argomenti:

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

Questo attenderà fino a quando non vi sarà almeno 1 di tali finestre, quindi le chiuderà tutte.


Verrà visualizzata la finestra di dialogo del prompt "Sei sicuro"?
Braiam,

@Braiam Sì, l'ho appena provato. Solo se un programma è in esecuzione nel terminale (ad es. top) Ovviamente, come quando si fa clic sul pulsante Chiudi.
jmiserez,

Ho corso xdotool search --sync --name "Software Updater" | xargs wmctrl -i -csu Trusty e ho avviato Software Updater. D'ora in poi, Software Updater non verrà visualizzato correttamente. Viene visualizzata solo la barra del titolo. La reinstallazione di update-manager non ha aiutato.
jarno,

Disconnettersi volentieri e rientrare alla sessione di Xfce ha aiutato.
jarno,

Non riesco a trovare "gedit" con le utility xdotool o xprop. È vero solo per "gedit", posso trovare altri programmi. Il comando xdotool search --sync --name "gedit" non restituisce risultati. Qualcuno può aiutare? Ubuntu 17
Gonki

-1

pkill (1) dovrebbe essere quello che ti serve.


3
No, non simulerà l'evento "Close" su nessuno dei miei test (apro un gedit, LibreOffice e il terminale, scrivo qualcosa, invio il comando), se uso l' --signalinterruttore non è diverso da killo killall. Mi aspetto che tu voglia salvare? mettere in guardia.
Braiam

Hai ragione, sembra che abbia letto male la tua domanda.
schaiba,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.