Annotation of 43BSDTahoe/new/X/xgedit/gx.c, revision 1.1.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.7 86/11/19 19:20:37 jg 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, "%s: Can't open display '%s'\n",
                    312:                    prog, XDisplayName(display));
                    313:                exit(1);
                    314:        }
                    315:        if (reverse) {
                    316:                forepix = WhitePixel;
                    317:                backpix = BlackPixel;
                    318:                frame.background = BlackPixmap;
                    319:                frame.border = WhitePixmap;
                    320:        } else {
                    321:                forepix = BlackPixel;
                    322:                backpix = WhitePixel;
                    323:                frame.background = WhitePixmap;
                    324:                frame.border = BlackPixmap;
                    325:        }
                    326:        if (DisplayCells() > 2) {
                    327:                if (fore_color && XParseColor(fore_color, &cdef) &&
                    328:                        XGetHardwareColor(&cdef))
                    329:                        forepix = cdef.pixel;
                    330:                if (back_color && XParseColor(back_color, &cdef) &&
                    331:                        XGetHardwareColor(&cdef))
                    332:                        frame.background = XMakeTile(backpix = cdef.pixel);
                    333:                if (brdr_color && XParseColor(brdr_color, &cdef) &&
                    334:                        XGetHardwareColor(&cdef))
                    335:                        frame.border = XMakeTile(cdef.pixel);
                    336:        }
                    337:        invplanes = forepix ^ backpix;
                    338:        if (font_name == NULL) font_name = "8x13";
                    339:        font = XGetFont(font_name);
                    340:        if (!font) {
                    341:                fprintf(stderr, "no such font: %s\n", font_name);
                    342:                exit(1);
                    343:        }
                    344:        XQueryFont(font, &finfo);
                    345:        XQueryWindow(RootWindow, &winfo);
                    346:        chrwid = finfo.width;
                    347:        chrhgt = finfo.height;
                    348:        frame.x = 1;
                    349:        frame.y = 1;
                    350:        frame.width = 80 * chrwid;
                    351:        if (frame.width + (frame.bdrwidth<<1) > winfo.width)
                    352:                frame.width = winfo.width - (frame.bdrwidth<<1);
                    353:        frame.height = 25 * chrhgt;
                    354:        if (frame.height + (frame.bdrwidth<<1) > winfo.height)
                    355:                frame.height = winfo.height - (frame.bdrwidth<<1);
                    356:        sprintf(def, "=%dx%d+1+1", frame.width, frame.height);
                    357:        wminx = 0;
                    358:        wminy = 2*chrhgt;
                    359:        w = XCreate(prog, prog, geometry, def, &frame, 5 * chrwid, wminy + 5 * chrhgt);
                    360:        wmaxx = frame.width;
                    361:        wmaxy = frame.height;
                    362:        trw = XCreateTransparency(w, 0, 0, wmaxx, wmaxy - (chrhgt << 1));
                    363:        XMapWindow(trw);
                    364:        XDefineCursor(w, XCreateCursor(16, 16, crbits, crbits, 7, 7,
                    365:                                        backpix, forepix, GXnoop));
                    366:        XSetResizeHint(w, 1, wminy + 1, 1, 1);
                    367:        XMapWindow(w);
                    368:        XSelectInput(w, KeyPressed|ButtonPressed|MouseMoved|ExposeRegion);
                    369:        mousechanged = 0;
                    370:        return(fname);
                    371: }
                    372: 
                    373: Beep()
                    374:  {     XFeep(0);
                    375: }
                    376: 
                    377: /* give status info on second to last line */
                    378: banner()
                    379:   {    char temp[100];
                    380: 
                    381:        if (cur_state.curobj != NULL)
                    382:          sprintf(temp,"XGEDIT %d:%d    %c %s",
                    383:                  cur_state.mscale,cur_state.dscale,
                    384:                  cur_state.curobj->modified ? '*':' ',
                    385:                  cur_state.curobj->name);
                    386:        else sprintf(temp,"XGEDIT %d:%d",
                    387:                  cur_state.mscale,cur_state.dscale);
                    388: 
                    389:        XPixSet(w, 0, wmaxy - (chrhgt << 1), wmaxx, chrhgt, backpix);
                    390: 
                    391:        disp_str(temp, 0, chrhgt, 1, HIGHLIGHT, 1);
                    392: }
                    393: 
                    394: /* display a string at the specified position, return lenth */
                    395: disp_str(s,x,y,reverse,xorflag,info)
                    396:        char *s;
                    397:   {    int len;
                    398:        len = strlen(s);
                    399:        if (reverse)
                    400:                XText(info ? w : trw, x, wmaxy - y - chrhgt, s, len, font,
                    401:                         backpix, forepix);
                    402:        else
                    403:                XTextMaskPad(info ? w : trw, x, wmaxy - y - chrhgt, s, len, font,
                    404:                             0, 0, forepix, xorflag ? GXinvert : GXcopy,
                    405:                             xorflag ? invplanes: AllPlanes);
                    406:        return(len);
                    407: }
                    408: 
                    409: /* display a character at the specified position */
                    410: disp_char(ch,x,y,reverse,xorflag,info)
                    411:   {    char c = ch;
                    412:        if (reverse)
                    413:                XText(info ? w : trw, x, wmaxy - y - chrhgt, &c, 1, font,
                    414:                         backpix, forepix);
                    415:        else
                    416:                XTextMaskPad(info ? w : trw, x, wmaxy - y - chrhgt, &c, 1, font,
                    417:                             0, 0, forepix, xorflag ? GXinvert : GXcopy,
                    418:                             xorflag ? invplanes : AllPlanes);
                    419: }
                    420: 
                    421: /* Update display, cursor */
                    422: DpyUp(tflag)
                    423:  {     XEvent ev;
                    424: 
                    425:        if (tflag) tcurxor();
                    426:        dcurxor();
                    427:        do {
                    428:                XPeekEvent(&ev);
                    429:        } while (UserReady() == 0);
                    430:        if (tflag) tcurxor();
                    431:        dcurxor();
                    432: }
                    433: 
                    434: /* xor the text cursor */
                    435: tcurxor()
                    436:   {    XPixFill(w, incol*chrwid, wmaxy - chrhgt, chrwid, chrhgt, forepix, (Bitmap) NULL,
                    437:                 GXinvert, invplanes);
                    438: }
                    439: 
                    440: clearprompt()
                    441:   {    incol = 0;
                    442:        XPixSet(w, 0, wmaxy - chrhgt, wmaxx, chrhgt, backpix);
                    443: }
                    444: 
                    445: clearscreen()
                    446:   {    XClear(w);
                    447:        banner();
                    448:        clearprompt();
                    449: }
                    450: 
                    451: static int lastx, lasty;
                    452: static int lastflag;
                    453: static int lastcnt = 1000;
                    454: 
                    455: /* draw a vector from <FromX,FromY> to <ToX,ToY> */
                    456: line(FromX,FromY,ToX,ToY,xorflag)
                    457:   {    Vertex vert[2];
                    458:        vert[0].x = FromX;
                    459:        vert[0].y = wmaxy - FromY;
                    460:        vert[0].flags = VertexDontDraw;
                    461:        vert[1].x = ToX;
                    462:        vert[1].y = wmaxy - ToY;
                    463:        vert[1].flags = VertexDrawLastPoint;
                    464:        if (xorflag == lastflag && lastcnt < 250 &&
                    465:            ((FromX == lastx && FromY == lasty &&
                    466:                XAppendVertex(&vert[1], 1) > 0)
                    467:                || XAppendVertex(vert, 2) > 0)) {
                    468:                lastx = ToX;
                    469:                lasty = ToY;
                    470:                lastcnt++;
                    471:                return;
                    472:        }
                    473:        lastx = ToX;
                    474:        lasty = ToY;
                    475:        lastflag = xorflag;
                    476:        lastcnt = 1;
                    477:        XDraw(trw, vert, 2, 1, 1, forepix, xorflag ? GXinvert : GXcopy,
                    478:                xorflag ? invplanes : AllPlanes);
                    479: }

unix.superglobalmegacorp.com

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