Fix crash in Xephyr when running on host X with keymap width < 4 ( i.e xvnc )

This commit is contained in:
Matthew Allum 2006-07-08 21:57:07 +01:00
parent 21e3e3ca29
commit 90a9b82272

View File

@ -669,7 +669,7 @@ void
hostx_load_keymap(void) hostx_load_keymap(void)
{ {
KeySym *keymap; KeySym *keymap;
int mapWidth, min_keycode, max_keycode; int host_width, min_keycode, max_keycode, width;
int i,j; int i,j;
XDisplayKeycodes(HostX.dpy, &min_keycode, &max_keycode); XDisplayKeycodes(HostX.dpy, &min_keycode, &max_keycode);
@ -679,25 +679,21 @@ hostx_load_keymap(void)
keymap = XGetKeyboardMapping(HostX.dpy, keymap = XGetKeyboardMapping(HostX.dpy,
min_keycode, min_keycode,
max_keycode - min_keycode + 1, max_keycode - min_keycode + 1,
&mapWidth); &host_width);
/* Try and copy the hosts keymap into our keymap to avoid loads /* Try and copy the hosts keymap into our keymap to avoid loads
* of messing around. * of messing around.
* *
* kdrive cannot can have more than 4 keysyms per keycode * kdrive cannot can have more than 4 keysyms per keycode
* so we only copy the first 4 ( xorg has 6 per keycode ) * so we only copy at most the first 4 ( xorg has 6 per keycode, XVNC 2 )
*/ */
width = (host_width > 4) ? 4 : host_width;
for (i=0; i<(max_keycode - min_keycode+1); i++) for (i=0; i<(max_keycode - min_keycode+1); i++)
for (j=0; j<4; j++) for (j=0; j<width; j++)
kdKeymap[ (i*4)+j ] = keymap[ (i*mapWidth) + j ]; kdKeymap[ (i*width)+j ] = keymap[ (i*host_width) + j ];
/* old way EPHYR_DBG("keymap width, host:%d kdrive:%d", host_width, width);
memcpy (kdKeymap, keymap,
(max_keycode - min_keycode + 1)*mapWidth*sizeof(KeySym));
*/
EPHYR_DBG("keymap width: %d", mapWidth);
/* all kdrive vars - see kkeymap.c */ /* all kdrive vars - see kkeymap.c */
@ -705,7 +701,7 @@ hostx_load_keymap(void)
kdMaxScanCode = max_keycode; kdMaxScanCode = max_keycode;
kdMinKeyCode = min_keycode; kdMinKeyCode = min_keycode;
kdMaxKeyCode = max_keycode; kdMaxKeyCode = max_keycode;
kdKeymapWidth = (mapWidth > 4) ? 4 : mapWidth; kdKeymapWidth = width;
XFree(keymap); XFree(keymap);
} }