Blob Blame History Raw
--- plib-1.8.4/src/pw/pwX11.cxx.key	2006-10-05 19:56:42.000000000 +0200
+++ plib-1.8.4/src/pw/pwX11.cxx	2006-10-05 20:04:19.000000000 +0200
@@ -117,11 +117,19 @@
 static XTextProperty *titlePropertyPtr = NULL;
 
 static bool autoRepeat = false ;
+static bool haveFocus = false ;
 
 static void getEvents ();
 
 void pwSetAutoRepeatKey ( bool enable )
 {
+  if ( (autoRepeat != enable) && haveFocus )
+  {
+    if ( enable )
+      XAutoRepeatOn ( currDisplay ) ;
+    else
+      XAutoRepeatOff ( currDisplay ) ;
+  }
   autoRepeat = enable ;
 }
 
@@ -351,7 +359,7 @@
                        KeyPressMask        | KeyReleaseMask       |
 		       EnterWindowMask     | LeaveWindowMask      |
                        PointerMotionMask   | ButtonMotionMask     |
-                       VisibilityChangeMask ;
+                       VisibilityChangeMask| FocusChangeMask;
 
   attribs.background_pixmap = None ;
   attribs.background_pixel  = 0    ;
@@ -405,6 +413,10 @@
   XMapWindow       ( currDisplay, wmWindow ) ;
   glXMakeCurrent   ( currDisplay, currHandle, currContext ) ;
 
+  haveFocus = true;
+  if (!autoRepeat)
+    XAutoRepeatOff ( currDisplay ) ;
+
   pwSetCursor ( PW_CURSOR_LEFT ) ;
 
 #ifdef GL_MULTISAMPLE_FILTER_HINT_NV
@@ -717,8 +729,6 @@
 
 static void getEvents ()
 {
-  bool repeating = false ;
-  char keyflags [ 32 ] ;
   XEvent event ;
 
   insideCallback = true ;
@@ -770,6 +780,18 @@
           (*mpCB) ( event.xmotion.x, event.xmotion.y ) ;
         break ;
 
+      case FocusIn:
+        if ( !haveFocus && !autoRepeat )
+          XAutoRepeatOff ( currDisplay ) ;
+        haveFocus = true;
+        break;
+
+      case FocusOut:
+        if ( haveFocus && !autoRepeat )
+          XAutoRepeatOn ( currDisplay ) ;
+        haveFocus = false;
+        break;
+
       case ButtonRelease   :
         updown = PW_UP ;
         /* FALLTHROUGH */
@@ -792,23 +814,9 @@
 
       case KeyRelease      :
         updown = PW_UP ;
-
-        XQueryKeymap ( currDisplay, keyflags ) ;
-
-        repeating = ( ( keyflags [ event.xkey.keycode >> 3 ] &
-                          ( 1 << ( event.xkey.keycode & 7 ) ) ) != 0 ) ;
-
         /* FALLTHROUGH */
 
       case KeyPress        :
-        /*
-          Only generate a key up callback if the key is actually up
-          and not repeating.
-        */
-
-        if ( ! autoRepeat && repeating )
-          break ;
-
         XComposeStatus composeStatus ;
         char           asciiCode [ 32 ] ;
         KeySym         keySym ;
@@ -1021,10 +1029,14 @@
   if ( fsWindow != None )
     pwSetWindowed ( ) ;
 
+  if ( haveFocus && !autoRepeat )
+    XAutoRepeatOn ( currDisplay ) ;
+
   glXDestroyContext ( currDisplay, currContext ) ;
   XDestroyWindow    ( currDisplay, currHandle  ) ;
   XDestroyWindow    ( currDisplay, wmWindow    ) ;
   XCloseDisplay     ( currDisplay ) ;
+  haveFocus = false;
   currDisplay = NULL;
 }