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

1.1       root        1: #ifndef lint
                      2: static char *rcsid_cursor_c = "$Header: cursor.c,v 10.3 86/12/17 18:05:41 swick Exp $";
                      3: #endif lint
                      4: /* Copyright 1985 Massachusetts Institute of Technology */
                      5: 
                      6: /* cursor.c - various stuff with the mouse & cursor
                      7:  *
                      8:  *     StoreCursor             Creates a cursor
                      9:  *     FreeCursor              Frees the storage taken by a cursor
                     10:  *     LoadCursor              Loads a bitmap to use as cursor
                     11:  *     InitMouse               Initialize the mouse
                     12:  *     SetCursorPosition       Forces cursor to a particular position
                     13:  *     SetMouseCharacteristics Controls speed of cursor relative to mouse
                     14:  *
                     15:  *     Changes and additions by:
                     16:  *
                     17:  *             Scott Bates
                     18:  *             Brown University
                     19:  *             IRIS, Box 1946
                     20:  *             Providence, RI 02912
                     21:  *
                     22:  *
                     23:  *             Copyright (c) 1986 Brown University
                     24:  *
                     25:  * Permission to use, copy, modify and distribute this software and its
                     26:  * documentation for any purpose and without fee is hereby granted, provided
                     27:  * that the above copyright notice appear in all copies, and that both
                     28:  * that copyright notice and this permission notice appear in supporting
                     29:  * documentation, and that the name of Brown University not be used in
                     30:  * advertising or publicity pertaining to distribution of the software
                     31:  * without specific, written prior permission. Brown University makes no
                     32:  * representations about the suitability of this software for any purpose.
                     33:  * It is provided "as-is" without express or implied warranty.
                     34:  */
                     35: 
                     36: #include "private.h"
                     37: #include "bitblt.h"
                     38: 
                     39: #ifdef APA16
                     40: #include "apa16.h"
                     41: #endif APA16
                     42: 
                     43: #ifdef AED
                     44: #include "aed.h"
                     45: #endif AED
                     46: 
                     47: #ifdef APA8
                     48: #include "apa8.h"
                     49: #endif APA8
                     50: 
                     51: #ifdef APA8C
                     52: #include "apa8c.h"
                     53: #endif APA8C
                     54: 
                     55: #ifdef PQD
                     56: #include "pqd.h"
                     57: #endif PQD
                     58: 
                     59: #define imin(a,b) ((a) < (b) ? (a) : (b))
                     60: 
                     61: /*
                     62:  * Create a cursor 
                     63:  */
                     64: 
                     65: /*ARGSUSED*/
                     66: CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
                     67:        register BITMAP *image;
                     68:        BITMAP *mask;
                     69:        int func, fore, back, xoff, yoff;
                     70: {
                     71:        register CURSOR *cursor;
                     72:        register u_short *cimage = (u_short *)image->data;
                     73:        register u_short *cmask = (u_short *)mask->data;
                     74:        register CursPriv *curdata;
                     75:        register i, width_mask;
                     76:        static u_short bmask[] = { 0x0000, 0x8000, 0xC000, 0xE000,
                     77:                                   0xF000, 0xF800, 0xFC00, 0xFE00,
                     78:                                   0xFF00, 0xFF80, 0xFFC0, 0xFFE0,
                     79:                                   0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF };
                     80: 
                     81:        static u_short defmask[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                     82:                                     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                     83:                                     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                     84:                                     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF };
                     85: 
                     86: #ifdef TRACE_X
                     87:        fprintf(stderr, "In StoreCursor\n");
                     88:        fflush(stderr);
                     89: #endif TRACE_X
                     90: 
                     91:        /*
                     92:         * If no mask supplied use default 
                     93:         */
                     94: 
                     95:        if (mask == NULL)
                     96:                cmask = defmask;
                     97: 
                     98:        /*
                     99:         * Allocate space for cursor structure
                    100:         */
                    101: 
                    102:        cursor = (CURSOR *) Xalloc (sizeof (CURSOR));
                    103: 
                    104:        /*
                    105:         * Fill in cursor structure
                    106:         */
                    107: 
                    108:        cursor->width = imin(image->width, CURSOR_WIDTH);
                    109:        cursor->height = imin(image->height, CURSOR_HEIGHT);
                    110:        cursor->xmin = 0;
                    111:        cursor->ymin = 0;
                    112:        cursor->xmax = pbm.width - 1;
                    113:        cursor->ymax = pbm.height - 1;
                    114:        cursor->xoff = xoff;
                    115:        cursor->yoff = yoff;
                    116:        cursor->refcnt = 1;
                    117: 
                    118:        /*
                    119:         * Allocate space for CursPriv structure which holds
                    120:         * cursor image and mask
                    121:         */
                    122: 
                    123:        curdata = (CursPriv *) Xalloc (sizeof (CursPriv));
                    124:        cursor->data = (caddr_t) curdata;
                    125: 
                    126:        /*
                    127:         * Get width mask
                    128:         *
                    129:         * Note: cursor image and mask are in IBM bit order
                    130:         *       not VAX. Therefore, width masks are in IBM
                    131:         *       bit order.
                    132:         */
                    133: 
                    134:        width_mask = bmask[cursor->width];
                    135:        
                    136:        if (fore == 0) {
                    137:                /*
                    138:                 * Invert and store cursor in CursPriv structure
                    139:                 */
                    140: 
                    141:                for ( i = 0; i < cursor->height; i++) {
                    142:                        curdata->mask[i] = (*cmask++) & width_mask;
                    143:                        curdata->data[i] = ((*cimage++) & width_mask)
                    144:                                                ^ curdata->mask[i];
                    145:                }
                    146:        } else  {
                    147:                /*
                    148:                 * Store cursor in CursPriv structure
                    149:                 */
                    150: 
                    151:                for ( i = 0; i < cursor->height; i++) {
                    152:                        curdata->data[i] = (*cimage++) & width_mask;
                    153:                        curdata->mask[i] = (*cmask++) & width_mask;
                    154:                }
                    155:        }
                    156: 
                    157:        /*
                    158:         * Pad cursor image and mask to maximum cursor size
                    159:         */
                    160: 
                    161:        for (i = cursor->height; i < CURSOR_HEIGHT; i++) {
                    162:                curdata->data[i] = 0;
                    163:                curdata->mask[i] = 0;
                    164:        }
                    165: 
                    166:        /*
                    167:         * Set cursor hotspot
                    168:         */
                    169: 
                    170:        curdata->hotspot.x = curdata->hotspot.y = 0;
                    171: 
                    172:        /*
                    173:         * Return pointer to cursor structure
                    174:         */
                    175: 
                    176:        return (cursor);
                    177: }
                    178: 
                    179: /*
                    180:  * Free resources held by cursor
                    181:  */
                    182: 
                    183: FreeCursor (cursor)
                    184:        register CURSOR *cursor;
                    185: {
                    186: #ifdef TRACE_X
                    187:        fprintf(stderr, "In FreeCursor\n");
                    188:        fflush(stderr);
                    189: #endif TRACE_X
                    190: 
                    191:        free ((caddr_t) CDATA(cursor));
                    192:        free ((caddr_t) cursor);
                    193: }
                    194: 
                    195: /*
                    196:  * Set hotspot and load new cursor
                    197:  */
                    198: 
                    199: LoadCursor (cursor)
                    200:        register CURSOR *cursor;
                    201: {
                    202: #ifdef TRACE_X
                    203:        fprintf(stderr, "In LoadCursor\n");
                    204:        fflush(stderr);
                    205: #endif TRACE_X
                    206: 
                    207:        /*
                    208:         * Set new hotspot
                    209:         */
                    210: 
                    211:        XAddr->hotspot.x = cursor->xoff;
                    212:        XAddr->hotspot.y = cursor->yoff;
                    213: 
                    214:        /*
                    215:         * Load new cursor
                    216:         */
                    217: 
                    218:        return(ioctl (xdev, QIOCLDCUR, (caddr_t) cursor->data));
                    219: }
                    220: 
                    221: /*
                    222:  * Initialize mouse 
                    223:  */
                    224: 
                    225: InitMouse ()
                    226: {
                    227:        char *MouseType = getenv("MOUSETYPE");
                    228:        char *MouseName = getenv("MOUSENAME");
                    229:        struct sgttyb MouseSG;
                    230:        int ldisc, ioarg;
                    231:        extern int mdev;
                    232: 
                    233: #ifdef TRACE_X
                    234:        fprintf(stderr, "In InitMouse\n");
                    235:        fflush(stderr);
                    236: #endif TRACE_X
                    237: 
                    238:        /*
                    239:         * Switch to mouse line discipline
                    240:         */
                    241: 
                    242:        ldisc = TABLDISC;
                    243:        ioctl(mdev, TIOCSETD, (caddr_t) &ldisc);
                    244: 
                    245:        /*
                    246:         * Check for Mouse Systems Mouse
                    247:         */
                    248: 
                    249:        if (MouseType && (strcmp (MouseType, "MSCMOUSE") == 0)) {
                    250:                MouseSG.sg_ispeed = 9;
                    251:                MouseSG.sg_ospeed = 9;
                    252:                MouseSG.sg_erase = -1;
                    253:                MouseSG.sg_kill = -1;
                    254:                MouseSG.sg_flags = RAW | ANYP;
                    255:                ioctl(mdev, TIOCSETP, (caddr_t) &MouseSG);
                    256: 
                    257:                /*
                    258:                 * Set to MSCmouse emulation
                    259:                 */
                    260: 
                    261:                ldisc = PCMS_DISC;
                    262:                if (ioctl (mdev, TBIOSETD, (caddr_t) &ldisc) < 0)
                    263:                    DeviceError("Error in setting PCMS_DISC Line Discipline");
                    264: 
                    265:        } else {        /* Assume the Planar Mouse */
                    266: 
                    267:                /*
                    268:                 * Use 3 button emulation
                    269:                 */
                    270: 
                    271:                ldisc = PLANMS_DISC3;
                    272:                if (ioctl (mdev, TBIOSETD, (caddr_t) &ldisc) < 0)
                    273:                   DeviceError("Error in setting PLANMS_DISC3 Line Discipline");
                    274: 
                    275:                /*
                    276:                 * Set defualt mouse sample rate
                    277:                 */
                    278: 
                    279:                ioarg = MS_RATE_40;
                    280:                if (ioctl (mdev, MSIC_SAMP, (caddr_t) &ioarg) < 0)
                    281:                        DeviceError ("Error in setting mouse sample rate");
                    282: 
                    283:                /*
                    284:                 * Set defualt mouse resolution
                    285:                 */
                    286: 
                    287:                ioarg = MS_RES_200;
                    288:                if (ioctl (mdev, MSIC_RESL, (caddr_t) &ioarg) < 0)
                    289:                        DeviceError ("Error in setting mouse resolution");
                    290:        }
                    291:         
                    292: }
                    293: 
                    294: /*
                    295:  * Set new cursor position
                    296:  */
                    297: 
                    298: SetCursorPosition(pos)
                    299:        register XCursor *pos;
                    300: {
                    301: #ifdef TRACE_X
                    302:        fprintf(stderr, "In SetCursorPosition\n");
                    303:        fflush(stderr);
                    304: #endif TRACE_X
                    305: 
                    306:        return(ioctl(xdev, QIOCSMSTATE, (caddr_t) pos));
                    307: }
                    308: 
                    309: /*
                    310:  * Set mouse threshold and acceleration (mouse speed control)
                    311:  */
                    312: 
                    313: SetMouseCharacteristics (threshold, accelaration)
                    314:        int threshold, accelaration;
                    315: {
                    316: #ifdef TRACE_X
                    317:        fprintf(stderr, "In SetMouseCharacteristics\n");
                    318:        fflush(stderr);
                    319: #endif TRACE_X
                    320: 
                    321:        XAddr->mscale = accelaration;
                    322:        XAddr->mthreshold = threshold;
                    323: }

unix.superglobalmegacorp.com

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