summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2011-07-21 17:46:52 +0800
committerSimon Glass <sjg@chromium.org>2011-08-29 10:59:05 -0700
commit63abb13013bd8d64abfe3ba480793dd2258f1e8f (patch)
tree71d587079a90d0f5680d16ea9b616857f4dbd426 /lib
parent60e3081050349faaf34989323535dbd19bb0d17f (diff)
CHROMIUIM: fix VbExKeyboardRead() not returning Escape character
Another bug that was found when testing this patch: The keyboard driver does not seem to return arrow keys. BUG=chromium-os:17931 TEST=vbexport_test key Tested keys: Escape, Tab, Ctrl-D, Ctrl-U, Enter, Space No responding keys: Up, Down, Left, Right Change-Id: I3aa551bd0edf62e6b9eb7b067136140a7d197b8e Reviewed-on: http://gerrit.chromium.org/gerrit/4483 Tested-by: Che-Liang Chiou <clchiou@chromium.org> Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/vbexport/keyboard.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/lib/vbexport/keyboard.c b/lib/vbexport/keyboard.c
index 03fafad0f6a..b6ccd5adcc9 100644
--- a/lib/vbexport/keyboard.c
+++ b/lib/vbexport/keyboard.c
@@ -19,27 +19,42 @@
uint32_t VbExKeyboardRead(void)
{
- int c;
+ int c = 0;
+ /* No input available. */
if (!tstc())
- return 0;
-
- c = getc();
-
- /* Special handle for up/down/left/right arrow keys. */
- if (c == CSI_0) {
- if (getc() == CSI_1) {
- c = getc();
- switch (c) {
- case 'A': return VB_KEY_UP;
- case 'B': return VB_KEY_DOWN;
- case 'C': return VB_KEY_RIGHT;
- case 'D': return VB_KEY_LEFT;
- }
- }
- /* Filter out any speical key we don't recognize. */
- return 0;
+ goto out;
+
+ /* Read a non-Escape character or a standalone Escape character. */
+ if ((c = getc()) != CSI_0 || !tstc())
+ goto out;
+
+ /* Filter out non- Escape-[ sequence. */
+ if (getc() != CSI_1) {
+ c = 0;
+ goto out;
+ }
+
+ /* Special values for arrow up/down/left/right. */
+ switch (getc()) {
+ case 'A':
+ c = VB_KEY_UP;
+ break;
+ case 'B':
+ c = VB_KEY_DOWN;
+ break;
+ case 'C':
+ c = VB_KEY_RIGHT;
+ break;
+ case 'D':
+ c = VB_KEY_LEFT;
+ break;
+ default:
+ /* Filter out speical keys that we do not recognize. */
+ c = 0;
+ break;
}
+out:
return c;
}