|
|
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: 5959 (0x1747)
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/libvs100/cursor.c«
/* $Header: cursor.c,v 10.3 86/02/01 15:46:34 tony Rel $ */
/* 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
*
*/
/****************************************************************************
* *
* Copyright (c) 1983, 1984 by *
* DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. *
* All rights reserved. *
* *
* This software is furnished on an as-is basis and may be used and copied *
* only with inclusion of the above copyright notice. This software or any *
* other copies thereof may be provided or otherwise made available to *
* others only for non-commercial purposes. No title to or ownership of *
* the software is hereby transferred. *
* *
* The information in this software is subject to change without notice *
* and should not be construed as a commitment by DIGITAL EQUIPMENT *
* CORPORATION. *
* *
* DIGITAL assumes no responsibility for the use or reliability of its *
* software on equipment which is not supplied by DIGITAL. *
* *
* *
****************************************************************************/
#include "vs100.h"
#include "vsioctl.h"
extern vsIoAddr *VSAddr;
extern BitMap screen;
extern char FBMap[];
char *Xalloc(), *AllocateSpace();
CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
register BITMAP *image, *mask;
int func, fore, back, xoff, yoff;
{
register CURSOR *cursor;
register CursPriv *data;
cursor = (CURSOR *) Xalloc (sizeof (CURSOR));
cursor->width = image->width;
cursor->height = image->height;
cursor->xoff = xoff;
cursor->yoff = yoff;
cursor->xmin = xoff;
cursor->ymin = yoff;
cursor->xmax = screen.bm_width - (image->width - xoff);
cursor->ymax = screen.bm_height - (image->height - yoff);
cursor->refcnt = 1;
data = (CursPriv *) Xalloc (sizeof (CursPriv));
data->image = image;
image->refcnt++;
if (data->mask = mask)
mask->refcnt++;
if (fore & 1)
func += 0x20;
if (back & 1)
func += 0x10;
data->map = FBMap[func];
cursor->data = (caddr_t) data;
return (cursor);
}
FreeCursor (cursor)
register CURSOR *cursor;
{
register CursPriv *data;
register BITMAP *bm;
data = CDATA(cursor);
if ((bm = data->image) && --bm->refcnt == 0)
FreeBitmap (bm);
if ((bm = data->mask) && --bm->refcnt == 0)
FreeBitmap (bm);
free ((caddr_t) cursor);
}
LoadCursor (cursor)
register CURSOR *cursor;
{
register CursPriv *data;
register BITMAP *bm;
register LoadCursorPacket *lcp;
lcp = (LoadCursorPacket *) AllocateSpace (sizeof (LoadCursorPacket));
if (lcp == NULL) return;
#define h ((PacketHeader *) lcp->lcp_head)
#define src ((SubBitmap *) lcp->lcp_source.image)
#define msk ((SubBitmap *) lcp->lcp_sourceMask)
#define pat ((Halftone *) lcp->lcp_source.pattern)
#define size ((Extent *) lcp->lcp_maskSize)
data = CDATA(cursor);
h->ph_cursorMod.m_source = 1;
h->ph_cursorMod.m_map = MAPTYPE(data->map);
h->ph_opcode = LOAD_CURSOR;
*(long *) h->ph_next = NULL;
bm = data->image;
*(caddr_t *) src->sb_address = BDATA(bm)->vsPtr;
src->sb_height = bm->height;
src->sb_width = bm->width;
src->sb_bitsPerPixel = 1;
src->sb_x = src->sb_y = 0;
size->e_height = bm->height;
size->e_width = bm->width;
if (bm = data->mask) {
h->ph_cursorMod.m_mask = 1;
*(caddr_t *) msk->sb_address = BDATA(bm)->vsPtr;
msk->sb_height = bm->height;
msk->sb_width = bm->width;
msk->sb_bitsPerPixel = 1;
msk->sb_x = msk->sb_y = 0;
} else
h->ph_cursorMod.m_mask = 0;
*(short *) lcp->lcp_map.literal = MAPLIT(data->map);
lcp->lcp_blink = 0;
lcp->lcp_tip_x = cursor->xoff;
lcp->lcp_tip_y = cursor->yoff;
lcp->lcp_center_x = cursor->xoff;
lcp->lcp_center_y = cursor->yoff;
WritePacket ((caddr_t) lcp);
#undef h
#undef src
#undef msk
#undef pat
#undef size
}
InitMouse ()
{
register AttachCursorPacket *acp;
register SetPointingDeviceReportingPacket *spdp;
acp = (AttachCursorPacket *) AllocateSpace (sizeof (AttachCursorPacket));
if (acp == NULL) return;
#define h ((PacketHeader *) acp->acp_head)
h->ph_modifier.emptymod = 0;
h->ph_opcode = ATTACH_CURSOR;
*(long *) h->ph_next = NULL;
acp->acp_device = 1;
WritePacket ((caddr_t) acp);
#undef h
spdp = (SetPointingDeviceReportingPacket *) AllocateSpace (sizeof (SetPointingDeviceReportingPacket));
if (spdp == NULL) return;
#define h ((PacketHeader *) spdp->spdp_head)
h->ph_modifier.emptymod = 0;
h->ph_opcode = SET_POINTING_DEVICE_REPORTING;
*(long *) h->ph_next = NULL;
spdp->spdp_enable = 1;
WritePacket ((caddr_t) spdp);
#undef h
}
SetCursorPosition(pos)
register vsCursor *pos;
{
register SetCursorPositionPacket *scp;
scp = (SetCursorPositionPacket *) AllocateSpace (sizeof (SetCursorPositionPacket));
if (scp == NULL) return;
#define h ((PacketHeader *) scp->scp_head)
#define loc ((Point *) scp->scp_position)
h->ph_modifier.emptymod = 0;
h->ph_opcode = SET_CURSOR_POSITION;
*(long *) h->ph_next = NULL;
loc->p_x = pos->x;
loc->p_y = pos->y;
WritePacket ((caddr_t) scp);
VSAddr->mouse = *pos;
#undef h
#undef loc
}
SetMouseCharacteristics (threshold, acceleration)
int threshold, acceleration;
{
register SetMouseCharacteristicsPacket *smp;
smp = (SetMouseCharacteristicsPacket *) AllocateSpace (sizeof (SetMouseCharacteristicsPacket));
if (smp == NULL) return;
#define h ((PacketHeader *) smp->smc_head)
h->ph_mouseMod.m_tracking = 1;
h->ph_opcode = SET_MOUSE_CHARACTERISTICS;
*(long *) h->ph_next = NULL;
smp->smc_scale = acceleration;
smp->smc_threshold = threshold;
WritePacket ((caddr_t) smp);
#undef h
}