xcb_disp.c revision 1ab64890
11ab64890Smrg/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett 21ab64890Smrg * This file is licensed under the MIT license. See the file COPYING. */ 31ab64890Smrg 41ab64890Smrg#include "Xlibint.h" 51ab64890Smrg#include "Xxcbint.h" 61ab64890Smrg#include <xcb/xcbext.h> 71ab64890Smrg#include <X11/Xatom.h> 81ab64890Smrg#include <X11/Xresource.h> 91ab64890Smrg#include <stdio.h> 101ab64890Smrg 111ab64890Smrgstatic xcb_auth_info_t xauth; 121ab64890Smrg 131ab64890Smrgstatic void *alloc_copy(const void *src, int *dstn, size_t n) 141ab64890Smrg{ 151ab64890Smrg void *dst; 161ab64890Smrg if(n <= 0) 171ab64890Smrg { 181ab64890Smrg *dstn = 0; 191ab64890Smrg return 0; 201ab64890Smrg } 211ab64890Smrg dst = Xmalloc(n); 221ab64890Smrg if(!dst) 231ab64890Smrg return 0; 241ab64890Smrg memcpy(dst, src, n); 251ab64890Smrg *dstn = n; 261ab64890Smrg return dst; 271ab64890Smrg} 281ab64890Smrg 291ab64890Smrgvoid XSetAuthorization(char *name, int namelen, char *data, int datalen) 301ab64890Smrg{ 311ab64890Smrg _XLockMutex(_Xglobal_lock); 321ab64890Smrg Xfree(xauth.name); 331ab64890Smrg Xfree(xauth.data); 341ab64890Smrg 351ab64890Smrg /* if either of these allocs fail, _XConnectXCB won't use this auth 361ab64890Smrg * data, so we don't need to check it here. */ 371ab64890Smrg xauth.name = alloc_copy(name, &xauth.namelen, namelen); 381ab64890Smrg xauth.data = alloc_copy(data, &xauth.datalen, datalen); 391ab64890Smrg 401ab64890Smrg#if 0 /* but, for the paranoid among us: */ 411ab64890Smrg if((namelen > 0 && !xauth.name) || (datalen > 0 && !xauth.data)) 421ab64890Smrg { 431ab64890Smrg Xfree(xauth.name); 441ab64890Smrg Xfree(xauth.data); 451ab64890Smrg xauth.name = xauth.data = 0; 461ab64890Smrg xauth.namelen = xauth.datalen = 0; 471ab64890Smrg } 481ab64890Smrg#endif 491ab64890Smrg 501ab64890Smrg _XUnlockMutex(_Xglobal_lock); 511ab64890Smrg} 521ab64890Smrg 531ab64890Smrgint _XConnectXCB(Display *dpy, _Xconst char *display, char **fullnamep, int *screenp) 541ab64890Smrg{ 551ab64890Smrg char *host; 561ab64890Smrg int n = 0; 571ab64890Smrg int len; 581ab64890Smrg xcb_connection_t *c; 591ab64890Smrg 601ab64890Smrg dpy->fd = -1; 611ab64890Smrg 621ab64890Smrg dpy->xcb = Xcalloc(1, sizeof(_X11XCBPrivate)); 631ab64890Smrg if(!dpy->xcb) 641ab64890Smrg return 0; 651ab64890Smrg 661ab64890Smrg#ifdef HAVE_LAUNCHD 671ab64890Smrg if(!display || !*display) display = getenv("DISPLAY"); 681ab64890Smrg 691ab64890Smrg if(display && strlen(display)>11 && !strncmp(display, "/tmp/launch", 11)) { 701ab64890Smrg /* do nothing -- the magic happens inside of xcb_connect */ 711ab64890Smrg } else 721ab64890Smrg#endif 731ab64890Smrg { 741ab64890Smrg if(!xcb_parse_display(display, &host, &n, screenp)) 751ab64890Smrg return 0; 761ab64890Smrg 771ab64890Smrg len = strlen(host) + (1 + 20 + 1 + 20 + 1); 781ab64890Smrg *fullnamep = Xmalloc(len); 791ab64890Smrg snprintf(*fullnamep, len, "%s:%d.%d", host, n, *screenp); 801ab64890Smrg free(host); 811ab64890Smrg } 821ab64890Smrg 831ab64890Smrg _XLockMutex(_Xglobal_lock); 841ab64890Smrg if(xauth.name && xauth.data) 851ab64890Smrg c = xcb_connect_to_display_with_auth_info(display, &xauth, 0); 861ab64890Smrg else 871ab64890Smrg c = xcb_connect(display, 0); 881ab64890Smrg _XUnlockMutex(_Xglobal_lock); 891ab64890Smrg 901ab64890Smrg dpy->fd = xcb_get_file_descriptor(c); 911ab64890Smrg 921ab64890Smrg dpy->xcb->connection = c; 931ab64890Smrg dpy->xcb->pending_requests_tail = &dpy->xcb->pending_requests; 941ab64890Smrg dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection); 951ab64890Smrg 961ab64890Smrg return !xcb_connection_has_error(c); 971ab64890Smrg} 981ab64890Smrg 991ab64890Smrgvoid _XFreeX11XCBStructure(Display *dpy) 1001ab64890Smrg{ 1011ab64890Smrg /* reply_data was allocated by system malloc, not Xmalloc */ 1021ab64890Smrg free(dpy->xcb->reply_data); 1031ab64890Smrg while(dpy->xcb->pending_requests) 1041ab64890Smrg { 1051ab64890Smrg PendingRequest *tmp = dpy->xcb->pending_requests; 1061ab64890Smrg dpy->xcb->pending_requests = tmp->next; 1071ab64890Smrg free(tmp); 1081ab64890Smrg } 1091ab64890Smrg Xfree(dpy->xcb); 1101ab64890Smrg} 111