aboutsummaryrefslogtreecommitdiff
path: root/src/graph/view2D/control2d.c.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/graph/view2D/control2d.c.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/graph/view2D/control2d.c.pamphlet')
-rw-r--r--src/graph/view2D/control2d.c.pamphlet642
1 files changed, 642 insertions, 0 deletions
diff --git a/src/graph/view2D/control2d.c.pamphlet b/src/graph/view2D/control2d.c.pamphlet
new file mode 100644
index 00000000..e25f61de
--- /dev/null
+++ b/src/graph/view2D/control2d.c.pamphlet
@@ -0,0 +1,642 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/graph/view2D control2d.c}
+\author{The Axiom Team}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{License}
+<<license>>=
+/*
+Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+@
+<<*>>=
+<<license>>
+
+#define _CONTROL2D_C
+#include "axiom-c-macros.h"
+#include "useproto.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include "header2.h"
+#include "buttons2d.H1"
+#include "all_2d.H1"
+#include "Gfun.H1"
+#include "XSpadFill.H1"
+#include "util.H1"
+
+
+#include "mouse11.bitmap"
+#include "mouse11.mask"
+
+/* Defines the pixmap for the arrow displayed in the scale window */
+
+#define scaleArrowN 11
+static XPoint scaleArrow[scaleArrowN] = {
+ {55,14},{64,23},{59,23},
+ {66,45},{79,45},
+ {55,69},
+ {31,45},{44,45},
+ {51,23},{46,23},{55,14} };
+
+/* Defines the pixmap for the arrows displayed in the translate window */
+
+#define translateArrowN 25
+static XPoint translateArrow[translateArrowN] = {
+ {55,2},{60,10},{58,10},{58,37},
+ {85,37},{85,35},{93,40},{85,45},{85,43},{58,43},
+ {58,70},{60,70},{55,78},{50,70},{52,70},{52,43},
+ {25,43}, {25,45}, {17,40}, {25,35}, {25,37}, {52,37},
+ {52,10},{50,10},{55,2} };
+
+/****************************
+ * void writeControlTitle() *
+ ****************************/
+
+void
+#ifdef _NO_PROTO
+writeControlTitle()
+#else
+writeControlTitle(void)
+#endif
+{
+
+ int strlength;
+
+ s = viewport->title;
+ strlength = strlen(s);
+ XClearArea(dsply,control->controlWindow,0,0,controlWidth,potA,False);
+ GSetForeground(anotherGC,(float)controlTitleColor,Xoption);
+ GDrawImageString(anotherGC,control->controlWindow,
+ centerX(anotherGC,s,strlength,controlWidth),
+ 15,s,strlength,Xoption);
+
+} /* writeControlTitle() */
+
+void
+#ifdef _NO_PROTO
+makeMessageFromData(whichGraph)
+int whichGraph;
+#else
+makeMessageFromData(int whichGraph)
+#endif
+{
+ if (viewport->haveControl) {
+ if ((graphStateArray[whichGraph].scaleX) > 99.0) {
+ strcpy(scaleXReport,"big");
+ } else {
+ sprintf(scaleXReport,"%4.1f",graphStateArray[whichGraph].scaleX);
+ }
+ if ((graphStateArray[whichGraph].scaleY) > 99.0) {
+ strcpy(scaleYReport,"big");
+ } else {
+ sprintf(scaleYReport,"%4.1f",graphStateArray[whichGraph].scaleY);
+ }
+ if ((graphStateArray[whichGraph].centerX) > 999.0) {
+ strcpy(deltaXReport,"+big");
+ } else if ((graphStateArray[whichGraph].centerX) < -999.0) {
+ strcpy(deltaXReport,"-big");
+ } else {
+ sprintf(deltaXReport,"%4.0f",
+ -graphStateArray[whichGraph].centerX /
+ graphArray[whichGraph].unitX);
+ }
+ if ((graphStateArray[whichGraph].centerY) > 999.0) {
+ strcpy(deltaYReport,"+big");
+ } else if ((graphStateArray[whichGraph].centerY) < -999.0) {
+ strcpy(deltaYReport,"-big");
+ } else {
+ sprintf(deltaYReport,"%4.0f",
+ -graphStateArray[whichGraph].centerY /
+ graphArray[whichGraph].unitY);
+ }
+ sprintf(viewport->controlPanel->message,"[%s,%s] >%d< [%s,%s]",
+ scaleXReport,scaleYReport,whichGraph+1,deltaXReport,deltaYReport);
+ } /* if haveControl */
+
+} /* makeMessageFromData() */
+
+
+void
+#ifdef _NO_PROTO
+writeControlMessage()
+#else
+writeControlMessage(void)
+#endif
+{
+ int strlength;
+ controlPanelStruct *cp;
+ XWindowAttributes cwInfo;
+
+ cp = viewport->controlPanel;
+ XGetWindowAttributes(dsply,cp->controlWindow,&cwInfo);
+ strlength = strlen(cp->message);
+
+
+
+ GDrawImageString(controlMessageGC,cp->controlWindow,
+ centerX(globalGC1,cp->message,strlength,controlWidth),
+ controlMessageY + globalFont->max_bounds.ascent - 2,
+ cp->message,strlength,Xoption);
+}
+
+/*********************************/
+/*** void drawControlPanel() ***/
+/*********************************/
+
+void
+#ifdef _NO_PROTO
+drawControlPanel()
+#else
+drawControlPanel(void)
+#endif
+{
+
+ controlPanelStruct *cp;
+ int i,strlength;
+ char *s;
+
+ cp = viewport->controlPanel;
+ /* Draw border lines to separate the potentiometer, message, graph select
+ and button regions of the control panel. */
+ GSetForeground(trashGC,(float)foregroundColor,Xoption);
+ GSetLineAttributes(trashGC,3,LineSolid,CapButt,JoinMiter,Xoption);
+ GDrawLine(trashGC, cp->controlWindow, 0, potA, controlWidth, potA, Xoption);
+ GSetLineAttributes(trashGC,2,LineSolid,CapButt,JoinMiter,Xoption);
+ GDrawLine(trashGC, cp->controlWindow, 0, potB, controlWidth, potB, Xoption);
+ GDrawLine(trashGC, cp->controlWindow, 0, messageBot,
+ controlWidth, messageBot, Xoption);
+ GDrawLine(trashGC, cp->controlWindow, 0, 286, controlWidth, 286, Xoption);
+
+ /** put the line width as 1 last because used below as well **/
+ GSetLineAttributes(trashGC,1,LineSolid,CapButt,JoinMiter,Xoption);
+ GDrawRectangle(trashGC,cp->controlWindow,closeLeft,closeTop,
+ (controlWidth-closeLeft+8),(controlHeight-closeTop+8),Xoption);
+
+ /* Write potentiometer titles on the control panel. */
+ writeControlTitle();
+ GSetForeground(globGC,(float)controlPotHeaderColor,Xoption);
+ s = "Scale";
+ strlength = strlen(s);
+ GDrawString(globGC,cp->controlWindow,
+ centerX(globGC,s,strlength,
+ cp->buttonQueue[scale2D].buttonWidth) +
+ cp->buttonQueue[scale2D].buttonX, 31+headerHeight,s,strlength,Xoption);
+
+ s = "Translate";
+ strlength = strlen(s);
+ GDrawString(globGC,cp->controlWindow,
+ centerX(globGC,s,strlength,
+ cp->buttonQueue[translate2D].buttonWidth) +
+ cp->buttonQueue[translate2D].buttonX,
+ 31+headerHeight,s,strlen(s),Xoption);
+
+ GSetForeground(globGC,(float)controlColorColor,Xoption);
+
+ /* Write title of the graph selection window. */
+ s = "Graphs";
+ strlength = strlen(s);
+ GDrawString(globGC,cp->controlWindow,
+ centerX(globGC,s,strlength,controlWidth),graphHeaderHeight,
+ s,strlength,Xoption);
+
+ /* Write titles on regular buttons and draw pixmaps on potentiometers. */
+
+ for (i=0; i<(maxButtons2D); i++) {
+ if ((cp->buttonQueue[i]).pot) {
+
+ GSetForeground(globalGC1,(float)buttonColor,Xoption);
+ GDrawRectangle(globalGC1,cp->controlWindow,
+ (cp->buttonQueue[i]).buttonX,
+ (cp->buttonQueue[i]).buttonY,
+ (cp->buttonQueue[i]).buttonWidth,
+ (cp->buttonQueue[i]).buttonHeight,Xoption);
+
+ GSetForeground(trashGC,
+ (float)monoColor((cp->buttonQueue[i]).textColor),Xoption);
+
+ GDrawLine(globalGC1,cp->controlWindow, /* trashGC, */
+ (cp->buttonQueue[i]).buttonX + (cp->buttonQueue[i]).xHalf,
+ (cp->buttonQueue[i]).buttonY,
+ (cp->buttonQueue[i]).buttonX + (cp->buttonQueue[i]).xHalf,
+ (cp->buttonQueue[i]).buttonY + 2*(cp->buttonQueue[i]).yHalf,Xoption);
+ GDrawLine(globalGC1,cp->controlWindow, /* trashGC, */
+ (cp->buttonQueue[i]).buttonX,
+ (cp->buttonQueue[i]).buttonY + (cp->buttonQueue[i]).yHalf,
+ (cp->buttonQueue[i]).buttonX + 2*(cp->buttonQueue[i]).xHalf,
+ (cp->buttonQueue[i]).buttonY + (cp->buttonQueue[i]).yHalf,Xoption);
+ switch (i) {
+ case scale2D:
+ GDrawLines(trashGC,cp->controlWindow,scaleArrow,
+ scaleArrowN,CoordModeOrigin,Xoption);
+ break;
+ case translate2D:
+ GDrawLines(trashGC,cp->controlWindow,translateArrow,
+ translateArrowN,CoordModeOrigin,Xoption);
+ break;
+ } /* switch i */
+ } else if (cp->buttonQueue[i].graphNum) {
+
+ if (mono) {
+ if (graphStateArray[i-graphStart].showing) {
+ GSetForeground(graphGC,(float)backgroundColor,Xoption);
+ GSetBackground(graphGC,(float)foregroundColor,Xoption);
+ } else {
+ GSetForeground(graphGC,(float)foregroundColor,Xoption);
+ GSetBackground(graphGC,(float)backgroundColor,Xoption);
+ }
+ strlength = strlen((cp->buttonQueue[i]).text);
+ GDrawImageString(graphGC,cp->controlWindow,
+ (cp->buttonQueue[i]).buttonX +
+ centerX(graphGC,cp->buttonQueue[i].text,
+ strlength,(cp->buttonQueue[i]).buttonWidth),
+ (cp->buttonQueue[i]).buttonY +
+ centerY(graphGC,(cp->buttonQueue[i]).buttonHeight),
+ cp->buttonQueue[i].text,strlength,Xoption);
+ } else {
+ if (graphStateArray[i-graphStart].showing)
+ GSetForeground(graphGC,(float)graphBarShowingColor,Xoption);
+ else
+ GSetForeground(graphGC,(float)graphBarHiddenColor,Xoption);
+ strlength = strlen((cp->buttonQueue[i]).text);
+ GDrawString(graphGC,cp->controlWindow,
+ (cp->buttonQueue[i]).buttonX +
+ centerX(graphGC,cp->buttonQueue[i].text,
+ strlength,(cp->buttonQueue[i]).buttonWidth),
+ (cp->buttonQueue[i]).buttonY +
+ centerY(graphGC,(cp->buttonQueue[i]).buttonHeight),
+ cp->buttonQueue[i].text,strlength,Xoption);
+ }
+ } else if (cp->buttonQueue[i].graphSelect) {
+ /* The select characters are defined as: "^" for on and "-" for off. */
+ if (graphStateArray[i-graphSelectStart].selected) {
+ GSetForeground(graphGC,(float)graphBarSelectColor,Xoption);
+ strcpy((cp->buttonQueue[i]).text,"^");
+ } else {
+ GSetForeground(graphGC,(float)graphBarNotSelectColor,Xoption);
+ *(cp->buttonQueue[i]).text = '-';
+ strcpy((cp->buttonQueue[i]).text,"-");
+ }
+ GDrawString(graphGC,cp->controlWindow,
+ (cp->buttonQueue[i]).buttonX +
+ centerX(graphGC,cp->buttonQueue[i].text,
+ strlength,(cp->buttonQueue[i]).buttonWidth),
+ (cp->buttonQueue[i]).buttonY +
+ centerY(graphGC,(cp->buttonQueue[i]).buttonHeight),
+ cp->buttonQueue[i].text,strlength,Xoption);
+ }
+ else { /* a regular button */
+ int isOn = 1;
+
+ switch(i) {
+ case pointsOnOff:
+ isOn = pointsON = graphStateArray[0].pointsOn;
+ if (graphStateArray[0].pointsOn)
+ strcpy((cp->buttonQueue[i]).text,"Pts On ");
+ else
+ strcpy((cp->buttonQueue[i]).text,"Pts Off");
+ break;
+
+ case spline2D:
+ isOn = splineON = graphStateArray[0].splineOn;
+ if (graphStateArray[0].splineOn)
+ strcpy((cp->buttonQueue[i]).text, "Box On ");
+ else
+ strcpy((cp->buttonQueue[i]).text, "Box Off");
+ break;
+
+ case connectOnOff:
+ isOn = connectON = graphStateArray[0].connectOn;
+ if (graphStateArray[0].connectOn)
+ strcpy((cp->buttonQueue[i]).text, "Lines On ");
+ else
+ strcpy((cp->buttonQueue[i]).text, "Lines Off");
+ break;
+
+ case axesOnOff2D:
+ isOn = axesON = graphStateArray[0].axesOn;
+ if (graphStateArray[0].axesOn)
+ strcpy((cp->buttonQueue[i]).text , "Axes On ");
+ else
+ strcpy((cp->buttonQueue[i]).text , "Axes Off");
+ break;
+
+ case unitsOnOff2D:
+ isOn = unitsON = graphStateArray[0].unitsOn;
+ if (graphStateArray[0].unitsOn)
+ strcpy( (cp->buttonQueue[i]).text , "Units On ");
+ else
+ strcpy( (cp->buttonQueue[i]).text , "Units Off");
+ break;
+ case closeAll2D:
+ isOn = 0;
+
+ default:
+ break;
+ } /* switch i */
+
+ s = (cp->buttonQueue[i]).text;
+ strlength = strlen(s);
+
+ GDrawPushButton(dsply, globalGC1, trashGC, processGC, cp->controlWindow,
+ (cp->buttonQueue[i]).buttonX, (cp->buttonQueue[i]).buttonY,
+ (cp->buttonQueue[i]).buttonWidth, (cp->buttonQueue[i]).buttonHeight,
+ isOn, s,buttonColor,
+ monoColor((cp->buttonQueue[i]).textColor), Xoption);
+
+ } /* else a regular button */
+ } /* for each button */
+
+ /* Refresh the latest message */
+ makeMessageFromData(0);
+ writeControlMessage();
+ XFlush(dsply);
+
+} /*** drawControlPanel ***/
+
+controlXY
+#ifdef _NO_PROTO
+getControlXY(whereDoYouWantPanel)
+int whereDoYouWantPanel;
+#else
+getControlXY(int whereDoYouWantPanel)
+#endif
+{
+ XWindowAttributes wAttr, wAttrib;
+ controlXY cXY;
+ int tmp=1;
+ Window rootW, parentW, *childrenWs, tmpW;
+ unsigned int nChildren;
+
+ tmpW = viewport->titleWindow;
+ while(tmp) {
+ XQueryTree(dsply,tmpW,&rootW,&parentW,&childrenWs,&nChildren);
+ XFree(childrenWs);
+ if (parentW == rtWindow) tmp = 0;
+ else tmpW = parentW;
+ }
+ XGetWindowAttributes(dsply,tmpW,&wAttrib);
+
+ XGetWindowAttributes(dsply,viewport->titleWindow,&wAttr);
+ if (whereDoYouWantPanel) {
+ switch (whereDoYouWantPanel) {
+ case 1: /* right */
+ cXY.putX = wAttrib.x + wAttrib.width;
+ cXY.putY = wAttrib.y;
+ break;
+ case 2: /* bottom */
+ cXY.putX = wAttrib.x + (wAttr.width - controlWidth)/2; /* center it */
+ cXY.putY = wAttrib.y + wAttrib.height;
+ break;
+ case 3: /* left */
+ cXY.putX = wAttrib.x - controlWidth - borderWidth;
+ cXY.putY = wAttrib.y;
+ break;
+ case 4: /* top */
+ cXY.putX = wAttrib.x + (wAttr.width - controlWidth)/2;
+ cXY.putY = wAttrib.y - controlHeight - borderHeight;
+ }
+ } else {
+ if ((physicalWidth - (wAttrib.x + wAttr.width)) >= controlWidth) {
+ cXY.putX = wAttrib.x + wAttrib.width;
+ cXY.putY = wAttrib.y;
+ } else if ((physicalHeight - (wAttrib.y + wAttr.height)) >=
+ controlHeight) {
+ cXY.putX = wAttrib.x + (wAttr.width - controlWidth)/2;
+ cXY.putY = wAttrib.y + wAttrib.height;
+ } else if (wAttrib.x >= controlWidth) {
+ cXY.putX = wAttrib.x - controlWidth - borderWidth;
+ cXY.putY = wAttrib.y;
+ } else if (wAttrib.y >= controlHeight) {
+ cXY.putX = wAttrib.x + (wAttr.width - controlWidth)/2;
+ cXY.putY = wAttrib.y - controlHeight - borderHeight;
+ } else { /* put inside of viewport */
+ cXY.putX = wAttrib.x + wAttr.width - controlWidth;
+ cXY.putY = wAttrib.y + wAttr.height - controlHeight;
+ }
+ }
+ return(cXY);
+
+}
+
+/************************************************/
+/*** controlPanelStruct *makeControlPanel() ***/
+/************************************************/
+
+controlPanelStruct *
+#ifdef _NO_PROTO
+makeControlPanel()
+#else
+makeControlPanel(void)
+#endif
+{
+
+ Window cw;
+ int i,num;
+ controlPanelStruct *control;
+ buttonStruct *buttons;
+ controlXY cXY;
+ XSetWindowAttributes cwAttrib, controlAttrib;
+ XSizeHints sizehints;
+ Pixmap mousebits,mousemask;
+ XColor foreColor, backColor;
+
+ if (!(control = (controlPanelStruct *)malloc(sizeof(controlPanelStruct)))) {
+ fprintf(stderr,"Ran out of memory trying to create a control panel.\n");
+ exitWithAck(RootWindow(dsply,scrn),Window,-1);
+ }
+
+ cXY = getControlXY(0);
+
+ /* Define and assign a mouse cursor. */
+ mousebits = XCreateBitmapFromData(dsply,rtWindow,mouseBitmap_bits,
+ mouseBitmap_width,mouseBitmap_height);
+ mousemask = XCreateBitmapFromData(dsply,rtWindow,mouseMask_bits,
+ mouseMask_width,mouseMask_height);
+ cwAttrib.background_pixel = backgroundColor; /* controlBackground; */
+ cwAttrib.border_pixel = foregroundColor;
+ cwAttrib.backing_store = WhenMapped;
+ cwAttrib.event_mask = controlMASK;
+ cwAttrib.colormap = colorMap;
+ cwAttrib.override_redirect = overrideManager;
+ foreColor.pixel = controlCursorForeground;
+ XQueryColor(dsply,colorMap,&foreColor);
+ backColor.pixel = controlCursorBackground;
+ XQueryColor(dsply,colorMap,&backColor);
+ cwAttrib.cursor = XCreatePixmapCursor(dsply,mousebits,mousemask,
+ &foreColor,&backColor,
+ mouseBitmap_x_hot,mouseBitmap_y_hot);
+
+ cw = XCreateWindow(dsply,rtWindow,
+ cXY.putX,cXY.putY,controlWidth,controlHeight,3,
+ CopyFromParent,InputOutput,CopyFromParent,
+ controlCreateMASK,&cwAttrib);
+
+ sizehints.flags = PPosition | PSize;
+ sizehints.x = cXY.putX;
+ sizehints.y = cXY.putY;
+ sizehints.width = controlWidth;
+ sizehints.height = controlHeight;
+
+ /*** the None stands for icon pixmap...change.... ***/
+
+ XSetNormalHints(dsply,cw,&sizehints);
+ XSetStandardProperties(dsply,cw,"2D Control Panel","2D Control Panel",
+ None,NULL,0,&sizehints);
+
+ control->controlWindow = cw;
+ num = initButtons(control->buttonQueue);
+ control->numOfButtons = num;
+ buttons = control->buttonQueue;
+
+ for (i=0; i<num; i++) {
+ controlAttrib.event_mask = (control->buttonQueue[i]).mask;
+ (control->buttonQueue[i]).self = XCreateWindow(dsply,cw,
+ (control->buttonQueue[i]).buttonX,
+ (control->buttonQueue[i]).buttonY,
+ (control->buttonQueue[i]).buttonWidth,
+ (control->buttonQueue[i]).buttonHeight,
+ 0,0,InputOnly,CopyFromParent,
+ buttonCreateMASK,&controlAttrib);
+
+ XMakeAssoc(dsply,table,(control->buttonQueue[i]).self,
+ &((control->buttonQueue[i]).buttonKey));
+ /* Use buttonKey instead of i because buttonKey has a permanent address */
+ XMapWindow(dsply,(control->buttonQueue[i]).self);
+ }
+
+ /* Create message window */
+ control->messageWindow = XCreateWindow(dsply,cw,0,controlMessageY,
+ controlWidth,controlMessageHeight,
+ 0,0,InputOnly,CopyFromParent,
+ messageCreateMASK,&cwAttrib);
+ XMapWindow(dsply,control->messageWindow);
+
+ for (i=0; i<scaleArrowN; i++) {
+ scaleArrow[i].x += buttons[scale2D].buttonX;
+ scaleArrow[i].y += buttons[scale2D].buttonY;
+ }
+ for (i=0; i<translateArrowN; i++) {
+ translateArrow[i].x += buttons[translate2D].buttonX;
+ translateArrow[i].y += buttons[translate2D].buttonY;
+ }
+
+ viewport->justMadeControl = yes;
+ return(control);
+
+} /* makeControlPanel() */
+
+
+
+
+
+
+/*****************************************/
+/*** void putControlPanelSomewhere() ***/
+/*****************************************/
+
+/* This routine puts up the control panel associated with the viewport
+ passed in. It first tries to put it to the right of the viewport. If
+ there isn't enough room there, it tries the bottom and so on going
+ clockwise. If the viewport is too big and there is no room to put the
+ control panel outside of it, it placed the control panel in the bottom
+ right hand corner of the viewport window. */
+
+void
+#ifdef _NO_PROTO
+putControlPanelSomewhere(whereDoesPanelGo)
+int whereDoesPanelGo;
+#else
+putControlPanelSomewhere(int whereDoesPanelGo)
+#endif
+{
+ controlPanelStruct *control;
+ controlXY whereControl;
+
+ control = viewport->controlPanel;
+ whereControl = getControlXY(whereDoesPanelGo);
+
+ viewport->haveControl = yes;
+
+ XRaiseWindow(dsply,control->controlWindow);
+ XMoveWindow(dsply,control->controlWindow,whereControl.putX,
+ whereControl.putY);
+
+ drawControlPanel();
+ if (viewport->justMadeControl) {
+ XMapWindow(dsply,control->controlWindow);
+ viewport->justMadeControl = no;
+ }
+ XMapWindow(dsply,control->controlWindow);
+}
+
+
+
+
+
+/************************************/
+/*** void clearControlMessage() ***/
+/************************************/
+
+void
+#ifdef _NO_PROTO
+clearControlMessage()
+#else
+clearControlMessage(void)
+#endif
+{
+
+ strcpy(viewport->controlPanel->message,"");
+
+ XClearArea(dsply,viewport->controlPanel->controlWindow,
+ 0,controlMessageY-2,controlWidth,controlMessageHeight,False);
+}
+
+
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}