|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T c ┃
Length: 6691 (0x1a23) Types: TextFile Names: »cursor.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/libibm/libsrc/cursor.c«
#ifndef lint static char *rcsid_cursor_c = "$Header: cursor.c,v 10.3 86/12/17 18:05:41 swick Exp $"; #endif lint /* Copyright 1985 Massachusetts Institute of Technology */ /* cursor.c - various stuff with the mouse & cursor * * StoreCursor Creates a cursor * FreeCursor Frees the storage taken by a cursor * LoadCursor Loads a bitmap to use as cursor * InitMouse Initialize the mouse * SetCursorPosition Forces cursor to a particular position * SetMouseCharacteristics Controls speed of cursor relative to mouse * * Changes and additions by: * * Scott Bates * Brown University * IRIS, Box 1946 * Providence, RI 02912 * * * Copyright (c) 1986 Brown University * * Permission to use, copy, modify and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies, and that both * that copyright notice and this permission notice appear in supporting * documentation, and that the name of Brown University not be used in * advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Brown University makes no * representations about the suitability of this software for any purpose. * It is provided "as-is" without express or implied warranty. */ #include "private.h" #include "bitblt.h" #ifdef APA16 #include "apa16.h" #endif APA16 #ifdef AED #include "aed.h" #endif AED #ifdef APA8 #include "apa8.h" #endif APA8 #ifdef APA8C #include "apa8c.h" #endif APA8C #ifdef PQD #include "pqd.h" #endif PQD #define imin(a,b) ((a) < (b) ? (a) : (b)) /* * Create a cursor */ /*ARGSUSED*/ CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff) register BITMAP *image; BITMAP *mask; int func, fore, back, xoff, yoff; { register CURSOR *cursor; register u_short *cimage = (u_short *)image->data; register u_short *cmask = (u_short *)mask->data; register CursPriv *curdata; register i, width_mask; static u_short bmask[] = { 0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF }; static u_short defmask[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; #ifdef TRACE_X fprintf(stderr, "In StoreCursor\n"); fflush(stderr); #endif TRACE_X /* * If no mask supplied use default */ if (mask == NULL) cmask = defmask; /* * Allocate space for cursor structure */ cursor = (CURSOR *) Xalloc (sizeof (CURSOR)); /* * Fill in cursor structure */ cursor->width = imin(image->width, CURSOR_WIDTH); cursor->height = imin(image->height, CURSOR_HEIGHT); cursor->xmin = 0; cursor->ymin = 0; cursor->xmax = pbm.width - 1; cursor->ymax = pbm.height - 1; cursor->xoff = xoff; cursor->yoff = yoff; cursor->refcnt = 1; /* * Allocate space for CursPriv structure which holds * cursor image and mask */ curdata = (CursPriv *) Xalloc (sizeof (CursPriv)); cursor->data = (caddr_t) curdata; /* * Get width mask * * Note: cursor image and mask are in IBM bit order * not VAX. Therefore, width masks are in IBM * bit order. */ width_mask = bmask[cursor->width]; if (fore == 0) { /* * Invert and store cursor in CursPriv structure */ for ( i = 0; i < cursor->height; i++) { curdata->mask[i] = (*cmask++) & width_mask; curdata->data[i] = ((*cimage++) & width_mask) ^ curdata->mask[i]; } } else { /* * Store cursor in CursPriv structure */ for ( i = 0; i < cursor->height; i++) { curdata->data[i] = (*cimage++) & width_mask; curdata->mask[i] = (*cmask++) & width_mask; } } /* * Pad cursor image and mask to maximum cursor size */ for (i = cursor->height; i < CURSOR_HEIGHT; i++) { curdata->data[i] = 0; curdata->mask[i] = 0; } /* * Set cursor hotspot */ curdata->hotspot.x = curdata->hotspot.y = 0; /* * Return pointer to cursor structure */ return (cursor); } /* * Free resources held by cursor */ FreeCursor (cursor) register CURSOR *cursor; { #ifdef TRACE_X fprintf(stderr, "In FreeCursor\n"); fflush(stderr); #endif TRACE_X free ((caddr_t) CDATA(cursor)); free ((caddr_t) cursor); } /* * Set hotspot and load new cursor */ LoadCursor (cursor) register CURSOR *cursor; { #ifdef TRACE_X fprintf(stderr, "In LoadCursor\n"); fflush(stderr); #endif TRACE_X /* * Set new hotspot */ XAddr->hotspot.x = cursor->xoff; XAddr->hotspot.y = cursor->yoff; /* * Load new cursor */ return(ioctl (xdev, QIOCLDCUR, (caddr_t) cursor->data)); } /* * Initialize mouse */ InitMouse () { char *MouseType = getenv("MOUSETYPE"); char *MouseName = getenv("MOUSENAME"); struct sgttyb MouseSG; int ldisc, ioarg; extern int mdev; #ifdef TRACE_X fprintf(stderr, "In InitMouse\n"); fflush(stderr); #endif TRACE_X /* * Switch to mouse line discipline */ ldisc = TABLDISC; ioctl(mdev, TIOCSETD, (caddr_t) &ldisc); /* * Check for Mouse Systems Mouse */ if (MouseType && (strcmp (MouseType, "MSCMOUSE") == 0)) { MouseSG.sg_ispeed = 9; MouseSG.sg_ospeed = 9; MouseSG.sg_erase = -1; MouseSG.sg_kill = -1; MouseSG.sg_flags = RAW | ANYP; ioctl(mdev, TIOCSETP, (caddr_t) &MouseSG); /* * Set to MSCmouse emulation */ ldisc = PCMS_DISC; if (ioctl (mdev, TBIOSETD, (caddr_t) &ldisc) < 0) DeviceError("Error in setting PCMS_DISC Line Discipline"); } else { /* Assume the Planar Mouse */ /* * Use 3 button emulation */ ldisc = PLANMS_DISC3; if (ioctl (mdev, TBIOSETD, (caddr_t) &ldisc) < 0) DeviceError("Error in setting PLANMS_DISC3 Line Discipline"); /* * Set defualt mouse sample rate */ ioarg = MS_RATE_40; if (ioctl (mdev, MSIC_SAMP, (caddr_t) &ioarg) < 0) DeviceError ("Error in setting mouse sample rate"); /* * Set defualt mouse resolution */ ioarg = MS_RES_200; if (ioctl (mdev, MSIC_RESL, (caddr_t) &ioarg) < 0) DeviceError ("Error in setting mouse resolution"); } } /* * Set new cursor position */ SetCursorPosition(pos) register XCursor *pos; { #ifdef TRACE_X fprintf(stderr, "In SetCursorPosition\n"); fflush(stderr); #endif TRACE_X return(ioctl(xdev, QIOCSMSTATE, (caddr_t) pos)); } /* * Set mouse threshold and acceleration (mouse speed control) */ SetMouseCharacteristics (threshold, accelaration) int threshold, accelaration; { #ifdef TRACE_X fprintf(stderr, "In SetMouseCharacteristics\n"); fflush(stderr); #endif TRACE_X XAddr->mscale = accelaration; XAddr->mthreshold = threshold; }