[BACK]Return to ox_plot_xevent.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / plot

Annotation of OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/plot/ox_plot_xevent.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "parse.h"
                      4: #include "ox.h"
                      5: #include "ifplot.h"
                      6: #include "cursor.h"
                      7:
                      8: #ifdef ABS
                      9: #undef ABS
                     10: #define ABS(a) ((a)>0?(a):-(a))
                     11: #endif
                     12:
                     13: static char *dname;
                     14: static int remotes;
                     15: static int depth,scrn;
                     16:
                     17: extern jmp_buf ox_env;
                     18: static Widget toplevel;
                     19: static XtAppContext app_con;
                     20:
                     21: static int busy;
                     22:
                     23: static struct PlotResources {
                     24:        Pixel ForePixel,BackPixel,DashPixel;
                     25:        char *ForeName,*BackName,*DashName;
                     26:        Boolean Reverse;
                     27: } PlotResources;
                     28:
                     29: #define forePixel PlotResources.ForePixel
                     30: #define backPixel PlotResources.BackPixel
                     31: #define dashPixel PlotResources.DashPixel
                     32: #define foreName PlotResources.ForeName
                     33: #define backName PlotResources.BackName
                     34: #define dashName PlotResources.DashName
                     35: #define reverse PlotResources.Reverse
                     36:
                     37: Cursor create_cursor();
                     38:
                     39: #define blackPixel     BlackPixel(display,scrn)
                     40: #define whitePixel     WhitePixel(display,scrn)
                     41:
                     42: #define LABELWIDTH 150
                     43:
                     44: process_xevent() {
                     45:        XEvent ev;
                     46:
                     47:        while ( XPending(display) ) {
                     48:                XtAppNextEvent(app_con,&ev);
                     49:                XtDispatchEvent(&ev);
                     50:        }
                     51: }
                     52:
                     53: /* event handlers */
                     54:
                     55: static POINT spos,cpos;
                     56:
                     57: void press(w,can,ev)
                     58: Widget w;
                     59: struct canvas *can;
                     60: XButtonEvent *ev;
                     61: {
                     62:        POINT p;
                     63:
                     64:        switch ( ev->button ) {
                     65:                case Button1:
                     66:                        XC(spos) = ev->x; YC(spos) = ev->y; cpos = spos; break;
                     67:                case Button3:
                     68:                        XC(p) = ev->x; YC(p) = ev->y; draw_coord(can,&p); break;
                     69:                default:
                     70:                        break;
                     71:        }
                     72: }
                     73:
                     74: void motion(w,can,ev)
                     75: Widget w;
                     76: struct canvas *can;
                     77: XMotionEvent *ev;
                     78: {
                     79:
                     80:        POINT o,p;
                     81:
                     82:        if ( ev->state & Button1Mask ) {
                     83:                o = cpos; XC(cpos) = ev->x; YC(cpos) = ev->y;
                     84:                draw_frame(can->window,spos,o,cpos);
                     85:        } else if ( ev->state & Button3Mask ) {
                     86:                XC(p) = ev->x; YC(p) = ev->y;
                     87:                draw_coord(can,p);
                     88:        }
                     89: }
                     90:
                     91: void release(w,can,ev)
                     92: Widget w;
                     93: struct canvas *can;
                     94: XButtonEvent *ev;
                     95: {
                     96:        POINT e;
                     97:
                     98:        switch ( ev->button ) {
                     99:                case Button1:
                    100:                        e.x = ev->x; e.y = ev->y;
                    101:                        draw_frame0(can->window,spos,e);
                    102:                        if ( !busy ) {
                    103:                                if ( can->mode == MODE_PLOT )
                    104:                                        plot_resize(can,spos,e);
                    105:                                else
                    106:                                        ifplot_resize(can,spos,e);
                    107:                        }
                    108:                        break;
                    109:                default:
                    110:                        break;
                    111:        }
                    112: }
                    113:
                    114: void structure(w,can,ev)
                    115: Widget w;
                    116: struct canvas *can;
                    117: XEvent *ev;
                    118: {
                    119:        switch ( ev->xany.type ) {
                    120:                case Expose:
                    121:                                if ( !ev->xexpose.count )
                    122:                                        redraw_canvas(can);
                    123:                        break;
                    124:                case ConfigureNotify:
                    125:                        redraw_canvas(can); break;
                    126:                default:
                    127:                        break;
                    128:        }
                    129: }
                    130:
                    131: static int lindex;
                    132:
                    133: void lpress(w,can,ev)
                    134: Widget w;
                    135: struct canvas *can;
                    136: XButtonEvent *ev;
                    137: {
                    138:        lindex = (can->height-ev->y)/(can->height/can->nzstep);
                    139:        draw_level(can,lindex,hlGC);
                    140: }
                    141:
                    142: void jumpproc(w,can,percent)
                    143: Widget w;
                    144: struct canvas *can;
                    145: float *percent;
                    146: {
                    147:        int index;
                    148:
                    149:        index = can->nzstep * (1.0-*percent);
                    150:        if ( index == lindex )
                    151:                return;
                    152:        if ( lindex >= 0 )
                    153:                draw_level(can,lindex,drawGC);
                    154:        lindex = index;
                    155:        draw_level(can,lindex,hlGC);
                    156: }
                    157:
                    158: void jumpproc_m(w,can,percent)
                    159: Widget w;
                    160: struct canvas *can;
                    161: float *percent;
                    162: {
                    163:        int index;
                    164:
                    165:        index = can->nzstep * (1.0-*percent);
                    166:        if ( index != lindex ) {
                    167:                draw_level(can,lindex,drawGC);
                    168:                draw_level(can,lindex,hlGC);
                    169:        }
                    170: }
                    171:
                    172: void lrelease(w,can,ev)
                    173: Widget w;
                    174: struct canvas *can;
                    175: XButtonEvent *ev;
                    176: {
                    177:        draw_level(can,lindex,drawGC); lindex = -1;
                    178: }
                    179:
                    180: void lrelease_m(w,can,ev)
                    181: Widget w;
                    182: struct canvas *can;
                    183: XButtonEvent *ev;
                    184: {
                    185:        lindex = -1;
                    186: }
                    187:
                    188: draw_level(can,index,gc)
                    189: struct canvas *can;
                    190: int index;
                    191: GC gc;
                    192: {
                    193:        Pixmap pix;
                    194:        struct pa *pa;
                    195:        int i,len;
                    196:        POINT *p;
                    197:        Arg arg[2];
                    198:        char buf[BUFSIZ];
                    199:
                    200:        if ( busy || can->wide || index < 0 || index > can->nzstep )
                    201:                return;
                    202:        pix = can->pix; pa = &can->pa[index]; len = pa->length; p = pa->pos;
                    203:        for ( i = 0; i < len; i++ )
                    204:                XDrawPoint(display,pix,gc,p[i].x,p[i].y);
                    205:        sprintf(buf,"level:%g",can->zmin+(can->zmax-can->zmin)*index/can->nzstep);
                    206:        XtSetArg(arg[0],XtNlabel,buf); XtSetArg(arg[1],XtNwidth,LABELWIDTH);
                    207:        XtSetValues(can->level,arg,2);
                    208:        copy_to_canvas(can);
                    209: }
                    210:
                    211: draw_frame(window,spos,opos,epos)
                    212: Window window;
                    213: POINT spos,opos,epos;
                    214: {
                    215:        if ( XC(opos) != XC(epos) || YC(opos) != YC(epos) )
                    216:                draw_frame0(window,spos,opos);
                    217:        draw_frame0(window,spos,epos);
                    218: }
                    219:
                    220: draw_frame0(window,spos,epos)
                    221: Window window;
                    222: POINT spos,epos;
                    223: {
                    224:        int ulx,uly,w,h;
                    225:
                    226:        ulx = MIN(XC(spos),XC(epos)); uly = MIN(YC(spos),YC(epos));
                    227:        w = ABS(XC(spos)-XC(epos)); h = ABS(YC(spos)-YC(epos));
                    228:        if ( !w || !h )
                    229:                return;
                    230:        XDrawRectangle(display,window,xorGC,ulx,uly,w,h);
                    231:        XFlush(display);
                    232: }
                    233:
                    234: draw_coord(can,pos)
                    235: struct canvas *can;
                    236: POINT pos;
                    237: {
                    238:        char buf[BUFSIZ];
                    239:        Arg arg[2];
                    240:        double x,y,xmin,ymax,dx,dy;
                    241:
                    242:        if ( can->wide ) {
                    243:                dx = 10*(can->xmax-can->xmin); dy = 10*(can->ymax-can->ymin);
                    244:                xmin = (can->xmax+can->xmin-dx)/2;
                    245:                ymax = (can->ymax+can->ymin+dy)/2;
                    246:        } else {
                    247:                dx = can->xmax-can->xmin; dy = can->ymax-can->ymin;
                    248:                xmin = can->xmin; ymax = can->ymax;
                    249:        }
                    250:        x = xmin+XC(pos)*dx/can->width;
                    251:        y = ymax-YC(pos)*dy/can->height;
                    252:        sprintf(buf,"%s:%g",can->vx?can->vx->name:"horiz",x);
                    253:        XtSetArg(arg[0],XtNlabel,buf); XtSetArg(arg[1],XtNwidth,LABELWIDTH);
                    254:        XtSetValues(can->xcoord,arg,2);
                    255:        sprintf(buf,"%s:%g",can->vy?can->vy->name:"vert",y);
                    256:        XtSetArg(arg[0],XtNlabel,buf); XtSetArg(arg[1],XtNwidth,LABELWIDTH);
                    257:        XtSetValues(can->ycoord,arg,2);
                    258: }
                    259:
                    260: redraw_canvas(can)
                    261: struct canvas *can;
                    262: {
                    263:        if ( can->wide )
                    264:                draw_wideframe(can);
                    265:        else
                    266:                copy_to_canvas(can);
                    267: }
                    268:
                    269: search_canvas()
                    270: {
                    271:        int i;
                    272:
                    273:        for ( i = 0; i < MAXCANVAS; i++ )
                    274:                if ( !canvas[i] ) {
                    275:                        canvas[i] = (struct canvas *)MALLOC(sizeof(struct canvas));
                    276:                        canvas[i]->index = i; return i;
                    277:                }
                    278: }
                    279:
                    280: search_active_canvas()
                    281: {
                    282:        int i;
                    283:
                    284:        for ( i = 0; i < MAXCANVAS; i++ )
                    285:                if ( canvas[i] )
                    286:                        return i;
                    287:        return -1;
                    288: }
                    289:
                    290: void destroy_canvas(w,can,calldata)
                    291: Widget w;
                    292: struct canvas *can;
                    293: XtPointer calldata;
                    294: {
                    295:        XtPopdown(can->shell);
                    296:        XtDestroyWidget(can->shell);
                    297:        XFlush(display);
                    298:        if ( can == current_can ) {
                    299:                reset_busy(can); current_can = 0;
                    300:        }
                    301:        canvas[can->index] = 0;
                    302: }
                    303:
                    304: void precise_canvas(w,can,calldata)
                    305: Widget w;
                    306: struct canvas *can;
                    307: XtPointer calldata;
                    308: {
                    309:        if ( can->precise )
                    310:                can->precise = 0;
                    311:        else
                    312:                can->precise = 1;
                    313: }
                    314:
                    315: void wide_canvas(w,can,calldata)
                    316: Widget w;
                    317: struct canvas *can;
                    318: XtPointer calldata;
                    319: {
                    320:        if ( can->wide ) {
                    321:                can->wide = 0; copy_to_canvas(can);
                    322:        } else {
                    323:                can->wide = 1; draw_wideframe(can);
                    324:        }
                    325: }
                    326:
                    327: void noaxis_canvas(w,can,calldata)
                    328: Widget w;
                    329: struct canvas *can;
                    330: XtPointer calldata;
                    331: {
                    332:        if ( can->noaxis )
                    333:                can->noaxis = 0;
                    334:        else
                    335:                can->noaxis = 1;
                    336:        if ( can->wide )
                    337:                draw_wideframe(can);
                    338:        else
                    339:                copy_to_canvas(can);
                    340: }
                    341:
                    342: toggle_button(w,flag)
                    343: Widget w;
                    344: int flag;
                    345: {
                    346:        Arg arg[2];
                    347:
                    348:        if ( flag ) {
                    349:                XtSetArg(arg[0],XtNforeground,backPixel);
                    350:                XtSetArg(arg[1],XtNbackground,forePixel);
                    351:        } else {
                    352:                XtSetArg(arg[0],XtNforeground,forePixel);
                    353:                XtSetArg(arg[1],XtNbackground,backPixel);
                    354:        }
                    355:        XtSetValues(w,arg,2); XFlush(display);
                    356: }
                    357:
                    358: draw_wideframe(can)
                    359: struct canvas *can;
                    360: {
                    361:        struct canvas fakecan;
                    362:        double xmin,xmax,ymin,ymax,xmid,ymid,dx,dy;
                    363:        POINT s,e;
                    364:
                    365:        fakecan = *can;
                    366:        dx = 10*(can->xmax-can->xmin); dy = 10*(can->ymax-can->ymin);
                    367:        xmid = (can->xmax+can->xmin)/2; ymid = (can->ymax+can->ymin)/2;
                    368:
                    369:        fakecan.xmin = xmid-dx/2; fakecan.xmax = xmid+dx/2;
                    370:        fakecan.ymin = ymid-dy/2; fakecan.ymax = ymid+dy/2;
                    371:
                    372:        XFillRectangle(display,can->window,clearGC,
                    373:                0,0,can->width,can->height);
                    374:        pline(display,&fakecan,can->window);
                    375:        XC(s) = can->width*9/20; YC(s) = can->height*9/20;
                    376:        XC(e) = can->width*11/20; YC(e) = can->height*11/20;
                    377:        draw_frame0(can->window,s,e);
                    378: }
                    379:
                    380: create_popup(parent,name,str,shell,dialog)
                    381: Widget parent;
                    382: char *name,*str;
                    383: Widget *shell,*dialog;
                    384: {
                    385:        Arg arg[3];
                    386:        Position x,y;
                    387:
                    388:        XtTranslateCoords(parent,0,0,&x,&y);
                    389:        XtSetArg(arg[0],XtNx,x); XtSetArg(arg[1],XtNy,y);
                    390:        *shell = XtCreatePopupShell(name,transientShellWidgetClass,parent,arg,2);
                    391:        XtSetArg(arg[0],XtNlabel,str);
                    392:        *dialog = XtCreateManagedWidget("dialog",dialogWidgetClass,*shell,arg,1);
                    393: }
                    394:
                    395: warning(can,s)
                    396: struct canvas *can;
                    397: char *s;
                    398: {
                    399:        void popdown_warning();
                    400:        Widget warnshell,warndialog;
                    401:        Position x,y;
                    402:        Arg arg[3];
                    403:
                    404:        if ( !can->shell )
                    405:                return;
                    406:        create_popup(can->shell,"warning",s,&warnshell,&warndialog);
                    407:        XawDialogAddButton(warndialog,"dismiss",popdown_warning,warnshell);
                    408:        XtPopup(warnshell,XtGrabNone);
                    409: }
                    410:
                    411: void popdown_warning(w,client,call)
                    412: Widget w;
                    413: XtPointer client,call;
                    414: {
                    415:        XtPopdown(client); XtDestroyWidget(client);
                    416: }
                    417:
                    418: void show_formula(w,can,calldata)
                    419: Widget w;
                    420: struct canvas *can;
                    421: XtPointer calldata;
                    422: {
                    423:        void popdown_formula();
                    424:        Widget fshell,fdialog;
                    425:        char buf[BUFSIZ];
                    426:
                    427:        soutput_init(buf); sprintexpr(CO,(Obj)can->formula);
                    428:        create_popup(can->shell,"formula",buf,&fshell,&fdialog);
                    429:        XawDialogAddButton(fdialog,"dismiss",popdown_formula,w);
                    430:        XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone);
                    431: }
                    432:
                    433: void popdown_formula(w,fbutton,call)
                    434: Widget w,fbutton;
                    435: XtPointer call;
                    436: {
                    437:        Widget shell = XtParent(XtParent(w));
                    438:        XtPopdown(shell); XtDestroyWidget(shell);
                    439:        XtSetSensitive(fbutton,True);
                    440: }
                    441:
                    442: #define NormalSelection ButtonPressMask|ButtonReleaseMask|Button1MotionMask|Button3MotionMask|StructureNotifyMask| ExposureMask
                    443:
                    444: create_canvas(can)
                    445: struct canvas *can;
                    446: {
                    447:        XEvent event;
                    448:        Widget box,frame,commands,
                    449:                coords,quit,wide,precise,canvas,formula;
                    450:        Window window;
                    451:        Pixmap pix;
                    452:        int i,width,height;
                    453:        Arg arg[6];
                    454:        char buf[BUFSIZ];
                    455:
                    456:        width = can->width; height = can->height;
                    457:
                    458:        sprintf(buf,"%s : %d/%d", can->wname?can->wname:"Plot",
                    459:                remotes,can->index);
                    460:        XtSetArg(arg[0],XtNiconName,buf);
                    461:        can->shell =
                    462:                XtCreatePopupShell("shell",topLevelShellWidgetClass,toplevel,arg,1);
                    463:
                    464:        XtSetArg(arg[0],XtNhSpace,0);
                    465:        XtSetArg(arg[1],XtNvSpace,0);
                    466:        XtSetArg(arg[2],XtNborderWidth,0);
                    467:        box = XtCreateManagedWidget("box",boxWidgetClass,can->shell,arg,3);
                    468:
                    469:        frame = XtCreateManagedWidget("form",formWidgetClass,box,NULL,0);
                    470:
                    471:        XtSetArg(arg[0],XtNorientation,XtorientHorizontal);
                    472:        XtSetArg(arg[1],XtNborderWidth,0);
                    473:        commands = XtCreateManagedWidget("commands",boxWidgetClass,frame,arg,2);
                    474:
                    475:        quit = XtCreateManagedWidget("quit",commandWidgetClass,commands,NULL,0);
                    476:        XtAddCallback(quit,XtNcallback,destroy_canvas,can);
                    477:        can->wideb = wide =
                    478:                XtCreateManagedWidget("wide",toggleWidgetClass,commands,NULL,0);
                    479:        XtAddCallback(wide,XtNcallback,wide_canvas,can);
                    480:        can->preciseb = precise =
                    481:                XtCreateManagedWidget("precise",toggleWidgetClass,commands,NULL,0);
                    482:        XtAddCallback(precise,XtNcallback,precise_canvas,can);
                    483:        formula =
                    484:                XtCreateManagedWidget("formula",commandWidgetClass,commands,NULL,0);
                    485:        XtAddCallback(formula,XtNcallback,show_formula,can);
                    486:        can->noaxisb =
                    487:                XtCreateManagedWidget("noaxis",toggleWidgetClass,commands,NULL,0);
                    488:        XtAddCallback(can->noaxisb,XtNcallback,noaxis_canvas,can);
                    489:
                    490:        XtSetArg(arg[0],XtNfromVert,commands);
                    491:        XtSetArg(arg[1],XtNwidth,width);
                    492:        XtSetArg(arg[2],XtNheight,height);
                    493:        canvas = XtCreateManagedWidget("canvas",simpleWidgetClass,frame,arg,3);
                    494:
                    495:        XtSetArg(arg[0],XtNfromVert,canvas);
                    496:        XtSetArg(arg[1],XtNheight,5);
                    497:        XtSetArg(arg[2],XtNwidth,width);
                    498:        XtSetArg(arg[3],XtNorientation,XtorientHorizontal);
                    499:        XtSetArg(arg[4],XtNsensitive,False);
                    500:        can->xdone =
                    501:                XtCreateManagedWidget("xdone",scrollbarWidgetClass,frame,arg,5);
                    502:
                    503:        XtSetArg(arg[0],XtNfromHoriz,canvas);
                    504:        XtSetArg(arg[1],XtNfromVert,commands);
                    505:        XtSetArg(arg[2],XtNwidth,5);
                    506:        XtSetArg(arg[3],XtNheight,height);
                    507:        XtSetArg(arg[4],XtNorientation,XtorientVertical);
                    508:        XtSetArg(arg[5],XtNsensitive,False);
                    509:        can->ydone =
                    510:                XtCreateManagedWidget("ydone",scrollbarWidgetClass,frame,arg,6);
                    511:
                    512:        XtSetArg(arg[0],XtNfromVert,can->xdone);
                    513:        XtSetArg(arg[1],XtNorientation,XtorientHorizontal);
                    514:        XtSetArg(arg[2],XtNborderWidth,0);
                    515:        coords = XtCreateManagedWidget("coords",boxWidgetClass,frame,arg,3);
                    516:
                    517:        XtSetArg(arg[0],XtNwidth,LABELWIDTH);
                    518:        can->xcoord = XtCreateManagedWidget("xcoord",labelWidgetClass,coords,arg,1);
                    519:        XtSetArg(arg[0],XtNwidth,LABELWIDTH);
                    520:        can->ycoord = XtCreateManagedWidget("ycoord",labelWidgetClass,coords,arg,1);
                    521:
                    522:        XtAddEventHandler(canvas,ButtonPressMask,False,press,can);
                    523:        XtAddEventHandler(canvas,ButtonReleaseMask,False,release,can);
                    524:        XtAddEventHandler(canvas,Button1MotionMask,False,motion,can);
                    525:        XtAddEventHandler(canvas,Button3MotionMask,False,motion,can);
                    526:        XtAddEventHandler(canvas,StructureNotifyMask,False,structure,can);
                    527:        XtAddEventHandler(canvas,ExposureMask,False,structure,can);
                    528:
                    529:        if ( can->mode == MODE_CONPLOT ) {
                    530:                Widget scale;
                    531:
                    532:                XtSetArg(arg[0],XtNwidth,LABELWIDTH);
                    533:                can->level = XtCreateManagedWidget("level",labelWidgetClass,
                    534:                        commands,arg,1);
                    535:
                    536:                XtSetArg(arg[0],XtNsensitive,True);
                    537:                XtSetValues(can->ydone,arg,1);
                    538:                if ( depth >= 2 ) {
                    539:                        XtAddCallback(can->ydone,XtNjumpProc,jumpproc,can);
                    540:                        XtAddEventHandler(can->ydone,ButtonReleaseMask,False,lrelease,can);
                    541:                } else {
                    542:                        XtAddCallback(can->ydone,XtNjumpProc,jumpproc_m,can);
                    543:                        XtAddEventHandler(can->ydone,ButtonReleaseMask,False,lrelease_m,can);
                    544:                }
                    545:        }
                    546:        if ( can->mode != MODE_IFPLOT || !qpcheck((Obj)can->formula) )
                    547:                XtSetSensitive(precise,False);
                    548:        XtPopup(can->shell,XtGrabNone);
                    549:
                    550:        window = can->window = XtWindow(canvas);
                    551:        pix = can->pix = XCreatePixmap(display,window,width,height,depth);
                    552:        XFillRectangle(display,pix,clearGC,0,0,width,height);
                    553:        XDefineCursor(display,window,normalcur);
                    554:        XFlush(display);
                    555:        current_can = can;
                    556: }
                    557:
                    558: alloc_pixmap(can)
                    559: struct canvas *can;
                    560: {
                    561:        can->pix = XCreatePixmap(display,can->window,
                    562:                can->width,can->height,depth);
                    563:        XFillRectangle(display,can->pix,clearGC,0,0,can->width,can->height);
                    564: }
                    565:
                    566: static XrmOptionDescRec options[] = {
                    567: {"-reverse","*reverse",XrmoptionNoArg,"on"},
                    568: {"-fg","*foreground",XrmoptionSepArg,NULL},
                    569: {"-bg","*background",XrmoptionSepArg,NULL},
                    570: };
                    571:
                    572: #define offset(name) XtOffset(struct PlotResources *,name)
                    573:
                    574: static XtResource resources[] = {
                    575: {"reverse","Reverse",XtRBoolean,sizeof(Boolean),
                    576:        offset(Reverse),XtRBoolean,&reverse},
                    577: {"foreground","Foreground",XtRString,sizeof(char *),
                    578:        offset(ForeName),XtRString,NULL},
                    579: {"foreground","Foreground",XtRPixel,sizeof(Pixel),
                    580:        offset(ForePixel),XtRPixel,(XtPointer)&forePixel},
                    581: {"background","Background",XtRString,sizeof(char *),
                    582:        offset(BackName),XtRString,NULL},
                    583: {"background","Background",XtRPixel,sizeof(Pixel),
                    584:        offset(BackPixel),XtRPixel,(XtPointer)&backPixel},
                    585: {"dash","Dash",XtRString,sizeof(char *),
                    586:        offset(DashName),XtRString,NULL},
                    587: {"dash","Dash",XtRPixel,sizeof(Pixel),
                    588:        offset(DashPixel),XtRPixel,(XtPointer)&dashPixel},
                    589: };
                    590:
                    591: init_plot_display(argc,argv)
                    592: int argc;
                    593: char **argv;
                    594: {
                    595:        int ac;
                    596:        char **av;
                    597:        unsigned int tmp;
                    598:
                    599:        for ( ac = argc, av = argv; ac; ac--, av++ )
                    600:                if ( index(*av,':') )
                    601:                        dname = *av;
                    602:        XtToolkitInitialize();
                    603:        app_con = XtCreateApplicationContext();
                    604:        display = XtOpenDisplay(app_con,dname,"plot","Plot",
                    605:                options,XtNumber(options),&argc,argv);
                    606:        if ( !display ) {
                    607:                fprintf(stderr,"Can't open display\n");
                    608:                exit(1);
                    609:        }
                    610:        toplevel = XtAppCreateShell(0,"Plot",applicationShellWidgetClass,
                    611:                display,0,0);
                    612:
                    613:        forePixel = blackPixel; backPixel = whitePixel;
                    614:        dashPixel = blackPixel;
                    615:        XtGetApplicationResources(toplevel,&PlotResources,
                    616:                resources,XtNumber(resources),NULL,0);
                    617:        display = XtDisplay(toplevel);
                    618:        scrn = DefaultScreen(display);
                    619:        depth = DefaultDepth(display,scrn);
                    620:        rootwin = RootWindow(display,scrn);
                    621:
                    622:        if ( reverse ) {
                    623:                tmp = forePixel; forePixel = backPixel; backPixel = tmp;
                    624:        }
                    625:
                    626:        create_gc();
                    627:        create_font();
                    628:        create_cursors();
                    629: }
                    630:
                    631: static char *scalefont = "*-8-80-*";
                    632:
                    633: create_font() {
                    634:        Font sfid;
                    635:
                    636:        sfid = XLoadFont(display,scalefont);
                    637:        sffs = XQueryFont(display,sfid);
                    638:        XSetFont(display,scaleGC,sfid);
                    639: }
                    640:
                    641: create_gc() {
                    642:        static XColor color = {0,0x0,0x0,0x0,DoRed|DoGreen|DoBlue,0};
                    643:        int i,b,step;
                    644:
                    645:        drawGC = XCreateGC(display,rootwin,0,NULL);
                    646:        dashGC = XCreateGC(display,rootwin,0,NULL);
                    647:        hlGC = XCreateGC(display,rootwin,0,NULL);
                    648:        clearGC = XCreateGC(display,rootwin,0,NULL);
                    649:        scaleGC = XCreateGC(display,rootwin,0,NULL);
                    650:        xorGC = XCreateGC(display,rootwin,0,NULL);
                    651:        colorGC = XCreateGC(display,rootwin,0,NULL);
                    652:        XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,drawGC);
                    653:        XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,dashGC);
                    654:        XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,clearGC);
                    655:        XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,scaleGC);
                    656:        XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,xorGC);
                    657:        XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,colorGC);
                    658:        XSetForeground(display,drawGC,forePixel);
                    659:        XSetForeground(display,scaleGC,forePixel);
                    660:        XSetForeground(display,clearGC,backPixel);
                    661:        XSetForeground(display,xorGC,forePixel^backPixel);
                    662:        XSetFunction(display,xorGC,GXxor);
                    663:        XSetForeground(display,dashGC,dashPixel);
                    664:        XSetLineAttributes(display,dashGC,1,LineOnOffDash,CapButt,JoinRound);
                    665:
                    666:        color.red = color.green = color.blue = 0xffff/2;
                    667:        XAllocColor(display,DefaultColormap(display,scrn),&color);
                    668:        XSetForeground(display,hlGC,color.pixel);
                    669:        color.red = 0xffff; color.green = color.blue = 0;
                    670:        XAllocColor(display,DefaultColormap(display,scrn),&color);
                    671:        XSetForeground(display,colorGC,color.pixel);
                    672: }
                    673:
                    674: create_cursors() {
                    675:        static XColor fg = {0, 0x0, 0x0, 0x0,DoRed|DoGreen|DoBlue,0};
                    676:        static XColor bg = {0, 0xffff, 0xffff, 0xffff,DoRed|DoGreen|DoBlue,0};
                    677:
                    678:        XAllocColor(display,DefaultColormap(display,scrn),&fg);
                    679:        XAllocColor(display,DefaultColormap(display,scrn),&bg);
                    680:        normalcur = create_cursor(h_bits,h_m_bits,h_width,h_height,
                    681:                h_x_hot,h_y_hot,&fg,&bg);
                    682:        runningcur = create_cursor(ht_bits,ht_m_bits,ht_width,ht_height,
                    683:                ht_width/2,ht_height/2,&fg,&bg);
                    684:        errorcur = create_cursor(m_bits,m_m_bits,m_width,m_height,
                    685:                m_width/2,m_height/2,&fg,&bg);
                    686: }
                    687:
                    688: Cursor create_cursor(image,mask,width,height,xhot,yhot,fg,bg)
                    689: char *image,*mask;
                    690: int width,height,xhot,yhot;
                    691: XColor *fg,*bg;
                    692: {
                    693:        Pixmap ipix,mpix;
                    694:
                    695:        ipix = XCreateBitmapFromData(display,rootwin,image,width,height);
                    696:        mpix = XCreateBitmapFromData(display,rootwin,mask,width,height);
                    697:        return XCreatePixmapCursor(display,ipix,mpix,fg,bg,xhot,yhot);
                    698: }
                    699:
                    700: copy_to_canvas(can)
                    701: struct canvas *can;
                    702: {
                    703:        if ( display ) {
                    704:                XCopyArea(display,can->pix,can->window,
                    705:                        drawGC,0,0,can->width,can->height,0,0);
                    706:                pline(display,can,can->window);
                    707:                XFlush(display);
                    708:        }
                    709: }
                    710:
                    711: copy_subimage(subcan,can,pos)
                    712: struct canvas *subcan,*can;
                    713: XPoint pos;
                    714: {
                    715:        if ( display ) {
                    716:                XCopyArea(display,subcan->pix,can->pix,
                    717:                        drawGC,0,0,subcan->width,subcan->height,pos.x,pos.y);
                    718:                XFlush(display);
                    719:        }
                    720: }
                    721:
                    722: #include <signal.h>
                    723: #include <fcntl.h>
                    724:
                    725: set_selection() {
                    726:        if ( current_can ) {
                    727:                XSelectInput(display,current_can->window,0);
                    728:                XFlush(display);
                    729:        }
                    730: }
                    731:
                    732: reset_selection() {
                    733:        if ( current_can ) {
                    734:                XSelectInput(display,current_can->window,NormalSelection);
                    735:                XFlush(display);
                    736:        }
                    737: }
                    738:
                    739: set_busy(can)
                    740: struct canvas *can;
                    741: {
                    742:        busy = 1;
                    743:        XtSetSensitive(can->wideb,False);
                    744:        XtSetSensitive(can->preciseb,False);
                    745:        XtSetSensitive(can->noaxisb,False);
                    746:        XFlush(display);
                    747: }
                    748:
                    749: reset_busy(can)
                    750: struct canvas *can;
                    751: {
                    752:        busy = 0;
                    753:        if ( can->window ) {
                    754:                XtSetSensitive(can->wideb,True);
                    755:                XtSetSensitive(can->noaxisb,True);
                    756:                if ( can->mode == MODE_IFPLOT && qpcheck((Obj)can->formula) )
                    757:                        XtSetSensitive(can->preciseb,True);
                    758:                XFlush(display);
                    759:        }
                    760: }
                    761:
                    762: reset_current_computation()
                    763: {
                    764:        if ( current_can ) {
                    765:                reset_selection(); reset_busy(current_can);
                    766:                define_cursor(current_can->window,normalcur);
                    767:        }
                    768: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>