mirror of
https://gitlab.freedesktop.org/xorg/lib/libx11.git
synced 2026-05-08 03:18:07 +02:00
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:
parent
2e02a95dcc
commit
48932d9b71
4 changed files with 42 additions and 137 deletions
139
src/KeyBind.c
139
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue