Изменения с xinput случайным образом возвращаются к значениям по умолчанию

Я использую Kubuntu 16.04 (xenial) на ноутбуке с сенсорным экраном ELAN вместе с активным стилусом DELL 750-AAHC. Одна из кнопок на стилусе работает как средняя кнопка мыши, и я хочу, чтобы она была правой кнопкой.

Я могу добиться этого, делая

$ xinput set-button-map "ELAN Touchscreen Pen" 1 3 2

(то есть, сопоставление функции кнопки 3, которая должна соответствовать правой кнопке, физической кнопке 2).

Это делает то, что я хочу, но изменение не является постоянным.

Я добавил команду в ~/.xsessionrc (согласно ответу на этот пост), поэтому он запускается автоматически, когда я перезагружаюсь, но отображение кнопки "случайно" возвращается к значению по умолчанию само по себе: какое-то время оно работает, как и ожидалось, и вдруг я обнаруживаю, что это не так, так я получаю

$ xinput get-button-map "ELAN Touchscreen Pen"
1 2 3 4 5

и я должен переназначить его вручную.

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

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

ВАЖНОЕ ОБНОВЛЕНИЕ:

Я обнаружил, что эта проблема не относится к стилусу: ранее я по какой-то причине отключил функцию сенсорного экрана ("ELAN Touchscreen"), выполнив:

$ xinput disable "ELAN Touchscreen"

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

ОБНОВЛЕНИЕ 2

Я нашел несколько подозрительных записей в /var/log/syslog когда это случилось снова. Метки времени были в то время, когда я некоторое время фактически не пользовался ноутбуком, поэтому, вероятно, были включены функции энергосбережения (у меня "тусклый экран" через 9 минут и "выключение" через 10 минут; я буду экспериментировать с энергией сохранение и обновление соответственно).

Шаблон ниже фактически повторяется много раз, с разницей в несколько секунд между каждым блоком.

usb 1-8: USB disconnect, device number 18
usb 1-8: new full-speed USB device number 19 using xhci_hcd
usb 1-8: New USB device found, idVendor=04f3, idProduct=2073
usb 1-8: New USB device strings: Mfr=4, Product=14, SerialNumber=0
usb 1-8: Product: Touchscreen
usb 1-8: Manufacturer: ELAN
input: ELAN Touchscreen Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7548
input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7549
input: ELAN Touchscreen Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7552
hid-multitouch 0003:04F3:2073.04EE: input,hiddev0,hidraw0: USB HID v1.10 Keyboard [ELAN Touchscreen] on usb-0000:00:14.0-8/input0

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

usb 1-8: USB disconnect, device number 19
usb 1-8: new full-speed USB device number 20 using xhci_hcd
usb 1-8: New USB device found, idVendor=04f3, idProduct=2073
usb 1-8: New USB device strings: Mfr=4, Product=14, SerialNumber=0
usb 1-8: Product: Touchscreen
usb 1-8: Manufacturer: ELAN
input: ELAN Touchscreen Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7554
input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7555
input: ELAN Touchscreen Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7558
hid-mul itouch 0003:04F3:2073.04EF: input,hiddev0,hidraw0: USB HID v1.10 Keyboard [ELAN Touchscreen] on usb-0000:00:14.0-8/input0

Номера устройств оборачиваются на 128.

Система:

  • KDE Plasma 5.5.5
  • Qt 5.5.1
  • Ядро 4.13.0-32-generiC#35~16.04.1-Ubuntu 64-bit
  • версия 1.6.2 для xinput

    XI версия на сервере: 2.3

  • X.Org X Server 1.19.5

    Дата выхода: 2017-10-12

    Протокол X Версия 11, Редакция 0

1 ответ

Решение

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

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

sudo nano /etc/udev/rules.d/10-custom-elan.rules

и добавьте эту строку, которая содержит информацию "idVendor" и "idProduct" (из вашего системного журнала). Необходимо использовать абсолютный путь к "elan.sh".

ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2073", RUN+="/home/username/elan.sh"

(что примерно соответствует "", когда устройство, соответствующее указанным атрибутам найдено, запускает указанный сценарий ").

Затем создайте реальный скрипт для запуска xinput:

nano /home/username/elan.sh 

со следующими строками:

#!/usr/bin/env bash

#These lines allow the script to be called by udev rules
export DISPLAY=":0"
export XAUTHORITY="/home/username/.Xauthority"

#Command to remap buttons
xinput set-button-map "ELAN Touchscreen Pen" 1 3 2 4 5

И, конечно, сделать его исполняемым:

chmod +x /home/username/elan.sh

Без строк экспорта скрипт работает при непосредственном вызове вами (активным пользователем), но не работает при вызове udev (пользователем root). Подробности можно найти в этом и в этом ответе, но вот краткое резюме:

Чтобы запустить графическую программу на рабочем столе пользователя, вам нужны две вещи: адрес (на котором отображается рабочий стол пользователя) и авторизация. Когда пользователь входит в систему, менеджер входа в систему авторизует соединение с X-сервером, генерируя cookie, добавляя его на сервер и передавая его пользователю, записывая его в $HOME/.Xauthority. Таким образом, пользователь root должен иметь возможность подключиться, зная дисплей, используемый пользователем, и имея доступ к cookie-файлам Xauthority. Это то, чего достигают экспортные линии.

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

Другие вопросы по тегам