011fe81
From ac660e42875162e599f50c085cb646c633cf376d Mon Sep 17 00:00:00 2001
78a3d7d
From: Vladimir Serbinenko <phcoder@gmail.com>
78a3d7d
Date: Sat, 18 Jan 2014 16:57:35 +0100
4dcaf21
Subject: [PATCH 023/143] 	* grub-core/term/terminfo.c: Recognize keys
78a3d7d
 F1-F12.
78a3d7d
78a3d7d
---
78a3d7d
 ChangeLog                 |  4 +++
78a3d7d
 grub-core/term/terminfo.c | 86 +++++++++++++++++++++++++++--------------------
78a3d7d
 2 files changed, 54 insertions(+), 36 deletions(-)
78a3d7d
78a3d7d
diff --git a/ChangeLog b/ChangeLog
011fe81
index 9c3ef2e..bdfbf44 100644
78a3d7d
--- a/ChangeLog
78a3d7d
+++ b/ChangeLog
78a3d7d
@@ -1,3 +1,7 @@
78a3d7d
+2014-01-18  Vladimir Serbinenko  <phcoder@gmail.com>
78a3d7d
+
78a3d7d
+	* grub-core/term/terminfo.c: Recognize keys F1-F12.
78a3d7d
+
78a3d7d
 2014-01-07  Andrey Borzenkov <arvidjaar@gmail.com>
78a3d7d
 
78a3d7d
 	* configure.ac: Add support for BUILD_LDFLAGS.
78a3d7d
diff --git a/grub-core/term/terminfo.c b/grub-core/term/terminfo.c
78a3d7d
index 3d48b19..f0d3e3d 100644
78a3d7d
--- a/grub-core/term/terminfo.c
78a3d7d
+++ b/grub-core/term/terminfo.c
78a3d7d
@@ -460,28 +460,31 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
78a3d7d
 	{'@', GRUB_TERM_KEY_INSERT},
78a3d7d
       };
78a3d7d
 
78a3d7d
-    static struct
78a3d7d
-    {
78a3d7d
-      char key;
78a3d7d
-      unsigned ascii;
78a3d7d
-    }
78a3d7d
-    four_code_table[] =
78a3d7d
+    static unsigned four_code_table[] =
78a3d7d
       {
78a3d7d
-	{'1', GRUB_TERM_KEY_HOME},
78a3d7d
-	{'3', GRUB_TERM_KEY_DC},
78a3d7d
-	{'5', GRUB_TERM_KEY_PPAGE},
78a3d7d
-	{'6', GRUB_TERM_KEY_NPAGE},
78a3d7d
-	{'7', GRUB_TERM_KEY_HOME},
78a3d7d
-	{'8', GRUB_TERM_KEY_END}
78a3d7d
+	[1] = GRUB_TERM_KEY_HOME,
78a3d7d
+	[3] = GRUB_TERM_KEY_DC,
78a3d7d
+	[5] = GRUB_TERM_KEY_PPAGE,
78a3d7d
+	[6] = GRUB_TERM_KEY_NPAGE,
78a3d7d
+	[7] = GRUB_TERM_KEY_HOME,
78a3d7d
+	[8] = GRUB_TERM_KEY_END,
78a3d7d
+	[17] = GRUB_TERM_KEY_F6,
78a3d7d
+	[18] = GRUB_TERM_KEY_F7,
78a3d7d
+	[19] = GRUB_TERM_KEY_F8,
78a3d7d
+	[20] = GRUB_TERM_KEY_F9,
78a3d7d
+	[21] = GRUB_TERM_KEY_F10,
78a3d7d
+	[23] = GRUB_TERM_KEY_F11,
78a3d7d
+	[24] = GRUB_TERM_KEY_F12,
78a3d7d
       };
78a3d7d
     char fx_key[] = 
78a3d7d
       { 'P', 'Q', 'w', 'x', 't', 'u',
78a3d7d
-        'q', 'r', 'p', 'M', 'A', 'B' };
78a3d7d
+        'q', 'r', 'p', 'M', 'A', 'B', 'H', 'F' };
78a3d7d
     unsigned fx_code[] = 
78a3d7d
 	{ GRUB_TERM_KEY_F1, GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3,
78a3d7d
 	  GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5, GRUB_TERM_KEY_F6,
78a3d7d
 	  GRUB_TERM_KEY_F7, GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9,
78a3d7d
-	  GRUB_TERM_KEY_F10, GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12 };
78a3d7d
+	  GRUB_TERM_KEY_F10, GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12,
78a3d7d
+	  GRUB_TERM_KEY_HOME, GRUB_TERM_KEY_END };
78a3d7d
     unsigned i;
78a3d7d
 
78a3d7d
     if (c == '\e')
78a3d7d
@@ -492,19 +495,13 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
78a3d7d
 	  {
78a3d7d
 	    CONTINUE_READ;
78a3d7d
 
78a3d7d
-	    switch (c)
78a3d7d
-	      {
78a3d7d
-	      case 'H':
78a3d7d
-		keys[0] = GRUB_TERM_KEY_HOME;
78a3d7d
-		*len = 1;
78a3d7d
-		return;
78a3d7d
-	      case 'F':
78a3d7d
-		keys[0] = GRUB_TERM_KEY_END;
78a3d7d
-		*len = 1;
78a3d7d
-		return;
78a3d7d
-	      default:
78a3d7d
-		return;
78a3d7d
-	      }
78a3d7d
+	    for (i = 0; i < ARRAY_SIZE (fx_key); i++)
78a3d7d
+	      if (fx_key[i] == c)
78a3d7d
+		{
78a3d7d
+		  keys[0] = fx_code[i];
78a3d7d
+		  *len = 1;
78a3d7d
+		  return;
78a3d7d
+		}
78a3d7d
 	  }
78a3d7d
 
78a3d7d
 	if (c != '[')
78a3d7d
@@ -523,6 +520,15 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
78a3d7d
 
78a3d7d
     switch (c)
78a3d7d
       {
78a3d7d
+      case '[':
78a3d7d
+	CONTINUE_READ;
78a3d7d
+	if (c >= 'A' && c <= 'E')
78a3d7d
+	  {
78a3d7d
+	    keys[0] = GRUB_TERM_KEY_F1 + c - 'A';
78a3d7d
+	    *len = 1;
78a3d7d
+	    return;
78a3d7d
+	  }
78a3d7d
+	return;
78a3d7d
       case 'O':
78a3d7d
 	CONTINUE_READ;
78a3d7d
 	for (i = 0; i < ARRAY_SIZE (fx_key); i++)
78a3d7d
@@ -555,18 +561,26 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
78a3d7d
 	  return;
78a3d7d
 	}	  
78a3d7d
 
78a3d7d
-      default:
78a3d7d
-	for (i = 0; i < ARRAY_SIZE (four_code_table); i++)
78a3d7d
-	  if (four_code_table[i].key == c)
78a3d7d
+      case '1' ... '9':
78a3d7d
+	{
78a3d7d
+	  unsigned val = c - '0';
78a3d7d
+	  CONTINUE_READ;
78a3d7d
+	  if (c >= '0' && c <= '9')
78a3d7d
 	    {
78a3d7d
+	      val = val * 10 + (c - '0');
78a3d7d
 	      CONTINUE_READ;
78a3d7d
-	      if (c != '~')
78a3d7d
-		return;
78a3d7d
-	      keys[0] = four_code_table[i].ascii;
78a3d7d
-	      *len = 1;
78a3d7d
-	      return;
78a3d7d
 	    }
78a3d7d
-	return;
78a3d7d
+	  if (c != '~')
78a3d7d
+	    return;
78a3d7d
+	  if (val >= ARRAY_SIZE (four_code_table)
78a3d7d
+	      || four_code_table[val] == 0)
78a3d7d
+	    return;
78a3d7d
+	  keys[0] = four_code_table[val];
78a3d7d
+	  *len = 1;
78a3d7d
+	  return;
78a3d7d
+	}
78a3d7d
+	default:
78a3d7d
+	  return;
78a3d7d
       }
78a3d7d
   }
78a3d7d
 #undef CONTINUE_READ
78a3d7d
-- 
37b39b7
1.9.3
78a3d7d