From 8b90e6486401fa3388e550e0f3d55a3d70f4d0bf Mon Sep 17 00:00:00 2001 From: compudj Date: Wed, 14 Jan 2004 17:45:52 +0000 Subject: [PATCH] current time ready : zoom efficient git-svn-id: http://ltt.polymtl.ca/svn@379 04897980-b3bd-0310-b5e0-8ef037075253 --- .../poly/lttv/modules/guiControlFlow/CFV.c | 8 +- .../lttv/modules/guiControlFlow/Draw_Item.c | 17 +- .../lttv/modules/guiControlFlow/Draw_Item.h | 5 +- .../lttv/modules/guiControlFlow/Drawing.c | 95 ++++- .../lttv/modules/guiControlFlow/Event_Hooks.c | 388 +++++++++++++++++- .../lttv/modules/guiControlFlow/Event_Hooks.h | 6 + .../modules/guiControlFlow/Process_List.c | 28 +- .../modules/guiControlFlow/Process_List.h | 7 + 8 files changed, 535 insertions(+), 19 deletions(-) diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/CFV.c b/ltt/branches/poly/lttv/modules/guiControlFlow/CFV.c index 2996a357..d15b2c52 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/CFV.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/CFV.c @@ -29,7 +29,7 @@ extern GSList *gControl_Flow_Data_List; ControlFlowData * guicontrolflow(void) { - GtkWidget *Process_List_Widget, *Drawing_Widget; + GtkWidget *Process_List_Widget, *Drawing_Widget;//, *button; ControlFlowData* Control_Flow_Data = g_new(ControlFlowData,1) ; @@ -64,6 +64,11 @@ guicontrolflow(void) //gtk_box_pack_start( // GTK_BOX(Control_Flow_Data->Inside_HBox_V), // Drawing_Widget, TRUE, TRUE, 0); + + //button = gtk_button_new(); + //gtk_button_set_relief(button, GTK_RELIEF_NONE); + //gtk_container_set_border_width(GTK_CONTAINER(button),0); + //gtk_container_add(GTK_CONTAINER(button), Drawing_Widget); gtk_paned_pack1(GTK_PANED(Control_Flow_Data->HPaned), Process_List_Widget, FALSE, TRUE); gtk_paned_pack2(GTK_PANED(Control_Flow_Data->HPaned), Drawing_Widget, TRUE, TRUE); @@ -110,6 +115,7 @@ guicontrolflow(void) gtk_widget_show(Drawing_Widget); + //gtk_widget_show(button); gtk_widget_show(Process_List_Widget); //gtk_widget_show(Control_Flow_Data->Inside_HBox_V); gtk_widget_show(Control_Flow_Data->HPaned); diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c index f86edea7..c73aee01 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c @@ -235,8 +235,11 @@ gboolean draw_line( void *hook_data, void *call_data) { PropertiesLine *Properties = (PropertiesLine*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; - - gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + //GdkGC *gc = gdk_gc_new(Draw_Context->drawable); + + //gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + gdk_gc_set_rgb_fg_color(Draw_Context->gc, Properties->color); + //gdk_gc_set_foreground(gc, Properties->color); gdk_gc_set_line_attributes( Draw_Context->gc, Properties->line_width, Properties->style, @@ -273,7 +276,9 @@ gboolean draw_line( void *hook_data, void *call_data) break; } - + + //gdk_gc_unref(gc); + return 0; } @@ -282,7 +287,8 @@ gboolean draw_arc( void *hook_data, void *call_data) PropertiesArc *Properties = (PropertiesArc*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; - gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + //gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + gdk_gc_set_rgb_fg_color(Draw_Context->gc, Properties->color); switch(Properties->position) { case OVER: @@ -322,7 +328,8 @@ gboolean draw_bg( void *hook_data, void *call_data) PropertiesBG *Properties = (PropertiesBG*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; - gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + //gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + gdk_gc_set_rgb_fg_color(Draw_Context->gc, Properties->color); gdk_draw_rectangle(Draw_Context->drawable, Draw_Context->gc, diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.h b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.h index 6c35e977..ff332f49 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.h +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.h @@ -1,6 +1,8 @@ #ifndef _DRAW_ITEM_H #define _DRAW_ITEM_H +#include + typedef struct _DrawContext DrawContext; typedef struct _DrawInfo DrawInfo; typedef struct _ItemInfo ItemInfo; @@ -75,8 +77,7 @@ struct _DrawInfo { ItemInfo *modify_over; ItemInfo *modify_middle; ItemInfo *modify_under; - LttvTraceState *ts; - LttvTracefileState *tfs; + LttvProcessStatus status; }; struct _ItemInfo { diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c index 003be178..71fc6e54 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c @@ -96,6 +96,8 @@ void drawing_data_request(Drawing_t *Drawing, event_request.Control_Flow_Data = control_flow_data; event_request.time_begin = start; event_request.time_end = end; + event_request.x_begin = x; + event_request.x_end = x+width; g_critical("req : start : %u, %u", event_request.time_begin.tv_sec, event_request.time_begin.tv_nsec); @@ -105,21 +107,32 @@ void drawing_data_request(Drawing_t *Drawing, LttvHooks *event = lttv_hooks_new(); LttvHooks *after_event = lttv_hooks_new(); + LttvHooks *after_traceset = lttv_hooks_new(); + lttv_hooks_add(after_traceset, after_data_request, &event_request); lttv_hooks_add(event, draw_event_hook, &event_request); state_add_event_hooks_api(control_flow_data->Parent_Window); lttv_hooks_add(after_event, draw_after_hook, &event_request); lttv_process_traceset_seek_time(tsc, start); + // FIXME : would like to place the after_traceset hook after the traceset, + // but the traceset context state is not valid anymore. lttv_traceset_context_add_hooks(tsc, + // NULL, after_traceset, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, event, after_event); + NULL, after_traceset, NULL, event, 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, after_event); + //after_data_request((void*)&event_request,(void*)tsc); + lttv_traceset_context_remove_hooks(tsc, + //NULL, after_traceset, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, after_traceset, NULL, event, after_event); state_remove_event_hooks_api(control_flow_data->Parent_Window); + lttv_hooks_destroy(after_traceset); lttv_hooks_destroy(event); lttv_hooks_destroy(after_event); + + } /* Callbacks */ @@ -262,8 +275,27 @@ static gboolean expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data ) { Drawing_t *Drawing = (Drawing_t*)user_data; + ControlFlowData *control_flow_data = + (ControlFlowData*)g_object_get_data( + G_OBJECT(widget), + "Control_Flow_Data"); + g_critical("drawing expose event"); + + guint x=0; + LttTime* Current_Time = + guicontrolflow_get_current_time(control_flow_data); + LttTime window_end = ltt_time_add(control_flow_data->Time_Window.time_width, + control_flow_data->Time_Window.start_time); + + convert_time_to_pixels( + control_flow_data->Time_Window.start_time, + window_end, + *Current_Time, + widget->allocation.width, + &x); + gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], Drawing->Pixmap, @@ -271,9 +303,58 @@ expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data ) event->area.x, event->area.y, event->area.width, event->area.height); + if(x >= event->area.x && x <= event->area.x+event->area.width) + { + GdkGC *gc = gdk_gc_new(control_flow_data->Drawing->Pixmap); + gdk_gc_copy(gc, widget->style->black_gc); + + drawing_draw_line(NULL, widget->window, + x, event->area.y, + x, event->area.y+event->area.height, + gc); + gdk_gc_unref(gc); + } return FALSE; } +/* mouse click */ +static gboolean +button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data ) +{ + ControlFlowData *control_flow_data = + (ControlFlowData*)g_object_get_data( + G_OBJECT(widget), + "Control_Flow_Data"); + Drawing_t *Drawing = control_flow_data->Drawing; + + + g_critical("click"); + if(event->button == 1) + { + LttTime time; + + LttTime window_end = ltt_time_add(control_flow_data->Time_Window.time_width, + control_flow_data->Time_Window.start_time); + + + /* left mouse button click */ + g_critical("x click is : %f", event->x); + + convert_pixels_to_time(widget->allocation.width, (guint)event->x, + &control_flow_data->Time_Window.start_time, + &window_end, + &time); + + set_current_time(control_flow_data->Parent_Window, &time); + + } + + return FALSE; +} + + + + Drawing_t *drawing_construct(ControlFlowData *Control_Flow_Data) { Drawing_t *Drawing = g_new(Drawing_t, 1); @@ -314,6 +395,8 @@ Drawing_t *drawing_construct(ControlFlowData *Control_Flow_Data) // Drawing->Drawing_Area_V->allocation.height, // -1); + gtk_widget_add_events(Drawing->Drawing_Area_V, GDK_BUTTON_PRESS_MASK); + g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), "configure_event", G_CALLBACK (configure_event), @@ -324,6 +407,12 @@ Drawing_t *drawing_construct(ControlFlowData *Control_Flow_Data) G_CALLBACK (expose_event), (gpointer)Drawing); + g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V), + "button-press-event", + G_CALLBACK (button_press_event), + (gpointer)Drawing); + + return Drawing; } diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.c index 8f975efa..4ab54f84 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.c @@ -256,7 +256,9 @@ int draw_event_hook(void *hook_data, void *call_data) draw_context_out->pango_layout = control_flow_data->Drawing->pango_layout; GtkWidget *widget = control_flow_data->Drawing->Drawing_Area_V; //draw_context_out->gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)]; - draw_context_out->gc = widget->style->black_gc; + draw_context_out->gc = gdk_gc_new(control_flow_data->Drawing->Pixmap); + gdk_gc_copy(draw_context_out->gc, widget->style->black_gc); + //draw_context_out->gc = widget->style->black_gc; //draw_arc((void*)&prop_arc, (void*)draw_context_out); //test_draw_item(control_flow_data->Drawing, control_flow_data->Drawing->Pixmap); @@ -286,7 +288,79 @@ int draw_event_hook(void *hook_data, void *call_data) prop_text_out.Text = "U"; draw_text((void*)&prop_text_out, (void*)draw_context_out); + gdk_gc_unref(draw_context_out->gc); + + /* Draw the line of the out process */ + if(draw_context_out->Previous->middle->x == -1) + { + draw_context_out->Previous->middle->x = Event_Request->x_begin; + g_critical("out middle x_beg : %u",Event_Request->x_begin); + } + + draw_context_out->Current->middle->x = x; + draw_context_out->Current->middle->y = y_out + height/2; + draw_context_out->Previous->middle->y = y_out + height/2; + draw_context_out->drawable = control_flow_data->Drawing->Pixmap; + draw_context_out->pango_layout = control_flow_data->Drawing->pango_layout; + //draw_context_out->gc = widget->style->black_gc; + draw_context_out->gc = gdk_gc_new(control_flow_data->Drawing->Pixmap); + gdk_gc_copy(draw_context_out->gc, widget->style->black_gc); + PropertiesLine prop_line_out; + prop_line_out.color = g_new(GdkColor,1); + prop_line_out.line_width = 4; + prop_line_out.style = GDK_LINE_SOLID; + prop_line_out.position = MIDDLE; + + /* color of line : status of the process */ + if(process_out->state->s == LTTV_STATE_UNNAMED) + { + prop_line_out.color->red = 0x0000; + prop_line_out.color->green = 0x0000; + prop_line_out.color->blue = 0x0000; + } + else if(process_out->state->s == LTTV_STATE_WAIT_FORK) + { + prop_line_out.color->red = 0x0fff; + prop_line_out.color->green = 0x0000; + prop_line_out.color->blue = 0x0fff; + } + else if(process_out->state->s == LTTV_STATE_WAIT_CPU) + { + prop_line_out.color->red = 0x0fff; + prop_line_out.color->green = 0x0fff; + prop_line_out.color->blue = 0x0000; + } + else if(process_out->state->s == LTTV_STATE_EXIT) + { + prop_line_out.color->red = 0xffff; + prop_line_out.color->green = 0x0000; + prop_line_out.color->blue = 0xffff; + } + else if(process_out->state->s == LTTV_STATE_WAIT) + { + prop_line_out.color->red = 0xffff; + prop_line_out.color->green = 0x0000; + prop_line_out.color->blue = 0x0000; + } + else if(process_out->state->s == LTTV_STATE_RUN) + { + prop_line_out.color->red = 0x0000; + prop_line_out.color->green = 0xffff; + prop_line_out.color->blue = 0x0000; + } + else + { + prop_line_out.color->red = 0x0000; + prop_line_out.color->green = 0x0000; + prop_line_out.color->blue = 0x0000; + } + + draw_line((void*)&prop_line_out, (void*)draw_context_out); + g_free(prop_line_out.color); + gdk_gc_unref(draw_context_out->gc); + /* Note : finishing line will have to be added when trace read over. */ + /* Finally, update the drawing context of the pid_in. */ DrawContext *draw_context_in = Hashed_Process_Data_in->draw_context; @@ -296,7 +370,9 @@ int draw_event_hook(void *hook_data, void *call_data) draw_context_in->pango_layout = control_flow_data->Drawing->pango_layout; widget = control_flow_data->Drawing->Drawing_Area_V; //draw_context_in->gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)]; - draw_context_in->gc = widget->style->black_gc; + //draw_context_in->gc = widget->style->black_gc; + draw_context_in->gc = gdk_gc_new(control_flow_data->Drawing->Pixmap); + gdk_gc_copy(draw_context_in->gc, widget->style->black_gc); //draw_arc((void*)&prop_arc, (void*)draw_context_in); //test_draw_item(control_flow_data->Drawing, control_flow_data->Drawing->Pixmap); @@ -326,7 +402,77 @@ int draw_event_hook(void *hook_data, void *call_data) prop_text_in.Text = "U"; draw_text((void*)&prop_text_in, (void*)draw_context_in); + gdk_gc_unref(draw_context_in->gc); + + /* Draw the line of the in process */ + if(draw_context_in->Previous->middle->x == -1) + { + draw_context_in->Previous->middle->x = Event_Request->x_begin; + g_critical("in middle x_beg : %u",Event_Request->x_begin); + } + + draw_context_in->Current->middle->x = x; + draw_context_in->Previous->middle->y = y_in + height/2; + draw_context_in->Current->middle->y = y_in + height/2; + draw_context_in->drawable = control_flow_data->Drawing->Pixmap; + draw_context_in->pango_layout = control_flow_data->Drawing->pango_layout; + //draw_context_in->gc = widget->style->black_gc; + draw_context_in->gc = gdk_gc_new(control_flow_data->Drawing->Pixmap); + gdk_gc_copy(draw_context_in->gc, widget->style->black_gc); + PropertiesLine prop_line_in; + prop_line_in.color = g_new(GdkColor,1); + prop_line_in.line_width = 4; + prop_line_in.style = GDK_LINE_SOLID; + prop_line_in.position = MIDDLE; + + /* color of line : status of the process */ + if(process_in->state->s == LTTV_STATE_UNNAMED) + { + prop_line_in.color->red = 0x0000; + prop_line_in.color->green = 0x0000; + prop_line_in.color->blue = 0x0000; + } + else if(process_in->state->s == LTTV_STATE_WAIT_FORK) + { + prop_line_in.color->red = 0x0fff; + prop_line_in.color->green = 0x0000; + prop_line_in.color->blue = 0x0fff; + } + else if(process_in->state->s == LTTV_STATE_WAIT_CPU) + { + prop_line_in.color->red = 0x0fff; + prop_line_in.color->green = 0x0fff; + prop_line_in.color->blue = 0x0000; + } + else if(process_in->state->s == LTTV_STATE_EXIT) + { + prop_line_in.color->red = 0xffff; + prop_line_in.color->green = 0x0000; + prop_line_in.color->blue = 0xffff; + } + else if(process_in->state->s == LTTV_STATE_WAIT) + { + prop_line_in.color->red = 0xffff; + prop_line_in.color->green = 0x0000; + prop_line_in.color->blue = 0x0000; + } + else if(process_in->state->s == LTTV_STATE_RUN) + { + prop_line_in.color->red = 0x0000; + prop_line_in.color->green = 0xffff; + prop_line_in.color->blue = 0x0000; + } + else + { + prop_line_in.color->red = 0x0000; + prop_line_in.color->green = 0x0000; + prop_line_in.color->blue = 0x0000; + } + + draw_line((void*)&prop_line_in, (void*)draw_context_in); + g_free(prop_line_in.color); + gdk_gc_unref(draw_context_in->gc); } return 0; @@ -482,7 +628,7 @@ int draw_after_hook(void *hook_data, void *call_data) DrawContext *draw_context_out = Hashed_Process_Data_out->draw_context; //draw_context_out->Current->modify_over->x = x; - //draw_context_out->Current->modify_over->y = y_out; + draw_context_out->Current->modify_over->y = y_out; draw_context_out->drawable = control_flow_data->Drawing->Pixmap; draw_context_out->pango_layout = control_flow_data->Drawing->pango_layout; GtkWidget *widget = control_flow_data->Drawing->Drawing_Area_V; @@ -518,11 +664,46 @@ int draw_after_hook(void *hook_data, void *call_data) draw_text((void*)&prop_text_out, (void*)draw_context_out); + draw_context_out->Current->middle->y = y_out+height/2; + draw_context_out->Current->status = process_out->state->s; + + /* for pid_out : remove Previous, Prev = Current, new Current (default) */ + g_free(draw_context_out->Previous->modify_under); + g_free(draw_context_out->Previous->modify_middle); + g_free(draw_context_out->Previous->modify_over); + g_free(draw_context_out->Previous->under); + g_free(draw_context_out->Previous->middle); + g_free(draw_context_out->Previous->over); + g_free(draw_context_out->Previous); + + draw_context_out->Previous = draw_context_out->Current; + + draw_context_out->Current = g_new(DrawInfo,1); + draw_context_out->Current->over = g_new(ItemInfo,1); + draw_context_out->Current->over->x = -1; + draw_context_out->Current->over->y = -1; + draw_context_out->Current->middle = g_new(ItemInfo,1); + draw_context_out->Current->middle->x = -1; + draw_context_out->Current->middle->y = -1; + draw_context_out->Current->under = g_new(ItemInfo,1); + draw_context_out->Current->under->x = -1; + draw_context_out->Current->under->y = -1; + draw_context_out->Current->modify_over = g_new(ItemInfo,1); + draw_context_out->Current->modify_over->x = -1; + draw_context_out->Current->modify_over->y = -1; + draw_context_out->Current->modify_middle = g_new(ItemInfo,1); + draw_context_out->Current->modify_middle->x = -1; + draw_context_out->Current->modify_middle->y = -1; + draw_context_out->Current->modify_under = g_new(ItemInfo,1); + draw_context_out->Current->modify_under->x = -1; + draw_context_out->Current->modify_under->y = -1; + draw_context_out->Current->status = LTTV_STATE_UNNAMED; + /* Finally, update the drawing context of the pid_in. */ DrawContext *draw_context_in = Hashed_Process_Data_in->draw_context; //draw_context_in->Current->modify_over->x = x; - //draw_context_in->Current->modify_over->y = y_in; + draw_context_in->Current->modify_over->y = y_in; draw_context_in->drawable = control_flow_data->Drawing->Pixmap; draw_context_in->pango_layout = control_flow_data->Drawing->pango_layout; widget = control_flow_data->Drawing->Drawing_Area_V; @@ -558,6 +739,41 @@ int draw_after_hook(void *hook_data, void *call_data) draw_text((void*)&prop_text_in, (void*)draw_context_in); + draw_context_in->Current->middle->y = y_in+height/2; + draw_context_in->Current->status = process_in->state->s; + + /* for pid_in : remove Previous, Prev = Current, new Current (default) */ + g_free(draw_context_in->Previous->modify_under); + g_free(draw_context_in->Previous->modify_middle); + g_free(draw_context_in->Previous->modify_over); + g_free(draw_context_in->Previous->under); + g_free(draw_context_in->Previous->middle); + g_free(draw_context_in->Previous->over); + g_free(draw_context_in->Previous); + + draw_context_in->Previous = draw_context_in->Current; + + draw_context_in->Current = g_new(DrawInfo,1); + draw_context_in->Current->over = g_new(ItemInfo,1); + draw_context_in->Current->over->x = -1; + draw_context_in->Current->over->y = -1; + draw_context_in->Current->middle = g_new(ItemInfo,1); + draw_context_in->Current->middle->x = -1; + draw_context_in->Current->middle->y = -1; + draw_context_in->Current->under = g_new(ItemInfo,1); + draw_context_in->Current->under->x = -1; + draw_context_in->Current->under->y = -1; + draw_context_in->Current->modify_over = g_new(ItemInfo,1); + draw_context_in->Current->modify_over->x = -1; + draw_context_in->Current->modify_over->y = -1; + draw_context_in->Current->modify_middle = g_new(ItemInfo,1); + draw_context_in->Current->modify_middle->x = -1; + draw_context_in->Current->modify_middle->y = -1; + draw_context_in->Current->modify_under = g_new(ItemInfo,1); + draw_context_in->Current->modify_under->x = -1; + draw_context_in->Current->modify_under->y = -1; + draw_context_in->Current->status = LTTV_STATE_UNNAMED; + } return 0; @@ -766,6 +982,8 @@ void update_current_time_hook(void *hook_data, void *call_data) g_info("New Current time HOOK : %u, %u", Current_Time->tv_sec, Current_Time->tv_nsec); + gtk_widget_queue_draw(Control_Flow_Data->Drawing->Drawing_Area_V); + /* If current time is inside time interval, just move the highlight * bar */ @@ -776,3 +994,165 @@ void update_current_time_hook(void *hook_data, void *call_data) } +typedef struct _ClosureData { + EventRequest *event_request; + LttvTraceState *ts; +} ClosureData; + + +void draw_closure(gpointer key, gpointer value, gpointer user_data) +{ + ProcessInfo *process_info = (ProcessInfo*)key; + HashedProcessData *hashed_process_data = (HashedProcessData*)value; + ClosureData *closure_data = (ClosureData*)user_data; + + ControlFlowData *control_flow_data = + closure_data->event_request->Control_Flow_Data; + + GtkWidget *widget = control_flow_data->Drawing->Drawing_Area_V; + + /* Get y position of process */ + gint y=0, height=0; + + processlist_get_pixels_from_data( control_flow_data->Process_List, + process_info, + hashed_process_data, + &y, + &height); + /* Get last state of process */ + LttvTraceContext *tc = + (LttvTraceContext *)closure_data->ts; + + LttvTraceState *ts = closure_data->ts; + LttvProcessState *process; + + process = lttv_state_find_process((LttvTracefileState*)ts, process_info->pid); + + /* Draw the closing line */ + DrawContext *draw_context = hashed_process_data->draw_context; + if(draw_context->Previous->middle->x == -1) + { + draw_context->Previous->middle->x = closure_data->event_request->x_begin; + g_critical("out middle x_beg : %u",closure_data->event_request->x_begin); + } + + draw_context->Current->middle->x = closure_data->event_request->x_end; + draw_context->Current->middle->y = y + height/2; + draw_context->Previous->middle->y = y + height/2; + draw_context->drawable = control_flow_data->Drawing->Pixmap; + draw_context->pango_layout = control_flow_data->Drawing->pango_layout; + //draw_context->gc = widget->style->black_gc; + draw_context->gc = gdk_gc_new(control_flow_data->Drawing->Pixmap); + gdk_gc_copy(draw_context->gc, widget->style->black_gc); + + PropertiesLine prop_line; + prop_line.color = g_new(GdkColor,1); + prop_line.line_width = 6; + prop_line.style = GDK_LINE_SOLID; + prop_line.position = MIDDLE; + + /* color of line : status of the process */ + if(process->state->s == LTTV_STATE_UNNAMED) + { + prop_line.color->red = 0x0000; + prop_line.color->green = 0x0000; + prop_line.color->blue = 0x0000; + } + else if(process->state->s == LTTV_STATE_WAIT_FORK) + { + prop_line.color->red = 0x0fff; + prop_line.color->green = 0x0000; + prop_line.color->blue = 0x0fff; + } + else if(process->state->s == LTTV_STATE_WAIT_CPU) + { + prop_line.color->red = 0x0fff; + prop_line.color->green = 0x0fff; + prop_line.color->blue = 0x0000; + } + else if(process->state->s == LTTV_STATE_EXIT) + { + prop_line.color->red = 0xffff; + prop_line.color->green = 0x0000; + prop_line.color->blue = 0xffff; + } + else if(process->state->s == LTTV_STATE_WAIT) + { + prop_line.color->red = 0xffff; + prop_line.color->green = 0x0000; + prop_line.color->blue = 0x0000; + } + else if(process->state->s == LTTV_STATE_RUN) + { + prop_line.color->red = 0x0000; + prop_line.color->green = 0xffff; + prop_line.color->blue = 0x0000; + } + else + { + prop_line.color->red = 0x0000; + prop_line.color->green = 0x0000; + prop_line.color->blue = 0x0000; + } + + draw_line((void*)&prop_line, (void*)draw_context); + g_free(prop_line.color); + gdk_gc_unref(draw_context->gc); + + /* Reset draw_context of the process for next request */ + + hashed_process_data->draw_context->drawable = NULL; + hashed_process_data->draw_context->gc = NULL; + hashed_process_data->draw_context->pango_layout = NULL; + hashed_process_data->draw_context->Current->over->x = -1; + hashed_process_data->draw_context->Current->over->y = -1; + hashed_process_data->draw_context->Current->middle->x = -1; + hashed_process_data->draw_context->Current->middle->y = -1; + hashed_process_data->draw_context->Current->under->x = -1; + hashed_process_data->draw_context->Current->under->y = -1; + hashed_process_data->draw_context->Current->modify_over->x = -1; + hashed_process_data->draw_context->Current->modify_over->y = -1; + hashed_process_data->draw_context->Current->modify_middle->x = -1; + hashed_process_data->draw_context->Current->modify_middle->y = -1; + hashed_process_data->draw_context->Current->modify_under->x = -1; + hashed_process_data->draw_context->Current->modify_under->y = -1; + hashed_process_data->draw_context->Current->status = LTTV_STATE_UNNAMED; + hashed_process_data->draw_context->Previous->over->x = -1; + hashed_process_data->draw_context->Previous->over->y = -1; + hashed_process_data->draw_context->Previous->middle->x = -1; + hashed_process_data->draw_context->Previous->middle->y = -1; + hashed_process_data->draw_context->Previous->under->x = -1; + hashed_process_data->draw_context->Previous->under->y = -1; + hashed_process_data->draw_context->Previous->modify_over->x = -1; + hashed_process_data->draw_context->Previous->modify_over->y = -1; + hashed_process_data->draw_context->Previous->modify_middle->x = -1; + hashed_process_data->draw_context->Previous->modify_middle->y = -1; + hashed_process_data->draw_context->Previous->modify_under->x = -1; + hashed_process_data->draw_context->Previous->modify_under->y = -1; + hashed_process_data->draw_context->Previous->status = LTTV_STATE_UNNAMED; + + +} + +/* + * for each process + * draw closing line + * new default prev and current + */ +int after_data_request(void *hook_data, void *call_data) +{ + EventRequest *Event_Request = (EventRequest*)hook_data; + ControlFlowData *control_flow_data = Event_Request->Control_Flow_Data; + + ProcessList *process_list = + guicontrolflow_get_process_list(Event_Request->Control_Flow_Data); + + ClosureData closure_data; + closure_data.event_request = (EventRequest*)hook_data; + closure_data.ts = (LttvTraceState*)call_data; + + g_hash_table_foreach(process_list->Process_Hash, draw_closure, + (void*)&closure_data); + +} + diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.h b/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.h index b500e751..a1fbb458 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.h +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.h @@ -24,6 +24,7 @@ typedef struct _EventRequest { ControlFlowData *Control_Flow_Data; LttTime time_begin, time_end; + gint x_begin, x_end; /* Fill the Events_Context during the initial expose, before calling for * events. */ @@ -69,6 +70,11 @@ int draw_event_hook(void *hook_data, void *call_data); int draw_after_hook(void *hook_data, void *call_data); +void draw_closure(gpointer key, gpointer value, gpointer user_data); + +int after_data_request(void *hook_data, void *call_data); + + void update_time_window_hook(void *hook_data, void *call_data); void update_current_time_hook(void *hook_data, void *call_data); diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c index 93298c5e..370a0349 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c @@ -334,8 +334,7 @@ int processlist_add( ProcessList *Process_List, Hashed_Process_Data->draw_context->Current->modify_under = g_new(ItemInfo,1); Hashed_Process_Data->draw_context->Current->modify_under->x = -1; Hashed_Process_Data->draw_context->Current->modify_under->y = -1; - Hashed_Process_Data->draw_context->Current->ts = NULL; - Hashed_Process_Data->draw_context->Current->tfs = NULL; + Hashed_Process_Data->draw_context->Current->status = LTTV_STATE_UNNAMED; Hashed_Process_Data->draw_context->Previous = g_new(DrawInfo,1); Hashed_Process_Data->draw_context->Previous->over = g_new(ItemInfo,1); Hashed_Process_Data->draw_context->Previous->over->x = -1; @@ -355,8 +354,7 @@ int processlist_add( ProcessList *Process_List, Hashed_Process_Data->draw_context->Previous->modify_under = g_new(ItemInfo,1); Hashed_Process_Data->draw_context->Previous->modify_under->x = -1; Hashed_Process_Data->draw_context->Previous->modify_under->y = -1; - Hashed_Process_Data->draw_context->Previous->ts = NULL; - Hashed_Process_Data->draw_context->Previous->tfs = NULL; + Hashed_Process_Data->draw_context->Previous->status = LTTV_STATE_UNNAMED; /* Add a new row to the model */ gtk_list_store_append ( Process_List->Store_M, &iter); @@ -490,3 +488,25 @@ gint processlist_get_process_pixels( ProcessList *Process_List, } } + + +gint processlist_get_pixels_from_data( ProcessList *Process_List, + ProcessInfo *process_info, + HashedProcessData *Hashed_Process_Data, + guint *y, + guint *height) +{ + gint *path_indices; + GtkTreePath *tree_path; + + tree_path = gtk_tree_row_reference_get_path( + Hashed_Process_Data->RowRef); + path_indices = gtk_tree_path_get_indices (tree_path); + + *height = get_cell_height( + GTK_TREE_VIEW(Process_List->Process_List_VC)); + *y = *height * path_indices[0]; + + return 0; + +} diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.h b/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.h index a02e7ab2..9b2d7b1f 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.h +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.h @@ -68,4 +68,11 @@ gint processlist_get_process_pixels(ProcessList *Process_List, guint pid, LttTime *birth, guint *y, guint *height, HashedProcessData **Hashed_Process_Data); + +gint processlist_get_pixels_from_data( ProcessList *Process_List, + ProcessInfo *process_info, + HashedProcessData *Hashed_Process_Data, + guint *y, + guint *height); + #endif // _PROCESS_LIST_H -- 2.34.1