|
|
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.