|
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: 6975 (0x1b3f) 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/libis/cursor.c«
/* * $Source: /u1/X/libis/RCS/cursor.c,v $ * $Header: cursor.c,v 1.1 86/11/17 14:33:26 swick Rel $ */ #ifndef lint static char *rcsid_cursor_c = "$Header: cursor.c,v 1.1 86/11/17 14:33:26 swick Rel $"; #endif lint #include "is-copyright.h" /* 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 * UpdateCursorPosition Moves cursor to a particular position * SetMouseCharacteristics Controls speed of cursor relative to mouse * * Copyright (c) 1986, Integrated Solutions, Inc. * */ #include "Xis.h" static CURSOR *CurrentCursor; static int CursorDisplayed; extern BITMAP *StoreBitmap(); extern PIXMAP *MakePixmap(); extern DEVICE *CurrentDevice; /* * StoreCursor */ CURSOR *StoreCursor(func, image, fore, back, mask, xoff, yoff) int func; register BITMAP *image; register int fore, back; BITMAP *mask; int xoff, yoff; { register CURSOR *cursor; register CursPriv *data; BITMAP *bitmap; #ifdef DEBUG if (debug & D_Cursor) printf("StoreCursor(func=%d, image=0x%x, fore=%d, back=%d, mask=0x%x,\n xoff=%d, yoff=%d)\n", func, image, fore, back, mask, xoff, yoff); #endif DEBUG if (!image) { return (NULL); } cursor = (CURSOR *) Xalloc(sizeof(CURSOR)); cursor->width = image->width; cursor->height = image->height; cursor->xoff = xoff; cursor->yoff = yoff; /* Only the tip need be on-screen */ cursor->xmin = 0; cursor->ymin = 0; cursor->xmax = CurrentDevice->width; cursor->ymax = CurrentDevice->height; cursor->refcnt = 1; data = (CursPriv *) Xalloc(sizeof(CursPriv)); cursor->data = (caddr_t) data; data->image = MakePixmap(image, fore, back); data->image->tile = CannotBeTiled; data->mask = mask; if (mask) { mask->refcnt++; } data->func = func; data->fore = fore; data->back = back; bitmap = StoreBitmap(image->width, image->height, (char *)NULL); data->save = MakePixmap(bitmap, fore, back); data->save->tile = CannotBeTiled; return (cursor); } /* * FreeCursor */ FreeCursor(cursor) CURSOR *cursor; { register CursPriv *cp = CDATA(cursor); #ifdef DEBUG if (debug & D_Cursor) printf("FreeCursor(cursor=0x%x)\n", cursor); #endif DEBUG FreePixmap(cp->image); if (cp->mask) { FreeBitmap(cp->mask); } FreePixmap(cp->save); free((caddr_t) cp); free((caddr_t) cursor); } /* * LoadCursor */ LoadCursor(cursor) register CURSOR *cursor; { #ifdef DEBUG if (debug & D_Cursor) printf("LoadCursor(cursor=0x%x)\n", cursor); #endif DEBUG if (CurrentCursor != cursor) { if (CursorDisplayed) { DisplayCursor((CURSOR *)NULL); } if ((CurrentCursor = cursor) != NULL) { DisplayCursor(cursor); } } } /* * InitMouse */ static short sbounds[4]; InitMouse() { #ifdef DEBUG if (debug & D_Misc) printf("InitMouse()\n"); #endif DEBUG sbounds[0] = 0; sbounds[1] = ScreenPixmap.width; sbounds[2] = 0; sbounds[3] = ScreenPixmap.height; } /* * SetCursorPosition */ SetCursorPosition(pos) register vsCursor *pos; { extern int indev, invalid_mouse; #ifdef DEBUG if (debug & D_Cursor) printf("SetCursorPosition(pos->x=%d, pos->y=%d)\n", pos->x, pos->y); #endif DEBUG if (pos->x != (CurrentDevice->mouse->x) || pos->y != (CurrentDevice->mouse->y)) { /* keep mouse in sync with cursor */ short mbounds[4]; mbounds[0] = mbounds[1] = pos->x; mbounds[2] = mbounds[3] = pos->y; ioctl(indev, TIOUMBND, mbounds); /* warps mouse cursor */ ioctl(indev, TIOUMBND, sbounds); /* sets bounds back */ invalid_mouse = 1; UpdateCursorPosition(pos); } } vsCursor last_mouse; /* last known mouse position */ /* * UpdateCursorPosition */ UpdateCursorPosition(pos) register vsCursor *pos; { #ifdef DEBUG if (debug & D_Cursor) printf("UpdateCursorPosition(pos->x=%d, pos->y=%d)\n", pos->x, pos->y); #endif DEBUG /* assumes mouse is in sync with cursor */ if (pos->x != (CurrentDevice->mouse->x) || pos->y != (CurrentDevice->mouse->y)) { if (CursorDisplayed) { DisplayCursor((CURSOR *)NULL); } *(CurrentDevice->mouse) = *pos; last_mouse = *pos; /* update last mouse position */ DisplayCursor(CurrentCursor); } } SetMouseCharacteristics(threshold, acceleration) int threshold, acceleration; { extern int mouse_threshold, mouse_acceleration; #ifdef DEBUG if (debug & D_Misc) printf("SetMouseCharacteristics(threshold=%d, acceleration=%d)\n", threshold, acceleration); #endif DEBUG mouse_threshold = threshold; mouse_acceleration = acceleration; } /* * DisplayCursor */ static DisplayCursor(cursor) CURSOR *cursor; { register vsCursor *ms = CurrentDevice->mouse; register CursPriv *cp = CDATA(cursor); register int x = ms->x; register int y = ms->y; CLIP i; CLIP bc, bs; #ifdef DEBUG if (debug & D_Cursor) printf("DisplayCursor(cursor=0x%x)\n", cursor); #endif DEBUG bs.left = 0; bs.width = ScreenPixmap.width; bs.top = 0; bs.height = ScreenPixmap.height; if (cursor == NULL) { if (CurrentCursor) { /* pick up cursor (put background back) */ cp = CDATA(CurrentCursor); bc.left = x; bc.width = CurrentCursor->width; bc.top = y; bc.height = CurrentCursor->height; i = Intersection(bc, bs); GIP_RasterOp(GIPcopy, cp->save, i.left-x, i.top-y, &ScreenPixmap, i.left, i.top, (BITMAP *)NULL, 0, 0, i.width, i.height, ~0); CursorDisplayed = 0; } } else { bc.left = x; bc.width = cursor->width; bc.top = y; bc.height = cursor->height; i = Intersection(bc, bs); /* save background */ GIP_RasterOp(GIPcopy, &ScreenPixmap, i.left, i.top, cp->save, i.left-x, i.top-y, (BITMAP *)NULL, 0, 0, i.width, i.height, ~0); /* put cursor down */ GIP_RasterOp((unsigned char)(cp->func), cp->image, i.left-x, i.top-y, &ScreenPixmap, i.left, i.top, cp->mask, i.left-x, i.top-y, i.width, i.height, ~0); CursorDisplayed = 1; } } /* * CheckCursor */ CheckCursor(r1) CLIP r1; { register vsCursor *ms = CurrentDevice->mouse; register CURSOR *cursor = CurrentCursor; CLIP r2; #ifdef DEBUG if (debug & D_Cursor) { printf("CheckCursor()\n"); printf_clip(" bounds", r1); } #endif DEBUG if (cursor == NULL) { return; } r2.left = ms->x; r2.top = ms->y; r2.width = cursor->width; r2.height = cursor->height; #ifdef DEBUG if (debug & D_Cursor) printf_clip(" cursor", r2); #endif DEBUG if (CursorDisplayed && Overlap(r1, r2)) { DisplayCursor((CURSOR *)NULL); } } /* * RestoreCursor */ RestoreCursor() { #ifdef DEBUG if (debug & D_Cursor) printf("RestoreCursor()\n"); #endif DEBUG if (!CursorDisplayed) { DisplayCursor(CurrentCursor); } }