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

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: }

unix.superglobalmegacorp.com

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