LINUX.ORG.RU

Основы lniux: где задаётся реакция на Alt+F4?

 , ,


0

1
  1. У меня есть одноплатный компьютер с ИК-приёмником, подключенный к телевизору. Я настроил на нём работу с бесхозным ИК-пультом. Пульт работает как обычная клавиатура, только со специфическими мультимедийными клавишами. Оказывается, кодов мультимедийных клавиш в линуксе целая куча:https://www.kernel.org/doc./html/latest/userspace-api/media/rc/rc-tables.html
  2. ИК-пульт не может посылать комбинацию клавиш, так что я не могу послать Alt+F4, чтобы закрыть, например, VLC. И мне требуется придумать, как закрывать приложения с ИК-пульта.
  3. X Window System состоит у меня из:
  • Xorg
  • nodm (для входа без запроса логина/пароля)
  • blackbox (оконный менеджер)

Так вот - собственно вопрос, комбинацию Alt+F4 (закрытие окна) обрабатывает оконный менеджер или Xorg? Она где-то прописана в настройках? Можно как-то приспособить какую-нибудь мультимедийную клавишу, например, KEY_MEDIA, как дубль комбинации Alt+F4?

комбинацию Alt+F4 (закрытие окна) обрабатывает оконный менеджер

Она где-то прописана в настройках

Можно приспособить какую-нибудь клавишу, как дубль комбинации Alt+F4

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

With the start of the 0.60.x series blackbox no longer handles any keyboard shortcuts; instead it supports a communication protocol which allows other programs to handle these and related tasks. If you’d like to be able to use keyboard shortcuts with blackbox, bbkeys(1) can provide you with all the previous functionality and more.

https://github.com/bbidulock/blackboxwm

https://github.com/bbidulock/bbkeys

Ещё рекомендуют bbconf установить, чтобы удобно настраивать WM.

stabilitron
()

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

  • научиться с ИК-пульта закрывать приложения
  • задействовать все кнопки ИК-пульта и научиться с ИК-пульта открывать приложения. Ранее я обнаружил, что хотя часть кнопок пульта генерирует какие-то события (которые можно увидеть с помощью приложений 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
() автор топика
Последнее исправление: PeleWin (всего исправлений: 1)
Ответ на: комментарий от stabilitron

Работает ли Alt+F4 с обычной клавиатуры я не проверял (долго её подключать), но должно бы работать: настройки blackbox я не менял (не получилось пока), то есть используются настройки blackbox по умолчанию.
Моя идея заключалась в следующем. XKB позволяет менять состояния модификаторов, а также сделать «Latch» - защёлкнуть, зафиксировать состояние нажатия модификаторов на некоторое время (м.б. до нажатия другой клавиши длится - не знаю точно). И я подумал, что можно вместо комбинации Alt+F4 использовать последовательное нажатие 2 кнопок. Первая - Alt, но с защёлкиванием состояния. Вторая - F4.
Добавил в настройки XKB следующий код

xkb_keymap {
...
  replace key <LALT> { 
    actions[Group1] = [ LatchMods(modifiers=Alt) ]
  };
...
};

ДО использования этих настроек, если нажимать последовательно Alt и F4 xev показывает следующую последовательность (просто для примера, без защёлкивания).

//нажали Alt, состояние (перед событием) 0x0 - то есть "ни один модификатор не зажат"
KeyPress event, serial 32, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 643247, (679,361), root:(680,384),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
//отпустили Alt, состояние (перед событием) 0x8 - то есть "зажат Alt"
KeyRelease event, serial 35, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 643535, (679,361), root:(680,384),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
//нажали F4, состояние (перед событием) 0x0
KeyPress event, serial 35, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 645973, (679,361), root:(680,384),
    state 0x0, keycode 70 (keysym 0xffc1, F4), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
//отпустили F4, состояние (перед событием) 0x0
KeyRelease event, serial 35, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 646260, (679,361), root:(680,384),
    state 0x0, keycode 70 (keysym 0xffc1, F4), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

После применения этих настроек, если нажимать последовательно Alt и F4 xev показывает следующую последовательность

//нажали кнопку №64, состояние (перед событием) 0x0 - то есть "ни один модификатор не зажат"
KeyPress event, serial 32, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 385974, (679,361), root:(680,384),
    state 0x0, keycode 64 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
//отпустили кнопку №64, состояние (перед событием) 0x8 - то есть "зажат Alt"
KeyRelease event, serial 35, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 386260, (679,361), root:(680,384),
    state 0x8, keycode 64 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
//нажали кнопку F4, состояние (перед событием) 0x8 - то есть "зажат Alt"
//однако эффекта закрытия окна это не вызвало
KeyPress event, serial 35, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 388518, (679,361), root:(680,384),
    state 0x8, keycode 70 (keysym 0xffc1, F4), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 35, synthetic NO, window 0x800001,
    root 0x1f6, subw 0x0, time 388805, (679,361), root:(680,384),
    state 0x0, keycode 70 (keysym 0xffc1, F4), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
PeleWin
() автор топика

Первое, что в голову идёт, это повесить на клавишу скрипт, который закроет окно через wmctrl или xdotool. Это самое простое, если в WM-е нельзя повесить своё на эту тему.

papin-aziat ★★★★★
()
Ответ на: комментарий от stabilitron

Блин, я подключил-таки обычную клавиатуру, чтобы убедиться, что на ней Alt+F4 работает в blackbox… И выяснил, что вовсе и не работает ))
То есть в настройках по умолчанию blackbox, видимо, отсутствует «закрытие окон по Alt+F4».
Так что надо просто разобраться с настройками blackbox (bbkeys пока скомпилировать не удалось из-за отсутствующей библиотеки libbt) и добавить необходимые горячие клавиши.

@papin-aziat Спасибо, попробую, если не удастся разобраться с настройкой горячих клавиш в blackbox.

PeleWin
() автор топика