Annotation of 43BSDTahoe/new/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.10 86/08/11 12:55:45 wesommer 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: #define CURSOR_LL 0
                     20: #include "../cursors/ll_angle.cursor"
                     21: #include "../cursors/ll_angle_mask.cursor"
                     22: #define CURSOR_LR 1
                     23: #include "../cursors/lr_angle.cursor"
                     24: #include "../cursors/lr_angle_mask.cursor"
                     25: #define CURSOR_UL 2
                     26: #include "../cursors/ul_angle.cursor"
                     27: #include "../cursors/ul_angle_mask.cursor"
                     28: #define CURSOR_UR 3
                     29: #include "../cursors/ur_angle.cursor"
                     30: #include "../cursors/ur_angle_mask.cursor"
                     31: 
                     32: 
                     33: Window XCreate(prompt, name, geometry, def, frame, minwidth, minheight)
                     34:        char *prompt, *name;
                     35:        register OpaqueFrame *frame;
                     36:        int minwidth, minheight;
                     37:        char *geometry, *def;
                     38:        {
                     39:        char *fn = "8x13";              /* default default font */
                     40:        FontInfo *pfninfo;              /* font info on prompt */
                     41:        Window pop;                     /* pop up window */
                     42:        char *opt;
                     43:        int pfore, pback;               /* prompt window colors */
                     44:        int bpix;                       /* border color */
                     45:        int mfore, mback;               /* mouse colors */
                     46:        int pbw = 1;                    /* prompt window border width */
                     47:        int ibw = 1;                    /* internal border width */
                     48:        int freeze = 0;                 /* should we freeze the server */
                     49:        Color cdef;                     /* color structure for lookup */
                     50:        Cursor ur,ul,lr,ll;             /* cursors for rubber banding    */
                     51:        int events;                     /* event mask */
                     52:        int popw, poph;                 /* prompt window height and width */
                     53:        int count = VCOUNT;             /* vertex count */
                     54:        Pixmap save = 0;                /* saved pixmap */
                     55:        Pixmap backmap, bdrmap;         /* background and border pixmaps */
                     56:        Vertex box[VCOUNT];             /* vertex list for box */
                     57:        int x1, y1;                     /* location of mouse */
                     58:        int x2, y2;                     /* other corner of box */
                     59:        Window subw;                    /* subwindow it is in */
                     60:        int mindim;                     /* minimum dimension */
                     61:        int width, height;              /* width and height of box */
                     62:        int left, stop;
                     63:        int mouse;
                     64:        int force;                      /* force default window to track */
                     65:        int xa, ya, xb, yb;
                     66:        int doit;
                     67:        XButtonEvent event;             /* someplace to put the event */
                     68:        register int i;                 /* ye olde indexe variabel */
                     69:        int fx, fy, fw, fh;             /* frame from parse... */
                     70:        int pr;                         /* parse geometry result */
                     71:        int change_cursor = FALSE;
                     72:        int current_cursor = CURSOR_UL;
                     73: 
                     74:        int HereButton = LeftButton;    /* make window at locator */
                     75:        int ResizeButton = MiddleButton;/* make window of specified size */
                     76:        int DefaultButton = RightButton;/* make window at default location */
                     77: 
                     78:        pr = XGeometry (geometry, def, frame->bdrwidth, 1, 1, 0, 0,
                     79:                &fx, &fy, &fw, &fh);
                     80:        /*
                     81:         * none of this nonsense would be necessary if I hadn't blown
                     82:         * the frame structure definition.
                     83:         */
                     84:        frame->x = fx;
                     85:        frame->y = fy;
                     86:        frame->width = fw;
                     87:        frame->height = fh;
                     88:        if (geometry != NULL) {
                     89:                /*
                     90:                 * if x or y offsets are specified, then we should autoplace
                     91:                 */
                     92:                if ( (pr & XValue ) || (pr & YValue) ) {
                     93:                    if (frame->width < minwidth) frame->width = minwidth;
                     94:                    if (frame->height < minheight) frame->height = minheight;
                     95:                    goto makeit;
                     96:                }
                     97:        }
                     98: 
                     99:        if ((opt = XGetDefault(name, "MakeWindow.BodyFont")) != NULL) fn = opt;
                    100: 
                    101:        if ((pfninfo = XOpenFont(fn)) == NULL) {
                    102:                fprintf(stderr, "Can't open font %s!\n", fn);
                    103:                return(0);
                    104:                }
                    105: 
                    106:        pfore = mback = WhitePixel;
                    107:        pback = bpix = mfore = BlackPixel;
                    108:        if ((opt = XGetDefault(name, "MakeWindow.ReverseVideo")) != NULL)
                    109:                if (strcmp (opt, "on") == 0) {
                    110:                        pfore = BlackPixel;
                    111:                        pback = WhitePixel;
                    112:                        }
                    113: 
                    114:        if ((opt = XGetDefault(name, "MakeWindow.BorderWidth")) != NULL)
                    115:                pbw = atoi (opt);
                    116: 
                    117:        if ((opt = XGetDefault(name, "MakeWindow.InternalBorder")) != NULL)
                    118:                ibw = atoi (opt);
                    119: 
                    120:        if ((opt = XGetDefault(name, "MakeWindow.Freeze")) != NULL)
                    121:                if (strcmp (opt, "on") == 0) freeze = 1;
                    122: 
                    123:        if (DisplayPlanes() > 2) { /* on color display, do color stuff */
                    124:        
                    125:                if ((opt = XGetDefault(name,"MakeWindow.Foreground")) != NULL)
                    126:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
                    127:                        pfore = cdef.pixel;
                    128: 
                    129:                if ((opt = XGetDefault(name,"MakeWindow.Background")) != NULL)
                    130:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
                    131:                        pback = cdef.pixel;
                    132: 
                    133:                if ((opt = XGetDefault(name,"MakeWindow.Border")) != NULL)
                    134:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
                    135:                        bpix = cdef.pixel;
                    136: 
                    137:                if ((opt = XGetDefault(name,"MakeWindow.Mouse")) != NULL)
                    138:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
                    139:                        mfore = cdef.pixel;
                    140: 
                    141:                if ((opt = XGetDefault(name,"MakeWindow.MouseMask")) != NULL)
                    142:                    if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
                    143:                        mback = cdef.pixel;
                    144: 
                    145:                        }
                    146: 
                    147:        if ((opt = XGetDefault(name, "MakeWindow.Here")) != NULL) {
                    148:                switch (*opt) {
                    149:                case 'L':
                    150:                case 'l':
                    151:                        HereButton = LeftButton;
                    152:                        break;
                    153: 
                    154:                case 'M':
                    155:                case 'm':
                    156:                        HereButton = MiddleButton;
                    157:                        break;
                    158: 
                    159:                case 'R':
                    160:                case 'r':
                    161:                        HereButton = RightButton;
                    162:                        break;
                    163:                /*
                    164:                 * Should have a default case, to check for invalid
                    165:                 * specification, but what should be done in that case?
                    166:                 */
                    167:                }
                    168:        }
                    169: 
                    170:        if ((opt = XGetDefault(name, "MakeWindow.Resize")) != NULL) {
                    171:                switch (*opt) {
                    172:                case 'L':
                    173:                case 'l':
                    174:                        ResizeButton = LeftButton;
                    175:                        break;
                    176: 
                    177:                case 'M':
                    178:                case 'm':
                    179:                        ResizeButton = MiddleButton;
                    180:                        break;
                    181: 
                    182:                case 'R':
                    183:                case 'r':
                    184:                        ResizeButton = RightButton;
                    185:                        break;
                    186:                /*
                    187:                 * Should have a default case, to check for invalid
                    188:                 * specification, but what should be done in that case?
                    189:                 */
                    190:                }
                    191:        }
                    192: 
                    193:        if ((opt = XGetDefault(name, "MakeWindow.Default")) != NULL) {
                    194:                switch (*opt) {
                    195:                case 'L':
                    196:                case 'l':
                    197:                        DefaultButton = LeftButton;
                    198:                        break;
                    199: 
                    200:                case 'M':
                    201:                case 'm':
                    202:                        DefaultButton = MiddleButton;
                    203:                        break;
                    204: 
                    205:                case 'R':
                    206:                case 'r':
                    207:                        DefaultButton = RightButton;
                    208:                        break;
                    209:                /*
                    210:                 * Should have a default case, to check for invalid
                    211:                 * specification, but what should be done in that case?
                    212:                 */
                    213:                }
                    214:        }
                    215: 
                    216:        /*
                    217:         * Should verify that HereButton != ResizeButton != DefaultButton,
                    218:         * but what should be done if that's false?
                    219:         */
                    220: 
                    221:        ur = XCreateCursor (ur_angle_width, ur_angle_height, ur_angle_bits, 
                    222:                ur_angle_mask_bits, ur_angle_x_hot, ur_angle_y_hot,
                    223:                mfore, mback, GXcopy);
                    224:        ul = XCreateCursor (ul_angle_width, ul_angle_height, ul_angle_bits, 
                    225:                ul_angle_mask_bits, ul_angle_x_hot, ul_angle_y_hot,
                    226:                mfore, mback, GXcopy);
                    227:        ll = XCreateCursor (ll_angle_width, ll_angle_height, ll_angle_bits, 
                    228:                ll_angle_mask_bits, ll_angle_x_hot, ll_angle_y_hot,
                    229:                mfore, mback, GXcopy);
                    230:        lr = XCreateCursor (lr_angle_width, lr_angle_height, lr_angle_bits, 
                    231:                lr_angle_mask_bits, lr_angle_x_hot, lr_angle_y_hot,
                    232:                mfore, mback, GXcopy);
                    233: 
                    234:        events = ButtonPressed | ButtonReleased;
                    235: 
                    236:        if (freeze) events |= MouseMoved;
                    237: 
                    238:        /* 
                    239:         * go get the mouse as soon as you can 
                    240:         */
                    241: 
                    242:        while (1) {
                    243:                if (XGrabMouse ( RootWindow, ul, events ) != 0) break;
                    244:                sleep (1);
                    245:                }
                    246:        popw = XStringWidth (prompt, pfninfo, 0, 0) + 2 * ibw;
                    247:        poph = pfninfo->height + 2 * ibw;
                    248: 
                    249:        if (freeze) {
                    250:                XGrabServer();
                    251:                count = FCOUNT;
                    252:                save = XPixmapSave (RootWindow, 0, 0, 
                    253:                        popw + 2 * pbw, poph +2 * pbw);
                    254:                }
                    255: 
                    256:        backmap = XMakeTile (pback);
                    257:        bdrmap = XMakeTile (bpix);
                    258: 
                    259:        pop = XCreateWindow (RootWindow, 
                    260:                0, 0, popw, poph, pbw, bdrmap, backmap);
                    261:        XMapWindow( pop);
                    262:        XText (pop, ibw, ibw, prompt, strlen(prompt), 
                    263:                pfninfo->id, pfore, pback);
                    264: 
                    265:        XQueryMouse (RootWindow, &x1, &y1, &subw);
                    266: 
                    267:        mindim = 2 * frame->bdrwidth - 1;
                    268:        minwidth  = minwidth  + mindim;
                    269:        minheight = minheight + mindim;
                    270: 
                    271:        x2 = x1 + minwidth;
                    272:        y2 = y1 + minheight;
                    273: 
                    274:        width  = minwidth;
                    275:        height = minheight;
                    276: 
                    277:        left = TRUE;
                    278:        force = FALSE;
                    279:        stop = FALSE;
                    280:        mouse = TRUE;
                    281: 
                    282:        xa = ya = xb = yb = -1;
                    283: 
                    284:        doit = TRUE;
                    285: 
                    286:        while (stop == FALSE) {
                    287:            if (  (xb != max (x1, x2)) || (yb != max(y1, y2))
                    288:                ||(xa != min (x1, x2)) || (ya != min(y1, y2))) {
                    289:                if (freeze && (doit == FALSE)) {
                    290:                        XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1);
                    291:                        }
                    292:                xa = min (x1, x2);
                    293:                ya = min (y1, y2);
                    294:                xb = max (x1, x2);
                    295:                yb = max (y1, y2);
                    296:                for ( i = 0; i < count; i += 4) {
                    297:                    box[i].x = xa; box[i].y = ya; box[i].flags = 0;
                    298:                    if (i+1 == count) break;
                    299:                    box[i+1].x = xb; box[i+1].y = ya, box[i+1].flags = 0;
                    300:                    box[i+2].x = xb; box[i+2].y = yb, box[i+2].flags = 0;
                    301:                    box[i+3].x = xa; box[i+3].y = yb, box[i+3].flags = 0;
                    302:                    }
                    303:                doit = TRUE;
                    304:                }
                    305:            if (doit) {
                    306:                XDraw(RootWindow, box, count, 1, 1, 0, GXinvert, 1);
                    307:                doit = !freeze;
                    308:                }
                    309:            if (freeze || XPending() ) {
                    310:                register int button;
                    311:                XNextEvent(&event);
                    312:                button = event.detail & ValueMask;
                    313:                if (mouse) {
                    314:                        x2 = event.x;
                    315:                        y2 = event.y;
                    316:                        }
                    317:                if ( (left == TRUE) && ( event.type == ButtonPressed ) && 
                    318:                        ( button == ResizeButton ) ) {
                    319:                        x1 = x2;
                    320:                        y1 = y2;
                    321:                        left = FALSE;
                    322:                        change_cursor = TRUE;
                    323:                        }
                    324:                else if ( (left == FALSE) && (event.type == ButtonReleased) &&
                    325:                        ( button == ResizeButton))
                    326:                                        stop = TRUE;
                    327:                else if ( (left == TRUE) && (event.type == ButtonPressed) &&
                    328:                        ( button == DefaultButton)) {
                    329:                        x1 = frame->x;
                    330:                        y1 = frame->y;
                    331:                        x2 = x1 + frame->width + mindim;
                    332:                        y2 = y1 + frame->height + mindim;
                    333:                        mouse = FALSE;
                    334:                        left = FALSE;
                    335:                        }
                    336:                else if ( (left == FALSE) && (event.type == ButtonReleased) &&
                    337:                        ( button == DefaultButton)) {
                    338:                        x1 = frame->x;
                    339:                        y1 = frame->y;
                    340:                        x2 = x1 + frame->width + mindim;
                    341:                        y2 = y1 + frame->height + mindim;
                    342:                        stop = TRUE;
                    343:                        }
                    344:                else if ( (left == TRUE) && (event.type == ButtonPressed) &&
                    345:                        ( button == HereButton)) {
                    346:                        force = TRUE;
                    347:                        left = FALSE;
                    348:                        }
                    349:                else if ( (left == FALSE) && (event.type == ButtonReleased) &&
                    350:                        ( button == HereButton)) {
                    351:                        stop = TRUE;
                    352:                        }
                    353:                else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw);
                    354:                }
                    355:            else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw);
                    356:            if (change_cursor) {
                    357:                if ((x2 >= x1) && (y2 >= y1) &&
                    358:                    current_cursor != CURSOR_LR) {
                    359:                    XGrabMouse ( RootWindow, lr, events );
                    360:                    current_cursor = CURSOR_LR;
                    361:                }
                    362:                else if ((x2 >= x1) && (y2 < y1) &&
                    363:                         current_cursor != CURSOR_UR) {
                    364:                    XGrabMouse ( RootWindow, ur, events);
                    365:                    current_cursor = CURSOR_UR;
                    366:                }
                    367:                else if ((x2 < x1) && (y2 >= y1) &&
                    368:                         current_cursor != CURSOR_LL) {
                    369:                    XGrabMouse ( RootWindow, ll, events);
                    370:                    current_cursor = CURSOR_LL;
                    371:                }
                    372:                else if ((x2 < x1) && (y2 < y1) &&
                    373:                         (current_cursor != CURSOR_UL)) {
                    374:                    XGrabMouse ( RootWindow, ul, events);
                    375:                    current_cursor = CURSOR_UL;
                    376:                }
                    377:            }
                    378:            if (force) {        /* we force the default box */
                    379:                x1 = x2;
                    380:                y1 = y2;
                    381:                x2 = x1 + frame->width + mindim;
                    382:                y2 = y1 + frame->height + mindim;
                    383:                }
                    384: 
                    385:            if (left) {
                    386:                x1 = x2;
                    387:                y1 = y2;
                    388:                }
                    389:            width = max (abs (x2 - x1), minwidth);
                    390: 
                    391:            if (x2 < x1) x2 = x1 - width;
                    392:            else         x2 = x1 + width;
                    393: 
                    394:            height = max (abs (y2 - y1), minheight);
                    395:            if (y2 < y1) y2 = y1 - height;
                    396:            else         y2 = y1 + height;
                    397:        }
                    398:        if (freeze) XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1);
                    399:        XUngrabMouse();
                    400: 
                    401:        if (save != 0) {
                    402:                XUnmapTransparent (pop);
                    403:                XPixmapPut (RootWindow, 0, 0, 0, 0,
                    404:                        popw + 2 * pbw, poph + 2 * pbw,
                    405:                        save, GXcopy, AllPlanes);
                    406:                XFreePixmap (save);
                    407:                }
                    408:        XDestroyWindow (pop);
                    409:        if (freeze) XUngrabServer();
                    410:        XCloseFont (pfninfo);
                    411:        XFreeCursor (ur);
                    412:        XFreeCursor (ul);
                    413:        XFreeCursor (lr);
                    414:        XFreeCursor (ll);
                    415:        XFreePixmap (backmap);
                    416:        XFreePixmap (bdrmap);
                    417:        frame->x = min(x1, x2);
                    418:        frame->y = min(y1, y2);
                    419:        frame->width = width - mindim;
                    420:        frame->height = height - mindim;
                    421: makeit:        XCreateWindows(RootWindow, frame, 1);
                    422:        /* store default name of the window and set the resize hint */
                    423:        XStoreName(frame->self, prompt);
                    424:        XSetResizeHint(frame->self, minwidth, minheight, 1, 1);
                    425:        XSync(1);               /* get rid of any extraneous events */
                    426:        return (frame->self);
                    427:        }
                    428: 

unix.superglobalmegacorp.com

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