static void _cairo_xcb_surface_ensure_gc (cairo_xcb_surface_t *surface) { if (surface->gc.xid) return; surface->gc = XCBGCONTEXTNew(surface->dpy); XCBCreateGC (surface->dpy, surface->gc, surface->drawable, 0, 0); _cairo_xcb_surface_set_gc_clip_rects(surface); }
/* gcvalues: the values themselves */ GC XCreateGC(register Display *dpy, Drawable drawable, unsigned long valuemask, XGCValues *gcvalues) { register GC gc; register _XExtension *ext; GCONTEXT g; CARD32 values[32]; LockDisplay(dpy); gc = (GC)Xmalloc (sizeof(struct _XGC)); if (gc == NULL) goto done; g = XCBGCONTEXTNew(XCBConnectionOfDisplay(dpy)); gc->gid = g.xid; gc->rects = 0; gc->dashes = 0; gc->ext_data = NULL; gc->values = initial_GC; gc->dirty = 0L; valuemask &= (1L << (GCLastBit + 1)) - 1; if (valuemask) _XUpdateGCCache (gc, valuemask, gcvalues); if (gc->dirty) _XGenerateGCList (&gc->values, gc->dirty, values); XCBCreateGC(XCBConnectionOfDisplay(dpy), g, XCLDRAWABLE(drawable), gc->dirty, values); /* call out to any extensions interested */ for (ext = dpy->ext_procs; ext; ext = ext->next) if (ext->create_GC) (*ext->create_GC)(dpy, gc, &ext->codes); gc->dirty = 0L; /* allow extensions to see dirty bits */ done: UnlockDisplay(dpy); return (gc); }