1 /*
2  * $Id: x11menu.c,v 1.9 2002/08/15 13:12:44 isizaka Exp $
3  *
4  * This file is part of "Ngraph for X11".
5  *
6  * Copyright (C) 2002, Satoshi ISHIZAKA. isizaka@msa.biglobe.ne.jp
7  *
8  * "Ngraph for X11" is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * "Ngraph for X11" is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  */
23 
24 /**
25  *
26  * $Log: x11menu.c,v $
27  * Revision 1.9  2002/08/15 13:12:44  isizaka
28  * buf fix: XmNwidth and XmNheight (thanks to Mr tanaka, tt@flab.fujitsu.co.jp)
29  *
30  * Revision 1.8  2002/07/06 08:57:25  isizaka
31  * change to GPL.
32  *
33  * Revision 1.7  2001/07/14 17:44:50  isizaka
34  * for 6.03.14
35  *
36  * Revision 1.6  2001/03/23 12:17:43  isizaka
37  * for 6.3.13
38  *
39  * Revision 1.5  1999/05/08 13:31:30  isizaka
40  * for release 6.03.02
41  *
42  * Revision 1.4  1999/04/15 12:14:26  isizaka
43  * for release 6.03.01
44  *
45  * Revision 1.3  1999/04/11 06:09:20  isizaka
46  * *** empty log message ***
47  *
48  * Revision 1.2  1999/03/20 12:32:54  isizaka
49  * minor change
50  *
51  * Revision 1.1  1999/03/17 13:29:01  isizaka
52  * Initial revision
53  *
54  *
55  **/
56 
57 #include <Xm/XmAll.h>
58 #include <Xm/XmP.h>
59 #include <X11/keysym.h>
60 #include <X11/cursorfont.h>
61 #include <sys/types.h>
62 #include <sys/wait.h>
63 #include <signal.h>
64 #include <stdio.h>
65 #include <string.h>
66 #include <stdlib.h>
67 #include <stdarg.h>
68 #include <math.h>
69 #include <time.h>
70 #include <limits.h>
71 
72 #include "motif12.h"
73 
74 #include "ngraph.h"
75 #include "object.h"
76 #include "ioutil.h"
77 #include "shell.h"
78 #include "jnstring.h"
79 #include "nstring.h"
80 #include "config.h"
81 #include "mathfn.h"
82 #include "gra.h"
83 #include "spline.h"
84 
85 #include "x11dialg.h"
86 #include "ox11menu.h"
87 #include "x11menu.h"
88 #include "x11gui.h"
89 #include "x11view.h"
90 #include "x11file.h"
91 #include "x11axis.h"
92 #include "x11lgnd.h"
93 #include "x11merge.h"
94 #include "x11graph.h"
95 #include "x11scrip.h"
96 #include "x11opt.h"
97 #include "x11print.h"
98 #include "x11info.h"
99 #include "x11cood.h"
100 #include "x11commn.h"
101 #include "x11bitmp.h"
102 
103 int menulock=FALSE;
104 struct NgraphApp NgraphApp;
105 Widget TopLevel=NULL,MainWin;
106 int FHeight,FAscent,FDescent,FWidth;
107 XFontSet FFont=NULL;
108 
109 Atom NgraphClose;
110 Atom COMPOUND_TEXT;
111 char *CloseMessage="NgraphClose";
112 int RegisterWorkProc;
113 XtWorkProcId WorkProcId;
114 
115 extern char *AppName,*AppClass;
116 
117 typedef struct {
118   String windowfont;
119 } CustomRec;
120 
121 CustomRec resources;
122 
123 static XtResource Res[]= {
124   {"windowfont","Windowfont",XtRString,sizeof(String),
125    XtOffsetOf(CustomRec,windowfont),XtRString,"-adobe-courier-medium-r-normal--14-*-*-*-*-*-iso8859-1"}
126 };
127 
128 typedef struct {
129   XmString tipstring;
130   XmString sbstring;
131 } CustomRecTip;
132 
133 static XtResource TipRes[]= {
134   {"tipString","TipString",XmRXmString,sizeof(XmString),
135    XtOffsetOf(CustomRecTip,tipstring),XtRString,"undefined"},
136   {"sbString","SbString",XmRXmString,sizeof(XmString),
137    XtOffsetOf(CustomRecTip,sbstring),XtRString,""}
138 };
139 
140 struct narray childlist;
141 int signaltrap=FALSE;
142 
143 unsigned int black,white,gray,red,blue;
144 
childhandler(int sig)145 void childhandler(int sig)
146 {
147   int i,num;
148   pid_t *data;
149 
150   if (!signaltrap) return;
151   signal(sig,SIG_IGN);
152   data=arraydata(&childlist);
153   num=arraynum(&childlist);
154   for (i=num-1;i>=0;i--) {
155     if (waitpid(-data[i],NULL,WNOHANG | WUNTRACED)>0) arrayndel(&childlist,i);
156   }
157   signal(sig,childhandler);
158 }
159 
WorkProc(XtPointer client_data)160 static Boolean WorkProc(XtPointer client_data)
161 {
162   if (!menulock && !globallock) eventloop();
163   return FALSE;
164 }
165 
AppMainLoop(XtAppContext app_context)166 void AppMainLoop(XtAppContext app_context)
167 {
168   XEvent event;
169   XClientMessageEvent *e;
170   Atom close;
171 
172   while (TRUE) {
173     NgraphApp.Interrupt=FALSE;
174     XtAppNextEvent(app_context,&event);
175     if (event.type==ClientMessage) {
176       e=(XClientMessageEvent *)&event;
177       close=XInternAtom(Disp,CloseMessage,TRUE);
178       if (e->message_type==close) break;
179     }
180     XtDispatchEvent(&event);
181     if ((looproot!=NULL) && (!RegisterWorkProc)) {
182       WorkProcId=XtAppAddWorkProc(Application,WorkProc,NULL);
183       RegisterWorkProc=TRUE;
184     }
185     if ((looproot==NULL) && RegisterWorkProc) {
186       XtRemoveWorkProc(WorkProcId);
187       RegisterWorkProc=FALSE;
188     }
189   }
190 }
191 
ResetEvent()192 void ResetEvent()
193 {
194   XEvent event;
195 
196   XSync(Disp,False);
197   while (XtAppPending(Application)) {
198     XtAppNextEvent(Application,&event);
199     XtDispatchEvent(&event);
200     XFlush(Disp);
201   }
202 }
203 
204 
EvStructure(Widget w,int * mapped,XEvent * e)205 void EvStructure(Widget w,int *mapped,XEvent *e)
206 {
207   if (e->type==MapNotify) *mapped = TRUE;
208 }
209 
WaitForMap(Widget w)210 void WaitForMap(Widget w)
211 {
212   XEvent event;
213   int mapped;
214 
215   mapped=FALSE;
216   XtAddEventHandler(w,StructureNotifyMask,False,(void *)EvStructure,
217                     &mapped);
218   XSync(Disp,False);
219   while (!mapped || XtAppPending(Application)) {
220     XtAppNextEvent(Application,&event);
221     XtDispatchEvent(&event);
222     XFlush(Disp);
223   }
224   XtRemoveEventHandler(w,StructureNotifyMask,False,(void *)EvStructure,
225                        &mapped);
226 }
227 
GetWMFrame(Widget w)228 void GetWMFrame(Widget w)
229 {
230   Position x,y,x2,y2;
231 
232   XtVaGetValues(w,XmNx,&x,XmNy,&y,NULL);
233   WaitForMap(w);
234   XtVaGetValues(w,XmNx,&x2,XmNy,&y2,NULL);
235   menulocal.framex=x2-x;
236   menulocal.framey=y2-y;
237 }
238 
239 struct WmStateHint {
240   unsigned long state;
241   Window icon;
242 };
243 
IsIconicState(Widget w)244 int IsIconicState(Widget w)
245 {
246   Atom property,actual_type;
247   int actual_format;
248   unsigned long nitems,bytes_after;
249   struct WmStateHint *prop;
250 
251   property=XmInternAtom(XtDisplay(w),"WM_STATE",False);
252   if (XGetWindowProperty(XtDisplay(w),XtWindow(w),
253                     property,0,2,False,property,
254                     &actual_type,&actual_format,&nitems,&bytes_after,
255                     (unsigned char **)&prop)==Success) {
256     if ((actual_type==property) & (nitems==2)) {
257       if (prop->state!=NormalState) return TRUE;
258     }
259   }
260   return FALSE;
261 }
262 
263 int iconic=FALSE;
264 
EvMove(Widget w,XtPointer client_data,XEvent * event,Boolean * dispatch)265 void EvMove(Widget w,XtPointer client_data,XEvent *event,
266                       Boolean *dispatch)
267 {
268   XConfigureEvent *e;
269   int dx,dy;
270   Position x,y,framex,framey;
271   Widget Win;
272 
273   e=(XConfigureEvent *)event;
274   if (IsIconicState(w)) {
275     iconic=TRUE;
276     return;
277   }
278   if (iconic) {
279     iconic=FALSE;
280     return;
281   }
282   XtVaGetValues(MainWin,XmNx,&framex,XmNy,&framey,NULL);
283   dx=framex-menulocal.menux+1;
284   dy=framey-menulocal.menuy+1;
285   if (menulocal.movechild) {
286     Win=NgraphApp.FileWin.Win;
287     if (Win!=NULL) {
288       XtVaGetValues(Win,XmNx,&x,XmNy,&y,NULL);
289       x+=dx-menulocal.framex;
290       y+=dy-menulocal.framey;
291       XtVaSetValues(Win,XmNx,x,XmNy,y,NULL);
292     }
293     Win=NgraphApp.AxisWin.Win;
294     if (Win!=NULL) {
295       XtVaGetValues(Win,XmNx,&x,XmNy,&y,NULL);
296       x+=dx-menulocal.framex;
297       y+=dy-menulocal.framey;
298       XtVaSetValues(Win,XmNx,x,XmNy,y,NULL);
299     }
300     Win=NgraphApp.LegendWin.Win;
301     if (Win!=NULL) {
302       XtVaGetValues(Win,XmNx,&x,XmNy,&y,NULL);
303       x+=dx-menulocal.framex;
304       y+=dy-menulocal.framey;
305       XtVaSetValues(Win,XmNx,x,XmNy,y,NULL);
306     }
307     Win=NgraphApp.MergeWin.Win;
308     if (Win!=NULL) {
309       XtVaGetValues(Win,XmNx,&x,XmNy,&y,NULL);
310       x+=dx-menulocal.framex;
311       y+=dy-menulocal.framey;
312       XtVaSetValues(Win,XmNx,x,XmNy,y,NULL);
313     }
314     Win=NgraphApp.CoordWin.Win;
315     if (Win!=NULL) {
316       XtVaGetValues(Win,XmNx,&x,XmNy,&y,NULL);
317       x+=dx-menulocal.framex;
318       y+=dy-menulocal.framey;
319       XtVaSetValues(Win,XmNx,x,XmNy,y,NULL);
320     }
321     Win=NgraphApp.InfoWin.Win;
322     if (Win!=NULL) {
323       XtVaGetValues(Win,XmNx,&x,XmNy,&y,NULL);
324       x+=dx-menulocal.framex;
325       y+=dy-menulocal.framey;
326       XtVaSetValues(Win,XmNx,x,XmNy,y,NULL);
327     }
328   }
329   menulocal.menux=framex;
330   menulocal.menuy=framey;
331 }
332 
CloseCallback(Widget w,XtPointer client_data,XtPointer call_data)333 void CloseCallback(Widget w,XtPointer client_data,XtPointer call_data)
334 {
335   CmGraphQuit();
336 }
337 
338 void CmWindowMenu(Widget w,XtPointer client_data,XtPointer call_data);
339 
340 Widget TipWidget=NULL;
341 int TipDisplay=FALSE;
342 XtIntervalId TipId=0;
343 
TipDisplayCallback(XtPointer client_data,XtIntervalId * id)344 void TipDisplayCallback(XtPointer client_data,XtIntervalId *id)
345 {
346   if (TipWidget!=NULL) {
347     XtPopup(TipWidget,XtGrabNone);
348     TipDisplay=TRUE;
349   }
350 }
351 
TipCallback(Widget w,XtPointer client_data,XEvent * event,Boolean * dispatch)352 void TipCallback(Widget w,XtPointer client_data,XEvent *event,
353                  Boolean *dispatch)
354 {
355   Position x, y;
356   CustomRecTip tipres;
357   Widget label;
358 
359   if (!menulocal.showtip) return;
360   if (event->type==EnterNotify) {
361     TipWidget=XtVaCreatePopupShell("tip_shell",overrideShellWidgetClass,
362                                    TopLevel,NULL);
363     XtTranslateCoords(w,button_width/2+5,button_height+10,&x,&y);
364     XtVaSetValues(TipWidget,XmNx,x,XmNy,y,NULL);
365     label=XtVaCreateWidget("tip_label",xmLabelWidgetClass,TipWidget,NULL);
366     XtGetApplicationResources(w,&tipres,TipRes,XtNumber(TipRes),NULL,0);
367     XtVaSetValues(label,XmNlabelString,tipres.tipstring,NULL);
368     SetStatusBarXm(tipres.sbstring);
369     TipDisplay=FALSE;
370     XtManageChild(label);
371     TipId=XtAppAddTimeOut(XtWidgetToApplicationContext(w),700,
372                           TipDisplayCallback,NULL);
373   } else if (event->type==LeaveNotify) {
374     if (TipWidget!=NULL) {
375       XtDestroyWidget(TipWidget);
376       if (TipDisplay) XtPopdown (TipWidget);
377       else XtRemoveTimeOut(TipId);
378       ResetStatusBar();
379       TipWidget=NULL;
380     }
381   }
382 }
383 
DropTransfer(Widget w,XtPointer closure,Atom * seltype,Atom * atype,XtPointer value,unsigned long * length,int format)384 void DropTransfer(Widget w,XtPointer closure,Atom *seltype,
385                   Atom *atype,XtPointer value,unsigned long *length,int format)
386 {
387   char **list;
388   int num;
389   char *name,*ext;
390   int i,len,id;
391   struct objlist *obj;
392   int id0,j,perm,type,ret;
393   char *field;
394   int load;
395   XTextProperty ct;
396 
397   if (*atype!=COMPOUND_TEXT) return;
398   ct.value=value;
399   ct.encoding=COMPOUND_TEXT;
400   ct.format=8;
401   ct.nitems=*length;
402   if (XmbTextPropertyToTextList(Disp,&ct,&list,&num)!=Success) return;
403   if (num==1) {
404     len=strlen(list[0]);
405     if ((name=(char *)memalloc(len+1))!=NULL) {
406       strcpy(name,list[0]);
407       load=FALSE;
408       if ((ext=getextention(name))!=NULL) {
409         if ((strcmp0(ext,"PRM")==0) || (strcmp0(ext,"prm")==0)) {
410           LoadPrmFile(name);
411           load=TRUE;
412         } else if ((strcmp0(ext,"NGP")==0) || (strcmp0(ext,"ngp")==0)) {
413           LoadNgpFile(name,menulocal.ignorepath,menulocal.expand,
414                       menulocal.expanddir,FALSE,NULL);
415           load=TRUE;
416         }
417       }
418       memfree(name);
419       if (load) {
420         XFreeStringList(list);
421         CmViewerDrawB(NgraphApp.Viewer.Win,NULL,NULL);
422         return;
423       }
424     }
425   }
426   if ((obj=chkobject("file"))==NULL) {
427     XFreeStringList(list);
428     return;
429   }
430   id0=-1;
431   for (i=0;i<num;i++) {
432     if ((id=newobj(obj))>=0) {
433       len=strlen(list[i]);
434       if ((name=(char *)memalloc(len+1))!=NULL) {
435         strcpy(name,list[i]);
436         AddDataFileList(name);
437         putobj(obj,"file",id,name);
438         if (id0!=-1) {
439           for (j=0;j<chkobjfieldnum(obj);j++) {
440             field=chkobjfieldname(obj,j);
441             perm=chkobjperm(obj,field);
442             type=chkobjfieldtype(obj,field);
443             if ((strcmp2(field,"name")!=0) && (strcmp2(field,"file")!=0)
444              && (strcmp2(field,"fit")!=0)
445              && ((perm&NREAD)!=0) && ((perm&NWRITE)!=0) && (type<NVFUNC))
446               copyobj(obj,field,id,id0);
447           }
448           FitCopy(obj,id,id0);
449         } else {
450           FileDialog(&DlgFile,obj,id);
451           ret=DialogExecute(TopLevel,&DlgFile);
452           if ((ret==IDDELETE) || (ret==IDCANCEL)) {
453             FitDel(obj,id);
454             delobj(obj,id);
455           } else {
456             if (ret==IDFAPPLY) id0=id;
457             NgraphApp.Changed=TRUE;
458           }
459         }
460       }
461     }
462   }
463   XFreeStringList(list);
464   FileWinUpdate(TRUE);
465 }
466 
DropHandle(Widget w,XtPointer client_data,XtPointer call_data)467 void DropHandle(Widget w,XtPointer client_data,XtPointer call_data)
468 {
469   XmDropProcCallback DropData;
470   XmDropTransferEntryRec transferEntries[1];
471   XmDropTransferEntry transferList;
472   Arg al[20];
473   Cardinal ac;
474 
475   DropData=(XmDropProcCallback)call_data;
476   ac=0;
477   if ((DropData->dropAction != XmDROP)
478    || (DropData->operation != XmDROP_COPY)) {
479     XtSetArg(al[ac],XmNtransferStatus,XmTRANSFER_FAILURE);
480     ac++;
481   } else {
482     transferEntries[0].target=COMPOUND_TEXT;
483     transferEntries[0].client_data=(XtPointer)w;
484     transferList=transferEntries;
485     XtSetArg(al[ac],XmNdropTransfers,transferList); ac++;
486     XtSetArg(al[ac],XmNnumDropTransfers,1); ac++;
487     XtSetArg(al[ac],XmNtransferProc,DropTransfer); ac++;
488   }
489   XmDropTransferStart(DropData->dragContext,al,ac);
490 }
491 
492 
createmenu(Widget parent)493 void createmenu(Widget parent)
494 {
495   Widget graphmenu,filemenu,axismenu,legendmenu,mergemenu;
496   Arg al[20];
497   Cardinal ac;
498   int i,num;
499   char **data;
500   XmString s;
501 
502   graphmenu=XmVaCreateSimplePulldownMenu(parent,"graphmenu",0,CmGraphMenu,
503     XmVaCASCADEBUTTON,NULL,NULL,
504     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
505     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
506     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
507     XmVaSEPARATOR,
508     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
509     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
510     XmVaSEPARATOR,
511     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
512     XmVaSEPARATOR,
513     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
514     XmVaSEPARATOR,
515     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
516     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
517     XmVaSEPARATOR,
518     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
519     XmVaSEPARATOR,
520     NULL);
521   ac=0;
522   for (i=0;i<10;i++) {
523    NgraphApp.ghistory[i]=XmCreatePushButton(graphmenu,NULL,al,ac);
524    XtAddCallback(NgraphApp.ghistory[i],XmNactivateCallback,
525                  CmGraphHistory,NULL);
526   }
527   XmVaCreateSimplePulldownMenu(graphmenu,"graphnewmenu",0,CmGraphNewMenu,
528     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
529     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
530     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
531     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
532     NULL);
533 
534   filemenu=XmVaCreateSimplePulldownMenu(parent,"datamenu",1,CmFileMenu,
535     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
536     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
537     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
538     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
539     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
540     XmVaSEPARATOR,
541     NULL);
542   ac=0;
543   for (i=0;i<10;i++) {
544     NgraphApp.fhistory[i]=XmCreatePushButton(filemenu,NULL,al,ac);
545     XtAddCallback(NgraphApp.fhistory[i],XmNactivateCallback,
546                   CmFileHistory,NULL);
547   }
548 
549   axismenu=XmVaCreateSimplePulldownMenu(parent,"axismenu",2,CmAxisMenu,
550     XmVaCASCADEBUTTON,NULL,NULL,
551     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
552     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
553     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
554     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
555     XmVaCASCADEBUTTON,NULL,NULL,
556     NULL);
557 
558   XmVaCreateSimplePulldownMenu(axismenu,"axisaddmenu",0,CmAxisAddMenu,
559     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
560     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
561     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
562     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
563     NULL);
564 
565   XmVaCreateSimplePulldownMenu(axismenu,"axisgridmenu",5,CmGridMenu,
566     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
567     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
568     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
569     NULL);
570 
571   legendmenu=XmVaCreateSimplePulldownMenu(parent,"legendmenu",3,NULL,
572     XmVaCASCADEBUTTON,NULL,NULL,
573     XmVaCASCADEBUTTON,NULL,NULL,
574     XmVaCASCADEBUTTON,NULL,NULL,
575     XmVaCASCADEBUTTON,NULL,NULL,
576     XmVaCASCADEBUTTON,NULL,NULL,
577     XmVaCASCADEBUTTON,NULL,NULL,
578     XmVaCASCADEBUTTON,NULL,NULL,
579     NULL);
580 
581   XmVaCreateSimplePulldownMenu(legendmenu,"linemenu",0,CmLineMenu,
582     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
583     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
584     NULL);
585 
586   XmVaCreateSimplePulldownMenu(legendmenu,"curvemenu",1,CmCurveMenu,
587     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
588     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
589     NULL);
590 
591   XmVaCreateSimplePulldownMenu(legendmenu,"polygonmenu",2,CmPolygonMenu,
592     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
593     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
594     NULL);
595 
596   XmVaCreateSimplePulldownMenu(legendmenu,"rectanglemenu",3,CmRectangleMenu,
597     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
598     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
599     NULL);
600 
601   XmVaCreateSimplePulldownMenu(legendmenu,"arcmenu",4,CmArcMenu,
602     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
603     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
604     NULL);
605 
606   XmVaCreateSimplePulldownMenu(legendmenu,"markmenu",5,CmMarkMenu,
607     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
608     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
609     NULL);
610 
611   XmVaCreateSimplePulldownMenu(legendmenu,"textmenu",6,CmTextMenu,
612     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
613     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
614     NULL);
615 
616   mergemenu=XmVaCreateSimplePulldownMenu(parent,"mergemenu",4,CmMergeMenu,
617     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
618     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
619     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
620     NULL);
621 
622   XmVaCreateSimplePulldownMenu(parent,"outputmenu",5,CmOutputMenu,
623     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
624     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
625     XmVaSEPARATOR,
626     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
627     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
628     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
629     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
630     NULL);
631 
632   XmVaCreateSimplePulldownMenu(parent,"preferencemenu",6,CmOptionMenu,
633     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
634     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
635     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
636     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
637     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
638     XmVaSEPARATOR,
639     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
640     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
641     XmVaSEPARATOR,
642     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
643     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
644     NULL);
645 
646   XmVaCreateSimplePulldownMenu(parent,"windowmenu",7,CmWindowMenu,
647     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
648     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
649     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
650     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
651     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
652     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
653     XmVaSEPARATOR,
654     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
655     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
656     XmVaCHECKBUTTON,NULL,NULL,NULL,NULL,
657     NULL);
658   XmVaCreateSimplePulldownMenu(parent,"helpmenu",8,CmHelpMenu,
659     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
660     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
661     NULL);
662 
663   num=arraynum(menulocal.ngpfilelist);
664   data=(char **)arraydata(menulocal.ngpfilelist);
665   for (i=0;i<10;i++) {
666     if (i<num) {
667       s=XmStringCreate(data[i],XmFONTLIST_DEFAULT_TAG);
668       XtVaSetValues(NgraphApp.ghistory[i],XmNlabelString,s,NULL);
669       XtManageChild(NgraphApp.ghistory[i]);
670       XmStringFree(s);
671     } else XtUnmanageChild(NgraphApp.ghistory[i]);
672   }
673   num=arraynum(menulocal.datafilelist);
674   data=(char **)arraydata(menulocal.datafilelist);
675   for (i=0;i<10;i++) {
676     if (i<num) {
677       s=XmStringCreate(data[i],XmFONTLIST_DEFAULT_TAG);
678       XtVaSetValues(NgraphApp.fhistory[i],XmNlabelString,s,NULL);
679       XtManageChild(NgraphApp.fhistory[i]);
680       XmStringFree(s);
681     } else XtUnmanageChild(NgraphApp.fhistory[i]);
682   }
683 
684 }
685 
setwindowfont()686 int setwindowfont()
687 {
688   char **missing,*defstring;
689   int missingcount;
690   XRectangle ink,logical;
691   XFontSetExtents *ext;
692 
693   FFont=XCreateFontSet(Disp,resources.windowfont,
694                        &missing,&missingcount,&defstring);
695   if (FFont==NULL) return FALSE;
696   XFreeStringList(missing);
697   ext=XExtentsOfFontSet(FFont);
698   logical=ext->max_logical_extent;
699   /*  XmbTextExtents(FFont,"H",1,&ink,&logical); */
700   FAscent=-logical.y;
701   /* XmbTextExtents(FFont,"g",1,&ink,&logical); */
702   FDescent=logical.y+logical.height;
703   FHeight=FAscent+FDescent;
704   FWidth=XmbTextEscapement(FFont,"M",1);
705   if (FHeight<1) FHeight=1;
706   if (FWidth<1) FWidth=1;
707   return TRUE;
708 }
709 
createpixmap1(Window win)710 void createpixmap1(Window win)
711 {
712   XImage *image;
713 
714   _XmCreateImage(image,Disp,(char *)filewin_bits,
715                             button_width,button_height,LSBFirst);
716   XmInstallImage(image,"filewin");
717   NgraphApp.com1pix[0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
718                        "filewin",black,gray);
719   _XmCreateImage(image,Disp,(char *)axiswin_bits,
720                             button_width,button_height,LSBFirst);
721   XmInstallImage(image,"axiswin");
722   NgraphApp.com1pix[1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
723                        "axiswin",black,gray);
724   _XmCreateImage(image,Disp,(char *)legendwin_bits,
725                             button_width,button_height,LSBFirst);
726   XmInstallImage(image,"legendwin");
727   NgraphApp.com1pix[2]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
728                        "legendwin",black,gray);
729   _XmCreateImage(image,Disp,(char *)mergewin_bits,
730                             button_width,button_height,LSBFirst);
731   XmInstallImage(image,"mergewin");
732   NgraphApp.com1pix[3]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
733                        "mergewin",black,gray);
734   _XmCreateImage(image,Disp,(char *)coordwin_bits,
735                             button_width,button_height,LSBFirst);
736   XmInstallImage(image,"coordwin");
737   NgraphApp.com1pix[4]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
738                        "coordwin",black,gray);
739   _XmCreateImage(image,Disp,(char *)infowin_bits,
740                             button_width,button_height,LSBFirst);
741   XmInstallImage(image,"infowin");
742   NgraphApp.com1pix[5]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
743                        "infowin",black,gray);
744   _XmCreateImage(image,Disp,(char *)fileopen_bits,
745                             button_width,button_height,LSBFirst);
746   XmInstallImage(image,"fileopen");
747   NgraphApp.com1pix[6]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
748                        "fileopen",black,gray);
749   _XmCreateImage(image,Disp,(char *)load_bits,
750                             button_width,button_height,LSBFirst);
751   XmInstallImage(image,"load");
752   NgraphApp.com1pix[7]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
753                        "load",black,gray);
754   _XmCreateImage(image,Disp,(char *)save_bits,
755                             button_width,button_height,LSBFirst);
756   XmInstallImage(image,"save");
757   NgraphApp.com1pix[8]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
758                        "save",black,gray);
759   _XmCreateImage(image,Disp,(char *)scale_bits,
760                             button_width,button_height,LSBFirst);
761   XmInstallImage(image,"scale");
762   NgraphApp.com1pix[9]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
763                        "scale",black,gray);
764   _XmCreateImage(image,Disp,(char *)draw_bits,
765                             draw_width,draw_height,LSBFirst);
766   XmInstallImage(image,"draw");
767   NgraphApp.com1pix[10]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
768                        "draw",black,gray);
769   _XmCreateImage(image,Disp,(char *)clear_bits,
770                             button_width,button_height,LSBFirst);
771   XmInstallImage(image,"clear");
772   NgraphApp.com1pix[11]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
773                        "clear",black,gray);
774   _XmCreateImage(image,Disp,(char *)print_bits,
775                             button_width,button_height,LSBFirst);
776   XmInstallImage(image,"print");
777   NgraphApp.com1pix[12]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
778                        "print",black,gray);
779   _XmCreateImage(image,Disp,(char *)preview_bits,
780                             button_width,button_height,LSBFirst);
781   XmInstallImage(image,"preview");
782   NgraphApp.com1pix[13]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
783                        "preview",black,gray);
784   _XmCreateImage(image,Disp,(char *)math_bits,
785                             button_width,button_height,LSBFirst);
786   XmInstallImage(image,"math");
787   NgraphApp.com1pix[14]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
788                        "math",black,gray);
789   _XmCreateImage(image,Disp,(char *)scaleundo_bits,
790                             button_width,button_height,LSBFirst);
791   XmInstallImage(image,"scaleundo");
792   NgraphApp.com1pix[15]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
793                        "scaleundo",black,gray);
794   _XmCreateImage(image,Disp,(char *)interrupt_bits,
795                             button_width,button_height,LSBFirst);
796   XmInstallImage(image,"interrupt");
797   NgraphApp.com1pix[16]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
798                        "interrupt",black,gray);
799 }
800 
createpixmap2(Window win)801 void createpixmap2(Window win)
802 {
803   XImage *image;
804 
805   _XmCreateImage(image,Disp,(char *)point_bits,
806                             button_width,button_height,LSBFirst);
807   XmInstallImage(image,"point");
808   NgraphApp.com2pix[0][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
809                        "point",black,white);
810   NgraphApp.com2pix[0][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
811                        "point",white,black);
812   _XmCreateImage(image,Disp,(char *)legendpoint_bits,
813                             button_width,button_height,LSBFirst);
814   XmInstallImage(image,"legendpoint");
815   NgraphApp.com2pix[1][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
816                        "legendpoint",black,white);
817   NgraphApp.com2pix[1][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
818                        "legendpoint",white,black);
819   _XmCreateImage(image,Disp,(char *)line_bits,
820                             button_width,button_height,LSBFirst);
821   XmInstallImage(image,"line");
822   NgraphApp.com2pix[2][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
823                        "line",black,white);
824   NgraphApp.com2pix[2][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
825                        "line",white,black);
826   _XmCreateImage(image,Disp,(char *)curve_bits,
827                             button_width,button_height,LSBFirst);
828   XmInstallImage(image,"curve");
829   NgraphApp.com2pix[3][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
830                        "curve",black,white);
831   NgraphApp.com2pix[3][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
832                        "curve",white,black);
833   _XmCreateImage(image,Disp,(char *)polygon_bits,
834                             button_width,button_height,LSBFirst);
835   XmInstallImage(image,"polygon");
836   NgraphApp.com2pix[4][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
837                        "polygon",black,white);
838   NgraphApp.com2pix[4][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
839                        "polygon",white,black);
840   _XmCreateImage(image,Disp,(char *)rect_bits,
841                             button_width,button_height,LSBFirst);
842   XmInstallImage(image,"rect");
843   NgraphApp.com2pix[5][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
844                        "rect",black,white);
845   NgraphApp.com2pix[5][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
846                        "rect",white,black);
847   _XmCreateImage(image,Disp,(char *)arc_bits,
848                             button_width,button_height,LSBFirst);
849   XmInstallImage(image,"arc");
850   NgraphApp.com2pix[6][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
851                        "arc",black,white);
852   NgraphApp.com2pix[6][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
853                        "arc",white,black);
854   _XmCreateImage(image,Disp,(char *)mark_bits,
855                             button_width,button_height,LSBFirst);
856   XmInstallImage(image,"mark");
857   NgraphApp.com2pix[7][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
858                        "mark",black,white);
859   NgraphApp.com2pix[7][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
860                        "mark",white,black);
861   _XmCreateImage(image,Disp,(char *)text_bits,
862                             button_width,button_height,LSBFirst);
863   XmInstallImage(image,"text");
864   NgraphApp.com2pix[8][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
865                        "text",black,white);
866   NgraphApp.com2pix[8][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
867                        "text",white,black);
868   _XmCreateImage(image,Disp,(char *)gauss_bits,
869                             button_width,button_height,LSBFirst);
870   XmInstallImage(image,"gauss");
871   NgraphApp.com2pix[9][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
872                        "gauss",black,white);
873   NgraphApp.com2pix[9][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
874                        "gauss",white,black);
875   _XmCreateImage(image,Disp,(char *)axispoint_bits,
876                             button_width,button_height,LSBFirst);
877   XmInstallImage(image,"axispoint");
878   NgraphApp.com2pix[10][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
879                        "axispoint",black,white);
880   NgraphApp.com2pix[10][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
881                        "axispoint",white,black);
882   _XmCreateImage(image,Disp,(char *)trimming_bits,
883                             button_width,button_height,LSBFirst);
884   XmInstallImage(image,"trimming");
885   NgraphApp.com2pix[11][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
886                        "trimming",black,white);
887   NgraphApp.com2pix[11][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
888                        "trimming",white,black);
889   _XmCreateImage(image,Disp,(char *)frame_bits,
890                             button_width,button_height,LSBFirst);
891   XmInstallImage(image,"frame");
892   NgraphApp.com2pix[12][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
893                        "frame",black,white);
894   NgraphApp.com2pix[12][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
895                        "frame",white,black);
896   _XmCreateImage(image,Disp,(char *)section_bits,
897                             button_width,button_height,LSBFirst);
898   XmInstallImage(image,"section");
899   NgraphApp.com2pix[13][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
900                        "section",black,white);
901   NgraphApp.com2pix[13][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
902                        "section",white,black);
903   _XmCreateImage(image,Disp,(char *)cross_bits,
904                             button_width,button_height,LSBFirst);
905   XmInstallImage(image,"cross");
906   NgraphApp.com2pix[14][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
907                        "cross",black,white);
908   NgraphApp.com2pix[14][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
909                        "cross",white,black);
910   _XmCreateImage(image,Disp,(char *)single_bits,
911                             button_width,button_height,LSBFirst);
912   XmInstallImage(image,"single");
913   NgraphApp.com2pix[15][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
914                        "single",black,white);
915   NgraphApp.com2pix[15][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
916                        "single",white,black);
917   _XmCreateImage(image,Disp,(char *)datapoint_bits,
918                             button_width,button_height,LSBFirst);
919   XmInstallImage(image,"datapoint");
920   NgraphApp.com2pix[16][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
921                        "datapoint",black,white);
922   NgraphApp.com2pix[16][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
923                        "datapoint",white,black);
924   _XmCreateImage(image,Disp,(char *)eval_bits,
925                             button_width,button_height,LSBFirst);
926   XmInstallImage(image,"eval");
927   NgraphApp.com2pix[17][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
928                        "eval",black,white);
929   NgraphApp.com2pix[17][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
930                        "eval",white,black);
931   _XmCreateImage(image,Disp,(char *)zoom_bits,
932                             button_width,button_height,LSBFirst);
933   XmInstallImage(image,"zoom");
934   NgraphApp.com2pix[18][1]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
935                        "zoom",black,white);
936   NgraphApp.com2pix[18][0]=XmGetPixmap(DefaultScreenOfDisplay(Disp),
937                        "zoom",white,black);
938 }
939 
createmarkpixmap(Window win)940 void createmarkpixmap(Window win)
941 {
942   XWindowAttributes attr;
943   int depth;
944   Pixmap pix;
945   int dpi,gc;
946   GC XGC;
947   struct mxlocal mxsave;
948   int i,R,G,B,R2,G2,B2;
949 
950   XGetWindowAttributes(Disp,win,&attr);
951   depth=attr.depth;
952   R=G=B=0;
953   R2=0;
954   G2=B2=255;
955   for (i=0;i<90;i++) {
956     pix=NgraphApp.markpix[i]=XCreatePixmap(Disp,win,20,20,depth);
957     dpi=nround(20*25.4);
958     XGC=XCreateGC(Disp,pix,0,0);
959     XSetForeground(Disp,XGC,RGB(255,255,255));
960     XFillRectangle(Disp,pix,XGC,0,0,20,20);
961     mxsaveGC(XGC,pix,0,0,&mxsave,dpi,NULL);
962     gc=_GRAopen(chkobjectname(menulocal.obj),"_output",menulocal.outputobj,
963              menulocal.inst,menulocal.output,-1,-1,-1,NULL,mxlocal);
964     if (gc>=0) {
965       GRAview(gc,0,0,100,100,0);
966       GRAlinestyle(gc,0,NULL,1,0,0,1000);
967       GRAmark(gc,i,49,49,80,R,G,B,R2,G2,B2);
968     }
969     _GRAclose(gc);
970     mxrestoreGC(&mxsave);
971     XFreeGC(Disp,XGC);
972   }
973 }
974 
createicon(Window win)975 void createicon(Window win)
976 {
977   Pixmap pix;
978   int x,y;
979   unsigned int width,height,border,depth;
980   Window root;
981   GC gc;
982   int h,w;
983   char c;
984 
985   XGetGeometry(Disp,win,&root,&x,&y,&width,&height,&border,&depth);
986   pix=XCreatePixmap(Disp,win,icon_width+2,icon_height+2,depth);
987   gc=XCreateGC(Disp,pix,0,0);
988   for (h=0;h<icon_height+2;h++) {
989     for (w=0;w<icon_width+2;w++) {
990       if ((h==0) || (h==icon_height+1) || (w==0) || (w==icon_width+1)) c='a';
991       else c=icon_xpm[h-1][w-1];
992       switch(c) {
993       case '.': XSetForeground(Disp,gc,RGB(0,0,0)); break;
994       case '#': XSetForeground(Disp,gc,RGB(0,0,255)); break;
995       case 'a': XSetForeground(Disp,gc,RGB(0,127,127)); break;
996       case 'b': XSetForeground(Disp,gc,RGB(0,255,255)); break;
997       case 'c': XSetForeground(Disp,gc,RGB(127,127,0)); break;
998       case 'd': XSetForeground(Disp,gc,RGB(127,127,127)); break;
999       case 'e': XSetForeground(Disp,gc,RGB(191,191,191)); break;
1000       case 'f': XSetForeground(Disp,gc,RGB(255,0,0)); break;
1001       case 'g': XSetForeground(Disp,gc,RGB(255,255,0)); break;
1002       case 'h': XSetForeground(Disp,gc,RGB(255,255,255)); break;
1003       default: XSetForeground(Disp,gc,RGB(0,0,0)); break;
1004       }
1005       XDrawPoint(Disp,pix,gc,w,h);
1006     }
1007   }
1008   XFreeGC(Disp,gc);
1009   NgraphApp.iconpix=pix;
1010 }
1011 
createcursor()1012 void createcursor()
1013 {
1014   NgraphApp.cursor[0]=XCreateFontCursor(Disp,XC_left_ptr);
1015   NgraphApp.cursor[1]=XCreateFontCursor(Disp,XC_xterm);
1016   NgraphApp.cursor[2]=XCreateFontCursor(Disp,XC_crosshair);
1017   NgraphApp.cursor[3]=XCreateFontCursor(Disp,XC_top_left_corner);
1018   NgraphApp.cursor[4]=XCreateFontCursor(Disp,XC_top_right_corner);
1019   NgraphApp.cursor[5]=XCreateFontCursor(Disp,XC_bottom_right_corner);
1020   NgraphApp.cursor[6]=XCreateFontCursor(Disp,XC_bottom_left_corner);
1021   NgraphApp.cursor[7]=XCreateFontCursor(Disp,XC_centering);
1022   NgraphApp.cursor[8]=XCreateFontCursor(Disp,XC_zoomin);
1023   NgraphApp.cursor[9]=XCreateFontCursor(Disp,XC_zoomout);
1024   NgraphApp.cursor[10]=XCreateFontCursor(Disp,XC_watch);
1025 }
1026 
createcommand1(Widget parent)1027 void createcommand1(Widget parent)
1028 {
1029   Arg al[20];
1030   Cardinal ac;
1031   Widget b;
1032   int i;
1033   char res[128];
1034 
1035   for (i=0;i<=5;i++) {
1036     ac=0;
1037     XtSetArg(al[ac],XmNlabelType,XmPIXMAP); ac++;
1038     XtSetArg(al[ac],XmNlabelPixmap,NgraphApp.com1pix[i]); ac++;
1039     XtSetArg(al[ac],XmNmarginWidth,0); ac++;
1040     XtSetArg(al[ac],XmNmarginHeight,0); ac++;
1041     XtSetArg(al[ac],XmNmarginTop,0); ac++;
1042     XtSetArg(al[ac],XmNmarginBottom,0); ac++;
1043     XtSetArg(al[ac],XmNmarginLeft,0); ac++;
1044     XtSetArg(al[ac],XmNmarginRight,0); ac++;
1045     sprintf(res,"button_%d",i);
1046     XtManageChild(b=XmCreatePushButton(parent,res,al,ac));
1047     switch (i) {
1048     case 0:
1049       XtAddCallback(b,XmNdisarmCallback,CmFileWindow,NULL);
1050       break;
1051     case 1:
1052       XtAddCallback(b,XmNdisarmCallback,CmAxisWindow,NULL);
1053       break;
1054     case 2:
1055       XtAddCallback(b,XmNdisarmCallback,CmLegendWindow,NULL);
1056       break;
1057     case 3:
1058       XtAddCallback(b,XmNdisarmCallback,CmMergeWindow,NULL);
1059       break;
1060     case 4:
1061       XtAddCallback(b,XmNdisarmCallback,CmCoordinateWindow,NULL);
1062       break;
1063     case 5:
1064       XtAddCallback(b,XmNdisarmCallback,CmInformationWindow,NULL);
1065       break;
1066     }
1067     XtAddEventHandler(b,EnterWindowMask | LeaveWindowMask,
1068                       False,TipCallback,NULL);
1069   }
1070 
1071   ac=0;
1072   XtSetArg(al[ac],XmNwidth,10); ac++;
1073   XtManageChild(XmCreateDrawingArea(parent,NULL,al,ac));
1074 
1075   for (i=6;i<14;i++) {
1076     ac=0;
1077     XtSetArg(al[ac],XmNlabelType,XmPIXMAP); ac++;
1078     XtSetArg(al[ac],XmNlabelPixmap,NgraphApp.com1pix[i]); ac++;
1079     XtSetArg(al[ac],XmNmarginWidth,0); ac++;
1080     XtSetArg(al[ac],XmNmarginHeight,0); ac++;
1081     XtSetArg(al[ac],XmNmarginTop,0); ac++;
1082     XtSetArg(al[ac],XmNmarginBottom,0); ac++;
1083     XtSetArg(al[ac],XmNmarginLeft,0); ac++;
1084     XtSetArg(al[ac],XmNmarginRight,0); ac++;
1085     sprintf(res,"button_%d",i);
1086     XtManageChild(b=XmCreatePushButton(parent,res,al,ac));
1087     switch (i) {
1088     case 6:
1089       XtAddCallback(b,XmNdisarmCallback,CmFileOpenB,NULL);
1090       break;
1091     case 7:
1092       XtAddCallback(b,XmNdisarmCallback,CmGraphLoadB,NULL);
1093       break;
1094     case 8:
1095       XtAddCallback(b,XmNdisarmCallback,CmGraphSaveB,NULL);
1096       break;
1097     case 9:
1098       XtAddCallback(b,XmNdisarmCallback,CmAxisClear,NULL);
1099       break;
1100     case 10:
1101       XtAddCallback(b,XmNdisarmCallback,CmViewerDrawB,NULL);
1102       break;
1103     case 11:
1104       XtAddCallback(b,XmNdisarmCallback,CmViewerClearB,NULL);
1105       break;
1106     case 12:
1107       XtAddCallback(b,XmNdisarmCallback,CmOutputDriverB,NULL);
1108       break;
1109     case 13:
1110       XtAddCallback(b,XmNdisarmCallback,CmOutputViewerB,NULL);
1111       break;
1112     }
1113     XtAddEventHandler(b,EnterWindowMask | LeaveWindowMask,
1114                       False,TipCallback,NULL);
1115   }
1116   ac=0;
1117   XtSetArg(al[ac],XmNwidth,10); ac++;
1118   XtManageChild(XmCreateDrawingArea(parent,NULL,al,ac));
1119 
1120   for (i=14;i<16;i++) {
1121     ac=0;
1122     XtSetArg(al[ac],XmNlabelType,XmPIXMAP); ac++;
1123     XtSetArg(al[ac],XmNlabelPixmap,NgraphApp.com1pix[i]); ac++;
1124     XtSetArg(al[ac],XmNmarginWidth,0); ac++;
1125     XtSetArg(al[ac],XmNmarginHeight,0); ac++;
1126     XtSetArg(al[ac],XmNmarginTop,0); ac++;
1127     XtSetArg(al[ac],XmNmarginBottom,0); ac++;
1128     XtSetArg(al[ac],XmNmarginLeft,0); ac++;
1129     XtSetArg(al[ac],XmNmarginRight,0); ac++;
1130     sprintf(res,"button_%d",i);
1131     XtManageChild(b=XmCreatePushButton(parent,res,al,ac));
1132     switch (i) {
1133     case 14:
1134       XtAddCallback(b,XmNdisarmCallback,CmFileWinMath,NULL);
1135       break;
1136     case 15:
1137       XtAddCallback(b,XmNdisarmCallback,CmAxisWinScaleUndo,NULL);
1138       break;
1139     }
1140     XtAddEventHandler(b,EnterWindowMask | LeaveWindowMask,
1141                       False,TipCallback,NULL);
1142   }
1143   ac=0;
1144   XtSetArg(al[ac],XmNwidth,10); ac++;
1145   XtManageChild(XmCreateDrawingArea(parent,NULL,al,ac));
1146 
1147   i=16;
1148   ac=0;
1149   XtSetArg(al[ac],XmNlabelType,XmPIXMAP); ac++;
1150   XtSetArg(al[ac],XmNlabelPixmap,NgraphApp.com1pix[16]); ac++;
1151   XtSetArg(al[ac],XmNmarginWidth,0); ac++;
1152   XtSetArg(al[ac],XmNmarginHeight,0); ac++;
1153   XtSetArg(al[ac],XmNmarginTop,0); ac++;
1154   XtSetArg(al[ac],XmNmarginBottom,0); ac++;
1155   XtSetArg(al[ac],XmNmarginLeft,0); ac++;
1156   XtSetArg(al[ac],XmNmarginRight,0); ac++;
1157   sprintf(res,"button_%d",i);
1158   XtManageChild(NgraphApp.interrupt=XmCreatePushButton(parent,res,al,ac));
1159   XtAddEventHandler(NgraphApp.interrupt,EnterWindowMask | LeaveWindowMask,
1160                     False,TipCallback,NULL);
1161 }
1162 
createcommand2(Widget parent)1163 void createcommand2(Widget parent)
1164 {
1165   Arg al[20];
1166   Cardinal ac;
1167   int i;
1168   char res[128];
1169 
1170   for (i=0;i<19;i++) {
1171     ac=0;
1172     XtSetArg(al[ac],XmNindicatorOn,0); ac++;
1173     XtSetArg(al[ac],XmNindicatorType,XmONE_OF_MANY); ac++;
1174     XtSetArg(al[ac],XmNlabelType,XmPIXMAP); ac++;
1175     XtSetArg(al[ac],XmNselectPixmap,NgraphApp.com2pix[i][0]); ac++;
1176     XtSetArg(al[ac],XmNlabelPixmap,NgraphApp.com2pix[i][1]); ac++;
1177     XtSetArg(al[ac],XmNmarginWidth,0); ac++;
1178     XtSetArg(al[ac],XmNmarginHeight,0); ac++;
1179     XtSetArg(al[ac],XmNmarginTop,0); ac++;
1180     XtSetArg(al[ac],XmNmarginBottom,0); ac++;
1181     XtSetArg(al[ac],XmNmarginLeft,0); ac++;
1182     XtSetArg(al[ac],XmNmarginRight,0); ac++;
1183     XtSetArg(al[ac],XmNbackground,white); ac++;
1184     XtSetArg(al[ac],XmNforeground,black); ac++;
1185     if (i==0) XtSetArg(al[ac],XmNset,XmSET);
1186     else XtSetArg(al[ac],XmNset,XmUNSET);
1187     ac++;
1188     sprintf(res,"button_%d",i);
1189     XtManageChild(NgraphApp.viewb[i]=XmCreateToggleButton(parent,res,al,ac));
1190     XtAddCallback(NgraphApp.viewb[i],XmNarmCallback,CmViewerButtonArm,NULL);
1191     XtAddEventHandler(NgraphApp.viewb[i],EnterWindowMask | LeaveWindowMask,
1192                       False,TipCallback,NULL);
1193   }
1194 }
1195 
createcolormap()1196 int createcolormap()
1197 {
1198   int depth;
1199   Colormap cmap;
1200 
1201   depth=mxlocal->cdepth;
1202 #ifdef PRIVATECOLOR
1203   cmap=XCreateColormap(Disp,RootWindow(Disp,0),
1204                        DefaultVisual(Disp,0),AllocNone);
1205 #else
1206   cmap=DefaultColormap(Disp,0);
1207 #endif
1208   mxlocal->cmap=cmap;
1209   return TRUE;
1210 }
1211 
setupwindow()1212 void setupwindow()
1213 {
1214   Widget menubar,rowcolumn,command1,commandframe,command2;
1215   Widget msgrc,msgframe,msgform;
1216   Arg al[20];
1217   Cardinal ac;
1218 
1219   ac=0;
1220   XtSetArg(al[ac],XmNshowSeparator,True); ac++;
1221   XtSetArg(al[ac],XmNscrollBarDisplayPolicy,XmSTATIC); ac++;
1222   XtSetArg(al[ac],XmNcommandWindowLocation,XmCOMMAND_ABOVE_WORKSPACE); ac++;
1223   XtManageChild(MainWin=XmCreateMainWindow(TopLevel,"mainwin",al,ac));
1224   ac=0;
1225   NgraphApp.Viewer.Win=XmCreateDrawingArea(MainWin,"viewer",al,ac);
1226   XtManageChild(NgraphApp.Viewer.Win);
1227 
1228   menubar=XmVaCreateSimpleMenuBar(MainWin,"menubar",
1229          XmVaCASCADEBUTTON,NULL,NULL,
1230          XmVaCASCADEBUTTON,NULL,NULL,
1231          XmVaCASCADEBUTTON,NULL,NULL,
1232          XmVaCASCADEBUTTON,NULL,NULL,
1233          XmVaCASCADEBUTTON,NULL,NULL,
1234          XmVaCASCADEBUTTON,NULL,NULL,
1235          XmVaCASCADEBUTTON,NULL,NULL,
1236          XmVaCASCADEBUTTON,NULL,NULL,
1237          XmVaCASCADEBUTTON,NULL,NULL,
1238          NULL);
1239   XtManageChild(menubar);
1240   XtVaSetValues(menubar,XmNmenuHelpWidget,
1241                 XtNameToWidget(menubar,"*button_8"),NULL);
1242 
1243   createmenu(menubar);
1244   if (menulocal.movechild)
1245     XmToggleButtonSetState(XtNameToWidget(TopLevel,"*windowmenu.button_7"),
1246                            True,False);
1247   else
1248     XmToggleButtonSetState(XtNameToWidget(TopLevel,"*windowmenu.button_7"),
1249                            False,False);
1250 
1251   if (menulocal.statusb)
1252     XmToggleButtonSetState(XtNameToWidget(TopLevel,"*windowmenu.button_8"),
1253                            True,False);
1254   else
1255     XmToggleButtonSetState(XtNameToWidget(TopLevel,"*windowmenu.button_8"),
1256                            False,False);
1257 
1258   ac=0;
1259   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
1260   rowcolumn=XmCreateRowColumn(MainWin,"rowcolumn",al,ac);
1261   XtManageChild(rowcolumn);
1262 
1263   ac=0;
1264   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1265   command1=XmCreateRowColumn(rowcolumn,"command1",al,ac);
1266   XtManageChild(command1);
1267 
1268   createcommand1(command1);
1269 
1270   ac=0;
1271   XtManageChild(commandframe=XmCreateFrame(rowcolumn,"commandframe",al,ac));
1272   ac=0;
1273   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1274   command2=XmCreateRadioBox(commandframe,"command2",al,ac);
1275   XtManageChild(command2);
1276 
1277   createcommand2(command2);
1278 
1279   ac=0;
1280   NgraphApp.Message=msgrc=XmCreateRowColumn(MainWin,NULL,al,ac);
1281   if (menulocal.statusb) XtManageChild(msgrc);
1282   ac=0;
1283   msgframe=XmCreateFrame(msgrc,NULL,al,ac);
1284   XtManageChild(msgframe);
1285   ac=0;
1286   msgform=XmCreateForm(msgframe,NULL,al,ac);
1287   XtManageChild(msgform);
1288 
1289   ac=0;
1290   XtSetArg(al[ac],XmNtopAttachment,XmATTACH_FORM); ac++;
1291   XtSetArg(al[ac],XmNbottomAttachment,XmATTACH_FORM); ac++;
1292   XtSetArg(al[ac],XmNleftAttachment,XmATTACH_POSITION); ac++;
1293   XtSetArg(al[ac],XmNleftPosition,0); ac++;
1294   XtSetArg(al[ac],XmNrightAttachment,XmATTACH_POSITION); ac++;
1295   XtSetArg(al[ac],XmNrightPosition,70); ac++;
1296   XtSetArg(al[ac],XmNrightOffset,2); ac++;
1297   XtSetArg(al[ac],XmNleftOffset,2); ac++;
1298   XtSetArg(al[ac],XmNalignment,XmALIGNMENT_BEGINNING); ac++;
1299   XtSetArg(al[ac],XmNresizable,FALSE); ac++;
1300   NgraphApp.Message1=XmCreateLabel(msgform," ",al,ac);
1301   XtManageChild(NgraphApp.Message1);
1302   ac=0;
1303   XtSetArg(al[ac],XmNtopAttachment,XmATTACH_FORM); ac++;
1304   XtSetArg(al[ac],XmNbottomAttachment,XmATTACH_FORM); ac++;
1305   XtSetArg(al[ac],XmNleftAttachment,XmATTACH_POSITION); ac++;
1306   XtSetArg(al[ac],XmNleftPosition,70); ac++;
1307   XtSetArg(al[ac],XmNrightOffset,2); ac++;
1308   XtSetArg(al[ac],XmNleftOffset,2); ac++;
1309   XtSetArg(al[ac],XmNrightAttachment,XmATTACH_POSITION); ac++;
1310   XtSetArg(al[ac],XmNrightPosition,80); ac++;
1311   XtSetArg(al[ac],XmNalignment,XmALIGNMENT_BEGINNING); ac++;
1312   XtSetArg(al[ac],XmNresizable,FALSE); ac++;
1313   NgraphApp.Message2=XmCreateLabel(msgform," ",al,ac);
1314   XtManageChild(NgraphApp.Message2);
1315   ac=0;
1316   XtSetArg(al[ac],XmNtopAttachment,XmATTACH_FORM); ac++;
1317   XtSetArg(al[ac],XmNbottomAttachment,XmATTACH_FORM); ac++;
1318   XtSetArg(al[ac],XmNleftAttachment,XmATTACH_POSITION); ac++;
1319   XtSetArg(al[ac],XmNleftPosition,80); ac++;
1320   XtSetArg(al[ac],XmNrightOffset,2); ac++;
1321   XtSetArg(al[ac],XmNleftOffset,2); ac++;
1322   XtSetArg(al[ac],XmNrightAttachment,XmATTACH_POSITION); ac++;
1323   XtSetArg(al[ac],XmNrightPosition,100); ac++;
1324   XtSetArg(al[ac],XmNalignment,XmALIGNMENT_BEGINNING); ac++;
1325   XtSetArg(al[ac],XmNresizable,FALSE); ac++;
1326   NgraphApp.Message3=XmCreateLabel(msgform," ",al,ac);
1327   XtManageChild(NgraphApp.Message3);
1328 
1329   ac=0;
1330   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1331   NgraphApp.Viewer.HScroll=XmCreateScrollBar(MainWin,NULL,al,ac);
1332   XtManageChild(NgraphApp.Viewer.HScroll);
1333   ac=0;
1334   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
1335   NgraphApp.Viewer.VScroll=XmCreateScrollBar(MainWin,NULL,al,ac);
1336   XtManageChild(NgraphApp.Viewer.VScroll);
1337 
1338   XmMainWindowSetAreas(MainWin,menubar,rowcolumn,
1339                        NgraphApp.Viewer.HScroll,
1340                        NgraphApp.Viewer.VScroll,
1341                        NgraphApp.Viewer.Win);
1342   XtVaSetValues(MainWin,XmNmessageWindow,msgrc,NULL);
1343 
1344 }
1345 
defaultwindowconfig()1346 void defaultwindowconfig()
1347 {
1348   int w,h;
1349 
1350   w=WidthOfScreen(DefaultScreenOfDisplay(Disp));
1351   h=w/2*1.2;
1352   if (menulocal.fileopen) {
1353     if (menulocal.filewidth==CW_USEDEFAULT) menulocal.filewidth=w/4;
1354     if (menulocal.fileheight==CW_USEDEFAULT) menulocal.fileheight=h/4;
1355     if (menulocal.filex==CW_USEDEFAULT) menulocal.filex=-menulocal.filewidth
1356                                                       -menulocal.framex*2-4;
1357     if (menulocal.filey==CW_USEDEFAULT) menulocal.filey=0;
1358   }
1359   if (menulocal.axisopen) {
1360     if (menulocal.axiswidth==CW_USEDEFAULT) menulocal.axiswidth=w/4;
1361     if (menulocal.axisheight==CW_USEDEFAULT) menulocal.axisheight=h/4;
1362     if (menulocal.axisx==CW_USEDEFAULT) menulocal.axisx=-menulocal.axiswidth
1363                                                      -menulocal.framex*2-4;
1364     if (menulocal.axisy==CW_USEDEFAULT) menulocal.axisy=menulocal.fileheight
1365                                                        +menulocal.framey+4;
1366   }
1367   if (menulocal.coordopen) {
1368     if (menulocal.coordwidth==CW_USEDEFAULT) menulocal.coordwidth=w/4;
1369     if (menulocal.coordheight==CW_USEDEFAULT) menulocal.coordheight=h/4;
1370     if (menulocal.coordx==CW_USEDEFAULT)
1371       menulocal.coordx=-menulocal.coordwidth-menulocal.framex*2-4;
1372     if (menulocal.coordy==CW_USEDEFAULT)
1373       menulocal.coordy=menulocal.fileheight+menulocal.axisheight
1374                                            +menulocal.framey*2+8;
1375   }
1376 }
1377 
application(char * file)1378 void application(char *file)
1379 {
1380   int i;
1381   char *ext;
1382   struct objlist *aobj;
1383   Arg al[20];
1384   Cardinal ac;
1385   Atom xa_wm_delete;
1386   XColor col,exact;
1387   int x,y,width,height,w,h;
1388   char geometry[50];
1389   Atom importList[2];
1390 
1391   if (TopLevel==NULL) {
1392 
1393     w=WidthOfScreen(DefaultScreenOfDisplay(Disp));
1394     h=HeightOfScreen(DefaultScreenOfDisplay(Disp));
1395     if (menulocal.menux==CW_USEDEFAULT) menulocal.menux=w*3/8;
1396     if (menulocal.menuy==CW_USEDEFAULT) menulocal.menuy=h/8;
1397     if (menulocal.menuwidth==CW_USEDEFAULT) menulocal.menuwidth=w/2;
1398     if (menulocal.menuheight==CW_USEDEFAULT) menulocal.menuheight=w*1.2/2;
1399 
1400     x=menulocal.menux;
1401     y=menulocal.menuy;
1402     width=menulocal.menuwidth;
1403     height=menulocal.menuheight;
1404     ac=0;
1405     XtSetArg(al[ac],XmNborderWidth,1);ac++;
1406     XtSetArg(al[ac],XmNdefaultPosition,False); ac++;
1407     XtSetArg(al[ac],XmNx,x); ac++;
1408     XtSetArg(al[ac],XmNy,y); ac++;
1409     XtSetArg(al[ac],XmNheight,height); ac++;
1410     XtSetArg(al[ac],XmNwidth,width); ac++;
1411     sprintf(geometry,"%dx%d+%d+%d",width,height,x,y);
1412     XtSetArg(al[ac],XmNgeometry,geometry); ac++;
1413     TopLevel=XtAppCreateShell(AppName,AppClass,applicationShellWidgetClass,
1414                               Disp,al,ac);
1415     XtGetApplicationResources(TopLevel,&resources,Res,XtNumber(Res),NULL,0);
1416 
1417     XtVaSetValues(TopLevel,XmNdeleteResponse,XmDO_NOTHING,NULL);
1418     xa_wm_delete=XmInternAtom(Disp,"WM_DELETE_WINDOW",False);
1419     XmAddWMProtocolCallback(TopLevel,xa_wm_delete,CloseCallback,NULL);
1420     NgraphClose=XInternAtom(Disp,CloseMessage,FALSE);
1421 
1422     if (!setwindowfont()) {
1423       error(menulocal.obj,ERRFONT);
1424     }
1425     if (!createcolormap(Disp)) {
1426       error(menulocal.obj,ERRCMAP);
1427     }
1428     black=BlackPixel(Disp,0);
1429     white=WhitePixel(Disp,0);
1430     XAllocNamedColor(Disp,mxlocal->cmap,"gray",&col,&exact);
1431     gray=col.pixel;
1432     XAllocNamedColor(Disp,mxlocal->cmap,"red",&col,&exact);
1433     red=col.pixel;
1434     XAllocNamedColor(Disp,mxlocal->cmap,"blue",&col,&exact);
1435     blue=col.pixel;
1436 
1437     createicon(RootWindow(Disp,0));
1438     XtVaSetValues(TopLevel,XmNiconPixmap,NgraphApp.iconpix,NULL);
1439 
1440     createpixmap1(RootWindow(Disp,0));
1441     createpixmap2(RootWindow(Disp,0));
1442     createmarkpixmap(RootWindow(Disp,0));
1443     createcursor(Disp);
1444 
1445     NgraphApp.Viewer.Win=NULL;
1446     NgraphApp.FileWin.Win=NULL;
1447     NgraphApp.AxisWin.Win=NULL;
1448     NgraphApp.LegendWin.Win=NULL;
1449     NgraphApp.MergeWin.Win=NULL;
1450     NgraphApp.InfoWin.Win=NULL;
1451     NgraphApp.InfoWin.str=NULL;
1452     NgraphApp.CoordWin.Win=NULL;
1453     NgraphApp.CoordWin.str=NULL;
1454 
1455     initdialog();
1456     setupwindow();
1457 
1458     COMPOUND_TEXT=XmInternAtom(Disp,"COMPOUND_TEXT",False);
1459     importList[0]=COMPOUND_TEXT;
1460     ac=0;
1461     XtSetArg(al[ac],XmNimportTargets,importList);ac++;
1462     XtSetArg(al[ac],XmNnumImportTargets,1); ac++;
1463     XtSetArg(al[ac],XmNdropSiteOperations,XmDROP_COPY); ac++;
1464     XtSetArg(al[ac],XmNdropProc,DropHandle); ac++;
1465     XmDropSiteRegister(MainWin,al,ac);
1466 
1467   }
1468 
1469   XtRealizeWidget(TopLevel);
1470   XSetWindowColormap(XtDisplay(TopLevel),XtWindow(TopLevel),mxlocal->cmap);
1471 
1472   if ((menulocal.framex==0) && (menulocal.framey==0)) GetWMFrame(TopLevel);
1473   defaultwindowconfig();
1474 
1475   XtAddEventHandler(TopLevel,StructureNotifyMask,False,EvMove,NULL);
1476 
1477   putstderr=mx11putstderr;
1478   printfstderr=mx11printfstderr;
1479   ndisplaydialog=mx11displaydialog;
1480   ndisplaystatus=mx11displaystatus;
1481   ninterrupt=mx11interrupt;
1482   inputyn=mx11inputyn;
1483 
1484   ViewerWinSetup();
1485   SetCaption(NULL);
1486   SetCursor(XC_left_ptr);
1487 
1488   NgraphApp.Changed=FALSE;
1489   NgraphApp.FileName=NULL;
1490 
1491   ResetEvent();
1492 
1493   if (menulocal.dialogopen) CmInformationWindow(NULL,NULL,NULL);
1494   if (menulocal.coordopen) CmCoordinateWindow(NULL,NULL,NULL);
1495   if (menulocal.mergeopen) CmMergeWindow(NULL,NULL,NULL);
1496   if (menulocal.legendopen) CmLegendWindow(NULL,NULL,NULL);
1497   if (menulocal.axisopen) CmAxisWindow(NULL,NULL,NULL);
1498   if (menulocal.fileopen) CmFileWindow(NULL,NULL,NULL);
1499 
1500   if ((aobj=getobject("axis"))!=NULL) {
1501     for (i=0;i<=chkobjlastinst(aobj);i++) exeobj(aobj,"tight",i,0,NULL);
1502   }
1503   if ((aobj=getobject("axisgrid"))!=NULL) {
1504     for (i=0;i<=chkobjlastinst(aobj);i++) exeobj(aobj,"tight",i,0,NULL);
1505   }
1506   if (file!=NULL) {
1507     if ((ext=getextention(file))!=NULL) {
1508       if ((strcmp0(ext,"PRM")==0) || (strcmp0(ext,"prm")==0))
1509         LoadPrmFile(file);
1510       else if ((strcmp0(ext,"NGP")==0) || (strcmp0(ext,"ngp")==0))
1511         LoadNgpFile(file,menulocal.ignorepath,menulocal.expand,
1512                          menulocal.expanddir,FALSE,NULL);
1513     }
1514   }
1515 
1516   CmViewerDrawB(NgraphApp.Viewer.Win,NULL,NULL);
1517 
1518   arrayinit(&childlist,sizeof(pid_t));
1519   signaltrap=TRUE;
1520   signal(SIGCHLD,childhandler);
1521 
1522   RegisterWorkProc=FALSE;
1523   AppMainLoop(Application);
1524   if (RegisterWorkProc) {
1525     XtRemoveWorkProc(WorkProcId);
1526     RegisterWorkProc=FALSE;
1527   }
1528 
1529   signaltrap=FALSE;
1530   arraydel(&childlist);
1531 
1532   ViewerWinClose();
1533   InfoWinUnmap(NULL,NULL,NULL);
1534   CoordWinUnmap(NULL,NULL,NULL);
1535   MergeWindowUnmap(NULL,NULL,NULL);
1536   LegendWindowUnmap(NULL,NULL,NULL);
1537   AxisWindowUnmap(NULL,NULL,NULL);
1538   FileWindowUnmap(NULL,NULL,NULL);
1539 
1540   memfree(NgraphApp.InfoWin.str);
1541   NgraphApp.InfoWin.str=NULL;
1542   memfree(NgraphApp.CoordWin.str);
1543   NgraphApp.CoordWin.str=NULL;
1544   memfree(NgraphApp.FileName);
1545   NgraphApp.FileName=NULL;
1546 
1547   XtUnrealizeWidget(TopLevel);
1548   ResetEvent();
1549 }
1550 
UpdateAll()1551 void UpdateAll()
1552 {
1553   ViewerWinUpdate(TRUE);
1554   FileWinUpdate(TRUE);
1555   AxisWinUpdate(TRUE);
1556   LegendWinUpdate(TRUE);
1557   MergeWinUpdate(TRUE);
1558   InfoWinUpdate(TRUE);
1559   CoordWinUpdate(TRUE);
1560 }
1561 
UpdateAll2()1562 void UpdateAll2()
1563 {
1564   FileWinUpdate(TRUE);
1565   AxisWinUpdate(TRUE);
1566   LegendWinUpdate(TRUE);
1567   MergeWinUpdate(TRUE);
1568   InfoWinUpdate(TRUE);
1569   CoordWinUpdate(TRUE);
1570 }
1571 
ChangePage()1572 void ChangePage()
1573 {
1574   CloseGC();
1575   CloseGRA();
1576   OpenGRA();
1577   OpenGC();
1578   SetScroller();
1579   ChangeDPI(TRUE);
1580 }
1581 
SetPoint(int x,int y)1582 void SetPoint(int x,int y)
1583 {
1584   char buf[40];
1585   XmString s;
1586 
1587   sprintf(buf,"X:%d Y:%d",x,y);
1588   s=XmStringCreate(buf,XmFONTLIST_DEFAULT_TAG);
1589   XtVaSetValues(NgraphApp.Message3,XmNlabelString,s,NULL);
1590   XmStringFree(s);
1591   XClearArea(Disp,XtWindow(NgraphApp.Message3),0,0,0,0,TRUE);
1592   XmUpdateDisplay(NgraphApp.Message3);
1593 }
1594 
SetZoom(double zm)1595 void SetZoom(double zm)
1596 {
1597   char buf[20];
1598   XmString s;
1599 
1600   sprintf(buf,"%.2f%%",zm*100);
1601   s=XmStringCreate(buf,XmFONTLIST_DEFAULT_TAG);
1602   XtVaSetValues(NgraphApp.Message2,XmNlabelString,s,NULL);
1603   XmStringFree(s);
1604   XClearArea(Disp,XtWindow(NgraphApp.Message2),0,0,0,0,TRUE);
1605   XmUpdateDisplay(NgraphApp.Message2);
1606 }
1607 
ResetZoom()1608 void ResetZoom()
1609 {
1610   XmString s;
1611 
1612   s=XmStringCreate(" ",XmFONTLIST_DEFAULT_TAG);
1613   XtVaSetValues(NgraphApp.Message2,XmNlabelString,s,NULL);
1614   XmStringFree(s);
1615   XClearArea(Disp,XtWindow(NgraphApp.Message2),0,0,0,0,TRUE);
1616   XmUpdateDisplay(NgraphApp.Message2);
1617 }
1618 
SetStatusBar(char * mes)1619 void SetStatusBar(char *mes)
1620 {
1621   XmString s;
1622 
1623   s=XmStringCreate(mes,XmFONTLIST_DEFAULT_TAG);
1624   XtVaSetValues(NgraphApp.Message1,XmNlabelString,s,NULL);
1625   XmStringFree(s);
1626   XClearArea(Disp,XtWindow(NgraphApp.Message1),0,0,0,0,TRUE);
1627   XmUpdateDisplay(NgraphApp.Message1);
1628 }
1629 
SetStatusBarXm(XmString s)1630 void SetStatusBarXm(XmString s)
1631 {
1632   XtVaSetValues(NgraphApp.Message1,XmNlabelString,s,NULL);
1633   XClearArea(Disp,XtWindow(NgraphApp.Message1),0,0,0,0,TRUE);
1634   XmUpdateDisplay(NgraphApp.Message1);
1635 }
1636 
ResetStatusBar()1637 void ResetStatusBar()
1638 {
1639   XmString s;
1640 
1641   s=XmStringCreate(" ",XmFONTLIST_DEFAULT_TAG);
1642   XtVaSetValues(NgraphApp.Message1,XmNlabelString,s,NULL);
1643   XmStringFree(s);
1644   XClearArea(Disp,XtWindow(NgraphApp.Message1),0,0,0,0,TRUE);
1645   XmUpdateDisplay(NgraphApp.Message1);
1646 }
1647 
SetCaption(char * file)1648 void SetCaption(char *file)
1649 {
1650   char *fullpath;
1651   char *buf;
1652   int len;
1653 
1654   if (file==NULL) {
1655     fullpath=NULL;
1656     len=0;
1657   } else {
1658     fullpath=getfullpath(file);
1659     len=strlen(fullpath);
1660   }
1661   if ((buf=memalloc(len+10))!=NULL) {
1662     strcpy(buf,"Ngraph");
1663     if (fullpath!=NULL) {
1664       strcat(buf,": ");
1665       strcat(buf,fullpath);
1666     }
1667     XtVaSetValues(TopLevel,XmNtitle,buf,NULL);
1668   }
1669   memfree(fullpath);
1670 }
1671 
SetCursor(unsigned int type)1672 void SetCursor(unsigned int type)
1673 {
1674   struct Viewer *d;
1675   Window win;
1676 
1677   d=&(NgraphApp.Viewer);
1678   win=XtWindow(d->Win);
1679   XUndefineCursor(Disp,win);
1680   switch (type) {
1681   case XC_left_ptr:
1682     XDefineCursor(Disp,win,NgraphApp.cursor[0]);
1683     break;
1684   case XC_xterm:
1685     XDefineCursor(Disp,win,NgraphApp.cursor[1]);
1686     break;
1687   case XC_crosshair:
1688     XDefineCursor(Disp,win,NgraphApp.cursor[2]);
1689     break;
1690   case XC_top_left_corner:
1691     XDefineCursor(Disp,win,NgraphApp.cursor[3]);
1692     break;
1693   case XC_top_right_corner:
1694     XDefineCursor(Disp,win,NgraphApp.cursor[4]);
1695     break;
1696   case XC_bottom_right_corner:
1697     XDefineCursor(Disp,win,NgraphApp.cursor[5]);
1698     break;
1699   case XC_bottom_left_corner:
1700     XDefineCursor(Disp,win,NgraphApp.cursor[6]);
1701     break;
1702   case XC_centering:
1703     XDefineCursor(Disp,win,NgraphApp.cursor[7]);
1704     break;
1705   case XC_zoomin:
1706     XDefineCursor(Disp,win,NgraphApp.cursor[8]);
1707     break;
1708   case XC_zoomout:
1709     XDefineCursor(Disp,win,NgraphApp.cursor[9]);
1710     break;
1711   case XC_watch:
1712     XDefineCursor(Disp,win,NgraphApp.cursor[10]);
1713     break;
1714   }
1715 }
1716 
DisplayDialog(char * str)1717 void DisplayDialog(char *str)
1718 {
1719   memfree(NgraphApp.InfoWin.str);
1720   NgraphApp.InfoWin.str=memalloc(strlen(str)+1);
1721   if (NgraphApp.InfoWin.str!=NULL)
1722     strcpy(NgraphApp.InfoWin.str,str);
1723   InfoWinDrawInfoText();
1724 }
1725 
DisplayStatus(char * str)1726 void DisplayStatus(char *str)
1727 {
1728   SetStatusBar(str);
1729 }
1730 
PutStderr(char * s)1731 int PutStderr(char *s)
1732 {
1733   int len;
1734 
1735   MessageBox(TopLevel,s,"Error:",MB_OK);
1736   UpdateAll2();
1737   len=strlen(s);
1738   return len+1;
1739 }
1740 
ChkInterrupt()1741 int ChkInterrupt()
1742 {
1743   XEvent event;
1744   XKeyEvent *e;
1745   KeySym sym;
1746 
1747   while (TRUE) {
1748     if (XCheckTypedEvent(Disp,KeyPress,&event)) {
1749       e=(XKeyEvent *)&event;
1750       sym=XKeycodeToKeysym(Disp,e->keycode,0);
1751       if (sym==XK_Escape) {
1752         NgraphApp.Interrupt=TRUE;
1753         break;
1754       }
1755     }
1756     if (XCheckTypedWindowEvent(Disp,XtWindow(NgraphApp.interrupt),ButtonPress,
1757                                &event)) {
1758       NgraphApp.Interrupt=TRUE;
1759       break;
1760     } else break;
1761   }
1762   if (NgraphApp.Interrupt) {
1763     NgraphApp.Interrupt=FALSE;
1764     return TRUE;
1765   }
1766   return FALSE;
1767 }
1768 
InputYN(char * mes)1769 int InputYN(char *mes)
1770 {
1771   int ret;
1772 
1773   ret=MessageBox(TopLevel,mes,"Question",MB_YESNO);
1774   UpdateAll2();
1775   return (ret==IDYES)?TRUE:FALSE;
1776 }
1777 
CmReloadWindowConfig()1778 void CmReloadWindowConfig()
1779 {
1780   Position x,y;
1781   Dimension w0,h0;
1782 
1783   if (NgraphApp.FileWin.Win!=NULL) CmFileWindow(NULL,NULL,NULL);
1784   if (NgraphApp.AxisWin.Win!=NULL) CmAxisWindow(NULL,NULL,NULL);
1785   if (NgraphApp.LegendWin.Win!=NULL) CmLegendWindow(NULL,NULL,NULL);
1786   if (NgraphApp.MergeWin.Win!=NULL) CmMergeWindow(NULL,NULL,NULL);
1787   if (NgraphApp.InfoWin.Win!=NULL) CmInformationWindow(NULL,NULL,NULL);
1788   if (NgraphApp.CoordWin.Win!=NULL) CmCoordinateWindow(NULL,NULL,NULL);
1789   ResetEvent();
1790   initwindowconfig();
1791   mx11windowconfig();
1792   XtVaGetValues(MainWin,
1793                 XmNx,&x,XmNy,&y,
1794                 XmNwidth,&w0,XmNheight,&h0,NULL);
1795   menulocal.menux=x;
1796   menulocal.menuy=y;
1797   menulocal.menuwidth=w0;
1798   menulocal.menuheight=h0;
1799   defaultwindowconfig();
1800   if (menulocal.dialogopen) CmInformationWindow(NULL,NULL,NULL);
1801   if (menulocal.coordopen) CmCoordinateWindow(NULL,NULL,NULL);
1802   if (menulocal.mergeopen) CmMergeWindow(NULL,NULL,NULL);
1803   if (menulocal.legendopen) CmLegendWindow(NULL,NULL,NULL);
1804   if (menulocal.axisopen) CmAxisWindow(NULL,NULL,NULL);
1805   if (menulocal.fileopen) CmFileWindow(NULL,NULL,NULL);
1806 }
1807 
CmMoveChildWindow()1808 void CmMoveChildWindow()
1809 {
1810   if (menulocal.movechild) menulocal.movechild=FALSE;
1811   else menulocal.movechild=TRUE;
1812 }
1813 
CmStatusBar()1814 void CmStatusBar()
1815 {
1816   if (menulocal.statusb) {
1817     menulocal.statusb=FALSE;
1818     XtUnmanageChild(NgraphApp.Message);
1819   } else {
1820     menulocal.statusb=TRUE;
1821     XtManageChild(NgraphApp.Message);
1822   }
1823 }
1824 
1825 
CmWindowMenu(Widget w,XtPointer client_data,XtPointer call_data)1826 void CmWindowMenu(Widget w,XtPointer client_data,XtPointer call_data)
1827 {
1828   switch ((int )client_data) {
1829   case 0:
1830     CmFileWindow(NULL,NULL,NULL);
1831     break;
1832   case 1:
1833     CmAxisWindow(NULL,NULL,NULL);
1834     break;
1835   case 2:
1836     CmLegendWindow(NULL,NULL,NULL);
1837     break;
1838   case 3:
1839     CmMergeWindow(NULL,NULL,NULL);
1840     break;
1841   case 4:
1842     CmCoordinateWindow(NULL,NULL,NULL);
1843     break;
1844   case 5:
1845     CmInformationWindow(NULL,NULL,NULL);
1846     break;
1847   case 6:
1848     CmReloadWindowConfig();
1849     break;
1850   case 7:
1851     CmMoveChildWindow();
1852     break;
1853   case 8:
1854     CmStatusBar();
1855     break;
1856   }
1857 }
1858