X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiControlFlow%2FDrawing.c;h=2235c1215f694c4e627da1181b78bd2b18667f96;hb=504397121d1e35580b6194a73ae5954910ebc3f5;hp=e89c8b295b6896125f35c4eb4f4a15d00c803a54;hpb=f66eba62898bf525692d55ef95935266aee56096;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c index e89c8b29..2235c121 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c @@ -14,7 +14,6 @@ #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 * *****************************************************************************/ @@ -43,6 +42,8 @@ static GdkColor CF_Colors [] = /* Function responsible for updating the exposed area. * It must call processTrace() to ask for this update. + * Note : this function cannot clear the background, because it may + * erase drawing already present (SAFETY). */ void drawing_data_request(Drawing_t *Drawing, GdkPixmap **Pixmap, @@ -62,12 +63,20 @@ void drawing_data_request(Drawing_t *Drawing, LttTime window_end = ltt_time_add(control_flow_data->Time_Window.time_width, control_flow_data->Time_Window.start_time); - convert_pixels_to_time(Drawing, x, + g_critical("req : window_end : %u, %u", window_end.tv_sec, + window_end.tv_nsec); + + g_critical("req : time width : %u, %u", control_flow_data->Time_Window.time_width.tv_sec, + control_flow_data->Time_Window.time_width.tv_nsec); + + g_critical("x is : %i, x+width is : %i", x, x+width); + + convert_pixels_to_time(Drawing->Drawing_Area_V->allocation.width, x, &control_flow_data->Time_Window.start_time, &window_end, &start); - convert_pixels_to_time(Drawing, x + width, + convert_pixels_to_time(Drawing->Drawing_Area_V->allocation.width, x + width, &control_flow_data->Time_Window.start_time, &window_end, &end); @@ -75,16 +84,9 @@ void drawing_data_request(Drawing_t *Drawing, LttvTracesetContext * tsc = get_traceset_context(control_flow_data->Parent_Window); - gdk_draw_rectangle (*Pixmap, - Drawing->Drawing_Area_V->style->white_gc, - TRUE, - x, y, - width, // do not overlap - height); - - send_test_process( - guicontrolflow_get_process_list(Drawing->Control_Flow_Data), - Drawing); + //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); @@ -95,57 +97,107 @@ void drawing_data_request(Drawing_t *Drawing, event_request.time_begin = start; event_request.time_end = end; - LttvHooks *event = lttv_hooks_new(); - lttv_hooks_add(event, draw_event_hook, &event_request); + g_critical("req : start : %u, %u", event_request.time_begin.tv_sec, + event_request.time_begin.tv_nsec); + + g_critical("req : end : %u, %u", event_request.time_end.tv_sec, + event_request.time_end.tv_nsec); + + //LttvHooks *event = lttv_hooks_new(); + LttvHooks *after_event = lttv_hooks_new(); + state_add_event_hooks_api(control_flow_data->Parent_Window); + //lttv_hooks_add(event, draw_event_hook, &event_request); + lttv_hooks_add(after_event, draw_after_hook, &event_request); lttv_process_traceset_seek_time(tsc, start); lttv_traceset_context_add_hooks(tsc, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, event, NULL); + NULL, NULL, NULL, NULL, after_event); lttv_process_traceset(tsc, end, G_MAXULONG); lttv_traceset_context_remove_hooks(tsc, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, event, NULL); + NULL, NULL, NULL, NULL,after_event); - lttv_hooks_destroy(event); + state_remove_event_hooks_api(control_flow_data->Parent_Window); + //lttv_hooks_destroy(event); + lttv_hooks_destroy(after_event); } /* Callbacks */ /* Create a new backing pixmap of the appropriate size */ +/* As the scaling will always change, it's of no use to copy old + * pixmap. + */ static gboolean configure_event( GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { Drawing_t *Drawing = (Drawing_t*)user_data; + + /* First, get the new time interval of the main window */ + /* we assume (see documentation) that the main window + * has updated the time interval before this configure gets + * executed. + */ + get_time_window(Drawing->Control_Flow_Data->Parent_Window, + &Drawing->Control_Flow_Data->Time_Window); + /* New Pixmap, size of the configure event */ - GdkPixmap *Pixmap = gdk_pixmap_new(widget->window, - widget->allocation.width, - widget->allocation.height, - -1); + //GdkPixmap *Pixmap = gdk_pixmap_new(widget->window, + // widget->allocation.width + SAFETY, + // widget->allocation.height + SAFETY, + // -1); g_critical("drawing configure event"); - + g_critical("New draw size : %i by %i",widget->allocation.width, widget->allocation.height); + + + if (Drawing->Pixmap) + gdk_pixmap_unref(Drawing->Pixmap); + /* If no old Pixmap present */ - if(Drawing->Pixmap == NULL) + //if(Drawing->Pixmap == NULL) { Drawing->Pixmap = gdk_pixmap_new( widget->window, - widget->allocation.width, - widget->allocation.height, + widget->allocation.width + SAFETY, + widget->allocation.height + SAFETY, //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->width = widget->allocation.width; + Drawing->height = widget->allocation.height; + + + // Clear the image + gdk_draw_rectangle (Drawing->Pixmap, + widget->style->white_gc, + TRUE, + 0, 0, + widget->allocation.width+SAFETY, + widget->allocation.height+SAFETY); + + //g_info("init data request"); + + + /* Initial data request */ + // Do not need to ask for data of 1 pixel : not synchronized with + // main window time at this moment. + drawing_data_request(Drawing, &Drawing->Pixmap, 0, 0, widget->allocation.width, - widget->allocation.height); + widget->allocation.height); + + Drawing->width = widget->allocation.width; + Drawing->height = widget->allocation.height; + + return TRUE; + + } +#ifdef NOTUSE // /* Draw empty background */ // gdk_draw_rectangle (Pixmap, // widget->style->black_gc, @@ -154,49 +206,54 @@ g_critical("init data"); // 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 */ -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->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); - - - + /* Copy old data to new pixmap */ + gdk_draw_drawable (Pixmap, + widget->style->white_gc, + Drawing->Pixmap, + 0, 0, + 0, 0, + -1, -1); + if (Drawing->Pixmap) gdk_pixmap_unref(Drawing->Pixmap); Drawing->Pixmap = Pixmap; + + // Clear the bottom part of the image (SAFETY) + gdk_draw_rectangle (Pixmap, + widget->style->white_gc, + TRUE, + 0, Drawing->height+SAFETY, + Drawing->width+SAFETY, // do not overlap + (widget->allocation.height) - Drawing->height); + + // Clear the right part of the image (SAFETY) + gdk_draw_rectangle (Pixmap, + widget->style->white_gc, + TRUE, + Drawing->width+SAFETY, 0, + (widget->allocation.width) - Drawing->width, // do not overlap + Drawing->height+SAFETY); + + /* Clear the backgound for data request, but not SAFETY */ + gdk_draw_rectangle (Pixmap, + Drawing->Drawing_Area_V->style->white_gc, + TRUE, + Drawing->width + SAFETY, 0, + widget->allocation.width - Drawing->width, // do not overlap + widget->allocation.height+SAFETY); + + /* Request data for missing space */ + g_info("missing data request"); + drawing_data_request(Drawing, &Pixmap, Drawing->width, 0, + widget->allocation.width - Drawing->width, + widget->allocation.height); + Drawing->width = widget->allocation.width; Drawing->height = widget->allocation.height; return TRUE; +#endif //NOTUSE } @@ -224,6 +281,9 @@ Drawing_t *drawing_construct(ControlFlowData *Control_Flow_Data) Drawing->Drawing_Area_V = gtk_drawing_area_new (); Drawing->Control_Flow_Data = Control_Flow_Data; + Drawing->pango_layout = + gtk_widget_create_pango_layout(Drawing->Drawing_Area_V, NULL); + //gtk_widget_set_size_request(Drawing->Drawing_Area_V->window, 50, 50); g_object_set_data_full( G_OBJECT(Drawing->Drawing_Area_V), @@ -273,6 +333,7 @@ void drawing_destroy(Drawing_t *Drawing) // Do not unref here, Drawing_t destroyed by it's widget. //g_object_unref( G_OBJECT(Drawing->Drawing_Area_V)); + g_free(Drawing->pango_layout); g_free(Drawing); } @@ -286,7 +347,7 @@ GtkWidget *drawing_get_widget(Drawing_t *Drawing) * Convert from window pixel and time interval to an absolute time. */ void convert_pixels_to_time( - Drawing_t *Drawing, + gint width, guint x, LttTime *window_time_begin, LttTime *window_time_end, @@ -296,7 +357,7 @@ void convert_pixels_to_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_mul(window_time_interval, (x/(float)width)); *time = ltt_time_add(*window_time_begin, *time); } @@ -306,7 +367,7 @@ void convert_time_to_pixels( LttTime window_time_begin, LttTime window_time_end, LttTime time, - Drawing_t *Drawing, + int width, guint *x) { LttTime window_time_interval; @@ -319,7 +380,7 @@ void convert_time_to_pixels( interval_float = ltt_time_to_double(window_time_interval); time_float = ltt_time_to_double(time); - *x = (guint)(time_float/interval_float * Drawing->width); + *x = (guint)(time_float/interval_float * width); } @@ -381,12 +442,12 @@ void drawing_insert_square(Drawing_t *Drawing, guint y, guint height) { - GdkRectangle update_rect; + //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, + Drawing->width + SAFETY, + Drawing->height + height + SAFETY, -1); /* Copy the high region */ @@ -395,17 +456,17 @@ void drawing_insert_square(Drawing_t *Drawing, Drawing->Pixmap, 0, 0, 0, 0, - Drawing->width, y); + Drawing->width + SAFETY, y); /* add an empty square */ gdk_draw_rectangle (Pixmap, - Drawing->Drawing_Area_V->style->black_gc, + Drawing->Drawing_Area_V->style->white_gc, TRUE, 0, y, - Drawing->width, // do not overlap + Drawing->width + SAFETY, // do not overlap height); @@ -416,7 +477,7 @@ void drawing_insert_square(Drawing_t *Drawing, Drawing->Pixmap, 0, y, 0, y + height, - Drawing->width, Drawing->height - y); + Drawing->width+SAFETY, Drawing->height - y + SAFETY); @@ -429,11 +490,11 @@ void drawing_insert_square(Drawing_t *Drawing, 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); + //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); } @@ -442,13 +503,13 @@ void drawing_remove_square(Drawing_t *Drawing, guint y, guint height) { - GdkRectangle update_rect; + //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, + Drawing->width + SAFETY, + Drawing->height - height + SAFETY, -1); /* Copy the high region */ @@ -457,7 +518,7 @@ void drawing_remove_square(Drawing_t *Drawing, Drawing->Pixmap, 0, 0, 0, 0, - Drawing->width, y); + Drawing->width + SAFETY, y); @@ -467,7 +528,7 @@ void drawing_remove_square(Drawing_t *Drawing, Drawing->Pixmap, 0, y + height, 0, y, - Drawing->width, Drawing->height - y - height); + Drawing->width, Drawing->height - y - height + SAFETY); if (Drawing->Pixmap) @@ -478,11 +539,11 @@ void drawing_remove_square(Drawing_t *Drawing, 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); + //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); }