]> Pileus Git - grits/blobdiff - src/objects/gis-callback.c
Move OpenGL code from GisOpenGL to objects
[grits] / src / objects / gis-callback.c
index 9e6373757166c17bd46c8dbe2c36dba4e537d480..89dada46427be40eadbc3bef7e8e3297e02215bb 100644 (file)
  * #GisCallback objects are used for custom drawing functions. A common example
  * of this would be to render something which does not easily fit into a normal
  * object. For instance, a Heads-Up-Display overlay.
+ *
+ * Callbacks are an alternate to extending GisObject with a new class and
+ * should be used when only once instance of the object will be needed.
  */
 
 #include <config.h>
 #include "gis-callback.h"
 
-/* GisCallback */
-G_DEFINE_TYPE(GisCallback, gis_callback, GIS_TYPE_OBJECT);
-static void gis_callback_init(GisCallback *cb)
-{
-}
-
-static void gis_callback_class_init(GisCallbackClass *klass)
-{
-}
-
 /**
  * gis_callback_new:
  * @callback:  the function to call to draw the object
@@ -46,10 +39,30 @@ static void gis_callback_class_init(GisCallbackClass *klass)
  *
  * Returns: the new #GisCallback
  */
-GisCallback *gis_callback_new(GisCallbackFunc callback, gpointer user_data)
+GisCallback *gis_callback_new(GisCallbackFunc draw_cb, gpointer user_data)
 {
        GisCallback *cb = g_object_new(GIS_TYPE_CALLBACK, NULL);
-       cb->callback  = callback;
+       cb->draw      = draw_cb;
        cb->user_data = user_data;
        return cb;
 }
+
+/* Proxy class methods to per-object methods */
+static void proxy_draw(GisObject *_cb, GisOpenGL *opengl)
+{
+       GisCallback *cb = GIS_CALLBACK(_cb);
+       if (cb->draw)
+               cb->draw(cb, opengl, cb->user_data);
+}
+
+/* GisCallback */
+G_DEFINE_TYPE(GisCallback, gis_callback, GIS_TYPE_OBJECT);
+static void gis_callback_init(GisCallback *cb)
+{
+}
+
+static void gis_callback_class_init(GisCallbackClass *klass)
+{
+       GisObjectClass *object_class = GIS_OBJECT_CLASS(klass);
+       object_class->draw = proxy_draw;
+}