[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     ! 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>