Как создать ярлык, который выполняет команду xdotool для имитации нажатия клавиши?


10

Я пытаюсь смоделировать нажатие клавиши мультимедиа с помощью пользовательского ярлыка.

До сих пор я смог добиться нужной имитации с помощью команды:

xdotool key XF86AudioPlay

Он работает отлично, он останавливает или запускает музыкальный проигрыватель при каждом запуске.

Проблема возникает при попытке запустить его как ярлык.

Сначала я попытался запустить псевдоним с пользовательским ярлыком, но он не работал.

Как объяснено по этому вопросу :

Команды, запускаемые привязками клавиатуры, не анализируются через оболочку. Лучше всего создать каталог в вашем домашнем каталоге.

Затем я создал предложенный скрипт и назвал его simplay:

#!/bin/sh
xdotool key XF86AudioPlay

Он расположен в папке bin, которая является частью PATH, это прекрасно работает и может быть запущен из любого места.

При попытке создать пользовательский ярлык мне не удалось его запустить, конфигурация следующая:

Name: test
Command: simplay

Shortcut: Ctrl+Alt+R

После поиска немного больше, я нашел другой способ выполнить ярлык:

gnome-terminal -e simplay

Я попробовал его на терминале и заметил, что при его запуске он быстро откроет новое окно терминала, выполнит дочерний процесс, приостановит воспроизведение музыки и немедленно закроет окно.

Я изменил команду на ярлыке и при нажатии на нее я заметил то же самое поведение, открывающее терминал и немедленно закрывающееся, но на этот раз дочерний процесс не приостанавливал музыку, что заставляет меня думать, что скрипт вызывался во всех моих предыдущих попытках но это как-то не в состоянии выполнить.

Как я могу решить эту проблему в соответствии с вашими знаниями?

Ответы:


12

Проблема

Ваш ярлык выполняется одновременно с нажатием клавиш

Если вы запустите команду, имитирующую нажатие клавиши, вызванное ... другим нажатием клавиши, вы фактически смоделируете нажатие третьей клавиши, которое является комбинацией обоих :)

Решать

Вам нужно запретить запуск ярлыка одновременно с нажатием симулируемой клавиши, другими словами, добавьте задержку:

/bin/bash -c "sleep 1 && xdotool key XF86AudioPlay"

Добавьте эту команду в ярлык, и она должна работать.

Запись

Конечно, вы можете немного поиграть со значением in sleep 1, чтобы установить его на лучшее значение, которое вам удобно, в зависимости от того, насколько «липкая» комбинация нажата. sleep 0.5вполне может сделать, и заставить ярлык действовать быстрее.


8

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

Вместо использования обходного пути «сна 1» вы можете использовать --clearmodifiersфлаг, т.е. ваш пользовательский ярлык будет выглядеть так:

Name: test
Command: xdotool key --clearmodifiers XF86AudioPlay

Shortcut: Ctrl+Alt+R

Для меня это работает при сопоставлении ярлыков Super+F9.


Является ли приведенный выше фрагмент кода файлом? Если да, нужно ли поместить его в определенное место или запустить определенную команду для реализации ярлыка?
JellicleCat

1
Фрагмент - это просто описание ярлыка, который я использовал. В Ubuntu вы можете создавать собственные сочетания клавиш в настройках клавиатуры. Однако с тех пор я обновил свою версию Ubuntu и теперь могу напрямую сопоставлять действие «Воспроизведение (или воспроизведение / пауза)» с выбранной комбинацией клавиш, которая оказывается более надежной, чем использование xdotool.
января

Еще лучше, чем --clearmodifiers, это выдать «keyup» для горячей клавиши, которую вы используете для вызова скрипта. Небольшой недостаток заключается в том, что вам нужно обновить скрипт, если вы измените горячую клавишу для вызова скрипта.
ванадий

1

Альтернативой (для более быстрой работы) использования sleep 1 && xdotool ...является использование xdotool для отпускания ваших сочетаний клавиш. Немного длиннее, но вы также можете использовать

/bin/bash -c "xdotool keyup R Alt_L Ctrl_L && xdotool key XF86AudioPlay"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.