These are some keyboard fixes.
keys.patch
---------------------------------------------------------------
This patch implements functionality of some keys (Home, End and
Backspace) following the ECMA-48 standard.
 

unimplemented_key.patch
----------------------------------------------------------------
This patch prevents that fancy characters show up in screen when keys
that the virtual terminal doesn't understand are pressed.

-- 
Best Regards,

Manoel Abranches <[EMAIL PROTECTED]>
IBM Linux Technology Center Brazil
Index: term/ieee1275/ofconsole.c
===================================================================
--- term/ieee1275/ofconsole.c	(revision 1917)
+++ term/ieee1275/ofconsole.c	(working copy)
@@ -150,41 +150,60 @@
 
   grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
 
-  if (actual > 0 && c == '\e')
-    {
-      grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
-      if (actual <= 0)
-	{
+  if (actual > 0)
+    switch(c){
+      case 0x7f:
+        /* Backspace: Ctrl-h.  */
+        c=8; 
+        break;
+      case '\e':
+        grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
+        if (actual <= 0)
+        {
 	  *key = '\e';
 	  return 1;
 	}
+        
+	if (c != 91 )
+          return 0;
+ 
+        grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
+
+        if (actual <= 0)
+	  return 0;
       
-      if (c != 91)
-	return 0;
-      
-      grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
-      if (actual <= 0)
-	return 0;
-      
-      switch (c)
+        switch (c)
 	{
-	case 65:
-	  /* Up: Ctrl-p.  */
-	  c = 16; 
-	  break;
-	case 66:
-	  /* Down: Ctrl-n.  */
-	  c = 14;
-	  break;
-	case 67:
-	  /* Right: Ctrl-f.  */
-	  c = 6;
-	  break;
-	case 68:
-	  /* Left: Ctrl-b.  */
-	  c = 2;
-	  break;
+	  case 72:
+	    /* Home: Ctrl-a.  */
+            c = 1;
+	    break;
+	  case 70:
+	    /* End: Ctrl-e.  */
+	    c = 5;
+	    break;
+	  case 51:
+	    /* Delete: Ctrl-d.  */
+	    c = 4;
+	    break;
+	  case 65:
+	    /* Up: Ctrl-p.  */
+	    c = 16; 
+	    break;
+	  case 66:
+	    /* Down: Ctrl-n.  */
+	    c = 14;
+	    break;
+	  case 67:
+	    /* Right: Ctrl-f.  */
+	    c = 6;
+	    break;
+	  case 68:
+	    /* Left: Ctrl-b.  */
+	    c = 2;
+	    break;
 	}
+	break;
     }
   
   *key = c;
--- term/ieee1275/ofconsole-bk.c	2008-11-18 17:00:46.000000000 +0100
+++ term/ieee1275/ofconsole.c	2008-11-18 16:59:50.000000000 +0100
@@ -146,7 +146,10 @@ static int
 grub_ofconsole_readkey (int *key)
 {
   char c;
+  char ctmp;	  
   grub_ssize_t actual = 0;
+  grub_ssize_t actualtmp = 0;
+  char implemented = 1;//indicates an unimplemented key
 
   grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
 
@@ -165,8 +168,11 @@ grub_ofconsole_readkey (int *key)
 	}
         
 	if (c != 91 )
-          return 0;
- 
+	{
+          implemented = 0;
+          break;
+	}
+      
         grub_ieee1275_read (stdin_ihandle, &c, 1, &actual);
 
         if (actual <= 0)
@@ -202,12 +208,25 @@ grub_ofconsole_readkey (int *key)
 	    /* Left: Ctrl-b.  */
 	    c = 2;
 	    break;
+	  default:
+            implemented = 0;
+            break;
 	}
 	break;
     }
+
+  /*stores actual state*/ 
+  ctmp = c;
+  actualtmp = actual;
+  /*clean buffer*/
+  while(actual > 0 && !grub_ieee1275_read(stdin_ihandle, &c, 1, &actual));
+  /*return to previos state*/
+  c = ctmp;
+  actual = actualtmp;
   
   *key = c;
-  return actual > 0;
+  return (actual > 0 && implemented);
+  
 }
 
 static int
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to