X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiControlFlow%2FDrawing.c;h=0aa74529b905e4829a1f429b1ac073a67614973c;hb=2f9f7ee05c219ee0b92775bbebceec95000c9d7a;hp=8224030669a0f2a69cd8394bdc39a68576d0f85e;hpb=847b479de75182dfd3f90e4faeefa48c099713ad;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c index 82240306..0aa74529 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c @@ -1,12 +1,21 @@ #include "Drawing.h" +#include "CFV.h" #include #include +#include + + +#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) +#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) + + /***************************************************************************** * Drawing functions * *****************************************************************************/ +//FIXME Colors will need to be dynamic. Graphic context part not done so far. typedef enum { RED, @@ -28,60 +37,41 @@ static GdkColor CF_Colors [] = }; -struct _Drawing_t { - GtkWidget *Drawing_Area_V; - GdkPixmap *Pixmap; - - gint height, width, depth; - -}; - -void test_draw(Drawing_t *Drawing) -{ - GdkRectangle update_rect; -// GdkColor color = { 0, 65535, 65535, 65535 }; - -// gdk_colormap_alloc_color(gdk_rgb_get_cmap(), &color, 0, 1); - -// GdkGC *gc = -// Drawing->Drawing_Area_V-> -// style->fg_gc[GTK_WIDGET_STATE (Drawing->Drawing_Area_V)]; -// gdk_gc_set_foreground(gc, &color); - update_rect.x = 50; - update_rect.y = 50; - update_rect.width = 1000; - update_rect.height = 1000; - gdk_draw_rectangle (Drawing->Pixmap, - Drawing->Drawing_Area_V->style->black_gc, - TRUE, - 50, 50, - 1000, - 1000); +//struct _Drawing_t { +// GtkWidget *Drawing_Area_V; +// GdkPixmap *Pixmap; +// ControlFlowData *Control_Flow_Data; +// gint height, width, depth; - //Drawing_draw_line(Drawing, 10, 10, 50, 10, - // Drawing->Drawing_Area_V->style->black_gc); - gtk_widget_draw (Drawing->Drawing_Area_V, &update_rect); - -// Drawing_Refresh( Drawing, 0, 0, 30, 30); -} +//}; -void Drawing_Data_Request(Drawing_t *Drawing, - GdkPixmap *Pixmap, +/* 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 width, gint height) { - gdk_draw_rectangle (Pixmap, + 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_draw_line(Drawing, Pixmap, 10, 10, 50, 10, - Drawing->Drawing_Area_V->style->black_gc); - + send_test_process( + guicontrolflow_get_process_list(Drawing->Control_Flow_Data), + Drawing); + send_test_drawing( + guicontrolflow_get_process_list(Drawing->Control_Flow_Data), + Drawing, *Pixmap, x, y, width, height); + } /* Callbacks */ @@ -94,22 +84,29 @@ configure_event( GtkWidget *widget, GdkEventConfigure *event, { Drawing_t *Drawing = (Drawing_t*)user_data; + /* New Pixmap, size of the configure event */ GdkPixmap *Pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); + g_critical("drawing configure event"); + + /* If no old Pixmap present */ if(Drawing->Pixmap == NULL) { - Drawing->Pixmap = gdk_pixmap_new(widget->window, - widget->allocation.width, - widget->allocation.height, - -1); + Drawing->Pixmap = gdk_pixmap_new( + widget->window, + widget->allocation.width, + widget->allocation.height, + //ProcessList_get_height + // (GuiControlFlow_get_Process_List(Drawing->Control_Flow_Data)), + -1); Drawing->width = widget->allocation.width; Drawing->height = widget->allocation.height; - +g_critical("init data"); /* Initial data request */ - Drawing_Data_Request(Drawing, Drawing->Pixmap, 0, 0, + drawing_data_request(Drawing, &Drawing->Pixmap, 0, 0, widget->allocation.width, widget->allocation.height); @@ -131,10 +128,11 @@ configure_event( GtkWidget *widget, GdkEventConfigure *event, -1, -1); /* Request data for missing space */ - Drawing_Data_Request(Drawing, Pixmap, Drawing->width, 0, +g_critical("missing data"); + 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_data_request(Drawing, &Pixmap, 0, Drawing->height, Drawing->width, widget->allocation.height - Drawing->height); @@ -156,8 +154,6 @@ configure_event( GtkWidget *widget, GdkEventConfigure *event, - g_critical("drawing configure event"); - if (Drawing->Pixmap) gdk_pixmap_unref(Drawing->Pixmap); @@ -187,18 +183,19 @@ expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data ) return FALSE; } -Drawing_t *Drawing_construct(void) +Drawing_t *drawing_construct(ControlFlowData *Control_Flow_Data) { Drawing_t *Drawing = g_new(Drawing_t, 1); Drawing->Drawing_Area_V = gtk_drawing_area_new (); - + Drawing->Control_Flow_Data = Control_Flow_Data; + //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); + (GDestroyNotify)drawing_destroy); //gtk_widget_modify_bg( Drawing->Drawing_Area_V, // GTK_STATE_NORMAL, @@ -223,7 +220,6 @@ Drawing_t *Drawing_construct(void) // Drawing->Drawing_Area_V->allocation.height, // -1); - g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), "configure_event", G_CALLBACK (configure_event), @@ -237,7 +233,7 @@ Drawing_t *Drawing_construct(void) return Drawing; } -void Drawing_destroy(Drawing_t *Drawing) +void drawing_destroy(Drawing_t *Drawing) { // Do not unref here, Drawing_t destroyed by it's widget. @@ -246,16 +242,14 @@ void Drawing_destroy(Drawing_t *Drawing) g_free(Drawing); } -GtkWidget *Drawing_getWidget(Drawing_t *Drawing) +GtkWidget *drawing_get_widget(Drawing_t *Drawing) { return Drawing->Drawing_Area_V; } /* get_time_from_pixels * - * Get the time interval from window time and pixels, and pixels requested. This - * function uses TimeMul, which should only be used if the float value is lower - * that 4, and here it's always lower than 1, so it's ok. + * Get the time interval from window time and pixels, and pixels requested. */ void convert_pixels_to_time( Drawing_t *Drawing, @@ -266,13 +260,10 @@ void convert_pixels_to_time( { LttTime window_time_interval; - TimeSub(window_time_interval, *window_time_end, *window_time_begin); - - - TimeMul(*time, window_time_interval, - (x/(float)Drawing->width)); - TimeAdd(*time, *window_time_begin, *time); - + window_time_interval = ltt_time_sub(*window_time_end, + *window_time_begin); + *time = ltt_time_mul(window_time_interval, (x/(float)Drawing->width)); + *time = ltt_time_add(*window_time_begin, *time); } @@ -287,23 +278,24 @@ void convert_time_to_pixels( LttTime window_time_interval; float interval_float, time_float; - TimeSub(window_time_interval, window_time_end, window_time_begin); + window_time_interval = ltt_time_sub(window_time_end,window_time_begin); - TimeSub(time, time, window_time_begin); + time = ltt_time_sub(time, window_time_begin); - interval_float = (window_time_interval.tv_sec * NANSECOND_CONST) - + window_time_interval.tv_nsec; - time_float = (time.tv_sec * NANSECOND_CONST) - + time.tv_nsec; + interval_float = ltt_time_to_double(window_time_interval); + time_float = ltt_time_to_double(time); *x = (guint)(time_float/interval_float * Drawing->width); } -void Drawing_Refresh ( Drawing_t *Drawing, +void drawing_refresh ( Drawing_t *Drawing, guint x, guint y, guint width, guint height) { + g_info("Drawing.c : drawing_refresh %u, %u, %u, %u", x, y, width, height); + GdkRectangle update_rect; + gdk_draw_drawable( Drawing->Drawing_Area_V->window, Drawing->Drawing_Area_V-> @@ -312,10 +304,17 @@ void Drawing_Refresh ( Drawing_t *Drawing, x, y, x, y, width, height); + + update_rect.x = 0 ; + update_rect.y = 0 ; + update_rect.width = Drawing->width; + update_rect.height = Drawing->height ; + gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect); + } -void Drawing_draw_line( Drawing_t *Drawing, +void drawing_draw_line( Drawing_t *Drawing, GdkPixmap *Pixmap, guint x1, guint y1, guint x2, guint y2, @@ -329,7 +328,7 @@ void Drawing_draw_line( Drawing_t *Drawing, -void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) +void drawing_resize(Drawing_t *Drawing, guint h, guint w) { Drawing->height = h ; Drawing->width = w ; @@ -342,3 +341,114 @@ void Drawing_Resize(Drawing_t *Drawing, guint h, guint w) } +/* Insert a square corresponding to a new process in the list */ +/* Applies to whole Drawing->width */ +void drawing_insert_square(Drawing_t *Drawing, + guint y, + guint height) +{ + GdkRectangle update_rect; + + /* Allocate a new pixmap with new height */ + GdkPixmap *Pixmap = gdk_pixmap_new(Drawing->Drawing_Area_V->window, + Drawing->width, + Drawing->height + height, + -1); + + /* Copy the high region */ + gdk_draw_drawable (Pixmap, + Drawing->Drawing_Area_V->style->black_gc, + Drawing->Pixmap, + 0, 0, + 0, 0, + Drawing->width, y); + + + + + /* add an empty square */ + gdk_draw_rectangle (Pixmap, + Drawing->Drawing_Area_V->style->black_gc, + TRUE, + 0, y, + Drawing->width, // do not overlap + height); + + + + /* copy the bottom of the region */ + gdk_draw_drawable (Pixmap, + Drawing->Drawing_Area_V->style->black_gc, + Drawing->Pixmap, + 0, y, + 0, y + height, + Drawing->width, Drawing->height - y); + + + + + if (Drawing->Pixmap) + gdk_pixmap_unref(Drawing->Pixmap); + + Drawing->Pixmap = Pixmap; + + Drawing->height+=height; + + /* Rectangle to update, from new Drawing dimensions */ + update_rect.x = 0 ; + update_rect.y = y ; + update_rect.width = Drawing->width; + update_rect.height = Drawing->height - y ; + gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect); +} + + +/* Remove a square corresponding to a removed process in the list */ +void drawing_remove_square(Drawing_t *Drawing, + guint y, + guint height) +{ + GdkRectangle update_rect; + + /* Allocate a new pixmap with new height */ + GdkPixmap *Pixmap = gdk_pixmap_new( + Drawing->Drawing_Area_V->window, + Drawing->width, + Drawing->height - height, + -1); + + /* Copy the high region */ + gdk_draw_drawable (Pixmap, + Drawing->Drawing_Area_V->style->black_gc, + Drawing->Pixmap, + 0, 0, + 0, 0, + Drawing->width, y); + + + + /* Copy up the bottom of the region */ + gdk_draw_drawable (Pixmap, + Drawing->Drawing_Area_V->style->black_gc, + Drawing->Pixmap, + 0, y + height, + 0, y, + Drawing->width, Drawing->height - y - height); + + + if (Drawing->Pixmap) + gdk_pixmap_unref(Drawing->Pixmap); + + Drawing->Pixmap = Pixmap; + + Drawing->height-=height; + + /* Rectangle to update, from new Drawing dimensions */ + update_rect.x = 0 ; + update_rect.y = y ; + update_rect.width = Drawing->width; + update_rect.height = Drawing->height - y ; + gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect); +} + +