controlPanelStruct * makeControlPanel(void) { 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 getGraphFromViewman(int i) { /** This routine should be called right after a read of the graph key was made from the viewport manager (or defined in some other way). **/ int j,k,xPointsNeeded; pointListStruct *llPtr; pointStruct *p; readViewman(&(graphArray[i].xmin),floatSize); readViewman(&(graphArray[i].xmax),floatSize); readViewman(&(graphArray[i].ymin),floatSize); readViewman(&(graphArray[i].ymax),floatSize); readViewman(&(graphArray[i].xNorm),floatSize); readViewman(&(graphArray[i].yNorm),floatSize); readViewman(&(graphArray[i].spadUnitX),floatSize); readViewman(&(graphArray[i].spadUnitY),floatSize); readViewman(&(graphArray[i].unitX),floatSize); readViewman(&(graphArray[i].unitY),floatSize); readViewman(&(graphArray[i].originX),floatSize); readViewman(&(graphArray[i].originY),floatSize); readViewman(&(graphArray[i].numberOfLists),intSize); if (!(llPtr = (pointListStruct *)malloc(graphArray[i].numberOfLists * sizeof(pointListStruct)))) { fprintf(stderr,"VIEW2D: Fatal Error>> Ran out of memory trying to receive a graph.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } graphArray[i].listOfListsOfPoints = llPtr; xPointsNeeded = 0; for (j=0; j<graphArray[i].numberOfLists; j++) { readViewman(&(llPtr->numberOfPoints),intSize); if (!(p = (pointStruct *)malloc(llPtr->numberOfPoints * sizeof(pointStruct)))) { fprintf(stderr,"VIEW2D: (pointStruct) ran out of memory trying to create a new graph.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } llPtr->listOfPoints = p; /** point to current point list **/ for (k=0; k<llPtr->numberOfPoints; k++) { readViewman(&(p->x),floatSize); readViewman(&(p->y),floatSize); readViewman(&(p->hue),floatSize); readViewman(&(p->shade),floatSize); p++; } /* for k in list of points */ readViewman(&(llPtr->pointColor),intSize); readViewman(&(llPtr->lineColor),intSize); readViewman(&(llPtr->pointSize),intSize); xPointsNeeded += llPtr->numberOfPoints; llPtr++; } /* for j in list of lists of points */ /* read in graph state for the existing graph (override default values) */ readViewman(&(graphStateArray[i].scaleX),floatSize); readViewman(&(graphStateArray[i].scaleY),floatSize); readViewman(&(graphStateArray[i].deltaX),floatSize); readViewman(&(graphStateArray[i].deltaY),floatSize); readViewman(&(graphStateArray[i].pointsOn),intSize); readViewman(&(graphStateArray[i].connectOn),intSize); readViewman(&(graphStateArray[i].splineOn),intSize); readViewman(&(graphStateArray[i].axesOn),intSize); readViewman(&(graphStateArray[i].axesColor),intSize); readViewman(&(graphStateArray[i].unitsOn),intSize); readViewman(&(graphStateArray[i].unitsColor),intSize); readViewman(&(graphStateArray[i].showing),intSize); graphStateArray[i].selected = yes; graphStateBackupArray[i] = graphStateArray[i]; graphStateArray[i].deltaX = graphStateArray[0].deltaX; graphStateArray[i].deltaY = graphStateArray[0].deltaY; graphStateArray[i].scaleX = graphStateArray[0].scaleX; graphStateArray[i].scaleY = graphStateArray[0].scaleY; /* allocate memory for xPoints (used in drawViewport) */ if (!(xPointsArray[i].xPoint = (XPoint *)malloc(xPointsNeeded * sizeof(XPoint)))) { fprintf(stderr,"VIEW2D: (XPoint) Ran out of memory (malloc) trying to create a new graph.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } if (!(xPointsArray[i].x10Point = (Vertex *)malloc(xPointsNeeded * sizeof(Vertex)))) { fprintf(stderr, "VIEW2D: (X10Point) Ran out of memory (malloc) trying to create a new graph.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } if (!(xPointsArray[i].arc = (XArc *)malloc(xPointsNeeded * sizeof(XArc)))) { fprintf(stderr,"VIEW2D: (XArc) Ran out of memory (malloc) trying to create a new graph.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } } /* getGraphFromViewman */
int main(void) { XGCValues controlGCVals; int i,code; view2DStruct viewData; char property[256]; char *prop = &property[0]; char *str_type[20]; XrmValue value; /**** Set up display ****/ if ((dsply = XOpenDisplay(getenv("DISPLAY"))) == NULL) fprintf(stderr,"Could not open the display.\n"); scrn = DefaultScreen(dsply); rtWindow = RootWindow(dsply,scrn); /**** link Xwindows to viewports - X10 feature ****/ table = XCreateAssocTable(nbuckets); /**** Create FriCAS color map ****/ totalColors = XInitSpadFill(dsply,scrn,&colorMap, &totalHues,&totalSolidShades, &totalDitheredAndSolids,&totalShades); if (totalColors < 0) { fprintf(stderr,">>Error: Could not allocate all the necessary colors.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } mergeDatabases(); /*** Determine whether monochrome or color is used ***/ if (XrmGetResource(rDB,"Axiom.2D.monochrome","",str_type,&value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop, "off"); mono = ((totalSolid == 2) || (strcmp(prop,"on") == 0)); if (XrmGetResource(rDB,"Axiom.2D.inverse","",str_type,&value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop, "off"); if (mono) if (strcmp(prop,"on") == 0) { /* 0 if equal (inverse video) */ foregroundColor = WhitePixel(dsply,scrn); backgroundColor = BlackPixel(dsply,scrn); } else { /* off (no inverse video) */ foregroundColor = BlackPixel(dsply,scrn); backgroundColor = WhitePixel(dsply,scrn); } else /* inverse of inverse in color (for some strange reason) */ if (strcmp(prop,"on") == 0) { /* 0 if equal (inverse video) */ foregroundColor = WhitePixel(dsply,scrn); backgroundColor = BlackPixel(dsply,scrn); } else { /* off (no inverse video) */ foregroundColor = BlackPixel(dsply,scrn); backgroundColor = WhitePixel(dsply,scrn); } /* read default file name for postScript output */ if (XrmGetResource(rDB, "Axiom.2D.postscriptFile", "", str_type, &value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop, "axiom2D.ps"); PSfilename = (char *)malloc(strlen(prop)+1); strcpy(PSfilename,prop); /**** Open global fonts ****/ serverFont = XQueryFont(dsply,XGContextFromGC(DefaultGC(dsply,scrn))); if (XrmGetResource(rDB, "Axiom.2D.messageFont", "Axiom.2D.Font", str_type, &value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop,messageFontDefault); if ((globalFont = XLoadQueryFont(dsply, prop)) == NULL) { fprintf(stderr, "Warning: could not get the %s font for messageFont\n",prop); globalFont = serverFont; } if (XrmGetResource(rDB, "Axiom.2D.buttonFont", "Axiom.2D.Font", str_type, &value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop,buttonFontDefault); if ((buttonFont = XLoadQueryFont(dsply, prop)) == NULL) { fprintf(stderr, "Warning: could not get the %s font for buttonFont\n",prop); buttonFont = serverFont; } if (XrmGetResource(rDB, "Axiom.2D.headerFont", "Axiom.2D.Font", str_type, &value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop,headerFontDefault); if ((headerFont = XLoadQueryFont(dsply, prop)) == NULL) { fprintf(stderr, "Warning: could not get the %s font for headerFont\n",prop); headerFont = serverFont; } if (XrmGetResource(rDB, "Axiom.2D.titleFont", "Axiom.2D.Font", str_type,&value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop,titleFontDefault); if ((titleFont = XLoadQueryFont(dsply, prop)) == NULL) { fprintf(stderr, "Warning: could not get the %s font for titleFont\n",prop); titleFont = serverFont; } if (XrmGetResource(rDB, "Axiom.2D.graphFont", "Axiom.2D.Font", str_type,&value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop,graphFontDefault); if ((graphFont = XLoadQueryFont(dsply, prop)) == NULL) { fprintf(stderr, "Warning: could not get the %s font for graphFont\n",prop); graphFont = serverFont; } if (XrmGetResource(rDB, "Axiom.2D.unitFont", "Axiom.2D.Font", str_type,&value) == True) (void) strncpy(prop,value.addr,(int)value.size); else (void) strcpy(prop,unitFontDefault); if ((unitFont = XLoadQueryFont(dsply, prop)) == NULL) { fprintf(stderr, "Warning: could not get the %s font for unitFont\n",prop); unitFont = serverFont; } /**** Create widely used Graphic Contexts ****/ PSGlobalInit(); /* must initiate before using any G/PS functions need character name: used as postscript GC variable need to create ps GCs for all GCs used by drawings in viewWindow */ /* globalGC1 */ controlGCVals.foreground = monoColor(axesColorDefault); controlGCVals.background = backgroundColor; globalGC1 = XCreateGC(dsply,rtWindow,GCForeground | GCBackground , &controlGCVals); carefullySetFont(globalGC1,globalFont); /* create the equivalent GCs for ps */ PSCreateContext(globalGC1, "globalGC1", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /* controlMessageGC */ controlGCVals.foreground = controlMessageColor; controlMessageGC = XCreateGC(dsply,rtWindow,GCForeground | GCBackground ,&controlGCVals); carefullySetFont(controlMessageGC,globalFont); /* globalGC2 */ controlGCVals.foreground = monoColor(labelColor); controlGCVals.background = backgroundColor; globalGC2 = XCreateGC(dsply,rtWindow,GCForeground | GCBackground, &controlGCVals); carefullySetFont(globalGC2,buttonFont); PSCreateContext(globalGC2, "globalGC2", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /* trashGC */ trashGC = XCreateGC(dsply,rtWindow,0,&controlGCVals); carefullySetFont(trashGC,buttonFont); PSCreateContext(trashGC, "trashGC", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /* globGC */ globGC = XCreateGC(dsply,rtWindow,0,&controlGCVals); carefullySetFont(globGC,headerFont); PSCreateContext(globGC, "globGC", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /* anotherGC */ controlGCVals.line_width = colorWidth; anotherGC = XCreateGC(dsply,rtWindow,GCBackground,&controlGCVals); carefullySetFont(anotherGC,titleFont); PSCreateContext(anotherGC, "anotherGC", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /* processGC */ gcVals.background = backgroundColor; processGC = XCreateGC(dsply,rtWindow,GCBackground ,&gcVals); carefullySetFont(processGC,buttonFont); /* graphGC */ graphGC = XCreateGC(dsply,rtWindow,GCBackground,&gcVals); carefullySetFont(graphGC,graphFont); PSCreateContext(graphGC, "graphGC", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /* unitGC */ unitGC = XCreateGC(dsply,rtWindow,GCBackground ,&gcVals); carefullySetFont(unitGC,unitFont); PSCreateContext(unitGC, "unitGC", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); /**** Initialize Graph States ****/ for (i=0; i<maxGraphs; i++) { graphStateArray[i].scaleX = 0.9; graphStateArray[i].scaleY = 0.9; graphStateArray[i].deltaX = 0.0; graphStateArray[i].deltaY = 0.0; graphStateArray[i].centerX = 0.0; graphStateArray[i].centerY = 0.0; graphStateArray[i].pointsOn = yes; graphStateArray[i].connectOn = yes; graphStateArray[i].splineOn = no; graphStateArray[i].axesOn = yes; graphStateArray[i].unitsOn = no; graphStateArray[i].showing = no; graphStateArray[i].selected = no; graphStateBackupArray[i] = graphStateArray[i]; } /**** Get Data from the Viewport Manager ****/ i = 123; code=check(write(Socket,&i,intSize)); /* Check if I am getting stuff from FriCAS or, if I am viewAlone. */ readViewman(&viewAloned,intSize); readViewman(&viewData,sizeof(view2DStruct)); readViewman(&i,intSize); if (!(viewData.title = (char *)malloc(i))) { fprintf(stderr, "ERROR: Ran out of memory trying to receive the title.\n"); exitWithAck(RootWindow(dsply,scrn),Window,-1); } readViewman(viewData.title,i); for (i=0; i<maxGraphs; i++) { readViewman(&(graphArray[i].key),intSize); if (graphArray[i].key) { /** this graph slot has data **/ getGraphFromViewman(i); } /* if graph exists (graphArray[i].key is not zero) */ } /* for i in graphs */ viewport = makeView2D(&viewData); control = viewport->controlPanel; bsdSignal(SIGTERM,goodbye,DontRestartSystemCalls); /* send acknowledgement to viewport manager */ i = 345; check(write(Socket,&(viewport->viewWindow),sizeof(Window))); processEvents(); goodbye(-1); return(0); /* control never reaches here but compiler complains */ } /* main() */