X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fobjects%2Fgrits-object.c;h=2812b9e3d647e72a9919b77936e3e4849237b367;hp=d3f200c6fe1a994335496716fa9b33d3050de0ce;hb=d55c77bbf477e582a8525ac831ad97b035b8185d;hpb=98eee86d69c0ee2aa198270e55b8b815c1914567 diff --git a/src/objects/grits-object.c b/src/objects/grits-object.c index d3f200c..2812b9e 100644 --- a/src/objects/grits-object.c +++ b/src/objects/grits-object.c @@ -30,9 +30,10 @@ #include #include -#include +#include "gtkgl.h" #include "grits-object.h" +#include "grits-marshal.h" /* Constants */ enum { @@ -51,6 +52,7 @@ static guint signals[NUM_SIGNALS]; void grits_object_pickdraw(GritsObject *object, GritsOpenGL *opengl, gboolean pick) { GritsObjectClass *klass = GRITS_OBJECT_GET_CLASS(object); + if (!klass->draw) { g_warning("GritsObject: draw - Unimplemented"); return; @@ -60,6 +62,14 @@ void grits_object_pickdraw(GritsObject *object, GritsOpenGL *opengl, gboolean pi if (object->hidden) return; + /* Skip object with no signals when picking */ + for (int i = 0; pick; i++) { + if (i == NUM_SIGNALS) + return; + if (g_signal_has_handler_pending(object, signals[i], 0, FALSE)) + break; + } + /* Support GritsTester */ if (!GRITS_IS_OPENGL(opengl)) { g_debug("GritsObject: draw - drawing raw object"); @@ -101,7 +111,7 @@ void grits_object_pickdraw(GritsObject *object, GritsOpenGL *opengl, gboolean pi } /* Save state, draw, restore state */ - g_mutex_lock(opengl->sphere_lock); + g_mutex_lock(&opengl->sphere_lock); if (!(object->skip & GRITS_SKIP_STATE)) { glPushAttrib(GL_ALL_ATTRIB_BITS); glMatrixMode(GL_PROJECTION); glPushMatrix(); @@ -124,7 +134,7 @@ void grits_object_pickdraw(GritsObject *object, GritsOpenGL *opengl, gboolean pi glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } - g_mutex_unlock(opengl->sphere_lock); + g_mutex_unlock(&opengl->sphere_lock); } /** @@ -153,45 +163,37 @@ void grits_object_hide(GritsObject *object, gboolean hidden) void grits_object_queue_draw(GritsObject *object) { if (object->viewer) - gtk_widget_queue_draw(GTK_WIDGET(object->viewer)); + grits_viewer_queue_draw(object->viewer); } -/* Event handling */ -void grits_object_pick_begin(GritsObject *object, GritsOpenGL *opengl) +void grits_object_set_cursor(GritsObject *object, GdkCursorType cursor) { - object->state.picked = FALSE; - - /* Check for connected signals */ - for (int i = 0; i < NUM_SIGNALS; i++) { - if (g_signal_has_handler_pending(object, signals[i], 0, FALSE)) { - /* Someone is watching, render the object _once_ */ - glPushName((guint)object); - grits_object_pickdraw(object, opengl, TRUE); - glPopName(); - return; - } - } + // Used by grits OpenGL + object->cursor = gdk_cursor_new(cursor); } -void grits_object_pick_pointer(GritsObject *object, double x, double y) +/* Event handling */ +void grits_object_pick(GritsObject *object, GritsOpenGL *opengl) { - object->state.picked = TRUE; + grits_object_pickdraw(object, opengl, TRUE); } -void grits_object_pick_end(GritsObject *object) +gboolean grits_object_set_pointer(GritsObject *object, GdkEvent *event, gboolean selected) { - if (object->state.picked) { + gboolean rval = FALSE; + if (selected) { if (!object->state.selected) - g_signal_emit(object, signals[SIG_ENTER], 0); + g_signal_emit(object, signals[SIG_ENTER], 0, event, &rval); object->state.selected = TRUE; } else { if (object->state.selected) - g_signal_emit(object, signals[SIG_LEAVE], 0); + g_signal_emit(object, signals[SIG_LEAVE], 0, event, &rval); object->state.selected = FALSE; } + return rval; } -void grits_object_event(GritsObject *object, GdkEvent *event) +gboolean grits_object_event(GritsObject *object, GdkEvent *event) { const int map[GDK_EVENT_LAST] = { [GDK_BUTTON_PRESS ] SIG_BUTTON_PRESS, @@ -203,21 +205,30 @@ void grits_object_event(GritsObject *object, GdkEvent *event) [GDK_MOTION_NOTIFY ] SIG_MOTION, }; if (!object->state.selected) - return; + return FALSE; guint sig = map[event->type]; + gboolean rval = FALSE; /* Handle button click */ if (sig == SIG_BUTTON_PRESS) - object->state.clicking = TRUE; + object->state.clicking = GRITS_CLICK_THRESHOLD; + if (sig == SIG_MOTION && object->state.clicking) + object->state.clicking -= 1; if (sig == SIG_BUTTON_RELEASE && object->state.clicking) - g_signal_emit(object, signals[SIG_CLICKED], 0, event); - if (sig == SIG_BUTTON_RELEASE || sig == SIG_MOTION) - object->state.clicking = FALSE; + g_signal_emit(object, signals[SIG_CLICKED], 0, event, &rval); + if (sig == SIG_BUTTON_RELEASE) + object->state.clicking = 0; /* Emit this signal */ - if (!g_signal_has_handler_pending(object, signals[sig], 0, FALSE)) - return; - g_signal_emit(object, signals[sig], 0, event); + if (rval == FALSE) { + if (!g_signal_has_handler_pending(object, signals[sig], 0, FALSE)) + return FALSE; + g_signal_emit(object, signals[sig], 0, event, &rval); + } + + if (rval == TRUE) + g_debug("GritsObject: breaking chained event"); + return rval; } /* GObject stuff */ @@ -246,9 +257,10 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, + 1, + G_TYPE_POINTER); /** * GritsViewer::leave: @@ -264,9 +276,10 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, + 1, + G_TYPE_POINTER); /** * GritsViewer::clicked: @@ -281,9 +294,10 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, + 1, + G_TYPE_POINTER); /** * GritsViewer::button-press: @@ -300,8 +314,8 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, 1, G_TYPE_POINTER); @@ -320,8 +334,8 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, 1, G_TYPE_POINTER); @@ -339,8 +353,8 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, 1, G_TYPE_POINTER); @@ -358,8 +372,8 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, 1, G_TYPE_POINTER); @@ -377,8 +391,8 @@ static void grits_object_class_init(GritsObjectClass *klass) 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, + grits_cclosure_marshal_BOOLEAN__POINTER, + G_TYPE_BOOLEAN, 1, G_TYPE_POINTER); }