Ticket #799: 0509-x11-Partially-convert-to-XCB.patch

File 0509-x11-Partially-convert-to-XCB.patch, 18.9 kB (added by coling, 21 months ago)

XCB conversion for libpulse (some server side modules still use Xlib)

  • configure.ac

    From dbecf6ff7dda40ebb17016d7f1f2d47a7123d50c Mon Sep 17 00:00:00 2001
    From: Colin Guthrie <cguthrie@mandriva.org>
    Date: Sat, 29 May 2010 19:33:54 +0100
    Subject: [PATCH] x11: Partially convert to XCB.
    
    This commit mostly converts the X11 handling to XCB. There are still
    some uses of XLib to deal with the X11 session handling modules, however all
    client-side code should now be free of XLib and thus this should fix Bug #799
    ---
     configure.ac                         |    2 +-
     src/modules/x11/module-x11-publish.c |   35 +++++++++---------
     src/pulse/client-conf-x11.c          |   23 ++++++------
     src/pulsecore/x11prop.c              |   55 +++++++++++++++++-----------
     src/pulsecore/x11prop.h              |    9 +++--
     src/pulsecore/x11wrap.c              |    4 ++
     src/pulsecore/x11wrap.h              |    4 ++
     src/utils/pax11publish.c             |   67 +++++++++++++++++-----------------
     8 files changed, 109 insertions(+), 90 deletions(-)
    
    diff --git a/configure.ac b/configure.ac
    index c9ec490..b10bb54 100644
    a b  
    516516        [x11=auto]) 
    517517 
    518518if test "x${x11}" != xno ; then 
    519     PKG_CHECK_MODULES(X11, [ x11 ice sm xtst ], 
     519    PKG_CHECK_MODULES(X11, [ x11-xcb ice sm xtst xcb-atom ], 
    520520        HAVE_X11=1, 
    521521        [ 
    522522            HAVE_X11=0 
  • src/modules/x11/module-x11-publish.c

    diff --git a/src/modules/x11/module-x11-publish.c b/src/modules/x11/module-x11-publish.c
    index 7ee1b6d..e811bdf 100644
    a b  
    2828#include <string.h> 
    2929#include <unistd.h> 
    3030 
    31 #include <X11/Xlib.h> 
    32 #include <X11/Xatom.h> 
     31#include <xcb/xcb.h> 
    3332 
    3433#include <pulse/util.h> 
    3534#include <pulse/xmalloc.h> 
     
    9291        s = pa_strlist_tostring(l); 
    9392        pa_strlist_reverse(l); 
    9493 
    95         pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SERVER", s); 
     94        pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SERVER", s); 
    9695        pa_xfree(s); 
    9796    } else 
    98         pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SERVER"); 
     97        pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SERVER"); 
    9998} 
    10099 
    101100static pa_hook_result_t servers_changed_cb(void *hook_data, void *call_data, void *slot_data) { 
     
    105104 
    106105    pa_assert(u); 
    107106 
    108     if (!pa_x11_get_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) { 
     107    if (!pa_x11_get_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) { 
    109108        pa_log_warn("PulseAudio information vanished from X11!"); 
    110109        return PA_HOOK_OK; 
    111110    } 
     
    168167    u->id = pa_sprintf_malloc("%lu@%s/%lu", (unsigned long) getuid(), mid, (unsigned long) getpid()); 
    169168    pa_xfree(mid); 
    170169 
    171     pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID", u->id); 
     170    pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID", u->id); 
    172171 
    173172    if ((sid = pa_session_id())) { 
    174         pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SESSION_ID", sid); 
     173        pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SESSION_ID", sid); 
    175174        pa_xfree(sid); 
    176175    } 
    177176 
    178177    publish_servers(u, pa_native_protocol_servers(u->protocol)); 
    179178 
    180179    if ((t = pa_modargs_get_value(ma, "source", NULL))) 
    181         pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SOURCE", t); 
     180        pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SOURCE", t); 
    182181 
    183182    if ((t = pa_modargs_get_value(ma, "sink", NULL))) 
    184         pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SINK", t); 
     183        pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SINK", t); 
    185184 
    186     pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_COOKIE", 
     185    pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_COOKIE", 
    187186                    pa_hexstr(pa_auth_cookie_read(u->auth_cookie, PA_NATIVE_COOKIE_LENGTH), PA_NATIVE_COOKIE_LENGTH, hx, sizeof(hx))); 
    188187 
    189188    u->x11_client = pa_x11_client_new(u->x11_wrapper, NULL, x11_kill_cb, u); 
     
    216215        char t[256]; 
    217216 
    218217        /* Yes, here is a race condition */ 
    219         if (!pa_x11_get_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) 
     218        if (!pa_x11_get_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) 
    220219            pa_log_warn("PulseAudio information vanished from X11!"); 
    221220        else { 
    222             pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID"); 
    223             pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SERVER"); 
    224             pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SINK"); 
    225             pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SOURCE"); 
    226             pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_COOKIE"); 
    227             pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SESSION_ID"); 
    228             XSync(pa_x11_wrapper_get_display(u->x11_wrapper), False); 
     221            pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID"); 
     222            pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SERVER"); 
     223            pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SINK"); 
     224            pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SOURCE"); 
     225            pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_COOKIE"); 
     226            pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SESSION_ID"); 
     227            xcb_flush(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper)); 
    229228        } 
    230229 
    231230        pa_x11_wrapper_unref(u->x11_wrapper); 
  • src/pulse/client-conf-x11.c

    diff --git a/src/pulse/client-conf-x11.c b/src/pulse/client-conf-x11.c
    index 4970363..565f997 100644
    a b  
    2525 
    2626#include <string.h> 
    2727 
    28 #include <X11/Xlib.h> 
    29 #include <X11/Xatom.h> 
     28#include <xcb/xcb.h> 
    3029 
    3130#include <pulse/xmalloc.h> 
    3231#include <pulse/i18n.h> 
     
    3938#include "client-conf-x11.h" 
    4039 
    4140int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { 
    42     Display *d = NULL; 
     41    xcb_connection_t *xcb = NULL; 
    4342    int ret = -1; 
    4443    char t[1024]; 
    4544 
     
    5150    if (*dname == 0) 
    5251        goto finish; 
    5352 
    54     if (!(d = XOpenDisplay(dname))) { 
    55         pa_log(_("XOpenDisplay() failed")); 
     53    if (!(xcb = xcb_connect(dname, NULL))) { 
     54        pa_log(_("xcb_connect() failed")); 
    5655        goto finish; 
    5756    } 
    5857 
    59     if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) { 
     58    if (pa_x11_get_prop(xcb, "PULSE_SERVER", t, sizeof(t))) { 
    6059        pa_bool_t disable_autospawn = TRUE; 
    6160 
    6261        pa_xfree(c->default_server); 
    6362        c->default_server = pa_xstrdup(t); 
    6463 
    65         if (pa_x11_get_prop(d, "PULSE_SESSION_ID", t, sizeof(t))) { 
     64        if (pa_x11_get_prop(xcb, "PULSE_SESSION_ID", t, sizeof(t))) { 
    6665            char *id; 
    6766 
    6867            if ((id = pa_session_id())) { 
     
    7675            c->autospawn = FALSE; 
    7776    } 
    7877 
    79     if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) { 
     78    if (pa_x11_get_prop(xcb, "PULSE_SINK", t, sizeof(t))) { 
    8079        pa_xfree(c->default_sink); 
    8180        c->default_sink = pa_xstrdup(t); 
    8281    } 
    8382 
    84     if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t))) { 
     83    if (pa_x11_get_prop(xcb, "PULSE_SOURCE", t, sizeof(t))) { 
    8584        pa_xfree(c->default_source); 
    8685        c->default_source = pa_xstrdup(t); 
    8786    } 
    8887 
    89     if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) { 
     88    if (pa_x11_get_prop(xcb, "PULSE_COOKIE", t, sizeof(t))) { 
    9089        uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; 
    9190 
    9291        if (pa_parsehex(t, cookie, sizeof(cookie)) != sizeof(cookie)) { 
     
    106105    ret = 0; 
    107106 
    108107finish: 
    109     if (d) 
    110         XCloseDisplay(d); 
     108    if (xcb) 
     109        xcb_disconnect(xcb); 
    111110 
    112111    return ret; 
    113112 
  • src/pulsecore/x11prop.c

    diff --git a/src/pulsecore/x11prop.c b/src/pulsecore/x11prop.c
    index 873a76e..cc5987a 100644
    a b  
    2525 
    2626#include <string.h> 
    2727 
    28 #include <X11/Xlib.h> 
    29 #include <X11/Xatom.h> 
    30  
    3128#include "x11prop.h" 
    3229 
    33 void pa_x11_set_prop(Display *d, const char *name, const char *data) { 
    34     Atom a = XInternAtom(d, name, False); 
    35     XChangeProperty(d, RootWindow(d, 0), a, XA_STRING, 8, PropModeReplace, (const unsigned char*) data, (int) (strlen(data)+1)); 
     30#include <xcb/xproto.h> 
     31#include <xcb/xcb_atom.h> 
     32 
     33#define PA_XCB_FORMAT 8 
     34 
     35void pa_x11_set_prop(xcb_connection_t *xcb, const char *name, const char *data) { 
     36    xcb_screen_t *screen; 
     37    xcb_atom_t a = xcb_atom_get(xcb, name); 
     38    screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; 
     39    xcb_change_property(xcb, XCB_PROP_MODE_REPLACE, screen->root, a, STRING, PA_XCB_FORMAT, (int) strlen(data), (const void*) data); 
    3640} 
    3741 
    38 void pa_x11_del_prop(Display *d, const char *name) { 
    39     Atom a = XInternAtom(d, name, False); 
    40     XDeleteProperty(d, RootWindow(d, 0), a); 
     42void pa_x11_del_prop(xcb_connection_t *xcb, const char *name) { 
     43    xcb_screen_t *screen; 
     44    xcb_atom_t a = xcb_atom_get(xcb, name); 
     45    screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; 
     46    xcb_delete_property(xcb, screen->root, a); 
    4147} 
    4248 
    43 char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l) { 
    44     Atom actual_type; 
    45     int actual_format; 
    46     unsigned long nitems; 
    47     unsigned long nbytes_after; 
    48     unsigned char *prop = NULL; 
     49char* pa_x11_get_prop(xcb_connection_t *xcb, const char *name, char *p, size_t l) { 
    4950    char *ret = NULL; 
     51    int len; 
     52    xcb_get_property_cookie_t req; 
     53    xcb_get_property_reply_t* prop = NULL; 
     54    xcb_screen_t *screen; 
     55    xcb_atom_t a = xcb_atom_get(xcb, name); 
     56    screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; 
     57 
     58    req = xcb_get_property(xcb, 0, screen->root, a, STRING, 0, (uint32_t)(l-1)); 
     59    prop = xcb_get_property_reply(xcb, req, NULL); 
     60 
     61    if (!prop) 
     62        goto finish; 
    5063 
    51     Atom a = XInternAtom(d, name, False); 
    52     if (XGetWindowProperty(d, RootWindow(d, 0), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop) != Success) 
     64    if (PA_XCB_FORMAT != prop->format) 
    5365        goto finish; 
    5466 
    55     if (actual_type != XA_STRING) 
     67    len = xcb_get_property_value_length(prop); 
     68    if (len < 1 || len >= (int)l) 
    5669        goto finish; 
    5770 
    58     memcpy(p, prop, nitems); 
    59     p[nitems] = 0; 
     71    memcpy(p, xcb_get_property_value(prop), len); 
     72    p[len] = 0; 
    6073 
    6174    ret = p; 
    6275 
    6376finish: 
    6477 
    6578    if (prop) 
    66         XFree(prop); 
     79        free(prop); 
    6780 
    6881    return ret; 
    6982} 
  • src/pulsecore/x11prop.h

    diff --git a/src/pulsecore/x11prop.h b/src/pulsecore/x11prop.h
    index dc67526..7492261 100644
    a b  
    55  This file is part of PulseAudio. 
    66 
    77  Copyright 2004-2006 Lennart Poettering 
     8  Copyright 2010 Colin Guthrie 
    89 
    910  PulseAudio is free software; you can redistribute it and/or modify 
    1011  it under the terms of the GNU Lesser General Public License as published 
     
    2425 
    2526#include <sys/types.h> 
    2627 
    27 #include <X11/Xlib.h> 
     28#include <xcb/xcb.h> 
    2829 
    29 void pa_x11_set_prop(Display *d, const char *name, const char *data); 
    30 void pa_x11_del_prop(Display *d, const char *name); 
    31 char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l); 
     30void pa_x11_set_prop(xcb_connection_t *xcb, const char *name, const char *data); 
     31void pa_x11_del_prop(xcb_connection_t *xcb, const char *name); 
     32char* pa_x11_get_prop(xcb_connection_t *xcb, const char *name, char *p, size_t l); 
    3233 
    3334#endif 
  • src/pulsecore/x11wrap.c

    diff --git a/src/pulsecore/x11wrap.c b/src/pulsecore/x11wrap.c
    index 1960a12..454507a 100644
    a b  
    259259    return w->display; 
    260260} 
    261261 
     262xcb_connection_t *pa_x11_wrapper_get_xcb_connection(pa_x11_wrapper *w) { 
     263    return XGetXCBConnection(pa_x11_wrapper_get_display(w)); 
     264} 
     265 
    262266void pa_x11_wrapper_kill(pa_x11_wrapper *w) { 
    263267    pa_x11_client *c, *n; 
    264268 
  • src/pulsecore/x11wrap.h

    diff --git a/src/pulsecore/x11wrap.h b/src/pulsecore/x11wrap.h
    index b57541f..fc2e01f 100644
    a b  
    2323***/ 
    2424 
    2525#include <X11/Xlib.h> 
     26#include <X11/Xlib-xcb.h> 
    2627 
    2728#include <pulsecore/core.h> 
    2829 
     
    4647/* Return the X11 display object for this connection */ 
    4748Display *pa_x11_wrapper_get_display(pa_x11_wrapper *w); 
    4849 
     50/* Return the XCB connection object for this connection */ 
     51xcb_connection_t *pa_x11_wrapper_get_xcb_connection(pa_x11_wrapper *w); 
     52 
    4953/* Kill the connection to the X11 display */ 
    5054void pa_x11_wrapper_kill(pa_x11_wrapper *w); 
    5155 
  • src/utils/pax11publish.c

    diff --git a/src/utils/pax11publish.c b/src/utils/pax11publish.c
    index a9eb329..111bee2 100644
    a b  
    2929#include <assert.h> 
    3030#include <locale.h> 
    3131 
    32 #include <X11/Xlib.h> 
    33 #include <X11/Xatom.h> 
     32#include <xcb/xcb.h> 
    3433 
    3534#include <pulse/util.h> 
    3635#include <pulse/i18n.h> 
     
    4645int main(int argc, char *argv[]) { 
    4746    const char *dname = NULL, *sink = NULL, *source = NULL, *server = NULL, *cookie_file = PA_NATIVE_COOKIE_FILE; 
    4847    int c, ret = 1; 
    49     Display *d = NULL; 
     48    xcb_connection_t *xcb = NULL; 
    5049    enum { DUMP, EXPORT, IMPORT, REMOVE } mode = DUMP; 
    5150 
    5251    setlocale(LC_ALL, ""); 
     
    9695        } 
    9796    } 
    9897 
    99     if (!(d = XOpenDisplay(dname))) { 
    100         pa_log(_("XOpenDisplay() failed")); 
     98    if (!(xcb = xcb_connect(dname, NULL))) { 
     99        pa_log(_("xcb_connect() failed")); 
    101100        goto finish; 
    102101    } 
    103102 
    104103    switch (mode) { 
    105104        case DUMP: { 
    106105            char t[1024]; 
    107             if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) 
     106            if (pa_x11_get_prop(xcb, "PULSE_SERVER", t, sizeof(t))) 
    108107                printf(_("Server: %s\n"), t); 
    109             if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t))) 
     108            if (pa_x11_get_prop(xcb, "PULSE_SOURCE", t, sizeof(t))) 
    110109                printf(_("Source: %s\n"), t); 
    111             if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) 
     110            if (pa_x11_get_prop(xcb, "PULSE_SINK", t, sizeof(t))) 
    112111                printf(_("Sink: %s\n"), t); 
    113             if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) 
     112            if (pa_x11_get_prop(xcb, "PULSE_COOKIE", t, sizeof(t))) 
    114113                printf(_("Cookie: %s\n"), t); 
    115114 
    116115            break; 
     
    118117 
    119118        case IMPORT: { 
    120119            char t[1024]; 
    121             if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) 
     120            if (pa_x11_get_prop(xcb, "PULSE_SERVER", t, sizeof(t))) 
    122121                printf("PULSE_SERVER='%s'\nexport PULSE_SERVER\n", t); 
    123             if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t))) 
     122            if (pa_x11_get_prop(xcb, "PULSE_SOURCE", t, sizeof(t))) 
    124123                printf("PULSE_SOURCE='%s'\nexport PULSE_SOURCE\n", t); 
    125             if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) 
     124            if (pa_x11_get_prop(xcb, "PULSE_SINK", t, sizeof(t))) 
    126125                printf("PULSE_SINK='%s'\nexport PULSE_SINK\n", t); 
    127126 
    128             if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) { 
     127            if (pa_x11_get_prop(xcb, "PULSE_COOKIE", t, sizeof(t))) { 
    129128                uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; 
    130129                size_t l; 
    131130                if ((l = pa_parsehex(t, cookie, sizeof(cookie))) != sizeof(cookie)) { 
     
    158157                goto finish; 
    159158            } 
    160159 
    161             pa_x11_del_prop(d, "PULSE_SERVER"); 
    162             pa_x11_del_prop(d, "PULSE_SINK"); 
    163             pa_x11_del_prop(d, "PULSE_SOURCE"); 
    164             pa_x11_del_prop(d, "PULSE_ID"); 
    165             pa_x11_del_prop(d, "PULSE_COOKIE"); 
     160            pa_x11_del_prop(xcb, "PULSE_SERVER"); 
     161            pa_x11_del_prop(xcb, "PULSE_SINK"); 
     162            pa_x11_del_prop(xcb, "PULSE_SOURCE"); 
     163            pa_x11_del_prop(xcb, "PULSE_ID"); 
     164            pa_x11_del_prop(xcb, "PULSE_COOKIE"); 
    166165 
    167166            if (server) 
    168                 pa_x11_set_prop(d, "PULSE_SERVER", server); 
     167                pa_x11_set_prop(xcb, "PULSE_SERVER", server); 
    169168            else if (conf->default_server) 
    170                 pa_x11_set_prop(d, "PULSE_SERVER", conf->default_server); 
     169                pa_x11_set_prop(xcb, "PULSE_SERVER", conf->default_server); 
    171170            else { 
    172171                char hn[256]; 
    173172                if (!pa_get_fqdn(hn, sizeof(hn))) { 
     
    175174                    goto finish; 
    176175                } 
    177176 
    178                 pa_x11_set_prop(d, "PULSE_SERVER", hn); 
     177                pa_x11_set_prop(xcb, "PULSE_SERVER", hn); 
    179178            } 
    180179 
    181180            if (sink) 
    182                 pa_x11_set_prop(d, "PULSE_SINK", sink); 
     181                pa_x11_set_prop(xcb, "PULSE_SINK", sink); 
    183182            else if (conf->default_sink) 
    184                 pa_x11_set_prop(d, "PULSE_SINK", conf->default_sink); 
     183                pa_x11_set_prop(xcb, "PULSE_SINK", conf->default_sink); 
    185184 
    186185            if (source) 
    187                 pa_x11_set_prop(d, "PULSE_SOURCE", source); 
     186                pa_x11_set_prop(xcb, "PULSE_SOURCE", source); 
    188187            if (conf->default_source) 
    189                 pa_x11_set_prop(d, "PULSE_SOURCE", conf->default_source); 
     188                pa_x11_set_prop(xcb, "PULSE_SOURCE", conf->default_source); 
    190189 
    191190            pa_client_conf_free(conf); 
    192191 
     
    195194                goto finish; 
    196195            } 
    197196 
    198             pa_x11_set_prop(d, "PULSE_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx))); 
     197            pa_x11_set_prop(xcb, "PULSE_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx))); 
    199198            break; 
    200199        } 
    201200 
    202201        case REMOVE: 
    203             pa_x11_del_prop(d, "PULSE_SERVER"); 
    204             pa_x11_del_prop(d, "PULSE_SINK"); 
    205             pa_x11_del_prop(d, "PULSE_SOURCE"); 
    206             pa_x11_del_prop(d, "PULSE_ID"); 
    207             pa_x11_del_prop(d, "PULSE_COOKIE"); 
     202            pa_x11_del_prop(xcb, "PULSE_SERVER"); 
     203            pa_x11_del_prop(xcb, "PULSE_SINK"); 
     204            pa_x11_del_prop(xcb, "PULSE_SOURCE"); 
     205            pa_x11_del_prop(xcb, "PULSE_ID"); 
     206            pa_x11_del_prop(xcb, "PULSE_COOKIE"); 
    208207            break; 
    209208 
    210209        default: 
     
    216215 
    217216finish: 
    218217 
    219     if (d) { 
    220         XSync(d, False); 
    221         XCloseDisplay(d); 
     218    if (xcb) { 
     219        xcb_flush(xcb); 
     220        xcb_disconnect(xcb); 
    222221    } 
    223222 
    224223    return ret;