fix crashes in wxGTK3 when running with non-X11 backend, see #16688

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@78167 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2014-11-20 17:04:13 +00:00
parent b32e89eb64
commit 4dccdf3749
4 changed files with 42 additions and 21 deletions

View File

@@ -780,28 +780,31 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
}
#ifdef GDK_WINDOWING_X11
// we want to always get the same key code when the same key is
// pressed regardless of the state of the modifiers, i.e. on a
// standard US keyboard pressing '5' or '%' ('5' key with
// Shift) should result in the same key code in OnKeyDown():
// '5' (although OnChar() will get either '5' or '%').
//
// to do it we first translate keysym to keycode (== scan code)
// and then back but always using the lower register
Display *dpy = (Display *)wxGetDisplay();
KeyCode keycode = XKeysymToKeycode(dpy, keysym);
if (GDK_IS_X11_DISPLAY(gdk_window_get_display(gdk_event->window)))
{
// we want to always get the same key code when the same key is
// pressed regardless of the state of the modifiers, i.e. on a
// standard US keyboard pressing '5' or '%' ('5' key with
// Shift) should result in the same key code in OnKeyDown():
// '5' (although OnChar() will get either '5' or '%').
//
// to do it we first translate keysym to keycode (== scan code)
// and then back but always using the lower register
Display *dpy = (Display *)wxGetDisplay();
KeyCode keycode = XKeysymToKeycode(dpy, keysym);
wxLogTrace(TRACE_KEYS, wxT("\t-> keycode %d"), keycode);
wxLogTrace(TRACE_KEYS, wxT("\t-> keycode %d"), keycode);
#ifdef HAVE_X11_XKBLIB_H
KeySym keysymNormalized = XkbKeycodeToKeysym(dpy, keycode, 0, 0);
KeySym keysymNormalized = XkbKeycodeToKeysym(dpy, keycode, 0, 0);
#else
KeySym keysymNormalized = XKeycodeToKeysym(dpy, keycode, 0);
KeySym keysymNormalized = XKeycodeToKeysym(dpy, keycode, 0);
#endif
// use the normalized, i.e. lower register, keysym if we've
// got one
key_code = keysymNormalized ? keysymNormalized : keysym;
// use the normalized, i.e. lower register, keysym if we've
// got one
key_code = keysymNormalized ? keysymNormalized : keysym;
}
#else
key_code = keysym;
#endif