Terminali kullanarak çeşitli pencerelerde “Kapat” olayını simüle etmenin bir yolu var mı?


15

Ask Ubuntu'ya cevap verdim Komutun tüm örneklerinden çıkın,gnome-terminal ancak hepinizin okuyabileceği gnome-terminalgibi SIGbu "Kapat" olayını simüle etmek için kullanabileceğim bir çağrı yoktu . Bu beni sormaya yöneltti, GNOME / KDE / LXDE / {pencerenizi / masaüstü yöneticinizi / ortamınızı buraya koyun} etkinliğini simüle etmenin bir yolu var mı? Ben var okumak farklı sorular bu herhangi bir ilgisi olabilir, ama bu cevap verme.

Aradığım şey , farklı senaryolarda bunu yapmak için küresel bir komut (varsa). Eğer yoksa, lütfen "Kapat" düğmesinin nasıl çalıştığını açıklayın.

Olası kullanımlar:

Yanıtlar:


16

İlgili man sayfasının XKillClient olduğuna inanıyorum . Bunun xdotoolgibi bir terminalden tıklatılan kapatma düğmesini simüle etmek için kullanabilirsiniz .

Misal

Bir gnome-terminalaçık var ve adı "saml @ grinchy: / home" olduğunu varsayarsak.

  1. Pencere kimliğini alın

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Bir Alt+ gönderF4

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

İlk komutu ikinciye yerleştirerek bunları bir araya getirebilirsiniz:

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

Her xdotoolikisini aynı anda yapmasına izin vererek kendinizi kurtarabilirsiniz :

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

Küresel

Aynı ada sahip pencerelerde çalıştırmak için sağladıklarımı uyarlayabilirsiniz:

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

Veya diğer özelliklerle pencerelerde. xwininfoBelirli bir pencere hakkında daha fazla bilgi edinmek için kullanabilirsiniz . Çalıştırın ve sadece ilgili pencereye tıklayın:

$ 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

X11 pencereleri ile uğraşırken diğer yararlı araçlar xdpyinfo& xprop. xdpyinfoX sunucusu hakkında bilgi bulmak için kullanılabilir. Böylece hangi pencerenin odaklandığını anlayabilirsiniz:

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

xpropve xwininfobir -idanahtar alabilir, böylece tıklamak yerine ilgilendiğiniz Pencere Kimliğini sağlayabilirsiniz:

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

Referanslar


Sanırım daha da basitleştirebiliriz xdotool search --name "saml@grinchy:~" key alt+f4, sorun şu ki aynı adı taşıyan birkaç pencere ile bunu nasıl bulamadım ...
Braiam

@Braiam - onlar hakkında benzersiz bir şey var mı? Pencereyi çağırdığınızda GNOME'a başlıkların ne olmasını istediğinizi söyleyebilirsiniz.
slm

@Braiam - örneğin:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm

1
Tüm pencereleri göndermek için burada verilen örneği kullanmaya çalışıyorum key alt+F4(yeniden boyutlandırma yapılabilir, neden alt + F4 olmasın), ama şanssız. Ve teşekkürler: D.
Braiam

1
Fare abartılıyor:. Soruyu xdotool search --name "gedit|terminal|office" key --window %@ alt+F4çözdüm, başlık adında gedit, terminal veya ofis olan herhangi bir pencere arayacağım ve alt + F4 komutunu göndereceğim.
Braiam

1

xdotoolKesintili / arabası buldum , bazen kapatılması gereken bir ön plan penceresini kapatır. Bunun nedeni, doğrudan pencere olayları göndermek yerine pencereyi ön plana getirdikten sonra tuşların gönderilme şeklinden kaynaklanıyor ve bu çok can sıkıcı bir konudur. wmctrlTuş vuruşlarını göndermeden bir pencereyi doğrudan kapatan kullanmanızı öneririm .

Bir pencereyi doğrudan adla eşleştirerek kapatabilirsiniz, örneğin her ikisi de "Adsız Belge 1 - gedit" penceresini kapatır:

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

Bu -Fseçeneği yalnızca tam eşleşmeleri dikkate almak için kullanabilirsiniz :

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

Veya doğrudan kimliği verebilirsiniz:

wmctrl -i -c "121634821"

Daha fazla kullanım örneği / dokümanını burada bulabilirsiniz .

Çok faydalı bulduğum bir şey xdotool, --syncargümanı kullanarak bir sonuç elde edilene kadar beklemektir . İkisini bir komutta birleştirmek şöyle yapılır:

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

Mac kullanıyorsanız, muhtemelen şu -I{}parametreye ihtiyacınız vardır :

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

Birden fazla pencereyi desteklemek istiyorsanız , seçenekle her seferinde en fazla 1 argümanla xargsçağrı yapmalısınız . bağımsız değişken olarak birden çok pencereyi açıkça desteklemez:wmctrl-nwmctrl

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

Bu, en az 1 pencere açılana kadar bekler ve sonra hepsini kapatır.


"Emin misiniz" bilgi istemi iletişim kutusunu alacak mıyım?
Braiam

@ Braiam Evet, sadece test ettim. Sadece bir program terminalde (örneğin top) çalışıyorsa, tabii ki kapat düğmesine tıklamakla aynı.
jmiserez

xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cTrusty'de koştum ve Yazılım Güncelleyicisini başlattım. Şu andan itibaren, Yazılım Güncelleyici düzgün görüntülenmiyor. Yalnızca başlık çubuğu görüntülenir. Güncelleme yöneticisini yeniden yüklemek yardımcı olmadı.
jarno

Memnuniyetle çıkış yapmak ve Xfce oturumuna geri dönmek yardımcı oldu.
jarno

Ben xdotool veya xprop yardımcı programları ile "gedit" bulamıyorum. Bu sadece "gedit" için geçerli, başka programlar bulabilirim. Xdotool search --sync --name "gedit" komutu sonucu döndürmez. Biri yardım edebilir mi? Ubuntu 17
Gonki

-1

pkill (1) ihtiyacınız olan şey olmalı.


3
Hayır, sınamamın herhangi birinde "Kapat" olayını simüle etmez (bir gedit, LibreOffice ve terminali açın, bir şeyler yazın, komutu gönderin), eğer --signalanahtarı kullanırsam farklı değil killveya killall. Kurtarmak istiyor musun? uyarmak.
Braiam

Haklısın, sorunuzu yanlış okudum.
schaiba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.