ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/msmouse.c
Revision: 2.6
Committed: Sat Feb 22 02:07:28 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6P1, rad3R5, rad3R6
Changes since 2.5: +1 -4 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

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