LINUX.ORG.RU

xdotool не работает или ....

 , , , ,


1

1

Задача следующая: хочу забиндить горячую клавишу, позволяющую послать клавишу alt+space (сворачивание окна) окну SMPlayer'a. Пробовал такие комбинации, ни одна не работает:
xdotool search --class smplayer key alt+space
xdotool search --classname smplayer key alt+space
xdotool search --name smplayer key alt+space
Так же, пробовал всё то же самое, только smplayer делал с кавычками. Результат один и тот же ... нулевой.
Подскажите, какой вариант может быть рабочим?

Решение

Обнаружено 2 решения:
1 способ (более верный)
2 способ (рабочий, но могут быть нюансы)

Ответ на: комментарий от Zubok

Упс, сорри. Это всё объясняет. Опять воюю с тем же. Уже поседел. Буду изучать возможности xtest.

Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

Так XTEST через тот же xdotool. Просто убери указание окна и search. Просто дай ему фокус и долби комбинацию.

Zubok ★★★★★ ()

Задача следующая: хочу забиндить горячую клавишу, позволяющую послать клавишу alt+space (сворачивание окна) окну

Но это можно через wmctrl сделать. Зачем кнопки посылать? Да и через xdotool можно. minimize сделай.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Desmond_Hume

Вот это не работает.

А должно. Может, он просто smplayer не нашел. Попробуй другие поиски. Глянь, что там xprop говорит.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Воот ... похоже это то, что искал. По крайней мере, отзывается на действия. Сейчас буду изучать). Спасибо.

Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

А как он тогда даст фокус, если не знает, какое окно?

Ну ты же сам это делал до этого! Firefox в полноэкранном режиме (комментарий) . Но это кривотень. Механизм общения через WM правильнее. И xdotool и wmctrl это умеют.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok
xdotool search --classname "smplayer" windowactivate --sync; xdotool key "F11"
XGetWindowProperty[_NET_WM_DESKTOP] failed (code=1)

Ошибка. В кедах всё не так просто, как в гноме, похоже.

Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

В общем, не надо вот так вот делать. Это кривотень. kwin вроде все фишки ICCCM/EWMH поддерживает. Должны работать xdotool ...windowminimize и wmctrl. Главное правильно найти окно. Узнать параметры можно через xprop (у меня нет smplayer)

Zubok ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

wmctrl -a smplayer && xdotool key alt+space

На недо так делать!

Zubok ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

Покажи, что тебе выводи xprop на окно smplayer

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

xprop выдаёт следующее, если кликнуть на окошке smplayer'a:

_NET_WM_ICON_NAME(UTF8_STRING) = 
XdndAware(ATOM) = BITMAP
WM_NAME(STRING) = "A Quiet Place 2018 - SMPlayer"
_NET_WM_NAME(UTF8_STRING) = "A Quiet Place 2018 - SMPlayer"
_KDE_NET_WM_USER_CREATION_TIME(CARDINAL) = 16571188
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x3e, 0x7e, 0x0, 0x0
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
_XEMBED_INFO(_XEMBED_INFO) = 0x0, 0x1
WM_CLIENT_LEADER(WINDOW): window id # 0x6600007
WM_HINTS(WM_HINTS):
                Client accepts input or input focus: True
                Initial state is Normal State.
_NET_WM_PID(CARDINAL) = 29168
_NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 106954758
WM_CLASS(STRING) = "smplayer", "smplayer"
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
WM_NORMAL_HINTS(WM_SIZE_HINTS):
                user specified location: 0, 0
                user specified size: 1920 by 1080
                program specified minimum size: 73 by 145
                window gravity: NorthWest
Вот только xdotool отказывается искать этот classname («smplayer»).

Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

Ну, значит, должно работать

xdotool search --class smplayer windowminimize

или так еще

xdotool search --classname smplayer windowminimize

У меня в IceWM с Qt-приложением djview4 работает, сворачивает его, даже если оно фокуса не имеет.

xdotool search --class djview windowminimize
Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Desmond_Hume

Нет, не работает ...

А окно находит вообще? Вот если просто набрать xdotool search --classname smplayer, то что выводит?

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

Нет, не работает ...

Не понимаю почему. Должно работать. У тебя smplayer на qt4 или qt5 (такой есть уже?). Я сейчас поставлю и на IceWM проверю.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok
SMPlayer © 2006-2018 Ricardo Villalba <rvm@users.sourceforge.net>

Version: 18.2.2 (revision 8937)
Using Qt 5.10.1 (compiled with Qt 5.9.2)
Using MPV 0.27.2

Links:
Official website: http://www.smplayer.info
Support forum: http://forum.smplayer.info

SMPlayer is a graphical interface for MPlayer and mpv.
Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

В общем, поставил и сразу какие-то странности у меня. Запускаем smplayer и ничего в нем не трогаем (меню и пр). Переходим в терминал, набираем

xdotool search --classname smplayer windowminimize

то все срабатывает. Как только кликнешь, скажем в меню, то перестает работать. Очень странно. Но если сделать хотя бы так:

xdotool search --onlyvisible --classname smplayer windowminimize

то работает вроде всегда.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Да, теперь заработало. Именно последний вариант с "--onlyvisible" параметром. В принципе, это логично. Как можно свернуть окно, которое не может быть visible? Но почему в man не написали ...

Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Zubok

Всё, кажись разобрался!
Алгоритм такой:
1. Узнаём имя окно (ты был прав!):

xdotool search --classname smplayer getwindowname
smplayer
2. Узнали имя «smplayer», теперь через name его же находим и минимизируем его:
xdotool search --name smplayer windowminimize
It Works!

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

... которое не только «не может быть», но и в данный момент не visible (даже если может).

Desmond_Hume ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

Ну, тут дело, наверное, в том, что WM_CLASS могут иметь несколько окон, а WM_NAME одно - которое toplevel. Но тут подводный камень есть. Если ты загружаешь фильм, то название окна может поменяться. В man не написано, но он ищет по подстроке. И если в строке остался smplayer, то он окно найдет, а если нет, то не найдет. Причем поиск нечувствителен к регистру, судя по всему.

Zubok ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

... поэтому в общем с onlyvisible чуть правильнее, так как classname не менятся. Но если надо еще различить окна по заголовкам (они у окон одного приложения могут быть разными), то дополнительно --name сойдет. Там можно группировать признаки.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Вот только странное дело, но key уже послать нельзя. Например,

xdotool search --name smplayer key alt+space
уже не сработает, так же, как и
xdotool search --onlyvisible --classname smplayer key alt+space
Н-да, непростой он этот xdotool.

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

xdotool search --classname smplayer getwindowname

Это можно увидеть, если сделать поиск с onlyvisible. Он тебе name каких-то ще вновь созданных окон возвращает. Вот сам проверь:

1. Запусти smplayer, ничего не трогай и запусти

xdotool search --classname smplayer

Получишь один номер. Потом потыкай в менюшки и еще раз запусти. Увидишь, что в списке нашлись еще окна, а toplevel вообще последним в списке стало. Вот он и перестает работать. Видимо, windowminimize применяется только к первому найденному окну.

Zubok ★★★★★ ()
Ответ на: комментарий от Desmond_Hume

Вот только странное дело, но key уже послать нельзя. Например,

Ну это опять к старому треду своему возвращайся. Поиск дает конкретный window id. и команда по посылке клавиш идет в конкретное окно. Если оно фильтрует XSendEvent, то ничего работать не будет. Qt5, скорее всего, так и делает. Посылка кнопок будет работать без search. и надо перед посылкой поднимать приложение, чтобы фокус оно получило. Иначе никак

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Desmond_Hume

Н-да, непростой он этот xdotool.

Не в нем дело. Дело в концепции. Вот сделали фичу в иксах, что можно конкретному окну что-то послать, но потом народ стал кричать, что где же секьюрность? Как это так? Теперь каждый встречный поперечный начнет в окно посылать, что ему захочется. Вот и стали некоторые фильтровать. Управление становится невозможным таким образом (через XTEST можно, однако, но уже не адресно). ТАкие дела. в xterm, например, эту фишку давно сделали отключаемой. Firefox в полноэкранном режиме (комментарий) . Вернее, включаемой. А в Qt5, GTK3 и даже, может, старше не сделали такой возможности. У меня GTK2 приложения еще отзываются на адресные события. GTK3 уже нет.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Тогда, наверное, вариант с --onlyvisible действительно самый верный. То есть, действие применится не к каким-то фоновым окнам, а к тому, которое на экране пользователя.

Desmond_Hume ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.