Почему эти команды xte работают в терминале, но не связаны с xbindkeys?

Это xte Команда, когда я запускаю его в терминале, запускает режим Экспо:

xte 'keydown Super_L' 'key S' 'keyup Super_L'

Однако, когда я помещаю это в мой файл.xbindkeysrc:

"xte 'keydown Super_L' 'key S' 'keyup Super_L'"
  b:11

Ничего не происходит, когда я нажимаю кнопку. Следующая привязка заставляет букву X появляться в моей консоли, когда я нажимаю кнопку 11:

"xte 'key X'"
  b:11

Так почему же не работает привязка Expo?


Это подробный вывод xbindkeys -n -v при нажатии кнопки 11:

Нажатие кнопки!
e.xbutton.button=11
e.xbutton.state=16
"xte 'keydown Super_L' 'key W' 'keyup Super_L'"
    m:0x0 + b:11   (мышь)
получил экран 0 для окна 2bb
Запустите программу с вызовом fork+exec
Кнопка выпуска!
e.xbutton.button = 11
e.xbutton.state = 16

И ничего не происходит. Это как-то связано с тем, как xbindkeys выполняет команду? (ответвление + вызов exec)


Попытка номер два.

expo.sh:

#!/usr/bin/env bash
export DISPLAY=:0
xte 'keydown Super_L' 'key S' 'keyup Super_L'

Выполнение этого скрипта из командной строки активирует Expo. Связывание его в xbindkeys:

"sh ~/expo.sh"
  b:11

Нажатие кнопки мыши 11:

Нажатие кнопки!
e.xbutton.button=11
e.xbutton.state=16
"sh ~/expo.sh"
    m:0x0 + b:11   (мышь)
получил экран 0 для окна 2bb
Запустите программу с вызовом fork+exec

Ничего не произошло!

6 ответов

Решение

Это очень странно. Оказывается, если моя кнопка мыши все еще нажата (еще не отпущена), когда Super+W нажатие клавиши симулируется, ничего не происходит. Я не знаю, кто виноват в этом (возможно, Корица?). Я работал над этим, добавив небольшую задержку xte команда:

xte 'usleep 100000' 'keydown Super_L' 'key S' 'keyup Super_L'

Теперь он ждет 0,1 секунды, прежде чем имитировать Super+S, Если я нажму и удерживаю кнопку мыши более 0,1 секунды, ничего не происходит.

Это обходной путь ответа. Я бы предпочел правильный ответ.

Другое более простое решение: вместо использования "b:11" в определении xbindkeys используйте "b:11 + release". Он подождет, пока вы не отпустите кнопку, чтобы запустить команду.

Пример:

"sh ~/expo.sh"
  b:11 + release

Я столкнулся с той же проблемой.

"xte 'key b'"

работал в консоли, но не в файле параметров xbindkeys. Я изменил b его кодом keysym, используя команду "xev", чтобы получить его:

"xte 'key Ox62'"

У меня сработало

Возникает похожая проблема при использовании sxhkcd keymapper. Оказывается, ваши настоящие горячие клавиши обнаружены как все еще нажаты.

Есть несколько обходных путей:

  • ищите событие выпуска
  • добавлять sleep 0.2 перед вашей командой
  • использовать ярлык с лидером
  • отпустите ваши модификаторы ярлыков перед вашей последовательностью xte

Однако вы не можете получить действия в реальном времени с этим =)

Попробуй с +Release

"xte 'keydown Super_L' 'key S' 'keyup Super_L'"
b:11 + Release

Это может помочь.

Я видел проблему, связанную с тем, что привязанная клавиша все еще нажималась (например, сдвиг, контроль и т. д.) много лет назад. Я сделал подробные заметки об этом в файле подсказок и подсказок по обработке событий X Windows...

https://antofthy.gitlab.io/info/X/event_handling.txt

Одно из решений — дать пользователю время отпустить клавиши.

Но другой вариант — отправить свои собственные события keyup, чтобы выпустить ключ для пользователя!

Третье решение — использовать xdotool и его параметр --clearmodifiers... Например, ввести адрес электронной почты...

      xdotool type  --clearmodifiers -delay 0 'email.address@machine.com'

Есть один БОЛЬШОЙ нюанс, на который следует обратить внимание... Рекурсивные макросы Будьте уверены, что ваши макросы не отправляют последовательность для одного и того же макроса! Если вы это сделаете, макрос будет повторяться снова и снова!

Другие вопросы по тегам