Annotation of 43BSD/contrib/X/Xlib/XCreate.c, revision 1.1.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.