Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Oct 2013 00:52:03 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r257294 - user/ed/newcons/sys/dev/vt
Message-ID:  <201310290052.r9T0q3qp015126@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Tue Oct 29 00:52:02 2013
New Revision: 257294
URL: http://svnweb.freebsd.org/changeset/base/257294

Log:
  It is perfectly possible for keyboard drivers to queue up more than one
  key press per notification call. Loop until there are no more queued
  key presses, like syscons did. This fixes stuttering observed in particular
  on key repeats with ADB and USB keyboards.

Modified:
  user/ed/newcons/sys/dev/vt/vt_core.c

Modified: user/ed/newcons/sys/dev/vt/vt_core.c
==============================================================================
--- user/ed/newcons/sys/dev/vt/vt_core.c	Tue Oct 29 00:18:11 2013	(r257293)
+++ user/ed/newcons/sys/dev/vt/vt_core.c	Tue Oct 29 00:52:02 2013	(r257294)
@@ -79,14 +79,14 @@ const struct terminal_class vt_termclass
 };
 
 /*
- * Use a constant timer of 25 Hz to redraw the screen.
+ * Use a constant timer of 50 Hz to redraw the screen.
  *
  * XXX: In theory we should only fire up the timer when there is really
  * activity. Unfortunately we cannot always start timers. We really
  * don't want to process kernel messages synchronously, because it
  * really slows down the system.
  */
-#define	VT_TIMERFREQ	25
+#define	VT_TIMERFREQ	50
 
 /* Bell pitch/duration. */
 #define VT_BELLDURATION	((5 * hz + 99) / 100)
@@ -380,27 +380,11 @@ vt_scrollmode_kbdevent(struct vt_window 
 }
 
 static int
-vt_kbdevent(keyboard_t *kbd, int event, void *arg)
+vt_processkey(keyboard_t *kbd, struct vt_device *vd, int c)
 {
-	struct vt_device *vd = arg;
 	struct vt_window *vw = vd->vd_curwindow;
-	int c, state;
-
-	state = 0;
-	switch (event) {
-	case KBDIO_KEYINPUT:
-		break;
-	case KBDIO_UNLOADING:
-		mtx_lock(&Giant);
-		vd->vd_keyboard = -1;
-		kbd_release(kbd, (void *)&vd->vd_keyboard);
-		mtx_unlock(&Giant);
-		return (0);
-	default:
-		return (EINVAL);
-	}
+	int state = 0;
 
-	c = kbdd_read_char(kbd, 0);
 	if (c & RELKEY)
 		return (0);
 
@@ -491,6 +475,31 @@ vt_kbdevent(keyboard_t *kbd, int event, 
 }
 
 static int
+vt_kbdevent(keyboard_t *kbd, int event, void *arg)
+{
+	struct vt_device *vd = arg;
+	int c;
+
+	switch (event) {
+	case KBDIO_KEYINPUT:
+		break;
+	case KBDIO_UNLOADING:
+		mtx_lock(&Giant);
+		vd->vd_keyboard = -1;
+		kbd_release(kbd, (void *)&vd->vd_keyboard);
+		mtx_unlock(&Giant);
+		return (0);
+	default:
+		return (EINVAL);
+	}
+
+	while ((c = kbdd_read_char(kbd, 0)) != NOKEY)
+		vt_processkey(kbd, vd, c);
+
+	return (0);
+}
+
+static int
 vt_allocate_keyboard(struct vt_device *vd)
 {
 	int		 idx0, idx;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310290052.r9T0q3qp015126>