Есть ли способ имитировать событие «Закрыть» в различных окнах с помощью терминала?

15

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

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

Возможное использование:

Braiam
источник

Ответы:

16

Я полагаю, что соответствующая страница руководства - 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

Или на окнах по другим атрибутам. Вы можете использовать, 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"

Ссылки

SLM
источник
Я думаю, что мы можем упростить еще больше, используя 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, который непосредственно закрывает окно без отправки нажатий клавиш.

Вы можете закрыть окно напрямую, сопоставив имя, например, оба они закроют окно «Untitled Document 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 такое окно, а затем закроет все из них.

jmiserez
источник
Получу ли я диалоговое окно с подсказкой?
Брайам
@Braiam Да, я только что проверил это. Только если программа запущена в терминале (например top), конечно, так же, как при нажатии кнопки закрытия.
jmiserez
Я запустил xdotool search --sync --name "Software Updater" | xargs wmctrl -i -cTrusty и запустил Software Updater. С этого момента Software Updater не отображается должным образом. Отображается только строка заголовка. Переустановка update-manager не помогла.
Ярно
Рад, что выход из системы и возврат к сеансу Xfce помогли.
Ярно
Я не могу найти "gedit" ни с утилитами xdotool, ни с xprop. Это верно только для "Gedit", я могу найти другие программы. Команда xdotool search --sync --name "gedit" не возвращает результат. Кто-нибудь может помочь? Ubuntu 17
Gonki
-1

pkill (1) должен быть тем, что вам нужно.

schaiba
источник
3
Нет, он не будет имитировать событие «Закрыть» ни в одном из моих тестов (откройте gedit, LibreOffice и терминал, напишите что-нибудь, отправьте команду), если я использую --signalпереключатель, отличный от killили killall. Я ожидаю, что Вы хотите сохранить? оповещения.
Брайам
Вы правы, кажется, я неправильно понял ваш вопрос.
Щайба