]> Pileus Git - grits/blobdiff - src/objects/grits-object.c
Add grits_object_destroy functions and fix memory leaks
[grits] / src / objects / grits-object.c
index a1e80ec24c2d01745bf619185fc48f69ebf1a13d..55f39754d498cf7d4f93c0ca8116d06d376effdb 100644 (file)
@@ -111,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();
@@ -134,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);
 }
 
 /**
@@ -163,7 +163,7 @@ 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);
 }
 
 void grits_object_set_cursor(GritsObject *object, GdkCursorType cursor)
@@ -172,6 +172,13 @@ void grits_object_set_cursor(GritsObject *object, GdkCursorType cursor)
        object->cursor = gdk_cursor_new(cursor);
 }
 
+void grits_object_destroy(GritsObject *object)
+{
+       if (object->viewer)
+               grits_viewer_remove(object->viewer, object);
+       g_object_unref(object);
+}
+
 /* Event handling */
 void grits_object_pick(GritsObject *object, GritsOpenGL *opengl)
 {
@@ -211,11 +218,13 @@ gboolean grits_object_event(GritsObject *object, GdkEvent *event)
 
        /* 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, &rval);
-       if (sig == SIG_BUTTON_RELEASE || sig == SIG_MOTION)
-               object->state.clicking = FALSE;
+       if (sig == SIG_BUTTON_RELEASE)
+               object->state.clicking  = 0;
 
        /* Emit this signal */
        if (rval == FALSE) {