Commit by Josh Triplett and Jamey Sharp.

Signed-off-by: Josh Triplett <[email protected]>
Signed-off-by: Jamey Sharp <[email protected]>
Signed-off-by: Mike Blumenkrantz <[email protected]>
---
 src/OpenDis.c  | 44 +++++++++++++++++++++++++++++++++++---------
 src/Xxcbint.h  |  3 +--
 src/xcb_disp.c | 38 +++-----------------------------------
 3 files changed, 39 insertions(+), 46 deletions(-)

diff --git a/src/OpenDis.c b/src/OpenDis.c
index 636860e..8f6d1ef 100644
--- a/src/OpenDis.c
+++ b/src/OpenDis.c
@@ -64,6 +64,7 @@ Display *
 XOpenDisplay (
        register _Xconst char *display)
 {
+       xcb_connection_t *c;
        register Display *dpy;          /* New Display object
being created. */ register int i;
        int j, k;                       /* random iterator indexes */
@@ -110,26 +111,42 @@ XOpenDisplay (
        if (_XIOErrorFunction == NULL) (void) XSetIOErrorHandler
(NULL); 
 /*
+ * Call the Connect routine to get the transport connection object.
+ * If NULL is returned, the connection failed.
+ */
+
+       c = _XConnectXCB(display, &iscreen);
+       if(!c || xcb_connection_has_error(c)) {
+               return NULL;
+       }
+
+/*
  * Attempt to allocate a display structure. Return NULL if allocation
fails. */
-       if ((dpy = Xcalloc(1, sizeof(Display))) == NULL) {
-               return(NULL);
+       if ((dpy = (Display *)Xcalloc(1, sizeof(Display) +
sizeof(_X11XCBPrivate))) == NULL) {
+               xcb_disconnect(c);
+               return NULL ;
        }
 
+       dpy->fd = xcb_get_file_descriptor(c);
+       dpy->xcb = (_X11XCBPrivate *) (dpy + 1);
+       dpy->xcb->connection = c;
+
        if ((dpy->display_name = strdup(display_name)) == NULL) {
                OutOfMemory(dpy);
-               return(NULL);
+               return NULL;
        }
 
-/*
- * Call the Connect routine to get the transport connection object.
- * If NULL is returned, the connection failed.
- */
+       dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection);
 
-       if(!_XConnectXCB(dpy, display, &iscreen)) {
+       dpy->xcb->event_notify = xcondition_malloc();
+       dpy->xcb->reply_notify = xcondition_malloc();
+       if (!dpy->xcb->event_notify || !dpy->xcb->reply_notify) {
                OutOfMemory(dpy);
                return NULL;
        }
+       xcondition_init(dpy->xcb->event_notify);
+       xcondition_init(dpy->xcb->reply_notify);
 
        /* Initialize as much of the display structure as we can.
         * Initialize pointers to NULL so that XFreeDisplayStructure
will @@ -691,7 +708,16 @@ void _XFreeDisplayStructure(Display *dpy)
 
        Xfree (dpy->filedes);
 
-       _XFreeX11XCBStructure(dpy);
+       /* reply_data was allocated by system malloc, not Xmalloc */
+       free(dpy->xcb->reply_data);
+       while(dpy->xcb->pending_requests)
+       {
+               PendingRequest *tmp = dpy->xcb->pending_requests;
+               dpy->xcb->pending_requests = tmp->next;
+               free(tmp);
+       }
+       xcondition_free(dpy->xcb->event_notify);
+       xcondition_free(dpy->xcb->reply_notify);
 
        Xfree (dpy);
 }
diff --git a/src/Xxcbint.h b/src/Xxcbint.h
index bf41c23..b4f8988 100644
--- a/src/Xxcbint.h
+++ b/src/Xxcbint.h
@@ -43,8 +43,7 @@ typedef struct _X11XCBPrivate {
 
 /* xcb_disp.c */
 
-int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp);
-void _XFreeX11XCBStructure(Display *dpy);
+xcb_connection_t *_XConnectXCB(_Xconst char *display, int *screenp);
 
 unsigned long _XNextRequest(Display *dpy);
 
diff --git a/src/xcb_disp.c b/src/xcb_disp.c
index 0fa40de..74f87c0 100644
--- a/src/xcb_disp.c
+++ b/src/xcb_disp.c
@@ -54,20 +54,14 @@ void XSetAuthorization(char *name, int namelen,
char *data, int datalen) _XUnlockMutex(_Xglobal_lock);
 }
 
-int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp)
+xcb_connection_t *_XConnectXCB(_Xconst char *display, int *screenp)
 {
        char *host;
        int n = 0;
        xcb_connection_t *c;
 
-       dpy->fd = -1;
-
-       dpy->xcb = Xcalloc(1, sizeof(_X11XCBPrivate));
-       if(!dpy->xcb)
-               return 0;
-
        if(!xcb_parse_display(display, &host, &n, screenp))
-               return 0;
+               return NULL;
        /* host and n are unused, but xcb_parse_display requires them
*/ free(host);
 
@@ -78,31 +72,5 @@ int _XConnectXCB(Display *dpy, _Xconst char
*display, int *screenp) c = xcb_connect(display, NULL);
        _XUnlockMutex(_Xglobal_lock);
 
-       dpy->fd = xcb_get_file_descriptor(c);
-
-       dpy->xcb->connection = c;
-       dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection);
-
-       dpy->xcb->event_notify = xcondition_malloc();
-       dpy->xcb->reply_notify = xcondition_malloc();
-       if (!dpy->xcb->event_notify || !dpy->xcb->reply_notify)
-               return 0;
-       xcondition_init(dpy->xcb->event_notify);
-       xcondition_init(dpy->xcb->reply_notify);
-       return !xcb_connection_has_error(c);
-}
-
-void _XFreeX11XCBStructure(Display *dpy)
-{
-       /* reply_data was allocated by system malloc, not Xmalloc */
-       free(dpy->xcb->reply_data);
-       while(dpy->xcb->pending_requests)
-       {
-               PendingRequest *tmp = dpy->xcb->pending_requests;
-               dpy->xcb->pending_requests = tmp->next;
-               free(tmp);
-       }
-       xcondition_free(dpy->xcb->event_notify);
-       xcondition_free(dpy->xcb->reply_notify);
-       Xfree(dpy->xcb);
+       return c;
 }
-- 
2.4.2

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to