]> Dogcows Code - chaz/openbox/blobdiff - otk_c/color.c
typesafety
[chaz/openbox] / otk_c / color.c
index 595eb08a648b59be9185687b4fed7f873365f5bf..732f7b7d8d5baf5ef7915649b3e62f28d2f1822c 100644 (file)
 static Bool cleancache = False;
 static PyObject *colorcache = NULL;
 
-static void otkcolor_dealloc(OtkColor* self)
-{
-  // when this is called, the color has already been cleaned out of the cache
-  PyObject_Del((PyObject*)self);
-}
-
-static int otkcolor_compare(OtkColor *c1, OtkColor *c2)
-{
-  long result;
-  unsigned long p1, p2;
-
-  p1 = c1->red << 16 | c1->green << 8 | c1->blue;
-  p2 = c2->red << 16 | c2->green << 8 | c2->blue;
-
-  if (p1 < p2)
-    result = -1;
-  else if (p1 > p2)
-    result = 1;
-  else
-    result = 0;
-  return result;
-}
-
-static PyObject *otkcolor_repr(OtkColor *self)
-{
-  return PyString_FromFormat("rgb:%x/%x/%x", self->red, self->green,
-                             self->blue);
-}
-
-static long otkcolor_hash(OtkColor *self)
-{
-  return self->screen << 24 | self->red << 16 | self->green << 8 | self->blue;
-}
-
-PyTypeObject OtkColor_Type = {
-  PyObject_HEAD_INIT(NULL)
-  0,
-  "Color",
-  sizeof(OtkColor),
-  0,
-  (destructor)otkcolor_dealloc, /*tp_dealloc*/
-  0,                            /*tp_print*/
-  0,                            /*tp_getattr*/
-  0,                            /*tp_setattr*/
-  (cmpfunc)otkcolor_compare,    /*tp_compare*/
-  (reprfunc)otkcolor_repr,      /*tp_repr*/
-  0,                            /*tp_as_number*/
-  0,                            /*tp_as_sequence*/
-  0,                            /*tp_as_mapping*/
-  (hashfunc)otkcolor_hash,      /*tp_hash */
-};
-
-
 static void parseColorName(OtkColor *self, const char *name) {
   XColor xcol;
 
@@ -128,8 +75,6 @@ static void doCacheCleanup() {
 static void allocate(OtkColor *self) {
   XColor xcol;
 
-  assert(!self->allocated);
-
   // allocate color from rgb values
   xcol.red =   self->red   | self->red   << 8;
   xcol.green = self->green | self->green << 8;
@@ -145,7 +90,6 @@ static void allocate(OtkColor *self) {
   }
   
   self->pixel = xcol.pixel;
-  self->allocated = True;
   
   if (cleancache)
     doCacheCleanup();
@@ -161,11 +105,9 @@ PyObject *OtkColor_FromRGB(int r, int g, int b, int screen)
 
   if (!colorcache) colorcache = PyDict_New();
 
-  self->allocated = False;
   self->red = r;
   self->green = g;
   self->blue = b;
-  self->pixel = 0;
   self->screen = screen;
 
   // does this color already exist in the cache?
@@ -177,6 +119,7 @@ PyObject *OtkColor_FromRGB(int r, int g, int b, int screen)
 
   // add it to the cache
   PyDict_SetItem(colorcache, (PyObject*)self, (PyObject*)self);
+  allocate(self);
   return (PyObject*)self;
 }
 
@@ -189,11 +132,9 @@ PyObject *OtkColor_FromName(const char *name, int screen)
 
   if (!colorcache) colorcache = PyDict_New();
   
-  self->allocated = False;
   self->red = -1;
   self->green = -1;
   self->blue = -1;
-  self->pixel = 0;
   self->screen = screen;
 
   parseColorName(self, name);
@@ -207,17 +148,65 @@ PyObject *OtkColor_FromName(const char *name, int screen)
 
   // add it to the cache
   PyDict_SetItem(colorcache, (PyObject*)self, (PyObject*)self);
+  allocate(self);
   return (PyObject*)self;
 }
 
-unsigned long OtkColor_Pixel(OtkColor *self)
+void OtkColor_CleanupColorCache()
 {
-  if (!self->allocated)
-    allocate(self);
-  return self->pixel;
+  cleancache = True;
 }
 
-void OtkColor_CleanupColorCache()
+
+
+static void otkcolor_dealloc(OtkColor* self)
 {
-  cleancache = True;
+  // when this is called, the color has already been cleaned out of the cache
+  PyObject_Del((PyObject*)self);
 }
+
+static int otkcolor_compare(OtkColor *c1, OtkColor *c2)
+{
+  long result;
+  unsigned long p1, p2;
+
+  p1 = c1->red << 16 | c1->green << 8 | c1->blue;
+  p2 = c2->red << 16 | c2->green << 8 | c2->blue;
+
+  if (p1 < p2)
+    result = -1;
+  else if (p1 > p2)
+    result = 1;
+  else
+    result = 0;
+  return result;
+}
+
+static PyObject *otkcolor_repr(OtkColor *self)
+{
+  return PyString_FromFormat("rgb:%x/%x/%x", self->red, self->green,
+                             self->blue);
+}
+
+static long otkcolor_hash(OtkColor *self)
+{
+  return self->screen << 24 | self->red << 16 | self->green << 8 | self->blue;
+}
+
+PyTypeObject OtkColor_Type = {
+  PyObject_HEAD_INIT(NULL)
+  0,
+  "OtkColor",
+  sizeof(OtkColor),
+  0,
+  (destructor)otkcolor_dealloc, /*tp_dealloc*/
+  0,                            /*tp_print*/
+  0,                            /*tp_getattr*/
+  0,                            /*tp_setattr*/
+  (cmpfunc)otkcolor_compare,    /*tp_compare*/
+  (reprfunc)otkcolor_repr,      /*tp_repr*/
+  0,                            /*tp_as_number*/
+  0,                            /*tp_as_sequence*/
+  0,                            /*tp_as_mapping*/
+  (hashfunc)otkcolor_hash,      /*tp_hash */
+};
This page took 0.023597 seconds and 4 git commands to generate.