Annotation of 43BSD/contrib/X/Xlib/XCreate.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* $Header: XCreate.c,v 10.8 86/02/01 15:30:58 tony Rel $ */
        !             4: /* Copyright 1985, Massachusetts Institute of Technology */
        !             5: /* stolen from CLU routine x_cons, redone by J. Gettys */
        !             6: 
        !             7: #include "XlibInternal.h"
        !             8: #include <stdio.h>
        !             9: #define TRUE  1
        !            10: #define FALSE 0
        !            11: #define max(a,b) ( (a) > (b) ? (a) : (b) )
        !            12: #define min(a,b) ( (a) > (b) ? (b) : (a) )
        !            13: #define abs(a) ( (a) > 0 ? (a) : -(a))
        !            14: 
        !            15: #define DCOUNT 2
        !            16: #define VCOUNT 1 + (4  * 2 * DCOUNT)
        !            17: #define FCOUNT 1 + 4
        !            18: 
        !            19: #include "../cursors/cross.cursor"
        !            20: #include "../cursors/cross_mask.cursor"
        !            21: 
        !            22: Window XCreate(prompt, name, geometry, def, frame, minwidth, minheight)
        !            23:        char *prompt, *name;
        !            24:        register OpaqueFrame *frame;
        !            25:        int minwidth, minheight;
        !            26:        char *geometry, *def;
        !            27:        {
        !            28:        char *fn = "8x13";              /* default default font */
        !            29:        FontInfo *pfninfo;              /* font info on prompt */
        !            30:        Window pop;                     /* pop up window */
        !            31:        char *opt;
        !            32:        int pfore, pback;               /* prompt window colors */
        !            33:        int bpix;                       /* border color */
        !            34:        int mfore, mback;               /* mouse colors */
        !            35:        int pbw = 1;                    /* prompt window border width */
        !            36:        int ibw = 1;                    /* internal border width */
        !            37:        int freeze = 0;                 /* should we freeze the server */
        !            38:        Color cdef;                     /* color structure for lookup */
        !            39:        Cursor cr;                      /* cursor for the prompt window */
        !            40:        int events;                     /* event mask */
        !            41:        int popw, poph;                 /* prompt window height and width */
        !            42:        int count = VCOUNT;             /* vertex count */
        !            43:        Pixmap save = 0;                /* saved pixmap */
        !            44:        Pixmap backmap, bdrmap;         /* background and border pixmaps */
        !            45:        Vertex box[VCOUNT];             /* vertex list for box */
        !            46:        int x1, y1;                     /* location of mouse */
        !            47:        int x2, y2;                     /* other corner of box */
        !            48:        Window subw;                    /* subwindow it is in */
        !            49:        int mindim;                     /* minimum dimension */
        !            50:        int width, height;              /* width and height of box */
        !            51:        int left, stop;
        !            52:        int mouse;
        !            53:        int force;                      /* force default window to track */
        !            54:        int xa, ya, xb, yb;
        !            55:        int doit;
        !            56:        XButtonEvent event;             /* someplace to put the event */
        !            57:        register int i;                 /* ye olde indexe variabel */
        !            58:        int fx, fy, fw, fh;             /* frame from parse... */
        !            59:        int pr;                         /* parse geometry result */
        !            60: 
        !            61:        pr = XGeometry (geometry, def, frame->bdrwidth, 1, 1, 0, 0,
        !            62:                &fx, &fy, &fw, &fh);
        !            63:        /*
        !            64:         * none of this nonsense would be necessary if I hadn't blown
        !            65:         * the frame structure definition.
        !            66:         */
        !            67:        frame->x = fx;
        !            68:        frame->y = fy;
        !            69:        frame->width = fw;
        !            70:        frame->height = fh;
        !            71:        if (geometry != NULL) {
        !            72:                /*
        !            73:                 * if x or y offsets are specified, then we should autoplace
        !            74:                 */
        !            75:                if ( (pr & XValue ) || (pr & YValue) ) {
        !            76:                    if (frame->width < minwidth) frame->width = minwidth;
        !            77:                    if (frame->height < minheight) frame->height = minheight;
        !            78:                    goto makeit;
        !            79:                }
        !            80:        }
        !            81: 
        !            82:        if ((opt = XGetDefault(name, "MakeWindow.BodyFont")) != NULL) fn = opt;
        !            83: 
        !            84:        if ((pfninfo = XOpenFont(fn)) == NULL) {
        !            85:                fprintf(stderr, "Can't open font %s!\n", fn);
        !            86:                return(0);
        !            87:                }
        !            88: 
        !            89:        pfore = mback = WhitePixel;
        !            90:        pback = bpix = mfore = BlackPixel;
        !            91:        if ((opt = XGetDefault(name, "MakeWindow.ReverseVideo")) != NULL)
        !            92:                if (strcmp (opt, "on") == 0) {
        !            93:                        pfore = BlackPixel;
        !            94:                        pback = WhitePixel;
        !            95:                        }
        !            96: 
        !            97:        if ((opt = XGetDefault(name, "MakeWindow.BorderWidth")) != NULL)
        !            98:                pbw = atoi (opt);
        !            99: 
        !           100:        if ((opt = XGetDefault(name, "MakeWindow.InternalBorder")) != NULL)
        !           101:                ibw = atoi (opt);
        !           102: 
        !           103:        if ((opt = XGetDefault(name, "MakeWindow.Freeze")) != NULL)
        !           104:                if (strcmp (opt, "on") == 0) freeze = 1;
        !           105: 
        !           106:        if (DisplayPlanes() > 2) { /* on color display, do color stuff */
        !           107:        
        !           108:                if ((opt = XGetDefault(name,"MakeWindow.Foreground")) != NULL)
        !           109:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
        !           110:                        pfore = cdef.pixel;
        !           111: 
        !           112:                if ((opt = XGetDefault(name,"MakeWindow.Background")) != NULL)
        !           113:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
        !           114:                        pback = cdef.pixel;
        !           115: 
        !           116:                if ((opt = XGetDefault(name,"MakeWindow.Border")) != NULL)
        !           117:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
        !           118:                        bpix = cdef.pixel;
        !           119: 
        !           120:                if ((opt = XGetDefault(name,"MakeWindow.Mouse")) != NULL)
        !           121:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
        !           122:                        mfore = cdef.pixel;
        !           123: 
        !           124:                if ((opt = XGetDefault(name,"MakeWindow.MouseMask")) != NULL)
        !           125:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
        !           126:                        mback = cdef.pixel;
        !           127: 
        !           128:                        }
        !           129: 
        !           130:        cr = XCreateCursor (cross_width, cross_height, cross_bits, 
        !           131:                cross_mask_bits, cross_x_hot, cross_y_hot,
        !           132:                mfore, mback, GXcopy);
        !           133: 
        !           134:        events = ButtonPressed | ButtonReleased;
        !           135: 
        !           136:        if (freeze) events |= MouseMoved;
        !           137: 
        !           138:        /* 
        !           139:         * go get the mouse as soon as you can 
        !           140:         */
        !           141: 
        !           142:        while (1) {
        !           143:                if (XGrabMouse ( RootWindow, cr, events ) != 0) break;
        !           144:                sleep (1);
        !           145:                }
        !           146:        popw = XStringWidth (prompt, pfninfo, 0, 0) + 2 * ibw;
        !           147:        poph = pfninfo->height + 2 * ibw;
        !           148: 
        !           149:        if (freeze) {
        !           150:                XGrabServer();
        !           151:                count = FCOUNT;
        !           152:                save = XPixmapSave (RootWindow, 0, 0, 
        !           153:                        popw + 2 * pbw, poph +2 * pbw);
        !           154:                }
        !           155: 
        !           156:        backmap = XMakeTile (pback);
        !           157:        bdrmap = XMakeTile (bpix);
        !           158: 
        !           159:        pop = XCreateWindow (RootWindow, 
        !           160:                0, 0, popw, poph, pbw, bdrmap, backmap);
        !           161:        XMapWindow( pop);
        !           162:        XText (pop, ibw, ibw, prompt, strlen(prompt), 
        !           163:                pfninfo->id, pfore, pback);
        !           164: 
        !           165:        XQueryMouse (RootWindow, &x1, &y1, &subw);
        !           166: 
        !           167:        mindim = 2 * frame->bdrwidth - 1;
        !           168:        minwidth  = minwidth  + mindim;
        !           169:        minheight = minheight + mindim;
        !           170: 
        !           171:        x2 = x1 + minwidth;
        !           172:        y2 = y1 + minheight;
        !           173: 
        !           174:        width  = minwidth;
        !           175:        height = minheight;
        !           176: 
        !           177:        left = TRUE;
        !           178:        force = FALSE;
        !           179:        stop = FALSE;
        !           180:        mouse = TRUE;
        !           181: 
        !           182:        xa = ya = xb = yb = -1;
        !           183: 
        !           184:        doit = TRUE;
        !           185: 
        !           186:        while (stop == FALSE) {
        !           187:            if (  (xb != max (x1, x2)) || (yb != max(y1, y2))
        !           188:                ||(xa != min (x1, x2)) || (ya != min(y1, y2))) {
        !           189:                if (freeze && (doit == FALSE)) {
        !           190:                        XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1);
        !           191:                        }
        !           192:                xa = min (x1, x2);
        !           193:                ya = min (y1, y2);
        !           194:                xb = max (x1, x2);
        !           195:                yb = max (y1, y2);
        !           196:                for ( i = 0; i < count; i += 4) {
        !           197:                    box[i].x = xa; box[i].y = ya; box[i].flags = 0;
        !           198:                    if (i+1 == count) break;
        !           199:                    box[i+1].x = xb; box[i+1].y = ya, box[i+1].flags = 0;
        !           200:                    box[i+2].x = xb; box[i+2].y = yb, box[i+2].flags = 0;
        !           201:                    box[i+3].x = xa; box[i+3].y = yb, box[i+3].flags = 0;
        !           202:                    }
        !           203:                doit = TRUE;
        !           204:                }
        !           205:            if (doit) {
        !           206:                XDraw(RootWindow, box, count, 1, 1, 0, GXinvert, 1);
        !           207:                doit = !freeze;
        !           208:                }
        !           209:            if (freeze || XPending() ) {
        !           210:                register int button;
        !           211:                XNextEvent(&event);
        !           212:                button = event.detail & ValueMask;
        !           213:                if (mouse) {
        !           214:                        x2 = event.x;
        !           215:                        y2 = event.y;
        !           216:                        }
        !           217:                if ( (left == TRUE) && ( event.type == ButtonPressed ) && 
        !           218:                        ( button == MiddleButton ) ) {
        !           219:                        x1 = x2;
        !           220:                        y1 = y2;
        !           221:                        left = FALSE;
        !           222:                        }
        !           223:                else if ( (left == FALSE) && (event.type == ButtonReleased) &&
        !           224:                        ( button == MiddleButton))
        !           225:                                        stop = TRUE;
        !           226:                else if ( (left == TRUE) && (event.type == ButtonPressed) &&
        !           227:                        ( button == LeftButton)) {
        !           228:                        x1 = frame->x;
        !           229:                        y1 = frame->y;
        !           230:                        x2 = x1 + frame->width + mindim;
        !           231:                        y2 = y1 + frame->height + mindim;
        !           232:                        mouse = FALSE;
        !           233:                        left = FALSE;
        !           234:                        }
        !           235:                else if ( (left == FALSE) && (event.type == ButtonReleased) &&
        !           236:                        ( button == LeftButton)) {
        !           237:                        x1 = frame->x;
        !           238:                        y1 = frame->y;
        !           239:                        x2 = x1 + frame->width + mindim;
        !           240:                        y2 = y1 + frame->height + mindim;
        !           241:                        stop = TRUE;
        !           242:                        }
        !           243:                else if ( (left == TRUE) && (event.type == ButtonPressed) &&
        !           244:                        ( button == RightButton)) {
        !           245:                        force = TRUE;
        !           246:                        left = FALSE;
        !           247:                        }
        !           248:                else if ( (left == FALSE) && (event.type == ButtonReleased) &&
        !           249:                        ( button == RightButton)) {
        !           250:                        stop = TRUE;
        !           251:                        }
        !           252:                else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw);
        !           253:                }
        !           254:            else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw);
        !           255: 
        !           256:            if (force) {        /* we force the default box */
        !           257:                x1 = x2;
        !           258:                y1 = y2;
        !           259:                x2 = x1 + frame->width + mindim;
        !           260:                y2 = y1 + frame->height + mindim;
        !           261:                }
        !           262: 
        !           263:            if (left) {
        !           264:                x1 = x2;
        !           265:                y1 = y2;
        !           266:                }
        !           267:            width = max (abs (x2 - x1), minwidth);
        !           268: 
        !           269:            if (x2 < x1) x2 = x1 - width;
        !           270:            else         x2 = x1 + width;
        !           271: 
        !           272:            height = max (abs (y2 - y1), minheight);
        !           273:            if (y2 < y1) y2 = y1 - height;
        !           274:            else         y2 = y1 + height;
        !           275:        }
        !           276:        if (freeze) XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1);
        !           277:        XUngrabMouse();
        !           278: 
        !           279:        if (save != 0) {
        !           280:                XUnmapTransparent (pop);
        !           281:                XPixmapPut (RootWindow, 0, 0, 0, 0,
        !           282:                        popw + 2 * pbw, poph + 2 * pbw,
        !           283:                        save, GXcopy, AllPlanes);
        !           284:                XFreePixmap (save);
        !           285:                }
        !           286:        XDestroyWindow (pop);
        !           287:        if (freeze) XUngrabServer();
        !           288:        XCloseFont (pfninfo);
        !           289:        XFreeCursor (cr);
        !           290:        XFreePixmap (backmap);
        !           291:        XFreePixmap (bdrmap);
        !           292:        frame->x = min(x1, x2);
        !           293:        frame->y = min(y1, y2);
        !           294:        frame->width = width - mindim;
        !           295:        frame->height = height - mindim;
        !           296: makeit:        XCreateWindows(RootWindow, frame, 1);
        !           297:        /* store default name of the window and set the resize hint */
        !           298:        XStoreName(frame->self, prompt);
        !           299:        XSetResizeHint(frame->self, minwidth, minheight, 1, 1);
        !           300:        XSync(1);               /* get rid of any extraneous events */
        !           301:        return (frame->self);
        !           302:        }
        !           303: 

unix.superglobalmegacorp.com

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