X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiControlFlow%2FDrawing.c;h=a7120b93b977714148ebd80bba2a237ea971be20;hb=d9b7ca883c709e7f6e3886e98ebaa673293ac844;hp=0210b7136160d3fbfaf297d81e80172b57d677b5;hpb=76a67e8a7bd87a57452127275bb7208f52f7a17b;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c index 0210b713..a7120b93 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c @@ -3,10 +3,13 @@ #include #include +#include + /***************************************************************************** * Drawing functions * *****************************************************************************/ +//FIXME Colors will need to be dynamic. Graphic context part not done so far. typedef enum { RED, @@ -36,36 +39,181 @@ struct _Drawing_t { }; +/* Function responsible for updating the exposed area. + * It must call processTrace() to ask for this update. + */ +void Drawing_Data_Request(Drawing_t *Drawing, + GdkPixmap *Pixmap, + gint x, gint y, + gint width, + gint height) +{ + if(width < 0) return ; + if(height < 0) return ; + + gdk_draw_rectangle (Pixmap, + Drawing->Drawing_Area_V->style->white_gc, + TRUE, + x, y, + width, // do not overlap + height); -Drawing_t *Drawing_construct(void) + Drawing_draw_line(Drawing, Pixmap, 10, 10, 50, 10, + Drawing->Drawing_Area_V->style->black_gc); + + +} + +/* Callbacks */ + + +/* Create a new backing pixmap of the appropriate size */ +static gboolean +configure_event( GtkWidget *widget, GdkEventConfigure *event, + gpointer user_data) +{ + Drawing_t *Drawing = (Drawing_t*)user_data; + + GdkPixmap *Pixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + + if(Drawing->Pixmap == NULL) + { + Drawing->Pixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + Drawing->width = widget->allocation.width; + Drawing->height = widget->allocation.height; + + /* Initial data request */ + Drawing_Data_Request(Drawing, Drawing->Pixmap, 0, 0, + widget->allocation.width, + widget->allocation.height); + + } +// /* Draw empty background */ +// gdk_draw_rectangle (Pixmap, +// widget->style->black_gc, +// TRUE, +// 0, 0, +// widget->allocation.width, +// widget->allocation.height); + + /* Copy old data to new pixmap */ + gdk_draw_drawable (Pixmap, + widget->style->white_gc, + Drawing->Pixmap, + 0, 0, + 0, 0, + -1, -1); + + /* Request data for missing space */ + Drawing_Data_Request(Drawing, Pixmap, Drawing->width, 0, + widget->allocation.width - Drawing->width, + widget->allocation.height); + Drawing_Data_Request(Drawing, Pixmap, 0, Drawing->height, + Drawing->width, + widget->allocation.height - Drawing->height); + +// gdk_draw_rectangle (Pixmap, +// widget->style->white_gc, +// TRUE, +// Drawing->width, 0, +// widget->allocation.width - +// Drawing->width, +// widget->allocation.height); + +// gdk_draw_rectangle (Pixmap, +// widget->style->white_gc, +// TRUE, +// 0, Drawing->height, +// Drawing->width, // do not overlap +// widget->allocation.height - +// Drawing->height); + + + + g_critical("drawing configure event"); + + + if (Drawing->Pixmap) + gdk_pixmap_unref(Drawing->Pixmap); + + Drawing->Pixmap = Pixmap; + Drawing->width = widget->allocation.width; + Drawing->height = widget->allocation.height; + + return TRUE; +} + + +/* Redraw the screen from the backing pixmap */ +static gboolean +expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data ) { + Drawing_t *Drawing = (Drawing_t*)user_data; + g_critical("drawing expose event"); + gdk_draw_pixmap(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE (widget)], + Drawing->Pixmap, + event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height); + + return FALSE; +} + +Drawing_t *Drawing_construct(void) +{ Drawing_t *Drawing = g_new(Drawing_t, 1); Drawing->Drawing_Area_V = gtk_drawing_area_new (); - + + //gtk_widget_set_size_request(Drawing->Drawing_Area_V->window, 50, 50); g_object_set_data_full( G_OBJECT(Drawing->Drawing_Area_V), "Link_Drawing_Data", Drawing, (GDestroyNotify)Drawing_destroy); - gtk_widget_modify_bg( Drawing->Drawing_Area_V, - GTK_STATE_NORMAL, - &CF_Colors[BLACK]); + //gtk_widget_modify_bg( Drawing->Drawing_Area_V, + // GTK_STATE_NORMAL, + // &CF_Colors[BLACK]); + + //gdk_window_get_geometry(Drawing->Drawing_Area_V->window, + // NULL, NULL, + // &(Drawing->width), + // &(Drawing->height), + // -1); + + //Drawing->Pixmap = gdk_pixmap_new( + // Drawing->Drawing_Area_V->window, + // Drawing->width, + // Drawing->height, + // Drawing->depth); - gdk_window_get_geometry(Drawing->Drawing_Area_V->window, - NULL, NULL, - &(Drawing->width), - &(Drawing->height), - &(Drawing->depth)); + Drawing->Pixmap = NULL; + +// Drawing->Pixmap = gdk_pixmap_new(Drawing->Drawing_Area_V->window, +// Drawing->Drawing_Area_V->allocation.width, +// Drawing->Drawing_Area_V->allocation.height, +// -1); + + + g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), + "configure_event", + G_CALLBACK (configure_event), + (gpointer)Drawing); - Drawing->Pixmap = gdk_pixmap_new( - Drawing->Drawing_Area_V->window, - Drawing->width, - Drawing->height, - Drawing->depth); - + g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), + "expose_event", + G_CALLBACK (expose_event), + (gpointer)Drawing); + return Drawing; } @@ -132,6 +280,33 @@ void convert_time_to_pixels( } +void Drawing_Refresh ( Drawing_t *Drawing, + guint x, guint y, + guint width, guint height) +{ + gdk_draw_drawable( + Drawing->Drawing_Area_V->window, + Drawing->Drawing_Area_V-> + style->fg_gc[GTK_WIDGET_STATE (Drawing->Drawing_Area_V)], + GDK_DRAWABLE(Drawing->Pixmap), + x, y, + x, y, + width, height); +} + + +void Drawing_draw_line( Drawing_t *Drawing, + GdkPixmap *Pixmap, + guint x1, guint y1, + guint x2, guint y2, + GdkGC *GC) +{ + gdk_draw_line (Pixmap, + GC, + x1, y1, x2, y2); +} + + void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) @@ -145,3 +320,5 @@ void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) } + +