Existe-t-il un moyen de simuler un événement «Fermer» sur différentes fenêtres en utilisant le terminal?

15

J'ai répondu sur Ask Ubuntu Quitter toutes les instances de gnome-terminalvia une commande, mais comme vous pouvez tous le lire, gnome-terminalil ne semble pas y avoir d' SIGappel que je pourrais utiliser pour simuler cet événement "Fermer". Cela m'amène donc à demander s'il existe un moyen dans GNOME / KDE / LXDE / {de mettre votre fenêtre / gestionnaire de bureau / environnement ici} pour simuler l'événement "Cliquez sur le bouton Fermer"? J'ai lu différentes questions qui pourraient avoir un rapport avec cela, mais n'y répondez pas.

Ce que je recherche, c'est une commande globale (si elle existe) pour le faire dans différents scénarios. S'il n'en existe pas, veuillez expliquer comment fonctionne le bouton "Fermer".

Utilisations possibles:

Braiam
la source

Réponses:

16

Je pense que la page de manuel associée est XKillClient . Vous pouvez utiliser xdotoolpour simuler le bouton de fermeture cliqué à partir d'un terminal comme ça.

Exemple

En supposant que j'ai un gnome-terminalopen et que son nom soit "saml @ grinchy: / home".

  1. Obtenez l'ID de la fenêtre

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

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

Vous pouvez les assembler en incorporant la première commande dans la seconde:

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

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

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

Globalement

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

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

Ou sur Windows par d'autres attributs. Vous pouvez utiliser xwininfopour 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 "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

Les autres outils utiles pour les fenêtres X11 sont xdpyinfo& xprop. xdpyinfopeut ê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

xpropet xwininfopouvez prendre un -idcommutateur afin que vous puissiez leur fournir l'ID de fenêtre qui vous intéresse au lieu d'avoir à cliquer dessus:

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

Les références

slm
la source
Je pense que nous pouvons simplifier encore plus l'utilisation xdotool search --name "saml@grinchy:~" key alt+f4, le problème est que je n'ai pas trouvé comment faire cela avec plusieurs fenêtres qui portent le même nom ...
Braiam
@Braiam - y a-t-il quelque chose d'unique à leur sujet? Lorsque vous appelez la fenêtre, vous pouvez dire à GNOME ce que vous voulez que les titres soient.
slm
@Braiam - par exemple:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm
1
J'essaie d'utiliser l' exemple fourni ici pour envoyer le key alt+F4à toutes les fenêtres (si le redimensionnement peut être fait, pourquoi pas alt + F4), mais sans chance. Et merci: D.
Braiam
1
La souris est surfaite: /. Et j'ai résolu la question, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4recherchera n'importe quelle fenêtre qui a gedit, terminal ou office dans son nom de titre et enverra la commande alt + F4.
Braiam
1

J'ai trouvé xdotoolfloconneux / buggé, parfois il ferme la fenêtre de premier plan au lieu de celle qui devrait être fermée. Cela semble être dû à la façon dont les clés sont envoyées après avoir mis la fenêtre au premier plan au lieu d'envoyer directement des événements de fenêtre, et c'est un problème très ennuyeux. Je suggère d'utiliser wmctrl, qui ferme directement une fenêtre sans envoyer de touches.

Vous pouvez fermer une fenêtre directement en faisant correspondre le nom, par exemple, les deux fermeront la fenêtre "Document sans titre 1 - gedit":

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

Vous pouvez utiliser l' -Foption pour ne considérer que les correspondances exactes:

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

Ou vous pouvez donner l'id directement:

wmctrl -i -c "121634821"

Plus d'exemples d'utilisation / documentation peuvent être trouvés ici .

Une chose que je trouve très utile est xdotoolla capacité d 'attendre jusqu'à ce qu'il y ait un résultat en utilisant l' --syncargument. La combinaison des deux commandes en un se fait comme ceci:

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

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

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

Si vous souhaitez prendre en charge plusieurs fenêtres, vous devez indiquer xargsd'appeler wmctrlavec au plus 1 argument à chaque fois avec l' -noption. wmctrlne prend pas explicitement en charge plusieurs fenêtres comme arguments:

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

Cela attendra jusqu'à ce qu'il y ait au moins une telle fenêtre, puis les ferme toutes.

jmiserez
la source
Vais-je recevoir la boîte de dialogue d'invite "Êtes-vous sûr"?
Braiam
@Braiam Oui, je viens de le tester. Uniquement si un programme s'exécute dans le terminal (par exemple top) bien sûr, comme lorsque vous cliquez sur le bouton Fermer.
jmiserez
J'ai couru xdotool search --sync --name "Software Updater" | xargs wmctrl -i -csur Trusty et lancé Software Updater. Désormais, Software Updater ne s'affiche pas correctement. Seule la barre de titre s'affiche. La réinstallation de update-manager n'a pas aidé.
jarno
Se déconnecter et se reconnecter avec plaisir à la session Xfce a aidé.
jarno
Je ne trouve pas "gedit" avec les utilitaires xdotool ou xprop. C'est seulement vrai pour "gedit", je peux trouver d'autres programmes. La commande xdotool search --sync --name "gedit" ne renvoie pas de résultat. Quelqu'un peut-il aider? Ubuntu 17
Gonki
-1

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

Schaiba
la source
3
Non, cela ne simulera pas l'événement "Fermer" sur aucun de mes tests (ouvrir un gedit, LibreOffice et le terminal, écrire quelque chose, envoyer la commande), si j'utilise le --signalcommutateur, ce n'est pas différent de killou killall. Je m'attends à ce que vous vouliez économiser? alerte.
Braiam
Vous avez raison, il semble que j'ai mal lu votre question.
schaiba