Apakah ada cara untuk mensimulasikan acara "Tutup" di berbagai jendela menggunakan terminal?

15

Saya menjawab pada Tanya Ubuntu Keluar dari semua contoh gnome-terminalmelalui perintah tetapi karena Anda semua dapat membaca gnome-terminalsepertinya tidak memiliki SIGpanggilan yang dapat saya gunakan untuk mensimulasikan acara "Tutup" ini. Jadi ini membuat saya bertanya, apakah ada cara di GNOME / KDE / LXDE / {letakkan window / desktop manager / environment di sini} untuk mensimulasikan acara "Click in close button"? Saya telah membaca berbagai pertanyaan yang mungkin ada hubungannya dengan ini, tetapi jangan jawab ini.

Yang saya cari adalah perintah global (jika ada) untuk melakukan ini dalam skenario yang berbeda. Jika tidak ada, tolong jelaskan cara kerja tombol "Tutup".

Kemungkinan menggunakan:

Braiam
sumber

Jawaban:

16

Saya percaya halaman manual terkait adalah, XKillClient . Anda dapat menggunakan xdotooluntuk mensimulasikan tombol tutup yang diklik dari terminal seperti itu.

Contoh

Dengan asumsi saya memiliki gnome-terminalopen dan namanya "saml @ grinchy: / home".

  1. Dapatkan ID jendela

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Kirim a Alt+F4

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

Anda dapat menggabungkannya dengan menyematkan perintah pertama ke perintah kedua:

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

Anda dapat menyelamatkan diri dengan membiarkan xdotoolkeduanya dilakukan sekaligus:

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

Secara global

Anda dapat menyesuaikan apa yang saya sediakan untuk menjalankannya di windows yang memiliki nama yang sama:

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

Atau di windows dengan atribut lainnya. Anda dapat menggunakan xwininfountuk mengetahui lebih lanjut tentang jendela tertentu. Jalankan, lalu klik pada jendela yang diinginkan:

$ 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

Alat bermanfaat lainnya ketika berhadapan dengan X11 windows adalah xdpyinfo& xprop. xdpyinfodapat digunakan untuk mencari tahu informasi tentang server X. Jadi, Anda dapat mengetahui jendela mana yang memiliki fokus:

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

xpropdan xwininfodapat -idberalih sehingga Anda dapat memberikan mereka Window ID yang Anda minati daripada harus mengkliknya:

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

Referensi

slm
sumber
Saya pikir kita dapat lebih menyederhanakan menggunakan xdotool search --name "saml@grinchy:~" key alt+f4, masalahnya adalah bahwa saya belum menemukan cara melakukan ini dengan beberapa jendela yang memiliki nama yang sama ...
Braiam
@Braiam - adakah yang unik tentang mereka? Ketika Anda memohon jendela, Anda dapat memberi tahu GNOME apa yang Anda inginkan untuk judulnya.
slm
@Braiam - misalnya:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm
1
Saya mencoba menggunakan contoh yang disediakan di sini untuk mengirim key alt+F4ke semua jendela (jika mengubah ukuran dapat dilakukan, mengapa tidak alt + F4), tetapi tidak berhasil. Dan terima kasih: D.
Braiam
1
Mouse dinilai berlebihan: /. Dan saya memecahkan pertanyaan, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4akan mencari jendela yang memiliki gedit, terminal atau kantor di nama judulnya dan mengirim perintah alt + F4.
Braiam
1

Saya menemukan xdotoolmenjadi serpihan / kereta, kadang-kadang menutup jendela latar depan bukan yang harus ditutup. Ini sepertinya disebabkan oleh cara kunci dikirim setelah membawa jendela ke latar depan alih-alih langsung mengirim acara jendela, dan ini merupakan masalah yang sangat menjengkelkan. Saya sarankan menggunakan wmctrl, yang langsung menutup jendela tanpa mengirim penekanan tombol.

Anda dapat menutup jendela secara langsung dengan mencocokkan nama, misalnya keduanya akan menutup jendela "Dokumen Tanpa Judul 1 - gedit":

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

Anda dapat menggunakan -Fopsi ini hanya untuk mempertimbangkan kecocokan persis:

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

Atau Anda dapat memberikan id secara langsung:

wmctrl -i -c "121634821"

Lebih banyak contoh penggunaan / dokumentasi dapat ditemukan di sini .

Satu hal yang menurut saya sangat berguna adalah xdotoolkemampuan untuk menunggu sampai ada hasil menggunakan --syncargumen. Menggabungkan dua dalam satu perintah dilakukan seperti ini:

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

Jika Anda menggunakan Mac, Anda mungkin memerlukan -I{}parameter:

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

Jika Anda ingin mendukung beberapa jendela, Anda harus memberitahu xargsmenelepon wmctrldengan di paling 1 argumen setiap kali dengan -npilihan. wmctrltidak secara eksplisit mendukung banyak jendela sebagai argumen:

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

Ini akan menunggu sampai setidaknya ada 1 jendela seperti itu, dan kemudian menutup semuanya.

jmiserez
sumber
Apakah saya akan mendapatkan kotak dialog prompt "Apakah Anda yakin"?
Braiam
@Braiam Ya Anda akan, saya baru saja mengujinya. Hanya jika suatu program berjalan di terminal (misalnya top) tentu saja, sama seperti ketika mengklik tombol tutup.
jmiserez
Saya berlari xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cpada Trusty, dan mulai Pembaruan Perangkat Lunak. Mulai sekarang, Pembaruan Perangkat Lunak tidak ditampilkan dengan benar. Hanya menampilkan judul bar. Menginstal ulang pembaruan-manajer tidak membantu.
jarno
Dengan senang hati logout dan kembali ke sesi Xfce memang membantu.
jarno
Saya tidak dapat menemukan "gedit" dengan utilitas xdotool atau xprop. Itu hanya berlaku untuk "gedit", saya dapat menemukan program lain. Perintah pencarian xdotool --sync --name "gedit" tidak mengembalikan hasil. Adakah yang bisa membantu? Ubuntu 17
Gonki
-1

pkill (1) harus menjadi apa yang Anda butuhkan.

schaiba
sumber
3
Tidak, itu tidak akan mensimulasikan acara "Tutup" pada salah satu pengujian saya (buka gedit, LibreOffice dan terminal, tulis sesuatu, kirim perintah), jika saya menggunakan --signalsakelar tidak berbeda killatau killall. Saya mengharapkan Anda ingin menyimpan? waspada.
Braiam
Anda benar, sepertinya saya salah membaca pertanyaan Anda.
schaiba