main window call process_traceset for each viewer
[lttv.git] / ltt / branches / poly / lttv / modules / gui / mainWin / src / callbacks.c
CommitLineData
561eba2a 1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <gtk/gtk.h>
6#include <gmodule.h>
7
8#include "callbacks.h"
9#include "interface.h"
10#include "support.h"
95cd67ef 11#include <lttv/mainWindow.h>
37d0eca6 12#include <lttv/menu.h>
13#include <lttv/toolbar.h>
58960b51 14#include <lttv/gtkTraceSet.h>
6b1d3120 15#include <lttv/module.h>
fc188b78 16#include <lttv/gtkdirsel.h>
f7afe191 17#include <lttv/iattribute.h>
49bf71b5 18#include <lttv/lttvfilter.h>
a5dcde2f 19#include <ltt/trace.h>
6b1d3120 20
f7afe191 21#define PATH_LENGTH 256
22#define DEFAULT_TIME_WIDTH_S 1
23
49bf71b5 24extern LttvTrace *g_init_trace ;
561eba2a 25
ec25ff5e 26
27/** Array containing instanced objects. */
68b48a45 28extern GSList * g_main_window_list;
561eba2a 29
68b48a45 30static int g_win_count = 0;
7a859036 31
bca3b81f 32MainWindow * get_window_data_struct(GtkWidget * widget);
36b3c068 33char * get_unload_module(char ** loaded_module_name, int nb_module);
2176f952 34char * get_remove_trace(char ** all_trace_name, int nb_trace);
35char * get_selection(char ** all_name, int nb, char *title, char * column_title);
49bf71b5 36void get_filter_selection(LttvTracesetSelector *s, char *title, char * column_title);
716e4367 37void * create_tab(MainWindow * parent, MainWindow * current_window,
38 GtkNotebook * notebook, char * label);
561eba2a 39
68b48a45 40void insert_viewer(GtkWidget* widget, view_constructor constructor);
49bf71b5 41void update_filter(LttvTracesetSelector *s, GtkTreeStore *store );
42
43void checkbox_changed(GtkTreeView *treeview,
44 GtkTreePath *arg1,
45 GtkTreeViewColumn *arg2,
46 gpointer user_data);
47void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i);
48void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * trace);
49
50LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset);
51
202f6c8f 52void redraw_viewer(MainWindow * mw_data, TimeWindow * time_window, unsigned nb_events);
53
54
49bf71b5 55enum {
56 CHECKBOX_COLUMN,
57 NAME_COLUMN,
58 TOTAL_COLUMNS
59};
561eba2a 60
36b3c068 61enum
62{
63 MODULE_COLUMN,
64 N_COLUMNS
65};
66
561eba2a 67
49bf71b5 68LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
69{
70 LttvTracesetSelector * s;
71 LttvTraceSelector * trace;
72 LttvTracefileSelector * tracefile;
73 int i, j, nb_trace, nb_tracefile, nb_control, nb_per_cpu;
74 LttvTrace * trace_v;
75 LttTrace * t;
76 LttTracefile *tf;
77
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;
88
89 for(j = 0 ; j < nb_tracefile ; j++) {
90 if(j < nb_control)
91 tf = ltt_trace_control_tracefile_get(t, j);
92 else
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);
96 }
97 }
98 return s;
99}
100
561eba2a 101void
606309a4 102insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
561eba2a 103{
606309a4 104 GdkWindow * win;
105 GdkCursor * new;
561eba2a 106 guint val = 20;
606309a4 107 GtkWidget* widget = menuitem;
606309a4 108
109 new = gdk_cursor_new(GDK_X_CURSOR);
110 if(GTK_IS_MENU_ITEM(menuitem)){
111 widget = lookup_widget(menuitem, "MToolbar2");
112 }
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);
118
68b48a45 119 insert_viewer((GtkWidget*)menuitem, (view_constructor)user_data);
37d0eca6 120 // selected_hook(&val);
606309a4 121
122 gdk_window_set_cursor(win, NULL);
561eba2a 123}
124
561eba2a 125
126/* internal functions */
68b48a45 127void insert_viewer(GtkWidget* widget, view_constructor constructor)
561eba2a 128{
daecc161 129 GtkMultiVPaned * multi_vpaned;
bca3b81f 130 MainWindow * mw_data;
f9334f6f 131 GtkWidget * viewer;
49bf71b5 132 LttvTracesetSelector * s;
202f6c8f 133 unsigned * size;
134 TimeInterval * time_interval;
135 TimeWindow time_window;
561eba2a 136
68b48a45 137 mw_data = get_window_data_struct(widget);
bca3b81f 138 if(!mw_data->current_tab) return;
daecc161 139 multi_vpaned = mw_data->current_tab->multi_vpaned;
561eba2a 140
49bf71b5 141 s = construct_traceset_selector(mw_data->current_tab->traceset_info->traceset);
142 viewer = (GtkWidget*)constructor(mw_data, s, "Traceset_Selector");
f9334f6f 143 if(viewer)
f0d936c0 144 {
daecc161 145 gtk_multi_vpaned_widget_add(multi_vpaned, viewer);
f0d936c0 146 // Added by MD
8af8e4c5 147 // g_object_unref(G_OBJECT(viewer));
202f6c8f 148
149 size = (unsigned*)g_object_get_data(G_OBJECT(viewer), MAX_NUMBER_EVENT);
150 if(size == NULL) *size = G_MAXULONG;
151
152 time_window = mw_data->current_tab->time_window;
153 time_interval = (TimeInterval*)g_object_get_data(G_OBJECT(viewer), TRACESET_TIME_SPAN);
154 if(time_interval){
155 time_window.start_time = time_interval->startTime;
156 time_window.time_width = ltt_time_sub(time_interval->endTime,time_interval->startTime);
157 }
158
159 redraw_viewer(mw_data,&time_window, *size);
160 set_current_time(mw_data,&(mw_data->current_tab->current_time));
f0d936c0 161 }
561eba2a 162}
163
164void get_label_string (GtkWidget * text, gchar * label)
165{
166 GtkEntry * entry = (GtkEntry*)text;
167 if(strlen(gtk_entry_get_text(entry))!=0)
168 strcpy(label,gtk_entry_get_text(entry));
169}
170
716e4367 171void get_label(MainWindow * mw, gchar * str, gchar* dialogue_title, gchar * label_str)
561eba2a 172{
173 GtkWidget * dialogue;
174 GtkWidget * text;
175 GtkWidget * label;
176 gint id;
177
5723fa24 178 dialogue = gtk_dialog_new_with_buttons(dialogue_title,NULL,
561eba2a 179 GTK_DIALOG_MODAL,
180 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
181 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
182 NULL);
183
6b1d3120 184 label = gtk_label_new(label_str);
561eba2a 185 gtk_widget_show(label);
186
187 text = gtk_entry_new();
188 gtk_widget_show(text);
189
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);
192
193 id = gtk_dialog_run(GTK_DIALOG(dialogue));
194 switch(id){
195 case GTK_RESPONSE_ACCEPT:
196 get_label_string(text,str);
197 gtk_widget_destroy(dialogue);
198 break;
199 case GTK_RESPONSE_REJECT:
200 default:
201 gtk_widget_destroy(dialogue);
202 break;
203 }
204}
205
bca3b81f 206MainWindow * get_window_data_struct(GtkWidget * widget)
561eba2a 207{
208 GtkWidget * mw;
bca3b81f 209 MainWindow * mw_data;
561eba2a 210
211 mw = lookup_widget(widget, "MWindow");
212 if(mw == NULL){
213 g_printf("Main window does not exist\n");
214 return;
215 }
216
bca3b81f 217 mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"mainWindow");
68b48a45 218 if(mw_data == NULL){
561eba2a 219 g_printf("Main window data does not exist\n");
220 return;
221 }
68b48a45 222 return mw_data;
561eba2a 223}
224
68b48a45 225void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
561eba2a 226{
bca3b81f 227 MainWindow * parent = get_window_data_struct(widget);
561eba2a 228
561eba2a 229 if(clone){
230 g_printf("Clone : use the same traceset\n");
716e4367 231 construct_main_window(parent, NULL);
561eba2a 232 }else{
233 g_printf("Empty : traceset is set to NULL\n");
716e4367 234 construct_main_window(NULL, parent->win_creation_data);
561eba2a 235 }
236}
237
238void move_up_viewer(GtkWidget * widget, gpointer user_data)
239{
bca3b81f 240 MainWindow * mw = get_window_data_struct(widget);
241 if(!mw->current_tab) return;
daecc161 242 gtk_multi_vpaned_widget_move_up(mw->current_tab->multi_vpaned);
561eba2a 243}
244
245void move_down_viewer(GtkWidget * widget, gpointer user_data)
246{
bca3b81f 247 MainWindow * mw = get_window_data_struct(widget);
248 if(!mw->current_tab) return;
daecc161 249 gtk_multi_vpaned_widget_move_down(mw->current_tab->multi_vpaned);
561eba2a 250}
251
252void delete_viewer(GtkWidget * widget, gpointer user_data)
253{
bca3b81f 254 MainWindow * mw = get_window_data_struct(widget);
255 if(!mw->current_tab) return;
daecc161 256 gtk_multi_vpaned_widget_delete(mw->current_tab->multi_vpaned);
561eba2a 257}
258
259void open_traceset(GtkWidget * widget, gpointer user_data)
260{
2176f952 261 char ** dir;
262 gint id;
263 LttvTraceset * traceset;
bca3b81f 264 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 265 GtkFileSelection * file_selector =
2176f952 266 (GtkFileSelection *)gtk_file_selection_new("Select a traceset");
267
68b48a45 268 gtk_file_selection_hide_fileop_buttons(file_selector);
c64c7ea1 269
68b48a45 270 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 271 switch(id){
272 case GTK_RESPONSE_ACCEPT:
273 case GTK_RESPONSE_OK:
68b48a45 274 dir = gtk_file_selection_get_selections (file_selector);
2176f952 275 traceset = lttv_traceset_load(dir[0]);
276 g_printf("Open a trace set %s\n", dir[0]);
277 //Not finished yet
278 g_strfreev(dir);
279 case GTK_RESPONSE_REJECT:
280 case GTK_RESPONSE_CANCEL:
281 default:
68b48a45 282 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 283 break;
284 }
c64c7ea1 285
561eba2a 286}
287
202f6c8f 288void redraw_viewer(MainWindow * mw_data, TimeWindow * time_window, unsigned nb_events)
289{
290 //update time window of each viewer, let viewer insert hooks needed by process_traceset
291 set_time_window(mw_data, time_window);
292
293 process_traceset_api(mw_data, time_window->start_time,
294 ltt_time_add(time_window->start_time,time_window->time_width),
295 nb_events);
296
297 //call hooks to show each viewer and let them remove hooks
298 show_viewer(mw_data);
299}
300
49bf71b5 301void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * t)
302{
303 int j, nb_tracefile, nb_control, nb_per_cpu;
304 LttvTracesetSelector * s;
305 LttvTraceSelector * trace;
306 LttvTracefileSelector * tracefile;
307 LttTracefile * tf;
308 GtkWidget * w;
309
310 w = gtk_multi_vpaned_get_first_widget(paned);
311 while(w){
312 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
313
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;
319
320 for(j = 0 ; j < nb_tracefile ; j++) {
321 if(j < nb_control)
322 tf = ltt_trace_control_tracefile_get(t, j);
323 else
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);
327 }
328
329 w = gtk_multi_vpaned_get_next_widget(paned);
330 }
331}
332
561eba2a 333void add_trace(GtkWidget * widget, gpointer user_data)
334{
2176f952 335 LttTrace *trace;
336 LttvTrace * trace_v;
337 LttvTraceset * traceset;
338 char * dir;
339 gint id;
bca3b81f 340 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 341 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
342 gtk_dir_selection_hide_fileop_buttons(file_selector);
2176f952 343
68b48a45 344 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 345 switch(id){
346 case GTK_RESPONSE_ACCEPT:
347 case GTK_RESPONSE_OK:
68b48a45 348 dir = gtk_dir_selection_get_dir (file_selector);
2176f952 349 trace = ltt_trace_open(dir);
350 if(trace == NULL) g_critical("cannot open trace %s", dir);
351 trace_v = lttv_trace_new(trace);
716e4367 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);
2176f952 357 }
358 lttv_traceset_add(traceset, trace_v);
716e4367 359 mw_data->current_tab->traceset_info->traceset_context =
2176f952 360 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
361 lttv_context_init(
716e4367 362 LTTV_TRACESET_CONTEXT(mw_data->current_tab->traceset_info->
49bf71b5 363 traceset_context),traceset);
364 add_trace_into_traceset_selector(mw_data->current_tab->multi_vpaned, trace);
365
366 gtk_widget_destroy((GtkWidget*)file_selector);
367
368 //update current tab
202f6c8f 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));
49bf71b5 371 break;
2176f952 372 case GTK_RESPONSE_REJECT:
373 case GTK_RESPONSE_CANCEL:
374 default:
68b48a45 375 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 376 break;
377 }
49bf71b5 378}
379
380void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i)
381{
382 LttvTracesetSelector * s;
383 LttvTraceSelector * t;
384 GtkWidget * w;
385
386 w = gtk_multi_vpaned_get_first_widget(paned);
387 while(w){
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);
393 }
561eba2a 394}
395
396void remove_trace(GtkWidget * widget, gpointer user_data)
397{
2176f952 398 LttTrace *trace;
399 LttvTrace * trace_v;
400 LttvTraceset * traceset;
401 gint i, nb_trace;
402 char ** name, *remove_trace_name;
bca3b81f 403 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 404 LttvTracesetSelector * s;
405 LttvTraceSelector * t;
406 GtkWidget * w;
407 gboolean selected;
2176f952 408
716e4367 409 nb_trace =lttv_traceset_number(mw_data->current_tab->traceset_info->traceset);
2176f952 410 name = g_new(char*,nb_trace);
411 for(i = 0; i < nb_trace; i++){
716e4367 412 trace_v = lttv_traceset_get(mw_data->current_tab->
413 traceset_info->traceset, i);
2176f952 414 trace = lttv_trace(trace_v);
a5dcde2f 415 name[i] = ltt_trace_name(trace);
2176f952 416 }
417
418 remove_trace_name = get_remove_trace(name, nb_trace);
419
420 if(remove_trace_name){
421 for(i=0; i<nb_trace; i++){
422 if(strcmp(remove_trace_name,name[i]) == 0){
49bf71b5 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);
428
429 //check if other viewers select the trace
430 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
431 while(w){
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);
435 if(selected)break;
436 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
437 }
438
439 //if no viewer selects the trace, remove it
440 if(!selected){
441 remove_trace_from_traceset_selector(mw_data->current_tab->multi_vpaned, i);
442
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));
447
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);
452 }
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);
457 lttv_context_init(
458 LTTV_TRACESET_CONTEXT(mw_data->current_tab->
459 traceset_info->traceset_context),traceset);
460 //update current tab
202f6c8f 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));
2176f952 463 }
2176f952 464 break;
465 }
466 }
467 }
468
469 g_free(name);
561eba2a 470}
471
472void save(GtkWidget * widget, gpointer user_data)
473{
474 g_printf("Save\n");
475}
476
477void save_as(GtkWidget * widget, gpointer user_data)
478{
479 g_printf("Save as\n");
480}
481
1f1ae829 482void zoom(GtkWidget * widget, double size)
483{
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);
488
716e4367 489 time_span = LTTV_TRACESET_CONTEXT(mw_data->current_tab->
490 traceset_info->traceset_context)->Time_Span;
1f1ae829 491 time_window = mw_data->current_tab->time_window;
492 current_time = mw_data->current_tab->current_time;
493
494 time_delta = ltt_time_sub(time_span->endTime,time_span->startTime);
495 if(size == 0){
496 time_window.start_time = time_span->startTime;
497 time_window.time_width = time_delta;
498 }else{
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;
502
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);
510 }
511 time_window.start_time = time_s;
512 }
202f6c8f 513 redraw_viewer(mw_data, &time_window, G_MAXULONG);
514 set_current_time(mw_data,&(mw_data->current_tab->current_time));
daecc161 515 gtk_multi_vpaned_set_adjust(mw_data->current_tab->multi_vpaned, FALSE);
1f1ae829 516}
517
561eba2a 518void zoom_in(GtkWidget * widget, gpointer user_data)
519{
1f1ae829 520 zoom(widget, 2);
561eba2a 521}
522
523void zoom_out(GtkWidget * widget, gpointer user_data)
524{
1f1ae829 525 zoom(widget, 0.5);
561eba2a 526}
527
528void zoom_extended(GtkWidget * widget, gpointer user_data)
529{
1f1ae829 530 zoom(widget, 0);
561eba2a 531}
532
533void go_to_time(GtkWidget * widget, gpointer user_data)
534{
535 g_printf("Go to time\n");
536}
537
538void show_time_frame(GtkWidget * widget, gpointer user_data)
539{
540 g_printf("Show time frame\n");
541}
542
543
544/* callback function */
545
546void
547on_empty_traceset_activate (GtkMenuItem *menuitem,
548 gpointer user_data)
549{
68b48a45 550 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 551}
552
553
554void
555on_clone_traceset_activate (GtkMenuItem *menuitem,
556 gpointer user_data)
557{
68b48a45 558 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 559}
560
561
562void
563on_tab_activate (GtkMenuItem *menuitem,
564 gpointer user_data)
565{
6b1d3120 566 gchar label[PATH_LENGTH];
716e4367 567 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
561eba2a 568 GtkNotebook * notebook = (GtkNotebook *)lookup_widget((GtkWidget*)menuitem, "MNotebook");
569 if(notebook == NULL){
570 g_printf("Notebook does not exist\n");
571 return;
572 }
573
6b1d3120 574 strcpy(label,"Page");
716e4367 575 get_label(mw_data, label,"Get the name of the tab","Please input tab's name");
561eba2a 576
716e4367 577 create_tab (mw_data, mw_data, notebook, label);
561eba2a 578}
579
580
581void
582on_open_activate (GtkMenuItem *menuitem,
583 gpointer user_data)
584{
585 open_traceset((GtkWidget*)menuitem, user_data);
586}
587
588
589void
590on_close_activate (GtkMenuItem *menuitem,
591 gpointer user_data)
592{
bca3b81f 593 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 594 main_window_destructor(mw_data);
561eba2a 595}
596
597
598void
599on_close_tab_activate (GtkMenuItem *menuitem,
600 gpointer user_data)
601{
2061e03d 602 int count = 0;
603 GtkWidget * notebook;
bca3b81f 604 Tab * tmp;
605 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2061e03d 606 notebook = lookup_widget((GtkWidget*)menuitem, "MNotebook");
607 if(notebook == NULL){
608 g_printf("Notebook does not exist\n");
609 return;
610 }
611
bca3b81f 612 if(mw_data->tab == mw_data->current_tab){
613 // tmp = mw_data->current_tb;
614 // mw_data->tab = mw_data->current_tab->next;
2061e03d 615 g_printf("The default TAB can not be deleted\n");
616 return;
617 }else{
bca3b81f 618 tmp = mw_data->tab;
619 while(tmp != mw_data->current_tab){
620 tmp = tmp->next;
2061e03d 621 count++;
622 }
623 }
624
625 gtk_notebook_remove_page((GtkNotebook*)notebook, count);
561eba2a 626}
627
628
629void
630on_add_trace_activate (GtkMenuItem *menuitem,
631 gpointer user_data)
632{
633 add_trace((GtkWidget*)menuitem, user_data);
634}
635
636
637void
638on_remove_trace_activate (GtkMenuItem *menuitem,
639 gpointer user_data)
640{
641 remove_trace((GtkWidget*)menuitem, user_data);
642}
643
644
645void
646on_save_activate (GtkMenuItem *menuitem,
647 gpointer user_data)
648{
649 save((GtkWidget*)menuitem, user_data);
650}
651
652
653void
654on_save_as_activate (GtkMenuItem *menuitem,
655 gpointer user_data)
656{
657 save_as((GtkWidget*)menuitem, user_data);
658}
659
660
661void
662on_quit_activate (GtkMenuItem *menuitem,
663 gpointer user_data)
664{
2061e03d 665 gtk_main_quit ();
561eba2a 666}
667
668
669void
670on_cut_activate (GtkMenuItem *menuitem,
671 gpointer user_data)
672{
673 g_printf("Cut\n");
674}
675
676
677void
678on_copy_activate (GtkMenuItem *menuitem,
679 gpointer user_data)
680{
681 g_printf("Copye\n");
682}
683
684
685void
686on_paste_activate (GtkMenuItem *menuitem,
687 gpointer user_data)
688{
689 g_printf("Paste\n");
690}
691
692
693void
694on_delete_activate (GtkMenuItem *menuitem,
695 gpointer user_data)
696{
697 g_printf("Delete\n");
698}
699
700
701void
702on_zoom_in_activate (GtkMenuItem *menuitem,
703 gpointer user_data)
704{
705 zoom_in((GtkWidget*)menuitem, user_data);
706}
707
708
709void
710on_zoom_out_activate (GtkMenuItem *menuitem,
711 gpointer user_data)
712{
713 zoom_out((GtkWidget*)menuitem, user_data);
714}
715
716
717void
718on_zoom_extended_activate (GtkMenuItem *menuitem,
719 gpointer user_data)
720{
721 zoom_extended((GtkWidget*)menuitem, user_data);
722}
723
724
725void
726on_go_to_time_activate (GtkMenuItem *menuitem,
727 gpointer user_data)
728{
729 go_to_time((GtkWidget*)menuitem, user_data);
730}
731
732
733void
734on_show_time_frame_activate (GtkMenuItem *menuitem,
735 gpointer user_data)
736{
737 show_time_frame((GtkWidget*)menuitem, user_data);
738}
739
740
741void
742on_move_viewer_up_activate (GtkMenuItem *menuitem,
743 gpointer user_data)
744{
745 move_up_viewer((GtkWidget*)menuitem, user_data);
746}
747
748
749void
750on_move_viewer_down_activate (GtkMenuItem *menuitem,
751 gpointer user_data)
752{
753 move_down_viewer((GtkWidget*)menuitem, user_data);
754}
755
756
757void
758on_remove_viewer_activate (GtkMenuItem *menuitem,
759 gpointer user_data)
760{
761 delete_viewer((GtkWidget*)menuitem, user_data);
762}
763
49bf71b5 764void
765on_trace_filter_activate (GtkMenuItem *menuitem,
766 gpointer user_data)
767{
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);
771
772 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
773 if(!s){
774 g_printf("There is no viewer yet\n");
775 return;
776 }
777 get_filter_selection(s, "Configure trace and tracefile filter", "Select traces and tracefiles");
778}
779
780void
781on_trace_facility_activate (GtkMenuItem *menuitem,
782 gpointer user_data)
783{
784 g_printf("Trace facility selector: %s\n");
785}
561eba2a 786
787void
788on_load_module_activate (GtkMenuItem *menuitem,
789 gpointer user_data)
790{
36b3c068 791 char ** dir;
792 gint id;
3872a20e 793 char str[PATH_LENGTH], *str1;
bca3b81f 794 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 795 GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a module");
796 gtk_file_selection_hide_fileop_buttons(file_selector);
36b3c068 797
798 str[0] = '\0';
68b48a45 799 id = gtk_dialog_run(GTK_DIALOG(file_selector));
36b3c068 800 switch(id){
801 case GTK_RESPONSE_ACCEPT:
802 case GTK_RESPONSE_OK:
68b48a45 803 dir = gtk_file_selection_get_selections (file_selector);
36b3c068 804 sprintf(str,dir[0]);
3872a20e 805 str1 = strrchr(str,'/');
806 if(str1)str1++;
807 else{
808 str1 = strrchr(str,'\\');
809 str1++;
810 }
bca3b81f 811 if(mw_data->win_creation_data)
812 lttv_module_load(str1, mw_data->win_creation_data->argc,mw_data->win_creation_data->argv);
36b3c068 813 else
3872a20e 814 lttv_module_load(str1, 0,NULL);
68b48a45 815 g_slist_foreach(g_main_window_list, insert_menu_toolbar_item, NULL);
36b3c068 816 g_strfreev(dir);
817 case GTK_RESPONSE_REJECT:
818 case GTK_RESPONSE_CANCEL:
819 default:
68b48a45 820 gtk_widget_destroy((GtkWidget*)file_selector);
36b3c068 821 break;
822 }
823 g_printf("Load module: %s\n", str);
561eba2a 824}
825
826
827void
828on_unload_module_activate (GtkMenuItem *menuitem,
829 gpointer user_data)
830{
36b3c068 831 int i;
832 char **name, *unload_module_name;
833 guint nb;
834 LttvModule ** modules, *module;
bca3b81f 835 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
36b3c068 836
837 modules = lttv_module_list(&nb);
838 name = g_new(char*, nb);
839 for(i=0;i<nb;i++){
840 module = modules[i];
841 name[i] = lttv_module_name(module);
842 }
843
844 unload_module_name =get_unload_module(name,nb);
845
846 if(unload_module_name){
847 for(i=0;i<nb;i++){
848 if(strcmp(unload_module_name, name[i]) == 0){
849 lttv_module_unload(modules[i]);
850 break;
851 }
852 }
853 }
854
855 g_free(name);
561eba2a 856}
857
858
859void
860on_add_module_search_path_activate (GtkMenuItem *menuitem,
861 gpointer user_data)
862{
68b48a45 863 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select module path");
fc188b78 864 char * dir;
865 gint id;
866
bca3b81f 867 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
fc188b78 868
68b48a45 869 id = gtk_dialog_run(GTK_DIALOG(file_selector));
fc188b78 870 switch(id){
871 case GTK_RESPONSE_ACCEPT:
872 case GTK_RESPONSE_OK:
68b48a45 873 dir = gtk_dir_selection_get_dir (file_selector);
fc188b78 874 lttv_module_path_add(dir);
875 case GTK_RESPONSE_REJECT:
876 case GTK_RESPONSE_CANCEL:
877 default:
68b48a45 878 gtk_widget_destroy((GtkWidget*)file_selector);
fc188b78 879 break;
6b1d3120 880 }
561eba2a 881}
882
883
884void
885on_color_activate (GtkMenuItem *menuitem,
886 gpointer user_data)
887{
888 g_printf("Color\n");
889}
890
891
892void
893on_filter_activate (GtkMenuItem *menuitem,
894 gpointer user_data)
895{
896 g_printf("Filter\n");
897}
898
899
900void
901on_save_configuration_activate (GtkMenuItem *menuitem,
902 gpointer user_data)
903{
904 g_printf("Save configuration\n");
905}
906
907
908void
909on_content_activate (GtkMenuItem *menuitem,
910 gpointer user_data)
911{
912 g_printf("Content\n");
913}
914
915
916void
917on_about_activate (GtkMenuItem *menuitem,
918 gpointer user_data)
919{
920 g_printf("About...\n");
921}
922
923
924void
925on_button_new_clicked (GtkButton *button,
926 gpointer user_data)
927{
68b48a45 928 create_new_window((GtkWidget*)button, user_data, FALSE);
561eba2a 929}
930
931
932void
933on_button_open_clicked (GtkButton *button,
934 gpointer user_data)
935{
936 open_traceset((GtkWidget*)button, user_data);
937}
938
939
940void
941on_button_add_trace_clicked (GtkButton *button,
942 gpointer user_data)
943{
944 add_trace((GtkWidget*)button, user_data);
945}
946
947
948void
949on_button_remove_trace_clicked (GtkButton *button,
950 gpointer user_data)
951{
952 remove_trace((GtkWidget*)button, user_data);
953}
954
955
956void
957on_button_save_clicked (GtkButton *button,
958 gpointer user_data)
959{
960 save((GtkWidget*)button, user_data);
961}
962
963
964void
965on_button_save_as_clicked (GtkButton *button,
966 gpointer user_data)
967{
968 save_as((GtkWidget*)button, user_data);
969}
970
971
972void
973on_button_zoom_in_clicked (GtkButton *button,
974 gpointer user_data)
975{
976 zoom_in((GtkWidget*)button, user_data);
977}
978
979
980void
981on_button_zoom_out_clicked (GtkButton *button,
982 gpointer user_data)
983{
984 zoom_out((GtkWidget*)button, user_data);
985}
986
987
988void
989on_button_zoom_extended_clicked (GtkButton *button,
990 gpointer user_data)
991{
992 zoom_extended((GtkWidget*)button, user_data);
993}
994
995
996void
997on_button_go_to_time_clicked (GtkButton *button,
998 gpointer user_data)
999{
1000 go_to_time((GtkWidget*)button, user_data);
1001}
1002
1003
1004void
1005on_button_show_time_frame_clicked (GtkButton *button,
1006 gpointer user_data)
1007{
1008 show_time_frame((GtkWidget*)button, user_data);
1009}
1010
1011
1012void
1013on_button_move_up_clicked (GtkButton *button,
1014 gpointer user_data)
1015{
1016 move_up_viewer((GtkWidget*)button, user_data);
1017}
1018
1019
1020void
1021on_button_move_down_clicked (GtkButton *button,
1022 gpointer user_data)
1023{
1024 move_down_viewer((GtkWidget*)button, user_data);
1025}
1026
1027
1028void
1029on_button_delete_viewer_clicked (GtkButton *button,
1030 gpointer user_data)
1031{
1032 delete_viewer((GtkWidget*)button, user_data);
1033}
1034
1035void
1036on_MWindow_destroy (GtkObject *object,
1037 gpointer user_data)
1038{
bca3b81f 1039 MainWindow *Main_Window = (MainWindow*)user_data;
f7afe191 1040
68b48a45 1041 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
561eba2a 1042
68b48a45 1043 g_win_count--;
1044 if(g_win_count == 0)
7a859036 1045 gtk_main_quit ();
561eba2a 1046}
1047
1048
1049void
1050on_MNotebook_switch_page (GtkNotebook *notebook,
1051 GtkNotebookPage *page,
1052 guint page_num,
1053 gpointer user_data)
1054{
bca3b81f 1055 MainWindow * mw = get_window_data_struct((GtkWidget*)notebook);
1056 Tab * tab = mw->tab;
561eba2a 1057
1058 while(page_num){
bca3b81f 1059 tab = tab->next;
561eba2a 1060 page_num--;
1061 }
bca3b81f 1062 mw->current_tab = tab;
561eba2a 1063}
1064
49bf71b5 1065void checkbox_changed(GtkTreeView *treeview,
1066 GtkTreePath *arg1,
1067 GtkTreeViewColumn *arg2,
1068 gpointer user_data)
1069{
1070 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
1071 GtkTreeIter iter;
1072 gboolean value;
1073
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);
1078 }
1079
1080}
1081
1082void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
1083{
1084 GtkTreeIter iter, child_iter;
1085 int i, j;
1086 LttvTraceSelector * trace;
1087 LttvTracefileSelector * tracefile;
1088 gboolean value, value1;
1089
1090 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
1091 i = 0;
1092 do{
1093 trace = lttv_traceset_selector_get(s, i);
1094 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
1095 if(value){
1096 j = 0;
1097 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
1098 do{
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);
1102 j++;
1103 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
1104 }
1105 }
1106 lttv_trace_selector_set_selected(trace,value);
1107 i++;
1108 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
1109 }
1110}
1111
1112void get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
1113{
1114 GtkWidget * dialogue;
1115 GtkTreeStore * store;
1116 GtkWidget * tree;
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;
1124 char * name;
1125 gboolean checked;
1126
1127 dialogue = gtk_dialog_new_with_buttons(title,
1128 NULL,
1129 GTK_DIALOG_MODAL,
1130 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1131 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1132 NULL);
1133 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 100);
1134
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),
1140 NULL);
1141
1142
1143 renderer = gtk_cell_renderer_toggle_new ();
1144 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
1145
1146 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
1147
1148 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
1149 renderer,
1150 "active", CHECKBOX_COLUMN,
1151 NULL);
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);
1155
1156 renderer = gtk_cell_renderer_text_new ();
1157 column = gtk_tree_view_column_new_with_attributes (column_title,
1158 renderer,
1159 "text", NAME_COLUMN,
1160 NULL);
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);
1164
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);
1169
1170 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1171
1172 gtk_widget_show(scroll_win);
1173 gtk_widget_show(tree);
1174
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,
1183 NAME_COLUMN,name,
1184 -1);
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,
1193 NAME_COLUMN,name,
1194 -1);
1195 }
1196 }
1197
1198 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1199 switch(id){
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:
1205 default:
1206 gtk_widget_destroy(dialogue);
1207 break;
1208 }
1209}
1210
2176f952 1211char * get_remove_trace(char ** all_trace_name, int nb_trace)
1212{
1213 return get_selection(all_trace_name, nb_trace,
1214 "Select a trace", "Trace pathname");
1215}
36b3c068 1216char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 1217{
1218 return get_selection(loaded_module_name, nb_module,
1219 "Select an unload module", "Module pathname");
1220}
1221
1222char * get_selection(char ** loaded_module_name, int nb_module,
1223 char *title, char * column_title)
36b3c068 1224{
1225 GtkWidget * dialogue;
1226 GtkWidget * scroll_win;
1227 GtkWidget * tree;
1228 GtkListStore * store;
1229 GtkTreeViewColumn * column;
1230 GtkCellRenderer * renderer;
1231 GtkTreeSelection * select;
1232 GtkTreeIter iter;
1233 gint id, i;
1234 char * unload_module_name = NULL;
1235
2176f952 1236 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 1237 NULL,
1238 GTK_DIALOG_MODAL,
1239 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1240 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1241 NULL);
1242 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
1243
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);
1248
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));
1253
1254 renderer = gtk_cell_renderer_text_new ();
2176f952 1255 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 1256 renderer,
1257 "text", MODULE_COLUMN,
1258 NULL);
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);
1262
1263 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
1264 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
1265
1266 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1267
1268 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1269
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);
1273 }
1274
1275 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1276 switch(id){
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);
1281 }
1282 case GTK_RESPONSE_REJECT:
1283 case GTK_RESPONSE_CANCEL:
1284 default:
1285 gtk_widget_destroy(dialogue);
1286 break;
1287 }
1288
1289 return unload_module_name;
1290}
5723fa24 1291
2176f952 1292void main_window_destroy_hash_key(gpointer key)
2061e03d 1293{
1294 g_free(key);
1295}
1296
2176f952 1297void main_window_destroy_hash_data(gpointer data)
2061e03d 1298{
1299}
1300
1301
bca3b81f 1302void insert_menu_toolbar_item(MainWindow * mw, gpointer user_data)
5723fa24 1303{
1304 int i;
1305 GdkPixbuf *pixbuf;
1306 view_constructor constructor;
1307 LttvMenus * menu;
1308 LttvToolbars * toolbar;
68b48a45 1309 lttv_menu_closure *menu_item;
1310 lttv_toolbar_closure *toolbar_item;
5723fa24 1311 LttvAttributeValue value;
1312 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
68b48a45 1313 GtkWidget * tool_menu_title_menu, *insert_view, *pixmap, *tmp;
5723fa24 1314
1315 g_assert(lttv_iattribute_find_by_path(attributes,
1316 "viewers/menu", LTTV_POINTER, &value));
1317 menu = (LttvMenus*)*(value.v_pointer);
1318
1319 if(menu){
1320 for(i=0;i<menu->len;i++){
68b48a45 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));
3872a20e 1323 if(tmp)continue;
68b48a45 1324 constructor = menu_item->con;
bca3b81f 1325 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
68b48a45 1326 insert_view = gtk_menu_item_new_with_mnemonic (menu_item->menuText);
5723fa24 1327 gtk_widget_show (insert_view);
68b48a45 1328 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu), insert_view);
5723fa24 1329 g_signal_connect ((gpointer) insert_view, "activate",
68b48a45 1330 G_CALLBACK (insert_viewer_wrap),
5723fa24 1331 constructor);
68b48a45 1332 g_hash_table_insert(mw->hash_menu_item, g_strdup(menu_item->menuText),
2061e03d 1333 insert_view);
5723fa24 1334 }
1335 }
1336
1337 g_assert(lttv_iattribute_find_by_path(attributes,
1338 "viewers/toolbar", LTTV_POINTER, &value));
1339 toolbar = (LttvToolbars*)*(value.v_pointer);
1340
1341 if(toolbar){
1342 for(i=0;i<toolbar->len;i++){
68b48a45 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));
3872a20e 1345 if(tmp)continue;
68b48a45 1346 constructor = toolbar_item->con;
bca3b81f 1347 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
68b48a45 1348 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item->pixmap);
5723fa24 1349 pixmap = gtk_image_new_from_pixbuf(pixbuf);
68b48a45 1350 insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
5723fa24 1351 GTK_TOOLBAR_CHILD_BUTTON,
1352 NULL,
1353 "",
68b48a45 1354 toolbar_item->tooltip, NULL,
5723fa24 1355 pixmap, NULL, NULL);
68b48a45 1356 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu)->children)->data))->label), TRUE);
5723fa24 1357 gtk_widget_show (insert_view);
1358 gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1);
68b48a45 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),
2061e03d 1361 insert_view);
5723fa24 1362 }
1363 }
1364}
1365
716e4367 1366void construct_main_window(MainWindow * parent, WindowCreationData * win_creation_data)
5723fa24 1367{
68b48a45 1368 g_critical("construct_main_window()");
1369 GtkWidget * new_window; /* New generated main window */
bca3b81f 1370 MainWindow * new_m_window;/* New main window structure */
5723fa24 1371 GtkNotebook * notebook;
f7afe191 1372 LttvIAttribute *attributes =
1373 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1374 LttvAttributeValue value;
2061e03d 1375
bca3b81f 1376 new_m_window = g_new(MainWindow, 1);
5723fa24 1377
1378 // Add the object's information to the module's array
68b48a45 1379 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 1380
f7afe191 1381
68b48a45 1382 new_window = create_MWindow();
1383 gtk_widget_show (new_window);
5723fa24 1384
bca3b81f 1385 new_m_window->attributes = attributes;
f7afe191 1386
bca3b81f 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));
5723fa24 1391 if(parent){
bca3b81f 1392 new_m_window->win_creation_data = parent->win_creation_data;
5723fa24 1393 }else{
bca3b81f 1394 new_m_window->win_creation_data = win_creation_data;
5723fa24 1395 }
1396
68b48a45 1397 new_m_window->hash_menu_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1398 main_window_destroy_hash_key,
1399 main_window_destroy_hash_data);
68b48a45 1400 new_m_window->hash_toolbar_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1401 main_window_destroy_hash_key,
1402 main_window_destroy_hash_data);
2061e03d 1403
68b48a45 1404 insert_menu_toolbar_item(new_m_window, NULL);
5723fa24 1405
68b48a45 1406 g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);
5723fa24 1407
1408 //create a default tab
bca3b81f 1409 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 1410 if(notebook == NULL){
1411 g_printf("Notebook does not exist\n");
1412 return;
1413 }
1414 //for now there is no name field in LttvTraceset structure
1415 //Use "Traceset" as the label for the default tab
716e4367 1416 create_tab(NULL, new_m_window, notebook,"Traceset");
5723fa24 1417
7a859036 1418 g_object_set_data_full(
bca3b81f 1419 G_OBJECT(new_m_window->mwindow),
7a859036 1420 "Main_Window_Data",
68b48a45 1421 new_m_window,
1422 (GDestroyNotify)main_window_free);
7a859036 1423
68b48a45 1424 g_win_count++;
5723fa24 1425}
1426
bca3b81f 1427void tab_destructor(Tab * tab_instance)
f7afe191 1428{
716e4367 1429 int i, nb, ref_count;
1430 LttvTrace * trace;
1431
bca3b81f 1432 if(tab_instance->attributes)
1433 g_object_unref(tab_instance->attributes);
2061e03d 1434
bca3b81f 1435 if(tab_instance->mw->tab == tab_instance){
1436 tab_instance->mw->tab = tab_instance->next;
2061e03d 1437 }else{
bca3b81f 1438 Tab * tmp1, *tmp = tab_instance->mw->tab;
68b48a45 1439 while(tmp != tab_instance){
2061e03d 1440 tmp1 = tmp;
bca3b81f 1441 tmp = tmp->next;
2061e03d 1442 }
bca3b81f 1443 tmp1->next = tab_instance->next;
2061e03d 1444 }
716e4367 1445
1446 if(tab_instance->traceset_info->traceset_context != NULL){
1447 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
1448 traceset_context));
1449 g_object_unref(tab_instance->traceset_info->traceset_context);
1450 }
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);
49bf71b5 1456 if(ref_count <= 1){
716e4367 1457 ltt_trace_close(lttv_trace(trace));
49bf71b5 1458 }
1459 lttv_trace_destroy(trace);
716e4367 1460 }
1461 }
1462 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
1463 g_free(tab_instance->traceset_info);
68b48a45 1464 g_free(tab_instance);
f7afe191 1465}
1466
716e4367 1467void * create_tab(MainWindow * parent, MainWindow* current_window,
1468 GtkNotebook * notebook, char * label)
5723fa24 1469{
1470 GList * list;
bca3b81f 1471 Tab * tmp_tab;
716e4367 1472 MainWindow * mw_data = current_window;
68b48a45 1473 LttTime tmp_time;
1474
bca3b81f 1475 tmp_tab = mw_data->tab;
1476 while(tmp_tab && tmp_tab->next) tmp_tab = tmp_tab->next;
68b48a45 1477 if(!tmp_tab){
bca3b81f 1478 mw_data->current_tab = NULL;
1479 tmp_tab = g_new(Tab,1);
1480 mw_data->tab = tmp_tab;
5723fa24 1481 }else{
bca3b81f 1482 tmp_tab->next = g_new(Tab,1);
1483 tmp_tab = tmp_tab->next;
5723fa24 1484 }
716e4367 1485
1486 tmp_tab->traceset_info = g_new(TracesetInfo,1);
1487 if(parent){
1488 tmp_tab->traceset_info->traceset =
1489 lttv_traceset_copy(parent->current_tab->traceset_info->traceset);
1490 }else{
1491 if(mw_data->current_tab){
1492 tmp_tab->traceset_info->traceset =
1493 lttv_traceset_copy(mw_data->current_tab->traceset_info->traceset);
1494 }else{
1495 tmp_tab->traceset_info->traceset = lttv_traceset_new();
49bf71b5 1496 /* Add the command line trace */
1497 if(g_init_trace != NULL)
1498 lttv_traceset_add(tmp_tab->traceset_info->traceset, g_init_trace);
716e4367 1499 }
716e4367 1500 }
1501 //FIXME copy not implemented in lower level
1502 tmp_tab->traceset_info->traceset_context =
1503 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1504 lttv_context_init(
1505 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context),
1506 tmp_tab->traceset_info->traceset);
1507
bca3b81f 1508 if(mw_data->current_tab){
716e4367 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.
bca3b81f 1511 tmp_tab->time_window = mw_data->current_tab->time_window;
1512 tmp_tab->current_time = mw_data->current_tab->current_time;
5723fa24 1513 }else{
716e4367 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);
bca3b81f 1517 tmp_tab->time_window.start_time =
716e4367 1518 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime;
f7afe191 1519 if(DEFAULT_TIME_WIDTH_S <
716e4367 1520 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec)
68b48a45 1521 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 1522 else
68b48a45 1523 tmp_time.tv_sec =
716e4367 1524 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec;
68b48a45 1525 tmp_time.tv_nsec = 0;
bca3b81f 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 ;
5723fa24 1529 }
bca3b81f 1530 tmp_tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1531 // mw_data->current_tab = tmp_tab;
daecc161 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);
bca3b81f 1535 tmp_tab->next = NULL;
68b48a45 1536 tmp_tab->mw = mw_data;
5723fa24 1537
68b48a45 1538 tmp_tab->label = gtk_label_new (label);
1539 gtk_widget_show (tmp_tab->label);
5723fa24 1540
f7afe191 1541 g_object_set_data_full(
daecc161 1542 G_OBJECT(tmp_tab->multi_vpaned),
f7afe191 1543 "Tab_Info",
68b48a45 1544 tmp_tab,
1545 (GDestroyNotify)tab_destructor);
5723fa24 1546
daecc161 1547 gtk_notebook_append_page(notebook, (GtkWidget*)tmp_tab->multi_vpaned, tmp_tab->label);
5723fa24 1548 list = gtk_container_get_children(GTK_CONTAINER(notebook));
1549 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
1550}
2061e03d 1551
1552void remove_menu_item(gpointer main_win, gpointer user_data)
1553{
bca3b81f 1554 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1555 lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data;
1556 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1557
bca3b81f 1558 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
2061e03d 1559 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item,
68b48a45 1560 menu_item->menuText);
2061e03d 1561 if(insert_view){
68b48a45 1562 g_hash_table_remove(mw->hash_menu_item, menu_item->menuText);
1563 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1564 }
1565}
1566
1567void remove_toolbar_item(gpointer main_win, gpointer user_data)
1568{
bca3b81f 1569 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1570 lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data;
1571 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1572
1573
bca3b81f 1574 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
2061e03d 1575 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item,
68b48a45 1576 toolbar_item->tooltip);
2061e03d 1577 if(insert_view){
68b48a45 1578 g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip);
1579 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1580 }
1581}
1582
1583/**
1584 * Remove menu and toolbar item when a module unloaded
1585 */
2176f952 1586
2061e03d 1587void main_window_remove_menu_item(lttv_constructor constructor)
1588{
1589 int i;
1590 LttvMenus * menu;
68b48a45 1591 lttv_menu_closure *menu_item;
2061e03d 1592 LttvAttributeValue value;
1593 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1594
1595 g_assert(lttv_iattribute_find_by_path(attributes,
1596 "viewers/menu", LTTV_POINTER, &value));
1597 menu = (LttvMenus*)*(value.v_pointer);
1598
1599 if(menu){
1600 for(i=0;i<menu->len;i++){
68b48a45 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);
2176f952 1605 }
2061e03d 1606 break;
1607 }
1608 }
1609
1610}
1611
1612void main_window_remove_toolbar_item(lttv_constructor constructor)
1613{
1614 int i;
1615 LttvToolbars * toolbar;
68b48a45 1616 lttv_toolbar_closure *toolbar_item;
2061e03d 1617 LttvAttributeValue value;
1618 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1619
1620 g_assert(lttv_iattribute_find_by_path(attributes,
1621 "viewers/toolbar", LTTV_POINTER, &value));
1622 toolbar = (LttvToolbars*)*(value.v_pointer);
1623
1624 if(toolbar){
1625 for(i=0;i<toolbar->len;i++){
68b48a45 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);
2176f952 1630 }
2061e03d 1631 break;
1632 }
1633 }
1634}
This page took 0.118399 seconds and 4 git commands to generate.