X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Frendercolor.cc;h=448b3e109610c3fb00f8dc322b0f9d383a98a7d3;hb=50002f2ceb4234145f3977bb14752dc930ada26c;hp=36f941c6734d220285407c9423135ac5f8d4f0a8;hpb=1b5d52c71669ad1837437deaadc061d8d7cfdd85;p=chaz%2Fopenbox diff --git a/otk/rendercolor.cc b/otk/rendercolor.cc index 36f941c6..448b3e10 100644 --- a/otk/rendercolor.cc +++ b/otk/rendercolor.cc @@ -1,13 +1,13 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- -#ifdef HAVE_CONFIG_H -# include "../config.h" -#endif // HAVE_CONFIG_H +#include "config.h" #include "rendercolor.hh" #include "display.hh" #include "screeninfo.hh" +#include + namespace otk { std::map *RenderColor::_cache = 0; @@ -28,9 +28,9 @@ RenderColor::RenderColor(int screen, unsigned char red, _red(red), _green(green), _blue(blue), - _gc(0) + _allocated(false), + _created(false) { - create(); } RenderColor::RenderColor(int screen, RGB rgb) @@ -38,17 +38,15 @@ RenderColor::RenderColor(int screen, RGB rgb) _red(rgb.r), _green(rgb.g), _blue(rgb.b), - _gc(0) + _allocated(false), + _created(false) { - create(); } -void RenderColor::create() +void RenderColor::create() const { unsigned long color = _blue | _green << 8 | _red << 16; - printf("CREATE COLOR: %lx\n", color); - // try get a gc from the cache CacheItem *item = _cache[_screen][color]; @@ -63,16 +61,17 @@ void RenderColor::create() const ScreenInfo *info = display->screenInfo(_screen); XColor xcol; // convert from 0-0xff to 0-0xffff - xcol.red = _red; xcol.red |= xcol.red << 8; - xcol.green = _green; xcol.green |= xcol.green << 8; - xcol.blue = _blue; xcol.blue |= xcol.blue << 8; + xcol.red = (_red << 8) | _red; + xcol.green = (_green << 8) | _green; + xcol.blue = (_blue << 8) | _blue; xcol.pixel = 0; - if (! XAllocColor(**display, info->colormap(), &xcol)) { + if (!XAllocColor(**display, info->colormap(), &xcol)) { fprintf(stderr, "RenderColor: color alloc error: rgb:%x/%x/%x\n", _red, _green, _blue); xcol.pixel = 0; - } + } else + _allocated = true; _pixel = xcol.pixel; gcv.foreground = _pixel; @@ -86,22 +85,41 @@ void RenderColor::create() _cache[_screen][color] = item; ++item->count; } + + _created = true; +} + +unsigned long RenderColor::pixel() const +{ + if (!_created) create(); + return _pixel; +} + +GC RenderColor::gc() const +{ + if (!_created) create(); + return _gc; } RenderColor::~RenderColor() { unsigned long color = _blue | _green << 8 | _red << 16; - CacheItem *item = _cache[_screen][color]; - assert(item); // it better be in the cache ... + if (_created) { + CacheItem *item = _cache[_screen][color]; + assert(item); // better be... - printf("DESTROY COLOR: %lx %d\n", color, item->count); - - if (--item->count <= 0) { - // remove from the cache - XFreeGC(**display, _gc); - _cache[_screen][color] = 0; - delete item; + if (--item->count <= 0) { + // remove from the cache + XFreeGC(**display, _gc); + _cache[_screen][color] = 0; + delete item; + + if (_allocated) { + const ScreenInfo *info = display->screenInfo(_screen); + XFreeColors(**display, info->colormap(), &_pixel, 1, 0); + } + } } }