#include "Xlibint.h"
#include "Xxcbint.h"
#include <xcb/xcbext.h>
#include <X11/Xatom.h>
#include <X11/Xresource.h>
#include <stdio.h>
static xcb_auth_info_t xauth;
static void *alloc_copy(const void *src, int *dstn, size_t n)
{
void *dst;
if(n <= 0)
{
*dstn = 0;
return 0;
}
dst = Xmalloc(n);
if(!dst)
return 0;
memcpy(dst, src, n);
*dstn = n;
return dst;
}
void XSetAuthorization(char *name, int namelen, char *data, int datalen)
{
_XLockMutex(_Xglobal_lock);
Xfree(xauth.name);
Xfree(xauth.data);
xauth.name = alloc_copy(name, &xauth.namelen, namelen);
xauth.data = alloc_copy(data, &xauth.datalen, datalen);
#if 0
if((namelen > 0 && !xauth.name) || (datalen > 0 && !xauth.data))
{
Xfree(xauth.name);
Xfree(xauth.data);
xauth.name = xauth.data = 0;
xauth.namelen = xauth.datalen = 0;
}
#endif
_XUnlockMutex(_Xglobal_lock);
}
int _XConnectXCB(Display *dpy, _Xconst char *display, char **fullnamep, int *screenp)
{
char *host;
int n = 0;
int len;
xcb_connection_t *c;
dpy->fd = -1;
dpy->xcb = Xcalloc(1, sizeof(_X11XCBPrivate));
if(!dpy->xcb)
return 0;
if(!display || !*display) display = getenv("DISPLAY");
if(display && strlen(display)>11 && !strncmp(display, "/tmp/launch", 11)) {
} else {
if(!xcb_parse_display(display, &host, &n, screenp))
return 0;
len = strlen(host) + (1 + 20 + 1 + 20 + 1);
*fullnamep = Xmalloc(len);
snprintf(*fullnamep, len, "%s:%d.%d", host, n, *screenp);
free(host);
}
_XLockMutex(_Xglobal_lock);
if(xauth.name && xauth.data)
c = xcb_connect_to_display_with_auth_info(display, &xauth, 0);
else
c = xcb_connect(display, 0);
_XUnlockMutex(_Xglobal_lock);
dpy->fd = xcb_get_file_descriptor(c);
dpy->xcb->connection = c;
dpy->xcb->pending_requests_tail = &dpy->xcb->pending_requests;
dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection);
return !xcb_connection_has_error(c);
}
void _XFreeX11XCBStructure(Display *dpy)
{
free(dpy->xcb->reply_data);
while(dpy->xcb->pending_requests)
{
PendingRequest *tmp = dpy->xcb->pending_requests;
dpy->xcb->pending_requests = tmp->next;
free(tmp);
}
Xfree(dpy->xcb);
}