LINUX.ORG.RU

Правило для udev: выполнять команду для текущей X-сессии при подключении мыши (Debian 12)

 


1

1

В продолжение Logitech Performance MX: настроить кнопку Zoom как среднюю кнопку мыши

Хочу, чтобы xinput set-button-map "$(xinput list --name-only | grep 'Logitech Performance MX' | xargs -I {} xinput list --id-only {})" 1 2 3 4 5 6 7 8 9 10 11 12 2 14 15 16 17 18 19 20 выполнялось всякий раз при подключении мыши (конкретной модели).

lsusb показывает её ID 062a:4101

Вначале была мысль, сделать правило для udev.

Создал такой /etc/udev/rules.d/PerformanceMX.rule с правами 0644:

ACTION=="add" ATTRS{idProduct}=="062a:4101", RUN+="xinput set-button-map $(xinput list --name-only | grep 'Logitech Performance MX' | xargs -I {} xinput list --id-only {}) 1 2 3 4 5 6 7 8 9 10 11 12 2 14 15 16 17 18 19 20"

Выполнил sudo udevadm control --reload-rules

Но это эффекта не даёт. Я думаю, дело в том, что xinput должен запускаться от текущего пользователя, а не root (может заодно и в том, что я правила для udev пишу неправильно).

Какое корректное решение?

★★★★★

Последнее исправление: eugrus (всего исправлений: 1)

Правила udev, это ‘болезненная’ тема на ЛОРе. Лично видел огромное количество попыток создать работоспособное правило, но тщетно. И помочь то некому, утеряны компетенции. :)

Так то, я сразу вижу у тебя ошибку "ATTRS{idProduct}=="062a:4101", т.к. ID мыши прописываются в ATTRS{idProduct} и ATTRS{idVendor}, но думаю, это не главная проблема.

Имхо, спроси ChatGPT, похоже это остался единственный умник. )

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

Кроме прочего устройство я идентифицировал не верно (не тот донгл).

Вот lsusb -v по правильному:

Bus 003 Device 008: ID 046d:c52b Logitech, Inc. Unifying Receiver
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x046d Logitech, Inc.
  idProduct          0xc52b Unifying Receiver
  bcdDevice           12.10
  iManufacturer           1 Logitech
  iProduct                2 USB Receiver
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0054
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          4 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower               98mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      59
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               8
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      2 Mouse
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     148
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               2
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      93
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0020  1x 32 bytes
        bInterval               2

Пока что вот мой /etc/udev/rules.d/PerformanceMX.rules с учётом всех рекомендаций:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idProduct}=="0xc52b", ATTRS{idVendor}=="0x046d", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/eugrus/.Xauthority", RUN+="/usr/bin/su eugrus -c /usr/bin/performancemx"

Пока не взлетает.

Работоспособность /usr/bin/su eugrus -c /usr/bin/performancemx самого по себе присутствует.

Значения ATTRS{idProduct} и ATTRS{idVendor} теперь хотя бы похожи на правильные?

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

Всм барахлишко? Ты о чём? Открываешь консоль(которая ctrl+alt+F{1,6}) и вводишь свои команды. Ты имей в виду, что когда ты в иксах их вводишь, то у тебя будет переменная DISPLAY, но когда ты запускаешь вне иксов, то этой переменной у тебя не будет и тебе нужно самому её определить.

И да, может быть такая ситуация, что у пользователя запущенно несколько иксов и такую ситуацию тоже неплохо было бы отработать.

u5er
()

ИМХО, этот путь, когда udev выполняет какие-то команды в X-cессии пользователя (определяя дисплй, читая там .Xauthority) неправильный. Скрипт должен запускаться при старте X-сессии и висеть в ожидании, а udev сигналить. Допустим скрипт читает fifo-файл в /tmp, а udev туда пишет, или скрит на Inotify ждёт изменения файла в /tmp, а udev туда пишет дату/время и что-нибудь для отладки.

Ну и такой скрипт спокойно может немного подождать пока X-сервер что-нибудь сделает с настройками мыши и т.д.

mky ★★★★★
()

Есть подозрение, что в udev здесь не нужно ничего делать т.к. libinput взаимодействует с udev

https://wiki.archlinux.org/title/libinput

Возможно тебе нужно добавить в конфиг иксов что-то типа

Section "InputClass"
            Identifier "mouse1"
            MatchProduct "Logitech Performance MX"
            MatchDriver "libinput"
            Option      "ButtonMapping"      "1 2 3 4 5 6 7 8 9 10 11 12 2 14 15 16 17 18 19 20"
EndSection

vel ★★★★★
()

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

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

Работоспособность /usr/bin/su eugrus -c /usr/bin/performancemx самого по себе присутствует.

Вот на подобном все и спотыкатся на ЛОРе. В итоге, пишут сервис (systemd), запускающий скрипт, а уж сам сервис дергается правилом udev.

p.s. Но для данной темы, похоже, это уже не актуально, выше подсказали про libinput.

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

У меня ещё есть другая мышь - и вот там есть «кнопка Windows» и тоже сдохшая средняя кнопка. Хочу там мышиную кнопку Windows сделать средней. Не знаю, получится ли: xinput test выдаёт одинаковый код с кнопкой Super на клавиатуре.

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

кнопка Windows

Это значит, что мышь работает как, по крайней мере, два устройства: мышь и клавиатура. У меня только что не сработало назначение клавиши на кнопку мыши, так что, вероятно, не сработает и в обратную сторону. Точнее, оно в каком-то смысле работает: evtest показывает клавишу, но, возможно, на более высоком уровне где-то фильтруется. Я бы более детально потестил, но в душе не ведаю, как посмотреть события ввода на уровне GNOME/Wayland.

anonymous
()
Ответ на: комментарий от eugrus

Ссылка на руководство: https://wiki.archlinux.org/title/Map_scancodes_to_keycodes#Using_udev

Для кнопок мыши из которых делается ремэп используется префикс «KEYBOARD_KEY_» всегда. Если цель ремэпа кнопка мыши, то, в отличие от клавиш клавиатуры, она задаётся с префиксом «btn_», как «btn_middle».

anonymous
()

Я думаю, дело в том, что xinput должен запускаться от текущего пользователя, а не root

абсолютно не верно, X11 работает по другому, для минимального запуска тебе нужно DISPLAY и доступ на XAUTHORITY

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

ИМХО, этот путь, когда udev выполняет какие-то команды в X-cессии пользователя (определяя дисплй, читая там .Xauthority) неправильный

почему же не правильный, я вот мышкой пользуюсь только когда играю, и при подключении нужно задавать правильную скорость, тут udev и выручает, а как по другому я не знаю

HomerSexual
()