qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] ps2: add support of auto-repeat


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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]