|
|
1.1 ! root 1: #ifdef sun ! 2: /* ! 3: * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided ! 4: * for unrestricted use provided that this legend is included on all tape ! 5: * media and as a part of the software program in whole or part. Users ! 6: * may copy or modify these drivers without charge, but are not authorized ! 7: * to license or distribute them to anyone else except as part of a product or ! 8: * program developed by the user. ! 9: * ! 10: * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND ! 11: * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A ! 12: * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE ! 13: * PRACTICE. ! 14: * ! 15: * The Sun X Drivers are provided with no support and without any obligation ! 16: * on the part of Sun Microsystems, Inc. to assist in their use, correction, ! 17: * modification or enhancement. ! 18: * ! 19: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE ! 20: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X ! 21: * DRIVERS OR ANY PART THEREOF. ! 22: * ! 23: * In no event will Sun Microsystems, Inc. be liable for any lost revenue ! 24: * or profits or other special, indirect and consequential damages, even if ! 25: * Sun has been advised of the possibility of such damages. ! 26: * ! 27: * Sun Microsystems, Inc. ! 28: * 2550 Garcia Avenue ! 29: * Mountain View, California 94043 ! 30: */ ! 31: ! 32: #ifndef lint ! 33: static char sccsid[] = "@(#)cursor.c 2.1 86/01/28 Copyright 1986 Sun Micro"; ! 34: #endif ! 35: ! 36: /*- ! 37: * Copyright (c) 1986 by Sun Microsystems, Inc. ! 38: */ ! 39: ! 40: /* cursor.c various stuff with the mouse & cursor ! 41: * ! 42: * StoreCursor Creates a cursor ! 43: * FreeCursor Frees the storage taken by a cursor ! 44: * LoadCursor Loads a bitmap to use as cursor ! 45: * InitMouse Initialize the mouse ! 46: * SetCursorPosition Forces cursor to a particular position ! 47: * SetMouseCharacteristics Controls speed of cursor relative to mouse ! 48: * ! 49: */ ! 50: ! 51: /* ! 52: * ToDo: ! 53: * Threshold/Acceleration ! 54: * Use macros for CheckCursor() ! 55: */ ! 56: ! 57: #include "Xsun.h" ! 58: ! 59: extern struct pixrect *PixRect; ! 60: extern char *Xalloc(); ! 61: extern DEVICE *CurrentDevice; ! 62: CURSOR *CurrentCursor; ! 63: int CursorDisplayed; ! 64: static struct pixrect *CursorPixrect; ! 65: ! 66: CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff) ! 67: BITMAP *image; ! 68: BITMAP *mask; ! 69: int func, fore, back, xoff, yoff; ! 70: { ! 71: register CURSOR *cursor; ! 72: register CursPriv *data; ! 73: ! 74: if (!image) ! 75: return (NULL); ! 76: cursor = (CURSOR *) Xalloc(sizeof(CURSOR)); ! 77: cursor->width = image->width; ! 78: cursor->height = image->height; ! 79: /* Only the tip need be on-screen */ ! 80: cursor->xmin = 0; ! 81: cursor->ymin = 0; ! 82: cursor->xoff = xoff; ! 83: cursor->yoff = yoff; ! 84: cursor->xmax = PixRect->pr_size.x; ! 85: cursor->ymax = PixRect->pr_size.y; ! 86: cursor->refcnt = 1; ! 87: data = (CursPriv *) Xalloc(sizeof(CursPriv)); ! 88: cursor->data = (caddr_t) data; ! 89: data->top = mem_point(image->width, image->height, 1, image->data); ! 90: data->top_bit = image; ! 91: image->refcnt++; ! 92: if (mask) { ! 93: data->bot = mem_point(mask->width, mask->height, 1, mask->data); ! 94: data->bot_bit = mask; ! 95: mask->refcnt++; ! 96: } else { ! 97: data->bot = NULL; ! 98: data->bot_bit = NULL; ! 99: } ! 100: data->sv = mem_create(cursor->width, cursor->height, PixRect->pr_depth); ! 101: data->fore = fore; ! 102: data->back = back; ! 103: return (cursor); ! 104: } ! 105: ! 106: FreeCursor (cursor) ! 107: register CURSOR *cursor; ! 108: { ! 109: CursPriv *cp = CDATA(cursor); ! 110: pr_destroy(cp->top); ! 111: if (cp->top_bit && --(cp->top_bit)->refcnt <= 0) ! 112: FreeBitmap(cp->top_bit); ! 113: if (cp->bot) { ! 114: pr_destroy(cp->bot); ! 115: if (cp->bot_bit && --(cp->bot_bit)->refcnt <= 0) ! 116: FreeBitmap(cp->bot_bit); ! 117: } ! 118: pr_destroy(cp->sv); ! 119: free((caddr_t) CDATA(cursor)); ! 120: free((caddr_t) cursor); ! 121: } ! 122: ! 123: struct pr_prpos topbatch, botbatch; ! 124: ! 125: LoadCursor (cursor) ! 126: register CURSOR *cursor; ! 127: { ! 128: if (CursorDisplayed) ! 129: DisplayCursor(NULL); ! 130: if ((CurrentCursor = cursor) != NULL) { ! 131: topbatch.pr = CDATA(cursor)->top; ! 132: topbatch.pos.x = 0; ! 133: topbatch.pos.y = 0; ! 134: botbatch.pr = CDATA(cursor)->bot; ! 135: botbatch.pos.x = 0; ! 136: botbatch.pos.y = 0; ! 137: DisplayCursor(cursor); ! 138: } ! 139: } ! 140: ! 141: InitMouse () ! 142: { ! 143: } ! 144: ! 145: SetCursorPosition(pos) ! 146: register vsCursor *pos; ! 147: { ! 148: if (pos->x != (CurrentDevice->mouse->x) || pos->y != (CurrentDevice->mouse->y)) { ! 149: if (CursorDisplayed) ! 150: DisplayCursor(NULL); ! 151: *(CurrentDevice->mouse) = *pos; ! 152: DisplayCursor(CurrentCursor); ! 153: } ! 154: } ! 155: ! 156: SetMouseCharacteristics (threshold, accelaration) ! 157: int threshold, accelaration; ! 158: { ! 159: } ! 160: ! 161: DisplayCursor(cs) ! 162: CURSOR *cs; ! 163: { ! 164: extern struct pixrect *PixRect; ! 165: vsCursor *ms = CurrentDevice->mouse; ! 166: ! 167: if (cs == NULL) { ! 168: if (CurrentCursor) { ! 169: /* take it out */ ! 170: extern private_czmask; ! 171: int old_zmask = private_czmask, allmask = -1; ! 172: ! 173: SetZmask(PixRect, &allmask); ! 174: pr_rop(PixRect, ms->x, ms->y, CurrentCursor->width, ! 175: CurrentCursor->height, PIX_SRC, CDATA(CurrentCursor)->sv, 0, 0); ! 176: SetZmask(PixRect, &old_zmask); ! 177: CursorDisplayed = 0; ! 178: } ! 179: } ! 180: else { ! 181: CursPriv *cp = CDATA(cs); ! 182: /* put it in */ ! 183: ! 184: pr_rop(cp->sv, 0, 0, cs->width, cs->height, PIX_SRC, ! 185: PixRect, ms->x, ms->y); ! 186: if (PixRect->pr_depth == 1) { ! 187: int botop = (cp->back == 1 ? PIX_SRC | PIX_DST : PIX_NOT(PIX_SRC) & PIX_DST); ! 188: int topop = (cp->fore == 1 ? PIX_SRC | PIX_DST : PIX_NOT(PIX_SRC) & PIX_DST); ! 189: ! 190: if (botbatch.pr) ! 191: pr_batchrop(PixRect, ms->x, ms->y, ! 192: botop, ! 193: &botbatch, 1); ! 194: if (topbatch.pr) ! 195: pr_batchrop(PixRect, ms->x, ms->y, ! 196: topop, ! 197: &topbatch, 1); ! 198: } ! 199: else { ! 200: extern private_bgcolor, private_fgcolor, private_czmask; ! 201: int old_zmask = private_czmask; ! 202: ! 203: private_bgcolor = -1; ! 204: private_czmask = -1; ! 205: if (botbatch.pr) { ! 206: private_fgcolor = cp->back; ! 207: pr_batchrop(PixRect, ms->x, ms->y, ! 208: PIX_SRC | PIX_DST, ! 209: &botbatch, 1); ! 210: } ! 211: private_fgcolor = cp->fore; ! 212: if (topbatch.pr) ! 213: pr_batchrop(PixRect, ms->x, ms->y, ! 214: PIX_NOT(PIX_SRC) & PIX_DST, ! 215: &topbatch, 1); ! 216: private_czmask = old_zmask; ! 217: } ! 218: CursorDisplayed = 1; ! 219: } ! 220: } ! 221: ! 222: int ! 223: CheckCursor(x, y, w, h) ! 224: { ! 225: register vsCursor *ms = CurrentDevice->mouse; ! 226: register CURSOR *cs = CurrentCursor; ! 227: ! 228: if (CursorDisplayed ! 229: && OverLap(x, y, w, h, ms->x, ms->y, cs->width, cs->height)) { ! 230: DisplayCursor(NULL); ! 231: } ! 232: } ! 233: ! 234: RestoreCursor() ! 235: { ! 236: if (!CursorDisplayed) ! 237: DisplayCursor(CurrentCursor); ! 238: } ! 239: #endif sun
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.