Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/mcs/class
diff options
context:
space:
mode:
authorKarl <5079870+PreferLinux@users.noreply.github.com>2020-01-13 19:12:10 +0300
committerAlexander Köplinger <alex.koeplinger@outlook.com>2020-01-13 19:12:10 +0300
commit42956f554bf18dbfbc5f30e4d74f1c54df15f0b4 (patch)
treef20896b0a517de9c6974a05d67dc91982e40232b /mcs/class
parent7a8242ed362ae1176d5c38cbe5287b7332490d63 (diff)
[Winforms] Improve X11 keyboard handling. (#18428)
- Ignore key events with vkey == 0. They won't match a real key code so don't try. Besides, trying can cause segfaults on ChromeOS Linux mode. - Check special-case keys (numpad) before looping to get them. No point leaving them for afterwards...
Diffstat (limited to 'mcs/class')
-rw-r--r--mcs/class/System.Windows.Forms/System.Windows.Forms/X11Keyboard.cs23
1 files changed, 14 insertions, 9 deletions
diff --git a/mcs/class/System.Windows.Forms/System.Windows.Forms/X11Keyboard.cs b/mcs/class/System.Windows.Forms/System.Windows.Forms/X11Keyboard.cs
index f3123733b87..d2de95a5103 100644
--- a/mcs/class/System.Windows.Forms/System.Windows.Forms/X11Keyboard.cs
+++ b/mcs/class/System.Windows.Forms/System.Windows.Forms/X11Keyboard.cs
@@ -416,6 +416,11 @@ namespace System.Windows.Forms {
return 0;
}
+ if (vkey == 0) {
+ buffer = String.Empty;
+ return 0;
+ }
+
XEvent e = new XEvent ();
e.AnyEvent.type = XEventName.KeyPress;
e.KeyEvent.display = display;
@@ -440,6 +445,15 @@ namespace System.Windows.Forms {
e.KeyEvent.state |= AltGrMask;
+ if ((vkey >= (int) VirtualKeys.VK_NUMPAD0) && (vkey <= (int) VirtualKeys.VK_NUMPAD9))
+ e.KeyEvent.keycode = XKeysymToKeycode (display, vkey - (int) VirtualKeys.VK_NUMPAD0 + (int) KeypadKeys.XK_KP_0);
+
+ if (vkey == (int) VirtualKeys.VK_DECIMAL)
+ e.KeyEvent.keycode = XKeysymToKeycode (display, (int) KeypadKeys.XK_KP_Decimal);
+
+ if (vkey == (int) VirtualKeys.VK_SEPARATOR)
+ e.KeyEvent.keycode = XKeysymToKeycode(display, (int) KeypadKeys.XK_KP_Separator);
+
for (int keyc = min_keycode; (keyc <= max_keycode) && (e.KeyEvent.keycode == 0); keyc++) {
// find keycode that could have generated this vkey
if ((keyc2vkey [keyc] & 0xFF) == vkey) {
@@ -452,15 +466,6 @@ namespace System.Windows.Forms {
}
}
- if ((vkey >= (int) VirtualKeys.VK_NUMPAD0) && (vkey <= (int) VirtualKeys.VK_NUMPAD9))
- e.KeyEvent.keycode = XKeysymToKeycode (display, vkey - (int) VirtualKeys.VK_NUMPAD0 + (int) KeypadKeys.XK_KP_0);
-
- if (vkey == (int) VirtualKeys.VK_DECIMAL)
- e.KeyEvent.keycode = XKeysymToKeycode (display, (int) KeypadKeys.XK_KP_Decimal);
-
- if (vkey == (int) VirtualKeys.VK_SEPARATOR)
- e.KeyEvent.keycode = XKeysymToKeycode(display, (int) KeypadKeys.XK_KP_Separator);
-
if (e.KeyEvent.keycode == 0 && vkey != (int) VirtualKeys.VK_NONAME) {
// And I couldn't find the keycode so i returned the vkey and was like whatever
Console.Error.WriteLine ("unknown virtual key {0:X}", vkey);