Как коды клавиш сопоставляются с соответствующим действием?

18

После того, как выяснить , как изменить отображение кодов сканирования ключевых кодов с использованием udevсм этого вопроса , мне было интересно , как эти коды ключей (или события , если хотите) отображается на соответствующие действия.

Так, например, если вы нажмете volume upна клавиатуре, отправляется код сканирования, который затем будет преобразован в volumeupкод клавиши. Но как перехватить этот код клавиши, увеличить громкость и отобразить соответствующее уведомление?

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

РЕДАКТИРОВАТЬ: коды клавиш, которые я упоминаю, не следует путать с xevвозвратами кодов клавиш , но я также заинтересован в них;)

Герхард Бургер
источник
3
Я не согласен, например, уведомление очень специфично для Ubuntu, поэтому я хочу знать, как получено уведомление. Я предполагаю, что где-то должен быть вызван скрипт, поэтому я хочу знать, где находятся эти скрипты.
Герхард Бургер
2
Это действительный вопрос для Ubuntu, так как способ, которым Ubuntu справляется с этим, изменился за годы IIRC. Очень интересно узнать, какова последовательность событий в Ubuntu для события, нажимающего горячую клавишу, запускающую соответствующие действия. Возможные цели: настраиваемое управление яркостью , устранение проблем с горячими клавишами и т. Д.
gertvdijk
2
@Seth кажется устаревшим. HAL устарела давно, с 10.04 . Также отсутствует информация о том, как запускаются уведомления на рабочем столе.
gertvdijk
1
Сегодня я наткнулся на wiki.ubuntu.com/Hotkeys/Troubility , который дает несколько хороших указателей (есть ссылка на wiki.ubuntu.com/Hotkeys/Architecture, которая очень информативна). Я думаю, что ответ Стивена Остермиллера в правильном направлении, но я хочу найти эти сценарии и быть в состоянии изменить их;)
Герхард Бургер
1
^^ эта информация, кажется, устарела, здесь нет привязок клавиш в gnome-settings-daemon ... Много хитов для яркости в разделе compiz (я полагаю, для единства?) Кто знает, как notify-osdработает? Я думаю, что именно здесь отправляются уведомления о яркости ...
Герхард Бургер

Ответы:

6

Хорошо, нашел это на https://help.ubuntu.com/community/MultimediaKeys

Когда вы нажимаете клавишу на клавиатуре, ядро ​​Linux генерирует необработанный скан-код для него (если он назначен). Каждый скан-код может быть сопоставлен с кодом ключа. Это на уровне ядра. X имеет (квази) полностью независимый способ сопоставления ключей: X при запуске читает таблицу кодов ядра, затем сопоставляет код с его независимой таблицей кодов (она такая же, как коды ядра, но отличается :)). Затем каждый код ключа может быть сопоставлен с ключом, то есть строкой, которая представляет ключ или предлагает действие. Таким образом, чтобы наши ключи работали в полном объеме, им нужен скан-код ядра / код ключа плюс код ключа X / keysym. Это может показаться странным, но у разработчиков X есть причина оставить отдельную раскладку клавиатуры в ядре. Это совсем не сложно, просто довольно утомительная процедура.

Итак, коды клавиш сопоставлены с ключами, так где же ключи? Я нашел и ответил на этот вопрос: где я могу найти список всех X ключей в эти дни? Поскольку речь идет о клавишах регулировки громкости, это можно найти в XF86keysym.hисходном коде, упомянутом в ответе.

В этом файле на моем компьютере я нашел следующее для тома:

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

Странно ... отличные значения от чего-то еще, может быть, есть несколько систем для обработки ключей? http://crunchbang.org/forums/viewtopic.php?id=16656


Я использую Xubuntu, и для управления клавишами мне нужно сопоставить действия вручную (например, как я могу изменить сочетания клавиш в xubuntu? ). Однако уведомления кажутся независимыми, как будто они реагируют на нажатие клавиши и действуют соответственно. Это может означать, что другие программы в Ubuntu настроены таким образом, поэтому нет необходимости сопоставлять скрипты с клавишами.

Так что я совершенно уверен, что программы теперь подхватывают ключ (поэтому никаких скриптов не найти).

В Xubuntu у меня была эта проблема с Pulse Audio и использованием пользовательских скриптов для изменения громкости. Казалось, что Pulse перехватывает клавишу Mute, клавиша Mute отключает звук Alsa и PulseAudio, но включает только звук, который Alsa сделала для интересных обходных путей.


Проверьте это о NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes

Если вы посмотрите эти диаграммы: https://wiki.ubuntu.com/NotifyOSD#Architecture

Особенно этот: введите описание изображения здесь

Это показывает, что есть «слушатель аппаратных ключей», который получает форму DBus или HAL? Затем он «извлекает визуальный элемент из системы», который значками звука и яркости находятся в источнике Notify-OSD, а затем создает пузырь оттуда.


Это все сумасшедшее смущение, но, насколько я понимаю (пока):

необработанный код сканирования (например, e016)> код ключа (например, 160)> keysym (например, XF86AudioMute)> gnome-settings-daemon (например, увеличение громкости)> сигнал DBus> аппаратный ключ-прослушиватель для notify-osd (или другой программа прослушивания)

Матео
источник
Похоже, это где-то становится! С самого начала помечен как CW, так что я думаю, что вы все еще улучшаете? :)
gertvdijk
да, мне нужно разобраться еще, на диаграмме много вопросительных знаков.
Матео
Вы, кстати, случайно не сделали это в вики-сообществе? Возможно, попросите мод отменить это ... О, и эти графики, скорее всего, немного устарели, потому что HAL уже давно устарел ... Ну, по крайней мере, мы чего-то добиваемся: D
Герхард Бургер
@gertvdijk Я знаю, но было бы стыдно за все упущения, которые он пропустит;)
Герхард Бургер
1

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

Пожалуйста, посмотрите ответ, который я написал на вопрос о резервном копировании сочетаний клавиш в Ubuntu: где хранятся сочетания клавиш GNOME? У меня есть сценарий, который создает резервную копию или восстанавливает все сочетания клавиш, в том числе пользовательские сочетания клавиш. Если вы запустите скрипт, вы увидите, где в dconf хранятся привязки клавиш, и какое приложение получает уведомление о событии ключа.

Стивен Остермиллер
источник
тогда как срабатывают уведомления на рабочем столе?
Герхард Бургер
Я считаю, что демон настройки gnome отвечает за их срабатывание, например, в случае громкости и яркости.
Стивен Остермиллер
2
Я запустил ваш сценарий, но все, что он делает, - это получение ярлыков, к которым вы можете получить доступ через Системные настройки> Клавиатура> Сочетания клавиш. Например, я не нашел ссылки на яркость.
Герхард Бургер
классный скрипт для получения ключей от shoutcut.
Матео
0

Ответ относится к драйверам .

Каждое оборудование должно иметь драйвер для взаимодействия с операционной системой.

Цитирование http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :

Драйвер управляет, управляет, контролирует, направляет и контролирует объект под своей командой. То, что драйвер шины делает с шиной, драйвер устройства делает с компьютерным устройством (любым оборудованием, подключенным к компьютеру), таким как мышь, клавиатура, монитор, жесткий диск, веб-камера, часы и многое другое.

Кроме того, «пилот» может быть человеком или даже автоматической системой, контролируемой человеком (например, системой автопилота в авиалайнерах). Аналогично, конкретная часть аппаратного обеспечения может управляться программным обеспечением (драйвером устройства) или может управляться другим аппаратным устройством, которым, в свою очередь, может управлять программный драйвер устройства. В последнем случае такое управляющее устройство обычно называют контроллером устройства. Это само устройство часто также нуждается в драйвере, который обычно называют драйвером шины.

Устройство имеет регистр устройства, в котором хранятся биты управления / состояния и биты данных. Всякий раз, когда необходимо передать некоторые данные, они обычно отправляются путем установки битов данных.

Поэтому, когда вы нажимаете какую-либо клавишу на клавиатуре, некоторые данные записываются в регистр. Эти биты считываются драйвером устройства, и выполняется соответствующее действие. Это краткое объяснение.

Ссылки:

  • Если вам интересно, я бы порекомендовал вам прочитать эту серию о драйверах устройств, состоящую из 17 хорошо написанных статей linuxforu : http://www.linuxforu.com/tag/linux-device-drivers-series/ .

  • Вы можете прочитать конкретный документ, содержащий инструкции о том, как написать драйвер устройства для клавиатуры USB: http://www.emntech.com/docs/USB_KeyBoard_Driver_eMNTech.pdf

  • Если вам очень нравятся драйверы устройств Linux, прочитайте книгу «Драйверы устройств Linux», которая доступна в формате PDF бесплатно: http://lwn.net/Kernel/LDD3/

зеленый
источник
3
Хм ... Я не думаю, что водители на самом деле имеют какое-либо представление о значении клавиши, которую я нажимаю на клавиатуре. Некоторым специальным устройствам горячих клавиш в ноутбуках может понадобиться драйвер для этого - но это не распространяется на обычные мультимедийные горячие клавиши, такие как «увеличение громкости». Это должно быть охвачено в более общей области ядра / X / DE. Я также думаю, что ссылки на программирование драйвера устройства Linux kerner очень широки.
gertvdijk
Я думаю, что для большинства современных клавиатур Ubuntu использует evdevдрайвер, но я не понимаю, как это было бы полезно здесь ...
Герхард Бургер