11 #include <lttv/mainWindow.h>
12 #include <lttv/menu.h>
13 #include <lttv/toolbar.h>
14 #include <lttv/gtkTraceSet.h>
15 #include <lttv/module.h>
16 #include <lttv/gtkdirsel.h>
17 #include <lttv/iattribute.h>
18 #include <lttv/lttvfilter.h>
19 #include <ltt/trace.h>
21 #define PATH_LENGTH 256
22 #define DEFAULT_TIME_WIDTH_S 1
24 extern LttvTrace
*g_init_trace
;
27 /** Array containing instanced objects. */
28 extern GSList
* g_main_window_list
;
30 static int g_win_count
= 0;
32 MainWindow
* get_window_data_struct(GtkWidget
* widget
);
33 char * get_unload_module(char ** loaded_module_name
, int nb_module
);
34 char * get_remove_trace(char ** all_trace_name
, int nb_trace
);
35 char * get_selection(char ** all_name
, int nb
, char *title
, char * column_title
);
36 void get_filter_selection(LttvTracesetSelector
*s
, char *title
, char * column_title
);
37 void * create_tab(MainWindow
* parent
, MainWindow
* current_window
,
38 GtkNotebook
* notebook
, char * label
);
40 void insert_viewer(GtkWidget
* widget
, view_constructor constructor
);
41 void update_filter(LttvTracesetSelector
*s
, GtkTreeStore
*store
);
43 void checkbox_changed(GtkTreeView
*treeview
,
45 GtkTreeViewColumn
*arg2
,
47 void remove_trace_from_traceset_selector(GtkMultiVPaned
* paned
, unsigned i
);
48 void add_trace_into_traceset_selector(GtkMultiVPaned
* paned
, LttTrace
* trace
);
50 LttvTracesetSelector
* construct_traceset_selector(LttvTraceset
* traceset
);
52 void redraw_viewer(MainWindow
* mw_data
, TimeWindow
* time_window
, unsigned nb_events
);
68 LttvTracesetSelector
* construct_traceset_selector(LttvTraceset
* traceset
)
70 LttvTracesetSelector
* s
;
71 LttvTraceSelector
* trace
;
72 LttvTracefileSelector
* tracefile
;
73 int i
, j
, nb_trace
, nb_tracefile
, nb_control
, nb_per_cpu
;
78 s
= lttv_traceset_selector_new(lttv_traceset_name(traceset
));
79 nb_trace
= lttv_traceset_number(traceset
);
80 for(i
=0;i
<nb_trace
;i
++){
81 trace_v
= lttv_traceset_get(traceset
, i
);
82 t
= lttv_trace(trace_v
);
83 trace
= lttv_trace_selector_new(t
);
84 lttv_traceset_selector_add(s
, trace
);
85 nb_control
= ltt_trace_control_tracefile_number(t
);
86 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(t
);
87 nb_tracefile
= nb_control
+ nb_per_cpu
;
89 for(j
= 0 ; j
< nb_tracefile
; j
++) {
91 tf
= ltt_trace_control_tracefile_get(t
, j
);
93 tf
= ltt_trace_per_cpu_tracefile_get(t
, j
- nb_control
);
94 tracefile
= lttv_tracefile_selector_new(tf
);
95 lttv_trace_selector_add(trace
, tracefile
);
102 insert_viewer_wrap(GtkWidget
*menuitem
, gpointer user_data
)
107 GtkWidget
* widget
= menuitem
;
109 new = gdk_cursor_new(GDK_X_CURSOR
);
110 if(GTK_IS_MENU_ITEM(menuitem
)){
111 widget
= lookup_widget(menuitem
, "MToolbar2");
113 win
= gtk_widget_get_parent_window(widget
);
114 gdk_window_set_cursor(win
, new);
115 gdk_cursor_unref(new);
116 gdk_window_stick(win
);
117 gdk_window_unstick(win
);
119 insert_viewer((GtkWidget
*)menuitem
, (view_constructor
)user_data
);
120 // selected_hook(&val);
122 gdk_window_set_cursor(win
, NULL
);
126 /* internal functions */
127 void insert_viewer(GtkWidget
* widget
, view_constructor constructor
)
129 GtkMultiVPaned
* multi_vpaned
;
130 MainWindow
* mw_data
;
132 LttvTracesetSelector
* s
;
134 TimeInterval
* time_interval
;
135 TimeWindow time_window
;
137 mw_data
= get_window_data_struct(widget
);
138 if(!mw_data
->current_tab
) return;
139 multi_vpaned
= mw_data
->current_tab
->multi_vpaned
;
141 s
= construct_traceset_selector(mw_data
->current_tab
->traceset_info
->traceset
);
142 viewer
= (GtkWidget
*)constructor(mw_data
, s
, "Traceset_Selector");
145 gtk_multi_vpaned_widget_add(multi_vpaned
, viewer
);
147 // g_object_unref(G_OBJECT(viewer));
149 size
= (unsigned*)g_object_get_data(G_OBJECT(viewer
), MAX_NUMBER_EVENT
);
150 if(size
== NULL
) *size
= G_MAXULONG
;
152 time_window
= mw_data
->current_tab
->time_window
;
153 time_interval
= (TimeInterval
*)g_object_get_data(G_OBJECT(viewer
), TRACESET_TIME_SPAN
);
155 time_window
.start_time
= time_interval
->startTime
;
156 time_window
.time_width
= ltt_time_sub(time_interval
->endTime
,time_interval
->startTime
);
159 redraw_viewer(mw_data
,&time_window
, *size
);
160 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
164 void get_label_string (GtkWidget
* text
, gchar
* label
)
166 GtkEntry
* entry
= (GtkEntry
*)text
;
167 if(strlen(gtk_entry_get_text(entry
))!=0)
168 strcpy(label
,gtk_entry_get_text(entry
));
171 void get_label(MainWindow
* mw
, gchar
* str
, gchar
* dialogue_title
, gchar
* label_str
)
173 GtkWidget
* dialogue
;
178 dialogue
= gtk_dialog_new_with_buttons(dialogue_title
,NULL
,
180 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
181 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
184 label
= gtk_label_new(label_str
);
185 gtk_widget_show(label
);
187 text
= gtk_entry_new();
188 gtk_widget_show(text
);
190 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), label
,TRUE
, TRUE
,0);
191 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), text
,FALSE
, FALSE
,0);
193 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
195 case GTK_RESPONSE_ACCEPT
:
196 get_label_string(text
,str
);
197 gtk_widget_destroy(dialogue
);
199 case GTK_RESPONSE_REJECT
:
201 gtk_widget_destroy(dialogue
);
206 MainWindow
* get_window_data_struct(GtkWidget
* widget
)
209 MainWindow
* mw_data
;
211 mw
= lookup_widget(widget
, "MWindow");
213 g_printf("Main window does not exist\n");
217 mw_data
= (MainWindow
*) g_object_get_data(G_OBJECT(mw
),"mainWindow");
219 g_printf("Main window data does not exist\n");
225 void create_new_window(GtkWidget
* widget
, gpointer user_data
, gboolean clone
)
227 MainWindow
* parent
= get_window_data_struct(widget
);
230 g_printf("Clone : use the same traceset\n");
231 construct_main_window(parent
, NULL
);
233 g_printf("Empty : traceset is set to NULL\n");
234 construct_main_window(NULL
, parent
->win_creation_data
);
238 void move_up_viewer(GtkWidget
* widget
, gpointer user_data
)
240 MainWindow
* mw
= get_window_data_struct(widget
);
241 if(!mw
->current_tab
) return;
242 gtk_multi_vpaned_widget_move_up(mw
->current_tab
->multi_vpaned
);
245 void move_down_viewer(GtkWidget
* widget
, gpointer user_data
)
247 MainWindow
* mw
= get_window_data_struct(widget
);
248 if(!mw
->current_tab
) return;
249 gtk_multi_vpaned_widget_move_down(mw
->current_tab
->multi_vpaned
);
252 void delete_viewer(GtkWidget
* widget
, gpointer user_data
)
254 MainWindow
* mw
= get_window_data_struct(widget
);
255 if(!mw
->current_tab
) return;
256 gtk_multi_vpaned_widget_delete(mw
->current_tab
->multi_vpaned
);
259 void open_traceset(GtkWidget
* widget
, gpointer user_data
)
263 LttvTraceset
* traceset
;
264 MainWindow
* mw_data
= get_window_data_struct(widget
);
265 GtkFileSelection
* file_selector
=
266 (GtkFileSelection
*)gtk_file_selection_new("Select a traceset");
268 gtk_file_selection_hide_fileop_buttons(file_selector
);
270 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
272 case GTK_RESPONSE_ACCEPT
:
273 case GTK_RESPONSE_OK
:
274 dir
= gtk_file_selection_get_selections (file_selector
);
275 traceset
= lttv_traceset_load(dir
[0]);
276 g_printf("Open a trace set %s\n", dir
[0]);
279 case GTK_RESPONSE_REJECT
:
280 case GTK_RESPONSE_CANCEL
:
282 gtk_widget_destroy((GtkWidget
*)file_selector
);
288 void redraw_viewer(MainWindow
* mw_data
, TimeWindow
* time_window
, unsigned nb_events
)
290 //update time window of each viewer, let viewer insert hooks needed by process_traceset
291 set_time_window(mw_data
, time_window
);
293 process_traceset_api(mw_data
, time_window
->start_time
,
294 ltt_time_add(time_window
->start_time
,time_window
->time_width
),
297 //call hooks to show each viewer and let them remove hooks
298 show_viewer(mw_data
);
301 void add_trace_into_traceset_selector(GtkMultiVPaned
* paned
, LttTrace
* t
)
303 int j
, nb_tracefile
, nb_control
, nb_per_cpu
;
304 LttvTracesetSelector
* s
;
305 LttvTraceSelector
* trace
;
306 LttvTracefileSelector
* tracefile
;
310 w
= gtk_multi_vpaned_get_first_widget(paned
);
312 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
314 trace
= lttv_trace_selector_new(t
);
315 lttv_traceset_selector_add(s
, trace
);
316 nb_control
= ltt_trace_control_tracefile_number(t
);
317 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(t
);
318 nb_tracefile
= nb_control
+ nb_per_cpu
;
320 for(j
= 0 ; j
< nb_tracefile
; j
++) {
322 tf
= ltt_trace_control_tracefile_get(t
, j
);
324 tf
= ltt_trace_per_cpu_tracefile_get(t
, j
- nb_control
);
325 tracefile
= lttv_tracefile_selector_new(tf
);
326 lttv_trace_selector_add(trace
, tracefile
);
329 w
= gtk_multi_vpaned_get_next_widget(paned
);
333 void add_trace(GtkWidget
* widget
, gpointer user_data
)
337 LttvTraceset
* traceset
;
340 MainWindow
* mw_data
= get_window_data_struct(widget
);
341 GtkDirSelection
* file_selector
= (GtkDirSelection
*)gtk_dir_selection_new("Select a trace");
342 gtk_dir_selection_hide_fileop_buttons(file_selector
);
344 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
346 case GTK_RESPONSE_ACCEPT
:
347 case GTK_RESPONSE_OK
:
348 dir
= gtk_dir_selection_get_dir (file_selector
);
349 trace
= ltt_trace_open(dir
);
350 if(trace
== NULL
) g_critical("cannot open trace %s", dir
);
351 trace_v
= lttv_trace_new(trace
);
352 traceset
= mw_data
->current_tab
->traceset_info
->traceset
;
353 if(mw_data
->current_tab
->traceset_info
->traceset_context
!= NULL
){
354 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
355 traceset_info
->traceset_context
));
356 g_object_unref(mw_data
->current_tab
->traceset_info
->traceset_context
);
358 lttv_traceset_add(traceset
, trace_v
);
359 mw_data
->current_tab
->traceset_info
->traceset_context
=
360 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
362 LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->traceset_info
->
363 traceset_context
),traceset
);
364 add_trace_into_traceset_selector(mw_data
->current_tab
->multi_vpaned
, trace
);
366 gtk_widget_destroy((GtkWidget
*)file_selector
);
369 redraw_viewer(mw_data
, &(mw_data
->current_tab
->time_window
), G_MAXULONG
);
370 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
372 case GTK_RESPONSE_REJECT
:
373 case GTK_RESPONSE_CANCEL
:
375 gtk_widget_destroy((GtkWidget
*)file_selector
);
380 void remove_trace_from_traceset_selector(GtkMultiVPaned
* paned
, unsigned i
)
382 LttvTracesetSelector
* s
;
383 LttvTraceSelector
* t
;
386 w
= gtk_multi_vpaned_get_first_widget(paned
);
388 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
389 t
= lttv_traceset_selector_get(s
,i
);
390 lttv_traceset_selector_remove(s
, i
);
391 lttv_trace_selector_destroy(t
);
392 w
= gtk_multi_vpaned_get_next_widget(paned
);
396 void remove_trace(GtkWidget
* widget
, gpointer user_data
)
400 LttvTraceset
* traceset
;
402 char ** name
, *remove_trace_name
;
403 MainWindow
* mw_data
= get_window_data_struct(widget
);
404 LttvTracesetSelector
* s
;
405 LttvTraceSelector
* t
;
409 nb_trace
=lttv_traceset_number(mw_data
->current_tab
->traceset_info
->traceset
);
410 name
= g_new(char*,nb_trace
);
411 for(i
= 0; i
< nb_trace
; i
++){
412 trace_v
= lttv_traceset_get(mw_data
->current_tab
->
413 traceset_info
->traceset
, i
);
414 trace
= lttv_trace(trace_v
);
415 name
[i
] = ltt_trace_name(trace
);
418 remove_trace_name
= get_remove_trace(name
, nb_trace
);
420 if(remove_trace_name
){
421 for(i
=0; i
<nb_trace
; i
++){
422 if(strcmp(remove_trace_name
,name
[i
]) == 0){
423 //unselect the trace from the current viewer
424 w
= gtk_multi_vpaned_get_widget(mw_data
->current_tab
->multi_vpaned
);
425 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
426 t
= lttv_traceset_selector_get(s
,i
);
427 lttv_trace_selector_set_selected(t
, FALSE
);
429 //check if other viewers select the trace
430 w
= gtk_multi_vpaned_get_first_widget(mw_data
->current_tab
->multi_vpaned
);
432 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
433 t
= lttv_traceset_selector_get(s
,i
);
434 selected
= lttv_trace_selector_get_selected(t
);
436 w
= gtk_multi_vpaned_get_next_widget(mw_data
->current_tab
->multi_vpaned
);
439 //if no viewer selects the trace, remove it
441 remove_trace_from_traceset_selector(mw_data
->current_tab
->multi_vpaned
, i
);
443 traceset
= mw_data
->current_tab
->traceset_info
->traceset
;
444 trace_v
= lttv_traceset_get(traceset
, i
);
445 if(lttv_trace_get_ref_number(trace_v
) <= 1)
446 ltt_trace_close(lttv_trace(trace_v
));
448 if(mw_data
->current_tab
->traceset_info
->traceset_context
!= NULL
){
449 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
450 traceset_info
->traceset_context
));
451 g_object_unref(mw_data
->current_tab
->traceset_info
->traceset_context
);
453 lttv_traceset_remove(traceset
, i
);
454 lttv_trace_destroy(trace_v
);
455 mw_data
->current_tab
->traceset_info
->traceset_context
=
456 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
458 LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
459 traceset_info
->traceset_context
),traceset
);
461 redraw_viewer(mw_data
, &(mw_data
->current_tab
->time_window
), G_MAXULONG
);
462 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
472 void save(GtkWidget
* widget
, gpointer user_data
)
477 void save_as(GtkWidget
* widget
, gpointer user_data
)
479 g_printf("Save as\n");
482 void zoom(GtkWidget
* widget
, double size
)
484 TimeInterval
*time_span
;
485 TimeWindow time_window
;
486 LttTime current_time
, time_delta
, time_s
, time_e
;
487 MainWindow
* mw_data
= get_window_data_struct(widget
);
489 time_span
= LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
490 traceset_info
->traceset_context
)->Time_Span
;
491 time_window
= mw_data
->current_tab
->time_window
;
492 current_time
= mw_data
->current_tab
->current_time
;
494 time_delta
= ltt_time_sub(time_span
->endTime
,time_span
->startTime
);
496 time_window
.start_time
= time_span
->startTime
;
497 time_window
.time_width
= time_delta
;
499 time_window
.time_width
= ltt_time_div(time_window
.time_width
, size
);
500 if(ltt_time_compare(time_window
.time_width
,time_delta
) > 0)
501 time_window
.time_width
= time_delta
;
503 time_s
= ltt_time_sub(current_time
,ltt_time_div(time_window
.time_width
, 2));
504 time_e
= ltt_time_add(current_time
,ltt_time_div(time_window
.time_width
, 2));
505 if(ltt_time_compare(time_span
->startTime
, time_s
) > 0){
506 time_s
= time_span
->startTime
;
507 }else if(ltt_time_compare(time_span
->endTime
, time_e
) < 0){
508 time_e
= time_span
->endTime
;
509 time_s
= ltt_time_sub(time_e
,time_window
.time_width
);
511 time_window
.start_time
= time_s
;
513 redraw_viewer(mw_data
, &time_window
, G_MAXULONG
);
514 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
515 gtk_multi_vpaned_set_adjust(mw_data
->current_tab
->multi_vpaned
, FALSE
);
518 void zoom_in(GtkWidget
* widget
, gpointer user_data
)
523 void zoom_out(GtkWidget
* widget
, gpointer user_data
)
528 void zoom_extended(GtkWidget
* widget
, gpointer user_data
)
533 void go_to_time(GtkWidget
* widget
, gpointer user_data
)
535 g_printf("Go to time\n");
538 void show_time_frame(GtkWidget
* widget
, gpointer user_data
)
540 g_printf("Show time frame\n");
544 /* callback function */
547 on_empty_traceset_activate (GtkMenuItem
*menuitem
,
550 create_new_window((GtkWidget
*)menuitem
, user_data
, FALSE
);
555 on_clone_traceset_activate (GtkMenuItem
*menuitem
,
558 create_new_window((GtkWidget
*)menuitem
, user_data
, TRUE
);
563 on_tab_activate (GtkMenuItem
*menuitem
,
566 gchar label
[PATH_LENGTH
];
567 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
568 GtkNotebook
* notebook
= (GtkNotebook
*)lookup_widget((GtkWidget
*)menuitem
, "MNotebook");
569 if(notebook
== NULL
){
570 g_printf("Notebook does not exist\n");
574 strcpy(label
,"Page");
575 get_label(mw_data
, label
,"Get the name of the tab","Please input tab's name");
577 create_tab (mw_data
, mw_data
, notebook
, label
);
582 on_open_activate (GtkMenuItem
*menuitem
,
585 open_traceset((GtkWidget
*)menuitem
, user_data
);
590 on_close_activate (GtkMenuItem
*menuitem
,
593 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
594 main_window_destructor(mw_data
);
599 on_close_tab_activate (GtkMenuItem
*menuitem
,
603 GtkWidget
* notebook
;
605 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
606 notebook
= lookup_widget((GtkWidget
*)menuitem
, "MNotebook");
607 if(notebook
== NULL
){
608 g_printf("Notebook does not exist\n");
612 if(mw_data
->tab
== mw_data
->current_tab
){
613 // tmp = mw_data->current_tb;
614 // mw_data->tab = mw_data->current_tab->next;
615 g_printf("The default TAB can not be deleted\n");
619 while(tmp
!= mw_data
->current_tab
){
625 gtk_notebook_remove_page((GtkNotebook
*)notebook
, count
);
630 on_add_trace_activate (GtkMenuItem
*menuitem
,
633 add_trace((GtkWidget
*)menuitem
, user_data
);
638 on_remove_trace_activate (GtkMenuItem
*menuitem
,
641 remove_trace((GtkWidget
*)menuitem
, user_data
);
646 on_save_activate (GtkMenuItem
*menuitem
,
649 save((GtkWidget
*)menuitem
, user_data
);
654 on_save_as_activate (GtkMenuItem
*menuitem
,
657 save_as((GtkWidget
*)menuitem
, user_data
);
662 on_quit_activate (GtkMenuItem
*menuitem
,
670 on_cut_activate (GtkMenuItem
*menuitem
,
678 on_copy_activate (GtkMenuItem
*menuitem
,
686 on_paste_activate (GtkMenuItem
*menuitem
,
694 on_delete_activate (GtkMenuItem
*menuitem
,
697 g_printf("Delete\n");
702 on_zoom_in_activate (GtkMenuItem
*menuitem
,
705 zoom_in((GtkWidget
*)menuitem
, user_data
);
710 on_zoom_out_activate (GtkMenuItem
*menuitem
,
713 zoom_out((GtkWidget
*)menuitem
, user_data
);
718 on_zoom_extended_activate (GtkMenuItem
*menuitem
,
721 zoom_extended((GtkWidget
*)menuitem
, user_data
);
726 on_go_to_time_activate (GtkMenuItem
*menuitem
,
729 go_to_time((GtkWidget
*)menuitem
, user_data
);
734 on_show_time_frame_activate (GtkMenuItem
*menuitem
,
737 show_time_frame((GtkWidget
*)menuitem
, user_data
);
742 on_move_viewer_up_activate (GtkMenuItem
*menuitem
,
745 move_up_viewer((GtkWidget
*)menuitem
, user_data
);
750 on_move_viewer_down_activate (GtkMenuItem
*menuitem
,
753 move_down_viewer((GtkWidget
*)menuitem
, user_data
);
758 on_remove_viewer_activate (GtkMenuItem
*menuitem
,
761 delete_viewer((GtkWidget
*)menuitem
, user_data
);
765 on_trace_filter_activate (GtkMenuItem
*menuitem
,
768 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
769 LttvTracesetSelector
* s
;
770 GtkWidget
* w
= gtk_multi_vpaned_get_widget(mw_data
->current_tab
->multi_vpaned
);
772 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
774 g_printf("There is no viewer yet\n");
777 get_filter_selection(s
, "Configure trace and tracefile filter", "Select traces and tracefiles");
781 on_trace_facility_activate (GtkMenuItem
*menuitem
,
784 g_printf("Trace facility selector: %s\n");
788 on_load_module_activate (GtkMenuItem
*menuitem
,
793 char str
[PATH_LENGTH
], *str1
;
794 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
795 GtkFileSelection
* file_selector
= (GtkFileSelection
*)gtk_file_selection_new("Select a module");
796 gtk_file_selection_hide_fileop_buttons(file_selector
);
799 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
801 case GTK_RESPONSE_ACCEPT
:
802 case GTK_RESPONSE_OK
:
803 dir
= gtk_file_selection_get_selections (file_selector
);
805 str1
= strrchr(str
,'/');
808 str1
= strrchr(str
,'\\');
811 if(mw_data
->win_creation_data
)
812 lttv_module_load(str1
, mw_data
->win_creation_data
->argc
,mw_data
->win_creation_data
->argv
);
814 lttv_module_load(str1
, 0,NULL
);
815 g_slist_foreach(g_main_window_list
, insert_menu_toolbar_item
, NULL
);
817 case GTK_RESPONSE_REJECT
:
818 case GTK_RESPONSE_CANCEL
:
820 gtk_widget_destroy((GtkWidget
*)file_selector
);
823 g_printf("Load module: %s\n", str
);
828 on_unload_module_activate (GtkMenuItem
*menuitem
,
832 char **name
, *unload_module_name
;
834 LttvModule
** modules
, *module
;
835 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
837 modules
= lttv_module_list(&nb
);
838 name
= g_new(char*, nb
);
841 name
[i
] = lttv_module_name(module
);
844 unload_module_name
=get_unload_module(name
,nb
);
846 if(unload_module_name
){
848 if(strcmp(unload_module_name
, name
[i
]) == 0){
849 lttv_module_unload(modules
[i
]);
860 on_add_module_search_path_activate (GtkMenuItem
*menuitem
,
863 GtkDirSelection
* file_selector
= (GtkDirSelection
*)gtk_dir_selection_new("Select module path");
867 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
869 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
871 case GTK_RESPONSE_ACCEPT
:
872 case GTK_RESPONSE_OK
:
873 dir
= gtk_dir_selection_get_dir (file_selector
);
874 lttv_module_path_add(dir
);
875 case GTK_RESPONSE_REJECT
:
876 case GTK_RESPONSE_CANCEL
:
878 gtk_widget_destroy((GtkWidget
*)file_selector
);
885 on_color_activate (GtkMenuItem
*menuitem
,
893 on_filter_activate (GtkMenuItem
*menuitem
,
896 g_printf("Filter\n");
901 on_save_configuration_activate (GtkMenuItem
*menuitem
,
904 g_printf("Save configuration\n");
909 on_content_activate (GtkMenuItem
*menuitem
,
912 g_printf("Content\n");
917 on_about_activate (GtkMenuItem
*menuitem
,
920 g_printf("About...\n");
925 on_button_new_clicked (GtkButton
*button
,
928 create_new_window((GtkWidget
*)button
, user_data
, FALSE
);
933 on_button_open_clicked (GtkButton
*button
,
936 open_traceset((GtkWidget
*)button
, user_data
);
941 on_button_add_trace_clicked (GtkButton
*button
,
944 add_trace((GtkWidget
*)button
, user_data
);
949 on_button_remove_trace_clicked (GtkButton
*button
,
952 remove_trace((GtkWidget
*)button
, user_data
);
957 on_button_save_clicked (GtkButton
*button
,
960 save((GtkWidget
*)button
, user_data
);
965 on_button_save_as_clicked (GtkButton
*button
,
968 save_as((GtkWidget
*)button
, user_data
);
973 on_button_zoom_in_clicked (GtkButton
*button
,
976 zoom_in((GtkWidget
*)button
, user_data
);
981 on_button_zoom_out_clicked (GtkButton
*button
,
984 zoom_out((GtkWidget
*)button
, user_data
);
989 on_button_zoom_extended_clicked (GtkButton
*button
,
992 zoom_extended((GtkWidget
*)button
, user_data
);
997 on_button_go_to_time_clicked (GtkButton
*button
,
1000 go_to_time((GtkWidget
*)button
, user_data
);
1005 on_button_show_time_frame_clicked (GtkButton
*button
,
1008 show_time_frame((GtkWidget
*)button
, user_data
);
1013 on_button_move_up_clicked (GtkButton
*button
,
1016 move_up_viewer((GtkWidget
*)button
, user_data
);
1021 on_button_move_down_clicked (GtkButton
*button
,
1024 move_down_viewer((GtkWidget
*)button
, user_data
);
1029 on_button_delete_viewer_clicked (GtkButton
*button
,
1032 delete_viewer((GtkWidget
*)button
, user_data
);
1036 on_MWindow_destroy (GtkObject
*object
,
1039 MainWindow
*Main_Window
= (MainWindow
*)user_data
;
1041 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list
));
1044 if(g_win_count
== 0)
1050 on_MNotebook_switch_page (GtkNotebook
*notebook
,
1051 GtkNotebookPage
*page
,
1055 MainWindow
* mw
= get_window_data_struct((GtkWidget
*)notebook
);
1056 Tab
* tab
= mw
->tab
;
1062 mw
->current_tab
= tab
;
1065 void checkbox_changed(GtkTreeView
*treeview
,
1067 GtkTreeViewColumn
*arg2
,
1070 GtkTreeStore
* store
= (GtkTreeStore
*)gtk_tree_view_get_model (treeview
);
1074 if (gtk_tree_model_get_iter ((GtkTreeModel
*)store
, &iter
, arg1
)){
1075 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, CHECKBOX_COLUMN
, &value
, -1);
1076 value
= value
? FALSE
: TRUE
;
1077 gtk_tree_store_set (GTK_TREE_STORE (store
), &iter
, CHECKBOX_COLUMN
, value
, -1);
1082 void update_filter(LttvTracesetSelector
*s
, GtkTreeStore
*store
)
1084 GtkTreeIter iter
, child_iter
;
1086 LttvTraceSelector
* trace
;
1087 LttvTracefileSelector
* tracefile
;
1088 gboolean value
, value1
;
1090 if(gtk_tree_model_get_iter_first((GtkTreeModel
*)store
, &iter
)){
1093 trace
= lttv_traceset_selector_get(s
, i
);
1094 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, CHECKBOX_COLUMN
, &value
,-1);
1097 if(gtk_tree_model_iter_children ((GtkTreeModel
*)store
, &child_iter
, &iter
)){
1099 tracefile
= lttv_trace_selector_get(trace
, j
);
1100 gtk_tree_model_get ((GtkTreeModel
*)store
, &child_iter
, CHECKBOX_COLUMN
, &value1
,-1);
1101 lttv_tracefile_selector_set_selected(tracefile
,value1
);
1103 }while(gtk_tree_model_iter_next((GtkTreeModel
*)store
, &child_iter
));
1106 lttv_trace_selector_set_selected(trace
,value
);
1108 }while(gtk_tree_model_iter_next((GtkTreeModel
*)store
, &iter
));
1112 void get_filter_selection(LttvTracesetSelector
*s
,char *title
, char * column_title
)
1114 GtkWidget
* dialogue
;
1115 GtkTreeStore
* store
;
1117 GtkWidget
* scroll_win
;
1118 GtkCellRenderer
* renderer
;
1119 GtkTreeViewColumn
* column
;
1120 GtkTreeIter iter
, child_iter
;
1121 int i
, j
, id
, nb_trace
, nb_tracefile
;
1122 LttvTraceSelector
* trace
;
1123 LttvTracefileSelector
* tracefile
;
1127 dialogue
= gtk_dialog_new_with_buttons(title
,
1130 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
1131 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
1133 gtk_window_set_default_size((GtkWindow
*)dialogue
, 300, 100);
1135 store
= gtk_tree_store_new (TOTAL_COLUMNS
, G_TYPE_BOOLEAN
, G_TYPE_STRING
);
1136 tree
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (store
));
1137 g_object_unref (G_OBJECT (store
));
1138 g_signal_connect (G_OBJECT (tree
), "row-activated",
1139 G_CALLBACK (checkbox_changed
),
1143 renderer
= gtk_cell_renderer_toggle_new ();
1144 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle
*)renderer
, FALSE
);
1146 g_object_set (G_OBJECT (renderer
),"activatable", TRUE
, NULL
);
1148 column
= gtk_tree_view_column_new_with_attributes ("Checkbox",
1150 "active", CHECKBOX_COLUMN
,
1152 gtk_tree_view_column_set_alignment (column
, 0.5);
1153 gtk_tree_view_column_set_fixed_width (column
, 20);
1154 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1156 renderer
= gtk_cell_renderer_text_new ();
1157 column
= gtk_tree_view_column_new_with_attributes (column_title
,
1159 "text", NAME_COLUMN
,
1161 gtk_tree_view_column_set_alignment (column
, 0.0);
1162 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1163 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree
), FALSE
);
1165 scroll_win
= gtk_scrolled_window_new (NULL
, NULL
);
1166 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win
),
1167 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
1168 gtk_container_add (GTK_CONTAINER (scroll_win
), tree
);
1170 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), scroll_win
,TRUE
, TRUE
,0);
1172 gtk_widget_show(scroll_win
);
1173 gtk_widget_show(tree
);
1175 nb_trace
= lttv_traceset_selector_number(s
);
1176 for(i
=0;i
<nb_trace
;i
++){
1177 trace
= lttv_traceset_selector_get(s
, i
);
1178 name
= lttv_trace_selector_get_name(trace
);
1179 gtk_tree_store_append (store
, &iter
, NULL
);
1180 checked
= lttv_trace_selector_get_selected(trace
);
1181 gtk_tree_store_set (store
, &iter
,
1182 CHECKBOX_COLUMN
,checked
,
1185 nb_tracefile
= lttv_trace_selector_number(trace
);
1186 for(j
=0;j
<nb_tracefile
;j
++){
1187 tracefile
= lttv_trace_selector_get(trace
, j
);
1188 name
= lttv_tracefile_selector_get_name(tracefile
);
1189 gtk_tree_store_append (store
, &child_iter
, &iter
);
1190 checked
= lttv_tracefile_selector_get_selected(tracefile
);
1191 gtk_tree_store_set (store
, &child_iter
,
1192 CHECKBOX_COLUMN
, checked
,
1198 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
1200 case GTK_RESPONSE_ACCEPT
:
1201 case GTK_RESPONSE_OK
:
1202 update_filter(s
, store
);
1203 case GTK_RESPONSE_REJECT
:
1204 case GTK_RESPONSE_CANCEL
:
1206 gtk_widget_destroy(dialogue
);
1211 char * get_remove_trace(char ** all_trace_name
, int nb_trace
)
1213 return get_selection(all_trace_name
, nb_trace
,
1214 "Select a trace", "Trace pathname");
1216 char * get_unload_module(char ** loaded_module_name
, int nb_module
)
1218 return get_selection(loaded_module_name
, nb_module
,
1219 "Select an unload module", "Module pathname");
1222 char * get_selection(char ** loaded_module_name
, int nb_module
,
1223 char *title
, char * column_title
)
1225 GtkWidget
* dialogue
;
1226 GtkWidget
* scroll_win
;
1228 GtkListStore
* store
;
1229 GtkTreeViewColumn
* column
;
1230 GtkCellRenderer
* renderer
;
1231 GtkTreeSelection
* select
;
1234 char * unload_module_name
= NULL
;
1236 dialogue
= gtk_dialog_new_with_buttons(title
,
1239 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
1240 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
1242 gtk_window_set_default_size((GtkWindow
*)dialogue
, 500, 200);
1244 scroll_win
= gtk_scrolled_window_new (NULL
, NULL
);
1245 gtk_widget_show ( scroll_win
);
1246 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win
),
1247 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1249 store
= gtk_list_store_new (N_COLUMNS
,G_TYPE_STRING
);
1250 tree
= gtk_tree_view_new_with_model(GTK_TREE_MODEL (store
));
1251 gtk_widget_show ( tree
);
1252 g_object_unref (G_OBJECT (store
));
1254 renderer
= gtk_cell_renderer_text_new ();
1255 column
= gtk_tree_view_column_new_with_attributes (column_title
,
1257 "text", MODULE_COLUMN
,
1259 gtk_tree_view_column_set_alignment (column
, 0.5);
1260 gtk_tree_view_column_set_fixed_width (column
, 150);
1261 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1263 select
= gtk_tree_view_get_selection (GTK_TREE_VIEW (tree
));
1264 gtk_tree_selection_set_mode (select
, GTK_SELECTION_SINGLE
);
1266 gtk_container_add (GTK_CONTAINER (scroll_win
), tree
);
1268 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), scroll_win
,TRUE
, TRUE
,0);
1270 for(i
=0;i
<nb_module
;i
++){
1271 gtk_list_store_append (store
, &iter
);
1272 gtk_list_store_set (store
, &iter
, MODULE_COLUMN
,loaded_module_name
[i
],-1);
1275 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
1277 case GTK_RESPONSE_ACCEPT
:
1278 case GTK_RESPONSE_OK
:
1279 if (gtk_tree_selection_get_selected (select
, (GtkTreeModel
**)&store
, &iter
)){
1280 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, MODULE_COLUMN
, &unload_module_name
, -1);
1282 case GTK_RESPONSE_REJECT
:
1283 case GTK_RESPONSE_CANCEL
:
1285 gtk_widget_destroy(dialogue
);
1289 return unload_module_name
;
1292 void main_window_destroy_hash_key(gpointer key
)
1297 void main_window_destroy_hash_data(gpointer data
)
1302 void insert_menu_toolbar_item(MainWindow
* mw
, gpointer user_data
)
1306 view_constructor constructor
;
1308 LttvToolbars
* toolbar
;
1309 lttv_menu_closure
*menu_item
;
1310 lttv_toolbar_closure
*toolbar_item
;
1311 LttvAttributeValue value
;
1312 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1313 GtkWidget
* tool_menu_title_menu
, *insert_view
, *pixmap
, *tmp
;
1315 g_assert(lttv_iattribute_find_by_path(attributes
,
1316 "viewers/menu", LTTV_POINTER
, &value
));
1317 menu
= (LttvMenus
*)*(value
.v_pointer
);
1320 for(i
=0;i
<menu
->len
;i
++){
1321 menu_item
= &g_array_index(menu
, lttv_menu_closure
, i
);
1322 tmp
= g_hash_table_lookup(mw
->hash_menu_item
, g_strdup(menu_item
->menuText
));
1324 constructor
= menu_item
->con
;
1325 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"ToolMenuTitle_menu");
1326 insert_view
= gtk_menu_item_new_with_mnemonic (menu_item
->menuText
);
1327 gtk_widget_show (insert_view
);
1328 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1329 g_signal_connect ((gpointer
) insert_view
, "activate",
1330 G_CALLBACK (insert_viewer_wrap
),
1332 g_hash_table_insert(mw
->hash_menu_item
, g_strdup(menu_item
->menuText
),
1337 g_assert(lttv_iattribute_find_by_path(attributes
,
1338 "viewers/toolbar", LTTV_POINTER
, &value
));
1339 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
1342 for(i
=0;i
<toolbar
->len
;i
++){
1343 toolbar_item
= &g_array_index(toolbar
, lttv_toolbar_closure
, i
);
1344 tmp
= g_hash_table_lookup(mw
->hash_toolbar_item
, g_strdup(toolbar_item
->tooltip
));
1346 constructor
= toolbar_item
->con
;
1347 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"MToolbar2");
1348 pixbuf
= gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item
->pixmap
);
1349 pixmap
= gtk_image_new_from_pixbuf(pixbuf
);
1350 insert_view
= gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu
),
1351 GTK_TOOLBAR_CHILD_BUTTON
,
1354 toolbar_item
->tooltip
, NULL
,
1355 pixmap
, NULL
, NULL
);
1356 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild
*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu
)->children
)->data
))->label
), TRUE
);
1357 gtk_widget_show (insert_view
);
1358 gtk_container_set_border_width (GTK_CONTAINER (insert_view
), 1);
1359 g_signal_connect ((gpointer
) insert_view
, "clicked",G_CALLBACK (insert_viewer_wrap
),constructor
);
1360 g_hash_table_insert(mw
->hash_toolbar_item
, g_strdup(toolbar_item
->tooltip
),
1366 void construct_main_window(MainWindow
* parent
, WindowCreationData
* win_creation_data
)
1368 g_critical("construct_main_window()");
1369 GtkWidget
* new_window
; /* New generated main window */
1370 MainWindow
* new_m_window
;/* New main window structure */
1371 GtkNotebook
* notebook
;
1372 LttvIAttribute
*attributes
=
1373 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1374 LttvAttributeValue value
;
1376 new_m_window
= g_new(MainWindow
, 1);
1378 // Add the object's information to the module's array
1379 g_main_window_list
= g_slist_append(g_main_window_list
, new_m_window
);
1382 new_window
= create_MWindow();
1383 gtk_widget_show (new_window
);
1385 new_m_window
->attributes
= attributes
;
1387 new_m_window
->mwindow
= new_window
;
1388 new_m_window
->tab
= NULL
;
1389 new_m_window
->current_tab
= NULL
;
1390 new_m_window
->attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1392 new_m_window
->win_creation_data
= parent
->win_creation_data
;
1394 new_m_window
->win_creation_data
= win_creation_data
;
1397 new_m_window
->hash_menu_item
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
1398 main_window_destroy_hash_key
,
1399 main_window_destroy_hash_data
);
1400 new_m_window
->hash_toolbar_item
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
1401 main_window_destroy_hash_key
,
1402 main_window_destroy_hash_data
);
1404 insert_menu_toolbar_item(new_m_window
, NULL
);
1406 g_object_set_data(G_OBJECT(new_window
), "mainWindow", (gpointer
)new_m_window
);
1408 //create a default tab
1409 notebook
= (GtkNotebook
*)lookup_widget(new_m_window
->mwindow
, "MNotebook");
1410 if(notebook
== NULL
){
1411 g_printf("Notebook does not exist\n");
1414 //for now there is no name field in LttvTraceset structure
1415 //Use "Traceset" as the label for the default tab
1416 create_tab(NULL
, new_m_window
, notebook
,"Traceset");
1418 g_object_set_data_full(
1419 G_OBJECT(new_m_window
->mwindow
),
1422 (GDestroyNotify
)main_window_free
);
1427 void tab_destructor(Tab
* tab_instance
)
1429 int i
, nb
, ref_count
;
1432 if(tab_instance
->attributes
)
1433 g_object_unref(tab_instance
->attributes
);
1435 if(tab_instance
->mw
->tab
== tab_instance
){
1436 tab_instance
->mw
->tab
= tab_instance
->next
;
1438 Tab
* tmp1
, *tmp
= tab_instance
->mw
->tab
;
1439 while(tmp
!= tab_instance
){
1443 tmp1
->next
= tab_instance
->next
;
1446 if(tab_instance
->traceset_info
->traceset_context
!= NULL
){
1447 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance
->traceset_info
->
1449 g_object_unref(tab_instance
->traceset_info
->traceset_context
);
1451 if(tab_instance
->traceset_info
->traceset
!= NULL
) {
1452 nb
= lttv_traceset_number(tab_instance
->traceset_info
->traceset
);
1453 for(i
= 0 ; i
< nb
; i
++) {
1454 trace
= lttv_traceset_get(tab_instance
->traceset_info
->traceset
, i
);
1455 ref_count
= lttv_trace_get_ref_number(trace
);
1457 ltt_trace_close(lttv_trace(trace
));
1459 lttv_trace_destroy(trace
);
1462 lttv_traceset_destroy(tab_instance
->traceset_info
->traceset
);
1463 g_free(tab_instance
->traceset_info
);
1464 g_free(tab_instance
);
1467 void * create_tab(MainWindow
* parent
, MainWindow
* current_window
,
1468 GtkNotebook
* notebook
, char * label
)
1472 MainWindow
* mw_data
= current_window
;
1475 tmp_tab
= mw_data
->tab
;
1476 while(tmp_tab
&& tmp_tab
->next
) tmp_tab
= tmp_tab
->next
;
1478 mw_data
->current_tab
= NULL
;
1479 tmp_tab
= g_new(Tab
,1);
1480 mw_data
->tab
= tmp_tab
;
1482 tmp_tab
->next
= g_new(Tab
,1);
1483 tmp_tab
= tmp_tab
->next
;
1486 tmp_tab
->traceset_info
= g_new(TracesetInfo
,1);
1488 tmp_tab
->traceset_info
->traceset
=
1489 lttv_traceset_copy(parent
->current_tab
->traceset_info
->traceset
);
1491 if(mw_data
->current_tab
){
1492 tmp_tab
->traceset_info
->traceset
=
1493 lttv_traceset_copy(mw_data
->current_tab
->traceset_info
->traceset
);
1495 tmp_tab
->traceset_info
->traceset
= lttv_traceset_new();
1496 /* Add the command line trace */
1497 if(g_init_trace
!= NULL
)
1498 lttv_traceset_add(tmp_tab
->traceset_info
->traceset
, g_init_trace
);
1501 //FIXME copy not implemented in lower level
1502 tmp_tab
->traceset_info
->traceset_context
=
1503 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
1505 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
),
1506 tmp_tab
->traceset_info
->traceset
);
1508 if(mw_data
->current_tab
){
1509 // Will have to read directly at the main window level, as we want
1510 // to be able to modify a traceset on the fly.
1511 tmp_tab
->time_window
= mw_data
->current_tab
->time_window
;
1512 tmp_tab
->current_time
= mw_data
->current_tab
->current_time
;
1514 // Will have to read directly at the main window level, as we want
1515 // to be able to modify a traceset on the fly.
1516 // get_traceset_time_span(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
1517 tmp_tab
->time_window
.start_time
=
1518 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->startTime
;
1519 if(DEFAULT_TIME_WIDTH_S
<
1520 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->endTime
.tv_sec
)
1521 tmp_time
.tv_sec
= DEFAULT_TIME_WIDTH_S
;
1524 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->endTime
.tv_sec
;
1525 tmp_time
.tv_nsec
= 0;
1526 tmp_tab
->time_window
.time_width
= tmp_time
;
1527 tmp_tab
->current_time
.tv_sec
= tmp_time
.tv_sec
/ 2;
1528 tmp_tab
->current_time
.tv_nsec
= 0 ;
1530 tmp_tab
->attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1531 // mw_data->current_tab = tmp_tab;
1532 tmp_tab
->multi_vpaned
= (GtkMultiVPaned
*)gtk_multi_vpaned_new();
1533 tmp_tab
->multi_vpaned
->mw
= mw_data
;
1534 gtk_widget_show((GtkWidget
*)tmp_tab
->multi_vpaned
);
1535 tmp_tab
->next
= NULL
;
1536 tmp_tab
->mw
= mw_data
;
1538 tmp_tab
->label
= gtk_label_new (label
);
1539 gtk_widget_show (tmp_tab
->label
);
1541 g_object_set_data_full(
1542 G_OBJECT(tmp_tab
->multi_vpaned
),
1545 (GDestroyNotify
)tab_destructor
);
1547 gtk_notebook_append_page(notebook
, (GtkWidget
*)tmp_tab
->multi_vpaned
, tmp_tab
->label
);
1548 list
= gtk_container_get_children(GTK_CONTAINER(notebook
));
1549 gtk_notebook_set_current_page(notebook
,g_list_length(list
)-1);
1552 void remove_menu_item(gpointer main_win
, gpointer user_data
)
1554 MainWindow
* mw
= (MainWindow
*) main_win
;
1555 lttv_menu_closure
*menu_item
= (lttv_menu_closure
*)user_data
;
1556 GtkWidget
* tool_menu_title_menu
, *insert_view
;
1558 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"ToolMenuTitle_menu");
1559 insert_view
= (GtkWidget
*)g_hash_table_lookup(mw
->hash_menu_item
,
1560 menu_item
->menuText
);
1562 g_hash_table_remove(mw
->hash_menu_item
, menu_item
->menuText
);
1563 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1567 void remove_toolbar_item(gpointer main_win
, gpointer user_data
)
1569 MainWindow
* mw
= (MainWindow
*) main_win
;
1570 lttv_toolbar_closure
*toolbar_item
= (lttv_toolbar_closure
*)user_data
;
1571 GtkWidget
* tool_menu_title_menu
, *insert_view
;
1574 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"MToolbar2");
1575 insert_view
= (GtkWidget
*)g_hash_table_lookup(mw
->hash_toolbar_item
,
1576 toolbar_item
->tooltip
);
1578 g_hash_table_remove(mw
->hash_toolbar_item
, toolbar_item
->tooltip
);
1579 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1584 * Remove menu and toolbar item when a module unloaded
1587 void main_window_remove_menu_item(lttv_constructor constructor
)
1591 lttv_menu_closure
*menu_item
;
1592 LttvAttributeValue value
;
1593 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1595 g_assert(lttv_iattribute_find_by_path(attributes
,
1596 "viewers/menu", LTTV_POINTER
, &value
));
1597 menu
= (LttvMenus
*)*(value
.v_pointer
);
1600 for(i
=0;i
<menu
->len
;i
++){
1601 menu_item
= &g_array_index(menu
, lttv_menu_closure
, i
);
1602 if(menu_item
->con
!= constructor
) continue;
1603 if(g_main_window_list
){
1604 g_slist_foreach(g_main_window_list
, remove_menu_item
, menu_item
);
1612 void main_window_remove_toolbar_item(lttv_constructor constructor
)
1615 LttvToolbars
* toolbar
;
1616 lttv_toolbar_closure
*toolbar_item
;
1617 LttvAttributeValue value
;
1618 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1620 g_assert(lttv_iattribute_find_by_path(attributes
,
1621 "viewers/toolbar", LTTV_POINTER
, &value
));
1622 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
1625 for(i
=0;i
<toolbar
->len
;i
++){
1626 toolbar_item
= &g_array_index(toolbar
, lttv_toolbar_closure
, i
);
1627 if(toolbar_item
->con
!= constructor
) continue;
1628 if(g_main_window_list
){
1629 g_slist_foreach(g_main_window_list
, remove_toolbar_item
, toolbar_item
);