--- ../midpssh.orig/src/j2me/terminal/Terminal.java	2006-01-14 13:49:46.000000000 -0500
+++ src/j2me/terminal/Terminal.java	2007-12-19 17:30:09.000000000 -0500
@@ -566,11 +566,30 @@
     }
 
     private static final int KEY_BACKSPACE = -8; // Keycode for clear on sony
-    
+
+	private static final int U740_ENTER		= -22;
+	private static final int U740_BACKSPACE		= -20;
+	private static final int U740_CAMERA		= -15;
+	private static final int U740_NUMLOCK		= -27;
+	private static final int U740_SPACE		= -21;
+	private static final int U740_SHIFT		= -23;
+	private static final int U740_FN		= -26;
+	private static final int U740_TALK		= -10;
+	private static final int U740_LEFTSOFT		= -6;
+	private static final int U740_OK		= -5;
+	private static final int U740_LEFT		= -3;
+	private static final int U740_UP		= -1;
+	private static final int U740_RIGHT		= -4;
+	private static final int U740_DOWN		= -2;
+
+ 
 //#ifndef notyping
     private static final int KEY_SHIFT = 137; // Keycode for shift on blackberry
     
     private boolean typingShift;
+    private boolean typingShiftToggle	=false;
+    private boolean typingFnToggle	=false;
+    private boolean typingNumlockToggle	=false;
     
     protected void keyPressedTyping( int keycode ) {
         if ( keycode == KEY_SHIFT ) {
@@ -592,18 +611,60 @@
     protected void keyReleasedTyping( int keycode ) {
     	/* Debug typing */
 //    	buffer.putString("KEY" + keycode + " ");
+
+	//remap the number entry to letters to start with
+	if( (keycode>=48 && keycode <= 57) || keycode == 42 || keycode == 35)
+		keycode=remapNumberKeys((char)keycode);
     	
-        if ( keycode == 8 || keycode == KEY_BACKSPACE ) {
+        if ( keycode == 8 || keycode == KEY_BACKSPACE || keycode == U740_BACKSPACE) {
             // Backspace
             buffer.keyPressed( VT320.VK_BACK_SPACE, 0 );
         }
-        else if ( keycode == 10 || keycode == 13 ) {
-            //buffer.keyTyped( keycode, (char) keycode, 0 );
+        else if ( keycode == 10 || keycode == 13 || keycode == U740_ENTER ) {
             buffer.keyTyped( 0, '\n', 0 );
         }
+        else if ( keycode == U740_SPACE ) {
+		//space bar
+            buffer.keyTyped( 0, ' ', 0 );
+        }
+        else if ( keycode == U740_CAMERA ) {
+		//pipe key
+            buffer.keyTyped( 0, '|', 0 );
+        }
+        else if ( keycode == U740_LEFTSOFT || keycode == U740_OK ) {
+		//left soft key or menu/ok sends a tab (useful for tab completion)
+            buffer.keyTyped( 0, '\t', 0 );
+        }
         else if ( keycode == KEY_SHIFT ) {
             typingShift = false;
         }
+        else if ( keycode == U740_SHIFT ) {
+	    //toggle it
+            typingShiftToggle = !typingShiftToggle;
+	    //if its toggled on, turn the others off
+	    if(typingShiftToggle) {
+	    	typingFnToggle=false;
+		typingNumlockToggle=false;
+   	    }
+        }
+        else if ( keycode == U740_FN ) {
+		//toggle it
+            typingFnToggle = !typingFnToggle;
+	    //if its toggled on, turn the others off
+	    if(typingFnToggle) {
+	    	typingShiftToggle=false;
+		typingNumlockToggle=false;
+   	    }
+        }
+        else if ( keycode == U740_NUMLOCK ) {
+		//toggle it
+            typingNumlockToggle = !typingNumlockToggle;
+	    //if its toggled on, turn the others off
+	    if(typingNumlockToggle) {
+		typingShiftToggle=false;
+	    	typingFnToggle=false;
+   	    }
+        }
         else if ( keycode > 0 && keycode < 32) {
             buffer.keyTyped( keycode, (char)keycode, 0);
         }
@@ -612,12 +673,87 @@
             if ( typingShift ) {
                 c = shiftChar( c );
             }
+	    //handle the toggled u740 Shift
+            if ( typingShiftToggle ) {
+                c = toggleShiftChar( c );
+            }
+            
+	    //handle the toggled u740 Fn
+            if ( typingFnToggle ) {
+                c = toggleFnChar( c );
+            }
+            
+	    //handle the toggled u740 Numlock
+            if ( typingNumlockToggle ) {
+                c = toggleNumlockChar( c );
+            }
             
             // Don't pass through the keycode, as we don't want the terminal to do any keycode mapping
             // we just care about the char
             buffer.keyTyped( 0, c, 0 );
         }
     }
+
+   private char remapNumberKeys ( char c ) {
+    	switch ( c ) {
+		case '1': return (char) ('z'); 
+		case '2': return (char) ('s');
+		case '3': return (char) ('w');
+		case '4': return (char) ('x');
+		case '5': return (char) ('d');
+		case '6': return (char) ('e');
+		case '7': return (char) ('c');
+		case '8': return (char) ('f');
+		case '9': return (char) ('r');
+		case '0': return (char) ('g');
+		case '*': return (char) ('v');
+		case '#': return (char) ('t');
+	}
+	return (char)0;
+    }
+    
+    private char toggleShiftChar ( char c ) {
+        if ( c >= 'a' && c <= 'z' ) {
+            return (char) ( c - 'a' + 'A' );
+        }
+	return c;
+    }
+
+    private char toggleFnChar ( char c ) {
+    	switch ( c ) {
+		case 'y': return (char) ('.');
+		case 'u': return (char) ('@');
+		case 'i': return (char) ('?');
+		case 'o': return (char) ('!');
+		case 'p': return (char) ('-');
+		case 'h': return (char) (',');
+		case 'j': return (char) ('&');
+		case 'k': return (char) (':');
+		case 'l': return (char) ('\'');
+		case 'b': return (char) ('+');
+		case 'n': return (char) ('=');
+		case 'm': return (char) ('/');
+		default: return c;
+	}
+    }
+    
+    private char toggleNumlockChar ( char c ) {
+    	switch ( c ) {
+		case 'z': return (char) ('1');
+		case 's': return (char) ('2');
+		case 'w': return (char) ('3');
+		case 'x': return (char) ('4');
+		case 'd': return (char) ('5');
+		case 'e': return (char) ('6');
+		case 'c': return (char) ('7');
+		case 'f': return (char) ('8');
+		case 'r': return (char) ('9');
+		case 'g': return (char) ('0');
+		case 'v': return (char) ('*');
+		case 't': return (char) ('#');
+		default: return c;
+	}
+    }
     
     private char shiftChar( char c ) {
         if ( c >= 'a' && c <= 'z' ) {
@@ -1211,4 +1347,4 @@
 	private int[][] fontData;
 	
 	private static final String FONT_RESOURCE = "/font";
-}
\ No newline at end of file
+}
