tml@HEMULI.TIK.VTT.FI (Tor Lillqvist) (10/25/90)
X Window System Bug Report
xbugs@expo.lcs.mit.edu
VERSION:
R4
CLIENT MACHINE and OPERATING SYSTEM:
Irrelevant
DISPLAY TYPE:
Irrelevant
WINDOW MANAGER:
Irrelevant
AREA:
Xlib
SYNOPSIS:
XLookupString assumes US keyboard layout
DESCRIPTION:
In mit/lib/X/XKeyBind.c we find the following code fragment, which
is invoked from XLookupString:
/* only apply Control key if it makes sense, else ignore it */
if (modifiers & ControlMask) {
if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
else if (c == '2') c = '\000';
else if (c >= '3' && c <= '7') c -= ('3' - '\033');
else if (c == '8') c = '\177';
else if (c == '/') c = '_' & 0x1F;
}
This clearly assumes that the keyboard is of the US variety, where
shift-2 is '@', shift-8 is '?' etc. When the user types
control-2, we can assume he means control-shift-2, i.e. control-@
== '\000'.
However, for example on Finnish keyboards shift-2 is '"'. I think
it would be more correct to check what the second keysym
associated with the keycode is, and if it such that it can be
controlified, use that.
In the Finnish keyboard case, control-2, i.e. control-", doesn't
make sense. But for instance shift-+ is '?', and typing control-+
could reasonably be expected to produce control-?, which commonly
is taken to mean '\177'.
REPEAT BY:
SAMPLE FIX:
*** XKeyBind.c Tue Dec 12 02:09:42 1989
--- XKeyBind.new.c Thu Oct 25 10:37:25 1990
***************
*** 302,309 ****
}
static int
! XTranslateKeySym(dpy, symbol, modifiers, buffer, nbytes)
Display *dpy;
register KeySym symbol;
unsigned int modifiers;
char *buffer;
--- 302,310 ----
}
static int
! XTranslateKeySym(dpy, kc, symbol, modifiers, buffer, nbytes)
Display *dpy;
+ KeyCode kc;
register KeySym symbol;
unsigned int modifiers;
char *buffer;
***************
*** 351,362 ****
else
c = symbol & 0xFF;
/* only apply Control key if it makes sense, else ignore it */
if (modifiers & ControlMask) {
if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
! else if (c == '2') c = '\000';
! else if (c >= '3' && c <= '7') c -= ('3' - '\033');
! else if (c == '8') c = '\177';
! else if (c == '/') c = '_' & 0x1F;
}
buffer[0] = c;
return 1;
--- 352,371 ----
else
c = symbol & 0xFF;
/* only apply Control key if it makes sense, else ignore it */
+ /* Control of ' ', '?' or '@' .. '~' makes sense,
+ or control of a key whose shifted keysym is in the above set */
if (modifiers & ControlMask) {
if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
! else if (c == '?') c = '\177';
! else {
! KeySym shifted = KeyCodetoKeySym(dpy, kc, 1);
! int s = 0;
! if ((shifted >> 8) == 0 &&
! ((s = (shifted & 0xFF)) >= '@' && s < '\177') || s == ' ')
! c = s & 0x1F;
! else if (s == '?')
! c = '\177';
! }
}
buffer[0] = c;
return 1;
***************
*** 381,388 ****
if (keysym)
*keysym = symbol;
/* arguable whether to use (event->state & ~modifiers) here */
! return XTranslateKeySym(event->display, symbol, event->state,
! buffer, nbytes);
}
#if NeedFunctionPrototypes
--- 390,397 ----
if (keysym)
*keysym = symbol;
/* arguable whether to use (event->state & ~modifiers) here */
! return XTranslateKeySym(event->display, event->keycode, symbol,
! event->state, buffer, nbytes);
}
#if NeedFunctionPrototypes