[cairo] Dealing with drawingArea update (refresh) for multiple drawings.

Behdad Esfahbod behdad at behdad.org
Fri Aug 25 16:52:34 PDT 2006


Hi,

This kind of question really should go to the gtk+ lists.  In your case,
I think all you need is to call gdk_window_invalidate_rect in your
insertion callback to force a redraw.

behdad


On Fri, 2006-08-25 at 16:35 -0400, Gustavo Sikora wrote:
> Hi there,
> 
> I'll go straight to the point: I'm trying to draw some data structures
> like, leftist heaps, B tree, binomial heaps and I'm in a hurry trying
> to use gtk and cairo to draw and develop all of the GUI. But I'm new
> to this matters, and I'm not finding an apropriate way to draw
> multiple nodes as I walk the structures. ie: I have an empty
> drawingArea and buttons to let me insert elements. After each insetion
> I wish to draw the current state of the structure. Now, I'm only able
> to draw the first node, and for some reason the expose_event only
> applies when I minimize the interface and open it again.
> 
> Some code of what I'm doing:
> 
> gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event)
> {
>     cairo_t *cr;
> 
> 	/* get a cairo_t */
> 	cr = gdk_cairo_create (widget->window);
> 
> 	cairo_rectangle (cr,
> 			event->area.x, event->area.y,
> 			event->area.width, event->area.height);
> 	cairo_clip (cr);
>     	
> 	newHeap->drawHeap(cr);
> 	
> 	cairo_destroy (cr);
> 
>     return TRUE;
> }
> 
> void insert_callback(GtkWidget *widget, gpointer info)
> {
>     const gchar *key, *priority;
> 
>     key = gtk_entry_get_text(GTK_ENTRY(keyValue));
>     priority = gtk_entry_get_text(GTK_ENTRY(priorityValue));
>     gtk_entry_set_text (GTK_ENTRY (keyValue), "");
>     gtk_entry_set_text (GTK_ENTRY (priorityValue), "");
>     insert(atoi(key), atoi(priority), newHeap);
> }
> 
> ...
> //initialization of my drawingArea
> drawArea = gtk_drawing_area_new();
> gtk_box_pack_start (GTK_BOX (box1), drawArea, FALSE, FALSE, 0);
> gtk_drawing_area_size(GTK_DRAWING_AREA (drawArea), 1010, 657);
> gtk_signal_connect(GTK_OBJECT (drawArea), "expose_event",
> GTK_SIGNAL_FUNC (expose_event_callback), 0);
> gtk_widget_show(drawArea);
> ...
> 
> //drawHeap from my leftistHeap.h - not complete, only testing for real drawing
> ...
> template<class T>
> void leftisitHeap<T>::drawHeap(cairo_t *cr)
> {
> 	drawHeap(raizPtr, cr);
> }
> 
> template<class T>
> void leftistHeap<T>::drawHeap(nodeLeftHeap<T> *auxPtr, cairo_t *cr)
> {
> 	if (raizPtr == 0)		
> 		return;
> 	else
> 	{
> 		if (auxPtr != 0)
> 		{
> 
>                 double x, y;
>                 x = 505;
>                 y = 25;
>                 double radius;
>                 radius = 12;
>                 cairo_arc (cr, x, y, radius, 0, 2 * M_PI);
>                 cairo_set_source_rgb (cr, i, i, i);
>                 cairo_fill_preserve (cr);
>                 cairo_set_source_rgb (cr, 0, 0, 0);
>                 cairo_stroke (cr);
> 
> 
>       	        drawHeap(auxPtr->getClftPtr(), cr);
> 		drawHeap(auxPtr->getCrgtPtr(), cr);
> 		}
> 	}
> }
> ....
> 
> My question again: How can I draw multiple figures (nodes) and make
> them visible as soon as I insert a new element?
> 
> I found something like swapbuffers for ogl + gtk; pixmap or pixbuff
> for simple gtk+ and even only the regular expose_event callback...
> 
> I'll really apreciate any help. (links, materials, tutorials... I
> "googled" a lot and find a lot of stuff, but too many things regarding
> python and ruby... I'm dealing with C/C++
> 
> Thanks in advance
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://cairographics.org/cgi-bin/mailman/listinfo/cairo
-- 
behdad
http://behdad.org/

"Commandment Three says Do Not Kill, Amendment Two says Blood Will Spill"
        -- Dan Bern, "New American Language"



More information about the cairo mailing list