[Решено:]Кнопка Power на клавиатуре (как отключить кнопку на клавиатуре, не отключая кнопку на системном блоке)

Здесь можно поговорить о чём угодно и сколько угодно.

Модератор: Модераторы разделов

Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

[Решено:]Кнопка Power на клавиатуре

Сообщение Hephaestus »

Есть на некоторых клавиатурах такая "волшебная" кнопка.
У меня это выглядит примерно так:
Spoiler
Я бы выбил каленым железом
Зубы все тому человеку,
Кто придумал на клавиатуре
Кнопку Power рядом с Delete.

Источник стихов мне неизвестен.
Промахнуться случалось всего пару раз, но всё-таки случалось.
Все поиски на тему "как это отключить" приводили к решениям на уровне управления питанием.
Но это не очень подходит, потому вместе с кнопкой Power на клавиатуре отключается кнопка Power на системном блоке.
Да, xev показывает для них один и тот же код.
Конечно, можно прибегнуть к механическим вариантам решения вопроса.
Но меня интересует, как отключить кнопку именно как часть клавиатуры.
Ну, то есть указать системе, что у меня клавиатура без этих кнопок.
Например: загружен соответствующий модуль ядра, система "думает", что этих кнопок на клавиатуре нет,
в результате они не обрабатываются.
Возможно такое?
Поиск по гуглам результатов как-то не дал.

Поэтому прошу меня просветить по данному вопросу.
Последний раз редактировалось Hephaestus 20.06.2020 01:13, всего редактировалось 1 раз.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21365
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Кнопка Power на клавиатуре

Сообщение Bizdelnick »

Вроде бы, поведение этой клавиши должно настраиваться на уровне DE. Она работает в голой консоли?
Добавлено (14:42):
Можно попробовать что-нибудь вроде xmodmap -e 'keycode 124 ='
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Кнопка Power на клавиатуре

Сообщение Hephaestus »

Bizdelnick писал:
19.06.2020 14:32
Она работает в голой консоли?
Да.
Настроено это не на уровне DE.

/etc/acpi/events/default

# This is the ACPID default configuration, it takes all
# events and passes them to /etc/acpi/default.sh for further
# processing.

# event keeps a regular expression matching the event. To get
# power events only, just use something like "event=button power.*"
# to catch it.
# action keeps the command to be executed after an event occurs
# In case of the power event above, your entry may look this way:
#event=button power.*
#action=/sbin/init 0

# Optionally you can specify the placeholder %e. It will pass
# through the whole kernel event message to the program you've
# specified.

event=.*
action=/etc/acpi/acpi_handler.sh %e

/etc/acpi/acpi_handler.sh

#!/bin/sh
# Default acpi script that takes an entry for all actions

IFS=${IFS}/
set $@

case "$1" in
button)
case "$2" in
power) /sbin/init 0
;;
*) logger "ACPI action $2 is not defined"
;;
esac
;;
*)
logger "ACPI group $1 / action $2 is not defined"
;;
esac
Если этот скрипт лишить прав на исполнение, кнопка на клавиатуре перестает действовать,
но также перестает действовать и кнопка на системном блоке.
Когда я обнаружил это в первый раз, появилась мысль, что кнопка на клавиатуре и на системном блоке - это одна и та же кнопка с точки зрения ОС.

И действительно, xev показывает один и тот же код
(логи сняты при отключенном скрипте, так как при включенном кнопка срабатывает
по прямому назначению):

Shell

KeyPress event, serial 35, synthetic NO, window 0x1a00001,
root 0x4a0, subw 0x0, time 1390181, (71,-447), root:(72,5),
state 0x0, keycode 124 (keysym 0x1008ff2a, XF86PowerOff), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 35, synthetic NO, window 0x1a00001,
root 0x4a0, subw 0x0, time 1390397, (71,-447), root:(72,5),
state 0x0, keycode 124 (keysym 0x1008ff2a, XF86PowerOff), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

MappingNotify event, serial 35, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248

KeyPress event, serial 35, synthetic NO, window 0x1a00001,
root 0x4a0, subw 0x0, time 1395781, (71,-447), root:(72,5),
state 0x0, keycode 124 (keysym 0x1008ff2a, XF86PowerOff), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 35, synthetic NO, window 0x1a00001,
root 0x4a0, subw 0x0, time 1395781, (71,-447), root:(72,5),
state 0x0, keycode 124 (keysym 0x1008ff2a, XF86PowerOff), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
Первые две записи - нажание кнопки на клавиатуре.
Последние две - на системном блоке.
Между ними проскакивает MappingNotify.
Никаких признаков, позволяющих эти кнопки различить, я не вижу. Это действительно одна и та же кнопка.

Отсюда и возникает идея отключить это на уровне драйвера клавиатуры, а не системы управления питанием.
Но вот насколько это реально, я пока не понял.

В Сети я как-то раз наткнулся на похожее решение, но под Win: некий энтузиаст,
расковыряв драйвер клавиатуры, сотворил "фильтр" - модуль,
который перехватывал нажатие кнопки на клавиатуре и отменял действие.
При этом кнопка на системном блоке по замыслу должна оставаться рабочей.
Но там WinAPI.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21365
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Кнопка Power на клавиатуре

Сообщение Bizdelnick »

Так xmodmap не пробовали? По крайней мере в иксах должно отрубить.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 904
ОС: debian, fedora (i3-wm)

Re: Кнопка Power на клавиатуре

Сообщение olecya »

Мне никогда не попадалась такая клавиатура но хочу описать один вариант, может он будет применим к вашему случаю.
Нужно было поработать с буфером в голой консоли без мультиплексера. Поэтому чтобы быстрее переключаться по виртуальным
консолям я оставила только клавиши Fn без модификатора. Я уже не помню всех тонкостей как я все это состряпала но работало все исправно.
Первый файл это юнит системд с правами 664

Shell

cat /etc/systemd/system/loadkeys.service

Код: Выделить всё

[Unit]
Description="Loadkeys virt_consoles"

[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/bin/loadkeys /usr/local/etc/myownkeys.txt

[Install]
WantedBy=multi-user.target
Привожу просто свой вариант как есть.
Второй файл с новым определением клавиш, так же с правами 664:

Shell

cat /usr/local/etc/myownkeys.txt

Код: Выделить всё

keycode 59 = Console_1
keycode 60 = Console_2
keycode 61 = Console_3
keycode 62 = Console_4
keycode 63 = Console_5
keycode 64 = Console_6

Shell

sudo systemctl enable loadkeys.service
Теперь при загрузке в multi-user.target или просто переключении в
консоль из графики обычным сочетанием клавиш Alt+Ctrl+Fn в дальнейшем будет действовать
новое правило переключения между консолями по нажатию одной из шести клавиш F1-F6.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Кнопка Power на клавиатуре

Сообщение Hephaestus »

Bizdelnick писал:
19.06.2020 19:30
Так xmodmap не пробовали? По крайней мере в иксах должно отрубить.
Попробовал. Не помогло. Демон acpid работает на более низком уровне.
Кстати, я не очень понял, какой должен был быть эффект от команды xmodmap -e 'keycode 124 ='.
Это ведь всего лишь переназначение действия клавиши на "пустое значение".
Но на этой клавише и так нет никакого действия.
Демоном acpi обрабатывается сам факт нажатия клавиши, а не то, что выполняется замапленное действие.
В картах keymap, к примеру, код 124 пустой.
Это, кстати, ставит под сомнение мою гипотезу о том, что на уровне ядерного модуля клавиатуры можно что-то решить.

Проблема не в том, что надо переназначить клавишу.
Проблема в том, что кнопка на системном блоке и клавиша на клавиатуре воспринимаются как одно и то же.
Я надеялся, что есть какой-то способ их различить. Пока не нашёл.
Неплохо было бы при обработке события учесть источник ("клавиатура" или "не клавиатура").

olecya
Насколько я понял, суть Вашей идеи в том же: переназначение клавиши.
Но как я уже сказал, проблема немного не в этом.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3126
ОС: Gentoo

Re: Кнопка Power на клавиатуре

Сообщение ormorph »

Hephaestus писал:
19.06.2020 20:52
Кстати, я не очень понял, какой должен был быть эффект от команды xmodmap -e 'keycode 124 ='.
xev должен показать что изменится. У вас показывает, что 124 указывает на XF86PowerOff, например у меня это прописано в файлах:

Shell

/usr/share/X11/xkb/keycodes/evdev: <POWR> = 124;
/usr/share/X11/xkb/symbols/inet: key <POWR> { [ XF86PowerOff ] };
Собственно DE реагирует не на сам keycode, а на его определение XF86PowerOff .
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21365
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Кнопка Power на клавиатуре

Сообщение Bizdelnick »

Hephaestus, посмотрите, что там в этом самом event. Скрипт написан так, будто предполагается наличие чего-то ещё после button power. Возможно, там и обнаружится что-то, позволяющее отличить кнопку на системнике от кнопки на клавиатуре.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Кнопка Power на клавиатуре

Сообщение Hephaestus »

Получилось.

Отслеживание событий acpid показало, что при нажатии кнопки на клавиатуре
возникает событие

Shell

acpid: received input layer event "button/power PBTN 00000080 00000000 K"
а при нажатии кнопки на системном блоке
возникает событие

Shell

acpid: received netlink event "button/power LNXPWRBN:00 00000080 00000006"
стало быть, они всё-таки различаются.

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

Всем спасибо.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали: