emacs_abort ();
}
else
- nbytes = XLookupString (&xkey, (char *) copy_bufptr,
- copy_bufsiz, &keysym,
- &compose_status);
-#else
- nbytes = XLookupString (&xkey, (char *) copy_bufptr,
- copy_bufsiz, &keysym,
- &compose_status);
#endif
+ {
+#ifdef HAVE_XKB
+ int overflow;
+ unsigned int consumed;
+
+ if (dpyinfo->xkb_desc)
+ {
+ if (!XkbTranslateKeyCode (dpyinfo->xkb_desc,
+ xkey.keycode, xkey.state,
+ &consumed, &keysym))
+ goto done_keysym;
+
+ modifiers &= ~consumed;
+ overflow = 0;
+
+ nbytes = XkbTranslateKeySym (dpyinfo->display, &keysym,
+ xkey.state & ~consumed,
+ (char *) copy_bufptr,
+ copy_bufsiz, &overflow);
+
+ if (overflow)
+ {
+ copy_bufptr = SAFE_ALLOCA ((copy_bufsiz += overflow)
+ * sizeof *copy_bufptr);
+ overflow = 0;
+ nbytes = XkbTranslateKeySym (dpyinfo->display, &keysym,
+ xkey.state & ~consumed,
+ (char *) copy_bufptr,
+ copy_bufsiz, &overflow);
+
+ if (overflow)
+ nbytes = 0;
+ }
+
+ if (nbytes)
+ coding = Qnil;
+ }
+ else
+#endif
+ nbytes = XLookupString (&xkey, (char *) copy_bufptr,
+ copy_bufsiz, &keysym,
+ &compose_status);
+ }
#ifdef XK_F1
if (x_dnd_in_progress && keysym == XK_F1)
}
#endif
+#ifdef HAVE_XKB
+ mods_rtrn = 0;
+#endif
+
x_display_set_last_user_time (dpyinfo, xev->time,
xev->send_event);
ignore_next_mouse_click_timeout = 0;
#endif
XSETFRAME (inev.ie.frame_or_window, f);
- inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo, state);
inev.ie.timestamp = xev->time;
#ifdef HAVE_X_I18N
}
}
+#ifndef HAVE_XKB
+ inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo, state);
+#else
+ inev.ie.modifiers = x_x_to_emacs_modifiers (dpyinfo,
+ state & ~mods_rtrn);
+#endif
+
#ifdef XK_F1
if (x_dnd_in_progress && keysym == XK_F1)
{