4.3BSD/usr/contrib/X/libsun/cursor.c

Compare this file to the similar file:
Show the results in this format:

#ifdef	sun
/*
 * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
 * for unrestricted use provided that this legend is included on all tape
 * media and as a part of the software program in whole or part.  Users
 * may copy or modify these drivers without charge, but are not authorized
 * to license or distribute them to anyone else except as part of a product or
 * program developed by the user.
 * 
 * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
 * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
 * PRACTICE.
 *
 * The Sun X Drivers are provided with no support and without any obligation
 * on the part of Sun Microsystems, Inc. to assist in their use, correction,
 * modification or enhancement.
 * 
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
 * DRIVERS OR ANY PART THEREOF.
 * 
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
 * or profits or other special, indirect and consequential damages, even if
 * Sun has been advised of the possibility of such damages.
 * 
 * Sun Microsystems, Inc.
 * 2550 Garcia Avenue
 * Mountain View, California  94043
 */

#ifndef	lint
static char sccsid[] = "@(#)cursor.c 2.1 86/01/28 Copyright 1986 Sun Micro";
#endif

/*-
 * Copyright (c) 1986 by Sun Microsystems,  Inc.
 */

/* 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
 *
 */

/*
 *	ToDo:
 *		Threshold/Acceleration
 *		Use macros for CheckCursor()
 */

#include "Xsun.h"

extern struct pixrect *PixRect;
extern char *Xalloc();
extern DEVICE *CurrentDevice;
CURSOR *CurrentCursor;
int CursorDisplayed;
static struct pixrect *CursorPixrect;

CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
	BITMAP *image;
	BITMAP *mask;
	int func, fore, back, xoff, yoff;
{
    register CURSOR *cursor;
    register CursPriv *data;

    if (!image)
	return (NULL);
    cursor = (CURSOR *) Xalloc(sizeof(CURSOR));
    cursor->width = image->width;
    cursor->height = image->height;
    /* Only the tip need be on-screen */
    cursor->xmin = 0;
    cursor->ymin = 0;
    cursor->xoff = xoff;
    cursor->yoff = yoff;
    cursor->xmax = PixRect->pr_size.x;
    cursor->ymax = PixRect->pr_size.y;
    cursor->refcnt = 1;
    data = (CursPriv *) Xalloc(sizeof(CursPriv));
    cursor->data = (caddr_t) data;
    data->top = mem_point(image->width, image->height, 1, image->data);
    data->top_bit = image;
    image->refcnt++;
    if (mask) {
	data->bot = mem_point(mask->width, mask->height, 1, mask->data);
	data->bot_bit = mask;
	mask->refcnt++;
    } else {
	data->bot = NULL;
	data->bot_bit = NULL;
    }
    data->sv = mem_create(cursor->width, cursor->height, PixRect->pr_depth);
    data->fore = fore;
    data->back = back;
    return (cursor);
}

FreeCursor (cursor)
	register CURSOR *cursor;
{
    CursPriv   *cp = CDATA(cursor);
    pr_destroy(cp->top);
    if (cp->top_bit && --(cp->top_bit)->refcnt <= 0)
	FreeBitmap(cp->top_bit);
    if (cp->bot) {
	pr_destroy(cp->bot);
	if (cp->bot_bit && --(cp->bot_bit)->refcnt <= 0)
	    FreeBitmap(cp->bot_bit);
    }
    pr_destroy(cp->sv);
    free((caddr_t) CDATA(cursor));
    free((caddr_t) cursor);
}

struct pr_prpos topbatch, botbatch;

LoadCursor (cursor)
	register CURSOR *cursor;
{
    if (CursorDisplayed)
	DisplayCursor(NULL);
    if ((CurrentCursor = cursor) != NULL) {
	topbatch.pr = CDATA(cursor)->top;
	topbatch.pos.x = 0;
	topbatch.pos.y = 0;
	botbatch.pr = CDATA(cursor)->bot;
	botbatch.pos.x = 0;
	botbatch.pos.y = 0;
	DisplayCursor(cursor);
    }
}

InitMouse ()
{
}

SetCursorPosition(pos)
	register vsCursor *pos;
{
    if (pos->x != (CurrentDevice->mouse->x) || pos->y != (CurrentDevice->mouse->y)) {
	if (CursorDisplayed)
	    DisplayCursor(NULL);
	*(CurrentDevice->mouse) = *pos;
	DisplayCursor(CurrentCursor);
    }
}

SetMouseCharacteristics (threshold, accelaration)
	int threshold, accelaration;
{
}

DisplayCursor(cs)
CURSOR *cs;
{
    extern struct pixrect *PixRect;
    vsCursor   *ms = CurrentDevice->mouse;

    if (cs == NULL) {
	if (CurrentCursor) {
	    /* take it out */
	    extern private_czmask;
	    int old_zmask = private_czmask, allmask = -1;

	    SetZmask(PixRect, &allmask);
	    pr_rop(PixRect, ms->x, ms->y, CurrentCursor->width,
		   CurrentCursor->height, PIX_SRC, CDATA(CurrentCursor)->sv, 0, 0);
	    SetZmask(PixRect, &old_zmask);
	    CursorDisplayed = 0;
	}
    }
    else {
	CursPriv   *cp = CDATA(cs);
	/* put it in */

	pr_rop(cp->sv, 0, 0, cs->width, cs->height, PIX_SRC,
	       PixRect, ms->x, ms->y);
	if (PixRect->pr_depth == 1) {
	    int botop = (cp->back == 1 ? PIX_SRC | PIX_DST : PIX_NOT(PIX_SRC) & PIX_DST);
	    int topop = (cp->fore == 1 ? PIX_SRC | PIX_DST : PIX_NOT(PIX_SRC) & PIX_DST);

	    if (botbatch.pr)
		pr_batchrop(PixRect, ms->x, ms->y,
			    botop,
			    &botbatch, 1);
	    if (topbatch.pr)
		pr_batchrop(PixRect, ms->x, ms->y,
			    topop,
			    &topbatch, 1);
	}
	else {
	    extern private_bgcolor, private_fgcolor, private_czmask;
	    int old_zmask = private_czmask;

	    private_bgcolor = -1;
	    private_czmask = -1;
	    if (botbatch.pr) {
		private_fgcolor = cp->back;
		pr_batchrop(PixRect, ms->x, ms->y,
			    PIX_SRC | PIX_DST,
			    &botbatch, 1);
	    }
	    private_fgcolor = cp->fore;
	    if (topbatch.pr)
		pr_batchrop(PixRect, ms->x, ms->y,
			    PIX_NOT(PIX_SRC) & PIX_DST,
			    &topbatch, 1);
	    private_czmask = old_zmask;
	}
	CursorDisplayed = 1;
    }
}

int
CheckCursor(x, y, w, h)
{
    register vsCursor *ms = CurrentDevice->mouse;
    register CURSOR *cs = CurrentCursor;

    if (CursorDisplayed
	&& OverLap(x, y, w, h, ms->x, ms->y, cs->width, cs->height)) {
	    DisplayCursor(NULL);
	}
}

RestoreCursor()
{
    if (!CursorDisplayed)
	DisplayCursor(CurrentCursor);
}
#endif	sun