void RrColorAllocateGC(RrColor *in) { XGCValues gcv; gcv.foreground = in->pixel; gcv.cap_style = CapProjecting; in->gc = XCreateGC(RrDisplay(in->inst), RrRootWindow(in->inst), GCForeground | GCCapStyle, &gcv); }
RrColor *RrColorParse(const RrInstance *inst, gchar *colorname) { XColor xcol; g_assert(colorname != NULL); /* get rgb values from colorname */ xcol.red = 0; xcol.green = 0; xcol.blue = 0; xcol.pixel = 0; if (!XParseColor(RrDisplay(inst), RrColormap(inst), colorname, &xcol)) { g_message("Unable to parse color '%s'", colorname); return NULL; } return RrColorNew(inst, xcol.red >> 8, xcol.green >> 8, xcol.blue >> 8); }
RrColor *RrColorNew(const RrInstance *inst, gint r, gint g, gint b) { /* this should be replaced with something far cooler */ RrColor *out = NULL; XColor xcol; gint key; g_assert(r >= 0 && r < 256); g_assert(g >= 0 && g < 256); g_assert(b >= 0 && b < 256); key = (r << 24) + (g << 16) + (b << 8); #ifndef NO_COLOR_CACHE if ((out = g_hash_table_lookup(RrColorHash(inst), &key))) { out->refcount++; } else { #endif xcol.red = (r << 8) | r; xcol.green = (g << 8) | g; xcol.blue = (b << 8) | b; if (XAllocColor(RrDisplay(inst), RrColormap(inst), &xcol)) { out = g_slice_new(RrColor); out->inst = inst; out->r = xcol.red >> 8; out->g = xcol.green >> 8; out->b = xcol.blue >> 8; out->gc = None; out->pixel = xcol.pixel; out->key = key; out->refcount = 1; #ifdef DEBUG out->id = id++; #endif #ifndef NO_COLOR_CACHE g_hash_table_insert(RrColorHash(inst), &out->key, out); } #endif }
static void theme_pixmap_paint(RrAppearance *a, gint w, gint h) { Pixmap out = RrPaintPixmap(a, w, h); if (out) XFreePixmap(RrDisplay(a->inst), out); }