ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/msmouse.c
Revision: 2.5
Committed: Fri Jul 16 18:41:09 1993 UTC (30 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +2 -0 lines
Log Message:
added definition for NULL

File Contents

# Content
1 /* Copyright (c) 1992 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 #include <i86.h>
8 #include <graph.h>
9 #include "driver.h"
10
11 #define NULL 0
12
13 #define M_RIGHTBUTT 0x8
14 #define M_LEFTBUTT 0x2
15 #define M_MOTION 0x1
16
17 static int xdispsize, ydispsize;
18 static int crad;
19 #define right_button (mouse_event & M_RIGHTBUTT)
20 #define left_button (mouse_event & M_LEFTBUTT)
21 static int mouse_event = 0;
22 static int mouse_xpos = -1;
23 static int mouse_ypos = -1;
24
25
26 #pragma off (check_stack)
27 static void _loadds far mouse_handler (int max, int mcx, int mdx)
28 {
29 #pragma aux mouse_handler parm [EAX] [ECX] [EDX]
30 mouse_event = max;
31 mouse_xpos = mcx;
32 mouse_ypos = mdx;
33 }
34 #pragma on (check_stack)
35
36
37 static void
38 move_cursor(newx, newy) /* move cursor to new position */
39 int newx, newy;
40 {
41 extern char *bmalloc();
42 static char *imp = NULL;
43 static int curx = -1, cury = -1;
44 #define xcmin (curx-crad<0 ? 0 : curx-crad)
45 #define ycmin (cury-crad<0 ? 0 : cury-crad)
46 #define xcmax (curx+crad>=xdispsize ? xdispsize-1 : curx+crad)
47 #define ycmax (cury+crad>=ydispsize ? ydispsize-1 : cury+crad)
48
49 if (imp == NULL &&
50 (imp = bmalloc(_imagesize(0,0,2*crad+1,2*crad+1))) == NULL) {
51 eputs("out of memory in move_cursor");
52 quit(1);
53 }
54 if (curx >= 0 & cury >= 0) /* clear old cursor */
55 _putimage(xcmin, ycmin, imp, _GPSET);
56 /* record new position */
57 curx = newx; cury = newy;
58 if (curx < 0 | cury < 0)
59 return; /* no cursor */
60 /* save under new cursor */
61 _getimage(xcmin, ycmin, xcmax, ycmax, imp);
62 /* draw new cursor */
63 _setcolor(1);
64 _rectangle(_GFILLINTERIOR, xcmin, cury-1, xcmax, cury+1);
65 _rectangle(_GFILLINTERIOR, curx-1, ycmin, curx+1, ycmax);
66 _setcolor(0);
67 _moveto(xcmin+1, cury);
68 _lineto(xcmax-1, cury);
69 _moveto(curx, ycmin+1);
70 _lineto(curx, ycmax-1);
71 #undef xcmin
72 #undef ycmin
73 #undef xcmax
74 #undef ycmax
75 }
76
77
78 static int
79 ms_getcur(xp, yp) /* get mouse cursor position */
80 int *xp, *yp;
81 {
82 /* show cursor */
83
84 move_cursor(mouse_xpos, mouse_ypos);
85
86 /* update cursor until button pressed */
87
88 do {
89 mouse_event = 0;
90 while( !mouse_event )
91 if (kbhit())
92 switch (getch()) {
93 case MB1:
94 mouse_event = M_LEFTBUTT;
95 break;
96 case MB2:
97 case MB3:
98 mouse_event = M_RIGHTBUTT;
99 break;
100 default:
101 mouse_event = M_RIGHTBUTT | M_LEFTBUTT;
102 break;
103 }
104 if (mouse_event & M_MOTION)
105 move_cursor(mouse_xpos, mouse_ypos);
106 } while (!(mouse_event & (M_RIGHTBUTT|M_LEFTBUTT)));
107
108 /* clear cursor */
109
110 move_cursor(-1, -1);
111
112 /* compute final position */
113
114 if (mouse_xpos < 0 | mouse_ypos < 0)
115 return(ABORT);
116
117 *xp = mouse_xpos;
118 *yp = ydispsize-1 - mouse_ypos;
119
120 switch (mouse_event) {
121 case M_LEFTBUTT:
122 case M_LEFTBUTT|M_MOTION:
123 return(MB1);
124 case M_RIGHTBUTT:
125 case M_RIGHTBUTT|M_MOTION:
126 return(MB2);
127 }
128 return(ABORT);
129 }
130
131
132 void
133 ms_gcinit( dp )
134 struct driver *dp;
135 {
136 struct SREGS sregs;
137 union REGS inregs, outregs;
138 int far *ptr;
139 int (far *function_ptr)();
140
141 segread(&sregs);
142
143 /* check for mouse driver */
144
145 inregs.w.ax = 0;
146 int386 (0x33, &inregs, &outregs);
147 if( outregs.w.ax != -1 ) {
148 dp->getcur = NULL;
149 return;
150 }
151
152 /* get relevant parameters */
153
154 xdispsize = dp->xsiz;
155 ydispsize = dp->ysiz;
156 crad = dp->ysiz/40;
157
158 /* set screen limits */
159
160 inregs.w.ax = 0x7; /* horizontal resolution */
161 inregs.w.cx = 0;
162 inregs.w.dx = xdispsize-1;
163 int386x( 0x33, &inregs, &outregs, &sregs );
164 inregs.w.ax = 0x8; /* vertical resolution */
165 inregs.w.cx = 0;
166 inregs.w.dx = ydispsize-1;
167 int386x( 0x33, &inregs, &outregs, &sregs );
168
169 /* install watcher */
170
171 inregs.w.ax = 0xC;
172 inregs.w.cx = M_RIGHTBUTT | M_LEFTBUTT | M_MOTION;
173 function_ptr = mouse_handler;
174 inregs.x.edx = FP_OFF( function_ptr );
175 sregs.es = FP_SEG( function_ptr );
176 int386x( 0x33, &inregs, &outregs, &sregs );
177
178 dp->getcur = ms_getcur;
179 }
180
181 void
182 ms_gcdone( dp )
183 struct driver *dp;
184 {
185 union REGS inregs, outregs;
186
187 if (dp->getcur != ms_getcur)
188 return; /* not installed */
189
190 dp->getcur = NULL;
191
192 /* uninstall watcher */
193
194 inregs.w.ax = 0;
195 int386 (0x33, &inregs, &outregs);
196 }
197