Có cách nào để mô phỏng sự kiện của Cận cảnh trên các cửa sổ khác nhau bằng thiết bị đầu cuối không?


15

Tôi đã trả lời trên Hỏi Ubuntu Thoát tất cả các trường hợp gnome-terminalthông qua một lệnh nhưng vì tất cả các bạn có thể đọc gnome-terminaldường như không có SIGcuộc gọi nào tôi có thể sử dụng để mô phỏng sự kiện "Đóng" này. Vì vậy, điều này dẫn tôi đến hỏi, có cách nào trong Gnome / KDE / LXDE / {đặt cửa sổ / trình quản lý máy tính để bàn / môi trường của bạn ở đây} để mô phỏng sự kiện "Nhấp vào nút đóng" không? Tôi đã đọc khác nhau câu hỏi rằng có thể có bất kỳ liên quan đến điều này, nhưng không trả lời này.

Những gì tôi đang tìm kiếm là một lệnh toàn cầu (nếu tồn tại) để thực hiện điều này trong các tình huống khác nhau. Nếu không tồn tại, vui lòng giải thích cách nút "Đóng" hoạt động.

Sử dụng khả thi:

Câu trả lời:


16

Tôi tin rằng trang người đàn ông liên quan là, XKillClient . Bạn có thể sử dụng xdotoolđể mô phỏng nút đóng được nhấp từ thiết bị đầu cuối như vậy.

Thí dụ

Giả sử tôi có một gnome-terminalmở và tên của nó là "saml @ grinchy: / home".

  1. Lấy ID cửa sổ

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. Gửi nó Alt+F4

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

Bạn có thể đặt chúng lại với nhau bằng cách nhúng lệnh đầu tiên vào lệnh thứ hai:

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

Bạn có thể tự cứu mình bằng cách cho phép xdotoollàm cả hai cùng một lúc:

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

Toàn cầu

Bạn có thể điều chỉnh những gì tôi đã cung cấp để chạy nó trên các cửa sổ có cùng tên:

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

Hoặc trên các cửa sổ bởi các thuộc tính khác. Bạn có thể sử dụng xwininfođể tìm hiểu thêm về một cửa sổ cụ thể. Chạy nó và sau đó chỉ cần nhấp vào cửa sổ quan tâm:

$ 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

Các công cụ hữu ích khác khi xử lý các cửa sổ X11 là xdpyinfo& xprop. xdpyinfocó thể được sử dụng để tìm hiểu thông tin về máy chủ X. Vì vậy, bạn có thể tìm ra cửa sổ nào có trọng tâm:

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

xpropxwininfocó thể thực hiện -idchuyển đổi để bạn có thể cung cấp cho họ ID cửa sổ mà bạn quan tâm thay vì phải nhấp vào nó:

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

Người giới thiệu


Tôi nghĩ rằng chúng ta có thể đơn giản hóa hơn nữa bằng cách sử dụng xdotool search --name "saml@grinchy:~" key alt+f4, vấn đề là tôi chưa tìm thấy cách thực hiện việc này với một số cửa sổ có cùng tên ...
Braiam

@Braiam - có gì độc đáo về họ không? Khi bạn gọi cửa sổ, bạn có thể cho Gnome biết bạn muốn tiêu đề là gì.
slm

@Braiam - ví dụ:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm

1
Tôi đang cố gắng sử dụng ví dụ được cung cấp ở đây để gửi key alt+F4cho tất cả các cửa sổ (nếu có thể thay đổi kích thước, tại sao không alt + F4), nhưng không gặp may. Và cảm ơn: D.
Braiam

1
Chuột được đánh giá quá cao: /. Và tôi đã giải quyết câu hỏi, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4sẽ tìm bất kỳ cửa sổ nào có gedit, terminal hoặc office trong tên tiêu đề của nó và gửi lệnh alt + F4.
Braiam

1

Tôi thấy xdotoollà không ổn định / lỗi, đôi khi nó đóng cửa sổ nền trước thay vì cửa sổ cần đóng. Điều này dường như là do cách các phím được gửi sau khi đưa cửa sổ lên nền trước thay vì gửi trực tiếp các sự kiện của cửa sổ và đó là một vấn đề rất khó chịu. Tôi đề nghị sử dụng wmctrl, trực tiếp đóng một cửa sổ mà không gửi tổ hợp phím.

Bạn có thể đóng một cửa sổ trực tiếp bằng cách khớp với tên, ví dụ cả hai sẽ đóng cửa sổ "Tài liệu không tên 1 - gedit":

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

Bạn có thể sử dụng -Ftùy chọn để chỉ xem xét các kết quả khớp chính xác:

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

Hoặc bạn có thể cung cấp id trực tiếp:

wmctrl -i -c "121634821"

Nhiều ví dụ sử dụng / tài liệu có thể được tìm thấy ở đây .

Một điều tôi thấy rất hữu ích là xdotoolkhả năng chờ đợi cho đến khi có kết quả bằng cách sử dụng --syncđối số. Kết hợp hai lệnh một trong một được thực hiện như thế này:

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

Nếu bạn đang dùng Mac, có lẽ bạn sẽ cần -I{}tham số:

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

Nếu bạn muốn hỗ trợ nhiều cửa sổ, bạn nên xargsyêu cầu gọi wmctrltối đa 1 đối số mỗi lần với -ntùy chọn. wmctrlkhông hỗ trợ rõ ràng nhiều cửa sổ dưới dạng đối số:

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

Điều này sẽ đợi cho đến khi có ít nhất 1 cửa sổ như vậy, và sau đó đóng tất cả chúng.


Tôi sẽ nhận được hộp thoại nhắc "bạn có chắc không"?
Braiam

@Braiam Có bạn sẽ, tôi chỉ thử nó. Chỉ khi một chương trình đang chạy trong thiết bị đầu cuối (ví dụ top), tất nhiên, giống như khi nhấp vào nút đóng.
jmiserez

Tôi đã chạy xdotool search --sync --name "Software Updater" | xargs wmctrl -i -ctrên Trusty và bắt đầu Trình cập nhật phần mềm. Từ giờ trở đi, Software Updater không hiển thị đúng. Chỉ cần thanh tiêu đề hiển thị. Cài đặt lại trình quản lý cập nhật không giúp được gì.
jarno

Vui lòng đăng xuất và quay lại phiên Xfce đã giúp.
jarno

Tôi không thể tìm thấy "gedit" với các tiện ích xdotool hoặc xprop. Nó chỉ đúng với "gedit", tôi có thể tìm các chương trình khác. Lệnh xdotool tìm kiếm --sync --name "gedit" không trả về kết quả. Có ai giúp được không? Ubuntu 17
Gonki

-1

pkill (1) nên là những gì bạn cần.


3
Không, nó sẽ không mô phỏng sự kiện "Đóng" trong bất kỳ thử nghiệm nào của tôi (mở một gedit, LibreOffice và thiết bị đầu cuối, viết một cái gì đó, gửi lệnh), nếu tôi sử dụng công --signaltắc không khác killhoặc killall. Tôi đang mong đợi bạn muốn tiết kiệm? cảnh giác.
Braiam

Bạn nói đúng, dường như tôi đã đọc sai câu hỏi của bạn.
schaiba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.