]> Dogcows Code - chaz/openbox/blobdiff - otk/rendercolor.cc
add a default icon
[chaz/openbox] / otk / rendercolor.cc
index 31823341c7e61bfae81851544ceca1eef2a59c43..448b3e109610c3fb00f8dc322b0f9d383a98a7d3 100644 (file)
@@ -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,12 +38,12 @@ 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;
   
@@ -61,16 +61,17 @@ void RenderColor::create()
     const ScreenInfo *info = display->screenInfo(_screen);
 
     XColor xcol;    // convert from 0-0xff to 0-0xffff
-    xcol.red = _red << 8 | _red;
-    xcol.green = _green << 8 | _green;
-    xcol.blue = _blue << 8 | _blue;
+    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;
@@ -84,20 +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...
 
-  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);
+      }
+    }
   }
 }
 
This page took 0.027666 seconds and 4 git commands to generate.