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