LINUX.ORG.RU

X11 и переключение раскладки, серия 6383

 , , ,


0

1

Приветствую.

По какой-то причине настройки клавиатуры внутри /etc/X11/xorg.conf:

Section "InputDevice"
        Identifier      "Keyboard0"

        Driver          "evdev"
        Option          "Device"        "/dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd"

        Option          "XkbRules"      "xorg"
        Option          "XkbModel" "pc105"
        Option          "XkbLayout" "us,ru"
        Option          "XkbVariant" ",winkeys"
        Option          "XkbOptions" "altwin:meta_win,compose:ralt,grp:menu_toggle,grp:rctrl_switch,grp:sclk_toggle,grp_led:scroll,terminate:ctrl_alt_bksp"
EndSection

не работают должным образом (ну, т. е., не включается переназначение Meta на Win, игнорируется Ctrl+Alt+Backspace и т. д.), так что приходится всё дублировать в ~/.xinitrc:

setxkbmap -option
setxkbmap -option altwin:meta_win
setxkbmap -option compose:ralt
setxkbmap -option grp:menu_toggle
setxkbmap -option grp:rctrl_switch
setxkbmap -option grp:sclk_toggle
setxkbmap -option grp_led:scroll
setxkbmap -option terminate:ctrl_alt_bksp

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

[    47.750] (**) |-->Input Device "Keyboard0"
[    47.766] (WW) Hotplugging is on, devices using drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.
[    48.088] (II) Using input driver 'evdev' for 'Keyboard0'
[    48.088] (**) Option "CoreKeyboard"
[    48.088] (**) Keyboard0: always reports core events
[    48.088] (**) evdev: Keyboard0: Device: "/dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd"
[    48.088] (--) evdev: Keyboard0: Vendor 0x46d Product 0xc31d
[    48.088] (--) evdev: Keyboard0: Found keys
[    48.088] (II) evdev: Keyboard0: Configuring as keyboard
[    48.088] (II) XINPUT: Adding extended input device "Keyboard0" (type: KEYBOARD, id 6)
[    48.088] (**) Option "xkb_rules" "evdev"
[    48.088] (**) Option "xkb_model" "pc105"
[    48.088] (**) Option "xkb_layout" "us,ru"
[    48.088] (**) Option "xkb_variant" ",winkeys"
[    48.088] (**) Option "xkb_options" "altwin:meta_win,compose:ralt,grp:menu_toggle,grp:rctrl_switch,grp:sclk_toggle,grp_led:scroll,terminate:ctrl_alt_bksp"
[    48.103] (**) Power Button: Applying InputClass "evdev keyboard catchall"
[    48.103] (**) Power Button: Applying InputClass "libinput keyboard catchall"
[    48.106] (II) input device 'Power Button', /dev/input/event6 is tagged by udev as: Keyboard
[    48.106] (II) input device 'Power Button', /dev/input/event6 is a keyboard
[    48.132] (II) XINPUT: Adding extended input device "Power Button" (type: KEYBOARD, id 7)
[    48.132] (**) Option "xkb_model" "pc105"
[    48.132] (**) Option "xkb_layout" "us,ru"
[    48.132] (**) Option "xkb_variant" ","
[    48.132] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.155] (II) input device 'Power Button', /dev/input/event6 is tagged by udev as: Keyboard
[    48.155] (II) input device 'Power Button', /dev/input/event6 is a keyboard
[    48.155] (**) Video Bus: Applying InputClass "evdev keyboard catchall"
[    48.156] (**) Video Bus: Applying InputClass "libinput keyboard catchall"
[    48.156] (II) input device 'Video Bus', /dev/input/event16 is tagged by udev as: Keyboard
[    48.156] (II) input device 'Video Bus', /dev/input/event16 is a keyboard
[    48.176] (II) XINPUT: Adding extended input device "Video Bus" (type: KEYBOARD, id 8)
[    48.176] (**) Option "xkb_model" "pc105"
[    48.176] (**) Option "xkb_layout" "us,ru"
[    48.176] (**) Option "xkb_variant" ","
[    48.176] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.176] (II) input device 'Video Bus', /dev/input/event16 is tagged by udev as: Keyboard
[    48.176] (II) input device 'Video Bus', /dev/input/event16 is a keyboard
[    48.176] (**) Power Button: Applying InputClass "evdev keyboard catchall"
[    48.176] (**) Power Button: Applying InputClass "libinput keyboard catchall"
[    48.176] (II) input device 'Power Button', /dev/input/event4 is tagged by udev as: Keyboard
[    48.176] (II) input device 'Power Button', /dev/input/event4 is a keyboard
[    48.192] (II) XINPUT: Adding extended input device "Power Button" (type: KEYBOARD, id 9)
[    48.192] (**) Option "xkb_model" "pc105"
[    48.192] (**) Option "xkb_layout" "us,ru"
[    48.192] (**) Option "xkb_variant" ","
[    48.192] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.192] (II) input device 'Power Button', /dev/input/event4 is tagged by udev as: Keyboard
[    48.192] (II) input device 'Power Button', /dev/input/event4 is a keyboard
[    48.192] (**) Sleep Button: Applying InputClass "evdev keyboard catchall"
[    48.192] (**) Sleep Button: Applying InputClass "libinput keyboard catchall"
[    48.193] (II) input device 'Sleep Button', /dev/input/event5 is tagged by udev as: Keyboard
[    48.193] (II) input device 'Sleep Button', /dev/input/event5 is a keyboard
[    48.208] (II) XINPUT: Adding extended input device "Sleep Button" (type: KEYBOARD, id 10)
[    48.208] (**) Option "xkb_model" "pc105"
[    48.208] (**) Option "xkb_layout" "us,ru"
[    48.208] (**) Option "xkb_variant" ","
[    48.208] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.208] (II) input device 'Sleep Button', /dev/input/event5 is tagged by udev as: Keyboard
[    48.208] (II) input device 'Sleep Button', /dev/input/event5 is a keyboard
[    48.209] (II) config/udev: Adding input device Logitech USB Keyboard (/dev/input/event1)
[    48.209] (**) Logitech USB Keyboard: Applying InputClass "evdev keyboard catchall"
[    48.209] (**) Logitech USB Keyboard: Applying InputClass "libinput keyboard catchall"
[    48.209] (II) Using input driver 'libinput' for 'Logitech USB Keyboard'
[    48.209] (**) Logitech USB Keyboard: always reports core events
[    48.210] (II) input device 'Logitech USB Keyboard', /dev/input/event1 is tagged by udev as: Keyboard
[    48.210] (II) input device 'Logitech USB Keyboard', /dev/input/event1 is a keyboard
[    48.224] (II) XINPUT: Adding extended input device "Logitech USB Keyboard" (type: KEYBOARD, id 11)
[    48.224] (**) Option "xkb_model" "pc105"
[    48.224] (**) Option "xkb_layout" "us,ru"
[    48.224] (**) Option "xkb_variant" ","
[    48.224] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.224] (II) input device 'Logitech USB Keyboard', /dev/input/event1 is tagged by udev as: Keyboard
[    48.224] (II) input device 'Logitech USB Keyboard', /dev/input/event1 is a keyboard
[    48.224] (II) config/udev: Adding input device Logitech USB Keyboard (/dev/input/event2)
[    48.224] (**) Logitech USB Keyboard: Applying InputClass "evdev keyboard catchall"
[    48.224] (**) Logitech USB Keyboard: Applying InputClass "libinput keyboard catchall"
[    48.224] (II) Using input driver 'libinput' for 'Logitech USB Keyboard'
[    48.224] (**) Logitech USB Keyboard: always reports core events
[    48.225] (II) input device 'Logitech USB Keyboard', /dev/input/event2 is tagged by udev as: Keyboard
[    48.225] (II) input device 'Logitech USB Keyboard', /dev/input/event2 is a keyboard
[    48.240] (II) XINPUT: Adding extended input device "Logitech USB Keyboard" (type: KEYBOARD, id 12)
[    48.240] (**) Option "xkb_model" "pc105"
[    48.240] (**) Option "xkb_layout" "us,ru"
[    48.240] (**) Option "xkb_variant" ","
[    48.240] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.241] (II) input device 'Logitech USB Keyboard', /dev/input/event2 is tagged by udev as: Keyboard
[    48.241] (II) input device 'Logitech USB Keyboard', /dev/input/event2 is a keyboard
[    48.394] (**) Logitech Logitech USB Headset: Applying InputClass "evdev keyboard catchall"
[    48.394] (**) Logitech Logitech USB Headset: Applying InputClass "libinput keyboard catchall"
[    48.395] (II) input device 'Logitech Logitech USB Headset', /dev/input/event0 is tagged by udev as: Keyboard
[    48.395] (II) input device 'Logitech Logitech USB Headset', /dev/input/event0 is a keyboard
[    48.408] (II) XINPUT: Adding extended input device "Logitech Logitech USB Headset" (type: KEYBOARD, id 14)
[    48.408] (**) Option "xkb_model" "pc105"
[    48.408] (**) Option "xkb_layout" "us,ru"
[    48.408] (**) Option "xkb_variant" ","
[    48.408] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.409] (II) input device 'Logitech Logitech USB Headset', /dev/input/event0 is tagged by udev as: Keyboard
[    48.409] (II) input device 'Logitech Logitech USB Headset', /dev/input/event0 is a keyboard
[    48.415] (II) config/udev: Adding input device ACPI Virtual Keyboard Device (/dev/input/event20)
[    48.415] (**) ACPI Virtual Keyboard Device: Applying InputClass "evdev keyboard catchall"
[    48.415] (**) ACPI Virtual Keyboard Device: Applying InputClass "libinput keyboard catchall"
[    48.415] (II) Using input driver 'libinput' for 'ACPI Virtual Keyboard Device'
[    48.415] (**) ACPI Virtual Keyboard Device: always reports core events
[    48.415] (II) input device 'ACPI Virtual Keyboard Device', /dev/input/event20 is tagged by udev as: Keyboard
[    48.416] (II) input device 'ACPI Virtual Keyboard Device', /dev/input/event20 is a keyboard
[    48.436] (II) XINPUT: Adding extended input device "ACPI Virtual Keyboard Device" (type: KEYBOARD, id 15)
[    48.436] (**) Option "xkb_model" "pc105"
[    48.436] (**) Option "xkb_layout" "us,ru"
[    48.436] (**) Option "xkb_variant" ","
[    48.436] (**) Option "xkb_options" "grp:rctrl_toggle,grp_led:scroll"
[    48.436] (II) input device 'ACPI Virtual Keyboard Device', /dev/input/event20 is tagged by udev as: Keyboard
[    48.436] (II) input device 'ACPI Virtual Keyboard Device', /dev/input/event20 is a keyboard

Ну и в том же самом логе многократно в процессе работы:

[2021148.899] (II) input device 'Power Button', /dev/input/event6 is tagged by udev as: Keyboard
[2021148.899] (II) input device 'Power Button', /dev/input/event6 is a keyboard
[2021148.900] (II) input device 'Video Bus', /dev/input/event16 is tagged by udev as: Keyboard
[2021148.900] (II) input device 'Video Bus', /dev/input/event16 is a keyboard
[2021148.900] (II) input device 'Power Button', /dev/input/event4 is tagged by udev as: Keyboard
[2021148.900] (II) input device 'Power Button', /dev/input/event4 is a keyboard
[2021148.901] (II) input device 'Sleep Button', /dev/input/event5 is tagged by udev as: Keyboard
[2021148.901] (II) input device 'Sleep Button', /dev/input/event5 is a keyboard
[2021148.902] (II) input device 'Logitech USB Keyboard', /dev/input/event1 is tagged by udev as: Keyboard
[2021148.902] (II) input device 'Logitech USB Keyboard', /dev/input/event1 is a keyboard
[2021148.902] (II) input device 'Logitech USB Keyboard', /dev/input/event2 is tagged by udev as: Keyboard
[2021148.902] (II) input device 'Logitech USB Keyboard', /dev/input/event2 is a keyboard
[2021148.903] (II) input device 'Logitech Logitech USB Headset', /dev/input/event0 is tagged by udev as: Keyboard
[2021148.903] (II) input device 'Logitech Logitech USB Headset', /dev/input/event0 is a keyboard
[2021148.904] (II) input device 'ACPI Virtual Keyboard Device', /dev/input/event20 is tagged by udev as: Keyboard
[2021148.904] (II) input device 'ACPI Virtual Keyboard Device', /dev/input/event20 is a keyboard

Как можно дальше продиагностировать это поведение?

Хочется однократно задать настройки клавиатуры для всех пользователей, а не носить ~/.xinitrc туда-сюда.

★★★★

Ничего не тестировал, поэтому просто умозрительно. Чтобы ракладка приложилась к нужной тебе клавиатуре , тебе надо написать правило

Section InputClass
...
EndSection

В этом правиле при помощи matching rules нацелиться на свою клавиатуру Logitech USB Keyboard и приложить опции к ней, а то есть какой-то предположение, что прикладывания к дальнейшим устройствам ввода сбивает настройки. Когда же ты делаешь вручную, то уже делаешь настройку ПОСЛЕ автоматический и поэтому она работает, так как последняя. Пробуй. Потом расскажешь.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Евгений, спасибо.

На самом деле, у меня есть предположение, что автоматически добавленные (посредством /usr/share/X11/xorg.conf.d/10-evdev.conf) устройства:

$ xinput --list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse                  id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Keyboard0                                 id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Power Button                              id=9    [slave  keyboard (3)]
    ↳ Sleep Button                              id=10   [slave  keyboard (3)]
    ↳ Logitech USB Keyboard                     id=11   [slave  keyboard (3)]
    ↳ Logitech USB Keyboard                     id=12   [slave  keyboard (3)]
    ↳ Logitech Logitech USB Headset             id=14   [slave  keyboard (3)]
    ↳ ACPI Virtual Keyboard Device              id=15   [slave  keyboard (3)]

портят мне всю малину. Как вообще отключить к чертям вот эти все «умные» правила, дабы они не мешали моей ручной конфигурации?

Народ в сети советует снести xorg.conf.d/ целиком, но мне такой подход не нравится.

Bass ★★★★ ()
Ответ на: комментарий от Bass

Ну вот и видно, что они все клавиатуры. Так они о себе рассказывают сами. Конечно, есть вариант - убрать все и настроить в xinitrc командами. В случае автоматической настройки иксы не знают, к какой именно клавиатуре надо пришивать настройки, поэтому пришивает что-то ко всем. Так как времена изменились со времен появления секции InputDevice, то сейчас лучше использовать InputClass от более общих к частным.

The config file may have multiple InputClass sections.  These  sections
are optional and are used to provide configuration for a class of input
devices as they are automatically added. An input device can match more
than  one  InputClass  section. Each class can override settings from a
previous class, so it is best to arrange the  sections  with  the  most
generic matches first.

Секция InputDevice тогда будет не нужна, ее можно закомментировать. Можно правило по названию «Logitech USB Keyboard» и по USB ID. Но у тебя две клавиатуры. Надо глянуть свойства этих двух клавиатур и написать правило, чтобы выбрать одну. А, может, просто по названию будет работать и не надо второго правила.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Всё, проблема решена.

Добавление след. секции:

Section "InputClass"
        Identifier      "Ignored input devices"
        MatchDevicePath "/dev/input/event*"
        Driver          "evdev"
        Option          "Ignore" "True"
EndSection

отключило автоопределение из /usr/share/X11/xorg.conf.d/10-evdev.conf (до этого клавиатура, заданная вручную, фактически конфликтовала с автоопределённой).

После этого (идентификаторы я переименовал для ясности):

$ xinput --list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse (Manual)         id=6    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Logitech USB Keyboard (Manual)            id=7    [slave  keyboard (3)]

Евгений, ещё раз спасибо!

+много тебе в карму =)

Bass ★★★★ ()
Ответ на: комментарий от Bass

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

Может, все же просто убрать секцию InputDevice и сделать секцию InputClass:

Section InputClass
    Identifier "Logitech USB Keyboard"
    MatchIsKeyboard  "on"
    MatchProduct    "Logitech USB Keyboard"
    Option          "XkbRules"      "xorg"
    Option          "XkbModel" "pc105"
    Option          "XkbLayout" "us,ru"
    Option          "XkbVariant" ",winkeys"
    Option          "XkbOptions" "altwin:meta_win,compose:ralt,grp:menu_toggle,grp:rctrl_switch,grp:sclk_toggle
EndSection

Это не заработает? (я просто вслепую пишу).

Zubok ★★★★★ ()
Ответ на: комментарий от Bass

Я думаю, что ты мог бы также попробовать расширить правило, убрав конкретное название продукта. То есть просто проверить с правилом MatchIsKeyboard "on". Если это пройдет, то фактически любая клавиатура, которая может быть подключена к компьютеру, а не только Logitech, динамически будет настроена соответствующим образом. Те клавиатуры, которые не понимают эти опции (PowerButton, Headset и т .д.), они просто их не примут, проигнорируют. Можешь попробовать.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Bass

Да, ну и в догонку. В тегах у тебя есть Debian 9. В Debian есть файл /etc/default/keyboard, в котором ты можешь указать эти опции и вот этот документ /usr/share/doc/keyboard-configuration/README.Debian . Этот файл может быть сконфигурирован и так:

# dpkg-reconfigure keyboard-configuration

Дальше можно попробовать загрузиться даже без секции InputClass.

Zubok ★★★★★ ()