current time ready : zoom efficient
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Wed, 14 Jan 2004 17:45:52 +0000 (17:45 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Wed, 14 Jan 2004 17:45:52 +0000 (17:45 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@379 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/lttv/modules/guiControlFlow/CFV.c
ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c
ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.h
ltt/branches/poly/lttv/modules/guiControlFlow/Drawing.c
ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.c
ltt/branches/poly/lttv/modules/guiControlFlow/Event_Hooks.h
ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.c
ltt/branches/poly/lttv/modules/guiControlFlow/Process_List.h

index 2996a35764e5273abb074e168f861dad158a7a60..d15b2c522d3dd670d34bfbca52c4d30c8fd8b696 100644 (file)
@@ -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);
index f86edea791aad6ea827c956ffef20dc23cc5b53f..c73aee01c26dadb26e7a64e8f081382d1ecb91f9 100644 (file)
@@ -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,
index 6c35e97769baa470b0d89fcc5d9ec6d5d633abaa..ff332f492b69a7e76788ef1ad25aeea857374020 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _DRAW_ITEM_H
 #define _DRAW_ITEM_H
 
+#include <lttv/state.h>
+
 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 {
index 003be178e857aca16fdea6b5091ac87b3caa3b9c..71fc6e542d7d43a2f61852fde4cd0244a69c282d 100644 (file)
@@ -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;
 }
 
index 8f975efaf285e65a1a164570ee7e61cabbbd1d48..4ab54f84c7465de45f191f10129af2e80a78b2d5 100644 (file)
@@ -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);
+       
+}
+
index b500e751bc4bb2f714266216beaad9ce4ce72793..a1fbb45807a86ab8590642cda19714ec72218506 100644 (file)
@@ -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);
 
index 93298c5e5a921c18bf5d40c918b5cdc8ecff672e..370a03490cbdbd28d4feb74accff79996fdf09aa 100644 (file)
@@ -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;       
+
+}
index a02e7ab28bcfe3e20221a353fe5ec6bda06d673f..9b2d7b1f2055af4e157a5f62f3beb21c8f9171b1 100644 (file)
@@ -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
This page took 0.035577 seconds and 4 git commands to generate.