Annotation of 43BSDTahoe/new/X/libis/cursor.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     $Source: /u1/X/libis/RCS/cursor.c,v $
                      3:  *     $Header: cursor.c,v 1.1 86/11/17 14:33:26 swick Rel $
                      4:  */
                      5: 
                      6: #ifndef lint
                      7: static char *rcsid_cursor_c = "$Header: cursor.c,v 1.1 86/11/17 14:33:26 swick Rel $";
                      8: #endif lint
                      9: 
                     10: #include "is-copyright.h"
                     11: 
                     12: /*     cursor.c - various stuff with the mouse & cursor
                     13:  *
                     14:  *     StoreCursor             Creates a cursor
                     15:  *     FreeCursor              Frees the storage taken by a cursor
                     16:  *     LoadCursor              Loads a bitmap to use as cursor
                     17:  *     InitMouse               Initialize the mouse
                     18:  *     SetCursorPosition       Forces cursor to a particular position
                     19:  *     UpdateCursorPosition    Moves cursor to a particular position
                     20:  *     SetMouseCharacteristics Controls speed of cursor relative to mouse
                     21:  *
                     22:  *      Copyright (c) 1986, Integrated Solutions, Inc.
                     23:  *
                     24:  */
                     25: 
                     26: #include "Xis.h"
                     27: 
                     28: static CURSOR  *CurrentCursor;
                     29: static int     CursorDisplayed;
                     30: 
                     31: extern BITMAP  *StoreBitmap();
                     32: extern PIXMAP  *MakePixmap();
                     33: extern DEVICE  *CurrentDevice;
                     34: 
                     35: /*
                     36:  *     StoreCursor
                     37:  */
                     38: CURSOR *StoreCursor(func, image, fore, back, mask, xoff, yoff)
                     39: int            func;
                     40: register BITMAP        *image;
                     41: register int   fore, back;
                     42: BITMAP         *mask;
                     43: int            xoff, yoff;
                     44: {
                     45:     register CURSOR    *cursor;
                     46:     register CursPriv  *data;
                     47:     BITMAP             *bitmap;
                     48: 
                     49: #ifdef DEBUG
                     50: if (debug & D_Cursor)
                     51:     printf("StoreCursor(func=%d, image=0x%x, fore=%d, back=%d, mask=0x%x,\n    xoff=%d, yoff=%d)\n",
                     52:        func, image, fore, back, mask, xoff, yoff);
                     53: #endif DEBUG
                     54: 
                     55:     if (!image) {
                     56:        return (NULL);
                     57:     }
                     58: 
                     59:     cursor = (CURSOR *) Xalloc(sizeof(CURSOR));
                     60: 
                     61:     cursor->width      = image->width;
                     62:     cursor->height     = image->height;
                     63:     cursor->xoff       = xoff;
                     64:     cursor->yoff       = yoff;
                     65: 
                     66:     /* Only the tip need be on-screen */
                     67:     cursor->xmin       = 0;
                     68:     cursor->ymin       = 0;
                     69:     cursor->xmax       = CurrentDevice->width;
                     70:     cursor->ymax       = CurrentDevice->height;
                     71: 
                     72:     cursor->refcnt     = 1;
                     73: 
                     74:     data = (CursPriv *) Xalloc(sizeof(CursPriv));
                     75: 
                     76:     cursor->data = (caddr_t) data;
                     77: 
                     78:     data->image                = MakePixmap(image, fore, back);
                     79:     data->image->tile  = CannotBeTiled;
                     80:     data->mask         = mask;
                     81:     if (mask) {
                     82:        mask->refcnt++;
                     83:     }
                     84:     data->func         = func;
                     85:     data->fore         = fore;
                     86:     data->back         = back;
                     87: 
                     88:     bitmap = StoreBitmap(image->width, image->height, (char *)NULL);
                     89:     data->save = MakePixmap(bitmap, fore, back);
                     90:     data->save->tile   = CannotBeTiled;
                     91:     return (cursor);
                     92: }
                     93: 
                     94: /*
                     95:  *     FreeCursor
                     96:  */
                     97: FreeCursor(cursor)
                     98: CURSOR *cursor;
                     99: {
                    100:     register CursPriv *cp = CDATA(cursor);
                    101: 
                    102: #ifdef DEBUG
                    103: if (debug & D_Cursor)
                    104:     printf("FreeCursor(cursor=0x%x)\n", cursor);
                    105: #endif DEBUG
                    106: 
                    107:     FreePixmap(cp->image);
                    108:     if (cp->mask) {
                    109:        FreeBitmap(cp->mask);
                    110:     }
                    111:     FreePixmap(cp->save);
                    112:     free((caddr_t) cp);
                    113:     free((caddr_t) cursor);
                    114: }
                    115: 
                    116: /*
                    117:  *     LoadCursor
                    118:  */
                    119: LoadCursor(cursor)
                    120: register CURSOR        *cursor;
                    121: {
                    122: 
                    123: #ifdef DEBUG
                    124: if (debug & D_Cursor)
                    125:     printf("LoadCursor(cursor=0x%x)\n", cursor);
                    126: #endif DEBUG
                    127: 
                    128:     if (CurrentCursor != cursor) {
                    129:        if (CursorDisplayed) {
                    130:            DisplayCursor((CURSOR *)NULL);
                    131:        }
                    132:        if ((CurrentCursor = cursor) != NULL) {
                    133:            DisplayCursor(cursor);
                    134:        }
                    135:     }
                    136: }
                    137: 
                    138: /*
                    139:  *     InitMouse
                    140:  */
                    141: static short sbounds[4];
                    142: InitMouse()
                    143: {
                    144: #ifdef DEBUG
                    145: if (debug & D_Misc)
                    146:     printf("InitMouse()\n");
                    147: #endif DEBUG
                    148:     sbounds[0] = 0;
                    149:     sbounds[1] = ScreenPixmap.width;
                    150:     sbounds[2] = 0;
                    151:     sbounds[3] = ScreenPixmap.height;
                    152: }
                    153: 
                    154: 
                    155: /*
                    156:  *     SetCursorPosition
                    157:  */
                    158: SetCursorPosition(pos)
                    159: register vsCursor *pos;
                    160: {
                    161:     extern int indev, invalid_mouse;
                    162: 
                    163: #ifdef DEBUG
                    164: if (debug & D_Cursor)
                    165:     printf("SetCursorPosition(pos->x=%d, pos->y=%d)\n", pos->x, pos->y);
                    166: #endif DEBUG
                    167: 
                    168:     if (pos->x != (CurrentDevice->mouse->x) ||
                    169:        pos->y != (CurrentDevice->mouse->y)) {
                    170:        /* keep mouse in sync with cursor */
                    171:        short mbounds[4];
                    172:        mbounds[0] = mbounds[1] = pos->x;
                    173:        mbounds[2] = mbounds[3] = pos->y;
                    174:        ioctl(indev, TIOUMBND, mbounds);        /* warps mouse cursor */
                    175:        ioctl(indev, TIOUMBND, sbounds);        /* sets bounds back */
                    176:        invalid_mouse = 1;
                    177:        UpdateCursorPosition(pos);
                    178:     }
                    179: }
                    180: 
                    181: vsCursor last_mouse;   /* last known mouse position */
                    182: 
                    183: /*
                    184:  *     UpdateCursorPosition
                    185:  */
                    186: UpdateCursorPosition(pos)
                    187: register vsCursor *pos;
                    188: {
                    189: 
                    190: #ifdef DEBUG
                    191: if (debug & D_Cursor)
                    192:     printf("UpdateCursorPosition(pos->x=%d, pos->y=%d)\n", pos->x, pos->y);
                    193: #endif DEBUG
                    194: 
                    195:     /* assumes mouse is in sync with cursor */
                    196:     if (pos->x != (CurrentDevice->mouse->x) ||
                    197:        pos->y != (CurrentDevice->mouse->y)) {
                    198:        if (CursorDisplayed) {
                    199:            DisplayCursor((CURSOR *)NULL);
                    200:        }
                    201:        *(CurrentDevice->mouse) = *pos;
                    202:        last_mouse = *pos;              /* update last mouse position */
                    203:        DisplayCursor(CurrentCursor);
                    204:     }
                    205: }
                    206: 
                    207: SetMouseCharacteristics(threshold, acceleration)
                    208: int    threshold, acceleration;
                    209: {
                    210:     extern int mouse_threshold, mouse_acceleration;
                    211: #ifdef DEBUG
                    212: if (debug & D_Misc)
                    213:     printf("SetMouseCharacteristics(threshold=%d, acceleration=%d)\n",
                    214:        threshold, acceleration);
                    215: #endif DEBUG
                    216:     mouse_threshold = threshold;
                    217:     mouse_acceleration = acceleration;
                    218: }
                    219: 
                    220: /*
                    221:  *     DisplayCursor
                    222:  */
                    223: static DisplayCursor(cursor)
                    224: CURSOR *cursor;
                    225: {
                    226:     register vsCursor *ms = CurrentDevice->mouse;
                    227:     register CursPriv *cp = CDATA(cursor);
                    228:     register int x = ms->x;
                    229:     register int y = ms->y;
                    230:     CLIP       i;
                    231:     CLIP       bc, bs;
                    232: 
                    233: #ifdef DEBUG
                    234: if (debug & D_Cursor)
                    235:     printf("DisplayCursor(cursor=0x%x)\n", cursor);
                    236: #endif DEBUG
                    237: 
                    238:     bs.left = 0;
                    239:     bs.width = ScreenPixmap.width;
                    240:     bs.top = 0;
                    241:     bs.height = ScreenPixmap.height;
                    242: 
                    243:     if (cursor == NULL) {
                    244:        if (CurrentCursor) {
                    245:            /* pick up cursor (put background back) */
                    246:            cp = CDATA(CurrentCursor);
                    247:            bc.left = x;
                    248:            bc.width = CurrentCursor->width;
                    249:            bc.top = y;
                    250:            bc.height = CurrentCursor->height;
                    251:            i = Intersection(bc, bs);
                    252: 
                    253:            GIP_RasterOp(GIPcopy,
                    254:                cp->save, i.left-x, i.top-y,
                    255:                &ScreenPixmap, i.left, i.top,
                    256:                (BITMAP *)NULL, 0, 0,
                    257:                i.width, i.height,
                    258:                ~0);
                    259: 
                    260:            CursorDisplayed = 0;
                    261:        }
                    262:     } else {
                    263:        bc.left = x;
                    264:        bc.width = cursor->width;
                    265:        bc.top = y;
                    266:        bc.height = cursor->height;
                    267:        i = Intersection(bc, bs);
                    268: 
                    269:        /* save background */
                    270:        GIP_RasterOp(GIPcopy,
                    271:            &ScreenPixmap, i.left, i.top,
                    272:            cp->save, i.left-x, i.top-y,
                    273:            (BITMAP *)NULL, 0, 0,
                    274:            i.width, i.height,
                    275:            ~0);
                    276: 
                    277:        /* put cursor down */
                    278:        GIP_RasterOp((unsigned char)(cp->func),
                    279:            cp->image, i.left-x, i.top-y,
                    280:            &ScreenPixmap, i.left, i.top,
                    281:            cp->mask, i.left-x, i.top-y,
                    282:            i.width, i.height,
                    283:            ~0);
                    284: 
                    285:        CursorDisplayed = 1;
                    286:     }
                    287: }
                    288: 
                    289: /*
                    290:  *     CheckCursor
                    291:  */
                    292: CheckCursor(r1)
                    293: CLIP   r1;
                    294: {
                    295:     register vsCursor *ms = CurrentDevice->mouse;
                    296:     register CURSOR *cursor = CurrentCursor;
                    297: 
                    298:     CLIP r2;
                    299: 
                    300: #ifdef DEBUG
                    301: if (debug & D_Cursor) {
                    302:     printf("CheckCursor()\n");
                    303:     printf_clip("      bounds", r1);
                    304: }
                    305: #endif DEBUG
                    306: 
                    307:     if (cursor == NULL) {
                    308:        return;
                    309:     }
                    310: 
                    311:     r2.left = ms->x;
                    312:     r2.top = ms->y;
                    313:     r2.width = cursor->width;
                    314:     r2.height = cursor->height;
                    315: 
                    316: #ifdef DEBUG
                    317: if (debug & D_Cursor)
                    318:     printf_clip("      cursor", r2);
                    319: #endif DEBUG
                    320: 
                    321:     if (CursorDisplayed && Overlap(r1, r2)) {
                    322:        DisplayCursor((CURSOR *)NULL);
                    323:     }
                    324: }
                    325: 
                    326: /*
                    327:  *     RestoreCursor
                    328:  */
                    329: RestoreCursor()
                    330: {
                    331: 
                    332: #ifdef DEBUG
                    333: if (debug & D_Cursor)
                    334:     printf("RestoreCursor()\n");
                    335: #endif DEBUG
                    336: 
                    337:     if (!CursorDisplayed) {
                    338:        DisplayCursor(CurrentCursor);
                    339:     }
                    340: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.