On Wed, Jun 02, 2010 at 04:39:03PM +0600, Andrey Rahmatullin wrote: > On Wed, Jun 02, 2010 at 01:46:29PM +0400, George V. Kouryachy wrote: > > >> 2. Кто при нажатии кнопки на клавиатуре посылает ACPI-сообщение? > > > Понятия не имею; у меня она шлёт 124/XF86Poweroff, но acpid, оказывается, > > > теперь на это тоже реагирует. Не исключаю, что иксы тут вообще ни при чём. > > Вот в этом месте я хотел бы разобраться: > Вообще я не уверен, что это именно acpid, а не кто-то другой дёргает, > скажем, pm-hibernate. > > > acpi-событие происходит потому, что его генерит acpid, или оно > > происходит ещё почему-нибудь, а acpid его только ловит? > acpid ничего не генерит, он слушает /proc/acpi/event и netlink. Уже не только /proc/acpi/event и netlink - сейчас acpid действительно открывает все устройства /dev/input/event* и обрабатывает полученные оттуда события, переводя их внутри в события ACPI; список обрабатываемых кодов можно получить только путём RTFS input_layer.c: /* Event Table: Events we are interested in and their strings. Use evtest.c, acpi_genl, or kacpimon to find new events to add to this table. */ static struct evtab_entry evtab[] = { {{{0,0}, EV_KEY, KEY_POWER, 1}, "button/power PBTN 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_SUSPEND, 1}, "button/suspend SUSP 00000080 00000000"}, {{{0,0}, EV_SW, SW_LID, 1}, "button/lid LID close"}, {{{0,0}, EV_SW, SW_LID, 0}, "button/lid LID open"}, /* blue access IBM button on Thinkpad T42p*/ {{{0,0}, EV_KEY, KEY_PROG1, 1}, "button/prog1 PROG1 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_VENDOR, 1}, "button/vendor VNDR 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_FN_F1, 1}, "button/fnf1 FNF1 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_FN_F2, 1}, "button/fnf2 FNF2 00000080 00000000"}, /* Fn-F2 produces KEY_BATTERY on Thinkpad T42p */ {{{0,0}, EV_KEY, KEY_BATTERY, 1}, "button/battery BAT 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_SCREENLOCK, 1}, "button/screenlock SCRNLCK 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_COFFEE, 1}, "button/coffee CFEE 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_SLEEP, 1}, "button/sleep SBTN 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_WLAN, 1}, "button/wlan WLAN 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_FN_F6, 1}, "button/fnf6 FNF6 00000080 00000000"}, /* procfs on Thinkpad 600X reports "video VID0 00000080 00000000" */ /* typical events file has "video.* 00000080" */ {{{0,0}, EV_KEY, KEY_SWITCHVIDEOMODE, 1}, "video/switchmode VMOD 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_FN_F9, 1}, "button/fnf9 FNF9 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_FN_F10, 1}, "button/fnf10 FF10 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_FN_F11, 1}, "button/fnf11 FF11 00000080 00000000"}, /* Fn-F9 produces KEY_F24 on Thinkpad T42p */ {{{0,0}, EV_KEY, KEY_F24, 1}, "button/f24 F24 00000080 00000000"}, #if 0 /* These "EV_MSC, 4, x" events cause trouble. They are triggered */ /* by unexpected keys on the keyboard. */ /* The 4 is MSC_SCAN, so these are actually scan code events. */ /* EV_MSC, MSC_SCAN, KEY_MINUS This is triggered by the minus key. */ {{{0,0}, EV_MSC, 4, 12}, "button/fnbs FNBS 00000080 00000000"}, /* EV_MSC, MSC_SCAN, KEY_EQUAL Triggered by the equals key. */ {{{0,0}, EV_MSC, 4, 13}, "button/fnins FNINS 00000080 00000000"}, /* EV_MSC, MSC_SCAN, KEY_BACKSPACE Triggered by the backspace key. */ {{{0,0}, EV_MSC, 4, 14}, "button/fndel FNDEL 00000080 00000000"}, /* EV_MSC, MSC_SCAN, KEY_E Triggered by the 'E' key. */ {{{0,0}, EV_MSC, 4, 18}, "button/fnpgdown FNPGDOWN 00000080 00000000"}, #endif {{{0,0}, EV_KEY, KEY_ZOOM, 1}, "button/zoom ZOOM 00000080 00000000"}, /* typical events file has "video.* 00000087" */ {{{0,0}, EV_KEY, KEY_BRIGHTNESSDOWN, 1}, "video/brightnessdown BRTDN 00000087 00000000"}, /* typical events file has "video.* 00000086" */ {{{0,0}, EV_KEY, KEY_BRIGHTNESSUP, 1}, "video/brightnessup BRTUP 00000086 00000000"}, {{{0,0}, EV_KEY, KEY_KBDILLUMTOGGLE, 1}, "button/kbdillumtoggle KBILLUM 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_VOLUMEDOWN, 1}, "button/volumedown VOLDN 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_VOLUMEUP, 1}, "button/volumeup VOLUP 00000080 00000000"}, {{{0,0}, EV_KEY, KEY_MUTE, 1}, "button/mute MUTE 00000080 00000000"}, /* additional events divined from the kernel's video.c */ {{{0,0}, EV_KEY, KEY_VIDEO_NEXT, 1}, "video/next NEXT 00000083 00000000"}, {{{0,0}, EV_KEY, KEY_VIDEO_PREV, 1}, "video/prev PREV 00000084 00000000"}, {{{0,0}, EV_KEY, KEY_BRIGHTNESS_CYCLE, 1}, "video/brightnesscycle BCYC 00000085 00000000"}, {{{0,0}, EV_KEY, KEY_BRIGHTNESS_ZERO, 1}, "video/brightnesszero BZRO 00000088 00000000"}, {{{0,0}, EV_KEY, KEY_DISPLAY_OFF, 1}, "video/displayoff DOFF 00000089 00000000"} }; Таблица событий не настраивается, список устройств - тоже (всегда открываются все доступные устройства, причём даже обрабатывается подключение новых устройств после запуска acpid), вызов open_input() выполняется всегда при использовании опции -n (либо даже без неё, если не обнаружен /proc/acpi/event), а опция -n прибита гвоздями в скрипте запуске /etc/init.d/acpid. Таким образом, чтобы кнопка Power на клавиатуре не обрабатывалась acpid, теперь придётся назначать ей код, отличающийся от KEY_POWER и других кодов, обрабатываемых acpid (например, с помощью setkeycodes, или через ioctl EVIOCSKEYCODE для отдельного устройства /dev/input/event*). Правда, при активном X-сервере acpid по идее не должен получать события из /dev/input/event*, поскольку X использует ioctl EVIOCGRAB для монопольного использования устройств ввода, и в этом состоянии до других клиентов события ввода доходить не должны.