Author: jackson
Date: 2006-07-04 17:15:58 -0400 (Tue, 04 Jul 2006)
New Revision: 62250

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs
Log:

        * XplatUIX11.cs: Enable key auto repeat. If the user doesn't
        * have
        XKB or key auto repeat, do it manually.  Without key auto
repeat,
        when a key is held down we get key press, key release, key
press,
        key release, ... with auto repeat we get key press, key press,
key
        press ..., and then a release when the key is actually released.




Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2006-07-04 20:40:46 UTC (rev 62249)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2006-07-04 21:15:58 UTC (rev 62250)
@@ -1,3 +1,11 @@
+2006-07-04  Jackson Harper  <[EMAIL PROTECTED]>
+
+       * XplatUIX11.cs: Enable key auto repeat. If the user doesn't have
+       XKB or key auto repeat, do it manually.  Without key auto repeat,
+       when a key is held down we get key press, key release, key press,
+       key release, ... with auto repeat we get key press, key press, key
+       press ..., and then a release when the key is actually released.
+
 2006-07-03  Jackson Harper  <[EMAIL PROTECTED]>
 
        * TabControl.cs:

Modified: 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs    
2006-07-04 20:40:46 UTC (rev 62249)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs    
2006-07-04 21:15:58 UTC (rev 62250)
@@ -106,8 +106,8 @@
                private static Socket           wake;                   //
                private static Socket           wake_receive;           //
                private static byte[]           network_buffer;         //
+               private static bool             detectable_key_auto_repeat;
 
-
                // Focus tracking
                private static IntPtr           ActiveWindow;           // 
Handle of the active window
                private static IntPtr           FocusWindow;            // 
Handle of the window with keyboard focus (if any)
@@ -181,6 +181,16 @@
                        SetDisplay(XOpenDisplay(IntPtr.Zero));
                        X11DesktopColors.Initialize();
 
+                       
+                       // Disable keyboard autorepeat
+                       try {
+                               XkbSetDetectableAutoRepeat (DisplayHandle, 
true,  IntPtr.Zero);
+                               detectable_key_auto_repeat = true;
+                       } catch {
+                               Console.Error.WriteLine ("Could not disable 
keyboard auto repeat, will attempt to disable manually.");
+                               detectable_key_auto_repeat = false;
+                       }
+
                        // Handle any upcoming errors; we re-set it here, 
X11DesktopColor stuff might have stolen it (gtk does)
                        ErrorHandler = new XErrorHandler(HandleError);
                        XSetErrorHandler(ErrorHandler);
@@ -1344,8 +1354,21 @@
                                                break;
                                        }
 
+                               case XEventName.KeyRelease:
+                                       if (!detectable_key_auto_repeat && 
XPending (DisplayHandle) != 0) {
+                                               XEvent nextevent = new XEvent 
();
+
+                                               XPeekEvent (DisplayHandle, ref 
nextevent);
+
+                                               if (nextevent.type == 
XEventName.KeyPress &&
+                                                   nextevent.KeyEvent.keycode 
== xevent.KeyEvent.keycode &&
+                                                   nextevent.KeyEvent.time == 
xevent.KeyEvent.time) {
+                                                       continue;
+                                               }
+                                       }
+                                       goto case XEventName.KeyPress;
+                                       
                                        case XEventName.KeyPress:
-                                       case XEventName.KeyRelease:
                                        case XEventName.ButtonPress:
                                        case XEventName.ButtonRelease:
                                        case XEventName.MotionNotify:
@@ -4872,6 +4895,12 @@
 
                [DllImport ("libX11", EntryPoint="XFilterEvent")]
                internal extern static bool XFilterEvent(ref XEvent xevent, 
IntPtr window);
+
+               [DllImport ("libX11")]
+               internal extern static void XkbSetDetectableAutoRepeat (IntPtr 
display, bool detectable, IntPtr supported);
+
+               [DllImport ("libX11")]
+               internal extern static void XPeekEvent (IntPtr display, ref 
XEvent xevent);
                #endregion
        }
 }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to