Gibt es eine Möglichkeit, ein "Schließen" -Ereignis in verschiedenen Fenstern mit dem Terminal zu simulieren?

14

Ich habe auf "Ubuntu fragen" geantwortet. Beenden Sie alle Instanzen gnome-terminalüber einen Befehl, aber da Sie alle lesen können, gnome-terminalschien es keinen SIGAnruf zu geben, mit dem ich dieses "Schließen" -Ereignis simulieren könnte. Dies veranlasste mich zu fragen, ob es in GNOME / KDE / LXDE / {Ihr Fenster / Desktop-Manager / die Umgebung hier ablegen} eine Möglichkeit gibt, das Ereignis "Klick beim Schließen" zu simulieren. Ich habe verschiedene Fragen gelesen , die in irgendeiner Beziehung dazu stehen könnten, aber beantworte diese nicht.

Ich suche nach einem globalen Befehl (falls vorhanden), um dies in verschiedenen Szenarien durchzuführen. Falls keine vorhanden ist, erläutern Sie bitte, wie der "Schließen" -Button funktioniert.

Mögliche Anwendungen:

Braiam
quelle

Antworten:

16

Ich glaube, die zugehörige Manpage ist XKillClient . Mit können Sie xdotoolsimulieren, wie die Schaltfläche zum Schließen von einem Terminal aus angeklickt wird.

Beispiel

Angenommen, ich habe eine gnome-terminaloffene und der Name lautet "saml @ grinchy: / home".

  1. Holen Sie sich die Fenster-ID

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Senden Sie es ein Alt+F4

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

Sie können sie zusammenfügen, indem Sie den ersten Befehl in den zweiten einbetten:

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

Sie können sich sparen, indem xdotoolSie beide gleichzeitig ausführen:

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

Global

Sie können die von mir bereitgestellten Funktionen anpassen, um sie unter Windows mit demselben Namen auszuführen:

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

Oder auf Windows durch andere Attribute. Mit können Sie xwininfomehr über ein bestimmtes Fenster erfahren. Führen Sie es aus und klicken Sie dann einfach auf das gewünschte Fenster:

$ 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

Weitere nützliche Tools für den Umgang mit X11-Fenstern sind xdpyinfo& xprop. xdpyinfokann verwendet werden, um Informationen über den X-Server herauszufinden. So können Sie herausfinden, welches Fenster den Fokus hat:

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

xpropund xwininfokann einen -idSchalter nehmen , so dass Sie ihnen die Fenster-ID geben können, die Sie interessiert, anstatt darauf klicken zu müssen:

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

Verweise

slm
quelle
Ich denke, wir können die Verwendung noch weiter vereinfachen xdotool search --name "saml@grinchy:~" key alt+f4. Das Problem ist, dass ich nicht herausgefunden habe, wie dies mit mehreren Fenstern mit demselben Namen
geschehen kann
@Braiam - gibt es etwas Einzigartiges an ihnen? Wenn Sie das Fenster aufrufen, können Sie GNOME mitteilen, wie die Titel lauten sollen.
SLM
@Braiam - zum Beispiel:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm
1
Ich versuche, das hier bereitgestellte Beispiel zu verwenden, um das key alt+F4an alle Fenster zu senden (wenn die Größe geändert werden kann, warum nicht Alt + F4), aber ohne Glück. Und danke: D.
Braiam
1
Maus ist überbewertet: /. Und ich habe die Frage gelöst, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4suche nach einem Fenster, dessen Titelname gedit, terminal oder office enthält, und sende den Befehl alt + F4.
Braiam
1

Ich habe festgestellt xdotool, dass es schuppig / fehlerhaft ist. Manchmal schließt es das Vordergrundfenster anstelle des Fensters, das geschlossen werden sollte. Dies scheint auf die Art und Weise zurückzuführen zu sein, wie Schlüssel gesendet werden, nachdem das Fenster in den Vordergrund gebracht wurde, anstatt Fensterereignisse direkt zu senden. Dies ist ein sehr ärgerliches Problem. Ich schlage vor, zu verwenden wmctrl, was ein Fenster direkt schließt, ohne Tastatureingaben zu senden.

Sie können ein Fenster direkt schließen, indem Sie mit dem Namen übereinstimmen, z. B. schließen beide das Fenster "Unbenanntes Dokument 1 - gedit":

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

Sie können die -FOption verwenden, um nur exakte Übereinstimmungen zu berücksichtigen:

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

Oder Sie geben die ID direkt an:

wmctrl -i -c "121634821"

Weitere Anwendungsbeispiele / Dokumentationen finden Sie hier .

Eine Sache, die ich sehr nützlich finde, ist xdotooldie Fähigkeit zu warten, bis mit dem --syncArgument ein Ergebnis erzielt wird. Das Kombinieren der beiden in einem Befehl geschieht folgendermaßen:

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

Wenn Sie einen Mac verwenden, benötigen Sie wahrscheinlich den folgenden -I{}Parameter:

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

Wenn Sie mehrere Fenster unterstützen möchten, sollten Sie bei jedem xargsAufruf wmctrlmit der -nOption höchstens 1 Argument angeben. wmctrlunterstützt nicht explizit mehrere Fenster als Argumente:

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

Dies wird warten, bis es mindestens 1 solches Fenster gibt, und dann alle von ihnen schließen.

jmiserez
quelle
Bekomme ich das Dialogfeld "Sind Sie sicher"?
Braiam
@Braiam Ja, das wirst du, ich habe es gerade getestet. Nur wenn ein Programm im Terminal läuft (zB top) natürlich genauso wie beim Klicken auf den Schließen-Button.
Jmiserez
Ich bin xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cauf Trusty gelaufen und habe Software Updater gestartet. Von nun an wird der Software Updater nicht mehr richtig angezeigt. Nur die Titelleiste wird angezeigt. Neuinstallation von Update-Manager hat nicht geholfen.
jarno
Es hat geholfen, sich aus der Xfce-Sitzung aus- und wieder einzuloggen.
jarno
Ich kann "gedit" mit den Dienstprogrammen xdotool oder xprop nicht finden. Es ist nur wahr für "gedit", ich kann andere Programme finden. Der Befehl xdotool search --sync --name "gedit" gibt kein Ergebnis zurück. Kann jemand helfen? Ubuntu 17
Gonki
-1

pkill (1) sollte das sein, was Sie brauchen.

schaiba
quelle
3
Nein, es wird das "Close" -Ereignis bei keinem meiner Tests simuliert (gedit, LibreOffice und das Terminal öffnen, etwas schreiben, den Befehl senden), wenn ich den --signalSchalter nicht anders als killoder benutze killall. Ich erwarte das Du sparen willst? warnen.
Braiam
Du hast recht, ich habe deine Frage falsch verstanden.
Schaiba