Fix crash in Xephyr when running on host X with keymap width < 4 ( i.e xvnc )
This commit is contained in:
parent
21e3e3ca29
commit
90a9b82272
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user