Хорошо, я полагаю, что это - ошибка в Xorg evdev драйвер, но поскольку ошибка человечности для точного так попросила, чтобы я работал эта канавка каналы поддержки, я сначала пошел, муравей сообщил об этом здесь. Тем временем я обновил до quantal и сообщил о надлежащей ошибке, но если бы у кого-то от сообщества поддержки должен быть ответ, который не потерялся бы также. (Абзац был отредактирован для обращения к ошибке, о которой сообщают),
Это - Ubuntu 12.04, точная подключенный к Acer T231H мультисенсорный монитор. На самом деле я встретился с этим больше чем на одной установке ОС, одном из них сделанный через debootstrap. Пакеты включили:
События от нажатия мыши как X отправляют их в приложения, непоследовательны. Это может быть отлажено с помощью xev.
Первому касанию экрана предшествует событие MotionNotify, которое уже имеет состояние 0x100, т.е. нажатая левая кнопка мыши. После этого прибывает событие ButtonPress, снова с состоянием 0x100, хотя то значение должно указать на состояние кнопок, прежде чем событие имело место. Последующее перетаскивание в порядке, и ButtonRelease также, но 0x100 битов в значении состояния никогда не будут становиться нулем снова.
Даже если мне подключат обычную мышь также, то она впредь сообщит о каждом перемещении, как будто я подавлял левую кнопку мыши. Единственное средство исправления, которое я мог найти, перезапускало X-сервер. Вместе с событиями ButtonPress и ButtonRelease этот постоянный бит для левой кнопки мыши составляет непоследовательное создание отчетов состояния кнопки.
JAVA-приложения, например, сообщат о каждом перемещении как о перетаскивании из-за этой проблемы с серьезными последствиями для управления фокусом. Это делает использование differenent частями приложения почти невозможный, поскольку о движении мыши только сообщат компоненту, где мышь ввела окно приложения.
Я копался в источниках 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, так что это только для тестирования.