LINUX.ORG.RU

xdotool vs xvkbd

 ,


1

2

Здаров, народ!

Решил я тут подкрутить кнопки на мыше, да так, что бы они для разных приложений вызывали разные события. С обёрткой вокруг xbindkeys и вычленением активного окна проблем на возникло. Зато возникла проблема с xdotool, который мне видится несколько перспективнее, чем xvkb. Проблема в том, что одна и та же последовательность не всегда корректно передается активному окну. Точнее, есть подозрение, что оно не всегда срабатывает для gtk приложений (например, для того же FF или pidgin'а), но всегда корректно работает для qt приложений (например, konsole и qpdfview). Команды такие:

xdotool keydown Control_L key --delay 5 Prior keyup --delay 5 Control_L
xvkbd -xsendevent -text "\[Control_L]\[Prior]"
В половине случаев xdotool передает в приложения на базе gtk что-то не то и вместо Control+PageUp срабатывает выделение текста или масштабирование, либо вообще ничего не происходит. Потом, совершенно без каких либо видимых причин, начинает работать корректно.

Вопрос: можно ли решить эту проблему или забить и использовать xvkbd, тем более, что xdotool похоже не обновляется аж с 11 года.

xvkbd -xsendevent -text «\[Control_L]\[Prior]»

Почитай в man xdotool раздел SENDEVENT NOTES. А обсуждали тут похожее:

XSendEvent эмуляция кнопок мыши

Xlib, как правильно послать клик мышкой в окно

Единственное, что будет гарантировано работать - это XTEST, но когда ты указываешь id окна у xdotool, то всегда используется механизм XSendEvent. XTEST же не позволяет передать событие конкретному окну, там просто координаты и что там сделать.

Вот цитата из man:

Xlib, как правильно послать клик мышкой в окно (комментарий)

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

В твоих строчках только не ясно, как ты указываешь для xdotool окно, в котором надо что-то сделать? А то, может, я не совсем правильно понимаю, что ты делаешь. Если ты не указываешь id окна, то используется XTEST, а если указываешь, то XSendEvent.

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

Но я не указываю id окна в случае xdotool. Проблем в том, что оно то работает, то не работает. А xvkbd работает всегда.

e-pirate
() автор топика
Ответ на: комментарий от e-pirate

Если не указываешь, то тогда, да, XTEST используется и его события для приложения ничем не отличаются от событий от сервера. По идее, должно работать. Надо повнимательнее тогда взглянуть на передаваемые нажатия. Может, какая-то специфика есть. Надо проверить у себя.

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

Я проверял на двух машинах и результат вопспроизводим: xvkbd работает всегда для всех приложений вне зависимости от того, на чем они написан gtk или qt, xdotool работает через раз: бывает что работает корректно, потом перестает работать без видимых причин, потом опять же без видимых причин начинает работать снова. При том я проводил следующий эксперимент: на одном рабочем столе у меня открыты два окна с вкладками Firefix и konsole. Я качаю колесо мыши влево или вправо, при этом в konsole вкладки переключаются, а в FF нет. Заменяем одно из событий с xbindkeys на xvkbd (предположим, событие «колесо вправо»), оставив второе событие на xbindkeys. В таком случае события, обрабатываемые xbindkeys не работают, а те, что обрабатываются xvkbd работают. И это все одновременно для одних и тех же приложений.

e-pirate
() автор топика
Ответ на: комментарий от e-pirate

А вот так работает?

xdotool key "Control_L+Prior"

UPD. А вот это как раз может вызвать проблемы (XSendEvent) в некоторых приложениях. Лучше XTEST по умолчанию.

xvkbd -xsendevent
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)

Если вам нужно лишь пересылать сочетание клавиш, то для мыши лучше imwheel. Не смотря на название, программа умеет биндить не только колесо, но и основные и дополнительные кнопки.

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

Зарядил в скрипты вариант с

xdotool key "Control_L+Prior"
Посмотрим, дня через три станет ясно насколько стабильно оно работает. Пока могу только сказать, что для FF работает, а вот для pidgin не работает совсем.

Про --clearmodifiers - я пробовал и с этой опцией, много чего пробовал - глючит, то работает, то не работает. Так что дело не в этой опции. Ну либо если только в сочетании с чем-нибудь еще.

Что касается опции -xsendevent в случае с xvkbd - стабильно работает как с ней, так и без нее.

Вообще, полную версию истории можно прочесть здесь (текст на английском).

e-pirate
() автор топика
Ответ на: комментарий от lexazloy

Простите, проигнорировал Ваш пост. Да, я смотрел в сторону imwheel. Оно отлично подходит по мои цели, но я хочу сделать универсальный вариант: и для клавиатуры и для мыши. xbindkeys лучше походит на эту роль.

e-pirate
() автор топика
Ответ на: комментарий от e-pirate

Ничего. Вы же не обязаны всем отвечать.

P.S. Z наоборот, отошёл от варианта xbindkeys + xautomation на xbindkeys + imwheel. Стало как-то уютнее. :)

lexazloy
()
Ответ на: комментарий от e-pirate

Еще какие-нибудь идеи есть?

А точно xvkbd без xsendevent генерирует несинтетические события. Глянь xev. Он всегда пишет synthetic YES/NO. Пока видно по твоей ссылке, что xvkbd, как это и ожидается, генерирует синтетическое событие (потому что использует XSendEvent), а xdotool, как и ожидается, генерирует событие как бы от самого сервера. Я бы ожидал, что не будет работать xvkbd, но вот почему-то у тебя глючит xdotool.

1. Повесь где-нибудь отклик xev xvkbd с xsendevent и без него. И для сравнения что дает xdotool.

2. По идее xvkbd с параметром xsendevent не должен работать с xterm. Там по умолчанию стоит защита от синтетических событий клавиатуры. А вот с xdotool работать будет, так как подумает, что от сервера идут клавитурные комбинации.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.