Czy istnieje sposób symulowania zdarzenia „Zamknij” w różnych oknach za pomocą terminala?


15

Odpowiedziałem na pytanie Ubuntu Wyjdź ze wszystkich wystąpień gnome-terminalza pomocą polecenia, ale ponieważ wszyscy potrafią czytać, gnome-terminalwydaje się, że nie ma SIGpołączenia, którego mógłbym użyć do symulacji tego zdarzenia „Zamknij”. Skłoniło mnie to do pytania: czy w GNOME / KDE / LXDE / {istnieje sposób na umieszczenie menedżera okien / pulpitu / środowiska} w celu symulacji zdarzenia „Kliknij przycisk Zamknij”? Mam czytać różne pytania , które mogłyby mieć jakikolwiek związek z tym, ale nie odpowiedzieć na to pytanie.

Szukam globalnego polecenia (jeśli istnieje), aby to zrobić w różnych scenariuszach. Jeśli nie istnieje, proszę wyjaśnić, jak działa przycisk „Zamknij”.

Możliwe zastosowania:

Odpowiedzi:


16

Uważam, że powiązaną stroną podręcznika jest XKillClient . Możesz użyć xdotooldo symulacji kliknięcia przycisku zamknięcia z podobnego terminala.

Przykład

Zakładając, że mam gnome-terminalotwarty, a jego nazwa to „saml @ grinchy: / home”.

  1. Uzyskaj identyfikator okna

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Wyślij to Alt+F4

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

Możesz je połączyć, osadzając pierwsze polecenie w drugim:

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

Możesz uratować siebie, pozwalając xdotoolrobić obie rzeczy jednocześnie:

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

Globalnie

Możesz dostosować to, co podałem, aby uruchamiać go w systemie Windows o tej samej nazwie:

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

Lub w systemie Windows według innych atrybutów. Możesz użyć, xwininfoaby dowiedzieć się więcej o danym oknie. Uruchom go, a następnie po prostu kliknij okno zainteresowania:

$ 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

Inne przydatne narzędzia do obsługi okien X11 to xdpyinfo& xprop. xdpyinfomożna użyć do uzyskania informacji o serwerze X. Aby dowiedzieć się, które okno jest aktywne:

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

xpropi xwininfomoże -idprzełączyć się, abyś mógł podać identyfikator okna, który Cię interesuje, zamiast go klikać:

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

Bibliografia


Myślę, że możemy uprościć jeszcze bardziej xdotool search --name "saml@grinchy:~" key alt+f4, problem polega na tym, że nie znalazłem sposobu na zrobienie tego z kilkoma oknami o tej samej nazwie ...
Braiam

@Braiam - czy jest w nich coś wyjątkowego? Kiedy wywołujesz okno, możesz powiedzieć GNOME, jakie mają być tytuły.
slm

@Braiam - na przykład:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm

1
Próbuję użyć podanego tutaj przykładu , aby wysłać key alt+F4do wszystkich okien (jeśli można zmienić rozmiar, dlaczego nie Alt + F4), ale bez powodzenia. I dzięki: D.
Braiam

1
Mysz jest przereklamowana: /. I rozwiązałem pytanie, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4poszuka każdego okna, które ma nazwę gedit, terminal lub biuro w nazwie tytułu i wyśle ​​polecenie alt + F4.
Braiam

1

Odkryłem, że xdotooljest niestabilny / buggy, czasem zamyka okno na pierwszym planie zamiast tego, które powinno być zamknięte. Wydaje się, że wynika to ze sposobu, w jaki klucze są wysyłane po przeniesieniu okna na pierwszy plan zamiast bezpośredniego wysyłania zdarzeń okna, i jest to bardzo denerwujący problem. Sugeruję użycie wmctrl, które bezpośrednio zamyka okno bez wysyłania naciśnięć klawiszy.

Możesz zamknąć okno bezpośrednio, dopasowując nazwę, np. Oba zamkną okno „Untitled Document 1 - gedit”:

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

Możesz użyć tej -Fopcji, aby rozważyć tylko dokładne dopasowania:

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

Lub możesz podać identyfikator bezpośrednio:

wmctrl -i -c "121634821"

Więcej przykładów użycia / dokumentacji można znaleźć tutaj .

Jedną z rzeczy, które uważam za bardzo przydatne, jest xdotoolmożliwość oczekiwania na wynik przy użyciu --syncargumentu. Łączenie dwóch w jednym poleceniu odbywa się w następujący sposób:

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

Jeśli korzystasz z komputera Mac, prawdopodobnie potrzebujesz -I{}parametru:

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

Jeśli chcesz obsługiwać wiele okien, powinieneś kazać xargswywołać wmctrlnajwyżej 1 argument za każdym razem z tą -nopcją. wmctrlnie obsługuje jawnie wielu okien jako argumentów:

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

Będzie to czekać, aż będzie co najmniej 1 takie okno, a następnie zamknie je wszystkie.


Czy pojawi się okno dialogowe „Jesteś pewien”?
Braiam

@Braiam Tak, właśnie to przetestowałem. topOczywiście tylko wtedy, gdy program działa w terminalu (np. ), Tak samo jak po kliknięciu przycisku zamykania.
jmiserez

Uruchomiłem xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cTrusty i uruchomiłem narzędzie do aktualizacji oprogramowania. Odtąd Software Updater nie wyświetla się poprawnie. Wyświetla się tylko pasek tytułu. Ponowna instalacja menedżera aktualizacji nie pomogła.
jarno

Pomogło mi płynne wylogowanie i ponowne zalogowanie do sesji Xfce.
jarno

Nie mogę znaleźć „gedit” za pomocą narzędzi xdotool lub xprop. Dotyczy to tylko „gedit”, mogę znaleźć inne programy. Polecenie xdotool search --sync --name "gedit" nie zwraca wyniku. Czy ktoś może pomóc? Ubuntu 17
Gonki

-1

pkill (1) powinien być tym, czego potrzebujesz.


3
Nie, nie będzie symulować zdarzenia „Zamknij” w żadnym z moich testów (otwórz gedit, LibreOffice i terminal, napisz coś, wyślij polecenie), jeśli użyję --signalprzełącznika nie różni się od killlub killall. Oczekuję, że chcesz zapisać? alarm.
Braiam

Masz rację, chyba źle odczytałem twoje pytanie.
schaiba
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.