all repos — openbox @ ac9d8c58cb2286a98f699fe1b98b56e11c262868

openbox fork - make it a bit more like ryudo

use the new color hash to cache RrColors
Dana Jansens danakj@orodu.net
commit

ac9d8c58cb2286a98f699fe1b98b56e11c262868

parent

92feea765a59a7b3ab3b3c0babda4bfd0cf91d7f

2 files changed, 32 insertions(+), 15 deletions(-)

jump to
M render/color.crender/color.c

@@ -1,5 +1,6 @@

#include "render.h" #include "color.h" +#include "instance.h" #include <X11/Xlib.h> #include <X11/Xutil.h>

@@ -39,17 +40,27 @@ {

/* this should be replaced with something far cooler */ RrColor *out = NULL; XColor xcol; - xcol.red = (r << 8) | r; - xcol.green = (g << 8) | g; - xcol.blue = (b << 8) | b; - if (XAllocColor(RrDisplay(inst), RrColormap(inst), &xcol)) { - out = g_new(RrColor, 1); - 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; + gint key; + + key = (r << 24) + (g << 16) + (b << 8); + if ((out = g_hash_table_lookup(RrColorHash(inst), &key))) { + out->refcount++; + } else { + xcol.red = (r << 8) | r; + xcol.green = (g << 8) | g; + xcol.blue = (b << 8) | b; + if (XAllocColor(RrDisplay(inst), RrColormap(inst), &xcol)) { + out = g_new(RrColor, 1); + 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; + g_hash_table_replace(RrColorHash(inst), &out->key, out); + } } return out; }

@@ -59,10 +70,13 @@

void RrColorFree(RrColor *c) { if (c) { - if (c->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst), - &c->pixel, 1, 0); - if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc); - g_free(c); + if (--c->refcount < 1) { + g_hash_table_remove(RrColorHash(c->inst), &c->key); + if (c->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst), + &c->pixel, 1, 0); + if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc); + g_free(c); + } } }
M render/color.hrender/color.h

@@ -15,6 +15,9 @@ int g;

int b; unsigned long pixel; GC gc; + + gint key; + gint refcount; }; void RrColorAllocateGC(RrColor *in);