git-svn-id: http://ltt.polymtl.ca/svn@468 04897980-b3bd-0310-b5e0-8ef037075253
[lttv.git] / ltt / branches / poly / lttv / modules / gui / main / src / callbacks.c
1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 XangXiu Yang
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22
23 #include <gtk/gtk.h>
24 #include <gmodule.h>
25
26 #include "callbacks.h"
27 #include "interface.h"
28 #include "support.h"
29 #include <lttv/mainwindow.h>
30 #include <lttv/menu.h>
31 #include <lttv/toolbar.h>
32 #include <lttv/gtktraceset.h>
33 #include <lttv/module.h>
34 #include <lttv/gtkdirsel.h>
35 #include <lttv/iattribute.h>
36 #include <lttv/lttvfilter.h>
37 #include <ltt/trace.h>
38 #include <ltt/facility.h>
39
40 #define PATH_LENGTH 256
41 #define DEFAULT_TIME_WIDTH_S 1
42
43 extern LttvTrace *g_init_trace ;
44
45
46 /** Array containing instanced objects. */
47 extern GSList * g_main_window_list;
48
49 static int g_win_count = 0;
50
51 MainWindow * get_window_data_struct(GtkWidget * widget);
52 char * get_unload_module(char ** loaded_module_name, int nb_module);
53 char * get_remove_trace(char ** all_trace_name, int nb_trace);
54 char * get_selection(char ** all_name, int nb, char *title, char * column_title);
55 gboolean get_filter_selection(LttvTracesetSelector *s, char *title, char * column_title);
56 void * create_tab(MainWindow * parent, MainWindow * current_window,
57 GtkNotebook * notebook, char * label);
58
59 void insert_viewer(GtkWidget* widget, view_constructor constructor);
60 void update_filter(LttvTracesetSelector *s, GtkTreeStore *store );
61
62 void checkbox_changed(GtkTreeView *treeview,
63 GtkTreePath *arg1,
64 GtkTreeViewColumn *arg2,
65 gpointer user_data);
66 void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i);
67 void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * trace);
68
69 LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset);
70
71 void redraw_viewer(MainWindow * mw_data, TimeWindow * time_window);
72 unsigned get_max_event_number(MainWindow * mw_data);
73
74 enum {
75 CHECKBOX_COLUMN,
76 NAME_COLUMN,
77 TOTAL_COLUMNS
78 };
79
80 enum
81 {
82 MODULE_COLUMN,
83 N_COLUMNS
84 };
85
86
87 LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
88 {
89 LttvTracesetSelector * s;
90 LttvTraceSelector * trace;
91 LttvTracefileSelector * tracefile;
92 LttvEventtypeSelector * eventtype;
93 int i, j, k, m;
94 int nb_trace, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
95 LttvTrace * trace_v;
96 LttTrace * t;
97 LttTracefile *tf;
98 LttFacility * fac;
99 LttEventType * et;
100
101 s = lttv_traceset_selector_new(lttv_traceset_name(traceset));
102 nb_trace = lttv_traceset_number(traceset);
103 for(i=0;i<nb_trace;i++){
104 trace_v = lttv_traceset_get(traceset, i);
105 t = lttv_trace(trace_v);
106 trace = lttv_trace_selector_new(t);
107 lttv_traceset_selector_trace_add(s, trace);
108
109 nb_facility = ltt_trace_facility_number(t);
110 for(k=0;k<nb_facility;k++){
111 fac = ltt_trace_facility_get(t,k);
112 nb_event = (int) ltt_facility_eventtype_number(fac);
113 for(m=0;m<nb_event;m++){
114 et = ltt_facility_eventtype_get(fac,m);
115 eventtype = lttv_eventtype_selector_new(et);
116 lttv_trace_selector_eventtype_add(trace, eventtype);
117 }
118 }
119
120 nb_control = ltt_trace_control_tracefile_number(t);
121 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
122 nb_tracefile = nb_control + nb_per_cpu;
123
124 for(j = 0 ; j < nb_tracefile ; j++) {
125 if(j < nb_control)
126 tf = ltt_trace_control_tracefile_get(t, j);
127 else
128 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
129 tracefile = lttv_tracefile_selector_new(tf);
130 lttv_trace_selector_tracefile_add(trace, tracefile);
131 lttv_eventtype_selector_copy(trace, tracefile);
132 }
133 }
134 return s;
135 }
136
137 void
138 insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
139 {
140 guint val = 20;
141
142 insert_viewer((GtkWidget*)menuitem, (view_constructor)user_data);
143 // selected_hook(&val);
144 }
145
146
147 /* internal functions */
148 void insert_viewer(GtkWidget* widget, view_constructor constructor)
149 {
150 GtkMultiVPaned * multi_vpaned;
151 MainWindow * mw_data;
152 GtkWidget * viewer;
153 LttvTracesetSelector * s;
154 TimeInterval * time_interval;
155 TimeWindow time_window, t;
156
157 mw_data = get_window_data_struct(widget);
158 if(!mw_data->current_tab) return;
159 multi_vpaned = mw_data->current_tab->multi_vpaned;
160
161 s = construct_traceset_selector(mw_data->current_tab->traceset_info->traceset);
162 viewer = (GtkWidget*)constructor(mw_data, s, "Traceset_Selector");
163 if(viewer)
164 {
165 gtk_multi_vpaned_widget_add(multi_vpaned, viewer);
166 // Added by MD
167 // g_object_unref(G_OBJECT(viewer));
168
169 time_window = mw_data->current_tab->time_window;
170 time_interval = (TimeInterval*)g_object_get_data(G_OBJECT(viewer), TRACESET_TIME_SPAN);
171 if(time_interval){
172 t = time_window;
173 time_window.start_time = time_interval->startTime;
174 time_window.time_width = ltt_time_sub(time_interval->endTime,time_interval->startTime);
175 }
176
177 redraw_viewer(mw_data,&time_window);
178 set_current_time(mw_data,&(mw_data->current_tab->current_time));
179 if(time_interval){
180 set_time_window(mw_data,&t);
181 }
182 }
183 }
184
185 void get_label_string (GtkWidget * text, gchar * label)
186 {
187 GtkEntry * entry = (GtkEntry*)text;
188 if(strlen(gtk_entry_get_text(entry))!=0)
189 strcpy(label,gtk_entry_get_text(entry));
190 }
191
192 void get_label(MainWindow * mw, gchar * str, gchar* dialogue_title, gchar * label_str)
193 {
194 GtkWidget * dialogue;
195 GtkWidget * text;
196 GtkWidget * label;
197 gint id;
198
199 dialogue = gtk_dialog_new_with_buttons(dialogue_title,NULL,
200 GTK_DIALOG_MODAL,
201 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
202 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
203 NULL);
204
205 label = gtk_label_new(label_str);
206 gtk_widget_show(label);
207
208 text = gtk_entry_new();
209 gtk_widget_show(text);
210
211 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), label,TRUE, TRUE,0);
212 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), text,FALSE, FALSE,0);
213
214 id = gtk_dialog_run(GTK_DIALOG(dialogue));
215 switch(id){
216 case GTK_RESPONSE_ACCEPT:
217 get_label_string(text,str);
218 gtk_widget_destroy(dialogue);
219 break;
220 case GTK_RESPONSE_REJECT:
221 default:
222 gtk_widget_destroy(dialogue);
223 break;
224 }
225 }
226
227 MainWindow * get_window_data_struct(GtkWidget * widget)
228 {
229 GtkWidget * mw;
230 MainWindow * mw_data;
231
232 mw = lookup_widget(widget, "MWindow");
233 if(mw == NULL){
234 g_printf("Main window does not exist\n");
235 return;
236 }
237
238 mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"mainWindow");
239 if(mw_data == NULL){
240 g_printf("Main window data does not exist\n");
241 return;
242 }
243 return mw_data;
244 }
245
246 void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
247 {
248 MainWindow * parent = get_window_data_struct(widget);
249
250 if(clone){
251 g_printf("Clone : use the same traceset\n");
252 construct_main_window(parent, NULL);
253 }else{
254 g_printf("Empty : traceset is set to NULL\n");
255 construct_main_window(NULL, parent->win_creation_data);
256 }
257 }
258
259 void move_up_viewer(GtkWidget * widget, gpointer user_data)
260 {
261 MainWindow * mw = get_window_data_struct(widget);
262 if(!mw->current_tab) return;
263 gtk_multi_vpaned_widget_move_up(mw->current_tab->multi_vpaned);
264 }
265
266 void move_down_viewer(GtkWidget * widget, gpointer user_data)
267 {
268 MainWindow * mw = get_window_data_struct(widget);
269 if(!mw->current_tab) return;
270 gtk_multi_vpaned_widget_move_down(mw->current_tab->multi_vpaned);
271 }
272
273 void delete_viewer(GtkWidget * widget, gpointer user_data)
274 {
275 MainWindow * mw = get_window_data_struct(widget);
276 if(!mw->current_tab) return;
277 gtk_multi_vpaned_widget_delete(mw->current_tab->multi_vpaned);
278 }
279
280 void open_traceset(GtkWidget * widget, gpointer user_data)
281 {
282 char ** dir;
283 gint id;
284 LttvTraceset * traceset;
285 MainWindow * mw_data = get_window_data_struct(widget);
286 GtkFileSelection * file_selector =
287 (GtkFileSelection *)gtk_file_selection_new("Select a traceset");
288
289 gtk_file_selection_hide_fileop_buttons(file_selector);
290
291 id = gtk_dialog_run(GTK_DIALOG(file_selector));
292 switch(id){
293 case GTK_RESPONSE_ACCEPT:
294 case GTK_RESPONSE_OK:
295 dir = gtk_file_selection_get_selections (file_selector);
296 traceset = lttv_traceset_load(dir[0]);
297 g_printf("Open a trace set %s\n", dir[0]);
298 //Not finished yet
299 g_strfreev(dir);
300 case GTK_RESPONSE_REJECT:
301 case GTK_RESPONSE_CANCEL:
302 default:
303 gtk_widget_destroy((GtkWidget*)file_selector);
304 break;
305 }
306
307 }
308
309 unsigned get_max_event_number(MainWindow * mw_data)
310 {
311 unsigned nb = 0, *size;
312 GtkWidget * w;
313
314 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
315 while(w){
316 size = (unsigned*)g_object_get_data(G_OBJECT(w), MAX_NUMBER_EVENT);
317 if(size == NULL){
318 nb = G_MAXULONG;
319 break;
320 }else{
321 if(nb < *size)
322 nb = *size;
323 }
324 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
325 }
326 return nb;
327 }
328
329 void redraw_viewer(MainWindow * mw_data, TimeWindow * time_window)
330 {
331 unsigned max_nb_events;
332 GdkWindow * win;
333 GdkCursor * new;
334 GtkWidget* widget;
335
336 new = gdk_cursor_new(GDK_X_CURSOR);
337 widget = lookup_widget(mw_data->mwindow, "MToolbar2");
338 win = gtk_widget_get_parent_window(widget);
339 gdk_window_set_cursor(win, new);
340 gdk_cursor_unref(new);
341 gdk_window_stick(win);
342 gdk_window_unstick(win);
343
344 //update time window of each viewer, let viewer insert hooks needed by process_traceset
345 set_time_window(mw_data, time_window);
346
347 max_nb_events = get_max_event_number(mw_data);
348
349 process_traceset_api(mw_data, time_window->start_time,
350 ltt_time_add(time_window->start_time,time_window->time_width),
351 max_nb_events);
352
353 //call hooks to show each viewer and let them remove hooks
354 show_viewer(mw_data);
355
356 gdk_window_set_cursor(win, NULL);
357 }
358
359 void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * t)
360 {
361 int j, k, m, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
362 LttvTracesetSelector * s;
363 LttvTraceSelector * trace;
364 LttvTracefileSelector * tracefile;
365 LttvEventtypeSelector * eventtype;
366 LttTracefile * tf;
367 GtkWidget * w;
368 LttFacility * fac;
369 LttEventType * et;
370
371 w = gtk_multi_vpaned_get_first_widget(paned);
372 while(w){
373 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
374
375 trace = lttv_trace_selector_new(t);
376 lttv_traceset_selector_trace_add(s, trace);
377
378 nb_facility = ltt_trace_facility_number(t);
379 for(k=0;k<nb_facility;k++){
380 fac = ltt_trace_facility_get(t,k);
381 nb_event = (int) ltt_facility_eventtype_number(fac);
382 for(m=0;m<nb_event;m++){
383 et = ltt_facility_eventtype_get(fac,m);
384 eventtype = lttv_eventtype_selector_new(et);
385 lttv_trace_selector_eventtype_add(trace, eventtype);
386 }
387 }
388
389 nb_control = ltt_trace_control_tracefile_number(t);
390 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
391 nb_tracefile = nb_control + nb_per_cpu;
392
393 for(j = 0 ; j < nb_tracefile ; j++) {
394 if(j < nb_control)
395 tf = ltt_trace_control_tracefile_get(t, j);
396 else
397 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
398 tracefile = lttv_tracefile_selector_new(tf);
399 lttv_trace_selector_tracefile_add(trace, tracefile);
400 lttv_eventtype_selector_copy(trace, tracefile);
401 }
402
403 w = gtk_multi_vpaned_get_next_widget(paned);
404 }
405 }
406
407 void add_trace(GtkWidget * widget, gpointer user_data)
408 {
409 LttTrace *trace;
410 LttvTrace * trace_v;
411 LttvTraceset * traceset;
412 const char * dir;
413 gint id;
414 MainWindow * mw_data = get_window_data_struct(widget);
415 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
416 gtk_dir_selection_hide_fileop_buttons(file_selector);
417
418 id = gtk_dialog_run(GTK_DIALOG(file_selector));
419 switch(id){
420 case GTK_RESPONSE_ACCEPT:
421 case GTK_RESPONSE_OK:
422 dir = gtk_dir_selection_get_dir (file_selector);
423 trace = ltt_trace_open(dir);
424 if(trace == NULL) g_critical("cannot open trace %s", dir);
425 trace_v = lttv_trace_new(trace);
426 traceset = mw_data->current_tab->traceset_info->traceset;
427 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
428 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
429 traceset_info->traceset_context));
430 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
431 }
432 lttv_traceset_add(traceset, trace_v);
433 mw_data->current_tab->traceset_info->traceset_context =
434 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
435 lttv_context_init(
436 LTTV_TRACESET_CONTEXT(mw_data->current_tab->traceset_info->
437 traceset_context),traceset);
438 add_trace_into_traceset_selector(mw_data->current_tab->multi_vpaned, trace);
439
440 gtk_widget_destroy((GtkWidget*)file_selector);
441
442 //update current tab
443 update_traceset(mw_data);
444 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
445 set_current_time(mw_data,&(mw_data->current_tab->current_time));
446 break;
447 case GTK_RESPONSE_REJECT:
448 case GTK_RESPONSE_CANCEL:
449 default:
450 gtk_widget_destroy((GtkWidget*)file_selector);
451 break;
452 }
453 }
454
455 void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i)
456 {
457 LttvTracesetSelector * s;
458 LttvTraceSelector * t;
459 GtkWidget * w;
460
461 w = gtk_multi_vpaned_get_first_widget(paned);
462 while(w){
463 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
464 t = lttv_traceset_selector_trace_get(s,i);
465 lttv_traceset_selector_trace_remove(s, i);
466 lttv_trace_selector_destroy(t);
467 w = gtk_multi_vpaned_get_next_widget(paned);
468 }
469 }
470
471 void remove_trace(GtkWidget * widget, gpointer user_data)
472 {
473 LttTrace *trace;
474 LttvTrace * trace_v;
475 LttvTraceset * traceset;
476 gint i, nb_trace;
477 char ** name, *remove_trace_name;
478 MainWindow * mw_data = get_window_data_struct(widget);
479 LttvTracesetSelector * s;
480 LttvTraceSelector * t;
481 GtkWidget * w;
482 gboolean selected;
483
484 nb_trace =lttv_traceset_number(mw_data->current_tab->traceset_info->traceset);
485 name = g_new(char*,nb_trace);
486 for(i = 0; i < nb_trace; i++){
487 trace_v = lttv_traceset_get(mw_data->current_tab->
488 traceset_info->traceset, i);
489 trace = lttv_trace(trace_v);
490 name[i] = ltt_trace_name(trace);
491 }
492
493 remove_trace_name = get_remove_trace(name, nb_trace);
494
495 if(remove_trace_name){
496 for(i=0; i<nb_trace; i++){
497 if(strcmp(remove_trace_name,name[i]) == 0){
498 //unselect the trace from the current viewer
499 w = gtk_multi_vpaned_get_widget(mw_data->current_tab->multi_vpaned);
500 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
501 t = lttv_traceset_selector_trace_get(s,i);
502 lttv_trace_selector_set_selected(t, FALSE);
503
504 //check if other viewers select the trace
505 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
506 while(w){
507 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
508 t = lttv_traceset_selector_trace_get(s,i);
509 selected = lttv_trace_selector_get_selected(t);
510 if(selected)break;
511 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
512 }
513
514 //if no viewer selects the trace, remove it
515 if(!selected){
516 remove_trace_from_traceset_selector(mw_data->current_tab->multi_vpaned, i);
517
518 traceset = mw_data->current_tab->traceset_info->traceset;
519 trace_v = lttv_traceset_get(traceset, i);
520 if(lttv_trace_get_ref_number(trace_v) <= 1)
521 ltt_trace_close(lttv_trace(trace_v));
522
523 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
524 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
525 traceset_info->traceset_context));
526 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
527 }
528 lttv_traceset_remove(traceset, i);
529 lttv_trace_destroy(trace_v);
530 mw_data->current_tab->traceset_info->traceset_context =
531 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
532 lttv_context_init(
533 LTTV_TRACESET_CONTEXT(mw_data->current_tab->
534 traceset_info->traceset_context),traceset);
535 //update current tab
536 update_traceset(mw_data);
537 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
538 set_current_time(mw_data,&(mw_data->current_tab->current_time));
539 }
540 break;
541 }
542 }
543 }
544
545 g_free(name);
546 }
547
548 void save(GtkWidget * widget, gpointer user_data)
549 {
550 g_printf("Save\n");
551 }
552
553 void save_as(GtkWidget * widget, gpointer user_data)
554 {
555 g_printf("Save as\n");
556 }
557
558 void zoom(GtkWidget * widget, double size)
559 {
560 TimeInterval *time_span;
561 TimeWindow time_window;
562 LttTime current_time, time_delta, time_s, time_e, time_t;
563 MainWindow * mw_data = get_window_data_struct(widget);
564
565 if(size == 1) return;
566
567 time_span = LTTV_TRACESET_CONTEXT(mw_data->current_tab->
568 traceset_info->traceset_context)->Time_Span;
569 time_window = mw_data->current_tab->time_window;
570 current_time = mw_data->current_tab->current_time;
571
572 time_delta = ltt_time_sub(time_span->endTime,time_span->startTime);
573 if(size == 0){
574 time_window.start_time = time_span->startTime;
575 time_window.time_width = time_delta;
576 }else{
577 time_window.time_width = ltt_time_div(time_window.time_width, size);
578 if(ltt_time_compare(time_window.time_width,time_delta) > 0)
579 time_window.time_width = time_delta;
580
581 time_t = ltt_time_div(time_window.time_width, 2);
582 if(ltt_time_compare(current_time, time_t) < 0){
583 time_s = time_span->startTime;
584 } else {
585 time_s = ltt_time_sub(current_time,time_t);
586 }
587 time_e = ltt_time_add(current_time,time_t);
588 if(ltt_time_compare(time_span->startTime, time_s) > 0){
589 time_s = time_span->startTime;
590 }else if(ltt_time_compare(time_span->endTime, time_e) < 0){
591 time_e = time_span->endTime;
592 time_s = ltt_time_sub(time_e,time_window.time_width);
593 }
594 time_window.start_time = time_s;
595 }
596 redraw_viewer(mw_data, &time_window);
597 set_current_time(mw_data,&(mw_data->current_tab->current_time));
598 gtk_multi_vpaned_set_adjust(mw_data->current_tab->multi_vpaned, FALSE);
599 }
600
601 void zoom_in(GtkWidget * widget, gpointer user_data)
602 {
603 zoom(widget, 2);
604 }
605
606 void zoom_out(GtkWidget * widget, gpointer user_data)
607 {
608 zoom(widget, 0.5);
609 }
610
611 void zoom_extended(GtkWidget * widget, gpointer user_data)
612 {
613 zoom(widget, 0);
614 }
615
616 void go_to_time(GtkWidget * widget, gpointer user_data)
617 {
618 g_printf("Go to time\n");
619 }
620
621 void show_time_frame(GtkWidget * widget, gpointer user_data)
622 {
623 g_printf("Show time frame\n");
624 }
625
626
627 /* callback function */
628
629 void
630 on_empty_traceset_activate (GtkMenuItem *menuitem,
631 gpointer user_data)
632 {
633 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
634 }
635
636
637 void
638 on_clone_traceset_activate (GtkMenuItem *menuitem,
639 gpointer user_data)
640 {
641 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
642 }
643
644 void create_new_tab(GtkWidget* widget, gpointer user_data){
645 gchar label[PATH_LENGTH];
646 MainWindow * mw_data = get_window_data_struct(widget);
647 GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
648 if(notebook == NULL){
649 g_printf("Notebook does not exist\n");
650 return;
651 }
652
653 strcpy(label,"Page");
654 get_label(mw_data, label,"Get the name of the tab","Please input tab's name");
655
656 create_tab (mw_data, mw_data, notebook, label);
657 }
658
659 void
660 on_tab_activate (GtkMenuItem *menuitem,
661 gpointer user_data)
662 {
663 create_new_tab((GtkWidget*)menuitem, user_data);
664 }
665
666
667 void
668 on_open_activate (GtkMenuItem *menuitem,
669 gpointer user_data)
670 {
671 open_traceset((GtkWidget*)menuitem, user_data);
672 }
673
674
675 void
676 on_close_activate (GtkMenuItem *menuitem,
677 gpointer user_data)
678 {
679 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
680 main_window_destructor(mw_data);
681 }
682
683
684 void
685 on_close_tab_activate (GtkMenuItem *menuitem,
686 gpointer user_data)
687 {
688 int count = 0;
689 GtkWidget * notebook;
690 Tab * tmp;
691 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
692 notebook = lookup_widget((GtkWidget*)menuitem, "MNotebook");
693 if(notebook == NULL){
694 g_printf("Notebook does not exist\n");
695 return;
696 }
697
698 if(mw_data->tab == mw_data->current_tab){
699 // tmp = mw_data->current_tb;
700 // mw_data->tab = mw_data->current_tab->next;
701 g_printf("The default TAB can not be deleted\n");
702 return;
703 }else{
704 tmp = mw_data->tab;
705 while(tmp != mw_data->current_tab){
706 tmp = tmp->next;
707 count++;
708 }
709 }
710
711 gtk_notebook_remove_page((GtkNotebook*)notebook, count);
712 }
713
714
715 void
716 on_add_trace_activate (GtkMenuItem *menuitem,
717 gpointer user_data)
718 {
719 add_trace((GtkWidget*)menuitem, user_data);
720 }
721
722
723 void
724 on_remove_trace_activate (GtkMenuItem *menuitem,
725 gpointer user_data)
726 {
727 remove_trace((GtkWidget*)menuitem, user_data);
728 }
729
730
731 void
732 on_save_activate (GtkMenuItem *menuitem,
733 gpointer user_data)
734 {
735 save((GtkWidget*)menuitem, user_data);
736 }
737
738
739 void
740 on_save_as_activate (GtkMenuItem *menuitem,
741 gpointer user_data)
742 {
743 save_as((GtkWidget*)menuitem, user_data);
744 }
745
746
747 void
748 on_quit_activate (GtkMenuItem *menuitem,
749 gpointer user_data)
750 {
751 gtk_main_quit ();
752 }
753
754
755 void
756 on_cut_activate (GtkMenuItem *menuitem,
757 gpointer user_data)
758 {
759 g_printf("Cut\n");
760 }
761
762
763 void
764 on_copy_activate (GtkMenuItem *menuitem,
765 gpointer user_data)
766 {
767 g_printf("Copye\n");
768 }
769
770
771 void
772 on_paste_activate (GtkMenuItem *menuitem,
773 gpointer user_data)
774 {
775 g_printf("Paste\n");
776 }
777
778
779 void
780 on_delete_activate (GtkMenuItem *menuitem,
781 gpointer user_data)
782 {
783 g_printf("Delete\n");
784 }
785
786
787 void
788 on_zoom_in_activate (GtkMenuItem *menuitem,
789 gpointer user_data)
790 {
791 zoom_in((GtkWidget*)menuitem, user_data);
792 }
793
794
795 void
796 on_zoom_out_activate (GtkMenuItem *menuitem,
797 gpointer user_data)
798 {
799 zoom_out((GtkWidget*)menuitem, user_data);
800 }
801
802
803 void
804 on_zoom_extended_activate (GtkMenuItem *menuitem,
805 gpointer user_data)
806 {
807 zoom_extended((GtkWidget*)menuitem, user_data);
808 }
809
810
811 void
812 on_go_to_time_activate (GtkMenuItem *menuitem,
813 gpointer user_data)
814 {
815 go_to_time((GtkWidget*)menuitem, user_data);
816 }
817
818
819 void
820 on_show_time_frame_activate (GtkMenuItem *menuitem,
821 gpointer user_data)
822 {
823 show_time_frame((GtkWidget*)menuitem, user_data);
824 }
825
826
827 void
828 on_move_viewer_up_activate (GtkMenuItem *menuitem,
829 gpointer user_data)
830 {
831 move_up_viewer((GtkWidget*)menuitem, user_data);
832 }
833
834
835 void
836 on_move_viewer_down_activate (GtkMenuItem *menuitem,
837 gpointer user_data)
838 {
839 move_down_viewer((GtkWidget*)menuitem, user_data);
840 }
841
842
843 void
844 on_remove_viewer_activate (GtkMenuItem *menuitem,
845 gpointer user_data)
846 {
847 delete_viewer((GtkWidget*)menuitem, user_data);
848 }
849
850 void
851 on_trace_filter_activate (GtkMenuItem *menuitem,
852 gpointer user_data)
853 {
854 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
855 LttvTracesetSelector * s;
856 GtkWidget * w = gtk_multi_vpaned_get_widget(mw_data->current_tab->multi_vpaned);
857
858 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
859 if(!s){
860 g_printf("There is no viewer yet\n");
861 return;
862 }
863 if(get_filter_selection(s, "Configure trace and tracefile filter", "Select traces and tracefiles")){
864 update_traceset(mw_data);
865 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
866 set_current_time(mw_data,&(mw_data->current_tab->current_time));
867 }
868 }
869
870 void
871 on_trace_facility_activate (GtkMenuItem *menuitem,
872 gpointer user_data)
873 {
874 g_printf("Trace facility selector: %s\n");
875 }
876
877 void
878 on_load_module_activate (GtkMenuItem *menuitem,
879 gpointer user_data)
880 {
881 char ** dir;
882 gint id;
883 char str[PATH_LENGTH], *str1;
884 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
885 GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a module");
886 gtk_file_selection_hide_fileop_buttons(file_selector);
887
888 str[0] = '\0';
889 id = gtk_dialog_run(GTK_DIALOG(file_selector));
890 switch(id){
891 case GTK_RESPONSE_ACCEPT:
892 case GTK_RESPONSE_OK:
893 dir = gtk_file_selection_get_selections (file_selector);
894 sprintf(str,dir[0]);
895 str1 = strrchr(str,'/');
896 if(str1)str1++;
897 else{
898 str1 = strrchr(str,'\\');
899 str1++;
900 }
901 if(mw_data->win_creation_data)
902 lttv_module_load(str1, mw_data->win_creation_data->argc,mw_data->win_creation_data->argv);
903 else
904 lttv_module_load(str1, 0,NULL);
905 g_slist_foreach(g_main_window_list, (gpointer)insert_menu_toolbar_item,
906 NULL);
907 g_strfreev(dir);
908 case GTK_RESPONSE_REJECT:
909 case GTK_RESPONSE_CANCEL:
910 default:
911 gtk_widget_destroy((GtkWidget*)file_selector);
912 break;
913 }
914 g_printf("Load module: %s\n", str);
915 }
916
917
918 void
919 on_unload_module_activate (GtkMenuItem *menuitem,
920 gpointer user_data)
921 {
922 int i;
923 char **name, *unload_module_name;
924 guint nb;
925 LttvModule ** modules, *module;
926 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
927
928 modules = lttv_module_list(&nb);
929 name = g_new(char*, nb);
930 for(i=0;i<nb;i++){
931 module = modules[i];
932 name[i] = lttv_module_name(module);
933 }
934
935 unload_module_name =get_unload_module(name,nb);
936
937 if(unload_module_name){
938 for(i=0;i<nb;i++){
939 if(strcmp(unload_module_name, name[i]) == 0){
940 lttv_module_unload(modules[i]);
941 break;
942 }
943 }
944 }
945
946 g_free(name);
947 }
948
949
950 void
951 on_add_module_search_path_activate (GtkMenuItem *menuitem,
952 gpointer user_data)
953 {
954 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select module path");
955 const char * dir;
956 gint id;
957
958 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
959
960 id = gtk_dialog_run(GTK_DIALOG(file_selector));
961 switch(id){
962 case GTK_RESPONSE_ACCEPT:
963 case GTK_RESPONSE_OK:
964 dir = gtk_dir_selection_get_dir (file_selector);
965 lttv_module_path_add(dir);
966 case GTK_RESPONSE_REJECT:
967 case GTK_RESPONSE_CANCEL:
968 default:
969 gtk_widget_destroy((GtkWidget*)file_selector);
970 break;
971 }
972 }
973
974
975 void
976 on_color_activate (GtkMenuItem *menuitem,
977 gpointer user_data)
978 {
979 g_printf("Color\n");
980 }
981
982
983 void
984 on_filter_activate (GtkMenuItem *menuitem,
985 gpointer user_data)
986 {
987 g_printf("Filter\n");
988 }
989
990
991 void
992 on_save_configuration_activate (GtkMenuItem *menuitem,
993 gpointer user_data)
994 {
995 g_printf("Save configuration\n");
996 }
997
998
999 void
1000 on_content_activate (GtkMenuItem *menuitem,
1001 gpointer user_data)
1002 {
1003 g_printf("Content\n");
1004 }
1005
1006
1007 void
1008 on_about_activate (GtkMenuItem *menuitem,
1009 gpointer user_data)
1010 {
1011 g_printf("About...\n");
1012 }
1013
1014
1015 void
1016 on_button_new_clicked (GtkButton *button,
1017 gpointer user_data)
1018 {
1019 create_new_window((GtkWidget*)button, user_data, TRUE);
1020 }
1021
1022 void
1023 on_button_new_tab_clicked (GtkButton *button,
1024 gpointer user_data)
1025 {
1026 create_new_tab((GtkWidget*)button, user_data);
1027 }
1028
1029 void
1030 on_button_open_clicked (GtkButton *button,
1031 gpointer user_data)
1032 {
1033 open_traceset((GtkWidget*)button, user_data);
1034 }
1035
1036
1037 void
1038 on_button_add_trace_clicked (GtkButton *button,
1039 gpointer user_data)
1040 {
1041 add_trace((GtkWidget*)button, user_data);
1042 }
1043
1044
1045 void
1046 on_button_remove_trace_clicked (GtkButton *button,
1047 gpointer user_data)
1048 {
1049 remove_trace((GtkWidget*)button, user_data);
1050 }
1051
1052
1053 void
1054 on_button_save_clicked (GtkButton *button,
1055 gpointer user_data)
1056 {
1057 save((GtkWidget*)button, user_data);
1058 }
1059
1060
1061 void
1062 on_button_save_as_clicked (GtkButton *button,
1063 gpointer user_data)
1064 {
1065 save_as((GtkWidget*)button, user_data);
1066 }
1067
1068
1069 void
1070 on_button_zoom_in_clicked (GtkButton *button,
1071 gpointer user_data)
1072 {
1073 zoom_in((GtkWidget*)button, user_data);
1074 }
1075
1076
1077 void
1078 on_button_zoom_out_clicked (GtkButton *button,
1079 gpointer user_data)
1080 {
1081 zoom_out((GtkWidget*)button, user_data);
1082 }
1083
1084
1085 void
1086 on_button_zoom_extended_clicked (GtkButton *button,
1087 gpointer user_data)
1088 {
1089 zoom_extended((GtkWidget*)button, user_data);
1090 }
1091
1092
1093 void
1094 on_button_go_to_time_clicked (GtkButton *button,
1095 gpointer user_data)
1096 {
1097 go_to_time((GtkWidget*)button, user_data);
1098 }
1099
1100
1101 void
1102 on_button_show_time_frame_clicked (GtkButton *button,
1103 gpointer user_data)
1104 {
1105 show_time_frame((GtkWidget*)button, user_data);
1106 }
1107
1108
1109 void
1110 on_button_move_up_clicked (GtkButton *button,
1111 gpointer user_data)
1112 {
1113 move_up_viewer((GtkWidget*)button, user_data);
1114 }
1115
1116
1117 void
1118 on_button_move_down_clicked (GtkButton *button,
1119 gpointer user_data)
1120 {
1121 move_down_viewer((GtkWidget*)button, user_data);
1122 }
1123
1124
1125 void
1126 on_button_delete_viewer_clicked (GtkButton *button,
1127 gpointer user_data)
1128 {
1129 delete_viewer((GtkWidget*)button, user_data);
1130 }
1131
1132 void
1133 on_MWindow_destroy (GtkObject *object,
1134 gpointer user_data)
1135 {
1136 MainWindow *Main_Window = (MainWindow*)user_data;
1137
1138 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
1139
1140 g_win_count--;
1141 if(g_win_count == 0)
1142 gtk_main_quit ();
1143 }
1144
1145 gboolean
1146 on_MWindow_configure (GtkWidget *widget,
1147 GdkEventConfigure *event,
1148 gpointer user_data)
1149 {
1150 MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
1151 float width = event->width;
1152 Tab * tab = mw_data->tab;
1153 TimeWindow time_win;
1154 double ratio;
1155 TimeInterval *time_span;
1156 LttTime time;
1157
1158 // MD : removed time width modification upon resizing of the main window.
1159 // The viewers will redraw themselves completely, without time interval
1160 // modification.
1161 /* while(tab){
1162 if(mw_data->window_width){
1163 time_span = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->Time_Span ;
1164 time_win = tab->time_window;
1165 ratio = width / mw_data->window_width;
1166 tab->time_window.time_width = ltt_time_mul(time_win.time_width,ratio);
1167 time = ltt_time_sub(time_span->endTime, time_win.start_time);
1168 if(ltt_time_compare(time, tab->time_window.time_width) < 0){
1169 tab->time_window.time_width = time;
1170 }
1171 }
1172 tab = tab->next;
1173 }
1174
1175 mw_data->window_width = (int)width;
1176 */
1177 return FALSE;
1178 }
1179
1180 void
1181 on_MNotebook_switch_page (GtkNotebook *notebook,
1182 GtkNotebookPage *page,
1183 guint page_num,
1184 gpointer user_data)
1185 {
1186 MainWindow * mw = get_window_data_struct((GtkWidget*)notebook);
1187 Tab * tab = mw->tab;
1188
1189 while(page_num){
1190 tab = tab->next;
1191 page_num--;
1192 }
1193 mw->current_tab = tab;
1194 }
1195
1196 void checkbox_changed(GtkTreeView *treeview,
1197 GtkTreePath *arg1,
1198 GtkTreeViewColumn *arg2,
1199 gpointer user_data)
1200 {
1201 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
1202 GtkTreeIter iter;
1203 gboolean value;
1204
1205 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
1206 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
1207 value = value? FALSE : TRUE;
1208 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
1209 }
1210
1211 }
1212
1213 void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
1214 {
1215 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1216 int i, j, k, nb_eventtype;
1217 LttvTraceSelector * trace;
1218 LttvTracefileSelector * tracefile;
1219 LttvEventtypeSelector * eventtype;
1220 gboolean value, value1, value2;
1221
1222 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
1223 i = 0;
1224 do{
1225 trace = lttv_traceset_selector_trace_get(s, i);
1226 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
1227 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
1228 if(value){
1229 j = 0;
1230 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
1231 do{
1232 if(j<1){//eventtype selector for trace
1233 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value2,-1);
1234 if(value2){
1235 k=0;
1236 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter1, &child_iter)){
1237 do{
1238 eventtype = lttv_trace_selector_eventtype_get(trace,k);
1239 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
1240 lttv_eventtype_selector_set_selected(eventtype,value2);
1241 k++;
1242 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter1));
1243 }
1244 }
1245 }else{ //tracefile selector
1246 tracefile = lttv_trace_selector_tracefile_get(trace, j - 1);
1247 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
1248 lttv_tracefile_selector_set_selected(tracefile,value1);
1249 if(value1){
1250 gtk_tree_model_iter_children((GtkTreeModel*)store, &child_iter1, &child_iter); //eventtype selector
1251 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
1252 if(value2){
1253 k = 0;
1254 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter2, &child_iter1)){
1255 do{//eventtype selector for tracefile
1256 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
1257 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter2, CHECKBOX_COLUMN, &value2,-1);
1258 lttv_eventtype_selector_set_selected(eventtype,value2);
1259 k++;
1260 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter2));
1261 }
1262 }
1263 }
1264 }
1265 j++;
1266 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
1267 }
1268 }
1269 lttv_trace_selector_set_selected(trace,value);
1270 i++;
1271 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
1272 }
1273 }
1274
1275 gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
1276 {
1277 GtkWidget * dialogue;
1278 GtkTreeStore * store;
1279 GtkWidget * tree;
1280 GtkWidget * scroll_win;
1281 GtkCellRenderer * renderer;
1282 GtkTreeViewColumn * column;
1283 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1284 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
1285 LttvTraceSelector * trace;
1286 LttvTracefileSelector * tracefile;
1287 LttvEventtypeSelector * eventtype;
1288 char * name;
1289 gboolean checked;
1290
1291 dialogue = gtk_dialog_new_with_buttons(title,
1292 NULL,
1293 GTK_DIALOG_MODAL,
1294 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1295 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1296 NULL);
1297 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
1298
1299 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
1300 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
1301 g_object_unref (G_OBJECT (store));
1302 g_signal_connect (G_OBJECT (tree), "row-activated",
1303 G_CALLBACK (checkbox_changed),
1304 NULL);
1305
1306
1307 renderer = gtk_cell_renderer_toggle_new ();
1308 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
1309
1310 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
1311
1312 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
1313 renderer,
1314 "active", CHECKBOX_COLUMN,
1315 NULL);
1316 gtk_tree_view_column_set_alignment (column, 0.5);
1317 gtk_tree_view_column_set_fixed_width (column, 20);
1318 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1319
1320 renderer = gtk_cell_renderer_text_new ();
1321 column = gtk_tree_view_column_new_with_attributes (column_title,
1322 renderer,
1323 "text", NAME_COLUMN,
1324 NULL);
1325 gtk_tree_view_column_set_alignment (column, 0.0);
1326 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1327 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
1328
1329 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1330 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1331 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
1332 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1333
1334 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1335
1336 gtk_widget_show(scroll_win);
1337 gtk_widget_show(tree);
1338
1339 nb_trace = lttv_traceset_selector_trace_number(s);
1340 for(i=0;i<nb_trace;i++){
1341 trace = lttv_traceset_selector_trace_get(s, i);
1342 name = lttv_trace_selector_get_name(trace);
1343 gtk_tree_store_append (store, &iter, NULL);
1344 checked = lttv_trace_selector_get_selected(trace);
1345 gtk_tree_store_set (store, &iter,
1346 CHECKBOX_COLUMN,checked,
1347 NAME_COLUMN,name,
1348 -1);
1349
1350 gtk_tree_store_append (store, &child_iter, &iter);
1351 gtk_tree_store_set (store, &child_iter,
1352 CHECKBOX_COLUMN, checked,
1353 NAME_COLUMN,"eventtype",
1354 -1);
1355
1356 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
1357 for(j=0;j<nb_eventtype;j++){
1358 eventtype = lttv_trace_selector_eventtype_get(trace,j);
1359 name = lttv_eventtype_selector_get_name(eventtype);
1360 checked = lttv_eventtype_selector_get_selected(eventtype);
1361 gtk_tree_store_append (store, &child_iter1, &child_iter);
1362 gtk_tree_store_set (store, &child_iter1,
1363 CHECKBOX_COLUMN, checked,
1364 NAME_COLUMN,name,
1365 -1);
1366 }
1367
1368 nb_tracefile = lttv_trace_selector_tracefile_number(trace);
1369 for(j=0;j<nb_tracefile;j++){
1370 tracefile = lttv_trace_selector_tracefile_get(trace, j);
1371 name = lttv_tracefile_selector_get_name(tracefile);
1372 gtk_tree_store_append (store, &child_iter, &iter);
1373 checked = lttv_tracefile_selector_get_selected(tracefile);
1374 gtk_tree_store_set (store, &child_iter,
1375 CHECKBOX_COLUMN, checked,
1376 NAME_COLUMN,name,
1377 -1);
1378
1379 gtk_tree_store_append (store, &child_iter1, &child_iter);
1380 gtk_tree_store_set (store, &child_iter1,
1381 CHECKBOX_COLUMN, checked,
1382 NAME_COLUMN,"eventtype",
1383 -1);
1384
1385 for(k=0;k<nb_eventtype;k++){
1386 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
1387 name = lttv_eventtype_selector_get_name(eventtype);
1388 checked = lttv_eventtype_selector_get_selected(eventtype);
1389 gtk_tree_store_append (store, &child_iter2, &child_iter1);
1390 gtk_tree_store_set (store, &child_iter2,
1391 CHECKBOX_COLUMN, checked,
1392 NAME_COLUMN,name,
1393 -1);
1394 }
1395 }
1396 }
1397
1398 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1399 switch(id){
1400 case GTK_RESPONSE_ACCEPT:
1401 case GTK_RESPONSE_OK:
1402 update_filter(s, store);
1403 gtk_widget_destroy(dialogue);
1404 return TRUE;
1405 case GTK_RESPONSE_REJECT:
1406 case GTK_RESPONSE_CANCEL:
1407 default:
1408 gtk_widget_destroy(dialogue);
1409 break;
1410 }
1411 return FALSE;
1412 }
1413
1414 char * get_remove_trace(char ** all_trace_name, int nb_trace)
1415 {
1416 return get_selection(all_trace_name, nb_trace,
1417 "Select a trace", "Trace pathname");
1418 }
1419 char * get_unload_module(char ** loaded_module_name, int nb_module)
1420 {
1421 return get_selection(loaded_module_name, nb_module,
1422 "Select an unload module", "Module pathname");
1423 }
1424
1425 char * get_selection(char ** loaded_module_name, int nb_module,
1426 char *title, char * column_title)
1427 {
1428 GtkWidget * dialogue;
1429 GtkWidget * scroll_win;
1430 GtkWidget * tree;
1431 GtkListStore * store;
1432 GtkTreeViewColumn * column;
1433 GtkCellRenderer * renderer;
1434 GtkTreeSelection * select;
1435 GtkTreeIter iter;
1436 gint id, i;
1437 char * unload_module_name = NULL;
1438
1439 dialogue = gtk_dialog_new_with_buttons(title,
1440 NULL,
1441 GTK_DIALOG_MODAL,
1442 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1443 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1444 NULL);
1445 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
1446
1447 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1448 gtk_widget_show ( scroll_win);
1449 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1450 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1451
1452 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
1453 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
1454 gtk_widget_show ( tree);
1455 g_object_unref (G_OBJECT (store));
1456
1457 renderer = gtk_cell_renderer_text_new ();
1458 column = gtk_tree_view_column_new_with_attributes (column_title,
1459 renderer,
1460 "text", MODULE_COLUMN,
1461 NULL);
1462 gtk_tree_view_column_set_alignment (column, 0.5);
1463 gtk_tree_view_column_set_fixed_width (column, 150);
1464 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1465
1466 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
1467 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
1468
1469 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1470
1471 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1472
1473 for(i=0;i<nb_module;i++){
1474 gtk_list_store_append (store, &iter);
1475 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
1476 }
1477
1478 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1479 switch(id){
1480 case GTK_RESPONSE_ACCEPT:
1481 case GTK_RESPONSE_OK:
1482 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
1483 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
1484 }
1485 case GTK_RESPONSE_REJECT:
1486 case GTK_RESPONSE_CANCEL:
1487 default:
1488 gtk_widget_destroy(dialogue);
1489 break;
1490 }
1491
1492 return unload_module_name;
1493 }
1494
1495 void main_window_destroy_hash_key(gpointer key)
1496 {
1497 g_free(key);
1498 }
1499
1500 void main_window_destroy_hash_data(gpointer data)
1501 {
1502 }
1503
1504
1505 void insert_menu_toolbar_item(MainWindow * mw, gpointer user_data)
1506 {
1507 int i;
1508 GdkPixbuf *pixbuf;
1509 view_constructor constructor;
1510 LttvMenus * menu;
1511 LttvToolbars * toolbar;
1512 lttv_menu_closure *menu_item;
1513 lttv_toolbar_closure *toolbar_item;
1514 LttvAttributeValue value;
1515 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1516 GtkWidget * tool_menu_title_menu, *insert_view, *pixmap, *tmp;
1517
1518 g_assert(lttv_iattribute_find_by_path(attributes,
1519 "viewers/menu", LTTV_POINTER, &value));
1520 menu = (LttvMenus*)*(value.v_pointer);
1521
1522 if(menu){
1523 for(i=0;i<menu->len;i++){
1524 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1525 tmp = g_hash_table_lookup(mw->hash_menu_item, g_strdup(menu_item->menuText));
1526 if(tmp)continue;
1527 constructor = menu_item->con;
1528 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
1529 insert_view = gtk_menu_item_new_with_mnemonic (menu_item->menuText);
1530 gtk_widget_show (insert_view);
1531 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu), insert_view);
1532 g_signal_connect ((gpointer) insert_view, "activate",
1533 G_CALLBACK (insert_viewer_wrap),
1534 constructor);
1535 g_hash_table_insert(mw->hash_menu_item, g_strdup(menu_item->menuText),
1536 insert_view);
1537 }
1538 }
1539
1540 g_assert(lttv_iattribute_find_by_path(attributes,
1541 "viewers/toolbar", LTTV_POINTER, &value));
1542 toolbar = (LttvToolbars*)*(value.v_pointer);
1543
1544 if(toolbar){
1545 for(i=0;i<toolbar->len;i++){
1546 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1547 tmp = g_hash_table_lookup(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip));
1548 if(tmp)continue;
1549 constructor = toolbar_item->con;
1550 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
1551 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item->pixmap);
1552 pixmap = gtk_image_new_from_pixbuf(pixbuf);
1553 insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
1554 GTK_TOOLBAR_CHILD_BUTTON,
1555 NULL,
1556 "",
1557 toolbar_item->tooltip, NULL,
1558 pixmap, NULL, NULL);
1559 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu)->children)->data))->label), TRUE);
1560 gtk_widget_show (insert_view);
1561 gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1);
1562 g_signal_connect ((gpointer) insert_view, "clicked",G_CALLBACK (insert_viewer_wrap),constructor);
1563 g_hash_table_insert(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip),
1564 insert_view);
1565 }
1566 }
1567 }
1568
1569 void construct_main_window(MainWindow * parent, WindowCreationData * win_creation_data)
1570 {
1571 g_critical("construct_main_window()");
1572 GtkWidget * new_window; /* New generated main window */
1573 MainWindow * new_m_window;/* New main window structure */
1574 GtkNotebook * notebook;
1575 LttvIAttribute *attributes =
1576 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1577 LttvAttributeValue value;
1578
1579 new_m_window = g_new(MainWindow, 1);
1580
1581 // Add the object's information to the module's array
1582 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
1583
1584
1585 new_window = create_MWindow();
1586 gtk_widget_show (new_window);
1587
1588 new_m_window->attributes = attributes;
1589
1590 new_m_window->mwindow = new_window;
1591 new_m_window->tab = NULL;
1592 new_m_window->current_tab = NULL;
1593 new_m_window->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1594 if(parent){
1595 new_m_window->win_creation_data = parent->win_creation_data;
1596 }else{
1597 new_m_window->win_creation_data = win_creation_data;
1598 }
1599
1600 new_m_window->hash_menu_item = g_hash_table_new_full (g_str_hash, g_str_equal,
1601 main_window_destroy_hash_key,
1602 main_window_destroy_hash_data);
1603 new_m_window->hash_toolbar_item = g_hash_table_new_full (g_str_hash, g_str_equal,
1604 main_window_destroy_hash_key,
1605 main_window_destroy_hash_data);
1606
1607 insert_menu_toolbar_item(new_m_window, NULL);
1608
1609 g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);
1610
1611 //create a default tab
1612 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
1613 if(notebook == NULL){
1614 g_printf("Notebook does not exist\n");
1615 return;
1616 }
1617 //for now there is no name field in LttvTraceset structure
1618 //Use "Traceset" as the label for the default tab
1619 create_tab(parent, new_m_window, notebook,"Traceset");
1620
1621 g_object_set_data_full(
1622 G_OBJECT(new_m_window->mwindow),
1623 "Main_Window_Data",
1624 new_m_window,
1625 (GDestroyNotify)main_window_free);
1626
1627 g_win_count++;
1628 }
1629
1630 void tab_destructor(Tab * tab_instance)
1631 {
1632 int i, nb, ref_count;
1633 LttvTrace * trace;
1634
1635 if(tab_instance->attributes)
1636 g_object_unref(tab_instance->attributes);
1637
1638 if(tab_instance->mw->tab == tab_instance){
1639 tab_instance->mw->tab = tab_instance->next;
1640 }else{
1641 Tab * tmp1, *tmp = tab_instance->mw->tab;
1642 while(tmp != tab_instance){
1643 tmp1 = tmp;
1644 tmp = tmp->next;
1645 }
1646 tmp1->next = tab_instance->next;
1647 }
1648
1649 if(tab_instance->traceset_info->traceset_context != NULL){
1650 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
1651 traceset_context));
1652 g_object_unref(tab_instance->traceset_info->traceset_context);
1653 }
1654 if(tab_instance->traceset_info->traceset != NULL) {
1655 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
1656 for(i = 0 ; i < nb ; i++) {
1657 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
1658 ref_count = lttv_trace_get_ref_number(trace);
1659 if(ref_count <= 1){
1660 ltt_trace_close(lttv_trace(trace));
1661 lttv_trace_destroy(trace);
1662 }
1663 // lttv_trace_destroy(trace);
1664 }
1665 }
1666 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
1667 g_free(tab_instance->traceset_info);
1668 g_free(tab_instance);
1669 }
1670
1671 void * create_tab(MainWindow * parent, MainWindow* current_window,
1672 GtkNotebook * notebook, char * label)
1673 {
1674 GList * list;
1675 Tab * tmp_tab;
1676 MainWindow * mw_data = current_window;
1677 LttTime tmp_time;
1678
1679 tmp_tab = mw_data->tab;
1680 while(tmp_tab && tmp_tab->next) tmp_tab = tmp_tab->next;
1681 if(!tmp_tab){
1682 mw_data->current_tab = NULL;
1683 tmp_tab = g_new(Tab,1);
1684 mw_data->tab = tmp_tab;
1685 }else{
1686 tmp_tab->next = g_new(Tab,1);
1687 tmp_tab = tmp_tab->next;
1688 }
1689
1690 tmp_tab->traceset_info = g_new(TracesetInfo,1);
1691 if(parent){
1692 tmp_tab->traceset_info->traceset =
1693 lttv_traceset_copy(parent->current_tab->traceset_info->traceset);
1694 }else{
1695 if(mw_data->current_tab){
1696 tmp_tab->traceset_info->traceset =
1697 lttv_traceset_copy(mw_data->current_tab->traceset_info->traceset);
1698 }else{
1699 tmp_tab->traceset_info->traceset = lttv_traceset_new();
1700 /* Add the command line trace */
1701 if(g_init_trace != NULL)
1702 lttv_traceset_add(tmp_tab->traceset_info->traceset, g_init_trace);
1703 }
1704 }
1705 //FIXME copy not implemented in lower level
1706 tmp_tab->traceset_info->traceset_context =
1707 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1708 lttv_context_init(
1709 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context),
1710 tmp_tab->traceset_info->traceset);
1711
1712 if(mw_data->current_tab){
1713 // Will have to read directly at the main window level, as we want
1714 // to be able to modify a traceset on the fly.
1715 tmp_tab->time_window = mw_data->current_tab->time_window;
1716 tmp_tab->current_time = mw_data->current_tab->current_time;
1717 }else{
1718 // Will have to read directly at the main window level, as we want
1719 // to be able to modify a traceset on the fly.
1720 // get_traceset_time_span(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
1721 tmp_tab->time_window.start_time =
1722 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime;
1723 if(DEFAULT_TIME_WIDTH_S <
1724 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec)
1725 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
1726 else
1727 tmp_time.tv_sec =
1728 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec;
1729 tmp_time.tv_nsec = 0;
1730 tmp_tab->time_window.time_width = tmp_time ;
1731 tmp_tab->current_time.tv_sec =
1732 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime.tv_sec;
1733 tmp_tab->current_time.tv_nsec =
1734 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime.tv_nsec;
1735 }
1736 tmp_tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1737 // mw_data->current_tab = tmp_tab;
1738 tmp_tab->multi_vpaned = (GtkMultiVPaned*)gtk_multi_vpaned_new();
1739 tmp_tab->multi_vpaned->mw = mw_data;
1740 gtk_widget_show((GtkWidget*)tmp_tab->multi_vpaned);
1741 tmp_tab->next = NULL;
1742 tmp_tab->mw = mw_data;
1743
1744 tmp_tab->label = gtk_label_new (label);
1745 gtk_widget_show (tmp_tab->label);
1746
1747 g_object_set_data_full(
1748 G_OBJECT(tmp_tab->multi_vpaned),
1749 "Tab_Info",
1750 tmp_tab,
1751 (GDestroyNotify)tab_destructor);
1752
1753 lttv_state_add_event_hooks(
1754 (LttvTracesetState*)tmp_tab->traceset_info->traceset_context);
1755
1756 gtk_notebook_append_page(notebook, (GtkWidget*)tmp_tab->multi_vpaned, tmp_tab->label);
1757 list = gtk_container_get_children(GTK_CONTAINER(notebook));
1758 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
1759 }
1760
1761 void remove_menu_item(gpointer main_win, gpointer user_data)
1762 {
1763 MainWindow * mw = (MainWindow *) main_win;
1764 lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data;
1765 GtkWidget * tool_menu_title_menu, *insert_view;
1766
1767 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
1768 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item,
1769 menu_item->menuText);
1770 if(insert_view){
1771 g_hash_table_remove(mw->hash_menu_item, menu_item->menuText);
1772 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
1773 }
1774 }
1775
1776 void remove_toolbar_item(gpointer main_win, gpointer user_data)
1777 {
1778 MainWindow * mw = (MainWindow *) main_win;
1779 lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data;
1780 GtkWidget * tool_menu_title_menu, *insert_view;
1781
1782
1783 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
1784 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item,
1785 toolbar_item->tooltip);
1786 if(insert_view){
1787 g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip);
1788 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
1789 }
1790 }
1791
1792 /**
1793 * Remove menu and toolbar item when a module unloaded
1794 */
1795
1796 void main_window_remove_menu_item(lttv_constructor constructor)
1797 {
1798 int i;
1799 LttvMenus * menu;
1800 lttv_menu_closure *menu_item;
1801 LttvAttributeValue value;
1802 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1803
1804 g_assert(lttv_iattribute_find_by_path(attributes,
1805 "viewers/menu", LTTV_POINTER, &value));
1806 menu = (LttvMenus*)*(value.v_pointer);
1807
1808 if(menu){
1809 for(i=0;i<menu->len;i++){
1810 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1811 if(menu_item->con != constructor) continue;
1812 if(g_main_window_list){
1813 g_slist_foreach(g_main_window_list, remove_menu_item, menu_item);
1814 }
1815 break;
1816 }
1817 }
1818
1819 }
1820
1821 void main_window_remove_toolbar_item(lttv_constructor constructor)
1822 {
1823 int i;
1824 LttvToolbars * toolbar;
1825 lttv_toolbar_closure *toolbar_item;
1826 LttvAttributeValue value;
1827 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1828
1829 g_assert(lttv_iattribute_find_by_path(attributes,
1830 "viewers/toolbar", LTTV_POINTER, &value));
1831 toolbar = (LttvToolbars*)*(value.v_pointer);
1832
1833 if(toolbar){
1834 for(i=0;i<toolbar->len;i++){
1835 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1836 if(toolbar_item->con != constructor) continue;
1837 if(g_main_window_list){
1838 g_slist_foreach(g_main_window_list, remove_toolbar_item, toolbar_item);
1839 }
1840 break;
1841 }
1842 }
1843 }
This page took 0.066367 seconds and 5 git commands to generate.