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>
19 #define PATH_LENGTH 256
20 #define DEFAULT_TIME_WIDTH_S 1
22 //extern LttvTracesetContext * gTracesetContext;
23 extern LttTrace
*g_init_trace
;
26 /** Array containing instanced objects. */
27 extern GSList
* g_main_window_list
;
29 static int g_win_count
= 0;
31 mainWindow
* get_window_data_struct(GtkWidget
* widget
);
32 char * get_unload_module(char ** loaded_module_name
, int nb_module
);
33 char * get_remove_trace(char ** all_trace_name
, int nb_trace
);
34 char * get_selection(char ** all_name
, int nb
, char *title
, char * column_title
);
35 void * create_tab(GtkWidget
* parent
, GtkNotebook
* notebook
, char * label
);
37 void insert_viewer(GtkWidget
* widget
, view_constructor constructor
);
47 insert_viewer_wrap(GtkMenuItem
*menuitem
, gpointer user_data
)
50 insert_viewer((GtkWidget
*)menuitem
, (view_constructor
)user_data
);
51 // selected_hook(&val);
55 /* internal functions */
56 void insert_viewer(GtkWidget
* widget
, view_constructor constructor
)
62 mw_data
= get_window_data_struct(widget
);
63 if(!mw_data
->CurrentTab
) return;
64 custom
= mw_data
->CurrentTab
->custom
;
66 viewer
= (GtkWidget
*)constructor(mw_data
);
69 gtk_custom_widget_add(custom
, viewer
);
71 // g_object_unref(G_OBJECT(viewer));
75 void get_label_string (GtkWidget
* text
, gchar
* label
)
77 GtkEntry
* entry
= (GtkEntry
*)text
;
78 if(strlen(gtk_entry_get_text(entry
))!=0)
79 strcpy(label
,gtk_entry_get_text(entry
));
82 void get_label(GtkWindow
* mw
, gchar
* str
, gchar
* dialogue_title
, gchar
* label_str
)
89 dialogue
= gtk_dialog_new_with_buttons(dialogue_title
,NULL
,
91 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
92 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
95 label
= gtk_label_new(label_str
);
96 gtk_widget_show(label
);
98 text
= gtk_entry_new();
99 gtk_widget_show(text
);
101 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), label
,TRUE
, TRUE
,0);
102 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), text
,FALSE
, FALSE
,0);
104 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
106 case GTK_RESPONSE_ACCEPT
:
107 get_label_string(text
,str
);
108 gtk_widget_destroy(dialogue
);
110 case GTK_RESPONSE_REJECT
:
112 gtk_widget_destroy(dialogue
);
117 mainWindow
* get_window_data_struct(GtkWidget
* widget
)
120 mainWindow
* mw_data
;
122 mw
= lookup_widget(widget
, "MWindow");
124 g_printf("Main window does not exist\n");
128 mw_data
= (mainWindow
*) g_object_get_data(G_OBJECT(mw
),"mainWindow");
130 g_printf("Main window data does not exist\n");
136 void create_new_window(GtkWidget
* widget
, gpointer user_data
, gboolean clone
)
138 mainWindow
* parent
= get_window_data_struct(widget
);
141 g_printf("Clone : use the same traceset\n");
142 construct_main_window(parent
, NULL
, FALSE
);
144 g_printf("Empty : traceset is set to NULL\n");
145 construct_main_window(NULL
, parent
->winCreationData
, FALSE
);
149 void move_up_viewer(GtkWidget
* widget
, gpointer user_data
)
151 mainWindow
* mw
= get_window_data_struct(widget
);
152 if(!mw
->CurrentTab
) return;
153 gtk_custom_widget_move_up(mw
->CurrentTab
->custom
);
156 void move_down_viewer(GtkWidget
* widget
, gpointer user_data
)
158 mainWindow
* mw
= get_window_data_struct(widget
);
159 if(!mw
->CurrentTab
) return;
160 gtk_custom_widget_move_down(mw
->CurrentTab
->custom
);
163 void delete_viewer(GtkWidget
* widget
, gpointer user_data
)
165 mainWindow
* mw
= get_window_data_struct(widget
);
166 if(!mw
->CurrentTab
) return;
167 gtk_custom_widget_delete(mw
->CurrentTab
->custom
);
170 void open_traceset(GtkWidget
* widget
, gpointer user_data
)
174 LttvTraceset
* traceset
;
175 mainWindow
* mw_data
= get_window_data_struct(widget
);
176 GtkFileSelection
* file_selector
=
177 (GtkFileSelection
*)gtk_file_selection_new("Select a traceset");
179 gtk_file_selection_hide_fileop_buttons(file_selector
);
181 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
183 case GTK_RESPONSE_ACCEPT
:
184 case GTK_RESPONSE_OK
:
185 dir
= gtk_file_selection_get_selections (file_selector
);
186 traceset
= lttv_traceset_load(dir
[0]);
187 g_printf("Open a trace set %s\n", dir
[0]);
190 case GTK_RESPONSE_REJECT
:
191 case GTK_RESPONSE_CANCEL
:
193 gtk_widget_destroy((GtkWidget
*)file_selector
);
199 void add_trace(GtkWidget
* widget
, gpointer user_data
)
203 LttvTraceset
* traceset
;
206 mainWindow
* mw_data
= get_window_data_struct(widget
);
207 GtkDirSelection
* file_selector
= (GtkDirSelection
*)gtk_dir_selection_new("Select a trace");
208 gtk_dir_selection_hide_fileop_buttons(file_selector
);
210 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
212 case GTK_RESPONSE_ACCEPT
:
213 case GTK_RESPONSE_OK
:
214 dir
= gtk_dir_selection_get_dir (file_selector
);
215 trace
= ltt_trace_open(dir
);
216 if(trace
== NULL
) g_critical("cannot open trace %s", dir
);
217 trace_v
= lttv_trace_new(trace
);
218 traceset
= mw_data
->Traceset_Info
->traceset
;
219 if(mw_data
->Traceset_Info
->TracesetContext
!= NULL
){
220 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
));
221 g_object_unref(mw_data
->Traceset_Info
->TracesetContext
);
223 lttv_traceset_add(traceset
, trace_v
);
224 mw_data
->Traceset_Info
->TracesetContext
=
225 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
227 LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
),traceset
);
228 case GTK_RESPONSE_REJECT
:
229 case GTK_RESPONSE_CANCEL
:
231 gtk_widget_destroy((GtkWidget
*)file_selector
);
235 g_printf("add a trace to a trace set\n");
238 void remove_trace(GtkWidget
* widget
, gpointer user_data
)
242 LttvTraceset
* traceset
;
244 char ** name
, *remove_trace_name
;
245 mainWindow
* mw_data
= get_window_data_struct(widget
);
247 nb_trace
=lttv_traceset_number(mw_data
->Traceset_Info
->traceset
);
248 name
= g_new(char*,nb_trace
);
249 for(i
= 0; i
< nb_trace
; i
++){
250 trace_v
= lttv_traceset_get(mw_data
->Traceset_Info
->traceset
, i
);
251 trace
= lttv_trace(trace_v
);
252 name
[i
] = trace
->pathname
;
255 remove_trace_name
= get_remove_trace(name
, nb_trace
);
257 if(remove_trace_name
){
258 for(i
=0; i
<nb_trace
; i
++){
259 if(strcmp(remove_trace_name
,name
[i
]) == 0){
260 traceset
= mw_data
->Traceset_Info
->traceset
;
261 if(mw_data
->Traceset_Info
->TracesetContext
!= NULL
){
262 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
));
263 g_object_unref(mw_data
->Traceset_Info
->TracesetContext
);
265 lttv_traceset_remove(traceset
, i
);
266 mw_data
->Traceset_Info
->TracesetContext
=
267 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
269 LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
),traceset
);
276 g_printf("remove a trace from a trace set\n");
279 void save(GtkWidget
* widget
, gpointer user_data
)
284 void save_as(GtkWidget
* widget
, gpointer user_data
)
286 g_printf("Save as\n");
289 void zoom_in(GtkWidget
* widget
, gpointer user_data
)
291 g_printf("Zoom in\n");
294 void zoom_out(GtkWidget
* widget
, gpointer user_data
)
296 g_printf("Zoom out\n");
299 void zoom_extended(GtkWidget
* widget
, gpointer user_data
)
301 g_printf("Zoom extended\n");
304 void go_to_time(GtkWidget
* widget
, gpointer user_data
)
306 g_printf("Go to time\n");
309 void show_time_frame(GtkWidget
* widget
, gpointer user_data
)
311 g_printf("Show time frame\n");
315 /* callback function */
318 on_empty_traceset_activate (GtkMenuItem
*menuitem
,
321 create_new_window((GtkWidget
*)menuitem
, user_data
, FALSE
);
326 on_clone_traceset_activate (GtkMenuItem
*menuitem
,
329 create_new_window((GtkWidget
*)menuitem
, user_data
, TRUE
);
334 on_tab_activate (GtkMenuItem
*menuitem
,
337 gchar label
[PATH_LENGTH
];
338 GtkNotebook
* notebook
= (GtkNotebook
*)lookup_widget((GtkWidget
*)menuitem
, "MNotebook");
339 if(notebook
== NULL
){
340 g_printf("Notebook does not exist\n");
344 strcpy(label
,"Page");
345 get_label(NULL
, label
,"Get the name of the tab","Please input tab's name");
347 create_tab ((GtkWidget
*)menuitem
, notebook
, label
);
352 on_open_activate (GtkMenuItem
*menuitem
,
355 open_traceset((GtkWidget
*)menuitem
, user_data
);
360 on_close_activate (GtkMenuItem
*menuitem
,
363 mainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
364 main_window_destructor(mw_data
);
369 on_close_tab_activate (GtkMenuItem
*menuitem
,
373 GtkWidget
* notebook
;
375 mainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
376 notebook
= lookup_widget((GtkWidget
*)menuitem
, "MNotebook");
377 if(notebook
== NULL
){
378 g_printf("Notebook does not exist\n");
382 if(mw_data
->Tab
== mw_data
->CurrentTab
){
383 // tmp = mw_data->CurrentTab;
384 // mw_data->Tab = mw_data->CurrentTab->Next;
385 g_printf("The default TAB can not be deleted\n");
389 while(tmp
!= mw_data
->CurrentTab
){
395 gtk_notebook_remove_page((GtkNotebook
*)notebook
, count
);
400 on_add_trace_activate (GtkMenuItem
*menuitem
,
403 add_trace((GtkWidget
*)menuitem
, user_data
);
408 on_remove_trace_activate (GtkMenuItem
*menuitem
,
411 remove_trace((GtkWidget
*)menuitem
, user_data
);
416 on_save_activate (GtkMenuItem
*menuitem
,
419 save((GtkWidget
*)menuitem
, user_data
);
424 on_save_as_activate (GtkMenuItem
*menuitem
,
427 save_as((GtkWidget
*)menuitem
, user_data
);
432 on_quit_activate (GtkMenuItem
*menuitem
,
440 on_cut_activate (GtkMenuItem
*menuitem
,
448 on_copy_activate (GtkMenuItem
*menuitem
,
456 on_paste_activate (GtkMenuItem
*menuitem
,
464 on_delete_activate (GtkMenuItem
*menuitem
,
467 g_printf("Delete\n");
472 on_zoom_in_activate (GtkMenuItem
*menuitem
,
475 zoom_in((GtkWidget
*)menuitem
, user_data
);
480 on_zoom_out_activate (GtkMenuItem
*menuitem
,
483 zoom_out((GtkWidget
*)menuitem
, user_data
);
488 on_zoom_extended_activate (GtkMenuItem
*menuitem
,
491 zoom_extended((GtkWidget
*)menuitem
, user_data
);
496 on_go_to_time_activate (GtkMenuItem
*menuitem
,
499 go_to_time((GtkWidget
*)menuitem
, user_data
);
504 on_show_time_frame_activate (GtkMenuItem
*menuitem
,
507 show_time_frame((GtkWidget
*)menuitem
, user_data
);
512 on_move_viewer_up_activate (GtkMenuItem
*menuitem
,
515 move_up_viewer((GtkWidget
*)menuitem
, user_data
);
520 on_move_viewer_down_activate (GtkMenuItem
*menuitem
,
523 move_down_viewer((GtkWidget
*)menuitem
, user_data
);
528 on_remove_viewer_activate (GtkMenuItem
*menuitem
,
531 delete_viewer((GtkWidget
*)menuitem
, user_data
);
536 on_load_module_activate (GtkMenuItem
*menuitem
,
541 char str
[PATH_LENGTH
], *str1
;
542 mainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
543 GtkFileSelection
* file_selector
= (GtkFileSelection
*)gtk_file_selection_new("Select a module");
544 gtk_file_selection_hide_fileop_buttons(file_selector
);
547 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
549 case GTK_RESPONSE_ACCEPT
:
550 case GTK_RESPONSE_OK
:
551 dir
= gtk_file_selection_get_selections (file_selector
);
553 str1
= strrchr(str
,'/');
556 str1
= strrchr(str
,'\\');
559 if(mw_data
->winCreationData
)
560 lttv_module_load(str1
, mw_data
->winCreationData
->argc
,mw_data
->winCreationData
->argv
);
562 lttv_module_load(str1
, 0,NULL
);
563 g_slist_foreach(g_main_window_list
, insert_menu_toolbar_item
, NULL
);
565 case GTK_RESPONSE_REJECT
:
566 case GTK_RESPONSE_CANCEL
:
568 gtk_widget_destroy((GtkWidget
*)file_selector
);
571 g_printf("Load module: %s\n", str
);
576 on_unload_module_activate (GtkMenuItem
*menuitem
,
580 char **name
, *unload_module_name
;
582 LttvModule
** modules
, *module
;
583 mainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
585 modules
= lttv_module_list(&nb
);
586 name
= g_new(char*, nb
);
589 name
[i
] = lttv_module_name(module
);
592 unload_module_name
=get_unload_module(name
,nb
);
594 if(unload_module_name
){
596 if(strcmp(unload_module_name
, name
[i
]) == 0){
597 lttv_module_unload(modules
[i
]);
608 on_add_module_search_path_activate (GtkMenuItem
*menuitem
,
611 GtkDirSelection
* file_selector
= (GtkDirSelection
*)gtk_dir_selection_new("Select module path");
615 mainWindow
* mw_data
= get_window_data_struct((GtkWidget
*)menuitem
);
617 id
= gtk_dialog_run(GTK_DIALOG(file_selector
));
619 case GTK_RESPONSE_ACCEPT
:
620 case GTK_RESPONSE_OK
:
621 dir
= gtk_dir_selection_get_dir (file_selector
);
622 lttv_module_path_add(dir
);
623 case GTK_RESPONSE_REJECT
:
624 case GTK_RESPONSE_CANCEL
:
626 gtk_widget_destroy((GtkWidget
*)file_selector
);
633 on_color_activate (GtkMenuItem
*menuitem
,
641 on_filter_activate (GtkMenuItem
*menuitem
,
644 g_printf("Filter\n");
649 on_save_configuration_activate (GtkMenuItem
*menuitem
,
652 g_printf("Save configuration\n");
657 on_content_activate (GtkMenuItem
*menuitem
,
660 g_printf("Content\n");
665 on_about_activate (GtkMenuItem
*menuitem
,
668 g_printf("About...\n");
673 on_button_new_clicked (GtkButton
*button
,
676 create_new_window((GtkWidget
*)button
, user_data
, FALSE
);
681 on_button_open_clicked (GtkButton
*button
,
684 open_traceset((GtkWidget
*)button
, user_data
);
689 on_button_add_trace_clicked (GtkButton
*button
,
692 add_trace((GtkWidget
*)button
, user_data
);
697 on_button_remove_trace_clicked (GtkButton
*button
,
700 remove_trace((GtkWidget
*)button
, user_data
);
705 on_button_save_clicked (GtkButton
*button
,
708 save((GtkWidget
*)button
, user_data
);
713 on_button_save_as_clicked (GtkButton
*button
,
716 save_as((GtkWidget
*)button
, user_data
);
721 on_button_zoom_in_clicked (GtkButton
*button
,
724 zoom_in((GtkWidget
*)button
, user_data
);
729 on_button_zoom_out_clicked (GtkButton
*button
,
732 zoom_out((GtkWidget
*)button
, user_data
);
737 on_button_zoom_extended_clicked (GtkButton
*button
,
740 zoom_extended((GtkWidget
*)button
, user_data
);
745 on_button_go_to_time_clicked (GtkButton
*button
,
748 go_to_time((GtkWidget
*)button
, user_data
);
753 on_button_show_time_frame_clicked (GtkButton
*button
,
756 show_time_frame((GtkWidget
*)button
, user_data
);
761 on_button_move_up_clicked (GtkButton
*button
,
764 move_up_viewer((GtkWidget
*)button
, user_data
);
769 on_button_move_down_clicked (GtkButton
*button
,
772 move_down_viewer((GtkWidget
*)button
, user_data
);
777 on_button_delete_viewer_clicked (GtkButton
*button
,
780 delete_viewer((GtkWidget
*)button
, user_data
);
784 on_MWindow_destroy (GtkObject
*object
,
787 mainWindow
*Main_Window
= (mainWindow
*)user_data
;
789 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list
));
798 on_MNotebook_switch_page (GtkNotebook
*notebook
,
799 GtkNotebookPage
*page
,
803 mainWindow
* mw
= get_window_data_struct((GtkWidget
*)notebook
);
810 mw
->CurrentTab
= Tab
;
813 char * get_remove_trace(char ** all_trace_name
, int nb_trace
)
815 return get_selection(all_trace_name
, nb_trace
,
816 "Select a trace", "Trace pathname");
818 char * get_unload_module(char ** loaded_module_name
, int nb_module
)
820 return get_selection(loaded_module_name
, nb_module
,
821 "Select an unload module", "Module pathname");
824 char * get_selection(char ** loaded_module_name
, int nb_module
,
825 char *title
, char * column_title
)
827 GtkWidget
* dialogue
;
828 GtkWidget
* scroll_win
;
830 GtkListStore
* store
;
831 GtkTreeViewColumn
* column
;
832 GtkCellRenderer
* renderer
;
833 GtkTreeSelection
* select
;
836 char * unload_module_name
= NULL
;
838 dialogue
= gtk_dialog_new_with_buttons(title
,
841 GTK_STOCK_OK
,GTK_RESPONSE_ACCEPT
,
842 GTK_STOCK_CANCEL
,GTK_RESPONSE_REJECT
,
844 gtk_window_set_default_size((GtkWindow
*)dialogue
, 500, 200);
846 scroll_win
= gtk_scrolled_window_new (NULL
, NULL
);
847 gtk_widget_show ( scroll_win
);
848 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win
),
849 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
851 store
= gtk_list_store_new (N_COLUMNS
,G_TYPE_STRING
);
852 tree
= gtk_tree_view_new_with_model(GTK_TREE_MODEL (store
));
853 gtk_widget_show ( tree
);
854 g_object_unref (G_OBJECT (store
));
856 renderer
= gtk_cell_renderer_text_new ();
857 column
= gtk_tree_view_column_new_with_attributes (column_title
,
859 "text", MODULE_COLUMN
,
861 gtk_tree_view_column_set_alignment (column
, 0.5);
862 gtk_tree_view_column_set_fixed_width (column
, 150);
863 gtk_tree_view_append_column (GTK_TREE_VIEW (tree
), column
);
865 select
= gtk_tree_view_get_selection (GTK_TREE_VIEW (tree
));
866 gtk_tree_selection_set_mode (select
, GTK_SELECTION_SINGLE
);
868 gtk_container_add (GTK_CONTAINER (scroll_win
), tree
);
870 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue
)->vbox
), scroll_win
,TRUE
, TRUE
,0);
872 for(i
=0;i
<nb_module
;i
++){
873 gtk_list_store_append (store
, &iter
);
874 gtk_list_store_set (store
, &iter
, MODULE_COLUMN
,loaded_module_name
[i
],-1);
877 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
879 case GTK_RESPONSE_ACCEPT
:
880 case GTK_RESPONSE_OK
:
881 if (gtk_tree_selection_get_selected (select
, (GtkTreeModel
**)&store
, &iter
)){
882 gtk_tree_model_get ((GtkTreeModel
*)store
, &iter
, MODULE_COLUMN
, &unload_module_name
, -1);
884 case GTK_RESPONSE_REJECT
:
885 case GTK_RESPONSE_CANCEL
:
887 gtk_widget_destroy(dialogue
);
891 return unload_module_name
;
894 void main_window_destroy_hash_key(gpointer key
)
899 void main_window_destroy_hash_data(gpointer data
)
904 void insert_menu_toolbar_item(mainWindow
* mw
, gpointer user_data
)
908 view_constructor constructor
;
910 LttvToolbars
* toolbar
;
911 lttv_menu_closure
*menu_item
;
912 lttv_toolbar_closure
*toolbar_item
;
913 LttvAttributeValue value
;
914 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
915 GtkWidget
* tool_menu_title_menu
, *insert_view
, *pixmap
, *tmp
;
917 g_assert(lttv_iattribute_find_by_path(attributes
,
918 "viewers/menu", LTTV_POINTER
, &value
));
919 menu
= (LttvMenus
*)*(value
.v_pointer
);
922 for(i
=0;i
<menu
->len
;i
++){
923 menu_item
= &g_array_index(menu
, lttv_menu_closure
, i
);
924 tmp
= g_hash_table_lookup(mw
->hash_menu_item
, g_strdup(menu_item
->menuText
));
926 constructor
= menu_item
->con
;
927 tool_menu_title_menu
= lookup_widget(mw
->MWindow
,"ToolMenuTitle_menu");
928 insert_view
= gtk_menu_item_new_with_mnemonic (menu_item
->menuText
);
929 gtk_widget_show (insert_view
);
930 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
931 g_signal_connect ((gpointer
) insert_view
, "activate",
932 G_CALLBACK (insert_viewer_wrap
),
934 g_hash_table_insert(mw
->hash_menu_item
, g_strdup(menu_item
->menuText
),
939 g_assert(lttv_iattribute_find_by_path(attributes
,
940 "viewers/toolbar", LTTV_POINTER
, &value
));
941 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
944 for(i
=0;i
<toolbar
->len
;i
++){
945 toolbar_item
= &g_array_index(toolbar
, lttv_toolbar_closure
, i
);
946 tmp
= g_hash_table_lookup(mw
->hash_toolbar_item
, g_strdup(toolbar_item
->tooltip
));
948 constructor
= toolbar_item
->con
;
949 tool_menu_title_menu
= lookup_widget(mw
->MWindow
,"MToolbar2");
950 pixbuf
= gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item
->pixmap
);
951 pixmap
= gtk_image_new_from_pixbuf(pixbuf
);
952 insert_view
= gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu
),
953 GTK_TOOLBAR_CHILD_BUTTON
,
956 toolbar_item
->tooltip
, NULL
,
958 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild
*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu
)->children
)->data
))->label
), TRUE
);
959 gtk_widget_show (insert_view
);
960 gtk_container_set_border_width (GTK_CONTAINER (insert_view
), 1);
961 g_signal_connect ((gpointer
) insert_view
, "clicked",G_CALLBACK (insert_viewer_wrap
),constructor
);
962 g_hash_table_insert(mw
->hash_toolbar_item
, g_strdup(toolbar_item
->tooltip
),
968 void construct_main_window(mainWindow
* parent
, WindowCreationData
* win_creation_data
,
969 gboolean first_window
)
971 g_critical("construct_main_window()");
972 GtkWidget
* new_window
; /* New generated main window */
973 mainWindow
* new_m_window
;/* New main window structure */
974 GtkNotebook
* notebook
;
975 LttvIAttribute
*attributes
=
976 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
977 LttvAttributeValue value
;
979 new_m_window
= g_new(mainWindow
, 1);
981 // Add the object's information to the module's array
982 g_main_window_list
= g_slist_append(g_main_window_list
, new_m_window
);
985 new_window
= create_MWindow();
986 gtk_widget_show (new_window
);
988 new_m_window
->Attributes
= attributes
;
990 new_m_window
->Traceset_Info
= g_new(TracesetInfo
,1);
991 new_m_window
->Traceset_Info
->path
= NULL
;
994 new_m_window
->Traceset_Info
->before_traceset
= lttv_hooks_new();
995 new_m_window
->Traceset_Info
->after_traceset
= lttv_hooks_new();
996 new_m_window
->Traceset_Info
->before_trace
= lttv_hooks_new();
997 new_m_window
->Traceset_Info
->after_trace
= lttv_hooks_new();
998 new_m_window
->Traceset_Info
->before_tracefile
= lttv_hooks_new();
999 new_m_window
->Traceset_Info
->after_tracefile
= lttv_hooks_new();
1000 new_m_window
->Traceset_Info
->before_event
= lttv_hooks_new();
1001 new_m_window
->Traceset_Info
->after_event
= lttv_hooks_new();
1003 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/traceset/before",
1004 LTTV_POINTER
, &value
));
1005 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->before_traceset
;
1006 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/traceset/after",
1007 LTTV_POINTER
, &value
));
1008 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->after_traceset
;
1009 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/trace/before",
1010 LTTV_POINTER
, &value
));
1011 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->before_trace
;
1012 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/trace/after",
1013 LTTV_POINTER
, &value
));
1014 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->after_trace
;
1015 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/tracefile/before",
1016 LTTV_POINTER
, &value
));
1017 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->before_tracefile
;
1018 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/tracefile/after",
1019 LTTV_POINTER
, &value
));
1020 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->after_tracefile
;
1021 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/event/before",
1022 LTTV_POINTER
, &value
));
1023 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->before_event
;
1024 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/event/after",
1025 LTTV_POINTER
, &value
));
1026 *(value
.v_pointer
) = new_m_window
->Traceset_Info
->after_event
;
1029 new_m_window
->MWindow
= new_window
;
1030 new_m_window
->Tab
= NULL
;
1031 new_m_window
->CurrentTab
= NULL
;
1032 new_m_window
->Attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1034 new_m_window
->Traceset_Info
->traceset
=
1035 lttv_traceset_copy(parent
->Traceset_Info
->traceset
);
1037 //FIXME copy not implemented in lower level
1038 new_m_window
->Traceset_Info
->TracesetContext
=
1039 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
1041 LTTV_TRACESET_CONTEXT(new_m_window
->Traceset_Info
->TracesetContext
),
1042 new_m_window
->Traceset_Info
->traceset
);
1043 //new_m_window->traceset_context = parent->traceset_context;
1044 new_m_window
->winCreationData
= parent
->winCreationData
;
1046 new_m_window
->Traceset_Info
->traceset
= lttv_traceset_new();
1048 /* Add the command line trace */
1049 if(g_init_trace
!= NULL
&& first_window
)
1050 lttv_traceset_add(new_m_window
->Traceset_Info
->traceset
, g_init_trace
);
1051 /* NOTE : the context must be recreated if we change the traceset,
1052 * ie : adding/removing traces */
1053 new_m_window
->Traceset_Info
->TracesetContext
=
1054 g_object_new(LTTV_TRACESET_STATS_TYPE
, NULL
);
1056 LTTV_TRACESET_CONTEXT(new_m_window
->Traceset_Info
->TracesetContext
),
1057 new_m_window
->Traceset_Info
->traceset
);
1059 new_m_window
->winCreationData
= win_creation_data
;
1062 new_m_window
->hash_menu_item
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
1063 main_window_destroy_hash_key
,
1064 main_window_destroy_hash_data
);
1065 new_m_window
->hash_toolbar_item
= g_hash_table_new_full (g_str_hash
, g_str_equal
,
1066 main_window_destroy_hash_key
,
1067 main_window_destroy_hash_data
);
1069 insert_menu_toolbar_item(new_m_window
, NULL
);
1071 g_object_set_data(G_OBJECT(new_window
), "mainWindow", (gpointer
)new_m_window
);
1073 //create a default tab
1074 notebook
= (GtkNotebook
*)lookup_widget(new_m_window
->MWindow
, "MNotebook");
1075 if(notebook
== NULL
){
1076 g_printf("Notebook does not exist\n");
1079 //for now there is no name field in LttvTraceset structure
1080 //Use "Traceset" as the label for the default tab
1081 create_tab(new_m_window
->MWindow
, notebook
,"Traceset");
1083 g_object_set_data_full(
1084 G_OBJECT(new_m_window
->MWindow
),
1087 (GDestroyNotify
)main_window_free
);
1092 void tab_destructor(tab
* tab_instance
)
1094 if(tab_instance
->Attributes
)
1095 g_object_unref(tab_instance
->Attributes
);
1097 if(tab_instance
->mw
->Tab
== tab_instance
){
1098 tab_instance
->mw
->Tab
= tab_instance
->Next
;
1100 tab
* tmp1
, *tmp
= tab_instance
->mw
->Tab
;
1101 while(tmp
!= tab_instance
){
1105 tmp1
->Next
= tab_instance
->Next
;
1107 g_free(tab_instance
);
1110 void * create_tab(GtkWidget
* parent
, GtkNotebook
* notebook
, char * label
)
1114 mainWindow
* mw_data
;
1117 mw_data
= get_window_data_struct(parent
);
1118 tmp_tab
= mw_data
->Tab
;
1119 while(tmp_tab
&& tmp_tab
->Next
) tmp_tab
= tmp_tab
->Next
;
1121 mw_data
->CurrentTab
= NULL
;
1122 tmp_tab
= g_new(tab
,1);
1123 mw_data
->Tab
= tmp_tab
;
1125 tmp_tab
->Next
= g_new(tab
,1);
1126 tmp_tab
= tmp_tab
->Next
;
1128 if(mw_data
->CurrentTab
){
1129 // Will have to read directly at the main window level, as we want
1130 // to be able to modify a traceset on the fly.
1131 // tmp_tab->traceStartTime = mw_data->CurrentTab->traceStartTime;
1132 // tmp_tab->traceEndTime = mw_data->CurrentTab->traceEndTime;
1133 tmp_tab
->Time_Window
= mw_data
->CurrentTab
->Time_Window
;
1134 tmp_tab
->currentTime
= mw_data
->CurrentTab
->currentTime
;
1136 // Will have to read directly at the main window level, as we want
1137 // to be able to modify a traceset on the fly.
1138 // getTracesetTimeSpan(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
1139 tmp_tab
->Time_Window
.startTime
=
1140 LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
)->Time_Span
->startTime
;
1141 if(DEFAULT_TIME_WIDTH_S
<
1142 LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
)->Time_Span
->endTime
.tv_sec
)
1143 tmp_time
.tv_sec
= DEFAULT_TIME_WIDTH_S
;
1146 LTTV_TRACESET_CONTEXT(mw_data
->Traceset_Info
->TracesetContext
)->Time_Span
->endTime
.tv_sec
;
1147 tmp_time
.tv_nsec
= 0;
1148 tmp_tab
->Time_Window
.Time_Width
= tmp_time
;
1149 tmp_tab
->currentTime
.tv_sec
= tmp_time
.tv_sec
/ 2;
1150 tmp_tab
->currentTime
.tv_nsec
= 0 ;
1152 tmp_tab
->Attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
1153 // mw_data->CurrentTab = tmp_tab;
1154 tmp_tab
->custom
= (GtkCustom
*)gtk_custom_new();
1155 tmp_tab
->custom
->mw
= mw_data
;
1156 gtk_widget_show((GtkWidget
*)tmp_tab
->custom
);
1157 tmp_tab
->Next
= NULL
;
1158 tmp_tab
->mw
= mw_data
;
1160 tmp_tab
->label
= gtk_label_new (label
);
1161 gtk_widget_show (tmp_tab
->label
);
1163 g_object_set_data_full(
1164 G_OBJECT(tmp_tab
->custom
),
1167 (GDestroyNotify
)tab_destructor
);
1169 gtk_notebook_append_page(notebook
, (GtkWidget
*)tmp_tab
->custom
, tmp_tab
->label
);
1170 list
= gtk_container_get_children(GTK_CONTAINER(notebook
));
1171 gtk_notebook_set_current_page(notebook
,g_list_length(list
)-1);
1174 void remove_menu_item(gpointer main_win
, gpointer user_data
)
1176 mainWindow
* mw
= (mainWindow
*) main_win
;
1177 lttv_menu_closure
*menu_item
= (lttv_menu_closure
*)user_data
;
1178 GtkWidget
* tool_menu_title_menu
, *insert_view
;
1180 tool_menu_title_menu
= lookup_widget(mw
->MWindow
,"ToolMenuTitle_menu");
1181 insert_view
= (GtkWidget
*)g_hash_table_lookup(mw
->hash_menu_item
,
1182 menu_item
->menuText
);
1184 g_hash_table_remove(mw
->hash_menu_item
, menu_item
->menuText
);
1185 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1189 void remove_toolbar_item(gpointer main_win
, gpointer user_data
)
1191 mainWindow
* mw
= (mainWindow
*) main_win
;
1192 lttv_toolbar_closure
*toolbar_item
= (lttv_toolbar_closure
*)user_data
;
1193 GtkWidget
* tool_menu_title_menu
, *insert_view
;
1196 tool_menu_title_menu
= lookup_widget(mw
->MWindow
,"MToolbar2");
1197 insert_view
= (GtkWidget
*)g_hash_table_lookup(mw
->hash_toolbar_item
,
1198 toolbar_item
->tooltip
);
1200 g_hash_table_remove(mw
->hash_toolbar_item
, toolbar_item
->tooltip
);
1201 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu
), insert_view
);
1206 * Remove menu and toolbar item when a module unloaded
1209 void main_window_remove_menu_item(lttv_constructor constructor
)
1213 lttv_menu_closure
*menu_item
;
1214 LttvAttributeValue value
;
1215 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1217 g_assert(lttv_iattribute_find_by_path(attributes
,
1218 "viewers/menu", LTTV_POINTER
, &value
));
1219 menu
= (LttvMenus
*)*(value
.v_pointer
);
1222 for(i
=0;i
<menu
->len
;i
++){
1223 menu_item
= &g_array_index(menu
, lttv_menu_closure
, i
);
1224 if(menu_item
->con
!= constructor
) continue;
1225 if(g_main_window_list
){
1226 g_slist_foreach(g_main_window_list
, remove_menu_item
, menu_item
);
1234 void main_window_remove_toolbar_item(lttv_constructor constructor
)
1237 LttvToolbars
* toolbar
;
1238 lttv_toolbar_closure
*toolbar_item
;
1239 LttvAttributeValue value
;
1240 LttvIAttribute
*attributes
= LTTV_IATTRIBUTE(lttv_global_attributes());
1242 g_assert(lttv_iattribute_find_by_path(attributes
,
1243 "viewers/toolbar", LTTV_POINTER
, &value
));
1244 toolbar
= (LttvToolbars
*)*(value
.v_pointer
);
1247 for(i
=0;i
<toolbar
->len
;i
++){
1248 toolbar_item
= &g_array_index(toolbar
, lttv_toolbar_closure
, i
);
1249 if(toolbar_item
->con
!= constructor
) continue;
1250 if(g_main_window_list
){
1251 g_slist_foreach(g_main_window_list
, remove_toolbar_item
, toolbar_item
);