X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgrits-opengl.c;fp=src%2Fgrits-opengl.c;h=172b606a959a9247406178f0a7748be6e8abdc62;hp=4da0729d167ec394d87248a97694b55d03c30cc8;hb=420f1ea8e4aea5dd7bddc77325ab643900c34cd5;hpb=fb279b9874dd68915fc70c31b8f92e72d624d495 diff --git a/src/grits-opengl.c b/src/grits-opengl.c index 4da0729..172b606 100644 --- a/src/grits-opengl.c +++ b/src/grits-opengl.c @@ -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);