|
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 V
Length: 22583 (0x5837) Types: TextFile Names: »Valuator.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/DECToolkit/src/Valuator.c«
/* * $Source: /u1/X/DECToolkit/src/RCS/Valuator.c,v $ * $Header: Valuator.c,v 1.1 86/12/17 09:04:00 swick Exp $ */ #ifndef lint static char *rcsid_Valuator_c = "$Header: Valuator.c,v 1.1 86/12/17 09:04:00 swick Exp $"; #endif lint #ifndef lint static char *sccsid = "@(#)Valuator.c 1.6 12/11/86"; #endif lint /* * COPYRIGHT 1986 * DIGITAL EQUIPMENT CORPORATION * MAYNARD, MASSACHUSETTS * ALL RIGHTS RESERVED. * * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. * * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT * SET FORTH ABOVE. * * * 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 Digital Equipment Corporation not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. */ /* * * Author: K. Langone * */ #include <stdio.h> #include <X/Xlib.h> #include "Toolkit.h" /* Private Definitions */ #define valuatorEvents (LeaveWindow | EnterWindow | ButtonPressed | \ ButtonReleased | LeftDownMotion | ExposeWindow) #define valbuttonEvents (ExposeRegion | ExposeWindow | \ ButtonPressed | ButtonReleased) #define IgnoreEvent - 1 #define sizedif 2 typedef struct _ValuatorData { Window tw; /* valuator tool window */ Window pw; /* parent window, needed for resizing */ int wheight; /* original height of parent window */ int wwidth; /* original width of parent window */ int type; /* type - visible or transparent */ enum Direction orientation; /* vertical - horizontal */ int maxdim; /* max width of valuator */ int mindim; /* minimum dimension */ int x, y; /* position relative to parent window */ float indpos; /* indicator pos. on valuator(0.0-1.0) */ int indx, indy; /* integer pixel position */ int indsize; /* height of indicator */ int brwidth; /* border width */ Pixmap brcolor; /* border color index */ Pixmap background; /* pixmap of background */ Pixmap indcolor; /* indicator color index */ int (*Proc) (); /* procedure called when ind. is moved */ caddr_t tag; /* additional tool data */ } ValuatorData; static int valuatorEntry; static int initDone = 0; extern char *malloc (); float *ptr; /* =================================================================== */ /* Private Procedures */ static Initialize () { valuatorEntry = UniqueEntryType (); initDone = 1; } static Dummy() { printf("dummy call back for Valuator\n"); } /* -----> Utilities */ /* =================================================================== */ /* -----> Utilities */ /* This procedure will move the indicator using * two XTileSet calls * If the indx or indy = IgnoreEvent the * current indicator position is not updated , * this condition will occur on expose window events or * changing the indicator size */ static void MoveTheIndicator (data, event) ValuatorData * data; XButtonPressedEvent * event; { int newpos, update, delta, deltax, deltay; /* -----> check to see if indicator should be moved */ update = 1; if (data -> orientation == Horizontal) { /* -----> move indicator pixmap horizontally */ if (data -> indx == IgnoreEvent) { /* ignore input event */ update = 0; data -> indx = (int) (data -> indpos * (data -> maxdim - data -> indsize)); if (data -> type == Visible) { /* don't need to clear */ XTileSet (data -> tw, data -> indx, data -> indy, data -> indsize, data -> mindim, data -> indcolor); } } else if (event -> x >= data -> maxdim - data -> indsize) /* got input at end of scroll bar */ newpos = data -> maxdim - data -> indsize; else if (event -> x < 0)/* possible error */ newpos = 0; else /* valid input for scroll bar */ newpos = event -> x; /* ----->Calculate the clear and draw areas */ if (update & (data -> type == Visible)) { delta = abs (newpos - data -> indx); deltax = data -> indsize - delta; if (abs (newpos - data -> indx) >= data -> indsize) { /* clear all of the indicator */ XTileSet (data -> tw, newpos, data -> indy, data -> indsize, data -> mindim, data -> indcolor); XTileSet (data -> tw, data -> indx, data -> indy, data -> indsize, data -> mindim, data -> background); } else if (newpos < data -> indx) { XTileSet (data -> tw, newpos, data -> indy, delta, data -> mindim, data -> indcolor); XTileSet (data -> tw, data -> indx + deltax, data -> indy, delta, data -> mindim, data -> background); } else { /* newpos > data->indx */ XTileSet (data -> tw, newpos + deltax, data -> indy, delta, data -> mindim, data -> indcolor); XTileSet (data -> tw, data -> indx, data -> indy, delta, data -> mindim, data -> background); } /* update indicator position */ data -> indx = newpos; } } /* end up/down scroll bar */ else { /* -----> move indicator pixmap vertically */ if (data -> indy == IgnoreEvent) { /* ignore input event */ update = 0; data -> indy = (int) (data -> indpos * (data -> maxdim - data -> indsize)); /* don't need to clear */ if (data -> type == Visible) { XTileSet (data -> tw, data -> indx, data -> indy, data -> mindim, data -> indsize, data -> indcolor); } } else if (event -> y >= data -> maxdim - data -> indsize) /* got input at end of scroll bar */ newpos = data -> maxdim - data -> indsize; else if (event -> y < 0)/* possible error */ newpos = 0; else /* valid input for scroll bar */ newpos = event -> y; /* ----->Calculate the clear and draw areas */ if (update & (data -> type == Visible)) { delta = abs (newpos - data -> indy); deltay = data -> indsize - delta; if (abs (newpos - data -> indy) >= data -> indsize) { /* clear all of the indicator */ XTileSet (data -> tw, data -> indx, newpos, data -> mindim, data -> indsize, data -> indcolor); XTileSet (data -> tw, data -> indx, data -> indy, data -> mindim, data -> indsize, data -> background); } else if (newpos < data -> indy) { XTileSet (data -> tw, data -> indx, newpos, data -> mindim, delta, data -> indcolor); XTileSet (data -> tw, data -> indx, data -> indy + deltay, data -> mindim, delta, data -> background); } else { /* newpos > data->indy */ XTileSet (data -> tw, data -> indx, newpos + deltay, data -> mindim, delta, data -> indcolor); XTileSet (data -> tw, data -> indx, data -> indy, data -> mindim, delta, data -> background); } /* update indicator position */ data -> indy = newpos; } } /* -----> Change the floating point relative indicator position */ if (update) { data -> indpos = (float) newpos / (float) (data -> maxdim - 2 * data -> brwidth); } } /* =================================================================== */ /* This procedure reports the indicator position * in floating point to the Proc */ static void ReportThumbPosition (data, event) ValuatorData * data; XButtonPressedEvent * event; { float finalvalue; caddr_t tag; if (data -> orientation == Horizontal) { if (event -> x >= data -> maxdim - (int) data -> indsize) finalvalue = 1.0; else if (event -> x < 0) finalvalue = 0.0; else finalvalue = (float) event -> x / ((float) (data -> maxdim - data -> indsize)); } else { if (event -> y >= data -> maxdim - (int) data -> indsize) finalvalue = 1.0; else if (event -> y < 0) finalvalue = 0.0; else finalvalue = (float) event -> y / ((float) (data -> maxdim - data -> indsize)); } /* -----> call the client procedure */ data -> Proc (finalvalue, data -> tag); } /* =================================================================== */ /* * * This procedure will resize the valuator scroll bar */ Status SetIndSize (data, indsize) ValuatorData * data; float indsize; /* indicator size as portion of valuator*/ { Status status; /* -----> Calulate the indicator size in pixels */ data -> indsize = (int) (indsize * (float) data -> maxdim); } /* =================================================================== */ /* This procedure will configure the valuator with * the new dimensions and update the parent window * dimensions in the valuator data structure */ static void ConfigureValuator (data, x, y, width, height) ValuatorData * data; int x, y; int width; int height; { float delta; /* -----> Proportion the Valuator data to the new values */ if (data -> orientation == Horizontal) { delta = (float) width / (float) data -> wwidth; data -> maxdim = delta * (float) data -> maxdim; /* SetIndSize(data, delta); */ XConfigureWindow (data -> tw, data -> x, data -> y, data -> maxdim, data -> mindim); } else { delta = (float) height / (float) data -> wheight; data -> maxdim = delta * (float) data -> maxdim; /* SetIndSize(data, delta); */ XConfigureWindow (data -> tw, data -> x, data -> y, data -> mindim, data -> maxdim); } XFlush (); } /* =================================================================== */ /* The procedure checks to see if the window size was * and will invoke ConfigureValuator if necessary */ static void CheckForResize (data, event) ValuatorData * data; XEvent * event; { WindowInfo info; /* -----> get parent window information */ XQueryWindow (data -> pw, &info); XFlush (); if (info.width != data -> wwidth || info.height != data -> wheight) { /* resize the window */ ConfigureValuator (data, info.x, info.y, info.width, info.height); if (data -> orientation == Horizontal) { /* update the current window dimensions */ data -> wwidth = info.width; data -> wheight = info.height; } else { /* update the current window dimensions */ data -> wwidth = info.width; data -> wheight = info.height; } } } /* =================================================================== */ /* This procedure will process the Scroll Bar events * and given the event will invoke routines to * move the indicator and check for resize */ static int TProcessValuatorEvent (event) XEvent * event; { int x, y, subW, error; int returnCode; short state; ValuatorData * data; Status status; error = FindEntry (event -> window, valuatorEntry, &data); if (error != ERRNONE) return (NOTHANDLED); returnCode = PROCESSED; switch (event -> type) { case MouseMoved: MoveTheIndicator (data, event); case ButtonPressed: MoveTheIndicator (data, event); ReportThumbPosition (data, event); break; case ButtonReleased: MoveTheIndicator (data, event); ReportThumbPosition (data, event); break; case ExposeWindow: if (data -> orientation == Horizontal) data -> indx = IgnoreEvent; else data -> indy = IgnoreEvent; MoveTheIndicator (data, event); case EnterWindow: /* status = XQueryMouseButtons(event->window, &x, &y, &subW, &state); if (state & LeftMask) DisplayCommand(event->window, data, TRUE); break; */ case LeaveWindow: /* MoveTheIndicator(data, event); */ break; default: returnCode = NOTHANDLED; } return (returnCode); } /* Public Procedures */ /* =================================================================== */ /* * This procedure will reposition the indicator * and can be called from the application */ Status TSetIndPosition (tw, indpos) Window tw; /* valuator tool window */ float indpos; /* indicator position on valuator(0.0-1.0) */ { ValuatorData * data; int error; Status status; float movelength; WindowInfo info; error = FindEntry (tw, valuatorEntry, &data); /* put in error check on indpos later (0.0-1.0) */ movelength = (float) (data -> maxdim) - data -> indsize; /* if (data->orientation == Horizontal) else */ /* -----> change the value in the data structure */ data -> indpos = indpos; status = 1; } /* =================================================================== */ /* * * This procedure will resize the valuator indicator */ Status TSetIndSize (tw, indsize) Window tw; /* valuator tool window */ float indsize; /* indicoatr size */ { ValuatorData * data; XEvent * event; /* this is only used as a pointer */ int error; Status status; /* -----> Error check for appropriate indsize */ /* if (indsize > 1.0) or (indsize < 0.0) then report error */ /* -----> Get valuator data */ error = FindEntry (tw, valuatorEntry, &data); status = SetIndSize (data, indsize); } /* =================================================================== */ /* * * This procedure will refresh the Valuator */ Status TRefreshValuator (tw) Window tw; /* valuator tool window */ { ValuatorData * data; XEvent * event; /* this is only used as a pointer */ int error; Status status; /* -----> Get the data */ error = FindEntry (tw, valuatorEntry, &data); /* -----> Set Ignore Event flag */ if (data -> orientation == Horizontal) data -> indx = IgnoreEvent; else data -> indy = IgnoreEvent; /* -----> Invoke procedure to display new indicator size */ MoveTheIndicator (data, event); } /* =================================================================== */ /* * This procedure will reconfigure the valuator * and obtain the tool's data * Note: if Horizontal Scroll bar - width = long dimension * else for Left/Right Scroll bar - height = long dimension */ Status TConfigureValuator (tw, x, y, width, height) Window tw; /* valuator tool window */ int x, y; /* new window position */ int width; /* new valuator width */ int height; /* new valuator height */ { ValuatorData * data; int error; float indsize; Status status; /* -----> Get the valuator data */ error = FindEntry (tw, valuatorEntry, data); /* -----> Proportionally Change the Thumbsize */ if (data -> orientation == Horizontal) indsize = (float) width / (float) data -> maxdim; else indsize = (float) height / (float) data -> maxdim; SetIndSize (data, indsize); ConfigureValuator (data, x, y, width, height); } /* =================================================================== */ /* * This procedure will destroy a valuator * */ Status TDestroyValuator (tw) Window tw; { /* -----> Delete the data in the table */ DeleteEntry (tw, valuatorEntry); /* Other code, tbd... */ } /* =================================================================== */ /* * This procedure will create a command button and will set predefined * values colors,font,and state selection. If any errors are detected * during the parsing of the input arguments, an exit will occur. * */ Status TGetValuatorAttr (tw, arglist) Window tw; /* tool window */ Targ * arglist; { extern FontInfo * gfontinfo; ValuatorData * data; int return_code; /* return code from window creation */ int i, error; error = FindEntry (tw, valuatorEntry, &data); /* -----> Parsing input parameters */ while (arglist -> name) { switch (arglist -> name) { case T_VALUATOR_TYPE: arglist -> data = (caddr_t) data -> type; break; case T_VALUATOR_ORIENT: arglist -> data = (caddr_t) data -> orientation; break; case T_VALUATOR_MAXDIM: arglist -> data = (caddr_t) data -> maxdim; break; case T_VALUATOR_MINDIM: arglist -> data = (caddr_t) data -> mindim; break; case T_VALUATOR_INDPOS: arglist -> data = (caddr_t) & data -> indpos; break; case T_VALUATOR_INDSIZE: arglist -> data = (caddr_t) data -> indsize; break; case T_VALUATOR_BRCOLOR: arglist -> data = (caddr_t) data -> brcolor; break; case T_VALUATOR_BACKGROUND: arglist -> data = (caddr_t) data -> background; break; case T_VALUATOR_BRWIDTH: arglist -> data = (caddr_t) data -> brwidth; break; case T_VALUATOR_INDCOLOR: arglist -> data = (caddr_t) data -> indcolor; break; case T_VALUATOR_PROC: arglist -> data = (caddr_t) data -> Proc; break; case T_VALUATOR_TAG: arglist -> data = (caddr_t) data -> tag; break; default: /* eventually put in error message */ break; } arglist++; } } /* =================================================================== */ /* * This procedure will create a command button and will set predefined * values colors,font,and state selection. If any errors are detected * during the parsing of the input arguments, an exit will occur. * */ Status TSetValuatorAttr (tw, arglist) Window tw; /* tool window */ Targ * arglist; { extern FontInfo * gfontinfo; ValuatorData * data; int return_code; /* return code from window creation */ int twidth, theight; int error; error = FindEntry (tw, valuatorEntry, &data); /* -----> Parsing input parameters */ while (arglist -> name) { switch (arglist -> name) { case T_VALUATOR_TYPE: data -> type = (int) arglist -> data; break; case T_VALUATOR_ORIENT: data -> orientation = (enum Direction) arglist -> data; break; case T_VALUATOR_MAXDIM: data -> maxdim = (int) arglist -> data; break; case T_VALUATOR_MINDIM: data -> mindim = (int) arglist -> data; break; case T_VALUATOR_INDPOS: ptr = (float *) arglist -> data; data -> indpos = *ptr; break; case T_VALUATOR_INDSIZE: data -> indsize = (int) arglist -> data; break; case T_VALUATOR_BRCOLOR: data -> brcolor = (Pixmap) arglist -> data; break; case T_VALUATOR_BACKGROUND: data -> background = (Pixmap) arglist -> data; break; case T_VALUATOR_BRWIDTH: data -> brwidth = (int) arglist -> data; break; case T_VALUATOR_INDCOLOR: data -> indcolor = (int) arglist -> data; break; case T_VALUATOR_PROC: data -> Proc = (int (*) ()) arglist -> data; break; case T_VALUATOR_TAG: data -> tag = arglist -> data; break; default: break; } arglist++; } /* if (data->type == 0) DisplayValuatorTx(tw, data, 0); else DisplayValuatorPx(tw, data, 0); what to put in here? */ } /* =================================================================== */ /* * * This procedure will create a valuator * */ Window TCreateValuator (pw, arglist) Window pw; /* parent window */ Targ * arglist; /* argument list */ { ValuatorData * data; WindowInfo info; Status status; /* -----> Perform initialization */ if (!initDone) Initialize (); /* -----> Allocate space for data structure */ data = (ValuatorData *) Tmalloc (sizeof (ValuatorData)); /* -----> Set default values */ data -> type = Visible; data -> orientation = Vertical; data -> x = 0; data -> y = 0; data -> indpos = 0.0; data -> indsize = 10; data -> brwidth = 2; data -> brcolor = BlackPixmap; data -> background = WhitePixmap; data -> indcolor = BlackPixmap; data -> maxdim = 70; data -> mindim = 10; data -> Proc = Dummy; data -> tag = NULL; /* -----> Get parent window dimensions */ status = XQueryWindow (pw, &info); data -> wheight = info.height; data -> wwidth = info.width; /* -----> Parsing input parameters */ while (arglist -> name) { switch (arglist -> name) { case T_VALUATOR_TYPE: data -> type = (int) arglist -> data; break; case T_VALUATOR_ORIENT: data -> orientation = (enum Direction) arglist -> data; break; case T_VALUATOR_MAXDIM: data -> maxdim = (int) arglist -> data; break; case T_VALUATOR_MINDIM: data -> mindim = (int) arglist -> data; break; case T_VALUATOR_INDPOS: ptr = (float *) arglist -> data; data -> indpos = *ptr; break; case T_VALUATOR_INDSIZE: data -> indsize = (int) arglist -> data; break; case T_VALUATOR_BRCOLOR: data -> brcolor = (Pixmap) arglist -> data; break; case T_VALUATOR_BACKGROUND: data -> background = (Pixmap) arglist -> data; break; case T_VALUATOR_BRWIDTH: data -> brwidth = (int) arglist -> data; break; case T_VALUATOR_INDCOLOR: data -> indcolor = (int) arglist -> data; break; case T_VALUATOR_PROC: data -> Proc = (int (*) ()) arglist -> data; break; case T_VALUATOR_TAG: data -> tag = arglist -> data; break; default: break; } arglist++; } /* -----> Initialzie indicator position to "no update" */ if (data -> orientation == Horizontal) { data -> indx = -1; data -> indy = 0; } else { data -> indy = -1; data -> indx = 0; } /* -----> Given the dimensions, create the valuator window */ if (data -> type == Invisible) { if (data -> orientation == Horizontal) data -> tw = XCreateTransparency (pw, data -> x, data -> y, data -> maxdim, data -> mindim); else data -> tw = XCreateTransparency (pw, data -> x, data -> y, data -> mindim, data -> maxdim); } else { if (data -> orientation == Horizontal) { data -> tw = XCreateWindow (pw, data -> x, data -> y, data -> maxdim, data -> mindim, data -> brwidth, data -> brcolor, data -> background); } else { data -> tw = XCreateWindow (pw, data -> x, data -> y, data -> mindim, data -> maxdim, data -> brwidth, data -> brcolor, data -> background); } } /* -----> Save the valuator entry, select input, and save the event handler */ SaveEntry (data -> tw, valuatorEntry, data); TSetXEventDispatch (data -> tw, TProcessValuatorEvent, valuatorEvents, 0); return (data -> tw); }