]> Dogcows Code - chaz/openbox/blobdiff - otk/rendercolor.cc
split the ob module into separate .i's
[chaz/openbox] / otk / rendercolor.cc
index 6143a4510b4bec6d807e923f1a0e7ea7c2a4af96..e5cbb7cba45d8b99a55387adde6a59b27c5729f9 100644 (file)
@@ -5,6 +5,7 @@
 #include "rendercolor.hh"
 #include "display.hh"
 #include "screeninfo.hh"
+#include "rendercontrol.hh"
 
 #include <cstdio>
 
@@ -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);
+      }
     }
   }
 }
This page took 0.023206 seconds and 4 git commands to generate.