7 <EVAL-WHEN ("SUBSYSTEM" "MIMC") <L-FLOAD "UMC-DEFS.MUD">>
9 <MSETG X-DEFAULT-KEYMAP "VSKEYMAP">
11 <REPEAT (INCHAN VECTOR NM2 FIX (STRING '["NORMAL" X-NORMAL-KEYMAP
12 "FUNCTION" X-FUNCTION-KEYMAP]))
14 <COND (<SET INCHAN <GEN-OPEN ,X-DEFAULT-KEYMAP "READ" "BINARY" DISK>>
15 <SET VECTOR <IVECTOR <CHANNEL-OP .INCHAN READ-BYTE> <>>>
16 <SET FIX <CHANNEL-OP .INCHAN READ-BYTE>>
17 <REPEAT ((UVECTOR <STACK <IUVECTOR 6>>))
18 <COND (<0? <CHANNEL-OP .INCHAN READ-BUFFER .UVECTOR>>
20 <PUT .VECTOR <- <1 .UVECTOR> .FIX -1>
21 <CHTYPE <SUBSTRUC .UVECTOR 1 5> KEY>>>
23 <MSETG <2 .STRING> [.FIX .VECTOR]>)
25 <MSETG <2 .STRING> <>>)>
26 <COND (<EMPTY? <SET STRING <REST .STRING 2>>>
29 ; "Input packet types"
35 <MSETG X-NO-SUCH-WINDOW 1>
36 <MSETG X-NULL-WINDOW 2>
37 <MSETG X-PARAMETER-ERROR 3>
38 <MSETG X-UNKNOWN-REQUEST 4>
39 <MSETG X-CANT-OPEN-FONT 5>
41 <MSETG X-CURSOR-ERROR 7>
42 <MSETG X-NEGATIVE-SIZE 8>
43 <MSETG X-ALREADY-GRABBED 9>
44 <MSETG VS-ERRORS ["Window ID was not a Window"
45 "Window ID was not zero"
46 "Bad function code or other parameter"
50 "Cursor raster was NULL"
52 "Keyboard/mouse already grabbed"]>
56 <MSETG KEY-RELEASED 2>
57 <MSETG BUTTON-PRESSED 4>
58 <MSETG BUTTON-RELEASED 8>
59 <MSETG ENTER-WINDOW 16>
60 <MSETG LEAVE-WINDOW 32>
61 <MSETG MOUSE-MOVED 64>
62 <MSETG EXPOSE-WINDOW 128>
63 <MSETG EXPOSE-REGION 256>
64 <MSETG EXPOSE-COPY 512>
65 <MSETG RIGHT-DOWN-MOTION 1024>
66 <MSETG MIDDLE-DOWN-MOTION 2048>
67 <MSETG LEFT-DOWN-MOTION 4096>
68 <MSETG UNMAP-WINDOW 8192>
69 <MSETG MOTION-BITS <+ ,MOUSE-MOVED ,RIGHT-DOWN-MOTION ,MIDDLE-DOWN-MOTION
74 <MSETG X-CONTROL-MASK <HEX "4000">>
75 <MSETG X-META-MASK <HEX "2000">>
76 <MSETG X-SHIFT-MASK <HEX "1000">>
77 <MSETG X-SHIFT-LOCK-MASK <HEX "800">>
78 <MSETG X-LEFT-MASK <HEX "400">>
79 <MSETG X-MIDDLE-MASK <HEX "200">>
80 <MSETG X-RIGHT-MASK <HEX "100">>
82 ; "There are three kinds of keys--shift keys, function keys, and normal keys.
83 Shifts are shift, shift-lock, control, and symbol; function keys are everything
85 <MSETG KEY-MIN-SHIFT 174>
86 <MSETG KEY-MAX-SHIFT 177>
88 <MSETG KEY-MIN-FCN 86>
89 <MSETG KEY-MAX-FCN 170>
91 <MSETG KEY-MIN-NORM 188>
92 <MSETG KEY-MAX-NORM 251>
95 <DEFINE DEFINE-BYTE (NAME WHICH "AUX" OFFS)
96 <SET OFFS </ <+ .WHICH 3> 4>>
98 (<FEATURE? "COMPILER">
99 <EVAL <FORM DEFMAC .NAME (<FORM QUOTE P> "OPTIONAL" <FORM QUOTE NEW>)
101 (<FORM ASSIGNED? NEW>
106 <FORM FORM .OFFS '.P>
107 <BITS 8 <* <MOD .WHICH 4> 8>>
111 <FORM FORM .OFFS '.P>
112 <BITS 8 <* <MOD .WHICH 4> 8>>>)>>>)
114 <EVAL <FORM DEFINE .NAME (P "OPTIONAL" NEW)
115 <FORM COND (<FORM ASSIGNED? NEW>
117 <FORM PUTBITS <FORM .OFFS '.P>
118 <BITS 8 <* <MOD .WHICH 4> 8>>
123 <BITS 8 <* <MOD .WHICH 4> 8>>>)>>>)>>
125 <DEFINE DEFINE-WORD (NAME WHICH "OPTIONAL" (SIZE WORD)
126 "AUX" OFFS LEFT? (LONG? <>) (COMPILER? <>))
127 #DECL ((NAME) ATOM (WHICH) FIX)
128 <COND (<==? .SIZE WORD>
129 <SET OFFS </ <+ .WHICH 1> 2>>
130 <SET LEFT? <0? <MOD .WHICH 2>>>)
132 <COND (<0? <MOD .WHICH 2>>
133 <ERROR LONG-WORD-STARTS-IN-LEFT-HALF .NAME
134 .WHICH DEFINE-WORD>)>
135 <SET OFFS </ <+ .WHICH 1> 2>>
139 <SETG .NAME <OFFSET .OFFS UVECTOR>>
143 (<FEATURE? "COMPILER">
146 (<FORM QUOTE P> "OPTIONAL" <FORM QUOTE NEW>)
148 (<FORM ASSIGNED? NEW>
155 <FORM FORM .OFFS '.P>
160 <FORM FORM .OFFS '.P>
167 <FORM FORM LHW <FORM FORM .OFFS '.P>>)
169 <FORM FORM RHW <FORM FORM .OFFS '.P>>)>))
170 <FORM FORM COND (<FORM FORM 0?
171 <FORM FORM ANDB ''.TEMP
175 <FORM FORM PUTLHW ''.TEMP -1>)>>)>>>)
177 <EVAL <FORM DEFINE .NAME (P "OPTIONAL" NEW "AUX" TEMP)
178 <FORM COND (<FORM ASSIGNED? NEW>
181 <FORM PUTLHW <FORM .OFFS '.P>
184 <FORM PUTRHW <FORM .OFFS '.P>
197 <FORM LHW <FORM .OFFS '.P>>)
199 <FORM RHW <FORM .OFFS '.P>>)>>
201 <FORM PUTLHW '.TEMP -1>)
205 (<GASSIGNED? DEFINE-WORD>
206 ; "Fields of input packet"
207 <DEFINE-WORD I-LPAR0 3 LONG>
208 <DEFINE-WORD I-LPAR1 5 LONG>
209 <DEFINE-WORD I-LPAR2 7 LONG>
210 <DEFINE-WORD I-LPAR3 9 LONG>
211 <DEFINE-WORD I-LPAR4 11 LONG>
213 <DEFINE-WORD I-SPAR0 3>
214 <DEFINE-WORD I-SPAR1 4>
215 <DEFINE-WORD I-SPAR2 5>
216 <DEFINE-WORD I-SPAR3 6>
217 <DEFINE-WORD I-SPAR4 7>
218 <DEFINE-WORD I-SPAR5 8>
219 <DEFINE-WORD I-SPAR6 9>
220 <DEFINE-WORD I-SPAR7 10>
221 <DEFINE-WORD I-SPAR8 11>
222 <DEFINE-WORD I-SPAR9 12>
224 <DEFINE-WORD VSI-CODE 1>
225 <DEFINE-WORD VSI-TIME 2>
226 <MSETG VSI-WINDOW ,I-LPAR0>
227 <SETG VSI-KIND ,I-SPAR2>
228 <SETG VSI-DETAIL ,I-SPAR3>
229 <SETG VSI-X ,I-SPAR4>
230 <SETG VSI-Y ,I-SPAR5>
231 <MSETG VSI-SUBWINDOW ,I-LPAR3>
232 <MSETG VSI-LOC ,I-LPAR4>
233 <SETG VSI-TOP ,I-SPAR8>
234 <SETG VSI-LEFT ,I-SPAR9>
236 <SETG I-ERRCODE ,I-SPAR2>
238 ; "Fields of output packet"
239 <DEFINE-WORD O-CODE 1>
240 <DEFINE-WORD O-FCN 2>
241 <DEFINE-WORD O-FUNC&CODE 1 LONG>
242 <DEFINE-WORD O-WINDOW 3 LONG>
244 <DEFINE-BYTE O-BPAR0 9>
245 <DEFINE-BYTE O-BPAR1 10>
246 <DEFINE-BYTE O-BPAR2 11>
247 <DEFINE-BYTE O-BPAR3 12>
248 <DEFINE-BYTE O-BPAR4 13>
249 <DEFINE-BYTE O-BPAR5 14>
250 <DEFINE-BYTE O-BPAR6 15>
251 <DEFINE-BYTE O-BPAR7 16>
252 <DEFINE-BYTE O-BPAR8 17>
253 <DEFINE-BYTE O-BPAR9 18>
254 <DEFINE-BYTE O-BPAR10 19>
255 <DEFINE-BYTE O-BPAR11 20>
256 <DEFINE-BYTE O-BPAR12 21>
257 <DEFINE-BYTE O-BPAR13 22>
258 <DEFINE-BYTE O-BPAR14 23>
259 <DEFINE-BYTE O-BPAR15 24>
261 <DEFINE-WORD O-SPAR0 5>
262 <DEFINE-WORD O-SPAR1 6>
263 <DEFINE-WORD O-SPAR2 7>
264 <DEFINE-WORD O-SPAR3 8>
265 <DEFINE-WORD O-SPAR4 9>
266 <DEFINE-WORD O-SPAR5 10>
267 <DEFINE-WORD O-SPAR6 11>
268 <DEFINE-WORD O-SPAR7 12>
270 <DEFINE-WORD O-LPAR0 5 LONG>
271 <DEFINE-WORD O-LPAR1 7 LONG>
272 <DEFINE-WORD O-LPAR2 9 LONG>
273 <DEFINE-WORD O-LPAR3 11 LONG>)>
279 <MSETG VWM-CURSOR 16>
280 <MSETG VWM-DEFAULT <+ ,VWM-PAGE ,VWM-WRAP ,VWM-ITS ,VWM-CURSOR>>
281 <MSETG VWM-INVERT 32>
283 <DEFMAC TEST-VW-MODE ('MODE "ARGS" STUFF)
284 <FORM NOT <FORM 0? <FORM ANDB .MODE !.STUFF>>>>
286 <DEFMAC UPDATE-MC ('CH 'X "OPTIONAL" 'Y "AUX" (L ()))
287 <COND (<AND <ASSIGNED? X> .X <OR <NOT <STRUCTURED? .X>>
289 <SET L (<COND (<TYPE? .X LIST>
290 <FORM MC-HPOS '.SU <FORM + <FORM MC-HPOS '.SU>
292 (<FORM MC-HPOS '.SU .X>)>)>)>
293 <COND (<AND <ASSIGNED? Y> .Y <OR <NOT <STRUCTURED? .Y>>
295 <SET L (<COND (<TYPE? .Y LIST>
296 <FORM MC-VPOS '.SU <FORM + <FORM MC-VPOS '.SU>
298 (<FORM MC-VPOS '.SU .Y>)> !.L)>)>
299 <COND (<NOT <EMPTY? .L>>
300 <FORM BIND ((SU <FORM CHANNEL-USER .CH>))
301 <FORM COND (<FORM TYPE? '.SU MUD-CHAN> !.L)>>)>>