The big keysym cleanup, to bring implementation in line with the recent revision of Appendix A of the protocol spec. (Markus Kuhn)

This commit is contained in:
Markus Kuhn 2004-09-26 20:46:17 +00:00
parent 2e02a95dcc
commit 48932d9b71
4 changed files with 42 additions and 137 deletions

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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");
}