dpyinfo->hyper_mod_mask &= ~dpyinfo->super_mod_mask;
XFree (syms);
- XFreeModifiermap (mods);
+
+ if (dpyinfo->modmap)
+ XFreeModifiermap (dpyinfo->modmap);
+ dpyinfo->modmap = mods;
}
/* Convert between the modifier bits X uses and the modifier bits
/* `xkey' will be modified, but it's not important to modify
`event' itself. */
XKeyEvent xkey = event->xkey;
+ int i;
#ifdef USE_GTK
/* Don't pass keys to GTK. A Tab will shift focus to the
if (modifiers & dpyinfo->meta_mod_mask)
memset (&compose_status, 0, sizeof (compose_status));
+#ifdef HAVE_XKB
+ if (FRAME_DISPLAY_INFO (f)->xkb_desc)
+ {
+ XkbDescRec *rec = FRAME_DISPLAY_INFO (f)->xkb_desc;
+
+ if (rec->map->modmap && rec->map->modmap[xkey.keycode])
+ goto done_keysym;
+ }
+ else
+#endif
+ {
+ if (dpyinfo->modmap)
+ {
+ for (i = 0; i < 8 * dpyinfo->modmap->max_keypermod; i++)
+ {
+ if (xkey.keycode == dpyinfo->modmap->modifiermap[i])
+ goto done_keysym;
+ }
+ }
+ }
+
#ifdef HAVE_X_I18N
if (FRAME_XIC (f))
{
}
#endif
+#ifdef HAVE_XKB
+ if (FRAME_DISPLAY_INFO (f)->xkb_desc)
+ {
+ XkbDescRec *rec = FRAME_DISPLAY_INFO (f)->xkb_desc;
+
+ if (rec->map->modmap && rec->map->modmap[xev->detail])
+ goto done_keysym;
+ }
+ else
+#endif
+ {
+ if (dpyinfo->modmap)
+ {
+ for (i = 0; i < 8 * dpyinfo->modmap->max_keypermod; i++)
+ {
+ if (xkey.keycode == dpyinfo->modmap->modifiermap[xev->detail])
+ goto done_keysym;
+ }
+ }
+ }
+
#ifdef HAVE_XKB
if (dpyinfo->xkb_desc)
{
XCloseDisplay (dpyinfo->display);
#endif
#endif /* ! USE_GTK */
+
+ if (dpyinfo->modmap)
+ XFreeModifiermap (dpyinfo->modmap);
/* Do not close the connection here because it's already closed
by X(t)CloseDisplay (Bug#18403). */
dpyinfo->display = NULL;
Atom Xatom_Meta, Xatom_Super, Xatom_Hyper, Xatom_ShiftLock, Xatom_Alt;
#endif
+ /* Core modifier map when XKB is not present. */
+ XModifierKeymap *modmap;
+
#ifdef HAVE_XRANDR
int xrandr_major_version;
int xrandr_minor_version;