X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Frendercolor.cc;h=e5cbb7cba45d8b99a55387adde6a59b27c5729f9;hb=c217a730901137252cde2d3a39b59c4ebd53e879;hp=6143a4510b4bec6d807e923f1a0e7ea7c2a4af96;hpb=e451c08ac5a103362adbece9b8a11a16ade739c1;p=chaz%2Fopenbox diff --git a/otk/rendercolor.cc b/otk/rendercolor.cc index 6143a451..e5cbb7cb 100644 --- a/otk/rendercolor.cc +++ b/otk/rendercolor.cc @@ -5,6 +5,7 @@ #include "rendercolor.hh" #include "display.hh" #include "screeninfo.hh" +#include "rendercontrol.hh" #include @@ -28,7 +29,8 @@ RenderColor::RenderColor(int screen, unsigned char red, _red(red), _green(green), _blue(blue), - _allocated(false) + _allocated(false), + _created(false) { } @@ -37,7 +39,8 @@ RenderColor::RenderColor(int screen, RGB rgb) _red(rgb.r), _green(rgb.g), _blue(rgb.b), - _allocated(false) + _allocated(false), + _created(false) { } @@ -62,13 +65,9 @@ void RenderColor::create() const xcol.red = (_red << 8) | _red; xcol.green = (_green << 8) | _green; xcol.blue = (_blue << 8) | _blue; - xcol.pixel = 0; - if (! XAllocColor(**display, info->colormap(), &xcol)) { - fprintf(stderr, "RenderColor: color alloc error: rgb:%x/%x/%x\n", - _red, _green, _blue); - xcol.pixel = 0; - } + display->renderControl(_screen)->allocateColor(&xcol); + _allocated = true; _pixel = xcol.pixel; gcv.foreground = _pixel; @@ -83,18 +82,18 @@ void RenderColor::create() const ++item->count; } - _allocated = true; + _created = true; } unsigned long RenderColor::pixel() const { - if (!_allocated) create(); + if (!_created) create(); return _pixel; } GC RenderColor::gc() const { - if (!_allocated) create(); + if (!_created) create(); return _gc; } @@ -102,17 +101,20 @@ RenderColor::~RenderColor() { unsigned long color = _blue | _green << 8 | _red << 16; - CacheItem *item = _cache[_screen][color]; + if (_created) { + CacheItem *item = _cache[_screen][color]; + assert(item); // better be... - if (item) { if (--item->count <= 0) { // remove from the cache XFreeGC(**display, _gc); _cache[_screen][color] = 0; delete item; - const ScreenInfo *info = display->screenInfo(_screen); - XFreeColors(**display, info->colormap(), &_pixel, 1, 0); + if (_allocated) { + const ScreenInfo *info = display->screenInfo(_screen); + XFreeColors(**display, info->colormap(), &_pixel, 1, 0); + } } } }