|
|
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 - metrics - downloadIndex: T c
Length: 5452 (0x154c)
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/libsun/cursor.c«
/*
* X window system version 10.3
* Copyright (c) 1985, 1986 Massachusets Institute of Technology
*
* Sun implementation dependent library
* Copyright (c) 1983, 1984, 1985, 1986 Sun Microsystems, Inc.
*
* $Author: swick $
* $Source: /u1/X/libsun/RCS/cursor.c,v $
* $Revision: 10.5 $
* $Date: 86/12/17 20:32:30 $
*
*/
#ifndef lint
static char rcs_id[] = "$Header: cursor.c,v 10.5 86/12/17 20:32:30 swick Exp $";
#endif !lint
#ifdef sun
/* 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:
* Use macros for CheckCursor()
*/
#include "Xsun.h"
extern struct pixrect *PixRect;
extern char *Xalloc();
extern DEVICE *CurrentDevice;
extern int vsdev;
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);
if (fore && back || !fore && !back)
if (fore)
data->c_func = PIX_SRC | PIX_NOT(PIX_SRC);
else
data->c_func = PIX_SRC & PIX_NOT(PIX_SRC);
else if (fore && WhitePixel)
data->c_func = SUN_FROM_X_OP(func);
else
data->c_func = SUN_FROM_X_OP_INVERT(func);
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);
win_setmouseposition(vsdev, pos->x, pos->y);
}
}
SetMouseCharacteristics (threshold, accelaration)
int threshold, accelaration;
{
extern sunthreshold;
extern sunaccel;
sunthreshold = threshold;
sunaccel = accelaration;
}
DisplayCursor(cs)
CURSOR *cs;
{
extern struct pixrect *PixRect;
vsCursor *ms = CurrentDevice->mouse;
if (cs == NULL) {
if (CurrentCursor) {
/* take it out */
extern int private_czmask;
int old_zmask = private_czmask;
int 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) {
if (cp->bot != (struct pixrect *) NULL &&
cp->top != (struct pixrect *) NULL) {
pr_stencil(PixRect, ms->x, ms->y,
cs->width, cs->height,
cp->c_func,
cp->bot, 0, 0,
cp->top, 0, 0);
}
} else {
extern int private_bgcolor;
extern int private_fgcolor;
extern int 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