|
From: | Lei Li |
Subject: | Re: [Qemu-devel] [PATCH] ps2: add support of auto-repeat |
Date: | Thu, 16 May 2013 17:11:59 +0800 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 |
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 <address@hidden>/* 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
[Prev in Thread] | Current Thread | [Next in Thread] |