merge 456763
thanks
I think the bug mentioned above is a duplicate.
I've analysed a case in which pressing keys '1234' lead to output
'122222222222222222234'. The following is some debug output. The
duplicate keypresses are seen by ProcessKeyboardEvent() while
xserver-xorg-input-keyboard's kbd.c does see the correct number of
keypresses (cf. to bug 456763 for that result).
[1225311281.081142] kbd driver rec scancode: 0x022 down
xf86PostKeyboardEvent: nevents=2
[1225311281.081216] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225311281.153208] kbd driver rec scancode: 0x023 down
xf86PostKeyboardEvent: nevents=2
[1225311281.153276] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.472617] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.472675] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.504957] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.505014] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.537949] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.538003] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.570969] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.571070] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.603961] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.604017] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.636956] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.637013] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.669952] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.670006] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.702955] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.703009] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.735951] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.736006] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.768952] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.769007] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.802128] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.802182] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.834971] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.835025] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.867954] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.868010] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.900955] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.901010] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.934245] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.934291] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.966955] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.967012] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.999953] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311282.000007] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311282.022955] kbd driver rec scancode: 0x024 down
xf86PostKeyboardEvent: nevents=2
[1225311282.023017] kbd driver rec scancode: 0x025 down
xf86PostKeyboardEvent: nevents=2
[1225311282.023037] kbd driver rec scancode: 0x022 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023057] kbd driver rec scancode: 0x023 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023076] kbd driver rec scancode: 0x024 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023096] kbd driver rec scancode: 0x025 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023128] ProcessKeyboardEvent(key=0x0c,down,count=1)
[1225311282.023240] ProcessKeyboardEvent(key=0x0d,down,count=1)
[1225311282.023294] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225311282.023307] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311282.023319] ProcessKeyboardEvent(key=0x0c,up,count=1)
[1225311282.023331] ProcessKeyboardEvent(key=0x0d,up,count=1)
With some more debug code, I came to the conclusion that mieqEnqueue is
also called in the right amounts, as shown in that snippet:
[1225669913.945238] kbd driver rec scancode: 0x022 down
xf86PostKeyboardEvent: nevents=2
[1225669913.945310] mieqEnqueue: oldtail=267/512
[1225669913.945326] mieqEnqueue: newtail=268/512
[1225669914.020137] mieqEnqueue: oldtail=268/512
[1225669914.020191] mieqEnqueue: newtail=269/512
[1225669914.020220] mieqProcessInputEvents: head=267/512
[1225669914.020237] mieqProcessInputEvents: calling 0x55a060
[1225669914.032838] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.032971] mieqProcessInputEvents: head=268/512
[1225669914.032989] mieqProcessInputEvents: calling 0x55a060
[1225669914.282570] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.282633] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.315521] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.315581] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.348529] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.348586] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.387551] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.387611] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.421645] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.421688] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.462520] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.462578] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.511933] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.511993] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.544589] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.721285] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.753518] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.831914] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.864524] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.866070] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.898522] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.898570] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.931518] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669917.279574] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669917.280268] kbd driver rec scancode: 0x023 down
xf86PostKeyboardEvent: nevents=2
[1225669917.281070] mieqEnqueue: oldtail=269/512
[1225669917.281092] mieqEnqueue: newtail=270/512
[1225669917.281109] mieqEnqueue: oldtail=270/512
[1225669917.281129] mieqEnqueue: newtail=271/512
[1225669917.281147] kbd driver rec scancode: 0x024 down
xf86PostKeyboardEvent: nevents=2
[1225669917.281186] mieqEnqueue: oldtail=271/512
[1225669917.281203] mieqEnqueue: newtail=272/512
[1225669917.281220] mieqEnqueue: oldtail=272/512
[1225669917.281237] mieqEnqueue: newtail=273/512
[1225669917.281254] kbd driver rec scancode: 0x022 up
xf86PostKeyboardEvent: nevents=2
[1225669917.281289] mieqEnqueue: oldtail=273/512
[1225669917.281305] mieqEnqueue: newtail=274/512
[1225669917.281322] mieqEnqueue: oldtail=274/512
[1225669917.281339] mieqEnqueue: newtail=275/512
nm /usr/bin/Xorg | grep 55a060
000000000055a060 T ProcessKeyboardEvent
At that point I really got curious which function was doing the
additional calls to ProcessKeyboardEvent(), so added logging of
backtraces to ProcessKeyboardEvent(), the output of which may be seen
below. (Stack frames in which the backtrace doesn't give a function name
have been filled in manually with the help of nm.)
[1226009095.847753] kbd driver rec scancode: 0x022 down
xf86PostKeyboardEvent: nevents=2
[1226009095.847827] mieqEnqueue: oldtail=191/512
[1226009095.847841] mieqEnqueue: newtail=192/512
[1226009095.886041] mieqEnqueue: oldtail=192/512
[1226009095.886067] mieqEnqueue: newtail=193/512
[1226009095.886091] mieqProcessInputEvents: head=191/512
[1226009095.886107] mieqProcessInputEvents: calling 0x55a0f0
[1226009095.886128] ProcessKeyboardEvent(key=0x0a,down,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X(AccessXFilterPressEvent+0x10c) [0x551c8c]
[4] /usr/bin/X(mieqProcessInputEvents+0x1c9) [0x4e0469]
[5] /usr/bin/X(ProcessInputEvents+0x1c) [0x498ffc]
[6] /usr/bin/X(Dispatch+0x81) [0x44f511]
[7] /usr/bin/X(main+0x4a5) [0x436bd5]
[8] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[9] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009095.886992] mieqProcessInputEvents: head=192/512
[1226009095.887009] mieqProcessInputEvents: calling 0x55a0f0
[1226009095.919175] kbd driver rec scancode: 0x023 down
xf86PostKeyboardEvent: nevents=2
[1226009095.919238] mieqEnqueue: oldtail=193/512
[1226009095.919253] mieqEnqueue: newtail=194/512
[1226009095.924321] mieqEnqueue: oldtail=194/512
[1226009095.924346] mieqEnqueue: newtail=195/512
[1226009095.924365] mieqProcessInputEvents: head=193/512
[1226009095.924380] mieqProcessInputEvents: calling 0x55a0f0
[1226009095.924400] ProcessKeyboardEvent(key=0x0b,down,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X(AccessXFilterPressEvent+0x10c) [0x551c8c]
[4] /usr/bin/X(mieqProcessInputEvents+0x1c9) [0x4e0469]
[5] /usr/bin/X(ProcessInputEvents+0x1c) [0x498ffc]
[6] /usr/bin/X(Dispatch+0x81) [0x44f511]
[7] /usr/bin/X(main+0x4a5) [0x436bd5]
[8] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[9] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009095.925247] mieqProcessInputEvents: head=194/512
[1226009095.925264] mieqProcessInputEvents: calling 0x55a0f0
[1226009096.177415] ProcessKeyboardEvent(key=0x0b,up,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X [0x551f54] 551ef0 t AccessXKeyboardEvent
[4] /usr/bin/X [0x552004] 551fb0 t AccessXRepeatKeyExpire
[5] /usr/bin/X [0x56f3b8] 56f3a0 t DoTimer
[6] /usr/bin/X(WaitForSomething+0x5e7) [0x56fa87]
[7] /usr/bin/X(Dispatch+0x8f) [0x44f51f]
[8] /usr/bin/X(main+0x4a5) [0x436bd5]
[9] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[10] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009098.702652] ProcessKeyboardEvent(key=0x0b,down,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X [0x551f54] 551ef0 t AccessXKeyboardEvent
[4] /usr/bin/X [0x552018] 551fb0 t AccessXRepeatKeyExpire
[5] /usr/bin/X [0x56f3b8] 56f3a0 t DoTimer
[6] /usr/bin/X(WaitForSomething+0x5e7) [0x56fa87]
[7] /usr/bin/X(Dispatch+0x8f) [0x44f51f]
[8] /usr/bin/X(main+0x4a5) [0x436bd5]
[9] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[10] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009098.704189] kbd driver rec scancode: 0x024 down
xf86PostKeyboardEvent: nevents=2
[1226009098.704246] mieqEnqueue: oldtail=195/512
[1226009098.704262] mieqEnqueue: newtail=196/512
So it seems that somewhere the repeating of keys is triggered by ways of
setting a timer which then calls AccessXKeyboardEvent(). I hope that helps.
The bug can be cured (cf. attached patch) in a haphazard way by always
returning 0 in AccessXRepeatKeyExpire(), which of course will break
something else (filterkeys?), but works well for me.
Kind regards,
Thiemo Nagel
--
+-------------------------+-------------------------+
| TU Muenchen | Room PH1 3558 |
| Physik-Department E18 | |
| James-Franck-Strasse | Phone +49 89 289-12592 |
| D-85747 Garching | Fax +49 89 289-12570 |
+-------------------------+-------------------------+
--- xkbAccessX.c~ 2008-06-10 19:57:20.000000000 +0200
+++ xkbAccessX.c 2008-11-12 21:25:55.000000000 +0100
@@ -313,6 +313,8 @@
KeyCode key;
BOOL is_core;
+ return 0;
+
if (xkbi->repeatKey == 0)
return 0;