|
|
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: /* cursor.c various stuff with the mouse & cursor
21: *
22: * StoreCursor Creates a cursor
23: * FreeCursor Frees the storage taken by a cursor
24: * LoadCursor Loads a bitmap to use as cursor
25: * InitMouse Initialize the mouse
26: * SetCursorPosition Forces cursor to a particular position
27: * SetMouseCharacteristics Controls speed of cursor relative to mouse
28: *
29: */
30:
31: /*
32: * ToDo:
33: * Threshold/Acceleration
34: * Use macros for CheckCursor()
35: */
36:
37: #include "Xapollo.h"
38:
39: extern char *Xalloc();
40: extern DEVICE *CurrentDevice;
41:
42: CURSOR *CurrentCursor;
43: int CursorDisplayed;
44:
45: CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
46: BITMAP *image;
47: BITMAP *mask;
48: int func, fore, back, xoff, yoff;
49: {
50: register CURSOR *cursor;
51: register CursPriv *data;
52:
53: if (!image)
54: return (NULL);
55: cursor = (CURSOR *) Xalloc(sizeof(CURSOR));
56: cursor->width = image->width;
57: cursor->height = image->height;
58: cursor->xmin = 0;
59: cursor->ymin = 0;
60: cursor->xoff = xoff;
61: cursor->yoff = yoff;
62: cursor->xmax = Screen.width - image->width;
63: cursor->ymax = Screen.height - image->height;
64: cursor->refcnt = 1;
65:
66: data = (CursPriv *) Xalloc(sizeof(CursPriv));
67: cursor->data = (caddr_t) data;
68: image->refcnt++;
69: data->bits = (caddr_t) image;
70: data->fore = fore;
71: data->back = back;
72: data->save = make_bitmap(NULL, image->width, image->height+2, false);
73: if (mask) {
74: data->mask = mask;
75: mask->refcnt++;
76: } else
77: data->mask = NULL;
78: return (cursor);
79: }
80:
81: FreeCursor (cursor)
82: register CURSOR *cursor;
83: {
84: CursPriv *cp = CDATA(cursor);
85:
86: if (--(cp->bits->refcnt) <= 0)
87: FreeBitmap(cp->bits);
88: if (cp->mask && --(cp->mask->refcnt) <= 0)
89: FreeBitmap(cp->mask);
90: FreeBitmap(cp->save);
91: free((caddr_t) CDATA(cursor));
92: free((caddr_t) cursor);
93: }
94:
95:
96: LoadCursor (cursor)
97: register CURSOR *cursor;
98: {
99: if (CursorDisplayed)
100: DisplayCursor(NULL);
101: if ((CurrentCursor = cursor) != NULL) {
102: DisplayCursor(cursor);
103: }
104: }
105:
106: InitMouse ()
107: {
108: }
109:
110: SetCursorPosition(pos)
111: register vsCursor *pos;
112: {
113: if (pos->x != (CurrentDevice->mouse->x) ||
114: pos->y != (CurrentDevice->mouse->y)) {
115: if (CursorDisplayed)
116: DisplayCursor(NULL);
117: CurrentDevice->mouse->x = pos->x;
118: CurrentDevice->mouse->y = pos->y;
119: DisplayCursor(CurrentCursor);
120: }
121: }
122:
123: SetMouseCharacteristics (threshold, accelaration)
124: int threshold, accelaration;
125: {
126: }
127:
128: DisplayCursor(cs)
129: CURSOR *cs;
130: {
131: vsCursor *ms = CurrentDevice->mouse;
132: short op, i, msx, msy;
133: gpr_$window_t srcwin;
134: gpr_$position_t dstorg, destorg;
135: status_$t status;
136: static gpr_$attribute_desc_t ab = -1;
137: gpr_$window_t saved_clip_wind;
138: gpr_$window_t screen_clip_wind;
139: boolean saved_clip_active;
140: gpr_$mask_t saved_plane_mask;
141: gpr_$raster_op_array_t saved_rops;
142:
143:
144: /* Use a private attribute block, since caller has probably already set
145: lots of attributes
146: -- We disable this, and just save/restore raster ops, clip window and plane mask,
147: -- because attribute block switching (1) is expensive, especially on color hardware, and
148: -- (2) screws up input enables something awful.
149: */
150: /*
151: if (ab == -1) {
152: gpr_$allocate_attribute_block( ab, status );
153: gpr_$set_attribute_block( ab, status );
154: gpr_$set_plane_mask(Screen.plane_mask, status);
155: }
156: gpr_$set_attribute_block( ab, status );
157: */
158: gpr_$inq_raster_ops (saved_rops, status);
159: gpr_$inq_constraints (saved_clip_wind, saved_clip_active, saved_plane_mask, status);
160: screen_clip_wind.window_base.x_coord = 0;
161: screen_clip_wind.window_base.y_coord = 0;
162: screen_clip_wind.window_size.x_size = Screen.width;
163: screen_clip_wind.window_size.y_size = Screen.height;
164: gpr_$set_clip_window(screen_clip_wind, status);
165: gpr_$set_plane_mask( Screen.plane_mask, status);
166:
167: msx = ms->x < 0 ? 0 : ms->x;
168: msy = ms->y < 0 ? 0 : ms->y;
169: dstorg.x_coord = msx;
170: dstorg.y_coord = msy;
171: if (cs == NULL) {
172: if (CursorDisplayed && (cs = CurrentCursor) != NULL) {
173: /* take it out */
174: srcwin.x_coord = srcwin.y_coord = 0;
175: srcwin.x_size = cs->width;
176: srcwin.y_size = cs->height;
177: for (i=0; i<Screen.depth; i++)
178: gpr_$set_raster_op( (gpr_$plane_t)i, (gpr_$raster_op_t)3, status );
179: gpr_$pixel_blt(CDATA(cs)->save->data, srcwin, dstorg, status);
180: CursorDisplayed = 0;
181: }
182: }
183: else {
184: int botop = (CDATA(cs)->back == 1 ? 7 : 4);
185: int topop = (CDATA(cs)->fore == 1 ? 7 : 4);
186:
187: CursorDisplayed = -1;
188:
189: /* save image beneath cursor */
190: srcwin.x_size = cs->width;
191: srcwin.y_size = cs->height;
192: srcwin.x_coord = msx;
193: srcwin.y_coord = msy;
194: destorg.x_coord = destorg.y_coord = 0;
195: gpr_$set_bitmap(CDATA(cs)->save->data, status);
196: /* the following code is redundant
197: for (i=0; i<Screen.depth; i++)
198: gpr_$set_raster_op( (gpr_$plane_t)i, (gpr_$raster_op_t)3, status );
199: */
200: gpr_$pixel_blt(Screen.bm, srcwin, destorg, status);
201: gpr_$set_bitmap(Screen.bm, status);
202:
203: /* display mask */
204: srcwin.x_coord = srcwin.y_coord = 0;
205: if (CDATA(cs)->mask != NULL) {
206: for (i=0; i<Screen.depth; i++)
207: gpr_$set_raster_op( (gpr_$plane_t)i, (gpr_$raster_op_t)botop, status );
208: gpr_$pixel_blt(CDATA(cs)->mask->data, srcwin, dstorg, status);
209: }
210: /* display cursor itself */
211: for (i=0; i<Screen.depth; i++)
212: gpr_$set_raster_op( (gpr_$plane_t)i, (gpr_$raster_op_t)topop, status );
213: gpr_$pixel_blt(CDATA(cs)->bits->data, srcwin, dstorg, status);
214:
215: }
216: /*
217: gpr_$set_attribute_block( Screen.ab, status );
218: */
219: for (i=0; i<Screen.depth; i++)
220: gpr_$set_raster_op( (gpr_$plane_t)i, saved_rops[i], status );
221: gpr_$set_clip_window(saved_clip_wind, status);
222: gpr_$set_plane_mask(saved_plane_mask, status);
223: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.