LINUX.ORG.RU

История изменений

Исправление PeleWin, (текущая версия) :

Что ж, день сегодня прошёл не зря, мы узнали много нового, хотя достигнуть нужной цели так и не удалось. Хоть здесь и не ЖЖ, опишу, что я делал и что узнал.
Напомню, что цели передо мной стоят следующие:

  • научиться с ИК-пульта закрывать приложения
  • задействовать все кнопки ИК-пульта и научиться с ИК-пульта открывать приложения. Ранее я обнаружил, что хотя часть кнопок пульта генерирует какие-то события (которые можно увидеть с помощью приложений evtest и showkey), однако до иксов они не доходят (приложение xev никаких событий при нажатии на эти кнопки не показывает).
    Очевидно, драйвер ИК-приёмника в соответствии с заданными мной настройками отображает принятые ИК-сигналы в клавитатурные коды (которые я взял со страницы https://www.kernel.org/doc./html/latest/userspace-api/media/rc/rc-tables.html), но почему-то только часть из них доходит до оконных приложений.

Сначала я наткнулся на пару статей на хабре: https://habr.com/ru/articles/53184/ и https://habr.com/ru/articles/222285/
В первой использовался LIRC, что мне показалось неподходящим решением. Вторая статья показалась не слишком ясной. Из неё я понял, что можно переназначить любые (или почти любые) клавиши на любые другие «в иксах» (точнее говоря - с помощью XKB), но я не увидел способа настроить, чтобы по нажатию одной клавиши отправлялась комбинация из двух (Alt+F4).

Я продолжил разбираться и заметил 2 подозрительных момента:

  • работающие коды клавиш имели номера маленькие (не больше 2 сотен), неработающие коды клавиш имели номера большие - в 3-6 сотне.
  • коды клавиш иногда немного не совпадали друг с другом, например код клавиши ESCAPE в одних приложениях и документах показывался как 1, в других - как 9. ENTER - где 28, где 36.
    Попутно я прочитал статью, как работает протокол X11 https://habr.com/ru/articles/712376/ и частично документацию по нему https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html которая внесла ясность.

Оказалось, что:

  • в X11 есть KEYCODE клавиши (физический код, определяется аппаратно) и KEYSYM (надпись на клавише или её функция), который зависит от текущего состояния клавиатуры (раскладка, нажатые NumLock, CapsLock, Shift и пр.) и как раз и определяется настройками XKB и доходит до оконных приложений.
  • В X11 KEYCODE должен быть в диапазоне от 8 до 255, другие значения не поддерживаются. Отсюда - сдвиг на 8 и неработающие мультимедийные клавиши с кодами больше 255.
    После этого стало ясно, что коды мне следует использовать из первых 255 значений, а KEYSYM назначить какие душа пожелает с помощью XKB. Не очень, кстати, понятно, зачем здесь https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h коды с номерами больше 255. Может на будущее? Или просто не для X11…

Долго я не мог разобраться, можно ли настроить XKB так, чтобы при нажатии одной клавиши оконному приложению отправлялась комбинация из пары клавиш. Пишут, что в событиях (Events) передаётся KEYSYM и состояние (STATE) из 8 битовых флагов, соответствующих разным модификаторам Shift, Ctrl, Alt, Num Lock и пр. Вроде бы получилось так настроить, что в xev приходит событие о нажатии F4 с флагами состояния 0x08 (что означает зажатый Alt), но это событие не закрывает ни xev, ни другие окна :’(

Исходная версия PeleWin, :

Что ж, день сегодня прошёл не зря, мы узнали много нового, хотя достигнуть нужной цели так и не удалось. Хоть здесь и не ЖЖ, опишу, что я делал и что узнал.
Напомню, что цели передо мной стоят следующие:

  • научиться с ИК-пульта закрывать приложения
  • задействовать все кнопки ИК-пульта и научиться с ИК-пульта открывать приложения. Ранее я обнаружил, что хотя часть кнопок пульта генерирует какие-то события (которые можно увидеть с помощью приложений evtest и showkey), однако до иксов они не доходят (приложение xev никаких событий при нажатии на эти кнопки не показывает).
    Очевидно, драйвер ИК-приёмника в соответствии с заданными мной настройками отображает принятые ИК-сигналы в клавитатурные коды (которые я взял со страницы https://www.kernel.org/doc./html/latest/userspace-api/media/rc/rc-tables.html), но почему-то только часть из них доходит до оконных приложений.
    Сначала я наткнулся на пару статей на хабре: https://habr.com/ru/articles/53184/ и https://habr.com/ru/articles/222285/
    В первой использовался LIRC, что мне показалось неподходящим решением. Вторая статья показалась не слишком ясной. Из неё я понял, что можно переназначить любые (или почти любые) клавиши на любые другие «в иксах» (точнее говоря - с помощью XKB), но я не увидел способа настроить, чтобы по нажатию одной клавиши отправлялась комбинация из двух (Alt+F4).

Я продолжил разбираться и заметил 2 подозрительных момента:

  • работающие коды клавиш имели номера маленькие (не больше 2 сотен), неработающие коды клавиш имели номера большие - в 3-6 сотне.
  • коды клавиш иногда немного не совпадали друг с другом, например код клавиши ESCAPE в одних приложениях и документах показывался как 1, в других - как 9. ENTER - где 28, где 36.
    Попутно я прочитал статью, как работает протокол X11 https://habr.com/ru/articles/712376/ и частично документацию по нему https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html которая внесла ясность.

Оказалось, что:

  • в X11 есть KEYCODE клавиши (физический код, определяется аппаратно) и KEYSYM (надпись на клавише или её функция), который зависит от текущего состояния клавиатуры (раскладка, нажатые NumLock, CapsLock, Shift и пр.) и как раз и определяется настройками XKB и доходит до оконных приложений.
  • В X11 KEYCODE должен быть в диапазоне от 8 до 255, другие значения не поддерживаются. Отсюда - сдвиг на 8 и неработающие мультимедийные клавиши с кодами больше 255.
    После этого стало ясно, что коды мне следует использовать из первых 255 значений, а KEYSYM назначить какие душа пожелает с помощью XKB. Не очень, кстати, понятно, зачем здесь https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h коды с номерами больше 255. Может на будущее? Или просто не для X11…

Долго я не мог разобраться, можно ли настроить XKB так, чтобы при нажатии одной клавиши оконному приложению отправлялась комбинация из пары клавиш. Пишут, что в событиях (Events) передаётся KEYSYM и состояние (STATE) из 8 битовых флагов, соответствующих разным модификаторам Shift, Ctrl, Alt, Num Lock и пр. Вроде бы получилось так настроить, что в xev приходит событие о нажатии F4 с флагами состояния 0x08 (что означает зажатый Alt), но это событие не закрывает ни xev, ни другие окна :’(