X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Frendercolor.cc;h=5917b00732bba72a70ebb08c10946c3deaad1fba;hb=4eaa65510b26d342c5419e6081bcecaa0ec8aa24;hp=99dd3341bd25c606416e6c5e5f189bb780712bd1;hpb=0348a2f3abd2334f5f5812c5fb45c1b4fffb46a5;p=chaz%2Fopenbox diff --git a/otk/rendercolor.cc b/otk/rendercolor.cc index 99dd3341..5917b007 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; @@ -29,6 +29,21 @@ RenderColor::RenderColor(int screen, unsigned char red, _green(green), _blue(blue), _gc(0) +{ + create(); +} + +RenderColor::RenderColor(int screen, RGB rgb) + : _screen(screen), + _red(rgb.r), + _green(rgb.g), + _blue(rgb.b), + _gc(0) +{ + create(); +} + +void RenderColor::create() { unsigned long color = _blue | _green << 8 | _red << 16; @@ -37,6 +52,7 @@ RenderColor::RenderColor(int screen, unsigned char red, if (item) { _gc = item->gc; + _pixel = item->pixel; ++item->count; } else { XGCValues gcv; @@ -56,19 +72,24 @@ RenderColor::RenderColor(int screen, unsigned char red, xcol.pixel = 0; } - gcv.foreground = xcol.pixel; - _gc = XCreateGC(**display, info->rootWindow(), GCForeground, &gcv); + _pixel = xcol.pixel; + gcv.foreground = _pixel; + gcv.cap_style = CapProjecting; + _gc = XCreateGC(**display, info->rootWindow(), + GCForeground | GCCapStyle, &gcv); assert(_gc); // insert into the cache - _cache[_screen][color] = new CacheItem(_gc); + item = new CacheItem(_gc, _pixel); + _cache[_screen][color] = item; + ++item->count; } } RenderColor::~RenderColor() { unsigned long color = _blue | _green << 8 | _red << 16; - + CacheItem *item = _cache[_screen][color]; assert(item); // it better be in the cache ...