มีวิธีการจำลองเหตุการณ์“ ปิด” บนหน้าต่างต่าง ๆ โดยใช้เทอร์มินัลหรือไม่?


15

ฉันตอบไปที่ถาม Ubuntu ออกจากอินสแตนซ์ทั้งหมดของgnome-terminalผ่านทางคำสั่งแต่ในขณะที่คุณทุกคนสามารถอ่านgnome-terminalดูเหมือนจะไม่ได้มีการSIGโทรฉันสามารถใช้เพื่อจำลองเหตุการณ์ "ปิด" นี้ ดังนั้นสิ่งนี้ทำให้ฉันถามว่ามีวิธีใดใน GNOME / KDE / LXDE / {ให้หน้าต่าง / ผู้จัดการเดสก์ท็อป / สภาพแวดล้อมของคุณที่นี่} เพื่อจำลองเหตุการณ์ "คลิกที่ปุ่มปิด" หรือไม่? ฉันได้อ่าน คำถามต่าง ๆ ที่อาจเกี่ยวข้องกับเรื่องนี้ แต่ไม่ตอบคำถามนี้

สิ่งที่ฉันกำลังมองหาคือคำสั่งทั่วโลก (ถ้ามี) เพื่อทำสิ่งนี้ในสถานการณ์ที่แตกต่างกัน หากไม่มีอยู่โปรดอธิบายว่าปุ่ม "ปิด" ทำงานอย่างไร

การใช้ประโยชน์:

คำตอบ:


16

ผมเชื่อว่าหน้าคนที่เกี่ยวข้องคือXKillClient คุณสามารถใช้xdotoolเพื่อจำลองปุ่มปิดที่ถูกคลิกจากเทอร์มินัลเช่นนั้น

ตัวอย่าง

สมมติว่าฉันมีการgnome-terminalเปิดและชื่อของมันคือ "saml @ grinchy: / home"

  1. รับ ID หน้าต่าง

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. ส่งAlt+F4

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

คุณสามารถรวมมันเข้าด้วยกันโดยการฝังคำสั่งแรกลงในสอง:

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

คุณสามารถช่วยตัวเองด้วยการปล่อยให้xdotoolทำทั้งสองอย่างพร้อมกัน:

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

ทั่วโลก

คุณสามารถปรับสิ่งที่ฉันให้เพื่อเรียกใช้บน windows ที่มีชื่อเดียวกัน:

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

หรือบน windows โดยคุณสมบัติอื่น ๆ คุณสามารถใช้xwininfoเพื่อค้นหาข้อมูลเพิ่มเติมเกี่ยวกับหน้าต่างเฉพาะ เรียกใช้แล้วคลิกที่หน้าต่างที่น่าสนใจ:

$ 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 เป็น&xdpyinfo สามารถใช้เพื่อค้นหาข้อมูลเกี่ยวกับเซิร์ฟเวอร์ X ดังนั้นคุณสามารถคิดได้ว่าหน้าต่างไหนมีโฟกัส:xpropxdpyinfo

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

xpropและxwininfoสามารถใช้-idสวิตช์เพื่อให้คุณสามารถระบุ Window ID ที่คุณสนใจแทนที่จะต้องคลิกที่:

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

อ้างอิง


ผมคิดว่าเราสามารถลดความซับซ้อนมากยิ่งขึ้นโดยใช้xdotool search --name "saml@grinchy:~" key alt+f4ปัญหาก็คือว่าฉันไม่ได้พบวิธีการที่จะทำเช่นนี้กับหลายหน้าต่างที่มีชื่อเดียวกัน ...
Braiam

@Braiam - มีอะไรพิเศษเกี่ยวกับพวกเขาบ้างไหม? เมื่อคุณเปิดหน้าต่างคุณสามารถบอก GNOME ได้ว่าต้องการให้ชื่อเรื่องอะไร
slm

@Braiam - ตัวอย่างเช่น:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm

1
ฉันกำลังพยายามใช้ตัวอย่างที่มีให้ที่นี่เพื่อส่งkey alt+F4ไปยังหน้าต่างทั้งหมด (หากสามารถปรับขนาดได้ทำไมไม่ alt + F4) แต่ไม่มีโชค และขอบคุณ: D
Braiam

1
เมาส์ overrated: / และฉันจะแก้ไขคำถามนี้xdotool search --name "gedit|terminal|office" key --window %@ alt+F4จะมองหาหน้าต่างใด ๆ ที่มี gedit, terminal หรือ office ในชื่อของมันและส่งคำสั่ง alt + F4
Braiam

1

ฉันพบว่าxdotoolมีข้อผิดพลาด / บั๊กกี้บางครั้งก็ปิดหน้าต่างด้านหน้าเบื้องหน้าแทนที่จะเป็นหน้าต่างที่ควรปิด นี่น่าจะเป็นเพราะวิธีการส่งกุญแจหลังจากนำหน้าต่างไปที่เบื้องหน้าแทนที่จะส่งเหตุการณ์หน้าต่างโดยตรงและมันเป็นปัญหาที่น่ารำคาญมาก ฉันแนะนำให้ใช้wmctrlซึ่งปิดหน้าต่างโดยตรงโดยไม่ต้องส่งการกดแป้น

คุณสามารถปิดหน้าต่างได้โดยตรงโดยการจับคู่กับชื่อเช่นทั้งสองนี้จะปิดหน้าต่าง "ไม่มีเอกสารชื่อ 1 - gedit":

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

คุณสามารถใช้-Fตัวเลือกเพื่อพิจารณาการแข่งขันที่แน่นอนเท่านั้น:

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

หรือคุณสามารถให้รหัสโดยตรง:

wmctrl -i -c "121634821"

ตัวอย่างการใช้งานเพิ่มเติม / เอกสารสามารถพบได้ที่นี่

สิ่งหนึ่งที่ฉันคิดว่ามีประโยชน์มากคือxdotoolความสามารถในการรอจนกว่าจะมีผลลัพธ์โดยใช้การ--syncโต้แย้ง การรวมสองคำสั่งเข้าด้วยกันนั้นทำได้ดังนี้:

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

หากคุณใช้ Mac คุณอาจต้องใช้-I{}พารามิเตอร์:

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

หากคุณต้องการรองรับหลายหน้าต่างคุณควรบอกxargsให้โทรwmctrlด้วยอย่างน้อยที่สุด 1 อาร์กิวเมนต์ทุกครั้งที่มี-nตัวเลือก wmctrlไม่สนับสนุนหลายหน้าต่างอย่างชัดเจนว่าเป็นอาร์กิวเมนต์:

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

การดำเนินการนี้จะรอจนกว่าจะมีหน้าต่างอย่างน้อย 1 หน้าต่างจากนั้นปิดหน้าต่างทั้งหมด


ฉันจะได้รับกล่องโต้ตอบข้อความแจ้ง "คุณแน่ใจหรือไม่?
Braiam

@Braiam ใช่คุณจะฉันเพิ่งทดสอบ เฉพาะเมื่อโปรแกรมทำงานในเทอร์มินัล (เช่นtop) แน่นอนเช่นเดียวกับเมื่อคลิกปุ่มปิด
jmiserez

ฉันวิ่งxdotool search --sync --name "Software Updater" | xargs wmctrl -i -cบน Trusty และเริ่ม Software Updater นับจากนี้เป็นต้นไป Software Updater แสดงไม่ถูกต้อง เพียงแค่แถบชื่อแสดง การติดตั้ง update-manager ใหม่ไม่ได้ช่วย
jarno

การออกจากระบบและกลับเข้าสู่เซสชัน Xfce ก็ช่วยได้
jarno

ฉันไม่พบ "gedit" ด้วยยูทิลิตี้ xdotool หรือ xprop มันเป็นเรื่องจริงสำหรับ "gedit" ฉันสามารถหาโปรแกรมอื่นได้ คำสั่ง xdotool ค้นหา --sync - ชื่อ "gedit" ไม่ส่งคืนผลลัพธ์ ใครช่วยได้บ้าง Ubuntu 17
Gonki

-1

pkill (1) ควรเป็นสิ่งที่คุณต้องการ


3
ไม่มีก็จะไม่จำลอง "Close" เหตุการณ์ใด ๆ ของการทดสอบของฉัน (เปิด Gedit, LibreOffice และบางสิ่งบางอย่าง terminal, เขียน, ส่งคำสั่ง) ถ้าผมใช้--signalสวิทช์ไม่ได้แตกต่างกันของหรือkill killallฉันคาดหวังว่าคุณต้องการที่จะบันทึก? เตือนภัย
Braiam

คุณพูดถูกฉันดูเหมือนจะผิดคำถามของคุณ
schaiba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.