Resolvi isso sozinho
Análise do erro principal
Eu examinei as fontes do evdev e do servidor x core. Acontece que este bug não está no evdev, afinal, mas no xserver-xorg-core. Um cometer lá (que também é incluído no Xorg upstream ) removido o único trecho de código que já definiu o% sinalizadorTOUCH_END
para um evento. Sem esse sinalizador, UpdateDeviceState
não removerá o botão do estado , levando assim ao comportamento" O botão está sempre pressionado "da minha pergunta original. Simplesmente reverter esse commit restaurou a funcionalidade principal dos eventos principais, ou seja, o botão foi marcado como liberado logo após o evento ButtonRelease
.
Bug menor no evento de imprensa do mouse
No entanto, um problema permanece na saída xev
: O evento ButtonPress
já tem state 0x100
, mas o estado deve refletir o estado dos botões antes do evento. Isso parece ser devido ao modo como as alterações na propriedade de uma sequência de toques são tratadas. Em um ponto nesse código de gerenciamento de propriedade, o histórico de toque é reproduzido usando TouchEventHistoryReplay
, mas o estado interno do dispositivo não está definido como era antes dessa reprodução. Eu ainda não formulei um patch para isso. Quando o fizer, irei anexá-lo ao relatório de erros . Eu considero esta questão aqui respondida mesmo sem um patch para esse ponto menor, já que é uma questão separada.
Como depurar isso
No caso de alguém ler isto com um problema similar: Eu considerei usar o gdb, mas eu estava longe de ter certeza se eu seria capaz de mudar vt corretamente se o servidor X estivesse parado no depurador, e eu não fiz ter um servidor ssh de trabalho configurado nessa máquina. Então eu usei um dos mais antigos recursos de depuração de todos os tempos e espalhei generosamente ErrorF
em todo o código, Xi / exevents.c em particular. Eu então recompilei o código (que eu tinha inicialmente compilado usando debuild ) sem instalá-lo, e executei o binário compilado ( build-main/hw/xfree86/Xorg
) como root assim:
$ make -C build-main
$ sudo -s
# apt-get install openbox
# ( sleep 3; DISPLAY=:1 exec openbox; ) & build-main/hw/xfree86/Xorg :1
Isto recompila o código (demora até mesmo para uma pequena modificação, então parece que o gerenciamento de dependências nos makefiles está abaixo do ideal, mas eu não tive vontade de cavar isso também). Então, depois de se tornar root, ele inicia o novo servidor X e inicia o openbox no servidor alguns instantes depois. Note que você estará executando o openbox como root, então isso é apenas para testes.