Чи є спосіб імітувати подію "Закрити" на різних вікнах за допомогою терміналу?


15

Я відповів на Ask Ubuntu Закрийте всі випадки gnome-terminalкоманди, але, як ви всі можете прочитати gnome-terminal, схоже, не було SIGдзвінка, який я міг би використати для імітації цієї події "Закрити". Тож це спонукає мене запитати, чи є спосіб у GNOME / KDE / LXDE / {поставити сюди вікно / менеджер робочого столу / середовище}, щоб імітувати подію "Натисніть кнопку закрити"? Я читав різні запитання, які можуть мати якесь відношення до цього, але не відповідають на це.

Я шукаю глобальну команду (якщо вона існує) робити це в різних сценаріях. Якщо такої немає, поясніть, як працює кнопка «Закрити».

Можливе використання:

Відповіді:


16

Я вважаю, що пов’язана сторінка "Man" - це XKillClient . Ви можете використовувати xdotoolдля імітації натискання кнопки закриття з терміналу.

Приклад

Якщо припустити, що у мене gnome-terminalвідкритий, а його назва "saml @ grinchy: / home".

  1. Отримайте ідентифікатор вікна

    $ 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

В усьому світі

Ви можете адаптувати те, що я надав, щоб запустити його у вікнах із однойменною назвою:

$ 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& xprop. xdpyinfoможна використовувати для отримання інформації про X-сервер. Таким чином, ви можете зрозуміти, яке вікно має фокус:

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

xpropі xwininfoможете взяти -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.
Брайам

1
Миша завищена: /. І я вирішив питання, xdotool search --name "gedit|terminal|office" key --window %@ alt+F4буду шукати будь-яке вікно, яке має gedit, термінал або офіс у своєму назві, і надішле команду alt + F4.
Брайам

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 Так, я просто перевірив. Тільки якщо програма працює в терміналі (наприклад top), звичайно, так само, як при натисканні кнопки закриття.
jmiserez

Я побіг xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cна Trusty і запустив оновлення програмного забезпечення. Відтепер оновлення програмного забезпечення не відображається належним чином. Тільки відображається рядок заголовка. Перевстановлення менеджера оновлень не допомогло.
jarno

Приємно вийти з системи та повернутися до сесії Xfce.
jarno

Я не можу знайти "gedit" ні з утилітами xdotool, ні з xprop. Це стосується лише "gedit", я можу знайти інші програми. Команда xdotool search --sync --name "gedit" не повертає результат. Хтось може допомогти? Ubuntu 17
Gonki

-1

pkill (1) має бути тим, що вам потрібно.


3
Ні, він не буде імітувати подію "Закрити" на будь-якому моєму тесті (відкрити gedit, LibreOffice та термінал, щось написати, надіслати команду), якщо я використовую --signalперемикач не відрізняється від killабо killall. Я очікую, що ти хочеш зберегти? оповіщення.
Брайам

Ви маєте рацію, схоже, я неправильно прочитав ваше запитання.
schaiba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.