--- src.orig/kernel/qkeyboard_qws.cpp	Mon Mar 18 02:11:25 2002
+++ src/kernel/qkeyboard_qws.cpp	Fri Aug 30 04:28:39 2002
@@ -269,7 +269,7 @@
     {   Qt::Key_O,      'o'     , 'O'     , 'O'-64  },
     {   Qt::Key_P,      'p'     , 'P'     , 'P'-64  },
     {   Qt::Key_BraceLeft,  '['     , '{'     , 0xffff  },
-    {   Qt::Key_Escape,     ']'     , '}'     , 0xffff  },
+    {   Qt::Key_BraceRight, ']'     , '}'     , 0xffff  },
     {   Qt::Key_Return,     13      , 13      , 0xffff  },
     {   Qt::Key_Control,    0xffff  , 0xffff  , 0xffff  },
     {   Qt::Key_A,      'a'     , 'A'     , 'A'-64  },  // 30
@@ -394,7 +394,7 @@
     bool numLock;
 #endif
     bool caps;
-    bool extended;
+    int extended;
     int modifiers;
     int prevuni;
     int prevkey;
@@ -524,7 +524,7 @@
     shift = false;
     alt   = false;
     ctrl  = false;
-    extended = false;
+    extended = 0;
     prevuni = 0;
     prevkey = 0;
     caps = FALSE;
@@ -561,10 +561,24 @@
     int keyCode = Qt::Key_unknown;
     bool release = false;
     int keypad = 0;
+#if defined(QT_QWS_IPAQ) 
+    static int ipaq_return_pressed = false; // iPAQ Action Key has ScanCode 0x60: 0x60|0x80 = 0xe0 == extended mode 1 !
+#endif
+    
 #if !defined(QT_QWS_CUSTOM)
-    if (code == 224) {
+    if ((code == 224) 
+#if defined(QT_QWS_IPAQ)
+    && !ipaq_return_pressed
+#endif    
+    )    
+    {
 	// extended
-	extended = true;
+	extended = 1;
+	return;
+    }
+    else if (code == 225) {
+    	// extended 2
+    	extended = 2;
 	return;
     }
 #endif
@@ -574,7 +588,7 @@
 	code &= 0x7f;
     }
 
-    if (extended) {
+    if (extended == 1) {
 	switch (code) {
 	case 72:
 	    keyCode = Qt::Key_Up;
@@ -612,6 +626,32 @@
 	case 53:
 	    keyCode = Qt::Key_Slash;
 	    break;
+	case 0x1d:
+	    keyCode = Qt::Key_Control;
+	    break;
+	case 0x2a:
+	    keyCode = Qt::Key_SysReq;
+	    break;
+	case 0x38:
+	    keyCode = Qt::Key_Alt;
+	    break;
+	case 0x5b:
+	    keyCode = Qt::Key_Super_L;
+	    break;
+	case 0x5c:
+	    keyCode = Qt::Key_Super_R;
+	    break;
+	case 0x5d:
+	    keyCode = Qt::Key_Menu;
+	    break;	    
+	}
+    } else if (extended == 2) {
+	switch (code) {
+	case 0x1d:
+	    return;
+	case 0x45:
+	    keyCode = Qt::Key_Pause;
+	    break;
 	}
     } else {
 #if defined(QT_QWS_CUSTOM)
@@ -650,6 +690,7 @@
 		repeatable = FALSE;
 		break;
 	    case 0x60:
+		ipaq_return_pressed = !release;
 		keyCode = Key_Return;
 		break;
 	    case 0x67:
@@ -687,13 +728,19 @@
 	else
 	    repeater->stop();
 #endif
+
+	/*
+	 Translate shift+Key_Tab to Key_Backtab
+	*/
+	if (( keyCode == Key_Tab ) && shift )
+	    keyCode = Key_Backtab;
     }
 
     /*
       Keypad consists of extended keys 53 and 28,
       and non-extended keys 55 and 71 through 83.
     */
-    if ( extended ? (code == 53 || code == 28) :
+    if ((extended == 1) ? (code == 53 || code == 28) :
 	 (code == 55 || ( code >= 71 && code <= 83 )) )
 	keypad = Qt::Keypad;
 
@@ -803,7 +850,7 @@
 		    unicode =  QWSServer::keyMap()[code].shift_unicode ?  QWSServer::keyMap()[code].shift_unicode : 0xffff;
 		else
 		    unicode =  QWSServer::keyMap()[code].unicode ?  QWSServer::keyMap()[code].unicode : 0xffff;
-	    } else {
+	    } else if (extended == 1) {
 		if ( code == 53 )
 		    unicode = '/';
 	    }
@@ -829,7 +876,7 @@
 	    prevkey = prevuni = 0;
 	}
     }
-    extended = false;
+    extended = 0;
 }