Annotation of 43BSD/contrib/X/xgedit/gx.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright    Massachusetts Institute of Technology    1984, 1985    */
        !             4: 
        !             5: #include "gedit.h"
        !             6: #include <X/Xlib.h>
        !             7: 
        !             8: #ifndef lint
        !             9: static char *rcsid_gx_c = "$Header: gx.c,v 10.6 86/02/01 16:19:07 tony Rel $";
        !            10: #endif lint
        !            11: 
        !            12: char *index();
        !            13: 
        !            14: static short crbits[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        !            15: 
        !            16: Window w, trw;
        !            17: Font font;
        !            18: int forepix, backpix, invplanes;
        !            19: 
        !            20: char mousechanged;
        !            21: short mousex, mousey;
        !            22: 
        !            23: short wminx;   /* lower left of display window */
        !            24: short wminy;
        !            25: short wmaxx;   /* upper right of display window */
        !            26: short wmaxy;
        !            27: short chrwid;
        !            28: short chrhgt;
        !            29: 
        !            30: /* command dispatch per key */
        !            31: fptr dispatch[256];
        !            32: 
        !            33: /* used to fill in dispatch upon initialization */
        !            34: int mleft(),newlabel(),stop(),delobj(),editobj(),mright(),toggle();
        !            35: int quit(),instantiate(),newline(),redisplay(),mdown(),neworg();
        !            36: int mup(),rotateobj(),selobj(),multiplier(),setwindow(),scale();
        !            37: int letgo(),rescale(),newin(),newout(),snap(),curup(),curdown();
        !            38: int home(),setcolor(),lastgo(),angle(),Help();
        !            39: int editlast(), scaleup(), scaledn(), fixwindow();
        !            40: 
        !            41: struct icmd { char *keys; fptr func; } cmds[] = {
        !            42:   "[",                 scaleup,
        !            43:   "]",                 scaledn,
        !            44:   "Aa\001",            angle,
        !            45:   "Bb\002Hh\010",      mleft,
        !            46:   "Cc",                        newlabel,
        !            47:   "\003\021",          stop,
        !            48:   "Dd\004",            delobj,
        !            49:   "Ee\005",            editobj,
        !            50:   "Ff\006",            mright,
        !            51:   "Gg",                        toggle,
        !            52:   "\007",              quit,
        !            53:   "Hh",                        Help,
        !            54:   "Ii",                        instantiate,
        !            55:   "Ll",                        newline,
        !            56:   "Mm",                        lastgo,
        !            57:   "\014",              redisplay,
        !            58:   "Nn\016",            mdown,
        !            59:   "\017",              neworg,
        !            60:   "Pp\020",            mup,
        !            61:   "Rr\022",            rotateobj,
        !            62:   "Ss\023",            selobj,
        !            63:   "Uu\025",            multiplier,
        !            64:   "Ww\027",            setwindow,
        !            65:   "Xx\030",            scale,
        !            66:   "Zz\032 ",           letgo,
        !            67:   "^",                 editlast,
        !            68:   "*",                 rescale,
        !            69:   "<",                 newin,
        !            70:   ">",                 newout,
        !            71:   "!",                 snap,
        !            72:   "+",                 curup,
        !            73:   "-",                 curdown,
        !            74:   "@",                 home,
        !            75:   "\031",              fixwindow,
        !            76:   NULL, NULL
        !            77: };
        !            78: 
        !            79: /* see if there is input ready from the user */
        !            80: UserReady()
        !            81:  {     XEvent ev;
        !            82:        int n, x, y;
        !            83:        Window sub;
        !            84: 
        !            85:        while (XPending()) {
        !            86:                XPeekEvent(&ev);
        !            87:                switch (ev.type) {
        !            88:                case MouseMoved:
        !            89:                        mousechanged = 1;
        !            90:                        XNextEvent(&ev);
        !            91:                        XUpdateMouse(w, &x, &y, &sub);
        !            92:                        mousex = x;
        !            93:                        mousey = y;
        !            94:                        return(1);
        !            95:                case ButtonPressed:
        !            96:                        return(1);
        !            97:                case KeyPressed:
        !            98:                        XLookupMapping((XKeyPressedEvent *)(&ev), &n);
        !            99:                        if (n == 1) return (1);
        !           100:                        XNextEvent(&ev);
        !           101:                        break;
        !           102:                case ExposeRegion:
        !           103:                case ExposeWindow:
        !           104:                        return(1);
        !           105:                }
        !           106:        }
        !           107:        return(0);
        !           108: }
        !           109: 
        !           110: /* get character from user */
        !           111: UserChar()
        !           112:  {     XEvent ev;
        !           113:        int n;
        !           114:        char *str;
        !           115: 
        !           116:        while (1) {
        !           117:                XNextEvent(&ev);
        !           118:                switch (ev.type) {
        !           119:                case ButtonPressed:
        !           120:                        n = ((XButtonPressedEvent *) (&ev))->detail & ValueMask;
        !           121:                        switch (n) {
        !           122:                        case LeftButton:
        !           123:                                return('l');
        !           124:                        case MiddleButton:
        !           125:                                return('z');
        !           126:                        case RightButton:
        !           127:                                return('s');
        !           128:                        }
        !           129:                        break;
        !           130:                case KeyPressed:
        !           131:                        str = XLookupMapping((XKeyPressedEvent *)(&ev), &n);
        !           132:                        if (n == 1) return (*str);
        !           133:                        break;
        !           134:                case ExposeRegion:
        !           135:                        return('\014');
        !           136:                case ExposeWindow:
        !           137:                        if (((XExposeWindowEvent *) (&ev))->width == wmaxx &&
        !           138:                            ((XExposeWindowEvent *) (&ev))->height == wmaxy)
        !           139:                                return('\014');
        !           140:                        wmaxx = ((XExposeWindowEvent *) (&ev))->width;
        !           141:                        wmaxy = ((XExposeWindowEvent *) (&ev))->height;
        !           142:                        XChangeWindow(trw, wmaxx, wmaxy - (chrhgt << 1));
        !           143:                        return('\031');
        !           144:                }
        !           145:        }
        !           146: }
        !           147: 
        !           148: 
        !           149: /* display grid */
        !           150: drawgrid(x,y,incrx,incry)
        !           151:   {    int i;
        !           152:        Vertex vert[2];
        !           153: 
        !           154:        if (incrx <= 16) {
        !           155:                vert[0].x = x;
        !           156:                vert[0].flags = 0;
        !           157:                vert[1].x = wmaxx;
        !           158:                vert[1].flags = 0;
        !           159:                while (y > 0) {
        !           160:                        vert[0].y = y;
        !           161:                        vert[1].y = y;
        !           162:                        XDrawDashed(trw, vert, 2, 1, 1, forepix,
        !           163:                                    XMakePattern(1, incrx, 1), GXcopy, AllPlanes);
        !           164:                        y -= incry;
        !           165:                }
        !           166:                XClearVertexFlag();
        !           167:        } else if (incry <= 16) {
        !           168:                vert[0].y = y;
        !           169:                vert[0].flags = 0;
        !           170:                vert[1].y = 0;
        !           171:                vert[1].flags = 0;
        !           172:                while (x < wmaxx) {
        !           173:                        vert[0].x = x;
        !           174:                        vert[1].x = x;
        !           175:                        XDrawDashed(trw, vert, 2, 1, 1, forepix,
        !           176:                                    XMakePattern(1, incry, 1), GXcopy, AllPlanes);
        !           177:                        x += incrx;
        !           178:                }
        !           179:                XClearVertexFlag();
        !           180:        } else {
        !           181:                while (x < wmaxx) {
        !           182:                  for (i = y; i > 0; i -= incry) {
        !           183:                    XPixSet(trw, x, i, 1, 1, forepix);
        !           184:                  }
        !           185:                  x += incrx;
        !           186:                }
        !           187:        }
        !           188: }
        !           189: 
        !           190: /* set up display adaptor for 80x25 alpha color, release keyboard */
        !           191: gexit()
        !           192:   {
        !           193: }
        !           194: 
        !           195: track()
        !           196:  {     int x,y;
        !           197:        int code = 0;
        !           198: 
        !           199:        mousechanged = 0;
        !           200: 
        !           201:        x = mousex * cur_state.dscale;
        !           202:        y = (wmaxy - mousey) * cur_state.dscale;
        !           203:        x += cur_state.worgx;
        !           204:        y += cur_state.worgy;
        !           205: 
        !           206:        if (x!=cur_state.curx || y!=cur_state.cury) {
        !           207:          if (x >= cur_state.wmaxx)
        !           208:                x = cur_state.wmaxx - 1;
        !           209:          else if (x < cur_state.worgx)
        !           210:                x = cur_state.worgx;
        !           211:          if (y >= cur_state.wmaxy)
        !           212:                y = cur_state.wmaxy - 1;
        !           213:          else if (y < cur_state.worgy)
        !           214:                y = cur_state.worgy;
        !           215:          cur_state.curx = x;
        !           216:          cur_state.cury = y;
        !           217:        }
        !           218: 
        !           219:        return(code);
        !           220: }
        !           221: 
        !           222: remouse(x, y, doit)
        !           223:  {     
        !           224:        if (x >= cur_state.wmaxx || x < cur_state.worgx ||
        !           225:            y >= cur_state.wmaxy || y < cur_state.worgy) {
        !           226:                cur_state.curx = x;
        !           227:                cur_state.cury = y;
        !           228:                return(RECENTER);
        !           229:        }
        !           230:        if (doit || (x != cur_state.curx || y != cur_state.cury)) {
        !           231:                cur_state.curx = x;
        !           232:                cur_state.cury = y;
        !           233:                x -= cur_state.worgx;
        !           234:                y -= cur_state.worgy;
        !           235:                x /= cur_state.dscale;
        !           236:                y /= cur_state.dscale;
        !           237:                y = wmaxy - y;
        !           238:                if (x != mousex || y != mousey) {
        !           239:                        XCondWarpMouse(w, x, y, w, mousex, mousey, 1, 1);
        !           240: /*                     XWarpMouse(w, x, y);                    */
        !           241:                        XFlush();
        !           242:                }
        !           243:        }
        !           244:        return(0);
        !           245: }
        !           246: 
        !           247: /* set up display adaptor for graphics and initialize keyboard */
        !           248: char *gentry(argc,argv)
        !           249:        int argc;
        !           250:        char **argv;
        !           251:   {    char *prog;
        !           252:        char *fname = NULL;
        !           253:        register struct icmd *p;
        !           254:        register char *q;
        !           255:        WindowInfo winfo;
        !           256:        FontInfo finfo;
        !           257:        char *fore_color, *back_color, *brdr_color, *font_name;
        !           258:        char *geometry = NULL;
        !           259:        char *display = NULL;
        !           260:        int reverse = 0;
        !           261:        Color cdef;
        !           262:        char def[32];
        !           263:        OpaqueFrame frame;
        !           264: 
        !           265:        /* fill in command dispatch table */
        !           266:        for (p = cmds; p->keys != NULL; p++)
        !           267:          for (q = p->keys; *q; q++) dispatch[*q & 0xFF] = p->func;
        !           268: 
        !           269:        prog = *argv;
        !           270:        if ((q = XGetDefault(prog, "ReverseVideo")) &&
        !           271:            strcmp(q, "on") == 0)
        !           272:                reverse = 1;
        !           273:        frame.bdrwidth = 2;
        !           274:        if (q = XGetDefault(prog, "BorderWidth"))
        !           275:                frame.bdrwidth = atoi(q);
        !           276:        fore_color = XGetDefault(prog, "ForeGround");
        !           277:        back_color = XGetDefault(prog, "BackGround");
        !           278:        brdr_color = XGetDefault(prog, "Border");
        !           279:        font_name = XGetDefault(prog, "BodyFont");
        !           280:        for (argv++; --argc; argv++) {
        !           281:            if (!strcmp(*argv, "-rv")) {
        !           282:                reverse = 1;
        !           283:            } else if (!strcmp(*argv, "-fg") && argc) {
        !           284:                argv++;
        !           285:                argc--;
        !           286:                fore_color = *argv;
        !           287:            } else if (!strcmp(*argv, "-bg") && argc) {
        !           288:                argv++;
        !           289:                argc--;
        !           290:                back_color = *argv;
        !           291:            } else if (!strcmp(*argv, "-bd") && argc) {
        !           292:                argv++;
        !           293:                argc--;
        !           294:                brdr_color = *argv;
        !           295:            } else if (!strcmp(*argv, "-fn") && argc) {
        !           296:                argv++;
        !           297:                argc--;
        !           298:                font_name = *argv;
        !           299:            } else if (**argv == '=') {
        !           300:                geometry = *argv;
        !           301:            } else if (index(*argv, ':')) {
        !           302:                display = *argv;
        !           303:            } else if (**argv == '-' || fname != NULL) {
        !           304:                printf("usage: xgedit [-rv] [-fn <font>] [-fg <color>] [-bg <color>] [-bd <color>] [=<geometry>] [host:display] [file]\n");
        !           305:                exit(1);
        !           306:            } else {
        !           307:                fname = *argv;
        !           308:            }
        !           309:        }
        !           310:        if (!XOpenDisplay(display)) {
        !           311:                fprintf(stderr, "could not connect to display\n");
        !           312:                exit(1);
        !           313:        }
        !           314:        if (reverse) {
        !           315:                forepix = WhitePixel;
        !           316:                backpix = BlackPixel;
        !           317:                frame.background = BlackPixmap;
        !           318:                frame.border = WhitePixmap;
        !           319:        } else {
        !           320:                forepix = BlackPixel;
        !           321:                backpix = WhitePixel;
        !           322:                frame.background = WhitePixmap;
        !           323:                frame.border = BlackPixmap;
        !           324:        }
        !           325:        if (DisplayCells() > 2) {
        !           326:                if (fore_color && XParseColor(fore_color, &cdef) &&
        !           327:                        XGetHardwareColor(&cdef))
        !           328:                        forepix = cdef.pixel;
        !           329:                if (back_color && XParseColor(back_color, &cdef) &&
        !           330:                        XGetHardwareColor(&cdef))
        !           331:                        frame.background = XMakeTile(backpix = cdef.pixel);
        !           332:                if (brdr_color && XParseColor(brdr_color, &cdef) &&
        !           333:                        XGetHardwareColor(&cdef))
        !           334:                        frame.border = XMakeTile(cdef.pixel);
        !           335:        }
        !           336:        invplanes = forepix ^ backpix;
        !           337:        if (font_name == NULL) font_name = "8x13";
        !           338:        font = XGetFont(font_name);
        !           339:        if (!font) {
        !           340:                fprintf(stderr, "no such font: %s\n", font_name);
        !           341:                exit(1);
        !           342:        }
        !           343:        XQueryFont(font, &finfo);
        !           344:        XQueryWindow(RootWindow, &winfo);
        !           345:        chrwid = finfo.width;
        !           346:        chrhgt = finfo.height;
        !           347:        frame.x = 1;
        !           348:        frame.y = 1;
        !           349:        frame.width = 80 * chrwid;
        !           350:        if (frame.width + (frame.bdrwidth<<1) > winfo.width)
        !           351:                frame.width = winfo.width - (frame.bdrwidth<<1);
        !           352:        frame.height = 25 * chrhgt;
        !           353:        if (frame.height + (frame.bdrwidth<<1) > winfo.height)
        !           354:                frame.height = winfo.height - (frame.bdrwidth<<1);
        !           355:        sprintf(def, "=%dx%d+1+1", frame.width, frame.height);
        !           356:        wminx = 0;
        !           357:        wminy = 2*chrhgt;
        !           358:        w = XCreate(prog, prog, geometry, def, &frame, 5 * chrwid, wminy + 5 * chrhgt);
        !           359:        wmaxx = frame.width;
        !           360:        wmaxy = frame.height;
        !           361:        trw = XCreateTransparency(w, 0, 0, wmaxx, wmaxy - (chrhgt << 1));
        !           362:        XMapWindow(trw);
        !           363:        XDefineCursor(w, XCreateCursor(16, 16, crbits, crbits, 7, 7,
        !           364:                                        backpix, forepix, GXnoop));
        !           365:        XSetResizeHint(w, 1, wminy + 1, 1, 1);
        !           366:        XMapWindow(w);
        !           367:        XSelectInput(w, KeyPressed|ButtonPressed|MouseMoved|ExposeRegion);
        !           368:        mousechanged = 0;
        !           369:        return(fname);
        !           370: }
        !           371: 
        !           372: Beep()
        !           373:  {     XFeep(0);
        !           374: }
        !           375: 
        !           376: /* give status info on second to last line */
        !           377: banner()
        !           378:   {    char temp[100];
        !           379: 
        !           380:        if (cur_state.curobj != NULL)
        !           381:          sprintf(temp,"XGEDIT %d:%d    %c %s",
        !           382:                  cur_state.mscale,cur_state.dscale,
        !           383:                  cur_state.curobj->modified ? '*':' ',
        !           384:                  cur_state.curobj->name);
        !           385:        else sprintf(temp,"XGEDIT %d:%d",
        !           386:                  cur_state.mscale,cur_state.dscale);
        !           387: 
        !           388:        XPixSet(w, 0, wmaxy - (chrhgt << 1), wmaxx, chrhgt, backpix);
        !           389: 
        !           390:        disp_str(temp, 0, chrhgt, 1, HIGHLIGHT, 1);
        !           391: }
        !           392: 
        !           393: /* display a string at the specified position, return lenth */
        !           394: disp_str(s,x,y,reverse,xorflag,info)
        !           395:        char *s;
        !           396:   {    int len;
        !           397:        len = strlen(s);
        !           398:        if (reverse)
        !           399:                XText(info ? w : trw, x, wmaxy - y - chrhgt, s, len, font,
        !           400:                         backpix, forepix);
        !           401:        else
        !           402:                XTextMaskPad(info ? w : trw, x, wmaxy - y - chrhgt, s, len, font,
        !           403:                             0, 0, forepix, xorflag ? GXinvert : GXcopy,
        !           404:                             xorflag ? invplanes: AllPlanes);
        !           405:        return(len);
        !           406: }
        !           407: 
        !           408: /* display a character at the specified position */
        !           409: disp_char(ch,x,y,reverse,xorflag,info)
        !           410:   {    char c = ch;
        !           411:        if (reverse)
        !           412:                XText(info ? w : trw, x, wmaxy - y - chrhgt, &c, 1, font,
        !           413:                         backpix, forepix);
        !           414:        else
        !           415:                XTextMaskPad(info ? w : trw, x, wmaxy - y - chrhgt, &c, 1, font,
        !           416:                             0, 0, forepix, xorflag ? GXinvert : GXcopy,
        !           417:                             xorflag ? invplanes : AllPlanes);
        !           418: }
        !           419: 
        !           420: /* Update display, cursor */
        !           421: DpyUp(tflag)
        !           422:  {     XEvent ev;
        !           423: 
        !           424:        if (tflag) tcurxor();
        !           425:        dcurxor();
        !           426:        do {
        !           427:                XPeekEvent(&ev);
        !           428:        } while (UserReady() == 0);
        !           429:        if (tflag) tcurxor();
        !           430:        dcurxor();
        !           431: }
        !           432: 
        !           433: /* xor the text cursor */
        !           434: tcurxor()
        !           435:   {    XPixFill(w, incol*chrwid, wmaxy - chrhgt, chrwid, chrhgt, forepix, (Bitmap) NULL,
        !           436:                 GXinvert, invplanes);
        !           437: }
        !           438: 
        !           439: clearprompt()
        !           440:   {    incol = 0;
        !           441:        XPixSet(w, 0, wmaxy - chrhgt, wmaxx, chrhgt, backpix);
        !           442: }
        !           443: 
        !           444: clearscreen()
        !           445:   {    XClear(w);
        !           446:        banner();
        !           447:        clearprompt();
        !           448: }
        !           449: 
        !           450: static int lastx, lasty;
        !           451: static int lastflag;
        !           452: static int lastcnt = 1000;
        !           453: 
        !           454: /* draw a vector from <FromX,FromY> to <ToX,ToY> */
        !           455: line(FromX,FromY,ToX,ToY,xorflag)
        !           456:   {    Vertex vert[2];
        !           457:        vert[0].x = FromX;
        !           458:        vert[0].y = wmaxy - FromY;
        !           459:        vert[0].flags = VertexDontDraw;
        !           460:        vert[1].x = ToX;
        !           461:        vert[1].y = wmaxy - ToY;
        !           462:        vert[1].flags = VertexDrawLastPoint;
        !           463:        if (xorflag == lastflag && lastcnt < 250 &&
        !           464:            ((FromX == lastx && FromY == lasty &&
        !           465:                XAppendVertex(&vert[1], 1) > 0)
        !           466:                || XAppendVertex(vert, 2) > 0)) {
        !           467:                lastx = ToX;
        !           468:                lasty = ToY;
        !           469:                lastcnt++;
        !           470:                return;
        !           471:        }
        !           472:        lastx = ToX;
        !           473:        lasty = ToY;
        !           474:        lastflag = xorflag;
        !           475:        lastcnt = 1;
        !           476:        XDraw(trw, vert, 2, 1, 1, forepix, xorflag ? GXinvert : GXcopy,
        !           477:                xorflag ? invplanes : AllPlanes);
        !           478: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.