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

1.1       root        1: /*
                      2:  * X window system version 10.3
                      3:  * Copyright (c) 1985, 1986 Massachusets Institute of Technology
                      4:  *
                      5:  * Sun implementation dependent library
                      6:  * Copyright (c) 1983, 1984, 1985, 1986 Sun Microsystems, Inc.
                      7:  *
                      8:  * $Author: swick $
                      9:  * $Source: /u1/X/libsun/RCS/cursor.c,v $
                     10:  * $Revision: 10.5 $
                     11:  * $Date: 86/12/17 20:32:30 $
                     12:  *
                     13:  */
                     14: 
                     15: #ifndef lint
                     16: static char rcs_id[] = "$Header: cursor.c,v 10.5 86/12/17 20:32:30 swick Exp $";
                     17: #endif !lint
                     18: 
                     19: #ifdef sun
                     20: 
                     21: /* cursor.c    various stuff with the mouse & cursor
                     22:  *
                     23:  *     StoreCursor             Creates a cursor
                     24:  *     FreeCursor              Frees the storage taken by a cursor
                     25:  *     LoadCursor              Loads a bitmap to use as cursor
                     26:  *     InitMouse               Initialize the mouse
                     27:  *     SetCursorPosition       Forces cursor to a particular position
                     28:  *     SetMouseCharacteristics Controls speed of cursor relative to mouse
                     29:  *
                     30:  */
                     31: 
                     32: /*
                     33:  *     ToDo:
                     34:  *             Use macros for CheckCursor()
                     35:  */
                     36: 
                     37: #include "Xsun.h"
                     38: 
                     39: extern struct pixrect *PixRect;
                     40: extern char *Xalloc();
                     41: extern DEVICE *CurrentDevice;
                     42: extern int vsdev;
                     43: CURSOR *CurrentCursor;
                     44: int CursorDisplayed;
                     45: static struct pixrect *CursorPixrect;
                     46: 
                     47: CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
                     48: BITMAP *image;
                     49: BITMAP *mask;
                     50: int func, fore, back, xoff, yoff;
                     51: {
                     52:        register CURSOR *cursor;
                     53:        register CursPriv *data;
                     54:        
                     55:        if (!image)
                     56:                return (NULL);
                     57:        cursor = (CURSOR *) Xalloc(sizeof(CURSOR));
                     58:        cursor->width = image->width;
                     59:        cursor->height = image->height;
                     60:        /* Only the tip need be on-screen */
                     61:        cursor->xmin = 0;
                     62:        cursor->ymin = 0;
                     63:        cursor->xoff = xoff;
                     64:        cursor->yoff = yoff;
                     65:        cursor->xmax = PixRect->pr_size.x;
                     66:        cursor->ymax = PixRect->pr_size.y;
                     67:        cursor->refcnt = 1;
                     68:        data = (CursPriv *) Xalloc(sizeof(CursPriv));
                     69:        cursor->data = (caddr_t) data;
                     70:        data->top = mem_point(image->width, image->height, 1, image->data);
                     71:        if (fore && back || !fore && !back)
                     72:                if (fore)
                     73:                        data->c_func = PIX_SRC | PIX_NOT(PIX_SRC);
                     74:                else
                     75:                        data->c_func = PIX_SRC & PIX_NOT(PIX_SRC);
                     76:        else if (fore && WhitePixel)
                     77:                data->c_func = SUN_FROM_X_OP(func);
                     78:        else
                     79:                data->c_func = SUN_FROM_X_OP_INVERT(func);
                     80:        data->top_bit = image;
                     81:        image->refcnt++;
                     82:        if (mask) {
                     83:                data->bot = mem_point(mask->width, mask->height, 1, 
                     84:                                      mask->data);
                     85:                data->bot_bit = mask;
                     86:                mask->refcnt++;
                     87:        } else {
                     88:                data->bot = NULL;
                     89:                data->bot_bit = NULL;
                     90:        }
                     91:        data->sv = mem_create(cursor->width, cursor->height, 
                     92:                              PixRect->pr_depth);
                     93:        data->fore = fore;
                     94:        data->back = back;
                     95:        return (cursor);
                     96: }
                     97: 
                     98: FreeCursor (cursor)
                     99: register CURSOR *cursor;
                    100: {
                    101:        CursPriv   *cp = CDATA(cursor);
                    102:        pr_destroy(cp->top);
                    103:        if (cp->top_bit && --(cp->top_bit)->refcnt <= 0)
                    104:                FreeBitmap(cp->top_bit);
                    105:        if (cp->bot) {
                    106:                pr_destroy(cp->bot);
                    107:                if (cp->bot_bit && --(cp->bot_bit)->refcnt <= 0)
                    108:                        FreeBitmap(cp->bot_bit);
                    109:        }
                    110:        pr_destroy(cp->sv);
                    111:        free((caddr_t) CDATA(cursor));
                    112:        free((caddr_t) cursor);
                    113: }
                    114: 
                    115: struct pr_prpos topbatch, botbatch;
                    116: 
                    117: LoadCursor (cursor)
                    118: register CURSOR *cursor;
                    119: {
                    120:        if (CursorDisplayed)
                    121:                DisplayCursor(NULL);
                    122:        if ((CurrentCursor = cursor) != NULL) {
                    123:                topbatch.pr = CDATA(cursor)->top;
                    124:                topbatch.pos.x = 0;
                    125:                topbatch.pos.y = 0;
                    126:                botbatch.pr = CDATA(cursor)->bot;
                    127:                botbatch.pos.x = 0;
                    128:                botbatch.pos.y = 0;
                    129:                DisplayCursor(cursor);
                    130:        }
                    131: }
                    132: 
                    133: InitMouse ()
                    134: {
                    135: }
                    136: 
                    137: SetCursorPosition(pos)
                    138: register vsCursor *pos;
                    139: {
                    140:        if (pos->x != (CurrentDevice->mouse->x) || pos->y != (CurrentDevice->mouse->y)) {
                    141:                if (CursorDisplayed)
                    142:                        DisplayCursor(NULL);
                    143:                *(CurrentDevice->mouse) = *pos;
                    144:                DisplayCursor(CurrentCursor);
                    145:                win_setmouseposition(vsdev, pos->x, pos->y);
                    146:        }
                    147: }
                    148: 
                    149: SetMouseCharacteristics (threshold, accelaration)
                    150: int threshold, accelaration;
                    151: {
                    152:        extern sunthreshold;
                    153:        extern sunaccel;
                    154: 
                    155:        sunthreshold = threshold;
                    156:        sunaccel = accelaration;
                    157: }
                    158: 
                    159: DisplayCursor(cs)
                    160: CURSOR *cs;
                    161: {
                    162:        extern struct pixrect *PixRect;
                    163:        vsCursor   *ms = CurrentDevice->mouse;
                    164:        
                    165:        if (cs == NULL) {
                    166:                if (CurrentCursor) {
                    167:                        /* take it out */
                    168:                        extern int      private_czmask;
                    169:                        int             old_zmask = private_czmask;
                    170:                        int             allmask = -1;
                    171:                        
                    172:                        SetZmask(PixRect, &allmask);
                    173:                        pr_rop(PixRect, ms->x, ms->y, CurrentCursor->width,
                    174:                               CurrentCursor->height, PIX_SRC, 
                    175:                               CDATA(CurrentCursor)->sv, 0, 0);
                    176:                        SetZmask(PixRect, &old_zmask);
                    177:                        CursorDisplayed = 0;
                    178:                }
                    179:        } else {
                    180:                CursPriv   *cp = CDATA(cs);
                    181:                
                    182:                /* put it in */
                    183:                pr_rop(cp->sv, 0, 0, cs->width, cs->height, PIX_SRC,
                    184:                       PixRect, ms->x, ms->y);
                    185:                if (PixRect->pr_depth == 1) {
                    186:                        if (cp->bot != (struct pixrect *) NULL &&
                    187:                            cp->top != (struct pixrect *) NULL) {
                    188:                                    pr_stencil(PixRect, ms->x, ms->y, 
                    189:                                               cs->width, cs->height,
                    190:                                               cp->c_func,
                    191:                                               cp->bot, 0, 0,
                    192:                                               cp->top, 0, 0);
                    193:                            }
                    194:                } else {
                    195:                        extern int      private_bgcolor;
                    196:                        extern int      private_fgcolor;
                    197:                        extern int      private_czmask;
                    198:                        int             old_zmask = private_czmask;
                    199:                        
                    200:                        private_bgcolor = -1;
                    201:                        private_czmask = -1;
                    202:                        if (botbatch.pr) {
                    203:                                private_fgcolor = cp->back;
                    204:                                pr_batchrop(PixRect, ms->x, ms->y,
                    205:                                            PIX_SRC | PIX_DST,
                    206:                                            &botbatch, 1);
                    207:                        }
                    208:                        private_fgcolor = cp->fore;
                    209:                        if (topbatch.pr)
                    210:                                pr_batchrop(PixRect, ms->x, ms->y,
                    211:                                            PIX_NOT(PIX_SRC) & PIX_DST,
                    212:                                            &topbatch, 1);
                    213:                        private_czmask = old_zmask;
                    214:                }
                    215:                CursorDisplayed = 1;
                    216:        }
                    217: }
                    218: 
                    219: int
                    220: CheckCursor(x, y, w, h)
                    221: {
                    222:        register vsCursor *ms = CurrentDevice->mouse;
                    223:        register CURSOR *cs = CurrentCursor;
                    224:        
                    225:        if (CursorDisplayed
                    226:            && OverLap(x, y, w, h, ms->x, ms->y, cs->width, cs->height)) {
                    227:                    DisplayCursor(NULL);
                    228:            }
                    229: }
                    230: 
                    231: RestoreCursor()
                    232: {
                    233:        if (!CursorDisplayed)
                    234:                DisplayCursor(CurrentCursor);
                    235: }
                    236: #endif sun

unix.superglobalmegacorp.com

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