Existe-t-il un moyen de simuler un événement «Fermer» sur différentes fenêtres à l'aide du terminal?

11

J'ai répondu à Ask Ubuntu Quittez toutes les instances de gnome-terminal via une commande , mais vous pouvez tous lire gnome-terminal ne semble pas avoir d'appels SIG que je pourrais utiliser pour simuler cet événement "Close". Cela m’amène donc à me demander s’il existe un moyen dans GNOME / KDE / LXDE / {de mettre votre fenêtre / votre gestionnaire de bureau / votre environnement ici} pour simuler l’événement "Cliquez sur le bouton de fermeture"? J'ai lu différent questions que pourrait avoir un lien avec cela, mais ne répondez pas.

Ce que je recherche, c'est une commande globale (si existante) pour le faire dans différents scénarios. S'il n'y en a pas, veuillez expliquer le fonctionnement du bouton "Fermer".

Utilisations possibles:

  • J'ouvre un ensemble d'applications pour une tâche déterminée et je veux toutes les fermer (lorsqu'elles ne sont plus utilisées) en un seul trait / commande sans supprimer aucun élément Vous souhaitez enregistrer votre travail? alertes.
  • Fermez toutes les instances de gnome-terminal mais avertissez-moi si un processus enfant est toujours en cours d'exécution.
  • Rien d'autre ne me vient à l'esprit en ce moment ...
posée Braiam 01.08.2013 - 17:25
la source

3 réponses

14

Je crois que la page de manuel associée est XKillClient . Vous pouvez utiliser xdotool pour simuler le bouton de fermeture sur lequel l'utilisateur clique depuis un terminal.

Exemple

En supposant que j'ai gnome-terminal ouvert et que son nom est "saml @ grinchy: / home".

  1. Obtenir l'identifiant de la fenêtre

    $ xdotool search --name "[email protected]:/home"
    96488188
    
  2. Envoyez-lui un Alt + F4

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

Vous pouvez les assembler en intégrant la première commande à la seconde:

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

Vous pouvez vous sauver en laissant xdotool faire les deux en même temps:

$ xdotool search --name "[email protected]:~" key alt+f4

À l'échelle mondiale

Vous pouvez adapter ce que j'ai fourni pour l'exécuter sur des fenêtres portant le même nom:

$ xdotool search --name "[email protected]:~"
96488779
96468996

Ou sous Windows par d’autres attributs. Vous pouvez utiliser xwininfo pour en savoir plus sur une fenêtre particulière. Exécutez-le et cliquez simplement sur la fenêtre qui vous intéresse:

$ xwininfo

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

xwininfo: Window id: 0x5c04d4b "[email protected]:~"

  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

Les autres outils utiles dans le traitement des fenêtres X11 sont xdpyinfo & xprop . xdpyinfo peut être utilisé pour trouver des informations sur le serveur X. Vous pouvez donc déterminer quelle fenêtre a le focus:

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

xprop et xwininfo peuvent utiliser un commutateur -id pour que vous puissiez leur fournir l'identifiant de fenêtre qui vous intéresse au lieu de devoir cliquer dessus:

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

Références

réponse donnée 01.08.2013 - 18:06
la source
1

J'ai trouvé que xdotool était flaky / buggy, parfois il ferme la fenêtre de premier plan au lieu de celle qui devrait être fermée. Cela semble être dû à la manière dont les clés sont envoyées après avoir placé la fenêtre au premier plan au lieu d’envoyer directement des événements de fenêtre, ce qui est très ennuyeux. Je suggère d'utiliser wmctrl , qui ferme directement une fenêtre sans envoyer de frappe au clavier.

Vous pouvez fermer une fenêtre directement en faisant correspondre le nom, par exemple. ces deux fermera la fenêtre "Untitled Document 1 - gedit":

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

Vous pouvez utiliser l'option -F pour ne prendre en compte que les correspondances exactes:

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

Ou vous pouvez donner l'identifiant directement:

wmctrl -i -c "121634821"

Vous pouvez trouver plus d'exemples d'utilisation / de documentation sur ici .

Une chose que je trouve très utile est la capacité de xdotool à attendre qu’un résultat soit obtenu en utilisant l’argument --sync . La combinaison de la commande deux en un se fait comme suit:

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

Si vous êtes sur un Mac, vous aurez probablement besoin du paramètre -I{} :

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

Si vous souhaitez prendre en charge plusieurs fenêtres, vous devez indiquer à xargs d'appeler wmctrl avec au plus 1 argument à chaque fois avec l'option -n . wmctrl ne supporte pas explicitement plusieurs fenêtres en tant qu'arguments:

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

Ceci attend qu'il y ait au moins une fenêtre de ce type, puis ferme toutes.

    
réponse donnée 03.12.2015 - 17:50
la source
-1

pkill (1) devrait être ce dont vous avez besoin.

    
réponse donnée 01.08.2013 - 17:28
la source

Lire d'autres questions sur les étiquettes