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