]> Pileus Git - grits/blobdiff - src/grits-opengl.c
Add parameters and return values to GritsObject events
[grits] / src / grits-opengl.c
index 4da0729d167ec394d87248a97694b55d03c30cc8..172b606a959a9247406178f0a7748be6e8abdc62 100644 (file)
@@ -139,7 +139,7 @@ static void _set_visuals(GritsOpenGL *opengl)
        g_mutex_unlock(opengl->sphere_lock);
 }
 
-typedef void (*GritsLevelFunc)(GritsObject *obj, gpointer user_data, gint level, gboolean sorted);
+typedef gboolean (*GritsLevelFunc)(GritsObject *obj, gpointer user_data, gint level, gboolean sorted);
 
 static gboolean _foreach_object_cb(gpointer key, gpointer value, gpointer pointers)
 {
@@ -147,9 +147,11 @@ static gboolean _foreach_object_cb(gpointer key, gpointer value, gpointer pointe
        GritsLevelFunc user_func = ((gpointer*)pointers)[0];
        gpointer       user_data = ((gpointer*)pointers)[1];
        for (GList *cur = level->unsorted.next; cur; cur = cur->next)
-               user_func(cur->data, user_data, (gint)key, FALSE);
+               if (user_func(cur->data, user_data, (gint)key, FALSE))
+                       return TRUE;
        for (GList *cur = level->sorted.next;   cur; cur = cur->next)
-               user_func(cur->data, user_data, (gint)key, TRUE);
+               if (user_func(cur->data, user_data, (gint)key, TRUE))
+                       return TRUE;
        return FALSE;
 }
 
@@ -159,16 +161,18 @@ static void _foreach_object(GritsOpenGL *opengl, GritsLevelFunc func, gpointer u
        g_tree_foreach(opengl->objects, _foreach_object_cb, pointers);
 }
 
-static void _add_object_world(GritsObject *object, GPtrArray *array, gint level, gboolean sorted)
+static gboolean _add_object_world(GritsObject *object, GPtrArray *array, gint level, gboolean sorted)
 {
        if (level < GRITS_LEVEL_HUD)
                g_ptr_array_add(array, object);
+       return FALSE;
 }
 
-static void _add_object_ortho(GritsObject *object, GPtrArray *array, gint level, gboolean sorted)
+static gboolean _add_object_ortho(GritsObject *object, GPtrArray *array, gint level, gboolean sorted)
 {
        if (level >= GRITS_LEVEL_HUD)
                g_ptr_array_add(array, object);
+       return FALSE;
 }
 
 static GPtrArray *_objects_to_array(GritsOpenGL *opengl, gboolean ortho)
@@ -196,7 +200,7 @@ static gboolean on_configure(GritsOpenGL *opengl, GdkEventConfigure *event, gpoi
        return FALSE;
 }
 
-static gint run_picking(GritsOpenGL *opengl, GPtrArray *objects)
+static gint run_picking(GritsOpenGL *opengl, GdkEvent *event, GPtrArray *objects)
 {
        /* Setup picking buffers */
        guint buffer[100][4] = {};
@@ -231,7 +235,7 @@ static gint run_picking(GritsOpenGL *opengl, GPtrArray *objects)
        /* Notify objects of pointer movements */
        for (guint i = 0; i < objects->len; i++) {
                GritsObject *object = objects->pdata[i];
-               grits_object_set_pointer(object, object->state.picked);
+               grits_object_set_pointer(object, event, object->state.picked);
        }
 
        return hits;
@@ -266,14 +270,14 @@ static gboolean on_motion_notify(GritsOpenGL *opengl, GdkEventMotion *event, gpo
        glMatrixMode(GL_PROJECTION); glLoadIdentity();
        gluPickMatrix(gl_x, gl_y, delta, delta, viewport);
        glMultMatrixd(projection);
-       gint world_hits = run_picking(opengl, world);
+       gint world_hits = run_picking(opengl, (GdkEvent*)event, world);
 
        /* Run ortho picking */
        glMatrixMode(GL_PROJECTION); glLoadIdentity();
        gluPickMatrix(gl_x, gl_y, delta, delta, viewport);
        glMatrixMode(GL_MODELVIEW);  glLoadIdentity();
        glOrtho(0, viewport[2], viewport[3], 0, 1000, -1000);
-       gint ortho_hits = run_picking(opengl, ortho);
+       gint ortho_hits = run_picking(opengl, (GdkEvent*)event, ortho);
 
        g_debug("GritsOpenGL: on_motion_notify - hits=%d/%d,%d/%d ev=%.0lf,%.0lf",
                        world_hits, world->len, ortho_hits, ortho->len, gl_x, gl_y);