|
|
1.1 ! root 1: #include "copyright.h" ! 2: ! 3: /* $Header: XModMap.c,v 11.3 87/09/13 00:32:22 toddb Exp $ */ ! 4: /* Copyright Massachusetts Institute of Technology 1986 */ ! 5: ! 6: #define NEED_REPLIES ! 7: #include "Xlibint.h" ! 8: ! 9: XModifierKeymap * ! 10: XGetModifierMapping(dpy) ! 11: register Display *dpy; ! 12: { ! 13: xGetModifierMappingReply rep; ! 14: register xReq *req; ! 15: unsigned int nbytes; ! 16: XModifierKeymap *res; ! 17: ! 18: LockDisplay(dpy); ! 19: GetEmptyReq(GetModifierMapping, req); ! 20: (void) _XReply (dpy, (xReply *)&rep, 0, xFalse); ! 21: ! 22: nbytes = (long)rep.length << 2; ! 23: res = (XModifierKeymap *) Xmalloc(sizeof (XModifierKeymap)); ! 24: res->modifiermap = (KeyCode *) Xmalloc (nbytes); ! 25: _XReadPad(dpy, res->modifiermap, nbytes); ! 26: res->max_keypermod = rep.numKeyPerModifier; ! 27: ! 28: UnlockDisplay(dpy); ! 29: SyncHandle(); ! 30: return (res); ! 31: } ! 32: ! 33: /* ! 34: * Returns: ! 35: * 0 Success ! 36: * 1 Busy - one or more old or new modifiers are down ! 37: * 2 Failed - one or more new modifiers unacceptable ! 38: */ ! 39: int ! 40: XSetModifierMapping(dpy, modifier_map) ! 41: register Display *dpy; ! 42: register XModifierKeymap *modifier_map; ! 43: { ! 44: register xSetModifierMappingReq *req; ! 45: xSetModifierMappingReply rep; ! 46: int mapSize = modifier_map->max_keypermod << 3; /* 8 modifiers */ ! 47: ! 48: LockDisplay(dpy); ! 49: GetReqExtra(SetModifierMapping, mapSize, req); ! 50: ! 51: req->numKeyPerModifier = modifier_map->max_keypermod; ! 52: ! 53: bcopy(modifier_map->modifiermap, (char *)&req[1], mapSize); ! 54: ! 55: (void) _XReply(dpy, (xReply *) & rep, ! 56: (sizeof(xSetModifierMappingReply) - sizeof(xReply)) >> 2, xTrue); ! 57: UnlockDisplay(dpy); ! 58: SyncHandle(); ! 59: return (rep.success); ! 60: } ! 61: ! 62: XModifierKeymap * ! 63: XNewModifiermap(keyspermodifier) ! 64: int keyspermodifier; ! 65: { ! 66: XModifierKeymap *res = (XModifierKeymap *) Xmalloc((sizeof (XModifierKeymap))); ! 67: ! 68: res->max_keypermod = keyspermodifier; ! 69: res->modifiermap = (keyspermodifier > 0 ? ! 70: (KeyCode *) Xmalloc(8 * keyspermodifier) ! 71: : (KeyCode *) NULL); ! 72: return (res); ! 73: } ! 74: ! 75: void ! 76: XFreeModifiermap(map) ! 77: XModifierKeymap *map; ! 78: { ! 79: if (map) { ! 80: if (map->modifiermap) ! 81: Xfree((char *) map->modifiermap); ! 82: Xfree((char *) map); ! 83: } ! 84: } ! 85: ! 86: XModifierKeymap * ! 87: XInsertModifiermapEntry(map, keysym, modifier) ! 88: XModifierKeymap *map; ! 89: KeyCode keysym; ! 90: int modifier; ! 91: { ! 92: XModifierKeymap *newmap; ! 93: int i, ! 94: row = modifier * map->max_keypermod, ! 95: newrow, ! 96: lastrow; ! 97: ! 98: for (i=0; i<map->max_keypermod; i++) { ! 99: if (map->modifiermap[ row+i ] == keysym) ! 100: return(map); /* already in the map */ ! 101: if (map->modifiermap[ row+i ] == 0) { ! 102: map->modifiermap[ row+i ] = keysym; ! 103: return(map); /* we added it without stretching the map */ ! 104: } ! 105: } ! 106: ! 107: /* stretch the map */ ! 108: newmap = XNewModifiermap(map->max_keypermod+1); ! 109: newrow = row = 0; ! 110: lastrow = map->max_keypermod * 8; ! 111: while (row < lastrow) { ! 112: for (i=0; i<map->max_keypermod; i++) ! 113: newmap->modifiermap[ newrow+i ] = map->modifiermap[ row+i ]; ! 114: newmap->modifiermap[ newrow+i ] = 0; ! 115: row += map->max_keypermod; ! 116: newrow += newmap->max_keypermod; ! 117: } ! 118: XFreeModifiermap(map); ! 119: newrow = newmap->max_keypermod * modifier + newmap->max_keypermod - 1; ! 120: newmap->modifiermap[ newrow ] = keysym; ! 121: return(newmap); ! 122: } ! 123: ! 124: XModifierKeymap * ! 125: XDeleteModifiermapEntry(map, keysym, modifier) ! 126: XModifierKeymap *map; ! 127: KeyCode keysym; ! 128: int modifier; ! 129: { ! 130: int i, ! 131: row = modifier * map->max_keypermod; ! 132: ! 133: for (i=0; i<map->max_keypermod; i++) { ! 134: if (map->modifiermap[ row+i ] == keysym) ! 135: map->modifiermap[ row+i ] = 0; ! 136: } ! 137: /* should we shrink the map?? */ ! 138: return (map); ! 139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.