On 05/16/2013 03:35 PM, Amos Kong wrote:
On Thu, May 16, 2013 at 03:23:21PM +0800, Lei Li wrote:
On 05/16/2013 12:30 PM, Amos Kong wrote:
Guest driver sets repeat rate and delay time by KBD_CMD_SET_RATE,
but ps2 backend doesn't process it and no auto-repeat implementation.
This patch adds support of auto-repeat feature.
Guest ps2 driver sets autorepeat to fastest possible in reset,
period: 250ms, delay: 33ms
Tested by 'sendkey' monitor command.
referenced: http://www.computer-engineering.org/ps2keyboard/
Signed-off-by: Amos Kong <ak...@redhat.com>
/*
keycode is expressed as follow:
bit 7 - 0 key pressed, 1 = key released
@@ -167,7 +186,17 @@ static void ps2_put_keycode(void *opaque, int keycode)
keycode = ps2_raw_keycode_set3[keycode & 0x7f];
}
}
+
+ /* only auto-repeat press event */
+ auto_repeat = ~keycode & 0x80;
Hi Lei,
Does this check allow to distinguish the difference between auto-repeat and
actual repeated entry by the user?
Actual repeat by user:
press event
release event
press event
release event
press event
release event
Auto-repeat example:
press event
press event
press event
release event
On what platform?
AFAIK, the Auto-repeat event is like below on some GTK-based
||||||||||||environments,||||||||||||
keydown
keypress
keyup
keydown
keypress
keyup|||||||||||||
...
as reference link:
https://developer.mozilla.org/zh-CN/docs/DOM/KeyboardEvent
And on Xwindows:
keypress
keyrelease
keypress
keyrelease
...
as reference link:
http://www.ypass.net/blog/2009/06/detecting-xlibs-keyboard-auto-repeat-functionality-and-how-to-fix-it/
This would cause it's hard to distinguish them. But looks like the links above
is
a little out of time, and I am not sure if the auto-repeat behaviour on such
platforms
has been changed. :)
|||||||||||||
so here we check if it's a press event, only set repeat_timer for
press event. When we get release event, we just stop repeat action.
ps2_queue(&s->common, keycode);
+
+ if (auto_repeat) {
+ s->repeat_key = keycode;
+ /* delay a while before first repeat */
+ qemu_mod_timer(repeat_timer, qemu_get_clock_ns(vm_clock) +
+ muldiv64(get_ticks_per_sec(), s->repeat_delay, 1000));
+ }
}
--
Lei