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 gboolean
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
);
53 unsigned get_max_event_number(MainWindow
* mw_data
);
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
)
106 insert_viewer((GtkWidget
*)menuitem
, (view_constructor
)user_data
);
107 // selected_hook(&val);
111 /* internal functions */
112 void insert_viewer(GtkWidget
* widget
, view_constructor constructor
)
114 GtkMultiVPaned
* multi_vpaned
;
115 MainWindow
* mw_data
;
117 LttvTracesetSelector
* s
;
118 TimeInterval
* time_interval
;
119 TimeWindow time_window
;
121 mw_data
= get_window_data_struct(widget
);
122 if(!mw_data
->current_tab
) return;
123 multi_vpaned
= mw_data
->current_tab
->multi_vpaned
;
125 s
= construct_traceset_selector(mw_data
->current_tab
->traceset_info
->traceset
);
126 viewer
= (GtkWidget
*)constructor(mw_data
, s
, "Traceset_Selector");
129 gtk_multi_vpaned_widget_add(multi_vpaned
, viewer
);
131 // g_object_unref(G_OBJECT(viewer));
133 time_window
= mw_data
->current_tab
->time_window
;
134 time_interval
= (TimeInterval
*)g_object_get_data(G_OBJECT(viewer
), TRACESET_TIME_SPAN
);
136 time_window
.start_time
= time_interval
->startTime
;
137 time_window
.time_width
= ltt_time_sub(time_interval
->endTime
,time_interval
->startTime
);
140 redraw_viewer(mw_data
,&time_window
);
141 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
145 void get_label_string (GtkWidget
* text
, gchar
* label
)
147 GtkEntry
* entry
= (GtkEntry
*)text
;
148 if(strlen(gtk_entry_get_text(entry
))!=0)
149 strcpy(label
,gtk_entry_get_text(entry
));
152 void get_label(MainWindow
* mw
, gchar
* str
, gchar
* dialogue_title
, gchar
* label_str
)
154 GtkWidget
* dialogue
;
159 dialogue
= gtk_dialog_new_with_buttons(dialogue_title
,NULL
,
161 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
162 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
165 label
= gtk_label_new(label_str
);
166 gtk_widget_show(label
);
168 text
= gtk_entry_new();
169 gtk_widget_show(text
);
171 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), label
,TRUE
, TRUE
,0);
172 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), text
,FALSE
, FALSE
,0);
174 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
176 case GTK_RESPONSE_ACCEPT
:
177 get_label_string(text
,str
);
178 gtk_widget_destroy(dialogue
);
180 case GTK_RESPONSE_REJECT
:
182 gtk_widget_destroy(dialogue
);
187 MainWindow
* get_window_data_struct(GtkWidget
* widget
)
190 MainWindow
* mw_data
;
192 mw
= lookup_widget(widget
, "MWindow");
194 g_printf("Main window does not exist\n");
198 mw_data
= (MainWindow
*) g_object_get_data(G_OBJECT(mw
),"mainWindow");
200 g_printf("Main window data does not exist\n");
206 void create_new_window(GtkWidget
* widget
, gpointer user_data
, gboolean clone
)
208 MainWindow
* parent
= get_window_data_struct(widget
);
211 g_printf("Clone : use the same traceset\n");
212 construct_main_window(parent
, NULL
);
214 g_printf("Empty : traceset is set to NULL\n");
215 construct_main_window(NULL
, parent
->win_creation_data
);
219 void move_up_viewer(GtkWidget
* widget
, gpointer user_data
)
221 MainWindow
* mw
= get_window_data_struct(widget
);
222 if(!mw
->current_tab
) return;
223 gtk_multi_vpaned_widget_move_up(mw
->current_tab
->multi_vpaned
);
226 void move_down_viewer(GtkWidget
* widget
, gpointer user_data
)
228 MainWindow
* mw
= get_window_data_struct(widget
);
229 if(!mw
->current_tab
) return;
230 gtk_multi_vpaned_widget_move_down(mw
->current_tab
->multi_vpaned
);
233 void delete_viewer(GtkWidget
* widget
, gpointer user_data
)
235 MainWindow
* mw
= get_window_data_struct(widget
);
236 if(!mw
->current_tab
) return;
237 gtk_multi_vpaned_widget_delete(mw
->current_tab
->multi_vpaned
);
240 void open_traceset(GtkWidget
* widget
, gpointer user_data
)
244 LttvTraceset
* traceset
;
245 MainWindow
* mw_data
= get_window_data_struct(widget
);
246 GtkFileSelection
* file_selector
=
247 (GtkFileSelection
*)gtk_file_selection_new("Select a traceset");
249 gtk_file_selection_hide_fileop_buttons(file_selector
);
251 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
253 case GTK_RESPONSE_ACCEPT
:
254 case GTK_RESPONSE_OK
:
255 dir
= gtk_file_selection_get_selections (file_selector
);
256 traceset
= lttv_traceset_load(dir
[0]);
257 g_printf("Open a trace set %s\n", dir
[0]);
260 case GTK_RESPONSE_REJECT
:
261 case GTK_RESPONSE_CANCEL
:
263 gtk_widget_destroy((GtkWidget
*)file_selector
);
269 unsigned get_max_event_number(MainWindow
* mw_data
)
271 unsigned nb
= 0, *size
;
274 w
= gtk_multi_vpaned_get_first_widget(mw_data
->current_tab
->multi_vpaned
);
276 size
= (unsigned*)g_object_get_data(G_OBJECT(w
), MAX_NUMBER_EVENT
);
284 w
= gtk_multi_vpaned_get_next_widget(mw_data
->current_tab
->multi_vpaned
);
289 void redraw_viewer(MainWindow
* mw_data
, TimeWindow
* time_window
)
291 unsigned max_nb_events
;
296 new = gdk_cursor_new(GDK_X_CURSOR
);
297 widget
= lookup_widget(mw_data
->mwindow
, "MToolbar2");
298 win
= gtk_widget_get_parent_window(widget
);
299 gdk_window_set_cursor(win
, new);
300 gdk_cursor_unref(new);
301 gdk_window_stick(win
);
302 gdk_window_unstick(win
);
304 //update time window of each viewer, let viewer insert hooks needed by process_traceset
305 set_time_window(mw_data
, time_window
);
307 max_nb_events
= get_max_event_number(mw_data
);
309 process_traceset_api(mw_data
, time_window
->start_time
,
310 ltt_time_add(time_window
->start_time
,time_window
->time_width
),
313 //call hooks to show each viewer and let them remove hooks
314 show_viewer(mw_data
);
316 gdk_window_set_cursor(win
, NULL
);
319 void add_trace_into_traceset_selector(GtkMultiVPaned
* paned
, LttTrace
* t
)
321 int j
, nb_tracefile
, nb_control
, nb_per_cpu
;
322 LttvTracesetSelector
* s
;
323 LttvTraceSelector
* trace
;
324 LttvTracefileSelector
* tracefile
;
328 w
= gtk_multi_vpaned_get_first_widget(paned
);
330 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
332 trace
= lttv_trace_selector_new(t
);
333 lttv_traceset_selector_add(s
, trace
);
334 nb_control
= ltt_trace_control_tracefile_number(t
);
335 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(t
);
336 nb_tracefile
= nb_control
+ nb_per_cpu
;
338 for(j
= 0 ; j
< nb_tracefile
; j
++) {
340 tf
= ltt_trace_control_tracefile_get(t
, j
);
342 tf
= ltt_trace_per_cpu_tracefile_get(t
, j
- nb_control
);
343 tracefile
= lttv_tracefile_selector_new(tf
);
344 lttv_trace_selector_add(trace
, tracefile
);
347 w
= gtk_multi_vpaned_get_next_widget(paned
);
351 void add_trace(GtkWidget
* widget
, gpointer user_data
)
355 LttvTraceset
* traceset
;
358 MainWindow
* mw_data
= get_window_data_struct(widget
);
359 GtkDirSelection
* file_selector
= (GtkDirSelection
*)gtk_dir_selection_new("Select a trace");
360 gtk_dir_selection_hide_fileop_buttons(file_selector
);
362 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
364 case GTK_RESPONSE_ACCEPT
:
365 case GTK_RESPONSE_OK
:
366 dir
= gtk_dir_selection_get_dir (file_selector
);
367 trace
= ltt_trace_open(dir
);
368 if(trace
== NULL
) g_critical("cannot open trace %s", dir
);
369 trace_v
= lttv_trace_new(trace
);
370 traceset
= mw_data
->current_tab
->traceset_info
->traceset
;
371 if(mw_data
->current_tab
->traceset_info
->traceset_context
!= NULL
){
372 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
373 traceset_info
->traceset_context
));
374 g_object_unref(mw_data
->current_tab
->traceset_info
->traceset_context
);
376 lttv_traceset_add(traceset
, trace_v
);
377 mw_data
->current_tab
->traceset_info
->traceset_context
=
378 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
380 LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->traceset_info
->
381 traceset_context
),traceset
);
382 add_trace_into_traceset_selector(mw_data
->current_tab
->multi_vpaned
, trace
);
384 gtk_widget_destroy((GtkWidget
*)file_selector
);
387 update_traceset(mw_data
);
388 redraw_viewer(mw_data
, &(mw_data
->current_tab
->time_window
));
389 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
391 case GTK_RESPONSE_REJECT
:
392 case GTK_RESPONSE_CANCEL
:
394 gtk_widget_destroy((GtkWidget
*)file_selector
);
399 void remove_trace_from_traceset_selector(GtkMultiVPaned
* paned
, unsigned i
)
401 LttvTracesetSelector
* s
;
402 LttvTraceSelector
* t
;
405 w
= gtk_multi_vpaned_get_first_widget(paned
);
407 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
408 t
= lttv_traceset_selector_get(s
,i
);
409 lttv_traceset_selector_remove(s
, i
);
410 lttv_trace_selector_destroy(t
);
411 w
= gtk_multi_vpaned_get_next_widget(paned
);
415 void remove_trace(GtkWidget
* widget
, gpointer user_data
)
419 LttvTraceset
* traceset
;
421 char ** name
, *remove_trace_name
;
422 MainWindow
* mw_data
= get_window_data_struct(widget
);
423 LttvTracesetSelector
* s
;
424 LttvTraceSelector
* t
;
428 nb_trace
=lttv_traceset_number(mw_data
->current_tab
->traceset_info
->traceset
);
429 name
= g_new(char*,nb_trace
);
430 for(i
= 0; i
< nb_trace
; i
++){
431 trace_v
= lttv_traceset_get(mw_data
->current_tab
->
432 traceset_info
->traceset
, i
);
433 trace
= lttv_trace(trace_v
);
434 name
[i
] = ltt_trace_name(trace
);
437 remove_trace_name
= get_remove_trace(name
, nb_trace
);
439 if(remove_trace_name
){
440 for(i
=0; i
<nb_trace
; i
++){
441 if(strcmp(remove_trace_name
,name
[i
]) == 0){
442 //unselect the trace from the current viewer
443 w
= gtk_multi_vpaned_get_widget(mw_data
->current_tab
->multi_vpaned
);
444 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
445 t
= lttv_traceset_selector_get(s
,i
);
446 lttv_trace_selector_set_selected(t
, FALSE
);
448 //check if other viewers select the trace
449 w
= gtk_multi_vpaned_get_first_widget(mw_data
->current_tab
->multi_vpaned
);
451 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
452 t
= lttv_traceset_selector_get(s
,i
);
453 selected
= lttv_trace_selector_get_selected(t
);
455 w
= gtk_multi_vpaned_get_next_widget(mw_data
->current_tab
->multi_vpaned
);
458 //if no viewer selects the trace, remove it
460 remove_trace_from_traceset_selector(mw_data
->current_tab
->multi_vpaned
, i
);
462 traceset
= mw_data
->current_tab
->traceset_info
->traceset
;
463 trace_v
= lttv_traceset_get(traceset
, i
);
464 if(lttv_trace_get_ref_number(trace_v
) <= 1)
465 ltt_trace_close(lttv_trace(trace_v
));
467 if(mw_data
->current_tab
->traceset_info
->traceset_context
!= NULL
){
468 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
469 traceset_info
->traceset_context
));
470 g_object_unref(mw_data
->current_tab
->traceset_info
->traceset_context
);
472 lttv_traceset_remove(traceset
, i
);
473 lttv_trace_destroy(trace_v
);
474 mw_data
->current_tab
->traceset_info
->traceset_context
=
475 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
477 LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
478 traceset_info
->traceset_context
),traceset
);
480 update_traceset(mw_data
);
481 redraw_viewer(mw_data
, &(mw_data
->current_tab
->time_window
));
482 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
492 void save(GtkWidget
* widget
, gpointer user_data
)
497 void save_as(GtkWidget
* widget
, gpointer user_data
)
499 g_printf("Save as\n");
502 void zoom(GtkWidget
* widget
, double size
)
504 TimeInterval
*time_span
;
505 TimeWindow time_window
;
506 LttTime current_time
, time_delta
, time_s
, time_e
, time_t;
507 MainWindow
* mw_data
= get_window_data_struct(widget
);
509 time_span
= LTTV_TRACESET_CONTEXT(mw_data
->current_tab
->
510 traceset_info
->traceset_context
)->Time_Span
;
511 time_window
= mw_data
->current_tab
->time_window
;
512 current_time
= mw_data
->current_tab
->current_time
;
514 time_delta
= ltt_time_sub(time_span
->endTime
,time_span
->startTime
);
516 time_window
.start_time
= time_span
->startTime
;
517 time_window
.time_width
= time_delta
;
519 time_window
.time_width
= ltt_time_div(time_window
.time_width
, size
);
520 if(ltt_time_compare(time_window
.time_width
,time_delta
) > 0)
521 time_window
.time_width
= time_delta
;
523 time_t = ltt_time_div(time_window
.time_width
, 2);
524 if(ltt_time_compare(current_time
, time_t) < 0){
525 time_s
= time_span
->startTime
;
527 time_s
= ltt_time_sub(current_time
,time_t);
529 time_e
= ltt_time_add(current_time
,time_t);
530 if(ltt_time_compare(time_span
->startTime
, time_s
) > 0){
531 time_s
= time_span
->startTime
;
532 }else if(ltt_time_compare(time_span
->endTime
, time_e
) < 0){
533 time_e
= time_span
->endTime
;
534 time_s
= ltt_time_sub(time_e
,time_window
.time_width
);
536 time_window
.start_time
= time_s
;
538 redraw_viewer(mw_data
, &time_window
);
539 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
540 gtk_multi_vpaned_set_adjust(mw_data
->current_tab
->multi_vpaned
, FALSE
);
543 void zoom_in(GtkWidget
* widget
, gpointer user_data
)
548 void zoom_out(GtkWidget
* widget
, gpointer user_data
)
553 void zoom_extended(GtkWidget
* widget
, gpointer user_data
)
558 void go_to_time(GtkWidget
* widget
, gpointer user_data
)
560 g_printf("Go to time\n");
563 void show_time_frame(GtkWidget
* widget
, gpointer user_data
)
565 g_printf("Show time frame\n");
569 /* callback function */
572 on_empty_traceset_activate (GtkMenuItem
*menuitem
,
575 create_new_window((GtkWidget
*)menuitem
, user_data
, FALSE
);
580 on_clone_traceset_activate (GtkMenuItem
*menuitem
,
583 create_new_window((GtkWidget
*)menuitem
, user_data
, TRUE
);
588 on_tab_activate (GtkMenuItem
*menuitem
,
591 gchar label
[PATH_LENGTH
];
592 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
593 GtkNotebook
* notebook
= (GtkNotebook
*)lookup_widget((GtkWidget
*)menuitem
, "MNotebook");
594 if(notebook
== NULL
){
595 g_printf("Notebook does not exist\n");
599 strcpy(label
,"Page");
600 get_label(mw_data
, label
,"Get the name of the tab","Please input tab's name");
602 create_tab (mw_data
, mw_data
, notebook
, label
);
607 on_open_activate (GtkMenuItem
*menuitem
,
610 open_traceset((GtkWidget
*)menuitem
, user_data
);
615 on_close_activate (GtkMenuItem
*menuitem
,
618 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
619 main_window_destructor(mw_data
);
624 on_close_tab_activate (GtkMenuItem
*menuitem
,
628 GtkWidget
* notebook
;
630 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
631 notebook
= lookup_widget((GtkWidget
*)menuitem
, "MNotebook");
632 if(notebook
== NULL
){
633 g_printf("Notebook does not exist\n");
637 if(mw_data
->tab
== mw_data
->current_tab
){
638 // tmp = mw_data->current_tb;
639 // mw_data->tab = mw_data->current_tab->next;
640 g_printf("The default TAB can not be deleted\n");
644 while(tmp
!= mw_data
->current_tab
){
650 gtk_notebook_remove_page((GtkNotebook
*)notebook
, count
);
655 on_add_trace_activate (GtkMenuItem
*menuitem
,
658 add_trace((GtkWidget
*)menuitem
, user_data
);
663 on_remove_trace_activate (GtkMenuItem
*menuitem
,
666 remove_trace((GtkWidget
*)menuitem
, user_data
);
671 on_save_activate (GtkMenuItem
*menuitem
,
674 save((GtkWidget
*)menuitem
, user_data
);
679 on_save_as_activate (GtkMenuItem
*menuitem
,
682 save_as((GtkWidget
*)menuitem
, user_data
);
687 on_quit_activate (GtkMenuItem
*menuitem
,
695 on_cut_activate (GtkMenuItem
*menuitem
,
703 on_copy_activate (GtkMenuItem
*menuitem
,
711 on_paste_activate (GtkMenuItem
*menuitem
,
719 on_delete_activate (GtkMenuItem
*menuitem
,
722 g_printf("Delete\n");
727 on_zoom_in_activate (GtkMenuItem
*menuitem
,
730 zoom_in((GtkWidget
*)menuitem
, user_data
);
735 on_zoom_out_activate (GtkMenuItem
*menuitem
,
738 zoom_out((GtkWidget
*)menuitem
, user_data
);
743 on_zoom_extended_activate (GtkMenuItem
*menuitem
,
746 zoom_extended((GtkWidget
*)menuitem
, user_data
);
751 on_go_to_time_activate (GtkMenuItem
*menuitem
,
754 go_to_time((GtkWidget
*)menuitem
, user_data
);
759 on_show_time_frame_activate (GtkMenuItem
*menuitem
,
762 show_time_frame((GtkWidget
*)menuitem
, user_data
);
767 on_move_viewer_up_activate (GtkMenuItem
*menuitem
,
770 move_up_viewer((GtkWidget
*)menuitem
, user_data
);
775 on_move_viewer_down_activate (GtkMenuItem
*menuitem
,
778 move_down_viewer((GtkWidget
*)menuitem
, user_data
);
783 on_remove_viewer_activate (GtkMenuItem
*menuitem
,
786 delete_viewer((GtkWidget
*)menuitem
, user_data
);
790 on_trace_filter_activate (GtkMenuItem
*menuitem
,
793 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
794 LttvTracesetSelector
* s
;
795 GtkWidget
* w
= gtk_multi_vpaned_get_widget(mw_data
->current_tab
->multi_vpaned
);
797 s
= g_object_get_data(G_OBJECT(w
), "Traceset_Selector");
799 g_printf("There is no viewer yet\n");
802 if(get_filter_selection(s
, "Configure trace and tracefile filter", "Select traces and tracefiles")){
803 update_traceset(mw_data
);
804 redraw_viewer(mw_data
, &(mw_data
->current_tab
->time_window
));
805 set_current_time(mw_data
,&(mw_data
->current_tab
->current_time
));
810 on_trace_facility_activate (GtkMenuItem
*menuitem
,
813 g_printf("Trace facility selector: %s\n");
817 on_load_module_activate (GtkMenuItem
*menuitem
,
822 char str
[PATH_LENGTH
], *str1
;
823 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
824 GtkFileSelection
* file_selector
= (GtkFileSelection
*)gtk_file_selection_new("Select a module");
825 gtk_file_selection_hide_fileop_buttons(file_selector
);
828 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
830 case GTK_RESPONSE_ACCEPT
:
831 case GTK_RESPONSE_OK
:
832 dir
= gtk_file_selection_get_selections (file_selector
);
834 str1
= strrchr(str
,'/');
837 str1
= strrchr(str
,'\\');
840 if(mw_data
->win_creation_data
)
841 lttv_module_load(str1
, mw_data
->win_creation_data
->argc
,mw_data
->win_creation_data
->argv
);
843 lttv_module_load(str1
, 0,NULL
);
844 g_slist_foreach(g_main_window_list
, insert_menu_toolbar_item
, NULL
);
846 case GTK_RESPONSE_REJECT
:
847 case GTK_RESPONSE_CANCEL
:
849 gtk_widget_destroy((GtkWidget
*)file_selector
);
852 g_printf("Load module: %s\n", str
);
857 on_unload_module_activate (GtkMenuItem
*menuitem
,
861 char **name
, *unload_module_name
;
863 LttvModule
** modules
, *module
;
864 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
866 modules
= lttv_module_list(&nb
);
867 name
= g_new(char*, nb
);
870 name
[i
] = lttv_module_name(module
);
873 unload_module_name
=get_unload_module(name
,nb
);
875 if(unload_module_name
){
877 if(strcmp(unload_module_name
, name
[i
]) == 0){
878 lttv_module_unload(modules
[i
]);
889 on_add_module_search_path_activate (GtkMenuItem
*menuitem
,
892 GtkDirSelection
* file_selector
= (GtkDirSelection
*)gtk_dir_selection_new("Select module path");
896 MainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
898 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
900 case GTK_RESPONSE_ACCEPT
:
901 case GTK_RESPONSE_OK
:
902 dir
= gtk_dir_selection_get_dir (file_selector
);
903 lttv_module_path_add(dir
);
904 case GTK_RESPONSE_REJECT
:
905 case GTK_RESPONSE_CANCEL
:
907 gtk_widget_destroy((GtkWidget
*)file_selector
);
914 on_color_activate (GtkMenuItem
*menuitem
,
922 on_filter_activate (GtkMenuItem
*menuitem
,
925 g_printf("Filter\n");
930 on_save_configuration_activate (GtkMenuItem
*menuitem
,
933 g_printf("Save configuration\n");
938 on_content_activate (GtkMenuItem
*menuitem
,
941 g_printf("Content\n");
946 on_about_activate (GtkMenuItem
*menuitem
,
949 g_printf("About...\n");
954 on_button_new_clicked (GtkButton
*button
,
957 create_new_window((GtkWidget
*)button
, user_data
, FALSE
);
962 on_button_open_clicked (GtkButton
*button
,
965 open_traceset((GtkWidget
*)button
, user_data
);
970 on_button_add_trace_clicked (GtkButton
*button
,
973 add_trace((GtkWidget
*)button
, user_data
);
978 on_button_remove_trace_clicked (GtkButton
*button
,
981 remove_trace((GtkWidget
*)button
, user_data
);
986 on_button_save_clicked (GtkButton
*button
,
989 save((GtkWidget
*)button
, user_data
);
994 on_button_save_as_clicked (GtkButton
*button
,
997 save_as((GtkWidget
*)button
, user_data
);
1002 on_button_zoom_in_clicked (GtkButton
*button
,
1005 zoom_in((GtkWidget
*)button
, user_data
);
1010 on_button_zoom_out_clicked (GtkButton
*button
,
1013 zoom_out((GtkWidget
*)button
, user_data
);
1018 on_button_zoom_extended_clicked (GtkButton
*button
,
1021 zoom_extended((GtkWidget
*)button
, user_data
);
1026 on_button_go_to_time_clicked (GtkButton
*button
,
1029 go_to_time((GtkWidget
*)button
, user_data
);
1034 on_button_show_time_frame_clicked (GtkButton
*button
,
1037 show_time_frame((GtkWidget
*)button
, user_data
);
1042 on_button_move_up_clicked (GtkButton
*button
,
1045 move_up_viewer((GtkWidget
*)button
, user_data
);
1050 on_button_move_down_clicked (GtkButton
*button
,
1053 move_down_viewer((GtkWidget
*)button
, user_data
);
1058 on_button_delete_viewer_clicked (GtkButton
*button
,
1061 delete_viewer((GtkWidget
*)button
, user_data
);
1065 on_MWindow_destroy (GtkObject
*object
,
1068 MainWindow
*Main_Window
= (MainWindow
*)user_data
;
1070 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list
));
1073 if(g_win_count
== 0)
1079 on_MNotebook_switch_page (GtkNotebook
*notebook
,
1080 GtkNotebookPage
*page
,
1084 MainWindow
* mw
= get_window_data_struct((GtkWidget
*)notebook
);
1085 Tab
* tab
= mw
->tab
;
1091 mw
->current_tab
= tab
;
1094 void checkbox_changed(GtkTreeView
*treeview
,
1096 GtkTreeViewColumn
*arg2
,
1099 GtkTreeStore
* store
= (GtkTreeStore
*)gtk_tree_view_get_model (treeview
);
1103 if (gtk_tree_model_get_iter ((GtkTreeModel
*)store
, &iter
, arg1
)){
1104 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, CHECKBOX_COLUMN
, &value
, -1);
1105 value
= value
? FALSE
: TRUE
;
1106 gtk_tree_store_set (GTK_TREE_STORE (store
), &iter
, CHECKBOX_COLUMN
, value
, -1);
1111 void update_filter(LttvTracesetSelector
*s
, GtkTreeStore
*store
)
1113 GtkTreeIter iter
, child_iter
;
1115 LttvTraceSelector
* trace
;
1116 LttvTracefileSelector
* tracefile
;
1117 gboolean value
, value1
;
1119 if(gtk_tree_model_get_iter_first((GtkTreeModel
*)store
, &iter
)){
1122 trace
= lttv_traceset_selector_get(s
, i
);
1123 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, CHECKBOX_COLUMN
, &value
,-1);
1126 if(gtk_tree_model_iter_children ((GtkTreeModel
*)store
, &child_iter
, &iter
)){
1128 tracefile
= lttv_trace_selector_get(trace
, j
);
1129 gtk_tree_model_get ((GtkTreeModel
*)store
, &child_iter
, CHECKBOX_COLUMN
, &value1
,-1);
1130 lttv_tracefile_selector_set_selected(tracefile
,value1
);
1132 }while(gtk_tree_model_iter_next((GtkTreeModel
*)store
, &child_iter
));
1135 lttv_trace_selector_set_selected(trace
,value
);
1137 }while(gtk_tree_model_iter_next((GtkTreeModel
*)store
, &iter
));
1141 gboolean
get_filter_selection(LttvTracesetSelector
*s
,char *title
, char * column_title
)
1143 GtkWidget
* dialogue
;
1144 GtkTreeStore
* store
;
1146 GtkWidget
* scroll_win
;
1147 GtkCellRenderer
* renderer
;
1148 GtkTreeViewColumn
* column
;
1149 GtkTreeIter iter
, child_iter
;
1150 int i
, j
, id
, nb_trace
, nb_tracefile
;
1151 LttvTraceSelector
* trace
;
1152 LttvTracefileSelector
* tracefile
;
1156 dialogue
= gtk_dialog_new_with_buttons(title
,
1159 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
1160 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
1162 gtk_window_set_default_size((GtkWindow
*)dialogue
, 300, 100);
1164 store
= gtk_tree_store_new (TOTAL_COLUMNS
, G_TYPE_BOOLEAN
, G_TYPE_STRING
);
1165 tree
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (store
));
1166 g_object_unref (G_OBJECT (store
));
1167 g_signal_connect (G_OBJECT (tree
), "row-activated",
1168 G_CALLBACK (checkbox_changed
),
1172 renderer
= gtk_cell_renderer_toggle_new ();
1173 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle
*)renderer
, FALSE
);
1175 g_object_set (G_OBJECT (renderer
),"activatable", TRUE
, NULL
);
1177 column
= gtk_tree_view_column_new_with_attributes ("Checkbox",
1179 "active", CHECKBOX_COLUMN
,
1181 gtk_tree_view_column_set_alignment (column
, 0.5);
1182 gtk_tree_view_column_set_fixed_width (column
, 20);
1183 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1185 renderer
= gtk_cell_renderer_text_new ();
1186 column
= gtk_tree_view_column_new_with_attributes (column_title
,
1188 "text", NAME_COLUMN
,
1190 gtk_tree_view_column_set_alignment (column
, 0.0);
1191 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1192 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree
), FALSE
);
1194 scroll_win
= gtk_scrolled_window_new (NULL
, NULL
);
1195 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win
),
1196 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
1197 gtk_container_add (GTK_CONTAINER (scroll_win
), tree
);
1199 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), scroll_win
,TRUE
, TRUE
,0);
1201 gtk_widget_show(scroll_win
);
1202 gtk_widget_show(tree
);
1204 nb_trace
= lttv_traceset_selector_number(s
);
1205 for(i
=0;i
<nb_trace
;i
++){
1206 trace
= lttv_traceset_selector_get(s
, i
);
1207 name
= lttv_trace_selector_get_name(trace
);
1208 gtk_tree_store_append (store
, &iter
, NULL
);
1209 checked
= lttv_trace_selector_get_selected(trace
);
1210 gtk_tree_store_set (store
, &iter
,
1211 CHECKBOX_COLUMN
,checked
,
1214 nb_tracefile
= lttv_trace_selector_number(trace
);
1215 for(j
=0;j
<nb_tracefile
;j
++){
1216 tracefile
= lttv_trace_selector_get(trace
, j
);
1217 name
= lttv_tracefile_selector_get_name(tracefile
);
1218 gtk_tree_store_append (store
, &child_iter
, &iter
);
1219 checked
= lttv_tracefile_selector_get_selected(tracefile
);
1220 gtk_tree_store_set (store
, &child_iter
,
1221 CHECKBOX_COLUMN
, checked
,
1227 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
1229 case GTK_RESPONSE_ACCEPT
:
1230 case GTK_RESPONSE_OK
:
1231 update_filter(s
, store
);
1232 gtk_widget_destroy(dialogue
);
1234 case GTK_RESPONSE_REJECT
:
1235 case GTK_RESPONSE_CANCEL
:
1237 gtk_widget_destroy(dialogue
);
1243 char * get_remove_trace(char ** all_trace_name
, int nb_trace
)
1245 return get_selection(all_trace_name
, nb_trace
,
1246 "Select a trace", "Trace pathname");
1248 char * get_unload_module(char ** loaded_module_name
, int nb_module
)
1250 return get_selection(loaded_module_name
, nb_module
,
1251 "Select an unload module", "Module pathname");
1254 char * get_selection(char ** loaded_module_name
, int nb_module
,
1255 char *title
, char * column_title
)
1257 GtkWidget
* dialogue
;
1258 GtkWidget
* scroll_win
;
1260 GtkListStore
* store
;
1261 GtkTreeViewColumn
* column
;
1262 GtkCellRenderer
* renderer
;
1263 GtkTreeSelection
* select
;
1266 char * unload_module_name
= NULL
;
1268 dialogue
= gtk_dialog_new_with_buttons(title
,
1271 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
1272 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
1274 gtk_window_set_default_size((GtkWindow
*)dialogue
, 500, 200);
1276 scroll_win
= gtk_scrolled_window_new (NULL
, NULL
);
1277 gtk_widget_show ( scroll_win
);
1278 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win
),
1279 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1281 store
= gtk_list_store_new (N_COLUMNS
,G_TYPE_STRING
);
1282 tree
= gtk_tree_view_new_with_model(GTK_TREE_MODEL (store
));
1283 gtk_widget_show ( tree
);
1284 g_object_unref (G_OBJECT (store
));
1286 renderer
= gtk_cell_renderer_text_new ();
1287 column
= gtk_tree_view_column_new_with_attributes (column_title
,
1289 "text", MODULE_COLUMN
,
1291 gtk_tree_view_column_set_alignment (column
, 0.5);
1292 gtk_tree_view_column_set_fixed_width (column
, 150);
1293 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
1295 select
= gtk_tree_view_get_selection (GTK_TREE_VIEW (tree
));
1296 gtk_tree_selection_set_mode (select
, GTK_SELECTION_SINGLE
);
1298 gtk_container_add (GTK_CONTAINER (scroll_win
), tree
);
1300 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), scroll_win
,TRUE
, TRUE
,0);
1302 for(i
=0;i
<nb_module
;i
++){
1303 gtk_list_store_append (store
, &iter
);
1304 gtk_list_store_set (store
, &iter
, MODULE_COLUMN
,loaded_module_name
[i
],-1);
1307 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
1309 case GTK_RESPONSE_ACCEPT
:
1310 case GTK_RESPONSE_OK
:
1311 if (gtk_tree_selection_get_selected (select
, (GtkTreeModel
**)&store
, &iter
)){
1312 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, MODULE_COLUMN
, &unload_module_name
, -1);
1314 case GTK_RESPONSE_REJECT
:
1315 case GTK_RESPONSE_CANCEL
:
1317 gtk_widget_destroy(dialogue
);
1321 return unload_module_name
;
1324 void main_window_destroy_hash_key(gpointer key
)
1329 void main_window_destroy_hash_data(gpointer data
)
1334 void insert_menu_toolbar_item(MainWindow
* mw
, gpointer user_data
)
1338 view_constructor constructor
;
1340 LttvToolbars
* toolbar
;
1341 lttv_menu_closure
*menu_item
;
1342 lttv_toolbar_closure
*toolbar_item
;
1343 LttvAttributeValue value
;
1344 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1345 GtkWidget
* tool_menu_title_menu
, *insert_view
, *pixmap
, *tmp
;
1347 g_assert(lttv_iattribute_find_by_path(attributes
,
1348 "viewers/menu", LTTV_POINTER
, &value
));
1349 menu
= (LttvMenus
*)*(value
.v_pointer
);
1352 for(i
=0;i
<menu
->len
;i
++){
1353 menu_item
= &g_array_index(menu
, lttv_menu_closure
, i
);
1354 tmp
= g_hash_table_lookup(mw
->hash_menu_item
, g_strdup(menu_item
->menuText
));
1356 constructor
= menu_item
->con
;
1357 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"ToolMenuTitle_menu");
1358 insert_view
= gtk_menu_item_new_with_mnemonic (menu_item
->menuText
);
1359 gtk_widget_show (insert_view
);
1360 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1361 g_signal_connect ((gpointer
) insert_view
, "activate",
1362 G_CALLBACK (insert_viewer_wrap
),
1364 g_hash_table_insert(mw
->hash_menu_item
, g_strdup(menu_item
->menuText
),
1369 g_assert(lttv_iattribute_find_by_path(attributes
,
1370 "viewers/toolbar", LTTV_POINTER
, &value
));
1371 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
1374 for(i
=0;i
<toolbar
->len
;i
++){
1375 toolbar_item
= &g_array_index(toolbar
, lttv_toolbar_closure
, i
);
1376 tmp
= g_hash_table_lookup(mw
->hash_toolbar_item
, g_strdup(toolbar_item
->tooltip
));
1378 constructor
= toolbar_item
->con
;
1379 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"MToolbar2");
1380 pixbuf
= gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item
->pixmap
);
1381 pixmap
= gtk_image_new_from_pixbuf(pixbuf
);
1382 insert_view
= gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu
),
1383 GTK_TOOLBAR_CHILD_BUTTON
,
1386 toolbar_item
->tooltip
, NULL
,
1387 pixmap
, NULL
, NULL
);
1388 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild
*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu
)->children
)->data
))->label
), TRUE
);
1389 gtk_widget_show (insert_view
);
1390 gtk_container_set_border_width (GTK_CONTAINER (insert_view
), 1);
1391 g_signal_connect ((gpointer
) insert_view
, "clicked",G_CALLBACK (insert_viewer_wrap
),constructor
);
1392 g_hash_table_insert(mw
->hash_toolbar_item
, g_strdup(toolbar_item
->tooltip
),
1398 void construct_main_window(MainWindow
* parent
, WindowCreationData
* win_creation_data
)
1400 g_critical("construct_main_window()");
1401 GtkWidget
* new_window
; /* New generated main window */
1402 MainWindow
* new_m_window
;/* New main window structure */
1403 GtkNotebook
* notebook
;
1404 LttvIAttribute
*attributes
=
1405 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1406 LttvAttributeValue value
;
1408 new_m_window
= g_new(MainWindow
, 1);
1410 // Add the object's information to the module's array
1411 g_main_window_list
= g_slist_append(g_main_window_list
, new_m_window
);
1414 new_window
= create_MWindow();
1415 gtk_widget_show (new_window
);
1417 new_m_window
->attributes
= attributes
;
1419 new_m_window
->mwindow
= new_window
;
1420 new_m_window
->tab
= NULL
;
1421 new_m_window
->current_tab
= NULL
;
1422 new_m_window
->attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1424 new_m_window
->win_creation_data
= parent
->win_creation_data
;
1426 new_m_window
->win_creation_data
= win_creation_data
;
1429 new_m_window
->hash_menu_item
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
1430 main_window_destroy_hash_key
,
1431 main_window_destroy_hash_data
);
1432 new_m_window
->hash_toolbar_item
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
1433 main_window_destroy_hash_key
,
1434 main_window_destroy_hash_data
);
1436 insert_menu_toolbar_item(new_m_window
, NULL
);
1438 g_object_set_data(G_OBJECT(new_window
), "mainWindow", (gpointer
)new_m_window
);
1440 //create a default tab
1441 notebook
= (GtkNotebook
*)lookup_widget(new_m_window
->mwindow
, "MNotebook");
1442 if(notebook
== NULL
){
1443 g_printf("Notebook does not exist\n");
1446 //for now there is no name field in LttvTraceset structure
1447 //Use "Traceset" as the label for the default tab
1448 create_tab(NULL
, new_m_window
, notebook
,"Traceset");
1450 g_object_set_data_full(
1451 G_OBJECT(new_m_window
->mwindow
),
1454 (GDestroyNotify
)main_window_free
);
1459 void tab_destructor(Tab
* tab_instance
)
1461 int i
, nb
, ref_count
;
1464 if(tab_instance
->attributes
)
1465 g_object_unref(tab_instance
->attributes
);
1467 if(tab_instance
->mw
->tab
== tab_instance
){
1468 tab_instance
->mw
->tab
= tab_instance
->next
;
1470 Tab
* tmp1
, *tmp
= tab_instance
->mw
->tab
;
1471 while(tmp
!= tab_instance
){
1475 tmp1
->next
= tab_instance
->next
;
1478 if(tab_instance
->traceset_info
->traceset_context
!= NULL
){
1479 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance
->traceset_info
->
1481 g_object_unref(tab_instance
->traceset_info
->traceset_context
);
1483 if(tab_instance
->traceset_info
->traceset
!= NULL
) {
1484 nb
= lttv_traceset_number(tab_instance
->traceset_info
->traceset
);
1485 for(i
= 0 ; i
< nb
; i
++) {
1486 trace
= lttv_traceset_get(tab_instance
->traceset_info
->traceset
, i
);
1487 ref_count
= lttv_trace_get_ref_number(trace
);
1489 ltt_trace_close(lttv_trace(trace
));
1491 lttv_trace_destroy(trace
);
1494 lttv_traceset_destroy(tab_instance
->traceset_info
->traceset
);
1495 g_free(tab_instance
->traceset_info
);
1496 g_free(tab_instance
);
1499 void * create_tab(MainWindow
* parent
, MainWindow
* current_window
,
1500 GtkNotebook
* notebook
, char * label
)
1504 MainWindow
* mw_data
= current_window
;
1507 tmp_tab
= mw_data
->tab
;
1508 while(tmp_tab
&& tmp_tab
->next
) tmp_tab
= tmp_tab
->next
;
1510 mw_data
->current_tab
= NULL
;
1511 tmp_tab
= g_new(Tab
,1);
1512 mw_data
->tab
= tmp_tab
;
1514 tmp_tab
->next
= g_new(Tab
,1);
1515 tmp_tab
= tmp_tab
->next
;
1518 tmp_tab
->traceset_info
= g_new(TracesetInfo
,1);
1520 tmp_tab
->traceset_info
->traceset
=
1521 lttv_traceset_copy(parent
->current_tab
->traceset_info
->traceset
);
1523 if(mw_data
->current_tab
){
1524 tmp_tab
->traceset_info
->traceset
=
1525 lttv_traceset_copy(mw_data
->current_tab
->traceset_info
->traceset
);
1527 tmp_tab
->traceset_info
->traceset
= lttv_traceset_new();
1528 /* Add the command line trace */
1529 if(g_init_trace
!= NULL
)
1530 lttv_traceset_add(tmp_tab
->traceset_info
->traceset
, g_init_trace
);
1533 //FIXME copy not implemented in lower level
1534 tmp_tab
->traceset_info
->traceset_context
=
1535 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
1537 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
),
1538 tmp_tab
->traceset_info
->traceset
);
1540 if(mw_data
->current_tab
){
1541 // Will have to read directly at the main window level, as we want
1542 // to be able to modify a traceset on the fly.
1543 tmp_tab
->time_window
= mw_data
->current_tab
->time_window
;
1544 tmp_tab
->current_time
= mw_data
->current_tab
->current_time
;
1546 // Will have to read directly at the main window level, as we want
1547 // to be able to modify a traceset on the fly.
1548 // get_traceset_time_span(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
1549 tmp_tab
->time_window
.start_time
=
1550 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->startTime
;
1551 if(DEFAULT_TIME_WIDTH_S
<
1552 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->endTime
.tv_sec
)
1553 tmp_time
.tv_sec
= DEFAULT_TIME_WIDTH_S
;
1556 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->endTime
.tv_sec
;
1557 tmp_time
.tv_nsec
= 0;
1558 tmp_tab
->time_window
.time_width
= tmp_time
;
1559 tmp_tab
->current_time
.tv_sec
=
1560 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->startTime
.tv_sec
;
1561 tmp_tab
->current_time
.tv_nsec
=
1562 LTTV_TRACESET_CONTEXT(tmp_tab
->traceset_info
->traceset_context
)->Time_Span
->startTime
.tv_nsec
;
1564 tmp_tab
->attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1565 // mw_data->current_tab = tmp_tab;
1566 tmp_tab
->multi_vpaned
= (GtkMultiVPaned
*)gtk_multi_vpaned_new();
1567 tmp_tab
->multi_vpaned
->mw
= mw_data
;
1568 gtk_widget_show((GtkWidget
*)tmp_tab
->multi_vpaned
);
1569 tmp_tab
->next
= NULL
;
1570 tmp_tab
->mw
= mw_data
;
1572 tmp_tab
->label
= gtk_label_new (label
);
1573 gtk_widget_show (tmp_tab
->label
);
1575 g_object_set_data_full(
1576 G_OBJECT(tmp_tab
->multi_vpaned
),
1579 (GDestroyNotify
)tab_destructor
);
1581 gtk_notebook_append_page(notebook
, (GtkWidget
*)tmp_tab
->multi_vpaned
, tmp_tab
->label
);
1582 list
= gtk_container_get_children(GTK_CONTAINER(notebook
));
1583 gtk_notebook_set_current_page(notebook
,g_list_length(list
)-1);
1586 void remove_menu_item(gpointer main_win
, gpointer user_data
)
1588 MainWindow
* mw
= (MainWindow
*) main_win
;
1589 lttv_menu_closure
*menu_item
= (lttv_menu_closure
*)user_data
;
1590 GtkWidget
* tool_menu_title_menu
, *insert_view
;
1592 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"ToolMenuTitle_menu");
1593 insert_view
= (GtkWidget
*)g_hash_table_lookup(mw
->hash_menu_item
,
1594 menu_item
->menuText
);
1596 g_hash_table_remove(mw
->hash_menu_item
, menu_item
->menuText
);
1597 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1601 void remove_toolbar_item(gpointer main_win
, gpointer user_data
)
1603 MainWindow
* mw
= (MainWindow
*) main_win
;
1604 lttv_toolbar_closure
*toolbar_item
= (lttv_toolbar_closure
*)user_data
;
1605 GtkWidget
* tool_menu_title_menu
, *insert_view
;
1608 tool_menu_title_menu
= lookup_widget(mw
->mwindow
,"MToolbar2");
1609 insert_view
= (GtkWidget
*)g_hash_table_lookup(mw
->hash_toolbar_item
,
1610 toolbar_item
->tooltip
);
1612 g_hash_table_remove(mw
->hash_toolbar_item
, toolbar_item
->tooltip
);
1613 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1618 * Remove menu and toolbar item when a module unloaded
1621 void main_window_remove_menu_item(lttv_constructor constructor
)
1625 lttv_menu_closure
*menu_item
;
1626 LttvAttributeValue value
;
1627 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1629 g_assert(lttv_iattribute_find_by_path(attributes
,
1630 "viewers/menu", LTTV_POINTER
, &value
));
1631 menu
= (LttvMenus
*)*(value
.v_pointer
);
1634 for(i
=0;i
<menu
->len
;i
++){
1635 menu_item
= &g_array_index(menu
, lttv_menu_closure
, i
);
1636 if(menu_item
->con
!= constructor
) continue;
1637 if(g_main_window_list
){
1638 g_slist_foreach(g_main_window_list
, remove_menu_item
, menu_item
);
1646 void main_window_remove_toolbar_item(lttv_constructor constructor
)
1649 LttvToolbars
* toolbar
;
1650 lttv_toolbar_closure
*toolbar_item
;
1651 LttvAttributeValue value
;
1652 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1654 g_assert(lttv_iattribute_find_by_path(attributes
,
1655 "viewers/toolbar", LTTV_POINTER
, &value
));
1656 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
1659 for(i
=0;i
<toolbar
->len
;i
++){
1660 toolbar_item
= &g_array_index(toolbar
, lttv_toolbar_closure
, i
);
1661 if(toolbar_item
->con
!= constructor
) continue;
1662 if(g_main_window_list
){
1663 g_slist_foreach(g_main_window_list
, remove_toolbar_item
, toolbar_item
);