Я хотел бы переназначить клавиши на моей цифровой клавиатуре, чтобы они вели себя по-разному в зависимости от того, как долго нажата клавиша. Вот пример:
Если удерживать клавишу Numpad 9 нажатой менее 300 мс, она отправит команду «предыдущая вкладка» Ctrl+Tab
Если я удержу клавишу Numpad 9 в течение 300-599 мс, она отправит команду «новая вкладка» Ctrl+T
Если я удержу клавишу Numpad 9 в течение 600-899 мс, она отправит команду «закрыть вкладку / окно» Ctrl+W
Если я удерживаю клавишу Numpad 9 нажатой более 899 мс, это ничего не даст, если я пропустил желаемое временное окно.
В Windows я мог сделать это с AutoHotKey, а в OS XI мог сделать это с ControllerMate, но я не могу найти инструмент в UNIX / Linux, который позволяет переназначать ключи в зависимости от того, как долго удерживается ключ.
Если вам известно об инструменте, который может решить мою проблему, обязательно предоставьте сценарий или пример кода, который демонстрирует поведение времени удержания условной клавиши, которое я описал выше. Это не должен быть полный код, чтобы решить мой пример, но этого должно быть достаточно для меня, чтобы повторно использовать его для моего примера.
Ответы:
Я просто написал это в C :
Используйте,
showkey -a
чтобы получить код привязки:Поместите код привязки 5 и его команду (например, run
/tmp/.a.out
) в ~ / .bashrc:Обратите внимание, что соответствующий код ключа также должен быть изменен в исходном коде (шестнадцатеричное значение также может быть получено
sudo showkey -a
сверху):Скомпилируйте с (выходные данные
/tmp/a.out
в моем примере):Демонстрация:
Numpad 5, короткое нажатие, открытие новой вкладки, среднее нажатие, открытие, gedit, и долгое нажатие, открытие gnome-терминала.
Это не относится непосредственно к любому окну в gnome desktop manager, но я думаю, что оно должно дать вам некоторое представление о том, как (сложно) реализовать его. Он также работает в виртуальной консоли (Ctrl + Alt + N) и работает в некотором эмуляторе терминала (например, konsole, gnome-terminal, xterm).
p / s: я не программист, так что простите, если этот код не оптимизирован.
[ОБНОВИТЬ]
Предыдущий ответ работает только в оболочке и требует фокуса, поэтому я думаю, что разбор / dev / input / eventX - это решение для работы во всей X сессии.
Я не хочу изобретать велосипед. Я играю с
evtest
утилитой и модифицирую нижнюю часть evtest.c своим собственным кодом:Обратите внимание, что вы должны изменить имя пользователя ( xiaobai - мое имя пользователя). Кроме того,
if ( (ev[i].code == 76) ) {
это мой код ключа Numpad 5, вам может потребоваться вручную распечатать ev [i] .code для двойного подтверждения. И, конечно, вы должны изменить путь к видео тоже :)Скомпилируйте и протестируйте его непосредственно с помощью (`` часть для того, чтобы получить правильное значение
/dev/input/eventN
):Обратите внимание, что
/by-id/
это не работает в Fedora 24, поэтому я изменил его на / by-path /. Кали нет такой проблемы.Мой менеджер рабочего стола gdm3:
Итак, я вставил эту строку
/etc/gdm3/PostLogin/Default
для запуска этой команды от имени root при запуске gdm (/etc/X11/Xsession.d/*
не работает):По неизвестной причине /
etc/gdm/PostLogin/Default
не работает на Fedora 24 'gdm, который выдает " Отказано в доступе " при проверке/tmp/l_gdmE
журнала. Вручную запустить без проблем, хотя.Демонстрация:
Numpad 5, мгновенное нажатие (<= 0,2 секунды) будет проигнорировано, короткое нажатие (от 0,2 до 0,5 секунды) открыто
nautilus
, среднее нажатие (от 0,5 до 1 секунды) открытоvlc
для воспроизведения видео, длительное нажатие (от 1 до 2 секунд) открытьgnome-terminal
, и тайм-аут (2 секунды) открытьgedit
.Я загрузил полный код (только один файл) здесь .
[ОБНОВЛЕНИЕ снова]
[1] Добавлен поток нескольких ключей и исправлена
notify-send
ошибка с определениемDBUS_SESSION_BUS_ADDRESS
. [2] ДобавленоXDG_CURRENT_DESKTOP
иGNOME_DESKTOP_SESSION_ID
для обеспечения того, чтобы konsole использовала графический интерфейс темы gnome (измените его, если вы не используете gnome).Я обновил свой код здесь .
Обратите внимание, что этот код не обрабатывает поток комбинационных клавиш, например, Ctrl+ t.
ОБНОВИТЬ:
Существует несколько интерфейсов устройств, в которых последовательность записей / dev / input / by-path / XXX-eventN является случайной. Поэтому я изменил команду,
/etc/gdm3/PostLogin/Default
как показано ниже (Chesen
это имя моей клавиатуры, для вашего случая, вы должны изменить егоgrep Razer
вместо этого):Вы можете попробовать извлечь событие из
cat /proc/bus/input/devices | grep -i Razer -A 4
:В приведенном выше примере
sudo cat /dev/input/event7
выводятся причудливые выходные данные только при щелчке 12 цифр на мыши Razer, в которой используется шаблон «sysrq kbd leds event7», который можно использоватьgrep -P '^(?=.*sysrq)(?=.*leds)'
выше (ваш шаблон может отличаться).sudo cat /dev/input/event6
будет выводить причудливый вывод только при нажатии средней клавиши вверх / вниз. Хотяsudo cat /dev/input/event5
будет выводить причудливый вывод при перемещении мыши и прокрутке колеса.[Обновление: Поддержка Replug клавиатуры кабеля для перезагрузки программы]
Следующее должно быть самоочевидным:
источник
if-else
каждое нажатие клавиши, в то время как я также добавил,if (currCode >= 59) && (currCode <= 81)
чтобы ограничить диапазон раньшеif-else
.Вы можете найти инструмент, который работает с определенным набором программ, но не будет никакого глобального инструмента, потому что поведение, связанное со временем, выполняется в приложениях в X, а не в оконной системе.
источник
вы проверяли Xmodmap?
xmodmap - это утилита для изменения раскладок клавиш и указателей в Xorg
https://wiki.archlinux.org/index.php/Xmodmap
источник