diff --git a/src/KeyBind.c b/src/KeyBind.c index 36108245..1911b5a4 100644 --- a/src/KeyBind.c +++ b/src/KeyBind.c @@ -457,9 +457,9 @@ UCSConvertCase( register unsigned code, /* Basic Latin and Latin-1 Supplement, U+0000 to U+00FF */ if (code <= 0x00ff) { - if (code >= 0x0041 && code <= 0x005a) + if (code >= 0x0041 && code <= 0x005a) /* A-Z */ *lower += 0x20; - else if (code >= 0x0061 && code <= 0x007a) + else if (code >= 0x0061 && code <= 0x007a) /* a-z */ *upper -= 0x20; else if ( (code >= 0x00c0 && code <= 0x00d6) || (code >= 0x00d8 && code <= 0x00de) ) @@ -467,10 +467,11 @@ UCSConvertCase( register unsigned code, else if ( (code >= 0x00e0 && code <= 0x00f6) || (code >= 0x00f8 && code <= 0x00fe) ) *upper -= 0x20; - else if (code == 0x00ff) + else if (code == 0x00ff) /* y with diaeresis */ *upper = 0x0178; - else if (code == 0x00b5) + else if (code == 0x00b5) /* micro sign */ *upper = 0x039c; + return; } /* Latin Extended-A, U+0100 to U+017F */ @@ -489,13 +490,14 @@ UCSConvertCase( register unsigned code, *upper -= 1; } else if (code == 0x0130) - *lower = 0x0069; + *lower = 0x0069; else if (code == 0x0131) - *upper = 0x0049; + *upper = 0x0049; else if (code == 0x0178) - *lower = 0x00ff; + *lower = 0x00ff; else if (code == 0x017f) - *upper = 0x0053; + *upper = 0x0053; + return; } /* Latin Extended-B, U+0180 to U+024F */ @@ -531,6 +533,7 @@ UCSConvertCase( register unsigned code, *lower = 0x01bf; else if (code == 0x0220) *lower = 0x019e; + return; } /* IPA Extensions, U+0250 to U+02AF */ @@ -645,6 +648,12 @@ XConvertCase(sym, lower, upper) KeySym *lower; KeySym *upper; { + /* Latin 1 keysym */ + if (sym < 0x100) { + UCSConvertCase(sym, lower, upper); + return; + } + /* Unicode keysym */ if ((sym & 0xff000000) == 0x01000000) { UCSConvertCase((sym & 0x00ffffff), lower, upper); @@ -653,26 +662,12 @@ XConvertCase(sym, lower, upper) return; } + /* Legacy keysym */ + *lower = sym; *upper = sym; switch(sym >> 8) { - case 0: /* Latin 1 */ - if ((sym >= XK_A) && (sym <= XK_Z)) - *lower += (XK_a - XK_A); - else if ((sym >= XK_a) && (sym <= XK_z)) - *upper -= (XK_a - XK_A); - else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis)) - *lower += (XK_agrave - XK_Agrave); - else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis)) - *upper -= (XK_agrave - XK_Agrave); - else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn)) - *lower += (XK_oslash - XK_Ooblique); - else if ((sym >= XK_oslash) && (sym <= XK_thorn)) - *upper -= (XK_oslash - XK_Ooblique); - else if (sym == XK_ydiaeresis) - *upper = XK_Ydiaeresis; /* actually a Latin 9 character */ - break; case 1: /* Latin 2 */ /* Assume the KeySym is a legal value (ignore discontinuities) */ if (sym == XK_Aogonek) @@ -751,63 +746,6 @@ XConvertCase(sym, lower, upper) sym != XK_Greek_finalsmallsigma) *upper -= (XK_Greek_alpha - XK_Greek_ALPHA); break; - case 0x12: /* Latin 8 */ - /* No neat pattern to the values */ - switch (sym) { - case XK_Babovedot: - *lower = XK_babovedot; break; - case XK_babovedot: - *upper = XK_Babovedot; break; - case XK_Dabovedot: - *lower = XK_dabovedot; break; - case XK_Wgrave: - *lower = XK_wgrave; break; - case XK_Wacute: - *lower = XK_wacute; break; - case XK_dabovedot: - *upper = XK_Dabovedot; break; - case XK_Ygrave: - *lower = XK_ygrave; break; - case XK_Fabovedot: - *lower = XK_fabovedot; break; - case XK_fabovedot: - *upper = XK_Fabovedot; break; - case XK_Mabovedot: - *lower = XK_mabovedot; break; - case XK_mabovedot: - *upper = XK_Mabovedot; break; - case XK_Pabovedot: - *lower = XK_pabovedot; break; - case XK_wgrave: - *upper = XK_Wgrave; break; - case XK_pabovedot: - *upper = XK_Pabovedot; break; - case XK_wacute: - *upper = XK_Wacute; break; - case XK_Sabovedot: - *lower = XK_sabovedot; break; - case XK_ygrave: - *upper = XK_Ygrave; break; - case XK_Wdiaeresis: - *lower = XK_wdiaeresis; break; - case XK_wdiaeresis: - *upper = XK_Wdiaeresis; break; - case XK_sabovedot: - *upper = XK_Sabovedot; break; - case XK_Wcircumflex: - *lower = XK_wcircumflex; break; - case XK_Tabovedot: - *lower = XK_tabovedot; break; - case XK_Ycircumflex: - *lower = XK_ycircumflex; break; - case XK_wcircumflex: - *upper = XK_Wcircumflex; break; - case XK_tabovedot: - *upper = XK_Tabovedot; break; - case XK_ycircumflex: - *upper = XK_Ycircumflex; break; - } - break; case 0x13: /* Latin 9 */ if (sym == XK_OE) *lower = XK_oe; @@ -816,45 +754,6 @@ XConvertCase(sym, lower, upper) else if (sym == XK_Ydiaeresis) *lower = XK_ydiaeresis; break; - case 0x14: /* Armenian */ - if (sym >= XK_Armenian_AYB && sym <= XK_Armenian_fe) { - *lower = sym | 1; - *upper = sym & ~1; - } - break; - case 0x16: /* Caucasus, Inupiak, Guarani */ - if (sym == XK_ocaron || sym == XK_Ocaron) { - *upper = XK_Ocaron; - *lower = XK_ocaron; - } - else if (sym >= XK_Ccedillaabovedot && sym <= XK_Obarred) - *lower += (XK_ccedillaabovedot - XK_Ccedillaabovedot); - else if (sym >= XK_ccedillaabovedot && sym <= XK_obarred) - *upper -= (XK_ccedillaabovedot - XK_Ccedillaabovedot); - else if (sym == XK_schwa || sym == XK_SCHWA) { - *lower = XK_schwa; - *upper = XK_SCHWA; - } - else if (sym == XK_lbelowdot || sym == XK_Lbelowdot) { - *lower = XK_lbelowdot; - *upper = XK_Lbelowdot; - } - else if (sym == XK_lstrokebelowdot || sym == XK_Lstrokebelowdot) { - *lower = XK_lstrokebelowdot; - *upper = XK_Lstrokebelowdot; - } - else if (sym == XK_gtilde || sym == XK_Gtilde) { - *lower = XK_gtilde; - *upper = XK_Gtilde; - } - break; - case 0x1e: /* Vietnamese */ - if ((sym >= XK_Abelowdot && sym <= XK_uhornbelowdot) || - (sym >= XK_Ybelowdot && sym <= XK_uhorn)) { - *lower = sym | 1; - *upper = sym & ~1; - } - break; } } diff --git a/src/KeysymStr.c b/src/KeysymStr.c index 5a21f05f..6ac08e60 100644 --- a/src/KeysymStr.c +++ b/src/KeysymStr.c @@ -75,25 +75,28 @@ char *XKeysymToString(ks) int h; register int idx; const unsigned char *entry; - unsigned char val1, val2; + unsigned char val1, val2, val3, val4; XrmDatabase keysymdb; if (!ks || (ks & ((unsigned long) ~0x1fffffff)) != 0) return ((char *)NULL); if (ks == XK_VoidSymbol) ks = 0; - if (ks <= 0xffff) + if (ks <= 0x1fffffff) { - val1 = ks >> 8; - val2 = ks & 0xff; + val1 = ks >> 24; + val2 = ks >> 16; + val3 = ks >> 8; + val4 = ks & 0xff; i = ks % VTABLESIZE; h = i + 1; n = VMAXHASH; while ((idx = hashKeysym[i])) { entry = &_XkeyTable[idx]; - if ((entry[0] == val1) && (entry[1] == val2)) - return ((char *)entry + 2); + if ((entry[0] == val1) && (entry[1] == val2) && + (entry[2] == val1) && (entry[3] == val2)) + return ((char *)entry + 4); if (!--n) break; i += h; @@ -120,7 +123,7 @@ char *XKeysymToString(ks) if (data.name) return data.name; } - if ((ks & 0xff000000) == 0x01000000){ + if (ks >= 0x01000100 && ks <= 0x0110ffff) { KeySym val = ks & 0xffffff; char *s; int i; diff --git a/src/StrKeysym.c b/src/StrKeysym.c index e2818716..086516b2 100644 --- a/src/StrKeysym.c +++ b/src/StrKeysym.c @@ -88,9 +88,10 @@ XStringToKeysym(_Xconst char *s) { entry = &_XkeyTable[idx]; if ((entry[0] == sig1) && (entry[1] == sig2) && - !strcmp(s, (char *)entry + 4)) + !strcmp(s, (char *)entry + 6)) { - val = (entry[2] << 8) | entry[3]; + val = (entry[2] << 24) | (entry[3] << 16) | + (entry[4] << 8) | entry[5]; if (!val) val = XK_VoidSymbol; return val; @@ -137,9 +138,10 @@ XStringToKeysym(_Xconst char *s) else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10; else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10; else return NoSymbol; - } - if (val >= 0x01000000) + if (val < 0x100) + return val; + if (val > 0x10ffff || val < 0x100) return NoSymbol; return val | 0x01000000; } diff --git a/src/util/makekeys.c b/src/util/makekeys.c index 47f90dfd..fad29e38 100644 --- a/src/util/makekeys.c +++ b/src/util/makekeys.c @@ -1,5 +1,5 @@ -/* $Xorg: makekeys.c,v 1.5 2001/02/09 02:03:40 xorgcvs Exp $ */ -/* $XdotOrg: lib/X11/src/util/makekeys.c,v 1.3 2004-05-22 03:47:42 alanc Exp $ */ +/* $Xorg: makekeys.c,v 1.5 2001/02/09 02:03:40 $ */ +/* $XdotOrg: lib/X11/src/util/makekeys.c,v 1.4 2004-09-26 20:46:17 kuhn Exp $ */ /* Copyright 1990, 1998 The Open Group @@ -27,7 +27,7 @@ other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/lib/X11/util/makekeys.c,v 3.6 2001/07/25 15:04:48 dawes Exp $ */ +/* $XFree86: $ */ /* Constructs hash tables for XStringToKeysym and XKeysymToString. */ @@ -97,7 +97,7 @@ main(int argc, char *argv[]) } if (info[ksnum].val == XK_VoidSymbol) info[ksnum].val = 0; - if (info[ksnum].val > 0xffff) { + if (info[ksnum].val > 0x1fffffff) { fprintf(stderr, "ignoring illegal keysym (%s), remove it from .h file!\n", key); @@ -175,10 +175,11 @@ next1: ; offsets[j] = k; indexes[i] = k; val = info[i].val; - printf("0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, ", + printf("0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, ", (sig >> 8) & 0xff, sig & 0xff, + (val >> 24) & 0xff, (val >> 16) & 0xff, (val >> 8) & 0xff, val & 0xff); - for (name = info[i].name, k += 5; (c = *name++); k++) + for (name = info[i].name, k += 7; (c = *name++); k++) printf("'%c',", c); printf((i == (ksnum-1)) ? "0\n" : "0,\n"); }