|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_bitblt_cur_c = "$Header: bitblt_cur.c,v 10.1 86/11/19 10:51:09 jg Exp $";
3: #endif lint
4: /*
5: * Copyright (c) 1986 Brown University
6: *
7: * Permission to use, copy, modify and distribute this software and its
8: * documentation for any purpose and without fee is hereby granted, provided
9: * that the above copyright notice appear in all copies, and that both
10: * that copyright notice and this permission notice appear in supporting
11: * documentation, and that the name of Brown University not be used in
12: * advertising or publicity pertaining to distribution of the software without
13: * specific, written prior permission. Brown University makes no
14: * representations about the suitability of this software for any purpose.
15: * It is provided "as-is" without express or implied warranty.
16: *
17: * Written by Daniel Stone, Brown University/IRIS (des@iris)
18: *
19: * NOTE: A "cursor" is the thing that moves on the screen when it
20: * is attached to the mouse. It is sometimes refered to as a
21: * "locator" also.
22: *
23: * If the screen to be dealt with uses a software cursor then the bits
24: * the cursor overlayed must be replaced. This is needed because
25: * the cursor (or locator) is put on the the ACTUAL bitmap.
26: */
27:
28: #include "bitblt_int.h"
29:
30: static short rem_loc = 0;
31:
32: /*
33: * This macro checks the XAddr shared memory area to see if the cursor
34: * is in the way.
35: */
36: #define S_ORIGIN_X (XAddr->mouse.x & (~(BPW-1)))
37: #define S_ORIGIN_Y (XAddr->mouse.y)
38: #define S_CORNER_X (S_ORIGIN_X + (2*BPW))
39: #define S_CORNER_Y (S_ORIGIN_Y + BPW)
40: #define LOC_IN_BOUNDS(oX,oY,cX,cY) ((oX < S_CORNER_X) && (S_ORIGIN_X < cX) &&\
41: (oY < S_CORNER_Y) && (S_ORIGIN_Y < cY))
42:
43: /*
44: * Save_cursor set up the shared memory, checks to see if the cursor
45: * is in the rectangle bounds handed to save_cursor. If it is then
46: * an ioctl is done to the kernel to remove the cursor. If the ioctl
47: * fails then -1 is returned otherwise 0 is returned.
48: */
49: save_cursor(oX,oY,cX,cY)
50: register short oX,oY,cX,cY;
51: {
52: register XIoAddr *xptr;
53:
54: xptr = XAddr;
55: xptr->hmbox.left = oX;
56: xptr->hmbox.top = oY;
57: xptr->hmbox.right = cX;
58: xptr->hmbox.bottom = cY;
59: xptr->hmbox.flags = 1;
60: if (LOC_IN_BOUNDS(oX,oY,cX,cY)) {
61: rem_loc = 1;
62: if (ioctl(xdev,QIOCHIDECUR,0) == -1)
63: return(-1);
64: }
65: return(0);
66: }
67:
68: /*
69: * Restore_cursor checks the shared memory area and if set it checks
70: * to see if the cursor was removed by save_cursor or if it currently
71: * is in the critical rectangle defined by hmbox. If it is then
72: * the approprate ioctl is called. If the ioctl fails then -1 is return
73: * otherwise 0 is returned.
74: */
75: restore_cursor()
76: {
77: register XIoAddr *xptr;
78:
79: xptr = XAddr;
80: if (xptr->hmbox.flags) {
81: if (rem_loc || LOC_IN_BOUNDS(xptr->hmbox.left,
82: xptr->hmbox.top,
83: xptr->hmbox.right,
84: xptr->hmbox.bottom)) {
85: xptr->hmbox.flags = 0;
86: if (ioctl(xdev,QIOCSHOWCUR,0) == -1)
87: return(-1);
88: }
89: else {
90: xptr->hmbox.flags = 0;
91: }
92: }
93: rem_loc = 0;
94: return(0);
95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.