Непоследовательная мышь X событий для Acer T231H мультисенсорный монитор

Похож на ошибку

Хорошо, я полагаю, что это - ошибка в Xorg evdev драйвер, но поскольку ошибка человечности для точного так попросила, чтобы я работал эта канавка каналы поддержки, я сначала пошел, муравей сообщил об этом здесь. Тем временем я обновил до quantal и сообщил о надлежащей ошибке, но если бы у кого-то от сообщества поддержки должен быть ответ, который не потерялся бы также. (Абзац был отредактирован для обращения к ошибке, о которой сообщают),

Установка

Это - Ubuntu 12.04, точная подключенный к Acer T231H мультисенсорный монитор. На самом деле я встретился с этим больше чем на одной установке ОС, одном из них сделанный через debootstrap. Пакеты включили:

  • xserver-xorg-input-evdev 1:2.7.0-0ubuntu1
  • изображение Linux - *-generic 3.2.0-24.39 на один и 3.2.0-25 в другой системе

Признак

События от нажатия мыши как X отправляют их в приложения, непоследовательны. Это может быть отлажено с помощью xev.

Первому касанию экрана предшествует событие MotionNotify, которое уже имеет состояние 0x100, т.е. нажатая левая кнопка мыши. После этого прибывает событие ButtonPress, снова с состоянием 0x100, хотя то значение должно указать на состояние кнопок, прежде чем событие имело место. Последующее перетаскивание в порядке, и ButtonRelease также, но 0x100 битов в значении состояния никогда не будут становиться нулем снова.

Даже если мне подключат обычную мышь также, то она впредь сообщит о каждом перемещении, как будто я подавлял левую кнопку мыши. Единственное средство исправления, которое я мог найти, перезапускало X-сервер. Вместе с событиями ButtonPress и ButtonRelease этот постоянный бит для левой кнопки мыши составляет непоследовательное создание отчетов состояния кнопки.

JAVA-приложения, например, сообщат о каждом перемещении как о перетаскивании из-за этой проблемы с серьезными последствиями для управления фокусом. Это делает использование differenent частями приложения почти невозможный, поскольку о движении мыши только сообщат компоненту, где мышь ввела окно приложения.

Сравнение ожидаемого и фактического поведения

Ожидаемое поведение:

  1. MotionNotify с состоянием 0x000 при перетаскивании обычной мыши
  2. MotionNotify с состоянием 0x000 для перемещения до касания или никакого события вообще
  3. ButtonPress с состоянием 0x000 при касании экрана
  4. MotionNotify с состоянием 0x100 при перетаскивании пальца
  5. ButtonRelease с состоянием 0x100, шевеля пальцем
  6. MotionNotify с состоянием 0x000 при перетаскивании обычной мыши впоследствии

Фактическое поведение:

  1. MotionNotify с состоянием 0x000 при перетаскивании обычной мыши перед первым касанием
  2. MotionNotify с состоянием 0x100 для до события ButtonPress
  3. ButtonPress с состоянием 0x100 при касании экрана
  4. MotionNotify с состоянием 0x100 при перетаскивании пальца
  5. ButtonRelease с состоянием 0x100, шевеля пальцем
  6. MotionNotify с состоянием 0x100 при перетаскивании обычной мыши впоследствии
2
задан 19 June 2012 в 20:18

1 ответ

Решил это сам

Анализ основной ошибки

Я копался в источниках evdev и core x server. Оказывается, что эта ошибка, в конце концов, не в evdev, а в xserver-xorg-core. коммит там (который также включен в Xorg upstream ) удалил единственный фрагмент кода, который когда-либо устанавливал флаг TOUCH_END для события. Без этого флага UpdateDeviceState не удалит кнопку из состояния , что приведет к поведению «Кнопка всегда нажата» из моего первоначального вопроса. Просто возврат этого коммита восстановил функциональность основных событий ядра, то есть кнопка была помечена как отпущенная сразу после события ButtonRelease.

Незначительная ошибка при событии нажатия мыши

Одна проблема остается в выходных данных xev, хотя: у события ButtonPress уже есть state 0x100, но состояние должно отражать состояние кнопок мыши [ 1117] до произошло событие. Похоже, это связано с тем, как обрабатываются изменения владельца последовательности касаний. В в одном пункте в этом коде управления владением история касаний воспроизводится с использованием TouchEventHistoryReplay, но внутреннее состояние устройства не установлено на то, каким оно было до этого воспроизведения. Я еще не сформулировал патч для этого. Когда я это сделаю, я приложу его к сообщению об ошибке . Я считаю, что на этот вопрос здесь ответили даже без заплатки по этому второстепенному вопросу, поскольку это отдельная проблема.

Как отладить это

В случае, если кто-то читает это с похожей проблемой: я подумал об использовании gdb, но я был далеко не уверен, смогу ли я правильно переключить vt, если X-сервер был остановился в отладчике, и у меня не был настроен работающий ssh-сервер на этом компьютере. Поэтому я использовал одну из старейших когда-либо отладочных средств и свободно разбросанные ErrorF вызовы по всему коду, в частности Xi / exevents.c . Затем я перекомпилировал код (который я изначально скомпилировал, используя debuild ) без его установки, и запустил скомпилированный двоичный файл (build-main/hw/xfree86/Xorg) с правами root следующим образом:

$ make -C build-main
$ sudo -s
# apt-get install openbox
# ( sleep 3; DISPLAY=:1 exec openbox; ) & build-main/hw/xfree86/Xorg :1

Это перекомпилирует код (требуются целую вечность даже для незначительной модификации, поэтому кажется, что управление зависимостями в make-файлах неоптимально, но я также не хотел копаться в этом). Затем, став пользователем root, он запускает новый X-сервер и через несколько минут запускает openbox на этом сервере. Обратите внимание, что вы будете запускать openbox от имени пользователя root, так что это только для тестирования.

0
ответ дан 19 June 2012 в 20:18

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

Похожие вопросы: