|
|
1.1 ! root 1: x_keymap = cluster is load, getc, gets ! 2: ! 3: rep = null ! 4: ! 5: mapsub = 85 ! 6: ! 7: qb = sequence[bool] ! 8: ! 9: slmin = 192 ! 10: ! 11: slmap = qb$[true, % 0301 q ! 12: true, % 0302 a ! 13: true, % 0303 z ! 14: false, % 0304 ! 15: false, % 0305 2 ! 16: true, % 0306 w ! 17: true, % 0307 s ! 18: true, % 0310 x ! 19: false, % 0311 < ! 20: false, % 0312 ! 21: false, % 0313 3 ! 22: true, % 0314 e ! 23: true, % 0315 d ! 24: true, % 0316 c ! 25: false, % 0317 ! 26: false, % 0320 4 ! 27: true, % 0321 r ! 28: true, % 0322 f ! 29: true, % 0323 v ! 30: false, % 0324 space ! 31: false, % 0325 ! 32: false, % 0326 5 ! 33: true, % 0327 t ! 34: true, % 0330 g ! 35: true, % 0331 b ! 36: false, % 0332 ! 37: false, % 0333 6 ! 38: true, % 0334 y ! 39: true, % 0335 h ! 40: true, % 0336 n ! 41: false, % 0337 ! 42: false, % 0340 7 ! 43: true, % 0341 u ! 44: true, % 0342 j ! 45: true, % 0343 m ! 46: false, % 0344 ! 47: false, % 0345 8 ! 48: true, % 0346 i ! 49: true, % 0347 k ! 50: false, % 0350 , ! 51: false, % 0351 ! 52: false, % 0352 9 ! 53: true, % 0353 o ! 54: true, % 0354 l ! 55: false, % 0355 . ! 56: false, % 0356 ! 57: false, % 0357 0 ! 58: true % 0360 p ! 59: ] ! 60: ! 61: qs = sequence[string] ! 62: ! 63: % plain,S,M,M-S,C,C-S,C-M,C-M-S ! 64: ! 65: charmap = qs$[ ! 66: "\330\330\330\330\330\330\330\330", % 0126 F1/Hold Screen ! 67: "\324\324\324\324\324\324\324\324", % 0127 F2/Print Screen ! 68: "\325\325\325\325\325\325\325\325", % 0130 F3/Set-Up ! 69: "\326\326\326\326\326\326\326\326", % 0131 F4 ! 70: "\327\327\327\327\327\327\327\327", % 0132 F5/Break ! 71: "", % 0133 ! 72: "", % 0134 ! 73: "", % 0135 ! 74: "", % 0136 ! 75: "", % 0137 ! 76: "", % 0140 ! 77: "", % 0141 ! 78: "", % 0142 ! 79: "", % 0143 ! 80: "\341\341\341\341\341\341\341\341", % 0144 F6 ! 81: "\342\342\342\342\342\342\342\342", % 0145 F7 ! 82: "\343\343\343\343\343\343\343\343", % 0146 F8 ! 83: "\344\344\344\344\344\344\344\344", % 0147 F9 ! 84: "\345\345\345\345\345\345\345\345", % 0150 F10 ! 85: "", % 0151 ! 86: "", % 0152 ! 87: "", % 0153 ! 88: "", % 0154 ! 89: "", % 0155 ! 90: "", % 0156 ! 91: "", % 0157 ! 92: "", % 0160 ! 93: "\033\033\033\033\033\033\033\033", % 0161 F11/ESC ! 94: "\b\b\210\210\b\b\210\210", % 0162 F12/BS ! 95: "\n\n\212\212\n\n\212\212", % 0163 F13/LF ! 96: "", % 0164 F14 ! 97: "", % 0165 ! 98: "", % 0166 ! 99: "", % 0167 ! 100: "", % 0170 ! 101: "", % 0171 ! 102: "", % 0172 ! 103: "", % 0173 ! 104: "", % 0174 Help/F15 ! 105: "", % 0175 Do/F16 ! 106: "", % 0176 ! 107: "", % 0177 ! 108: "\346\346\346\346\346\346\346\346", % 0200 F17 ! 109: "\347\347\347\347\347\347\347\347", % 0201 F18 ! 110: "\350\350\350\350\350\350\350\350", % 0202 F19 ! 111: "\351\351\351\351\351\351\351\351", % 0203 F20/Hyph ! 112: "", % 0204 ! 113: "", % 0205 ! 114: "", % 0206 ! 115: "", % 0207 ! 116: "", % 0210 ! 117: "", % 0211 ! 118: "\261\261\261\261\261\261\261\261", % 0212 Find ! 119: "\262\262\262\262\262\262\262\262", % 0213 Insert ! 120: "\263\263\263\263\263\263\263\263", % 0214 Remove ! 121: "\264\264\264\264\264\264\264\264", % 0215 Select ! 122: "\265\265\265\265\265\265\265\265", % 0216 Prev Screen ! 123: "\266\266\266\266\266\266\266\266", % 0217 Next Screen ! 124: "", % 0220 ! 125: "", % 0221 ! 126: "\360\360\360\360\360\360\360\360", % 0222 R0 ! 127: "", % 0223 ! 128: "\356\356\356\356\356\356\356\356", % 0224 R. ! 129: "\315\315\315\315\315\315\315\315", % 0225 Enter ! 130: "\361\361\361\361\361\361\361\361", % 0226 R1 ! 131: "\362\362\362\362\362\362\362\362", % 0227 R2 ! 132: "\363\363\363\363\363\363\363\363", % 0230 R3 ! 133: "\364\364\364\364\364\364\364\364", % 0231 R4 ! 134: "\365\365\365\365\365\365\365\365", % 0232 R5 ! 135: "\366\366\366\366\366\366\366\366", % 0233 R6 ! 136: "\354\354\354\354\354\354\354\354", % 0234 R, ! 137: "\367\367\367\367\367\367\367\367", % 0235 R7 ! 138: "\370\370\370\370\370\370\370\370", % 0236 R8 ! 139: "\371\371\371\371\371\371\371\371", % 0237 R9 ! 140: "\355\355\355\355\355\355\355\355", % 0240 R- ! 141: "\320\320\320\320\320\320\320\320", % 0241 PF1 ! 142: "\321\321\321\321\321\321\321\321", % 0242 PF2 ! 143: "\322\322\322\322\322\322\322\322", % 0243 PF3 ! 144: "\323\323\323\323\323\323\323\323", % 0244 PF4 ! 145: "", % 0245 ! 146: "", % 0246 ! 147: "\304\304\304\304\304\304\304\304", % 0247 leftarrow ! 148: "\303\303\303\303\303\303\303\303", % 0250 rightarrow ! 149: "\302\302\302\302\302\302\302\302", % 0251 downarrow ! 150: "\301\301\301\301\301\301\301\301", % 0252 uparrow ! 151: "", % 0253 ! 152: "", % 0254 ! 153: "", % 0255 ! 154: "", % 0256 Shift ! 155: "", % 0257 Ctrl ! 156: "", % 0260 Lock ! 157: "", % 0261 Compose Character ! 158: "", % 0262 ! 159: "", % 0263 ! 160: "", % 0264 ! 161: "", % 0265 ! 162: "", % 0266 ! 163: "", % 0267 ! 164: "", % 0270 ! 165: "", % 0271 ! 166: "", % 0272 ! 167: "", % 0273 ! 168: "\177\177\377\377\177\177\377\377", % 0274 back ! 169: "\r\r\215\215\r\r\215\215", % 0275 Return ! 170: "\t\t\211\211\t\t\211\211", % 0276 Tab ! 171: "`~\340\376", % 0277 ` ! 172: "1!\261\2411!", % 0300 1 ! 173: "qQ\361\321\021\021\221\221", % 0301 q ! 174: "aA\341\301\001\001\201\201", % 0302 a ! 175: "zZ\372\332\032\032\232\232", % 0303 z ! 176: "", % 0304 ! 177: "2@\262\3002\000\262\200", % 0305 2 ! 178: "wW\367\327\027\027\227\227", % 0306 w ! 179: "sS\363\323\023\023\223\223", % 0307 s ! 180: "xX\370\330\030\030\230\230", % 0310 x ! 181: "<>\274\276", % 0311 < ! 182: "", % 0312 ! 183: "3#\263\2433#", % 0313 3 ! 184: "eE\345\305\005\005\205\205", % 0314 e ! 185: "dD\344\304\004\004\204\204", % 0315 d ! 186: "cC\343\303\003\003\203\203", % 0316 c ! 187: "", % 0317 ! 188: "4$\264\2444$", % 0320 4 ! 189: "rR\362\322\022\022\222\222", % 0321 r ! 190: "fF\346\306\006\006\206\206", % 0322 f ! 191: "vV\366\326\026\026\226\226", % 0323 v ! 192: " \240\240\000\000\200\200", % 0324 space ! 193: "", % 0325 ! 194: "5%\265\2455%", % 0326 5 ! 195: "tT\364\324\024\024\224\224", % 0327 t ! 196: "gG\347\307\007\007\207\207", % 0330 g ! 197: "bB\342\302\002\002\202\202", % 0331 b ! 198: "", % 0332 ! 199: "6^\266\3366\036\266\236", % 0333 6 ! 200: "yY\371\331\031\031\231\231", % 0334 y ! 201: "hH\350\310\010\010\210\210", % 0335 h ! 202: "nN\356\316\016\016\216\216", % 0336 n ! 203: "", % 0337 ! 204: "7&\267\2467&", % 0340 7 ! 205: "uU\365\325\025\025\225\225", % 0341 u ! 206: "jJ\352\312\012\012\212\212", % 0342 j ! 207: "mM\355\315\015\015\215\215", % 0343 m ! 208: "", % 0344 ! 209: "8*\270\2528*", % 0345 8 ! 210: "iI\351\311\011\011\211\211", % 0346 i ! 211: "kK\353\313\013\013\213\213", % 0347 k ! 212: ",<\254\274", % 0350 , ! 213: "", % 0351 ! 214: "9(\271\2509(", % 0352 9 ! 215: "oO\357\317\017\017\217\217", % 0353 o ! 216: "lL\354\314\014\014\214\214", % 0354 l ! 217: ".>\256\276", % 0355 . ! 218: "", % 0356 ! 219: "0)\260\2510(", % 0357 0 ! 220: "pP\360\320\020\020\220\220", % 0360 p ! 221: "", % 0361 ! 222: ";:\273\272", % 0362 ; ! 223: "/?\257\277\037\037\237\237", % 0363 / ! 224: "", % 0364 ! 225: "=+\275\253", % 0365 = ! 226: "]}\335\375\035\035\235\235", % 0366 ] ! 227: "\\|\334\374\034\034\234\234", % 0367 \ ! 228: "", % 0370 ! 229: "-_\255\337-\037\255\237", % 0371 - ! 230: "[{\333\373\033\033\233\233", % 0372 [ ! 231: "'\"\247\242" % 0373 ' ! 232: ] ! 233: ! 234: multilist = array[multi] ! 235: multi = record[key: int, ! 236: mask: int, ! 237: value: string] ! 238: ! 239: own havemap: bool := false ! 240: own keymap: _bytevec ! 241: own multis: multilist ! 242: ! 243: load = proc (fs: string) ! 244: if string$empty(fs) ! 245: then fs := ".Xkeymap" end ! 246: begin ! 247: fn: file_name := file_name$parse(fs) ! 248: if string$empty(fn.dir) ! 249: then fn := file_name$create(_environ("HOME"), fn.name, ! 250: fn.suffix, fn.other) ! 251: end ! 252: c: _chan := _chan$open(fn, "read", 0) ! 253: if _chan$getc(c, false) ~= '\372' ! 254: then _chan$close(c) ! 255: return ! 256: end ! 257: keymap := _bytevec$create(c.length - 1) ! 258: _chan$getb(c, keymap) ! 259: _chan$close(c) ! 260: havemap := _bytevec$size(keymap) >= 4096 ! 261: multis := multilist$new() ! 262: i: int := 4097 ! 263: while true do ! 264: multilist$addh(multis, ! 265: multi${key: char$c2i(keymap[i]), ! 266: mask: char$c2i(keymap[i + 1]), ! 267: value: string$substr(_cvt[_bytevec, string]( ! 268: keymap), ! 269: i + 3, ! 270: char$c2i(keymap[i + 2]))}) ! 271: i := i + 3 + char$c2i(keymap[i + 2]) ! 272: end ! 273: end except others: end ! 274: end load ! 275: ! 276: getc = proc (key, mask: int) returns (char) signals (none, multi(string)) ! 277: if havemap ! 278: then mask := mask / 2**11 ! 279: c: char := keymap[(key * 16) + mask + 1] ! 280: if c < '\375' ! 281: then return(c) end ! 282: if c = '\376' ! 283: then for m: multi in multilist$elements(multis) do ! 284: if key = m.key cand ! 285: (mask = m.mask cor m.mask = 255) ! 286: then if string$size(m.value) = 1 ! 287: then return(m.value[1]) end ! 288: if string$empty(m.value) ! 289: then signal none end ! 290: signal multi(m.value) ! 291: end ! 292: end ! 293: end ! 294: signal none ! 295: end except when bounds: signal none end ! 296: key := key - mapsub ! 297: keymode: int := mask / 2**12 + 1 ! 298: if (mask / 2**11) // 4 = 1 cand slmap[key + (mapsub - slmin)] ! 299: then keymode := keymode + 1 ! 300: end except when bounds: end ! 301: return(charmap[key][keymode]) ! 302: except when bounds: signal none end ! 303: end getc ! 304: ! 305: gets = proc (key, mask: int) returns (string) signals (none) ! 306: if havemap ! 307: then mask := mask / 2**11 ! 308: c: char := keymap[(key * 16) + mask + 1] ! 309: if c < '\375' ! 310: then return(string$c2s(c)) end ! 311: if c = '\376' ! 312: then for m: multi in multilist$elements(multis) do ! 313: if key = m.key cand ! 314: (mask = m.mask cor m.mask = 255) ! 315: then if string$empty(m.value) ! 316: then signal none end ! 317: return(m.value) ! 318: end ! 319: end ! 320: end ! 321: signal none ! 322: end except when bounds: signal none end ! 323: key := key - mapsub ! 324: keymode: int := mask / 2**12 + 1 ! 325: if (mask / 2**11) // 4 = 1 cand slmap[key + (mapsub - slmin)] ! 326: then keymode := keymode + 1 ! 327: end except when bounds: end ! 328: return(string$c2s(charmap[key][keymode])) ! 329: except when bounds: signal none end ! 330: end gets ! 331: ! 332: end x_keymap
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.