#define NEED_REPLIES
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
XModifierKeymap *
XGetModifierMapping(register Display *dpy)
{
xGetModifierMappingReply rep;
register xReq *req;
unsigned long nbytes;
XModifierKeymap *res;
LockDisplay(dpy);
GetEmptyReq(GetModifierMapping, req);
(void) _XReply (dpy, (xReply *)&rep, 0, xFalse);
nbytes = (unsigned long)rep.length << 2;
res = (XModifierKeymap *) Xmalloc(sizeof (XModifierKeymap));
if (res) res->modifiermap = (KeyCode *) Xmalloc ((unsigned) nbytes);
if ((! res) || (! res->modifiermap)) {
if (res) Xfree((char *) res);
res = (XModifierKeymap *) NULL;
_XEatData(dpy, nbytes);
} else {
_XReadPad(dpy, (char *) res->modifiermap, (long) nbytes);
res->max_keypermod = rep.numKeyPerModifier;
}
UnlockDisplay(dpy);
SyncHandle();
return (res);
}
int
XSetModifierMapping(
register Display *dpy,
register XModifierKeymap *modifier_map)
{
register xSetModifierMappingReq *req;
xSetModifierMappingReply rep;
int mapSize = modifier_map->max_keypermod << 3;
LockDisplay(dpy);
GetReqExtra(SetModifierMapping, mapSize, req);
req->numKeyPerModifier = modifier_map->max_keypermod;
memcpy((char *) NEXTPTR(req,xSetModifierMappingReq),
(char *) modifier_map->modifiermap,
mapSize);
(void) _XReply(dpy, (xReply *) & rep,
(SIZEOF(xSetModifierMappingReply) - SIZEOF(xReply)) >> 2, xTrue);
UnlockDisplay(dpy);
SyncHandle();
return (rep.success);
}
XModifierKeymap *
XNewModifiermap(int keyspermodifier)
{
XModifierKeymap *res = (XModifierKeymap *) Xmalloc((sizeof (XModifierKeymap)));
if (res) {
res->max_keypermod = keyspermodifier;
res->modifiermap = (keyspermodifier > 0 ?
(KeyCode *) Xmalloc((unsigned) (8 * keyspermodifier))
: (KeyCode *) NULL);
if (keyspermodifier && (res->modifiermap == NULL)) {
Xfree((char *) res);
return (XModifierKeymap *) NULL;
}
}
return (res);
}
int
XFreeModifiermap(XModifierKeymap *map)
{
if (map) {
if (map->modifiermap)
Xfree((char *) map->modifiermap);
Xfree((char *) map);
}
return 1;
}
XModifierKeymap *
XInsertModifiermapEntry(XModifierKeymap *map,
#if NeedWidePrototypes
unsigned int keycode,
#else
KeyCode keycode,
#endif
int modifier)
{
XModifierKeymap *newmap;
int i,
row = modifier * map->max_keypermod,
newrow,
lastrow;
for (i=0; i<map->max_keypermod; i++) {
if (map->modifiermap[ row+i ] == keycode)
return(map);
if (map->modifiermap[ row+i ] == 0) {
map->modifiermap[ row+i ] = keycode;
return(map);
}
}
if ((newmap = XNewModifiermap(map->max_keypermod+1)) == NULL)
return (XModifierKeymap *) NULL;
newrow = row = 0;
lastrow = newmap->max_keypermod * 8;
while (newrow < lastrow) {
for (i=0; i<map->max_keypermod; i++)
newmap->modifiermap[ newrow+i ] = map->modifiermap[ row+i ];
newmap->modifiermap[ newrow+i ] = 0;
row += map->max_keypermod;
newrow += newmap->max_keypermod;
}
(void) XFreeModifiermap(map);
newrow = newmap->max_keypermod * modifier + newmap->max_keypermod - 1;
newmap->modifiermap[ newrow ] = keycode;
return(newmap);
}
XModifierKeymap *
XDeleteModifiermapEntry(XModifierKeymap *map,
#if NeedWidePrototypes
unsigned int keycode,
#else
KeyCode keycode,
#endif
int modifier)
{
int i,
row = modifier * map->max_keypermod;
for (i=0; i<map->max_keypermod; i++) {
if (map->modifiermap[ row+i ] == keycode)
map->modifiermap[ row+i ] = 0;
}
return (map);
}