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