git-svn-id: http://ltt.polymtl.ca/svn@469 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 = get_window_data_struct((GtkWidget*)object);
1137 GtkWidget *widget;
1138 Tab *tab = Main_Window->tab;
1139
1140 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
1141
1142 while(tab){
1143 while(tab->multi_vpaned->num_children){
1144 gtk_multi_vpaned_widget_delete(tab->multi_vpaned);
1145 }
1146 tab = tab->next;
1147 }
1148
1149 g_win_count--;
1150 if(g_win_count == 0)
1151 gtk_main_quit ();
1152 }
1153
1154 gboolean
1155 on_MWindow_configure (GtkWidget *widget,
1156 GdkEventConfigure *event,
1157 gpointer user_data)
1158 {
1159 MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
1160 float width = event->width;
1161 Tab * tab = mw_data->tab;
1162 TimeWindow time_win;
1163 double ratio;
1164 TimeInterval *time_span;
1165 LttTime time;
1166
1167 // MD : removed time width modification upon resizing of the main window.
1168 // The viewers will redraw themselves completely, without time interval
1169 // modification.
1170 /* while(tab){
1171 if(mw_data->window_width){
1172 time_span = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->Time_Span ;
1173 time_win = tab->time_window;
1174 ratio = width / mw_data->window_width;
1175 tab->time_window.time_width = ltt_time_mul(time_win.time_width,ratio);
1176 time = ltt_time_sub(time_span->endTime, time_win.start_time);
1177 if(ltt_time_compare(time, tab->time_window.time_width) < 0){
1178 tab->time_window.time_width = time;
1179 }
1180 }
1181 tab = tab->next;
1182 }
1183
1184 mw_data->window_width = (int)width;
1185 */
1186 return FALSE;
1187 }
1188
1189 void
1190 on_MNotebook_switch_page (GtkNotebook *notebook,
1191 GtkNotebookPage *page,
1192 guint page_num,
1193 gpointer user_data)
1194 {
1195 MainWindow * mw = get_window_data_struct((GtkWidget*)notebook);
1196 Tab * tab = mw->tab;
1197
1198 while(page_num){
1199 tab = tab->next;
1200 page_num--;
1201 }
1202 mw->current_tab = tab;
1203 }
1204
1205 void checkbox_changed(GtkTreeView *treeview,
1206 GtkTreePath *arg1,
1207 GtkTreeViewColumn *arg2,
1208 gpointer user_data)
1209 {
1210 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
1211 GtkTreeIter iter;
1212 gboolean value;
1213
1214 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
1215 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
1216 value = value? FALSE : TRUE;
1217 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
1218 }
1219
1220 }
1221
1222 void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
1223 {
1224 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1225 int i, j, k, nb_eventtype;
1226 LttvTraceSelector * trace;
1227 LttvTracefileSelector * tracefile;
1228 LttvEventtypeSelector * eventtype;
1229 gboolean value, value1, value2;
1230
1231 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
1232 i = 0;
1233 do{
1234 trace = lttv_traceset_selector_trace_get(s, i);
1235 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
1236 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
1237 if(value){
1238 j = 0;
1239 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
1240 do{
1241 if(j<1){//eventtype selector for trace
1242 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value2,-1);
1243 if(value2){
1244 k=0;
1245 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter1, &child_iter)){
1246 do{
1247 eventtype = lttv_trace_selector_eventtype_get(trace,k);
1248 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
1249 lttv_eventtype_selector_set_selected(eventtype,value2);
1250 k++;
1251 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter1));
1252 }
1253 }
1254 }else{ //tracefile selector
1255 tracefile = lttv_trace_selector_tracefile_get(trace, j - 1);
1256 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
1257 lttv_tracefile_selector_set_selected(tracefile,value1);
1258 if(value1){
1259 gtk_tree_model_iter_children((GtkTreeModel*)store, &child_iter1, &child_iter); //eventtype selector
1260 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
1261 if(value2){
1262 k = 0;
1263 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter2, &child_iter1)){
1264 do{//eventtype selector for tracefile
1265 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
1266 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter2, CHECKBOX_COLUMN, &value2,-1);
1267 lttv_eventtype_selector_set_selected(eventtype,value2);
1268 k++;
1269 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter2));
1270 }
1271 }
1272 }
1273 }
1274 j++;
1275 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
1276 }
1277 }
1278 lttv_trace_selector_set_selected(trace,value);
1279 i++;
1280 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
1281 }
1282 }
1283
1284 gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
1285 {
1286 GtkWidget * dialogue;
1287 GtkTreeStore * store;
1288 GtkWidget * tree;
1289 GtkWidget * scroll_win;
1290 GtkCellRenderer * renderer;
1291 GtkTreeViewColumn * column;
1292 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1293 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
1294 LttvTraceSelector * trace;
1295 LttvTracefileSelector * tracefile;
1296 LttvEventtypeSelector * eventtype;
1297 char * name;
1298 gboolean checked;
1299
1300 dialogue = gtk_dialog_new_with_buttons(title,
1301 NULL,
1302 GTK_DIALOG_MODAL,
1303 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1304 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1305 NULL);
1306 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
1307
1308 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
1309 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
1310 g_object_unref (G_OBJECT (store));
1311 g_signal_connect (G_OBJECT (tree), "row-activated",
1312 G_CALLBACK (checkbox_changed),
1313 NULL);
1314
1315
1316 renderer = gtk_cell_renderer_toggle_new ();
1317 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
1318
1319 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
1320
1321 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
1322 renderer,
1323 "active", CHECKBOX_COLUMN,
1324 NULL);
1325 gtk_tree_view_column_set_alignment (column, 0.5);
1326 gtk_tree_view_column_set_fixed_width (column, 20);
1327 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1328
1329 renderer = gtk_cell_renderer_text_new ();
1330 column = gtk_tree_view_column_new_with_attributes (column_title,
1331 renderer,
1332 "text", NAME_COLUMN,
1333 NULL);
1334 gtk_tree_view_column_set_alignment (column, 0.0);
1335 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1336 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
1337
1338 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1339 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1340 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
1341 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1342
1343 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1344
1345 gtk_widget_show(scroll_win);
1346 gtk_widget_show(tree);
1347
1348 nb_trace = lttv_traceset_selector_trace_number(s);
1349 for(i=0;i<nb_trace;i++){
1350 trace = lttv_traceset_selector_trace_get(s, i);
1351 name = lttv_trace_selector_get_name(trace);
1352 gtk_tree_store_append (store, &iter, NULL);
1353 checked = lttv_trace_selector_get_selected(trace);
1354 gtk_tree_store_set (store, &iter,
1355 CHECKBOX_COLUMN,checked,
1356 NAME_COLUMN,name,
1357 -1);
1358
1359 gtk_tree_store_append (store, &child_iter, &iter);
1360 gtk_tree_store_set (store, &child_iter,
1361 CHECKBOX_COLUMN, checked,
1362 NAME_COLUMN,"eventtype",
1363 -1);
1364
1365 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
1366 for(j=0;j<nb_eventtype;j++){
1367 eventtype = lttv_trace_selector_eventtype_get(trace,j);
1368 name = lttv_eventtype_selector_get_name(eventtype);
1369 checked = lttv_eventtype_selector_get_selected(eventtype);
1370 gtk_tree_store_append (store, &child_iter1, &child_iter);
1371 gtk_tree_store_set (store, &child_iter1,
1372 CHECKBOX_COLUMN, checked,
1373 NAME_COLUMN,name,
1374 -1);
1375 }
1376
1377 nb_tracefile = lttv_trace_selector_tracefile_number(trace);
1378 for(j=0;j<nb_tracefile;j++){
1379 tracefile = lttv_trace_selector_tracefile_get(trace, j);
1380 name = lttv_tracefile_selector_get_name(tracefile);
1381 gtk_tree_store_append (store, &child_iter, &iter);
1382 checked = lttv_tracefile_selector_get_selected(tracefile);
1383 gtk_tree_store_set (store, &child_iter,
1384 CHECKBOX_COLUMN, checked,
1385 NAME_COLUMN,name,
1386 -1);
1387
1388 gtk_tree_store_append (store, &child_iter1, &child_iter);
1389 gtk_tree_store_set (store, &child_iter1,
1390 CHECKBOX_COLUMN, checked,
1391 NAME_COLUMN,"eventtype",
1392 -1);
1393
1394 for(k=0;k<nb_eventtype;k++){
1395 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
1396 name = lttv_eventtype_selector_get_name(eventtype);
1397 checked = lttv_eventtype_selector_get_selected(eventtype);
1398 gtk_tree_store_append (store, &child_iter2, &child_iter1);
1399 gtk_tree_store_set (store, &child_iter2,
1400 CHECKBOX_COLUMN, checked,
1401 NAME_COLUMN,name,
1402 -1);
1403 }
1404 }
1405 }
1406
1407 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1408 switch(id){
1409 case GTK_RESPONSE_ACCEPT:
1410 case GTK_RESPONSE_OK:
1411 update_filter(s, store);
1412 gtk_widget_destroy(dialogue);
1413 return TRUE;
1414 case GTK_RESPONSE_REJECT:
1415 case GTK_RESPONSE_CANCEL:
1416 default:
1417 gtk_widget_destroy(dialogue);
1418 break;
1419 }
1420 return FALSE;
1421 }
1422
1423 char * get_remove_trace(char ** all_trace_name, int nb_trace)
1424 {
1425 return get_selection(all_trace_name, nb_trace,
1426 "Select a trace", "Trace pathname");
1427 }
1428 char * get_unload_module(char ** loaded_module_name, int nb_module)
1429 {
1430 return get_selection(loaded_module_name, nb_module,
1431 "Select an unload module", "Module pathname");
1432 }
1433
1434 char * get_selection(char ** loaded_module_name, int nb_module,
1435 char *title, char * column_title)
1436 {
1437 GtkWidget * dialogue;
1438 GtkWidget * scroll_win;
1439 GtkWidget * tree;
1440 GtkListStore * store;
1441 GtkTreeViewColumn * column;
1442 GtkCellRenderer * renderer;
1443 GtkTreeSelection * select;
1444 GtkTreeIter iter;
1445 gint id, i;
1446 char * unload_module_name = NULL;
1447
1448 dialogue = gtk_dialog_new_with_buttons(title,
1449 NULL,
1450 GTK_DIALOG_MODAL,
1451 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1452 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1453 NULL);
1454 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
1455
1456 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1457 gtk_widget_show ( scroll_win);
1458 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1459 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1460
1461 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
1462 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
1463 gtk_widget_show ( tree);
1464 g_object_unref (G_OBJECT (store));
1465
1466 renderer = gtk_cell_renderer_text_new ();
1467 column = gtk_tree_view_column_new_with_attributes (column_title,
1468 renderer,
1469 "text", MODULE_COLUMN,
1470 NULL);
1471 gtk_tree_view_column_set_alignment (column, 0.5);
1472 gtk_tree_view_column_set_fixed_width (column, 150);
1473 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1474
1475 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
1476 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
1477
1478 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1479
1480 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1481
1482 for(i=0;i<nb_module;i++){
1483 gtk_list_store_append (store, &iter);
1484 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
1485 }
1486
1487 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1488 switch(id){
1489 case GTK_RESPONSE_ACCEPT:
1490 case GTK_RESPONSE_OK:
1491 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
1492 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
1493 }
1494 case GTK_RESPONSE_REJECT:
1495 case GTK_RESPONSE_CANCEL:
1496 default:
1497 gtk_widget_destroy(dialogue);
1498 break;
1499 }
1500
1501 return unload_module_name;
1502 }
1503
1504 void main_window_destroy_hash_key(gpointer key)
1505 {
1506 g_free(key);
1507 }
1508
1509 void main_window_destroy_hash_data(gpointer data)
1510 {
1511 }
1512
1513
1514 void insert_menu_toolbar_item(MainWindow * mw, gpointer user_data)
1515 {
1516 int i;
1517 GdkPixbuf *pixbuf;
1518 view_constructor constructor;
1519 LttvMenus * menu;
1520 LttvToolbars * toolbar;
1521 lttv_menu_closure *menu_item;
1522 lttv_toolbar_closure *toolbar_item;
1523 LttvAttributeValue value;
1524 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1525 GtkWidget * tool_menu_title_menu, *insert_view, *pixmap, *tmp;
1526
1527 g_assert(lttv_iattribute_find_by_path(attributes,
1528 "viewers/menu", LTTV_POINTER, &value));
1529 menu = (LttvMenus*)*(value.v_pointer);
1530
1531 if(menu){
1532 for(i=0;i<menu->len;i++){
1533 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1534 tmp = g_hash_table_lookup(mw->hash_menu_item, g_strdup(menu_item->menuText));
1535 if(tmp)continue;
1536 constructor = menu_item->con;
1537 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
1538 insert_view = gtk_menu_item_new_with_mnemonic (menu_item->menuText);
1539 gtk_widget_show (insert_view);
1540 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu), insert_view);
1541 g_signal_connect ((gpointer) insert_view, "activate",
1542 G_CALLBACK (insert_viewer_wrap),
1543 constructor);
1544 g_hash_table_insert(mw->hash_menu_item, g_strdup(menu_item->menuText),
1545 insert_view);
1546 }
1547 }
1548
1549 g_assert(lttv_iattribute_find_by_path(attributes,
1550 "viewers/toolbar", LTTV_POINTER, &value));
1551 toolbar = (LttvToolbars*)*(value.v_pointer);
1552
1553 if(toolbar){
1554 for(i=0;i<toolbar->len;i++){
1555 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1556 tmp = g_hash_table_lookup(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip));
1557 if(tmp)continue;
1558 constructor = toolbar_item->con;
1559 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
1560 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item->pixmap);
1561 pixmap = gtk_image_new_from_pixbuf(pixbuf);
1562 insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
1563 GTK_TOOLBAR_CHILD_BUTTON,
1564 NULL,
1565 "",
1566 toolbar_item->tooltip, NULL,
1567 pixmap, NULL, NULL);
1568 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu)->children)->data))->label), TRUE);
1569 gtk_widget_show (insert_view);
1570 gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1);
1571 g_signal_connect ((gpointer) insert_view, "clicked",G_CALLBACK (insert_viewer_wrap),constructor);
1572 g_hash_table_insert(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip),
1573 insert_view);
1574 }
1575 }
1576 }
1577
1578 void construct_main_window(MainWindow * parent, WindowCreationData * win_creation_data)
1579 {
1580 g_critical("construct_main_window()");
1581 GtkWidget * new_window; /* New generated main window */
1582 MainWindow * new_m_window;/* New main window structure */
1583 GtkNotebook * notebook;
1584 LttvIAttribute *attributes =
1585 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1586 LttvAttributeValue value;
1587
1588 new_m_window = g_new(MainWindow, 1);
1589
1590 // Add the object's information to the module's array
1591 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
1592
1593
1594 new_window = create_MWindow();
1595 gtk_widget_show (new_window);
1596
1597 new_m_window->attributes = attributes;
1598
1599 new_m_window->mwindow = new_window;
1600 new_m_window->tab = NULL;
1601 new_m_window->current_tab = NULL;
1602 new_m_window->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1603 if(parent){
1604 new_m_window->win_creation_data = parent->win_creation_data;
1605 }else{
1606 new_m_window->win_creation_data = win_creation_data;
1607 }
1608
1609 new_m_window->hash_menu_item = g_hash_table_new_full (g_str_hash, g_str_equal,
1610 main_window_destroy_hash_key,
1611 main_window_destroy_hash_data);
1612 new_m_window->hash_toolbar_item = g_hash_table_new_full (g_str_hash, g_str_equal,
1613 main_window_destroy_hash_key,
1614 main_window_destroy_hash_data);
1615
1616 insert_menu_toolbar_item(new_m_window, NULL);
1617
1618 g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);
1619
1620 //create a default tab
1621 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
1622 if(notebook == NULL){
1623 g_printf("Notebook does not exist\n");
1624 return;
1625 }
1626 //for now there is no name field in LttvTraceset structure
1627 //Use "Traceset" as the label for the default tab
1628 create_tab(parent, new_m_window, notebook,"Traceset");
1629
1630 g_object_set_data_full(
1631 G_OBJECT(new_m_window->mwindow),
1632 "Main_Window_Data",
1633 new_m_window,
1634 (GDestroyNotify)main_window_free);
1635
1636 g_win_count++;
1637 }
1638
1639 void tab_destructor(Tab * tab_instance)
1640 {
1641 int i, nb, ref_count;
1642 LttvTrace * trace;
1643
1644 if(tab_instance->attributes)
1645 g_object_unref(tab_instance->attributes);
1646
1647 if(tab_instance->mw->tab == tab_instance){
1648 tab_instance->mw->tab = tab_instance->next;
1649 }else{
1650 Tab * tmp1, *tmp = tab_instance->mw->tab;
1651 while(tmp != tab_instance){
1652 tmp1 = tmp;
1653 tmp = tmp->next;
1654 }
1655 tmp1->next = tab_instance->next;
1656 }
1657
1658 if(tab_instance->traceset_info->traceset_context != NULL){
1659 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
1660 traceset_context));
1661 g_object_unref(tab_instance->traceset_info->traceset_context);
1662 }
1663 if(tab_instance->traceset_info->traceset != NULL) {
1664 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
1665 for(i = 0 ; i < nb ; i++) {
1666 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
1667 ref_count = lttv_trace_get_ref_number(trace);
1668 if(ref_count <= 1){
1669 ltt_trace_close(lttv_trace(trace));
1670 lttv_trace_destroy(trace);
1671 }
1672 // lttv_trace_destroy(trace);
1673 }
1674 }
1675 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
1676 g_free(tab_instance->traceset_info);
1677 g_free(tab_instance);
1678 }
1679
1680 void * create_tab(MainWindow * parent, MainWindow* current_window,
1681 GtkNotebook * notebook, char * label)
1682 {
1683 GList * list;
1684 Tab * tmp_tab;
1685 MainWindow * mw_data = current_window;
1686 LttTime tmp_time;
1687
1688 tmp_tab = mw_data->tab;
1689 while(tmp_tab && tmp_tab->next) tmp_tab = tmp_tab->next;
1690 if(!tmp_tab){
1691 mw_data->current_tab = NULL;
1692 tmp_tab = g_new(Tab,1);
1693 mw_data->tab = tmp_tab;
1694 }else{
1695 tmp_tab->next = g_new(Tab,1);
1696 tmp_tab = tmp_tab->next;
1697 }
1698
1699 tmp_tab->traceset_info = g_new(TracesetInfo,1);
1700 if(parent){
1701 tmp_tab->traceset_info->traceset =
1702 lttv_traceset_copy(parent->current_tab->traceset_info->traceset);
1703 }else{
1704 if(mw_data->current_tab){
1705 tmp_tab->traceset_info->traceset =
1706 lttv_traceset_copy(mw_data->current_tab->traceset_info->traceset);
1707 }else{
1708 tmp_tab->traceset_info->traceset = lttv_traceset_new();
1709 /* Add the command line trace */
1710 if(g_init_trace != NULL)
1711 lttv_traceset_add(tmp_tab->traceset_info->traceset, g_init_trace);
1712 }
1713 }
1714 //FIXME copy not implemented in lower level
1715 tmp_tab->traceset_info->traceset_context =
1716 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1717 lttv_context_init(
1718 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context),
1719 tmp_tab->traceset_info->traceset);
1720
1721 if(mw_data->current_tab){
1722 // Will have to read directly at the main window level, as we want
1723 // to be able to modify a traceset on the fly.
1724 tmp_tab->time_window = mw_data->current_tab->time_window;
1725 tmp_tab->current_time = mw_data->current_tab->current_time;
1726 }else{
1727 // Will have to read directly at the main window level, as we want
1728 // to be able to modify a traceset on the fly.
1729 // get_traceset_time_span(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
1730 tmp_tab->time_window.start_time =
1731 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime;
1732 if(DEFAULT_TIME_WIDTH_S <
1733 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec)
1734 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
1735 else
1736 tmp_time.tv_sec =
1737 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec;
1738 tmp_time.tv_nsec = 0;
1739 tmp_tab->time_window.time_width = tmp_time ;
1740 tmp_tab->current_time.tv_sec =
1741 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime.tv_sec;
1742 tmp_tab->current_time.tv_nsec =
1743 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime.tv_nsec;
1744 }
1745 tmp_tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1746 // mw_data->current_tab = tmp_tab;
1747 tmp_tab->multi_vpaned = (GtkMultiVPaned*)gtk_multi_vpaned_new();
1748 tmp_tab->multi_vpaned->mw = mw_data;
1749 gtk_widget_show((GtkWidget*)tmp_tab->multi_vpaned);
1750 tmp_tab->next = NULL;
1751 tmp_tab->mw = mw_data;
1752
1753 tmp_tab->label = gtk_label_new (label);
1754 gtk_widget_show (tmp_tab->label);
1755
1756 g_object_set_data_full(
1757 G_OBJECT(tmp_tab->multi_vpaned),
1758 "Tab_Info",
1759 tmp_tab,
1760 (GDestroyNotify)tab_destructor);
1761
1762 lttv_state_add_event_hooks(
1763 (LttvTracesetState*)tmp_tab->traceset_info->traceset_context);
1764
1765 gtk_notebook_append_page(notebook, (GtkWidget*)tmp_tab->multi_vpaned, tmp_tab->label);
1766 list = gtk_container_get_children(GTK_CONTAINER(notebook));
1767 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
1768 }
1769
1770 void remove_menu_item(gpointer main_win, gpointer user_data)
1771 {
1772 MainWindow * mw = (MainWindow *) main_win;
1773 lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data;
1774 GtkWidget * tool_menu_title_menu, *insert_view;
1775
1776 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
1777 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item,
1778 menu_item->menuText);
1779 if(insert_view){
1780 g_hash_table_remove(mw->hash_menu_item, menu_item->menuText);
1781 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
1782 }
1783 }
1784
1785 void remove_toolbar_item(gpointer main_win, gpointer user_data)
1786 {
1787 MainWindow * mw = (MainWindow *) main_win;
1788 lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data;
1789 GtkWidget * tool_menu_title_menu, *insert_view;
1790
1791
1792 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
1793 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item,
1794 toolbar_item->tooltip);
1795 if(insert_view){
1796 g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip);
1797 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
1798 }
1799 }
1800
1801 /**
1802 * Remove menu and toolbar item when a module unloaded
1803 */
1804
1805 void main_window_remove_menu_item(lttv_constructor constructor)
1806 {
1807 int i;
1808 LttvMenus * menu;
1809 lttv_menu_closure *menu_item;
1810 LttvAttributeValue value;
1811 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1812
1813 g_assert(lttv_iattribute_find_by_path(attributes,
1814 "viewers/menu", LTTV_POINTER, &value));
1815 menu = (LttvMenus*)*(value.v_pointer);
1816
1817 if(menu){
1818 for(i=0;i<menu->len;i++){
1819 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1820 if(menu_item->con != constructor) continue;
1821 if(g_main_window_list){
1822 g_slist_foreach(g_main_window_list, remove_menu_item, menu_item);
1823 }
1824 break;
1825 }
1826 }
1827
1828 }
1829
1830 void main_window_remove_toolbar_item(lttv_constructor constructor)
1831 {
1832 int i;
1833 LttvToolbars * toolbar;
1834 lttv_toolbar_closure *toolbar_item;
1835 LttvAttributeValue value;
1836 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1837
1838 g_assert(lttv_iattribute_find_by_path(attributes,
1839 "viewers/toolbar", LTTV_POINTER, &value));
1840 toolbar = (LttvToolbars*)*(value.v_pointer);
1841
1842 if(toolbar){
1843 for(i=0;i<toolbar->len;i++){
1844 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1845 if(toolbar_item->con != constructor) continue;
1846 if(g_main_window_list){
1847 g_slist_foreach(g_main_window_list, remove_toolbar_item, toolbar_item);
1848 }
1849 break;
1850 }
1851 }
1852 }
This page took 0.07518 seconds and 4 git commands to generate.