Raw keysyms were not getting parsed correctly, due to forgetting to add the code to libX11, forgetting to add the backwards-compat code for old libX11s, and then stuffing the lexing up anyway. Yeesh.
Signed-off-by: Daniel Stone <[email protected]> --- configure.ac | 1 + parseutils.c | 12 ++++++++++++ xkbparse.y | 2 +- 3 files changed, 14 insertions(+), 1 deletions(-) diff --git a/configure.ac b/configure.ac index 3ad342c..6ed68c6 100644 --- a/configure.ac +++ b/configure.ac @@ -41,6 +41,7 @@ AC_PROG_INSTALL AC_CHECK_FUNCS([strdup strcasecmp]) +AC_CHECK_HEADERS([limits.h]) # Checks for pkg-config packages PKG_CHECK_MODULES(XKBCOMP, x11 xkbfile) diff --git a/parseutils.c b/parseutils.c index d59e3fb..3242965 100644 --- a/parseutils.c +++ b/parseutils.c @@ -30,6 +30,10 @@ #include <X11/keysym.h> #include <X11/extensions/XKBgeom.h> #include <X11/Xalloca.h> +#ifdef HAVE_LIMITS_H +#include <limits.h> +#endif +#include <stdlib.h> XkbFile *rtrnValue; @@ -623,6 +627,7 @@ int LookupKeysym(char *str, KeySym * sym_rtrn) { KeySym sym; + char *tmp; if ((!str) || (uStrCaseCmp(str, "any") == 0) || (uStrCaseCmp(str, "nosymbol") == 0)) @@ -642,6 +647,13 @@ LookupKeysym(char *str, KeySym * sym_rtrn) *sym_rtrn = sym; return 1; } + if (strlen(str) > 2 && str[0] == '0' && str[1] == 'x') { + sym = strtoul(str, &tmp, 16); + if (sym != ULONG_MAX && (!tmp || *tmp == '\0')) { + *sym_rtrn = sym; + return 1; + } + } return 0; } diff --git a/xkbparse.y b/xkbparse.y index 862acd8..d73b92a 100644 --- a/xkbparse.y +++ b/xkbparse.y @@ -726,7 +726,7 @@ KeySym : IDENT { $$= strdup(scanBuf); } | Integer { if ($1<10) { $$= malloc(2); $$[0]= '0' + $1; $$[1]= '\0'; } - else { $$= malloc(17); snprintf($$, 17, "%x", $1); } + else { $$= malloc(19); snprintf($$, 19, "0x%x", $1); } } ; -- 1.7.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
