|
|
1.1 root 1: /*
2:
3: Copyright 1986 by the University of Utah
4:
5: Permission to use, copy, modify, and distribute this
6: software and its documentation for any purpose and without
7: fee is hereby granted, provided that the above copyright
8: notice appear in all copies and that both that copyright
9: notice and this permission notice appear in supporting
10: documentation, and that the name of the University of Utah
11: not be used in advertising or publicity pertaining to
12: distribution of the software without specific, written
13: prior permission. The University of Utah makes no
14: representations about the suitability of this software for
15: any purpose. It is provided "as is" without express or
16: implied warranty.
17:
18: */
19:
20: /*
21:
22: Copyright (C) 1986, Leonard N. Zubkoff All Rights Reserved */
23:
24:
25: /*
26: * ToDo:
27: * Up events
28: * Shiftlock support
29: */
30:
31: #include <stdio.h>
32: #include <sys/time.h>
33: #include <sys/errno.h>
34: #include <sys/wait.h>
35:
36: #define do
37: #define hidden static
38: #define visible
39: #define procedure void
40:
41: #include "Xapollo.h"
42: #include "/sys/ins/ios.ins.c"
43: #include "/sys/ins/io_traits.ins.c"
44: #include "/sys/ins/trait.ins.c"
45: #include "/sys/ins/kbd.ins.c"
46: #include "/sys/ins/smdu.ins.c"
47: #include "/sys/ins/tone.ins.c"
48: #include "/sys/ins/ec2.ins.c"
49:
50:
51: /* Should be qevent.h */
52: #define VSE_LEFT_BUTTON 0
53: #define VSE_MIDDLE_BUTTON 1
54: #define VSE_RIGHT_BUTTON 2
55:
56: #define ShiftKeyCode 0256
57: #define ControlKeyCode 0257
58: #define LockKeyCode 0260
59: #define MetaKeyCode 0261
60:
61: #define SETSIZE (short)256
62:
63: extern int errno;
64: unsigned state_mask;
65: extern DEVICE *CurrentDevice;
66: extern int borrow_flag;
67: static vsEvent xes, *xe;
68: static status_$t stp;
69: static ec2_$ptr_t ecs[2];
70: static long ec_vlist[2];
71: static gpr_$keyset_t KeySet;
72: static boolean not_in_window;
73: static gpr_$event_t EventType;
74: static unsigned char EventData[1];
75: static gpr_$position_t EventPosition;
76: static boolean HavePreviewedData;
77: static gpr_io_get_calls = 0;
78: static ec2_$ptr_t GPREc;
79:
80:
81: #include "lk201.h"
82:
83: ProcessInput()
84: {
85: }
86:
87:
88: /*
89:
90: This should be replaced by a tabular implementation of some kind.
91:
92: */
93: int
94: ApolloToXKey(c)
95: unsigned char c;
96: {
97: register int ret;
98:
99: state_mask = 0;
100: switch (c) {
101: case KBD_$R1:
102: case KBD_$R1U:
103: return(MetaKeyCode);
104: case KBD_$LD:
105: case KBD_$LDU:
106: return(ControlKeyCode);
107: case KBD_$LE:
108: case KBD_$LEU:
109: return(MetaKeyCode);
110: case KBD_$LF:
111: case KBD_$LFU:
112: return(ShiftKeyCode);
113: case KBD_$CR:
114: c = '\015';
115: break;
116: case KBD_$BS:
117: c = '\010';
118: break;
119: case KBD_$TAB:
120: case KBD_$STAB:
121: case KBD_$CTAB:
122: c = '\011';
123: break;
124: }
125: ret = LK201[c&0177];
126: state_mask = (state_mask & ~(ControlMask|MetaMask|ShiftMask|ShiftLockMask))
127: | (ret & (ControlMask|MetaMask|ShiftMask|ShiftLockMask));
128: return(ret);
129: }
130:
131: InputReader()
132: {
133: gpr_$event_t prior_event;
134: int i;
135: boolean flag;
136:
137: HavePreviewedData = false;
138:
139: prior_event = gpr_$no_event;
140: while (1) {
141: if (!borrow_flag)
142: flag = gpr_$acquire_display( stp );
143: /* this needs to be replaced with a "real" timestamp */
144: xe->vse_time += 1;
145: if (EventType != gpr_$no_event) {
146: xe->vse_x = EventPosition.x_coord;
147: xe->vse_y = EventPosition.y_coord;
148: }
149: switch (EventType) {
150: case gpr_$no_event:
151: if ((prior_event == gpr_$locator_stop) ||
152: (prior_event == gpr_$locator)) {
153: Deal_with_movement(xe);
154: SetCursorPosition((vsCursor *) xe);
155: gpr_$set_cursor_position( EventPosition, stp);
156: }
157: if (!borrow_flag)
158: gpr_$release_display( stp );
159: return;
160: case gpr_$keystroke:
161: SetCursorPosition((vsCursor *) xe);
162: xe->vse_device = VSE_DKB;
163: xe->vse_type = VSE_BUTTON;
164: if ((EventData[0] == KBD_$R1U) ||
165: (EventData[0] == KBD_$LDU) ||
166: (EventData[0] == KBD_$LEU) ||
167: (EventData[0] == KBD_$LFU))
168: xe->vse_direction = VSE_KBTUP;
169: else
170: xe->vse_direction = VSE_KBTDOWN;
171: xe->vse_key = ApolloToXKey(EventData[0]);
172: handle_mask_down();
173: Deal_with_input(xe);
174: handle_mask_up();
175: break;
176: case gpr_$buttons:
177: xe->vse_device = VSE_MOUSE;
178: xe->vse_type = VSE_BUTTON;
179: SetCursorPosition((vsCursor *) xe);
180: switch (EventData[0]) {
181: case 'a':
182: xe->vse_key = VSE_LEFT_BUTTON;
183: xe->vse_direction = VSE_KBTDOWN;
184: break;
185: case 'b':
186: xe->vse_key = VSE_MIDDLE_BUTTON;
187: xe->vse_direction = VSE_KBTDOWN;
188: break;
189: case 'c':
190: xe->vse_key = VSE_RIGHT_BUTTON;
191: xe->vse_direction = VSE_KBTDOWN;
192: break;
193: case 'A':
194: xe->vse_key = VSE_LEFT_BUTTON;
195: xe->vse_direction = VSE_KBTUP;
196: break;
197: case 'B':
198: xe->vse_key = VSE_MIDDLE_BUTTON;
199: xe->vse_direction = VSE_KBTUP;
200: break;
201: case 'C':
202: xe->vse_key = VSE_RIGHT_BUTTON;
203: xe->vse_direction = VSE_KBTUP;
204: break;
205: }
206: Deal_with_input(xe);
207: break;
208: case gpr_$left_window:
209: gpr_$disable_input(gpr_$buttons, stp);
210: gpr_$disable_input(gpr_$keystroke, stp);
211: if (!borrow_flag)
212: gpr_$disable_input(gpr_$left_window, stp);
213: gpr_$disable_input(gpr_$locator_stop, stp);
214: gpr_$disable_input(gpr_$locator, stp);
215: if (!borrow_flag)
216: gpr_$force_release(i, stp);
217: break;
218: case gpr_$entered_window:
219: if (!borrow_flag)
220: flag = gpr_$acquire_display(stp);
221: gpr_$enable_input(gpr_$buttons, KeySet, stp);
222: gpr_$enable_input(gpr_$keystroke, KeySet, stp);
223: if (!borrow_flag) {
224: gpr_$enable_input(gpr_$left_window, 0L, stp);
225: gpr_$enable_input(gpr_$entered_window, 0L, stp);
226: }
227: gpr_$enable_input(gpr_$locator_stop, 0L, stp);
228: gpr_$enable_input(gpr_$locator, 0L, stp);
229: break;
230: case gpr_$locator:
231: xe->vse_device = VSE_MOUSE;
232: xe->vse_type = VSE_MMOTION;
233: break;
234: case gpr_$locator_stop:
235: xe->vse_device = VSE_MOUSE;
236: xe->vse_type = VSE_MMOTION;
237: break;
238: default:
239: fprintf(stderr,"Unrecognizable event--yecccch!!!!\n");
240: break;
241: }
242: prior_event = EventType;
243: gpr_$cond_event_wait(EventType, EventData[0], EventPosition, stp);
244: }
245:
246: }
247:
248: /* Turn off pseudo-shift/control keys
249: * --destroys data field of event
250: */
251: handle_mask_up()
252: {
253:
254: if (state_mask & ControlMask) {
255: xe->vse_key = ControlKeyCode;
256: xe->vse_direction = VSE_KBTUP;
257: Deal_with_input(xe);
258: }
259: if (state_mask & ShiftMask) {
260: xe->vse_key = ShiftKeyCode;
261: xe->vse_direction = VSE_KBTUP;
262: Deal_with_input(xe);
263: }
264: };
265:
266: /* Turn on pseudo-shift/control keys
267: * --preserves data field of event
268: */
269: handle_mask_down()
270: {
271: unsigned char data;
272:
273: data = xe->vse_key;
274: if (state_mask & ControlMask) {
275: xe->vse_key = ControlKeyCode;
276: xe->vse_direction = VSE_KBTDOWN;
277: Deal_with_input(xe);
278: }
279: if (state_mask & ShiftMask) {
280: xe->vse_key = ShiftKeyCode;
281: xe->vse_direction = VSE_KBTDOWN;
282: Deal_with_input(xe);
283: }
284: xe->vse_key = data;
285: };
286:
287: /* A rudimentary stream interface/type mgr for the keyboard and mouse
288: */
289:
290: hidden int gpr_io_$get(hpp, optp, bp, buf_lenp, stp)
291: char **hpp;
292: ios_$put_get_opts_t *optp;
293: char *bp;
294: long *buf_lenp;
295: status_$t *stp;
296: {
297: static char Buff[10];
298: static int BuffLen;
299: static boolean HaveBuff = false;
300: boolean NoWait = ((ios_$cond_opt & *optp) != 0);
301: boolean Preview = ((ios_$preview_opt & *optp) != 0);
302: status_$t Status;
303: boolean flag;
304:
305: if (! Preview) {
306: fprintf(stderr, "Gack! Not preview in gpr_io_$get\n");
307: abort();
308: }
309:
310: if (HavePreviewedData) {
311: stp->all = status_$ok;
312: return(1);
313: }
314:
315: HavePreviewedData = false;
316:
317: #ifdef PRE_SR9_5
318: if (NoWait) {
319: long ECValue = (long)ec2_$read(*GPREc);
320: static long PrevECValue = -1;
321: if (PrevECValue == ECValue)
322: stp->all = ios_$get_conditional_failed;
323: else {
324: if (!borrow_flag)
325: flag = gpr_$acquire_display(Status);
326: gpr_$cond_event_wait(EventType, EventData[0], EventPosition, *stp);
327: if (!borrow_flag)
328: gpr_$release_display( Status );
329: if (EventType == gpr_$no_event) {
330: stp->all = ios_$get_conditional_failed;
331: PrevECValue = ECValue;
332: }
333: else
334: PrevECValue = -1;
335: }
336: }
337: else {
338: if (!borrow_flag)
339: flag = gpr_$acquire_display(Status);
340: gpr_$event_wait(EventType, EventData[0], EventPosition, *stp);
341: if (!borrow_flag)
342: gpr_$release_display( Status );
343: }
344: #else
345: if (NoWait) {
346: gpr_$cond_event_wait(EventType, EventData[0], EventPosition, *stp);
347: if (EventType == gpr_$no_event)
348: stp->all = ios_$get_conditional_failed;
349: }
350: else
351: gpr_$event_wait(EventType, EventData[0], EventPosition, *stp);
352: #endif
353:
354: if (stp->all != status_$ok)
355: return(0);
356:
357: HavePreviewedData = true;
358: return(1);
359: }
360:
361: int
362: InitInput()
363: {
364: boolean flag;
365: short i;
366: short KeyClass[256];
367:
368: for (i=0; i<255; i++) do KeyClass[i] = 0;
369:
370: KeyClass[KBD_$L_BOX_ARROW] = 1;
371: KeyClass[KBD_$L9] = 1;
372: KeyClass[KBD_$L9S] = 1;
373: KeyClass[KBD_$L9U] = 1;
374: KeyClass[KBD_$CMD] = 1;
375: lib_$init_set(KeySet,256);
376: for (i=0; i<256; i++) do
377: if (KeyClass[i] != 1)
378: lib_$add_to_set(KeySet,256,i);
379: gpr_$enable_input(gpr_$keystroke,KeySet, stp);
380: gpr_$enable_input(gpr_$buttons, KeySet, stp);
381: if (!borrow_flag) {
382: gpr_$enable_input(gpr_$left_window, 0L, stp);
383: gpr_$enable_input(gpr_$entered_window, 0L, stp);
384: }
385: gpr_$enable_input(gpr_$locator_stop, 0L, stp);
386: gpr_$enable_input(gpr_$locator, 0L, stp);
387: smd_$set_quit_char( (char)KBD_$F8S, stp );
388: check_status(stp, "InitInput (Set quit char): ");
389: xe = &xes;
390: }
391:
392: hidden boolean gpr_io_$close(hpp, stp)
393: char **hpp;
394: status_$t *stp;
395: {
396: stp->all = status_$ok;
397: return(false);
398: }
399:
400:
401: hidden ios_$conn_flag_set gpr_io_$inq_conn_flags(hpp, stp)
402: char **hpp;
403: status_$t *stp;
404: {
405: stp->all = status_$ok;
406: return(ios_$cf_tty_mask | ios_$cf_vt_mask);
407: }
408:
409:
410: hidden procedure gpr_io_$get_ec(hpp, keyp, ecpp, stp)
411: char **hpp;
412: ios_$ec_key_t *keyp;
413: ec2_$ptr_t *ecpp;
414: status_$t *stp;
415: {
416: long foo;
417:
418: foo = (long) ec2_$read( *GPREc );
419: *ecpp = GPREc;
420: stp->all = status_$ok;
421: }
422:
423: #ifdef PRE_SR9_5
424: hidden long nilp[2] = {0, 0};
425: #else
426: #define nilp 0
427: #endif
428:
429: io_$epv gpr_io_$epv = {
430: nilp,
431: nilp,
432: nilp,
433: nilp,
434: gpr_io_$close,
435: gpr_io_$get_ec,
436: nilp,
437: nilp,
438: nilp,
439: gpr_io_$inq_conn_flags,
440: nilp,
441: gpr_io_$get,
442: nilp,
443: nilp,
444: nilp,
445: nilp,
446: nilp,
447: nilp,
448: nilp,
449: nilp,
450: nilp,
451: nilp,
452: nilp,
453: nilp,
454: nilp,
455: nilp,
456: nilp,
457: nilp,
458: nilp,
459: nilp,
460: nilp,
461: };
462:
463: int
464: MakeGPRStream()
465: {
466: status_$t Status;
467: static uid_$t gpr_io_$uid = {0x2f3e1e7a, 0x10003166};
468: boolean flag;
469:
470: #ifdef PRE_SR9_5
471: flag = gpr_$acquire_display(stp);
472: #endif
473: gpr_$get_ec(gpr_$input_ec,GPREc,Status);
474: check_status(Status, "MakeGPRStream");
475: #ifdef PRE_SR9_5
476: gpr_$release_display( stp );
477: #endif
478: trait_$mgr_dcl(gpr_io_$uid, io_$trait, trait_$kind_local, &gpr_io_$epv, Status);
479: return (ios_$connect("", (short) 0, gpr_io_$uid, (long) 0, &gpr_io_$epv, Status));
480: }
481:
482: /*
483: Universally used; returns -1 if an status is abnormal/error
484: */
485: int
486: check_status(status, name)
487: status_$t status;
488: char *name;
489: {
490: if (status.all != status_$ok) {
491: fprintf(stderr, "%s", name);
492: error_$print(status);
493: return(-1);
494: }
495: return(0);
496: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.