Annotation of researchv9/X11/src/X.V11R1/lib/X/XOpenDis.c, revision 1.1.1.1

1.1       root        1: #include "copyright.h"
                      2: #ifndef lint
                      3: static char *rcsid_xopendisplay_c = "$Header: XOpenDis.c,v 11.50 87/09/01 15:00:36 toddb Exp $";
                      4: #endif
                      5: /* Copyright    Massachusetts Institute of Technology    1985, 1986    */
                      6: 
                      7: /* Converted to V11 by jg */
                      8:  
                      9: #include <stdio.h>
                     10: #include "Xlibint.h"
                     11: #include <strings.h>
                     12: #include "Xatom.h"
                     13: 
                     14: #ifndef lint
                     15: static int lock;       /* get rid of ifdefs when locking implemented */
                     16: #endif
                     17: 
                     18: int _Xdebug = 0;
                     19: static xReq _dummy_request = {
                     20:        0, 0, 0
                     21: };
                     22: 
                     23: /* head of the linked list of open displays */
                     24: Display *_XHeadOfDisplayList = NULL;
                     25: 
                     26: extern _XWireToEvent();
                     27: extern _XUnknownNativeEvent();
                     28: extern _XUnknownWireEvent();
                     29: /* 
                     30:  * Connects to a server, creates a Display object and returns a pointer to
                     31:  * the newly created Display back to the caller.
                     32:  */
                     33: Display *XOpenDisplay (display)
                     34:        register char *display;
                     35: {
                     36:        register Display *dpy;          /* New Display object being created. */
                     37:        register int i;
                     38:        int j, k;                       /* random iterator indexes */
                     39:        char *display_name;             /* pointer to display name */
                     40:        int indian;                     /* to determine which indian. */
                     41:        xConnClientPrefix client;       /* client information */
                     42:        xConnSetupPrefix prefix;        /* prefix information */
                     43:        int vendorlen;                  /* length of vendor string */
                     44:        char *setup;                    /* memory allocated at startup */
                     45:        char displaybuf[256];           /* buffer to receive expanded name */
                     46:        int screen_num;                 /* screen number */
                     47:        union {
                     48:                xConnSetup *setup;
                     49:                char *failure;
                     50:                char *vendor;
                     51:                xPixmapFormat *sf;
                     52:                xWindowRoot *rp;
                     53:                xDepth *dp;
                     54:                xVisualType *vp;
                     55:        } u;
                     56:        long setuplength;       /* number of bytes in setup message */
                     57: 
                     58:        extern int _XSendClientPrefix();
                     59:        extern int _XConnectDisplay();
                     60:        extern char *getenv();
                     61:        extern XID _XAllocID();
                     62:  
                     63:        /*
                     64:         * If the display specifier string supplied as an argument to this 
                     65:         * routine is NULL or a pointer to NULL, read the DISPLAY variable.
                     66:         */
                     67:        if (display == NULL || *display == '\0') {
                     68:                if ((display_name = getenv("DISPLAY")) == NULL) {
                     69:                        /* Oops! No DISPLAY environment variable - error. */
                     70:                        return(NULL);
                     71:                }
                     72:        }
                     73:        else {
                     74:                /* Display is non-NULL, copy the pointer */
                     75:                display_name = display;
                     76:        }
                     77: 
                     78: /*
                     79:  * Attempt to allocate a display structure. Return NULL if allocation fails.
                     80:  */
                     81:        LockMutex(&lock);
                     82:        if ((dpy = (Display *)Xcalloc(1, sizeof(Display))) == NULL) {
                     83:                errno = ENOMEM;
                     84:                UnlockMutex(&lock);
                     85:                return(NULL);
                     86:        }
                     87: 
                     88: /*
                     89:  * Call the Connect routine to get the network socket. If 0 is returned, the
                     90:  * connection failed. The connect routine will return the expanded display
                     91:  * name in displaybuf.
                     92:  */
                     93: 
                     94:        if ((dpy->fd = _XConnectDisplay(display_name, displaybuf, &screen_num))
                     95:             < 0) {
                     96:                Xfree ((char *) dpy);
                     97:                UnlockMutex(&lock);
                     98:                return(NULL);           /* errno set by XConnectDisplay */
                     99:        }
                    100: 
                    101: /*
                    102:  * First byte is the byte order byte.
                    103:  * Authentication key is normally sent right after the connection.
                    104:  * This (in MIT's case) will be kerberos.
                    105:  */
                    106:        indian = 1;
                    107:        if (*(char *) &indian)
                    108:            client.byteOrder = 'l';
                    109:        else
                    110:            client.byteOrder = 'B';
                    111:        client.majorVersion = X_PROTOCOL;
                    112:        client.minorVersion = X_PROTOCOL_REVISION;
                    113:        _XSendClientPrefix (dpy, &client);
                    114: /*
                    115:  * Now see if connection was accepted...
                    116:  */
                    117:        _XRead (dpy, (char *)&prefix,(long)sizeof(xConnSetupPrefix));
                    118: 
                    119:        if (prefix.majorVersion < X_PROTOCOL) {
                    120:                (void) fputs ("Warning: Client built for newer server!\n", stderr);
                    121:        }
                    122:        if (prefix.minorVersion != X_PROTOCOL_REVISION) {
                    123:                (void) fputs (
                    124:                 "Warning: Protocol rev. of client does not match server!\n",
                    125:                  stderr);
                    126:        }
                    127: 
                    128:        setuplength = prefix.length << 2;
                    129:        if ( (u.setup = (xConnSetup *)(setup =  Xmalloc ((unsigned)setuplength)))
                    130:            == NULL) {
                    131:                errno = ENOMEM;
                    132:                Xfree ((char *)dpy);
                    133:                UnlockMutex(&lock);
                    134:                return(NULL);
                    135:        }
                    136:        _XRead (dpy, (char *)u.setup, setuplength);
                    137: /*
                    138:  * If the connection was not accepted by the server due to problems,
                    139:  * give error message to the user....
                    140:  */
                    141:        if (prefix.success != xTrue) {
                    142: /*
                    143:                (void) fwrite (u.failure, (int)*u.failure, sizeof(char), stderr);
                    144: */
                    145:                (void) fwrite (u.failure, sizeof(char),
                    146:                        (int)prefix.lengthReason, stderr);
                    147:                (void) fwrite ("\n", sizeof(char), 1, stderr);
                    148:                Xfree ((char *)dpy);
                    149:                Xfree (setup);
                    150:                UnlockMutex(&lock);
                    151:                return (NULL);
                    152:        }
                    153: 
                    154: /*
                    155:  * We succeeded at authorization, so let us move the data into
                    156:  * the display structure.
                    157:  */
                    158:        dpy->next               = (Display *) NULL;
                    159:        dpy->proto_major_version= prefix.majorVersion;
                    160:        dpy->proto_minor_version= prefix.minorVersion;
                    161:        dpy->release            = u.setup->release;
                    162:        dpy->resource_base      = u.setup->ridBase;
                    163:        dpy->resource_mask      = u.setup->ridMask;
                    164:        dpy->min_keycode        = u.setup->minKeyCode;
                    165:        dpy->max_keycode        = u.setup->maxKeyCode;
                    166:        dpy->keysyms            = (KeySym *) NULL;
                    167:        dpy->modifiermap        = XNewModifiermap(0);
                    168:        dpy->keysyms_per_keycode = 0;
                    169:        dpy->current            = None;
                    170:        dpy->xdefaults          = (char *)NULL;
                    171:        dpy->scratch_length     = 0L;
                    172:        dpy->scratch_buffer     = NULL;
                    173:        dpy->motion_buffer      = u.setup->motionBufferSize;
                    174:        dpy->nformats           = u.setup->numFormats;
                    175:        dpy->nscreens           = u.setup->numRoots;
                    176:        dpy->byte_order         = u.setup->imageByteOrder;
                    177:        dpy->bitmap_unit        = u.setup->bitmapScanlineUnit;
                    178:        dpy->bitmap_pad         = u.setup->bitmapScanlinePad;
                    179:        dpy->bitmap_bit_order   = u.setup->bitmapBitOrder;
                    180:        dpy->max_request_size   = u.setup->maxRequestSize;
                    181:        dpy->ext_procs          = (_XExtension *)NULL;
                    182:        dpy->ext_data           = (XExtData *)NULL;
                    183:        dpy->ext_number         = 0;
                    184:        dpy->event_vec[X_Error] = _XUnknownWireEvent;
                    185:        dpy->event_vec[X_Reply] = _XUnknownWireEvent;
                    186:        dpy->wire_vec[X_Error]  = _XUnknownNativeEvent;
                    187:        dpy->wire_vec[X_Reply]  = _XUnknownNativeEvent;
                    188:        for (i = KeyPress; i < LASTEvent; i++) {
                    189:            dpy->event_vec[i]   = _XWireToEvent;
                    190:            dpy->wire_vec[i]    = NULL;
                    191:        }
                    192:        for (i = LASTEvent; i < 128; i++) {
                    193:            dpy->event_vec[i]   = _XUnknownWireEvent;
                    194:            dpy->wire_vec[i]    = _XUnknownNativeEvent;
                    195:        }
                    196:        dpy->resource_id        = 0;
                    197:        dpy->resource_shift     = ffs(dpy->resource_mask) - 1;
                    198:        dpy->db                 = (struct _XrmResourceDataBase *)NULL;
                    199: /* 
                    200:  * Initialize pointers to NULL so that XFreeDisplayStructure will
                    201:  * work if we run out of memory
                    202:  */
                    203: 
                    204:        dpy->screens = NULL;
                    205:        dpy->display_name = NULL;
                    206:        dpy->buffer = NULL;
                    207: 
                    208: /*
                    209:  * now extract the vendor string...  String must be null terminated,
                    210:  * padded to multiple of 4 bytes.
                    211:  */
                    212:        dpy->vendor = (char *) Xmalloc (u.setup->nbytesVendor + 1);
                    213:        vendorlen = u.setup->nbytesVendor;
                    214:        u.setup += 1;   /* can't touch information in XConnSetup anymore..*/
                    215:        (void) strncpy(dpy->vendor, u.vendor, vendorlen);
                    216:        u.vendor += (vendorlen + 3) & ~3;
                    217: /*
                    218:  * Now iterate down setup information.....
                    219:  */
                    220:        dpy->pixmap_format = 
                    221:            (ScreenFormat *)Xmalloc(
                    222:                (unsigned) (dpy->nformats *sizeof(ScreenFormat)));
                    223:        if (dpy->pixmap_format == NULL) {
                    224:                OutOfMemory (dpy, setup);
                    225:                UnlockMutex(&lock);
                    226:                return(NULL);
                    227:        }
                    228: /*
                    229:  * First decode the Z axis Screen format information.
                    230:  */
                    231:        for (i = 0; i < dpy->nformats; i++) {
                    232:            register ScreenFormat *fmt = &dpy->pixmap_format[i];
                    233:            fmt->depth = u.sf->depth;
                    234:            fmt->bits_per_pixel = u.sf->bitsPerPixel;
                    235:            fmt->scanline_pad = u.sf->scanLinePad;
                    236:            fmt->ext_data = NULL;
                    237:            u.sf += 1;
                    238:        }
                    239: 
                    240: /*
                    241:  * next the Screen structures.
                    242:  */
                    243:        dpy->screens = 
                    244:            (Screen *)Xmalloc((unsigned) dpy->nscreens*sizeof(Screen));
                    245:        if (dpy->screens == NULL) {
                    246:                OutOfMemory (dpy, setup);
                    247:                UnlockMutex(&lock);
                    248:                return(NULL);
                    249:        }
                    250: /*
                    251:  * Now go deal with each screen structure.
                    252:  */
                    253:        for (i = 0; i < dpy->nscreens; i++) {
                    254:            register Screen *sp = &dpy->screens[i];
                    255:            VisualID root_visualID = u.rp->rootVisualID;
                    256:            sp->display     = dpy;
                    257:            sp->root        = u.rp->windowId;
                    258:            sp->cmap        = u.rp->defaultColormap;
                    259:            sp->white_pixel = u.rp->whitePixel;
                    260:            sp->black_pixel = u.rp->blackPixel;
                    261:            sp->root_input_mask = u.rp->currentInputMask;
                    262:            sp->width       = u.rp->pixWidth;
                    263:            sp->height      = u.rp->pixHeight;
                    264:            sp->mwidth      = u.rp->mmWidth;
                    265:            sp->mheight     = u.rp->mmHeight;
                    266:            sp->min_maps    = u.rp->minInstalledMaps;
                    267:            sp->max_maps    = u.rp->maxInstalledMaps;
                    268:            sp->root_visual = NULL;  /* filled in later, when we alloc Visuals */
                    269:            sp->backing_store= u.rp->backingStore;
                    270:            sp->save_unders = u.rp->saveUnders;
                    271:            sp->root_depth  = u.rp->rootDepth;
                    272:            sp->ndepths     = u.rp->nDepths;
                    273:            sp->ext_data   = NULL;
                    274:            u.rp += 1;
                    275: /*
                    276:  * lets set up the depth structures.
                    277:  */
                    278:            sp->depths = (Depth *)Xmalloc(
                    279:                        (unsigned)sp->ndepths*sizeof(Depth));
                    280:            if (sp->depths == NULL) {
                    281:                OutOfMemory (dpy, setup);
                    282:                UnlockMutex(&lock);
                    283:                return(NULL);
                    284:            }
                    285:            /*
                    286:             * for all depths on this screen.
                    287:             */
                    288:            for (j = 0; j < sp->ndepths; j++) {
                    289:                Depth *dp = &sp->depths[j];
                    290:                dp->depth = u.dp->depth;
                    291:                dp->nvisuals = u.dp->nVisuals;
                    292:                u.dp += 1;
                    293:                dp->visuals = 
                    294:                  (Visual *)Xmalloc((unsigned)dp->nvisuals*sizeof(Visual));
                    295:                if (dp->visuals == NULL) {
                    296:                    OutOfMemory (dpy, setup);
                    297:                    UnlockMutex(&lock);
                    298:                    return(NULL);
                    299:                }
                    300:                for (k = 0; k < dp->nvisuals; k++) {
                    301:                        register Visual *vp = &dp->visuals[k];
                    302:                        if ((vp->visualid = u.vp->visualID) == root_visualID)
                    303:                           sp->root_visual = vp;
                    304:                        vp->class       = u.vp->class;
                    305:                        vp->bits_per_rgb= u.vp->bitsPerRGB;
                    306:                        vp->map_entries = u.vp->colormapEntries;
                    307:                        vp->red_mask    = u.vp->redMask;
                    308:                        vp->green_mask  = u.vp->greenMask;
                    309:                        vp->blue_mask   = u.vp->blueMask;
                    310:                        vp->ext_data    = NULL;
                    311:                        u.vp += 1;
                    312:                }
                    313:            }
                    314:        }
                    315:                
                    316: 
                    317: /*
                    318:  * Setup other information in this display structure.
                    319:  */
                    320:        dpy->vnumber = X_PROTOCOL;
                    321:        dpy->resource_alloc = _XAllocID;
                    322:        dpy->synchandler = NULL;
                    323:        dpy->request = 0;
                    324:        dpy->last_request_read = 0;
                    325:        dpy->default_screen = screen_num;  /* Value returned by ConnectDisplay */
                    326:        dpy->last_req = (char *)&_dummy_request;
                    327: 
                    328:        /* Salt away the host:display string for later use */
                    329:        if ((dpy->display_name = Xmalloc(
                    330:                (unsigned) (strlen(displaybuf) + 1))) == NULL) {
                    331:                OutOfMemory (dpy, setup);
                    332:                UnlockMutex(&lock);
                    333:                return(NULL);
                    334:        }
                    335:        (void) strcpy (dpy->display_name, displaybuf);
                    336:  
                    337:        /* Set up the output buffers. */
                    338:        if ((dpy->bufptr = dpy->buffer = Xmalloc(BUFSIZE)) == NULL) {
                    339:                OutOfMemory (dpy, setup);
                    340:                UnlockMutex(&lock);
                    341:                return(NULL);
                    342:        }
                    343:        dpy->bufmax = dpy->buffer + BUFSIZE;
                    344:  
                    345:        /* Set up the input event queue and input event queue parameters. */
                    346:        dpy->head = dpy->tail = NULL;
                    347:        dpy->qlen = 0;
                    348:  
                    349: /*
                    350:  * Now start talking to the server to setup all other information...
                    351:  */
                    352: 
                    353:        Xfree (setup);  /* all finished with setup information */
                    354: /*
                    355:  * Set up other stuff clients are always going to use.
                    356:  */
                    357:        for (i = 0; i < dpy->nscreens; i++) {
                    358:            register Screen *sp = &dpy->screens[i];
                    359:            XGCValues values;
                    360:            values.foreground = sp->white_pixel;
                    361:            values.background = sp->black_pixel;
                    362:            sp->default_gc = XCreateGC (dpy, sp->root,
                    363:                        GCForeground|GCBackground, &values);
                    364:        }
                    365: /*
                    366:  * call into synchronization routine so that all programs can be
                    367:  * forced synchronize
                    368:  */
                    369:        (void) XSynchronize(dpy, _Xdebug);
                    370: /*
                    371:  * chain this stucture onto global list.
                    372:  */
                    373:        dpy->next = _XHeadOfDisplayList;
                    374:        _XHeadOfDisplayList = dpy;
                    375:        UnlockDisplay(dpy);
                    376:        UnlockMutex(&lock);
                    377: /*
                    378:  * get the resource manager database off the root window.
                    379:  */
                    380:        {
                    381:            Atom actual_type;
                    382:            int actual_format;
                    383:            unsigned long nitems;
                    384:            long leftover;
                    385:            if (XGetWindowProperty(dpy, RootWindow(dpy, 0), 
                    386:                XA_RESOURCE_MANAGER, 0L, 100000000L, False, XA_STRING,
                    387:                &actual_type, &actual_format, &nitems, &leftover, 
                    388:                &dpy->xdefaults) != Success) {
                    389:                        dpy->xdefaults = (char *) NULL;
                    390:                }
                    391:            else {
                    392:            if ( (actual_type != XA_STRING) ||  (actual_format != 8) ) {
                    393:                if (dpy->xdefaults != NULL) Xfree ( dpy->xdefaults );
                    394:                }
                    395:            }
                    396:        }
                    397:        return(dpy);
                    398: }
                    399: 
                    400: 
                    401: /* OutOfMemory is called if malloc fails.  XOpenDisplay returns NULL
                    402:    after this returns. */
                    403: 
                    404: static OutOfMemory (dpy, setup)
                    405:     Display *dpy;
                    406:     char *setup;
                    407:     {
                    408:     _XDisconnectDisplay (dpy->fd);
                    409:     _XFreeDisplayStructure (dpy);
                    410:     Xfree (setup);
                    411:     errno = ENOMEM;
                    412:     }
                    413: 
                    414: 
                    415: /* XFreeDisplayStructure frees all the storage associated with a 
                    416:  * Display.  It is used by XOpenDisplay if it runs out of memory,
                    417:  * and also by XCloseDisplay.   It needs to check whether all pointers
                    418:  * are non-NULL before dereferencing them, since it may be called
                    419:  * by XOpenDisplay before the Display structure is fully formed.
                    420:  * XOpenDisplay must be sure to initialize all the pointers to NULL
                    421:  * before the first possible call on this.
                    422:  */
                    423: 
                    424: _XFreeDisplayStructure(dpy)
                    425:        register Display *dpy;
                    426: {
                    427:        if (dpy->screens) {
                    428:            register int i;
                    429: 
                    430:             for (i = 0; i < dpy->nscreens; i++) {
                    431:                Screen *sp = &dpy->screens[i];
                    432: 
                    433:                if (sp->depths) {
                    434:                   register int j;
                    435: 
                    436:                   for (j = 0; j < sp->ndepths; j++) {
                    437:                        Depth *dp = &sp->depths[j];
                    438: 
                    439:                        if (dp->visuals) {
                    440:                           register int k;
                    441: 
                    442:                           for (k = 0; k < dp->nvisuals; k++)
                    443:                             _XFreeExtData (dp->visuals[k].ext_data);
                    444:                           Xfree ((char *) dp->visuals);
                    445:                           }
                    446:                        }
                    447: 
                    448:                   Xfree ((char *) sp->depths);
                    449:                   }
                    450: 
                    451:                _XFreeExtData (sp->ext_data);
                    452:                }
                    453: 
                    454:            Xfree ((char *)dpy->screens);
                    455:            }
                    456:        
                    457:        if (dpy->pixmap_format) {
                    458:            register int i;
                    459: 
                    460:            for (i = 0; i < dpy->nformats; i++)
                    461:              _XFreeExtData (dpy->pixmap_format[i].ext_data);
                    462:             Xfree ((char *)dpy->pixmap_format);
                    463:            }
                    464: 
                    465:        if (dpy->display_name)
                    466:           Xfree (dpy->display_name);
                    467: 
                    468:         if (dpy->buffer)
                    469:           Xfree (dpy->buffer);
                    470:        if (dpy->keysyms)
                    471:           Xfree ((char *) dpy->keysyms);
                    472:        if (dpy->xdefaults)
                    473:           Xfree (dpy->xdefaults);
                    474: 
                    475:        _XFreeExtData (dpy->ext_data);
                    476:         
                    477:        Xfree ((char *)dpy);
                    478: }

unix.superglobalmegacorp.com

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