1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Mathieu Desnoyers
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20 /*****************************************************************************
21 * Hooks to be called by the main window *
22 *****************************************************************************/
25 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
26 #define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
28 //#define PANGO_ENABLE_BACKEND
35 //#include <pango/pango.h>
37 #include <ltt/event.h>
41 #include <lttv/hook.h>
42 #include <lttv/common.h>
43 #include <lttv/state.h>
44 #include <lttv/gtkTraceSet.h>
47 #include "eventhooks.h"
49 #include "processlist.h"
51 #include "cfv-private.h"
54 #define MAX_PATH_LEN 256
58 * Event Viewer's constructor hook
60 * This constructor is given as a parameter to the menuitem and toolbar button
61 * registration. It creates the list.
62 * @param mw A pointer to the parent window.
63 * @return The widget created.
66 h_guicontrolflow(MainWindow
*mw
, LttvTracesetSelector
* s
, char * key
)
68 g_info("h_guicontrolflow, %p, %p, %s", mw
, s
, key
);
69 ControlFlowData
*control_flow_data
= guicontrolflow() ;
71 control_flow_data
->mw
= mw
;
72 TimeWindow
*time_window
= guicontrolflow_get_time_window(control_flow_data
);
73 time_window
->start_time
.tv_sec
= 0;
74 time_window
->start_time
.tv_nsec
= 0;
75 time_window
->time_width
.tv_sec
= 0;
76 time_window
->time_width
.tv_nsec
= 0;
78 LttTime
*current_time
= guicontrolflow_get_current_time(control_flow_data
);
79 current_time
->tv_sec
= 0;
80 current_time
->tv_nsec
= 0;
82 //g_critical("time width1 : %u",time_window->time_width);
89 //g_critical("time width2 : %u",time_window->time_width);
90 // Unreg done in the GuiControlFlow_Destructor
91 reg_update_time_window(update_time_window_hook
, control_flow_data
,
93 reg_update_current_time(update_current_time_hook
, control_flow_data
,
95 return guicontrolflow_get_widget(control_flow_data
) ;
99 int event_selected_hook(void *hook_data
, void *call_data
)
101 ControlFlowData
*control_flow_data
= (ControlFlowData
*) hook_data
;
102 guint
*event_number
= (guint
*) call_data
;
104 g_critical("DEBUG : event selected by main window : %u", *event_number
);
106 // control_flow_data->currently_Selected_Event = *event_number;
107 // control_flow_data->Selected_Event = TRUE ;
109 // tree_v_set_cursor(control_flow_data);
113 /* Hook called before drawing. Gets the initial context at the beginning of the
114 * drawing interval and copy it to the context in event_request.
116 int draw_before_hook(void *hook_data
, void *call_data
)
118 EventRequest
*event_request
= (EventRequest
*)hook_data
;
119 //EventsContext Events_Context = (EventsContext*)call_data;
121 //event_request->Events_Context = Events_Context;
127 * The draw event hook is called by the reading API to have a
128 * particular event drawn on the screen.
129 * @param hook_data ControlFlowData structure of the viewer.
130 * @param call_data Event context.
132 * This function basically draw lines and icons. Two types of lines are drawn :
133 * one small (3 pixels?) representing the state of the process and the second
134 * type is thicker (10 pixels?) representing on which CPU a process is running
135 * (and this only in running state).
137 * Extremums of the lines :
138 * x_min : time of the last event context for this process kept in memory.
139 * x_max : time of the current event.
140 * y : middle of the process in the process list. The process is found in the
141 * list, therefore is it's position in pixels.
143 * The choice of lines'color is defined by the context of the last event for this
146 int draw_event_hook(void *hook_data
, void *call_data
)
148 EventRequest
*event_request
= (EventRequest
*)hook_data
;
149 ControlFlowData
*control_flow_data
= event_request
->control_flow_data
;
151 LttvTracefileContext
*tfc
= (LttvTracefileContext
*)call_data
;
153 LttvTracefileState
*tfs
= (LttvTracefileState
*)call_data
;
159 if(strcmp(ltt_eventtype_name(ltt_event_eventtype(e
)),"schedchange") == 0)
161 g_critical("schedchange!");
163 /* Add process to process list (if not present) and get drawing "y" from
164 * process position */
165 guint pid_out
, pid_in
;
166 LttvProcessState
*process_out
, *process_in
;
168 guint y_in
= 0, y_out
= 0, height
= 0, pl_height
= 0;
170 ProcessList
*process_list
=
171 guicontrolflow_get_process_list(event_request
->control_flow_data
);
174 LttField
*f
= ltt_event_field(e
);
176 element
= ltt_field_member(f
,0);
177 pid_out
= ltt_event_get_long_unsigned(e
,element
);
178 element
= ltt_field_member(f
,1);
179 pid_in
= ltt_event_get_long_unsigned(e
,element
);
180 g_critical("out : %u in : %u", pid_out
, pid_in
);
183 /* Find process pid_out in the list... */
184 process_out
= lttv_state_find_process(tfs
, pid_out
);
185 g_critical("out : %s",g_quark_to_string(process_out
->state
->s
));
187 birth
= process_out
->creation_time
;
188 gchar
*name
= strdup(g_quark_to_string(process_out
->name
));
189 HashedProcessData
*hashed_process_data_out
= NULL
;
191 if(processlist_get_process_pixels(process_list
,
196 &hashed_process_data_out
) == 1)
198 /* Process not present */
199 processlist_add(process_list
,
204 &hashed_process_data_out
);
205 processlist_get_process_pixels(process_list
,
210 &hashed_process_data_out
);
211 drawing_insert_square( event_request
->control_flow_data
->drawing
, y_out
, height
);
216 /* Find process pid_in in the list... */
217 process_in
= lttv_state_find_process(tfs
, pid_in
);
218 g_critical("in : %s",g_quark_to_string(process_in
->state
->s
));
220 birth
= process_in
->creation_time
;
221 name
= strdup(g_quark_to_string(process_in
->name
));
222 HashedProcessData
*hashed_process_data_in
= NULL
;
224 if(processlist_get_process_pixels(process_list
,
229 &hashed_process_data_in
) == 1)
231 /* Process not present */
232 processlist_add(process_list
,
237 &hashed_process_data_in
);
238 processlist_get_process_pixels(process_list
,
243 &hashed_process_data_in
);
245 drawing_insert_square( event_request
->control_flow_data
->drawing
, y_in
, height
);
250 /* Find pixels corresponding to time of the event. If the time does
251 * not fit in the window, show a warning, not supposed to happend. */
253 guint width
= control_flow_data
->drawing
->drawing_area
->allocation
.width
;
255 LttTime time
= ltt_event_time(e
);
257 LttTime window_end
= ltt_time_add(control_flow_data
->time_window
.time_width
,
258 control_flow_data
->time_window
.start_time
);
261 convert_time_to_pixels(
262 control_flow_data
->time_window
.start_time
,
270 /* draw what represents the event for outgoing process. */
272 DrawContext
*draw_context_out
= hashed_process_data_out
->draw_context
;
273 draw_context_out
->current
->modify_over
->x
= x
;
274 draw_context_out
->current
->modify_over
->y
= y_out
;
275 draw_context_out
->drawable
= control_flow_data
->drawing
->pixmap
;
276 draw_context_out
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
277 GtkWidget
*widget
= control_flow_data
->drawing
->drawing_area
;
278 //draw_context_out->gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)];
279 draw_context_out
->gc
= gdk_gc_new(control_flow_data
->drawing
->pixmap
);
280 gdk_gc_copy(draw_context_out
->gc
, widget
->style
->black_gc
);
281 //draw_context_out->gc = widget->style->black_gc;
283 //draw_arc((void*)&prop_arc, (void*)draw_context_out);
284 //test_draw_item(control_flow_data->drawing, control_flow_data->drawing->pixmap);
286 GdkColor colorfg_out
= { 0, 0xffff, 0x0000, 0x0000 };
287 GdkColor colorbg_out
= { 0, 0x0000, 0x0000, 0x0000 };
288 PropertiesText prop_text_out
;
289 prop_text_out
.foreground
= &colorfg_out
;
290 prop_text_out
.background
= &colorbg_out
;
291 prop_text_out
.size
= 6;
292 prop_text_out
.position
= OVER
;
294 /* color of text : status of the process */
295 if(process_out
->state
->s
== LTTV_STATE_UNNAMED
)
297 prop_text_out
.foreground
->red
= 0xffff;
298 prop_text_out
.foreground
->green
= 0xffff;
299 prop_text_out
.foreground
->blue
= 0xffff;
301 else if(process_out
->state
->s
== LTTV_STATE_WAIT_FORK
)
303 prop_text_out
.foreground
->red
= 0x0fff;
304 prop_text_out
.foreground
->green
= 0x0000;
305 prop_text_out
.foreground
->blue
= 0x0fff;
307 else if(process_out
->state
->s
== LTTV_STATE_WAIT_CPU
)
309 prop_text_out
.foreground
->red
= 0xffff;
310 prop_text_out
.foreground
->green
= 0xffff;
311 prop_text_out
.foreground
->blue
= 0x0000;
313 else if(process_out
->state
->s
== LTTV_STATE_EXIT
)
315 prop_text_out
.foreground
->red
= 0xffff;
316 prop_text_out
.foreground
->green
= 0x0000;
317 prop_text_out
.foreground
->blue
= 0xffff;
319 else if(process_out
->state
->s
== LTTV_STATE_WAIT
)
321 prop_text_out
.foreground
->red
= 0xffff;
322 prop_text_out
.foreground
->green
= 0x0000;
323 prop_text_out
.foreground
->blue
= 0x0000;
325 else if(process_out
->state
->s
== LTTV_STATE_RUN
)
327 prop_text_out
.foreground
->red
= 0x0000;
328 prop_text_out
.foreground
->green
= 0xffff;
329 prop_text_out
.foreground
->blue
= 0x0000;
333 prop_text_out
.foreground
->red
= 0xffff;
334 prop_text_out
.foreground
->green
= 0xffff;
335 prop_text_out
.foreground
->blue
= 0xffff;
338 /* Print status of the process : U, WF, WC, E, W, R */
339 if(process_out
->state
->s
== LTTV_STATE_UNNAMED
)
340 prop_text_out
.text
= "U->";
341 else if(process_out
->state
->s
== LTTV_STATE_WAIT_FORK
)
342 prop_text_out
.text
= "WF->";
343 else if(process_out
->state
->s
== LTTV_STATE_WAIT_CPU
)
344 prop_text_out
.text
= "WC->";
345 else if(process_out
->state
->s
== LTTV_STATE_EXIT
)
346 prop_text_out
.text
= "E->";
347 else if(process_out
->state
->s
== LTTV_STATE_WAIT
)
348 prop_text_out
.text
= "W->";
349 else if(process_out
->state
->s
== LTTV_STATE_RUN
)
350 prop_text_out
.text
= "R->";
352 prop_text_out
.text
= "U";
354 draw_text((void*)&prop_text_out
, (void*)draw_context_out
);
355 gdk_gc_unref(draw_context_out
->gc
);
357 /* Draw the line of the out process */
358 if(draw_context_out
->previous
->middle
->x
== -1)
360 draw_context_out
->previous
->middle
->x
= event_request
->x_begin
;
361 g_critical("out middle x_beg : %u",event_request
->x_begin
);
364 draw_context_out
->current
->middle
->x
= x
;
365 draw_context_out
->current
->middle
->y
= y_out
+ height
/2;
366 draw_context_out
->previous
->middle
->y
= y_out
+ height
/2;
367 draw_context_out
->drawable
= control_flow_data
->drawing
->pixmap
;
368 draw_context_out
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
369 //draw_context_out->gc = widget->style->black_gc;
370 draw_context_out
->gc
= gdk_gc_new(control_flow_data
->drawing
->pixmap
);
371 gdk_gc_copy(draw_context_out
->gc
, widget
->style
->black_gc
);
373 PropertiesLine prop_line_out
;
374 prop_line_out
.color
= g_new(GdkColor
,1);
375 prop_line_out
.line_width
= 2;
376 prop_line_out
.style
= GDK_LINE_SOLID
;
377 prop_line_out
.position
= MIDDLE
;
379 /* color of line : status of the process */
380 if(process_out
->state
->s
== LTTV_STATE_UNNAMED
)
382 prop_line_out
.color
->red
= 0xffff;
383 prop_line_out
.color
->green
= 0xffff;
384 prop_line_out
.color
->blue
= 0xffff;
386 else if(process_out
->state
->s
== LTTV_STATE_WAIT_FORK
)
388 prop_line_out
.color
->red
= 0x0fff;
389 prop_line_out
.color
->green
= 0x0000;
390 prop_line_out
.color
->blue
= 0x0fff;
392 else if(process_out
->state
->s
== LTTV_STATE_WAIT_CPU
)
394 prop_line_out
.color
->red
= 0xffff;
395 prop_line_out
.color
->green
= 0xffff;
396 prop_line_out
.color
->blue
= 0x0000;
398 else if(process_out
->state
->s
== LTTV_STATE_EXIT
)
400 prop_line_out
.color
->red
= 0xffff;
401 prop_line_out
.color
->green
= 0x0000;
402 prop_line_out
.color
->blue
= 0xffff;
404 else if(process_out
->state
->s
== LTTV_STATE_WAIT
)
406 prop_line_out
.color
->red
= 0xffff;
407 prop_line_out
.color
->green
= 0x0000;
408 prop_line_out
.color
->blue
= 0x0000;
410 else if(process_out
->state
->s
== LTTV_STATE_RUN
)
412 prop_line_out
.color
->red
= 0x0000;
413 prop_line_out
.color
->green
= 0xffff;
414 prop_line_out
.color
->blue
= 0x0000;
418 prop_line_out
.color
->red
= 0xffff;
419 prop_line_out
.color
->green
= 0xffff;
420 prop_line_out
.color
->blue
= 0xffff;
423 draw_line((void*)&prop_line_out
, (void*)draw_context_out
);
424 g_free(prop_line_out
.color
);
425 gdk_gc_unref(draw_context_out
->gc
);
426 /* Note : finishing line will have to be added when trace read over. */
428 /* Finally, update the drawing context of the pid_in. */
430 DrawContext
*draw_context_in
= hashed_process_data_in
->draw_context
;
431 draw_context_in
->current
->modify_over
->x
= x
;
432 draw_context_in
->current
->modify_over
->y
= y_in
;
433 draw_context_in
->drawable
= control_flow_data
->drawing
->pixmap
;
434 draw_context_in
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
435 widget
= control_flow_data
->drawing
->drawing_area
;
436 //draw_context_in->gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)];
437 //draw_context_in->gc = widget->style->black_gc;
438 draw_context_in
->gc
= gdk_gc_new(control_flow_data
->drawing
->pixmap
);
439 gdk_gc_copy(draw_context_in
->gc
, widget
->style
->black_gc
);
441 //draw_arc((void*)&prop_arc, (void*)draw_context_in);
442 //test_draw_item(control_flow_data->drawing, control_flow_data->drawing->pixmap);
444 GdkColor colorfg_in
= { 0, 0x0000, 0xffff, 0x0000 };
445 GdkColor colorbg_in
= { 0, 0x0000, 0x0000, 0x0000 };
446 PropertiesText prop_text_in
;
447 prop_text_in
.foreground
= &colorfg_in
;
448 prop_text_in
.background
= &colorbg_in
;
449 prop_text_in
.size
= 6;
450 prop_text_in
.position
= OVER
;
452 /* foreground of text : status of the process */
453 if(process_in
->state
->s
== LTTV_STATE_UNNAMED
)
455 prop_text_in
.foreground
->red
= 0xffff;
456 prop_text_in
.foreground
->green
= 0xffff;
457 prop_text_in
.foreground
->blue
= 0xffff;
459 else if(process_in
->state
->s
== LTTV_STATE_WAIT_FORK
)
461 prop_text_in
.foreground
->red
= 0x0fff;
462 prop_text_in
.foreground
->green
= 0x0000;
463 prop_text_in
.foreground
->blue
= 0x0fff;
465 else if(process_in
->state
->s
== LTTV_STATE_WAIT_CPU
)
467 prop_text_in
.foreground
->red
= 0xffff;
468 prop_text_in
.foreground
->green
= 0xffff;
469 prop_text_in
.foreground
->blue
= 0x0000;
471 else if(process_in
->state
->s
== LTTV_STATE_EXIT
)
473 prop_text_in
.foreground
->red
= 0xffff;
474 prop_text_in
.foreground
->green
= 0x0000;
475 prop_text_in
.foreground
->blue
= 0xffff;
477 else if(process_in
->state
->s
== LTTV_STATE_WAIT
)
479 prop_text_in
.foreground
->red
= 0xffff;
480 prop_text_in
.foreground
->green
= 0x0000;
481 prop_text_in
.foreground
->blue
= 0x0000;
483 else if(process_in
->state
->s
== LTTV_STATE_RUN
)
485 prop_text_in
.foreground
->red
= 0x0000;
486 prop_text_in
.foreground
->green
= 0xffff;
487 prop_text_in
.foreground
->blue
= 0x0000;
491 prop_text_in
.foreground
->red
= 0xffff;
492 prop_text_in
.foreground
->green
= 0xffff;
493 prop_text_in
.foreground
->blue
= 0xffff;
498 /* Print status of the process : U, WF, WC, E, W, R */
499 if(process_in
->state
->s
== LTTV_STATE_UNNAMED
)
500 prop_text_in
.text
= "U->";
501 else if(process_in
->state
->s
== LTTV_STATE_WAIT_FORK
)
502 prop_text_in
.text
= "WF->";
503 else if(process_in
->state
->s
== LTTV_STATE_WAIT_CPU
)
504 prop_text_in
.text
= "WC->";
505 else if(process_in
->state
->s
== LTTV_STATE_EXIT
)
506 prop_text_in
.text
= "E->";
507 else if(process_in
->state
->s
== LTTV_STATE_WAIT
)
508 prop_text_in
.text
= "W->";
509 else if(process_in
->state
->s
== LTTV_STATE_RUN
)
510 prop_text_in
.text
= "R->";
512 prop_text_in
.text
= "U";
514 draw_text((void*)&prop_text_in
, (void*)draw_context_in
);
515 gdk_gc_unref(draw_context_in
->gc
);
517 /* Draw the line of the in process */
518 if(draw_context_in
->previous
->middle
->x
== -1)
520 draw_context_in
->previous
->middle
->x
= event_request
->x_begin
;
521 g_critical("in middle x_beg : %u",event_request
->x_begin
);
524 draw_context_in
->current
->middle
->x
= x
;
525 draw_context_in
->previous
->middle
->y
= y_in
+ height
/2;
526 draw_context_in
->current
->middle
->y
= y_in
+ height
/2;
527 draw_context_in
->drawable
= control_flow_data
->drawing
->pixmap
;
528 draw_context_in
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
529 //draw_context_in->gc = widget->style->black_gc;
530 draw_context_in
->gc
= gdk_gc_new(control_flow_data
->drawing
->pixmap
);
531 gdk_gc_copy(draw_context_in
->gc
, widget
->style
->black_gc
);
533 PropertiesLine prop_line_in
;
534 prop_line_in
.color
= g_new(GdkColor
,1);
535 prop_line_in
.line_width
= 2;
536 prop_line_in
.style
= GDK_LINE_SOLID
;
537 prop_line_in
.position
= MIDDLE
;
539 /* color of line : status of the process */
540 if(process_in
->state
->s
== LTTV_STATE_UNNAMED
)
542 prop_line_in
.color
->red
= 0xffff;
543 prop_line_in
.color
->green
= 0xffff;
544 prop_line_in
.color
->blue
= 0xffff;
546 else if(process_in
->state
->s
== LTTV_STATE_WAIT_FORK
)
548 prop_line_in
.color
->red
= 0x0fff;
549 prop_line_in
.color
->green
= 0x0000;
550 prop_line_in
.color
->blue
= 0x0fff;
552 else if(process_in
->state
->s
== LTTV_STATE_WAIT_CPU
)
554 prop_line_in
.color
->red
= 0xffff;
555 prop_line_in
.color
->green
= 0xffff;
556 prop_line_in
.color
->blue
= 0x0000;
558 else if(process_in
->state
->s
== LTTV_STATE_EXIT
)
560 prop_line_in
.color
->red
= 0xffff;
561 prop_line_in
.color
->green
= 0x0000;
562 prop_line_in
.color
->blue
= 0xffff;
564 else if(process_in
->state
->s
== LTTV_STATE_WAIT
)
566 prop_line_in
.color
->red
= 0xffff;
567 prop_line_in
.color
->green
= 0x0000;
568 prop_line_in
.color
->blue
= 0x0000;
570 else if(process_in
->state
->s
== LTTV_STATE_RUN
)
572 prop_line_in
.color
->red
= 0x0000;
573 prop_line_in
.color
->green
= 0xffff;
574 prop_line_in
.color
->blue
= 0x0000;
578 prop_line_in
.color
->red
= 0xffff;
579 prop_line_in
.color
->green
= 0xffff;
580 prop_line_in
.color
->blue
= 0xffff;
583 draw_line((void*)&prop_line_in
, (void*)draw_context_in
);
584 g_free(prop_line_in
.color
);
585 gdk_gc_unref(draw_context_in
->gc
);
592 GString
*string
= g_string_new("");;
593 gboolean field_names
= TRUE
, state
= TRUE
;
595 lttv_event_to_string(e
, tfc
->tf
, string
, TRUE
, field_names
, tfs
);
596 g_string_append_printf(string
,"\n");
599 g_string_append_printf(string
, " %s",
600 g_quark_to_string(tfs
->process
->state
->s
));
603 g_info("%s",string
->str
);
605 g_string_free(string
, TRUE
);
607 /* End of text dump */
613 int draw_after_hook(void *hook_data
, void *call_data
)
615 EventRequest
*event_request
= (EventRequest
*)hook_data
;
616 ControlFlowData
*control_flow_data
= event_request
->control_flow_data
;
618 LttvTracefileContext
*tfc
= (LttvTracefileContext
*)call_data
;
620 LttvTracefileState
*tfs
= (LttvTracefileState
*)call_data
;
626 if(strcmp(ltt_eventtype_name(ltt_event_eventtype(e
)),"schedchange") == 0)
628 g_critical("schedchange!");
630 /* Add process to process list (if not present) and get drawing "y" from
631 * process position */
632 guint pid_out
, pid_in
;
633 LttvProcessState
*process_out
, *process_in
;
635 guint y_in
= 0, y_out
= 0, height
= 0, pl_height
= 0;
637 ProcessList
*process_list
=
638 guicontrolflow_get_process_list(event_request
->control_flow_data
);
641 LttField
*f
= ltt_event_field(e
);
643 element
= ltt_field_member(f
,0);
644 pid_out
= ltt_event_get_long_unsigned(e
,element
);
645 element
= ltt_field_member(f
,1);
646 pid_in
= ltt_event_get_long_unsigned(e
,element
);
647 //g_critical("out : %u in : %u", pid_out, pid_in);
650 /* Find process pid_out in the list... */
651 process_out
= lttv_state_find_process(tfs
, pid_out
);
652 //g_critical("out : %s",g_quark_to_string(process_out->state->s));
654 birth
= process_out
->creation_time
;
655 gchar
*name
= strdup(g_quark_to_string(process_out
->name
));
656 HashedProcessData
*hashed_process_data_out
= NULL
;
658 if(processlist_get_process_pixels(process_list
,
663 &hashed_process_data_out
) == 1)
665 /* Process not present */
666 processlist_add(process_list
,
671 &hashed_process_data_out
);
672 processlist_get_process_pixels(process_list
,
677 &hashed_process_data_out
);
678 drawing_insert_square( event_request
->control_flow_data
->drawing
, y_out
, height
);
683 /* Find process pid_in in the list... */
684 process_in
= lttv_state_find_process(tfs
, pid_in
);
685 //g_critical("in : %s",g_quark_to_string(process_in->state->s));
687 birth
= process_in
->creation_time
;
688 name
= strdup(g_quark_to_string(process_in
->name
));
689 HashedProcessData
*hashed_process_data_in
= NULL
;
691 if(processlist_get_process_pixels(process_list
,
696 &hashed_process_data_in
) == 1)
698 /* Process not present */
699 processlist_add(process_list
,
704 &hashed_process_data_in
);
705 processlist_get_process_pixels(process_list
,
710 &hashed_process_data_in
);
712 drawing_insert_square( event_request
->control_flow_data
->drawing
, y_in
, height
);
717 /* Find pixels corresponding to time of the event. If the time does
718 * not fit in the window, show a warning, not supposed to happend. */
720 //guint width = control_flow_data->drawing->drawing_area->allocation.width;
722 //LttTime time = ltt_event_time(e);
724 //LttTime window_end = ltt_time_add(control_flow_data->time_window.time_width,
725 // control_flow_data->time_window.start_time);
728 //convert_time_to_pixels(
729 // control_flow_data->time_window.start_time,
735 //assert(x <= width);
737 /* draw what represents the event for outgoing process. */
739 DrawContext
*draw_context_out
= hashed_process_data_out
->draw_context
;
740 //draw_context_out->current->modify_over->x = x;
741 draw_context_out
->current
->modify_over
->y
= y_out
;
742 draw_context_out
->drawable
= control_flow_data
->drawing
->pixmap
;
743 draw_context_out
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
744 GtkWidget
*widget
= control_flow_data
->drawing
->drawing_area
;
745 //draw_context_out->gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)];
746 draw_context_out
->gc
= widget
->style
->black_gc
;
748 //draw_arc((void*)&prop_arc, (void*)draw_context_out);
749 //test_draw_item(control_flow_data->drawing, control_flow_data->drawing->pixmap);
751 GdkColor colorfg_out
= { 0, 0xffff, 0x0000, 0x0000 };
752 GdkColor colorbg_out
= { 0, 0x0000, 0x0000, 0x0000 };
753 PropertiesText prop_text_out
;
754 prop_text_out
.foreground
= &colorfg_out
;
755 prop_text_out
.background
= &colorbg_out
;
756 prop_text_out
.size
= 6;
757 prop_text_out
.position
= OVER
;
759 /* color of text : status of the process */
760 if(process_out
->state
->s
== LTTV_STATE_UNNAMED
)
762 prop_text_out
.foreground
->red
= 0xffff;
763 prop_text_out
.foreground
->green
= 0xffff;
764 prop_text_out
.foreground
->blue
= 0xffff;
766 else if(process_out
->state
->s
== LTTV_STATE_WAIT_FORK
)
768 prop_text_out
.foreground
->red
= 0x0fff;
769 prop_text_out
.foreground
->green
= 0x0000;
770 prop_text_out
.foreground
->blue
= 0x0fff;
772 else if(process_out
->state
->s
== LTTV_STATE_WAIT_CPU
)
774 prop_text_out
.foreground
->red
= 0xffff;
775 prop_text_out
.foreground
->green
= 0xffff;
776 prop_text_out
.foreground
->blue
= 0x0000;
778 else if(process_out
->state
->s
== LTTV_STATE_EXIT
)
780 prop_text_out
.foreground
->red
= 0xffff;
781 prop_text_out
.foreground
->green
= 0x0000;
782 prop_text_out
.foreground
->blue
= 0xffff;
784 else if(process_out
->state
->s
== LTTV_STATE_WAIT
)
786 prop_text_out
.foreground
->red
= 0xffff;
787 prop_text_out
.foreground
->green
= 0x0000;
788 prop_text_out
.foreground
->blue
= 0x0000;
790 else if(process_out
->state
->s
== LTTV_STATE_RUN
)
792 prop_text_out
.foreground
->red
= 0x0000;
793 prop_text_out
.foreground
->green
= 0xffff;
794 prop_text_out
.foreground
->blue
= 0x0000;
798 prop_text_out
.foreground
->red
= 0xffff;
799 prop_text_out
.foreground
->green
= 0xffff;
800 prop_text_out
.foreground
->blue
= 0xffff;
803 /* Print status of the process : U, WF, WC, E, W, R */
804 if(process_out
->state
->s
== LTTV_STATE_UNNAMED
)
805 prop_text_out
.text
= "U";
806 else if(process_out
->state
->s
== LTTV_STATE_WAIT_FORK
)
807 prop_text_out
.text
= "WF";
808 else if(process_out
->state
->s
== LTTV_STATE_WAIT_CPU
)
809 prop_text_out
.text
= "WC";
810 else if(process_out
->state
->s
== LTTV_STATE_EXIT
)
811 prop_text_out
.text
= "E";
812 else if(process_out
->state
->s
== LTTV_STATE_WAIT
)
813 prop_text_out
.text
= "W";
814 else if(process_out
->state
->s
== LTTV_STATE_RUN
)
815 prop_text_out
.text
= "R";
817 prop_text_out
.text
= "U";
819 draw_text((void*)&prop_text_out
, (void*)draw_context_out
);
821 draw_context_out
->current
->middle
->y
= y_out
+height
/2;
822 draw_context_out
->current
->status
= process_out
->state
->s
;
824 /* for pid_out : remove previous, Prev = current, new current (default) */
825 g_free(draw_context_out
->previous
->modify_under
);
826 g_free(draw_context_out
->previous
->modify_middle
);
827 g_free(draw_context_out
->previous
->modify_over
);
828 g_free(draw_context_out
->previous
->under
);
829 g_free(draw_context_out
->previous
->middle
);
830 g_free(draw_context_out
->previous
->over
);
831 g_free(draw_context_out
->previous
);
833 draw_context_out
->previous
= draw_context_out
->current
;
835 draw_context_out
->current
= g_new(DrawInfo
,1);
836 draw_context_out
->current
->over
= g_new(ItemInfo
,1);
837 draw_context_out
->current
->over
->x
= -1;
838 draw_context_out
->current
->over
->y
= -1;
839 draw_context_out
->current
->middle
= g_new(ItemInfo
,1);
840 draw_context_out
->current
->middle
->x
= -1;
841 draw_context_out
->current
->middle
->y
= -1;
842 draw_context_out
->current
->under
= g_new(ItemInfo
,1);
843 draw_context_out
->current
->under
->x
= -1;
844 draw_context_out
->current
->under
->y
= -1;
845 draw_context_out
->current
->modify_over
= g_new(ItemInfo
,1);
846 draw_context_out
->current
->modify_over
->x
= -1;
847 draw_context_out
->current
->modify_over
->y
= -1;
848 draw_context_out
->current
->modify_middle
= g_new(ItemInfo
,1);
849 draw_context_out
->current
->modify_middle
->x
= -1;
850 draw_context_out
->current
->modify_middle
->y
= -1;
851 draw_context_out
->current
->modify_under
= g_new(ItemInfo
,1);
852 draw_context_out
->current
->modify_under
->x
= -1;
853 draw_context_out
->current
->modify_under
->y
= -1;
854 draw_context_out
->current
->status
= LTTV_STATE_UNNAMED
;
856 /* Finally, update the drawing context of the pid_in. */
858 DrawContext
*draw_context_in
= hashed_process_data_in
->draw_context
;
859 //draw_context_in->current->modify_over->x = x;
860 draw_context_in
->current
->modify_over
->y
= y_in
;
861 draw_context_in
->drawable
= control_flow_data
->drawing
->pixmap
;
862 draw_context_in
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
863 widget
= control_flow_data
->drawing
->drawing_area
;
864 //draw_context_in->gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)];
865 draw_context_in
->gc
= widget
->style
->black_gc
;
867 //draw_arc((void*)&prop_arc, (void*)draw_context_in);
868 //test_draw_item(control_flow_data->drawing, control_flow_data->drawing->pixmap);
870 GdkColor colorfg_in
= { 0, 0x0000, 0xffff, 0x0000 };
871 GdkColor colorbg_in
= { 0, 0x0000, 0x0000, 0x0000 };
872 PropertiesText prop_text_in
;
873 prop_text_in
.foreground
= &colorfg_in
;
874 prop_text_in
.background
= &colorbg_in
;
875 prop_text_in
.size
= 6;
876 prop_text_in
.position
= OVER
;
878 /* foreground of text : status of the process */
879 if(process_in
->state
->s
== LTTV_STATE_UNNAMED
)
881 prop_text_in
.foreground
->red
= 0xffff;
882 prop_text_in
.foreground
->green
= 0xffff;
883 prop_text_in
.foreground
->blue
= 0xffff;
885 else if(process_in
->state
->s
== LTTV_STATE_WAIT_FORK
)
887 prop_text_in
.foreground
->red
= 0x0fff;
888 prop_text_in
.foreground
->green
= 0x0000;
889 prop_text_in
.foreground
->blue
= 0x0fff;
891 else if(process_in
->state
->s
== LTTV_STATE_WAIT_CPU
)
893 prop_text_in
.foreground
->red
= 0xffff;
894 prop_text_in
.foreground
->green
= 0xffff;
895 prop_text_in
.foreground
->blue
= 0x0000;
897 else if(process_in
->state
->s
== LTTV_STATE_EXIT
)
899 prop_text_in
.foreground
->red
= 0xffff;
900 prop_text_in
.foreground
->green
= 0x0000;
901 prop_text_in
.foreground
->blue
= 0xffff;
903 else if(process_in
->state
->s
== LTTV_STATE_WAIT
)
905 prop_text_in
.foreground
->red
= 0xffff;
906 prop_text_in
.foreground
->green
= 0x0000;
907 prop_text_in
.foreground
->blue
= 0x0000;
909 else if(process_in
->state
->s
== LTTV_STATE_RUN
)
911 prop_text_in
.foreground
->red
= 0x0000;
912 prop_text_in
.foreground
->green
= 0xffff;
913 prop_text_in
.foreground
->blue
= 0x0000;
917 prop_text_in
.foreground
->red
= 0xffff;
918 prop_text_in
.foreground
->green
= 0xffff;
919 prop_text_in
.foreground
->blue
= 0xffff;
923 /* Print status of the process : U, WF, WC, E, W, R */
924 if(process_in
->state
->s
== LTTV_STATE_UNNAMED
)
925 prop_text_in
.text
= "U";
926 else if(process_in
->state
->s
== LTTV_STATE_WAIT_FORK
)
927 prop_text_in
.text
= "WF";
928 else if(process_in
->state
->s
== LTTV_STATE_WAIT_CPU
)
929 prop_text_in
.text
= "WC";
930 else if(process_in
->state
->s
== LTTV_STATE_EXIT
)
931 prop_text_in
.text
= "E";
932 else if(process_in
->state
->s
== LTTV_STATE_WAIT
)
933 prop_text_in
.text
= "W";
934 else if(process_in
->state
->s
== LTTV_STATE_RUN
)
935 prop_text_in
.text
= "R";
937 prop_text_in
.text
= "U";
939 draw_text((void*)&prop_text_in
, (void*)draw_context_in
);
941 draw_context_in
->current
->middle
->y
= y_in
+height
/2;
942 draw_context_in
->current
->status
= process_in
->state
->s
;
944 /* for pid_in : remove previous, Prev = current, new current (default) */
945 g_free(draw_context_in
->previous
->modify_under
);
946 g_free(draw_context_in
->previous
->modify_middle
);
947 g_free(draw_context_in
->previous
->modify_over
);
948 g_free(draw_context_in
->previous
->under
);
949 g_free(draw_context_in
->previous
->middle
);
950 g_free(draw_context_in
->previous
->over
);
951 g_free(draw_context_in
->previous
);
953 draw_context_in
->previous
= draw_context_in
->current
;
955 draw_context_in
->current
= g_new(DrawInfo
,1);
956 draw_context_in
->current
->over
= g_new(ItemInfo
,1);
957 draw_context_in
->current
->over
->x
= -1;
958 draw_context_in
->current
->over
->y
= -1;
959 draw_context_in
->current
->middle
= g_new(ItemInfo
,1);
960 draw_context_in
->current
->middle
->x
= -1;
961 draw_context_in
->current
->middle
->y
= -1;
962 draw_context_in
->current
->under
= g_new(ItemInfo
,1);
963 draw_context_in
->current
->under
->x
= -1;
964 draw_context_in
->current
->under
->y
= -1;
965 draw_context_in
->current
->modify_over
= g_new(ItemInfo
,1);
966 draw_context_in
->current
->modify_over
->x
= -1;
967 draw_context_in
->current
->modify_over
->y
= -1;
968 draw_context_in
->current
->modify_middle
= g_new(ItemInfo
,1);
969 draw_context_in
->current
->modify_middle
->x
= -1;
970 draw_context_in
->current
->modify_middle
->y
= -1;
971 draw_context_in
->current
->modify_under
= g_new(ItemInfo
,1);
972 draw_context_in
->current
->modify_under
->x
= -1;
973 draw_context_in
->current
->modify_under
->y
= -1;
974 draw_context_in
->current
->status
= LTTV_STATE_UNNAMED
;
984 gint
update_time_window_hook(void *hook_data
, void *call_data
)
986 ControlFlowData
*control_flow_data
= (ControlFlowData
*) hook_data
;
987 TimeWindow
*old_time_window
=
988 guicontrolflow_get_time_window(control_flow_data
);
989 TimeWindow
*new_time_window
= ((TimeWindow
*)call_data
);
991 /* Two cases : zoom in/out or scrolling */
993 /* In order to make sure we can reuse the old drawing, the scale must
994 * be the same and the new time interval being partly located in the
995 * currently shown time interval. (reuse is only for scrolling)
998 g_info("Old time window HOOK : %u, %u to %u, %u",
999 old_time_window
->start_time
.tv_sec
,
1000 old_time_window
->start_time
.tv_nsec
,
1001 old_time_window
->time_width
.tv_sec
,
1002 old_time_window
->time_width
.tv_nsec
);
1004 g_info("New time window HOOK : %u, %u to %u, %u",
1005 new_time_window
->start_time
.tv_sec
,
1006 new_time_window
->start_time
.tv_nsec
,
1007 new_time_window
->time_width
.tv_sec
,
1008 new_time_window
->time_width
.tv_nsec
);
1010 if( new_time_window
->time_width
.tv_sec
== old_time_window
->time_width
.tv_sec
1011 && new_time_window
->time_width
.tv_nsec
== old_time_window
->time_width
.tv_nsec
)
1013 /* Same scale (scrolling) */
1014 g_info("scrolling");
1015 LttTime
*ns
= &new_time_window
->start_time
;
1016 LttTime
*os
= &old_time_window
->start_time
;
1017 LttTime old_end
= ltt_time_add(old_time_window
->start_time
,
1018 old_time_window
->time_width
);
1019 LttTime new_end
= ltt_time_add(new_time_window
->start_time
,
1020 new_time_window
->time_width
);
1022 //if(ns<os+w && os+w<ns+w)
1023 //if(ns<old_end && os<ns)
1024 if(ltt_time_compare(*ns
, old_end
) == -1
1025 && ltt_time_compare(*os
, *ns
) == -1)
1027 g_info("scrolling near right");
1028 /* Scroll right, keep right part of the screen */
1030 guint width
= control_flow_data
->drawing
->drawing_area
->allocation
.width
;
1031 convert_time_to_pixels(
1038 /* Copy old data to new location */
1039 gdk_draw_drawable (control_flow_data
->drawing
->pixmap
,
1040 control_flow_data
->drawing
->drawing_area
->style
->black_gc
,
1041 control_flow_data
->drawing
->pixmap
,
1046 convert_time_to_pixels(
1053 *old_time_window
= *new_time_window
;
1054 /* Clear the data request background, but not SAFETY */
1055 gdk_draw_rectangle (control_flow_data
->drawing
->pixmap
,
1056 control_flow_data
->drawing
->drawing_area
->style
->black_gc
,
1059 control_flow_data
->drawing
->width
- x
, // do not overlap
1060 control_flow_data
->drawing
->height
+SAFETY
);
1061 /* Get new data for the rest. */
1062 drawing_data_request(control_flow_data
->drawing
,
1063 &control_flow_data
->drawing
->pixmap
,
1065 control_flow_data
->drawing
->width
- x
,
1066 control_flow_data
->drawing
->height
);
1068 drawing_refresh(control_flow_data
->drawing
,
1070 control_flow_data
->drawing
->width
,
1071 control_flow_data
->drawing
->height
);
1076 //if(ns<os && os<ns+w)
1077 //if(ns<os && os<new_end)
1078 if(ltt_time_compare(*ns
,*os
) == -1
1079 && ltt_time_compare(*os
,new_end
) == -1)
1081 g_info("scrolling near left");
1082 /* Scroll left, keep left part of the screen */
1084 guint width
= control_flow_data
->drawing
->drawing_area
->allocation
.width
;
1085 convert_time_to_pixels(
1092 /* Copy old data to new location */
1093 gdk_draw_drawable (control_flow_data
->drawing
->pixmap
,
1094 control_flow_data
->drawing
->drawing_area
->style
->black_gc
,
1095 control_flow_data
->drawing
->pixmap
,
1100 *old_time_window
= *new_time_window
;
1102 /* Clean the data request background */
1103 gdk_draw_rectangle (control_flow_data
->drawing
->pixmap
,
1104 control_flow_data
->drawing
->drawing_area
->style
->black_gc
,
1107 x
, // do not overlap
1108 control_flow_data
->drawing
->height
+SAFETY
);
1109 /* Get new data for the rest. */
1110 drawing_data_request(control_flow_data
->drawing
,
1111 &control_flow_data
->drawing
->pixmap
,
1114 control_flow_data
->drawing
->height
);
1116 drawing_refresh(control_flow_data
->drawing
,
1118 control_flow_data
->drawing
->width
,
1119 control_flow_data
->drawing
->height
);
1122 g_info("scrolling far");
1123 /* Cannot reuse any part of the screen : far jump */
1124 *old_time_window
= *new_time_window
;
1127 gdk_draw_rectangle (control_flow_data
->drawing
->pixmap
,
1128 control_flow_data
->drawing
->drawing_area
->style
->black_gc
,
1131 control_flow_data
->drawing
->width
+SAFETY
, // do not overlap
1132 control_flow_data
->drawing
->height
+SAFETY
);
1134 drawing_data_request(control_flow_data
->drawing
,
1135 &control_flow_data
->drawing
->pixmap
,
1137 control_flow_data
->drawing
->width
,
1138 control_flow_data
->drawing
->height
);
1140 drawing_refresh(control_flow_data
->drawing
,
1142 control_flow_data
->drawing
->width
,
1143 control_flow_data
->drawing
->height
);
1147 /* Different scale (zoom) */
1150 *old_time_window
= *new_time_window
;
1152 gdk_draw_rectangle (control_flow_data
->drawing
->pixmap
,
1153 control_flow_data
->drawing
->drawing_area
->style
->black_gc
,
1156 control_flow_data
->drawing
->width
+SAFETY
, // do not overlap
1157 control_flow_data
->drawing
->height
+SAFETY
);
1160 drawing_data_request(control_flow_data
->drawing
,
1161 &control_flow_data
->drawing
->pixmap
,
1163 control_flow_data
->drawing
->width
,
1164 control_flow_data
->drawing
->height
);
1166 drawing_refresh(control_flow_data
->drawing
,
1168 control_flow_data
->drawing
->width
,
1169 control_flow_data
->drawing
->height
);
1175 gint
update_current_time_hook(void *hook_data
, void *call_data
)
1177 ControlFlowData
*control_flow_data
= (ControlFlowData
*)hook_data
;
1179 LttTime
* current_time
=
1180 guicontrolflow_get_current_time(control_flow_data
);
1181 *current_time
= *((LttTime
*)call_data
);
1183 TimeWindow time_window
;
1185 LttTime time_begin
= control_flow_data
->time_window
.start_time
;
1186 LttTime width
= control_flow_data
->time_window
.time_width
;
1187 LttTime half_width
= ltt_time_div(width
,2.0);
1188 LttTime time_end
= ltt_time_add(time_begin
, width
);
1190 LttvTracesetContext
* tsc
=
1191 get_traceset_context(control_flow_data
->mw
);
1193 LttTime trace_start
= tsc
->Time_Span
->startTime
;
1194 LttTime trace_end
= tsc
->Time_Span
->endTime
;
1196 g_info("New current time HOOK : %u, %u", current_time
->tv_sec
,
1197 current_time
->tv_nsec
);
1201 /* If current time is inside time interval, just move the highlight
1204 /* Else, we have to change the time interval. We have to tell it
1205 * to the main window. */
1206 /* The time interval change will take care of placing the current
1207 * time at the center of the visible area, or nearest possible if we are
1208 * at one end of the trace. */
1211 if(ltt_time_compare(*current_time
, time_begin
) == -1)
1213 if(ltt_time_compare(*current_time
,
1214 ltt_time_add(trace_start
,half_width
)) == -1)
1215 time_begin
= trace_start
;
1217 time_begin
= ltt_time_sub(*current_time
,half_width
);
1219 time_window
.start_time
= time_begin
;
1220 time_window
.time_width
= width
;
1222 set_time_window(control_flow_data
->mw
, &time_window
);
1224 else if(ltt_time_compare(*current_time
, time_end
) == 1)
1226 if(ltt_time_compare(*current_time
, ltt_time_sub(trace_end
, half_width
)) == 1)
1227 time_begin
= ltt_time_sub(trace_end
,width
);
1229 time_begin
= ltt_time_sub(*current_time
,half_width
);
1231 time_window
.start_time
= time_begin
;
1232 time_window
.time_width
= width
;
1234 set_time_window(control_flow_data
->mw
, &time_window
);
1237 gtk_widget_queue_draw(control_flow_data
->drawing
->drawing_area
);
1242 typedef struct _ClosureData
{
1243 EventRequest
*event_request
;
1248 void draw_closure(gpointer key
, gpointer value
, gpointer user_data
)
1250 ProcessInfo
*process_info
= (ProcessInfo
*)key
;
1251 HashedProcessData
*hashed_process_data
= (HashedProcessData
*)value
;
1252 ClosureData
*closure_data
= (ClosureData
*)user_data
;
1254 ControlFlowData
*control_flow_data
=
1255 closure_data
->event_request
->control_flow_data
;
1257 GtkWidget
*widget
= control_flow_data
->drawing
->drawing_area
;
1259 /* Get y position of process */
1262 processlist_get_pixels_from_data( control_flow_data
->process_list
,
1264 hashed_process_data
,
1267 /* Get last state of process */
1268 LttvTraceContext
*tc
=
1269 (LttvTraceContext
*)closure_data
->ts
;
1271 LttvTraceState
*ts
= closure_data
->ts
;
1272 LttvProcessState
*process
;
1274 process
= lttv_state_find_process((LttvTracefileState
*)ts
, process_info
->pid
);
1276 /* Draw the closing line */
1277 DrawContext
*draw_context
= hashed_process_data
->draw_context
;
1278 if(draw_context
->previous
->middle
->x
== -1)
1280 draw_context
->previous
->middle
->x
= closure_data
->event_request
->x_begin
;
1281 g_critical("out middle x_beg : %u",closure_data
->event_request
->x_begin
);
1284 draw_context
->current
->middle
->x
= closure_data
->event_request
->x_end
;
1285 draw_context
->current
->middle
->y
= y
+ height
/2;
1286 draw_context
->previous
->middle
->y
= y
+ height
/2;
1287 draw_context
->drawable
= control_flow_data
->drawing
->pixmap
;
1288 draw_context
->pango_layout
= control_flow_data
->drawing
->pango_layout
;
1289 //draw_context->gc = widget->style->black_gc;
1290 draw_context
->gc
= gdk_gc_new(control_flow_data
->drawing
->pixmap
);
1291 gdk_gc_copy(draw_context
->gc
, widget
->style
->black_gc
);
1293 PropertiesLine prop_line
;
1294 prop_line
.color
= g_new(GdkColor
,1);
1295 prop_line
.line_width
= 2;
1296 prop_line
.style
= GDK_LINE_SOLID
;
1297 prop_line
.position
= MIDDLE
;
1299 /* color of line : status of the process */
1300 if(process
->state
->s
== LTTV_STATE_UNNAMED
)
1302 prop_line
.color
->red
= 0xffff;
1303 prop_line
.color
->green
= 0xffff;
1304 prop_line
.color
->blue
= 0xffff;
1306 else if(process
->state
->s
== LTTV_STATE_WAIT_FORK
)
1308 prop_line
.color
->red
= 0x0fff;
1309 prop_line
.color
->green
= 0x0000;
1310 prop_line
.color
->blue
= 0x0fff;
1312 else if(process
->state
->s
== LTTV_STATE_WAIT_CPU
)
1314 prop_line
.color
->red
= 0xffff;
1315 prop_line
.color
->green
= 0xffff;
1316 prop_line
.color
->blue
= 0x0000;
1318 else if(process
->state
->s
== LTTV_STATE_EXIT
)
1320 prop_line
.color
->red
= 0xffff;
1321 prop_line
.color
->green
= 0x0000;
1322 prop_line
.color
->blue
= 0xffff;
1324 else if(process
->state
->s
== LTTV_STATE_WAIT
)
1326 prop_line
.color
->red
= 0xffff;
1327 prop_line
.color
->green
= 0x0000;
1328 prop_line
.color
->blue
= 0x0000;
1330 else if(process
->state
->s
== LTTV_STATE_RUN
)
1332 prop_line
.color
->red
= 0x0000;
1333 prop_line
.color
->green
= 0xffff;
1334 prop_line
.color
->blue
= 0x0000;
1338 prop_line
.color
->red
= 0xffff;
1339 prop_line
.color
->green
= 0xffff;
1340 prop_line
.color
->blue
= 0xffff;
1343 draw_line((void*)&prop_line
, (void*)draw_context
);
1344 g_free(prop_line
.color
);
1345 gdk_gc_unref(draw_context
->gc
);
1347 /* Reset draw_context of the process for next request */
1349 hashed_process_data
->draw_context
->drawable
= NULL
;
1350 hashed_process_data
->draw_context
->gc
= NULL
;
1351 hashed_process_data
->draw_context
->pango_layout
= NULL
;
1352 hashed_process_data
->draw_context
->current
->over
->x
= -1;
1353 hashed_process_data
->draw_context
->current
->over
->y
= -1;
1354 hashed_process_data
->draw_context
->current
->middle
->x
= -1;
1355 hashed_process_data
->draw_context
->current
->middle
->y
= -1;
1356 hashed_process_data
->draw_context
->current
->under
->x
= -1;
1357 hashed_process_data
->draw_context
->current
->under
->y
= -1;
1358 hashed_process_data
->draw_context
->current
->modify_over
->x
= -1;
1359 hashed_process_data
->draw_context
->current
->modify_over
->y
= -1;
1360 hashed_process_data
->draw_context
->current
->modify_middle
->x
= -1;
1361 hashed_process_data
->draw_context
->current
->modify_middle
->y
= -1;
1362 hashed_process_data
->draw_context
->current
->modify_under
->x
= -1;
1363 hashed_process_data
->draw_context
->current
->modify_under
->y
= -1;
1364 hashed_process_data
->draw_context
->current
->status
= LTTV_STATE_UNNAMED
;
1365 hashed_process_data
->draw_context
->previous
->over
->x
= -1;
1366 hashed_process_data
->draw_context
->previous
->over
->y
= -1;
1367 hashed_process_data
->draw_context
->previous
->middle
->x
= -1;
1368 hashed_process_data
->draw_context
->previous
->middle
->y
= -1;
1369 hashed_process_data
->draw_context
->previous
->under
->x
= -1;
1370 hashed_process_data
->draw_context
->previous
->under
->y
= -1;
1371 hashed_process_data
->draw_context
->previous
->modify_over
->x
= -1;
1372 hashed_process_data
->draw_context
->previous
->modify_over
->y
= -1;
1373 hashed_process_data
->draw_context
->previous
->modify_middle
->x
= -1;
1374 hashed_process_data
->draw_context
->previous
->modify_middle
->y
= -1;
1375 hashed_process_data
->draw_context
->previous
->modify_under
->x
= -1;
1376 hashed_process_data
->draw_context
->previous
->modify_under
->y
= -1;
1377 hashed_process_data
->draw_context
->previous
->status
= LTTV_STATE_UNNAMED
;
1385 * new default prev and current
1387 int after_data_request(void *hook_data
, void *call_data
)
1389 EventRequest
*event_request
= (EventRequest
*)hook_data
;
1390 ControlFlowData
*control_flow_data
= event_request
->control_flow_data
;
1392 ProcessList
*process_list
=
1393 guicontrolflow_get_process_list(event_request
->control_flow_data
);
1395 ClosureData closure_data
;
1396 closure_data
.event_request
= (EventRequest
*)hook_data
;
1397 closure_data
.ts
= (LttvTraceState
*)call_data
;
1399 g_hash_table_foreach(process_list
->process_hash
, draw_closure
,
1400 (void*)&closure_data
);