git-svn-id: http://ltt.polymtl.ca/svn@471 04897980-b3bd-0310-b5e0-8ef037075253
[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);
2176f952 424 trace = ltt_trace_open(dir);
425 if(trace == NULL) g_critical("cannot open trace %s", dir);
426 trace_v = lttv_trace_new(trace);
716e4367 427 traceset = mw_data->current_tab->traceset_info->traceset;
428 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
429 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
430 traceset_info->traceset_context));
431 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
2176f952 432 }
433 lttv_traceset_add(traceset, trace_v);
716e4367 434 mw_data->current_tab->traceset_info->traceset_context =
2176f952 435 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
436 lttv_context_init(
716e4367 437 LTTV_TRACESET_CONTEXT(mw_data->current_tab->traceset_info->
49bf71b5 438 traceset_context),traceset);
439 add_trace_into_traceset_selector(mw_data->current_tab->multi_vpaned, trace);
440
441 gtk_widget_destroy((GtkWidget*)file_selector);
442
443 //update current tab
a8c0f09d 444 update_traceset(mw_data);
445 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
202f6c8f 446 set_current_time(mw_data,&(mw_data->current_tab->current_time));
49bf71b5 447 break;
2176f952 448 case GTK_RESPONSE_REJECT:
449 case GTK_RESPONSE_CANCEL:
450 default:
68b48a45 451 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 452 break;
453 }
49bf71b5 454}
455
456void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i)
457{
458 LttvTracesetSelector * s;
459 LttvTraceSelector * t;
460 GtkWidget * w;
461
462 w = gtk_multi_vpaned_get_first_widget(paned);
463 while(w){
464 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
ed3b99b6 465 t = lttv_traceset_selector_trace_get(s,i);
466 lttv_traceset_selector_trace_remove(s, i);
49bf71b5 467 lttv_trace_selector_destroy(t);
468 w = gtk_multi_vpaned_get_next_widget(paned);
469 }
561eba2a 470}
471
472void remove_trace(GtkWidget * widget, gpointer user_data)
473{
2176f952 474 LttTrace *trace;
475 LttvTrace * trace_v;
476 LttvTraceset * traceset;
477 gint i, nb_trace;
478 char ** name, *remove_trace_name;
bca3b81f 479 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 480 LttvTracesetSelector * s;
481 LttvTraceSelector * t;
482 GtkWidget * w;
483 gboolean selected;
2176f952 484
716e4367 485 nb_trace =lttv_traceset_number(mw_data->current_tab->traceset_info->traceset);
2176f952 486 name = g_new(char*,nb_trace);
487 for(i = 0; i < nb_trace; i++){
716e4367 488 trace_v = lttv_traceset_get(mw_data->current_tab->
489 traceset_info->traceset, i);
2176f952 490 trace = lttv_trace(trace_v);
a5dcde2f 491 name[i] = ltt_trace_name(trace);
2176f952 492 }
493
494 remove_trace_name = get_remove_trace(name, nb_trace);
495
496 if(remove_trace_name){
497 for(i=0; i<nb_trace; i++){
498 if(strcmp(remove_trace_name,name[i]) == 0){
49bf71b5 499 //unselect the trace from the current viewer
500 w = gtk_multi_vpaned_get_widget(mw_data->current_tab->multi_vpaned);
501 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
ed3b99b6 502 t = lttv_traceset_selector_trace_get(s,i);
49bf71b5 503 lttv_trace_selector_set_selected(t, FALSE);
504
505 //check if other viewers select the trace
506 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
507 while(w){
508 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
ed3b99b6 509 t = lttv_traceset_selector_trace_get(s,i);
49bf71b5 510 selected = lttv_trace_selector_get_selected(t);
511 if(selected)break;
512 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
513 }
514
515 //if no viewer selects the trace, remove it
516 if(!selected){
517 remove_trace_from_traceset_selector(mw_data->current_tab->multi_vpaned, i);
518
519 traceset = mw_data->current_tab->traceset_info->traceset;
520 trace_v = lttv_traceset_get(traceset, i);
521 if(lttv_trace_get_ref_number(trace_v) <= 1)
522 ltt_trace_close(lttv_trace(trace_v));
523
524 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
525 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
526 traceset_info->traceset_context));
527 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
528 }
529 lttv_traceset_remove(traceset, i);
530 lttv_trace_destroy(trace_v);
531 mw_data->current_tab->traceset_info->traceset_context =
532 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
533 lttv_context_init(
534 LTTV_TRACESET_CONTEXT(mw_data->current_tab->
535 traceset_info->traceset_context),traceset);
536 //update current tab
a8c0f09d 537 update_traceset(mw_data);
538 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
202f6c8f 539 set_current_time(mw_data,&(mw_data->current_tab->current_time));
2176f952 540 }
2176f952 541 break;
542 }
543 }
544 }
545
546 g_free(name);
561eba2a 547}
548
549void save(GtkWidget * widget, gpointer user_data)
550{
551 g_printf("Save\n");
552}
553
554void save_as(GtkWidget * widget, gpointer user_data)
555{
556 g_printf("Save as\n");
557}
558
1f1ae829 559void zoom(GtkWidget * widget, double size)
560{
561 TimeInterval *time_span;
562 TimeWindow time_window;
a8c0f09d 563 LttTime current_time, time_delta, time_s, time_e, time_t;
1f1ae829 564 MainWindow * mw_data = get_window_data_struct(widget);
565
fda16332 566 if(size == 1) return;
567
716e4367 568 time_span = LTTV_TRACESET_CONTEXT(mw_data->current_tab->
569 traceset_info->traceset_context)->Time_Span;
1f1ae829 570 time_window = mw_data->current_tab->time_window;
571 current_time = mw_data->current_tab->current_time;
572
573 time_delta = ltt_time_sub(time_span->endTime,time_span->startTime);
574 if(size == 0){
575 time_window.start_time = time_span->startTime;
576 time_window.time_width = time_delta;
577 }else{
578 time_window.time_width = ltt_time_div(time_window.time_width, size);
579 if(ltt_time_compare(time_window.time_width,time_delta) > 0)
fda16332 580 time_window.time_width = time_delta;
1f1ae829 581
a8c0f09d 582 time_t = ltt_time_div(time_window.time_width, 2);
583 if(ltt_time_compare(current_time, time_t) < 0){
584 time_s = time_span->startTime;
585 } else {
586 time_s = ltt_time_sub(current_time,time_t);
587 }
588 time_e = ltt_time_add(current_time,time_t);
1f1ae829 589 if(ltt_time_compare(time_span->startTime, time_s) > 0){
590 time_s = time_span->startTime;
591 }else if(ltt_time_compare(time_span->endTime, time_e) < 0){
592 time_e = time_span->endTime;
593 time_s = ltt_time_sub(time_e,time_window.time_width);
594 }
595 time_window.start_time = time_s;
596 }
a8c0f09d 597 redraw_viewer(mw_data, &time_window);
202f6c8f 598 set_current_time(mw_data,&(mw_data->current_tab->current_time));
daecc161 599 gtk_multi_vpaned_set_adjust(mw_data->current_tab->multi_vpaned, FALSE);
1f1ae829 600}
601
561eba2a 602void zoom_in(GtkWidget * widget, gpointer user_data)
603{
1f1ae829 604 zoom(widget, 2);
561eba2a 605}
606
607void zoom_out(GtkWidget * widget, gpointer user_data)
608{
1f1ae829 609 zoom(widget, 0.5);
561eba2a 610}
611
612void zoom_extended(GtkWidget * widget, gpointer user_data)
613{
1f1ae829 614 zoom(widget, 0);
561eba2a 615}
616
617void go_to_time(GtkWidget * widget, gpointer user_data)
618{
619 g_printf("Go to time\n");
620}
621
622void show_time_frame(GtkWidget * widget, gpointer user_data)
623{
624 g_printf("Show time frame\n");
625}
626
627
628/* callback function */
629
630void
631on_empty_traceset_activate (GtkMenuItem *menuitem,
632 gpointer user_data)
633{
68b48a45 634 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 635}
636
637
638void
639on_clone_traceset_activate (GtkMenuItem *menuitem,
640 gpointer user_data)
641{
68b48a45 642 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 643}
644
2901f314 645void create_new_tab(GtkWidget* widget, gpointer user_data){
6b1d3120 646 gchar label[PATH_LENGTH];
2901f314 647 MainWindow * mw_data = get_window_data_struct(widget);
648 GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
561eba2a 649 if(notebook == NULL){
650 g_printf("Notebook does not exist\n");
651 return;
652 }
653
6b1d3120 654 strcpy(label,"Page");
eb38aea5 655 if(get_label(mw_data, label,"Get the name of the tab","Please input tab's name"))
656 create_tab (mw_data, mw_data, notebook, label);
561eba2a 657}
658
2901f314 659void
660on_tab_activate (GtkMenuItem *menuitem,
661 gpointer user_data)
662{
663 create_new_tab((GtkWidget*)menuitem, user_data);
664}
665
561eba2a 666
667void
668on_open_activate (GtkMenuItem *menuitem,
669 gpointer user_data)
670{
671 open_traceset((GtkWidget*)menuitem, user_data);
672}
673
674
675void
676on_close_activate (GtkMenuItem *menuitem,
677 gpointer user_data)
678{
bca3b81f 679 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 680 main_window_destructor(mw_data);
561eba2a 681}
682
683
684void
685on_close_tab_activate (GtkMenuItem *menuitem,
686 gpointer user_data)
687{
2061e03d 688 int count = 0;
689 GtkWidget * notebook;
bca3b81f 690 Tab * tmp;
691 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2061e03d 692 notebook = lookup_widget((GtkWidget*)menuitem, "MNotebook");
693 if(notebook == NULL){
694 g_printf("Notebook does not exist\n");
695 return;
696 }
697
bca3b81f 698 if(mw_data->tab == mw_data->current_tab){
699 // tmp = mw_data->current_tb;
700 // mw_data->tab = mw_data->current_tab->next;
2061e03d 701 g_printf("The default TAB can not be deleted\n");
702 return;
703 }else{
bca3b81f 704 tmp = mw_data->tab;
705 while(tmp != mw_data->current_tab){
706 tmp = tmp->next;
2061e03d 707 count++;
708 }
709 }
710
711 gtk_notebook_remove_page((GtkNotebook*)notebook, count);
561eba2a 712}
713
714
715void
716on_add_trace_activate (GtkMenuItem *menuitem,
717 gpointer user_data)
718{
719 add_trace((GtkWidget*)menuitem, user_data);
720}
721
722
723void
724on_remove_trace_activate (GtkMenuItem *menuitem,
725 gpointer user_data)
726{
727 remove_trace((GtkWidget*)menuitem, user_data);
728}
729
730
731void
732on_save_activate (GtkMenuItem *menuitem,
733 gpointer user_data)
734{
735 save((GtkWidget*)menuitem, user_data);
736}
737
738
739void
740on_save_as_activate (GtkMenuItem *menuitem,
741 gpointer user_data)
742{
743 save_as((GtkWidget*)menuitem, user_data);
744}
745
746
747void
748on_quit_activate (GtkMenuItem *menuitem,
749 gpointer user_data)
750{
2061e03d 751 gtk_main_quit ();
561eba2a 752}
753
754
755void
756on_cut_activate (GtkMenuItem *menuitem,
757 gpointer user_data)
758{
759 g_printf("Cut\n");
760}
761
762
763void
764on_copy_activate (GtkMenuItem *menuitem,
765 gpointer user_data)
766{
767 g_printf("Copye\n");
768}
769
770
771void
772on_paste_activate (GtkMenuItem *menuitem,
773 gpointer user_data)
774{
775 g_printf("Paste\n");
776}
777
778
779void
780on_delete_activate (GtkMenuItem *menuitem,
781 gpointer user_data)
782{
783 g_printf("Delete\n");
784}
785
786
787void
788on_zoom_in_activate (GtkMenuItem *menuitem,
789 gpointer user_data)
790{
791 zoom_in((GtkWidget*)menuitem, user_data);
792}
793
794
795void
796on_zoom_out_activate (GtkMenuItem *menuitem,
797 gpointer user_data)
798{
799 zoom_out((GtkWidget*)menuitem, user_data);
800}
801
802
803void
804on_zoom_extended_activate (GtkMenuItem *menuitem,
805 gpointer user_data)
806{
807 zoom_extended((GtkWidget*)menuitem, user_data);
808}
809
810
811void
812on_go_to_time_activate (GtkMenuItem *menuitem,
813 gpointer user_data)
814{
815 go_to_time((GtkWidget*)menuitem, user_data);
816}
817
818
819void
820on_show_time_frame_activate (GtkMenuItem *menuitem,
821 gpointer user_data)
822{
823 show_time_frame((GtkWidget*)menuitem, user_data);
824}
825
826
827void
828on_move_viewer_up_activate (GtkMenuItem *menuitem,
829 gpointer user_data)
830{
831 move_up_viewer((GtkWidget*)menuitem, user_data);
832}
833
834
835void
836on_move_viewer_down_activate (GtkMenuItem *menuitem,
837 gpointer user_data)
838{
839 move_down_viewer((GtkWidget*)menuitem, user_data);
840}
841
842
843void
844on_remove_viewer_activate (GtkMenuItem *menuitem,
845 gpointer user_data)
846{
847 delete_viewer((GtkWidget*)menuitem, user_data);
848}
849
49bf71b5 850void
851on_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 }
a8c0f09d 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 }
49bf71b5 868}
869
870void
871on_trace_facility_activate (GtkMenuItem *menuitem,
872 gpointer user_data)
873{
874 g_printf("Trace facility selector: %s\n");
875}
561eba2a 876
877void
878on_load_module_activate (GtkMenuItem *menuitem,
879 gpointer user_data)
880{
36b3c068 881 char ** dir;
882 gint id;
3872a20e 883 char str[PATH_LENGTH], *str1;
bca3b81f 884 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 885 GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a module");
886 gtk_file_selection_hide_fileop_buttons(file_selector);
36b3c068 887
888 str[0] = '\0';
68b48a45 889 id = gtk_dialog_run(GTK_DIALOG(file_selector));
36b3c068 890 switch(id){
891 case GTK_RESPONSE_ACCEPT:
892 case GTK_RESPONSE_OK:
68b48a45 893 dir = gtk_file_selection_get_selections (file_selector);
36b3c068 894 sprintf(str,dir[0]);
3872a20e 895 str1 = strrchr(str,'/');
896 if(str1)str1++;
897 else{
898 str1 = strrchr(str,'\\');
899 str1++;
900 }
bca3b81f 901 if(mw_data->win_creation_data)
902 lttv_module_load(str1, mw_data->win_creation_data->argc,mw_data->win_creation_data->argv);
36b3c068 903 else
3872a20e 904 lttv_module_load(str1, 0,NULL);
f2d17b4d 905 g_slist_foreach(g_main_window_list, (gpointer)insert_menu_toolbar_item,
906 NULL);
36b3c068 907 g_strfreev(dir);
908 case GTK_RESPONSE_REJECT:
909 case GTK_RESPONSE_CANCEL:
910 default:
68b48a45 911 gtk_widget_destroy((GtkWidget*)file_selector);
36b3c068 912 break;
913 }
914 g_printf("Load module: %s\n", str);
561eba2a 915}
916
917
918void
919on_unload_module_activate (GtkMenuItem *menuitem,
920 gpointer user_data)
921{
36b3c068 922 int i;
923 char **name, *unload_module_name;
924 guint nb;
925 LttvModule ** modules, *module;
bca3b81f 926 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
36b3c068 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);
561eba2a 947}
948
949
950void
951on_add_module_search_path_activate (GtkMenuItem *menuitem,
952 gpointer user_data)
953{
68b48a45 954 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select module path");
67b98724 955 const char * dir;
fc188b78 956 gint id;
957
bca3b81f 958 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
fc188b78 959
68b48a45 960 id = gtk_dialog_run(GTK_DIALOG(file_selector));
fc188b78 961 switch(id){
962 case GTK_RESPONSE_ACCEPT:
963 case GTK_RESPONSE_OK:
68b48a45 964 dir = gtk_dir_selection_get_dir (file_selector);
fc188b78 965 lttv_module_path_add(dir);
966 case GTK_RESPONSE_REJECT:
967 case GTK_RESPONSE_CANCEL:
968 default:
68b48a45 969 gtk_widget_destroy((GtkWidget*)file_selector);
fc188b78 970 break;
6b1d3120 971 }
561eba2a 972}
973
974
975void
976on_color_activate (GtkMenuItem *menuitem,
977 gpointer user_data)
978{
979 g_printf("Color\n");
980}
981
982
983void
984on_filter_activate (GtkMenuItem *menuitem,
985 gpointer user_data)
986{
987 g_printf("Filter\n");
988}
989
990
991void
992on_save_configuration_activate (GtkMenuItem *menuitem,
993 gpointer user_data)
994{
995 g_printf("Save configuration\n");
996}
997
998
999void
1000on_content_activate (GtkMenuItem *menuitem,
1001 gpointer user_data)
1002{
1003 g_printf("Content\n");
1004}
1005
1006
1007void
1008on_about_activate (GtkMenuItem *menuitem,
1009 gpointer user_data)
1010{
1011 g_printf("About...\n");
1012}
1013
1014
1015void
1016on_button_new_clicked (GtkButton *button,
1017 gpointer user_data)
1018{
6f7ad7ae 1019 create_new_window((GtkWidget*)button, user_data, TRUE);
561eba2a 1020}
1021
2901f314 1022void
1023on_button_new_tab_clicked (GtkButton *button,
1024 gpointer user_data)
1025{
1026 create_new_tab((GtkWidget*)button, user_data);
1027}
561eba2a 1028
1029void
1030on_button_open_clicked (GtkButton *button,
1031 gpointer user_data)
1032{
1033 open_traceset((GtkWidget*)button, user_data);
1034}
1035
1036
1037void
1038on_button_add_trace_clicked (GtkButton *button,
1039 gpointer user_data)
1040{
1041 add_trace((GtkWidget*)button, user_data);
1042}
1043
1044
1045void
1046on_button_remove_trace_clicked (GtkButton *button,
1047 gpointer user_data)
1048{
1049 remove_trace((GtkWidget*)button, user_data);
1050}
1051
1052
1053void
1054on_button_save_clicked (GtkButton *button,
1055 gpointer user_data)
1056{
1057 save((GtkWidget*)button, user_data);
1058}
1059
1060
1061void
1062on_button_save_as_clicked (GtkButton *button,
1063 gpointer user_data)
1064{
1065 save_as((GtkWidget*)button, user_data);
1066}
1067
1068
1069void
1070on_button_zoom_in_clicked (GtkButton *button,
1071 gpointer user_data)
1072{
1073 zoom_in((GtkWidget*)button, user_data);
1074}
1075
1076
1077void
1078on_button_zoom_out_clicked (GtkButton *button,
1079 gpointer user_data)
1080{
1081 zoom_out((GtkWidget*)button, user_data);
1082}
1083
1084
1085void
1086on_button_zoom_extended_clicked (GtkButton *button,
1087 gpointer user_data)
1088{
1089 zoom_extended((GtkWidget*)button, user_data);
1090}
1091
1092
1093void
1094on_button_go_to_time_clicked (GtkButton *button,
1095 gpointer user_data)
1096{
1097 go_to_time((GtkWidget*)button, user_data);
1098}
1099
1100
1101void
1102on_button_show_time_frame_clicked (GtkButton *button,
1103 gpointer user_data)
1104{
1105 show_time_frame((GtkWidget*)button, user_data);
1106}
1107
1108
1109void
1110on_button_move_up_clicked (GtkButton *button,
1111 gpointer user_data)
1112{
1113 move_up_viewer((GtkWidget*)button, user_data);
1114}
1115
1116
1117void
1118on_button_move_down_clicked (GtkButton *button,
1119 gpointer user_data)
1120{
1121 move_down_viewer((GtkWidget*)button, user_data);
1122}
1123
1124
1125void
1126on_button_delete_viewer_clicked (GtkButton *button,
1127 gpointer user_data)
1128{
1129 delete_viewer((GtkWidget*)button, user_data);
1130}
1131
1132void
1133on_MWindow_destroy (GtkObject *object,
1134 gpointer user_data)
1135{
e4d09234 1136 MainWindow *Main_Window = get_window_data_struct((GtkWidget*)object);
1137 GtkWidget *widget;
1138 Tab *tab = Main_Window->tab;
1139
68b48a45 1140 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
561eba2a 1141
e4d09234 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
68b48a45 1149 g_win_count--;
1150 if(g_win_count == 0)
7a859036 1151 gtk_main_quit ();
561eba2a 1152}
1153
58eecf4a 1154gboolean
1155on_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;
bd24a9af 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){
58eecf4a 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;
bd24a9af 1185 */
58eecf4a 1186 return FALSE;
1187}
561eba2a 1188
1189void
1190on_MNotebook_switch_page (GtkNotebook *notebook,
1191 GtkNotebookPage *page,
1192 guint page_num,
1193 gpointer user_data)
1194{
bca3b81f 1195 MainWindow * mw = get_window_data_struct((GtkWidget*)notebook);
1196 Tab * tab = mw->tab;
561eba2a 1197
1198 while(page_num){
bca3b81f 1199 tab = tab->next;
561eba2a 1200 page_num--;
1201 }
bca3b81f 1202 mw->current_tab = tab;
561eba2a 1203}
1204
49bf71b5 1205void 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
1222void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
1223{
ed3b99b6 1224 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1225 int i, j, k, nb_eventtype;
49bf71b5 1226 LttvTraceSelector * trace;
1227 LttvTracefileSelector * tracefile;
ed3b99b6 1228 LttvEventtypeSelector * eventtype;
1229 gboolean value, value1, value2;
49bf71b5 1230
1231 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
1232 i = 0;
1233 do{
ed3b99b6 1234 trace = lttv_traceset_selector_trace_get(s, i);
1235 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
49bf71b5 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{
ed3b99b6 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 }
49bf71b5 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
a8c0f09d 1284gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
49bf71b5 1285{
1286 GtkWidget * dialogue;
1287 GtkTreeStore * store;
1288 GtkWidget * tree;
1289 GtkWidget * scroll_win;
1290 GtkCellRenderer * renderer;
1291 GtkTreeViewColumn * column;
ed3b99b6 1292 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1293 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
49bf71b5 1294 LttvTraceSelector * trace;
1295 LttvTracefileSelector * tracefile;
ed3b99b6 1296 LttvEventtypeSelector * eventtype;
49bf71b5 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);
ed3b99b6 1306 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
49bf71b5 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
ed3b99b6 1348 nb_trace = lttv_traceset_selector_trace_number(s);
49bf71b5 1349 for(i=0;i<nb_trace;i++){
ed3b99b6 1350 trace = lttv_traceset_selector_trace_get(s, i);
49bf71b5 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);
ed3b99b6 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);
49bf71b5 1378 for(j=0;j<nb_tracefile;j++){
ed3b99b6 1379 tracefile = lttv_trace_selector_tracefile_get(trace, j);
49bf71b5 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);
ed3b99b6 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 }
49bf71b5 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);
a8c0f09d 1412 gtk_widget_destroy(dialogue);
1413 return TRUE;
49bf71b5 1414 case GTK_RESPONSE_REJECT:
1415 case GTK_RESPONSE_CANCEL:
1416 default:
1417 gtk_widget_destroy(dialogue);
1418 break;
1419 }
a8c0f09d 1420 return FALSE;
49bf71b5 1421}
1422
2176f952 1423char * 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}
36b3c068 1428char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 1429{
1430 return get_selection(loaded_module_name, nb_module,
1431 "Select an unload module", "Module pathname");
1432}
1433
1434char * get_selection(char ** loaded_module_name, int nb_module,
1435 char *title, char * column_title)
36b3c068 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
2176f952 1448 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 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 ();
2176f952 1467 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 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}
5723fa24 1503
2176f952 1504void main_window_destroy_hash_key(gpointer key)
2061e03d 1505{
1506 g_free(key);
1507}
1508
2176f952 1509void main_window_destroy_hash_data(gpointer data)
2061e03d 1510{
1511}
1512
1513
bca3b81f 1514void insert_menu_toolbar_item(MainWindow * mw, gpointer user_data)
5723fa24 1515{
1516 int i;
1517 GdkPixbuf *pixbuf;
1518 view_constructor constructor;
1519 LttvMenus * menu;
1520 LttvToolbars * toolbar;
68b48a45 1521 lttv_menu_closure *menu_item;
1522 lttv_toolbar_closure *toolbar_item;
5723fa24 1523 LttvAttributeValue value;
1524 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
68b48a45 1525 GtkWidget * tool_menu_title_menu, *insert_view, *pixmap, *tmp;
5723fa24 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++){
68b48a45 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));
3872a20e 1535 if(tmp)continue;
68b48a45 1536 constructor = menu_item->con;
bca3b81f 1537 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
68b48a45 1538 insert_view = gtk_menu_item_new_with_mnemonic (menu_item->menuText);
5723fa24 1539 gtk_widget_show (insert_view);
68b48a45 1540 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu), insert_view);
5723fa24 1541 g_signal_connect ((gpointer) insert_view, "activate",
68b48a45 1542 G_CALLBACK (insert_viewer_wrap),
5723fa24 1543 constructor);
68b48a45 1544 g_hash_table_insert(mw->hash_menu_item, g_strdup(menu_item->menuText),
2061e03d 1545 insert_view);
5723fa24 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++){
68b48a45 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));
3872a20e 1557 if(tmp)continue;
68b48a45 1558 constructor = toolbar_item->con;
bca3b81f 1559 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
68b48a45 1560 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item->pixmap);
5723fa24 1561 pixmap = gtk_image_new_from_pixbuf(pixbuf);
68b48a45 1562 insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
5723fa24 1563 GTK_TOOLBAR_CHILD_BUTTON,
1564 NULL,
1565 "",
68b48a45 1566 toolbar_item->tooltip, NULL,
5723fa24 1567 pixmap, NULL, NULL);
68b48a45 1568 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu)->children)->data))->label), TRUE);
5723fa24 1569 gtk_widget_show (insert_view);
1570 gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1);
68b48a45 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),
2061e03d 1573 insert_view);
5723fa24 1574 }
1575 }
1576}
1577
716e4367 1578void construct_main_window(MainWindow * parent, WindowCreationData * win_creation_data)
5723fa24 1579{
68b48a45 1580 g_critical("construct_main_window()");
1581 GtkWidget * new_window; /* New generated main window */
bca3b81f 1582 MainWindow * new_m_window;/* New main window structure */
5723fa24 1583 GtkNotebook * notebook;
f7afe191 1584 LttvIAttribute *attributes =
1585 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1586 LttvAttributeValue value;
2061e03d 1587
bca3b81f 1588 new_m_window = g_new(MainWindow, 1);
5723fa24 1589
1590 // Add the object's information to the module's array
68b48a45 1591 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 1592
f7afe191 1593
68b48a45 1594 new_window = create_MWindow();
1595 gtk_widget_show (new_window);
5723fa24 1596
bca3b81f 1597 new_m_window->attributes = attributes;
f7afe191 1598
bca3b81f 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));
5723fa24 1603 if(parent){
bca3b81f 1604 new_m_window->win_creation_data = parent->win_creation_data;
5723fa24 1605 }else{
bca3b81f 1606 new_m_window->win_creation_data = win_creation_data;
5723fa24 1607 }
1608
68b48a45 1609 new_m_window->hash_menu_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1610 main_window_destroy_hash_key,
1611 main_window_destroy_hash_data);
68b48a45 1612 new_m_window->hash_toolbar_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1613 main_window_destroy_hash_key,
1614 main_window_destroy_hash_data);
2061e03d 1615
68b48a45 1616 insert_menu_toolbar_item(new_m_window, NULL);
5723fa24 1617
68b48a45 1618 g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);
5723fa24 1619
1620 //create a default tab
bca3b81f 1621 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 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
6f7ad7ae 1628 create_tab(parent, new_m_window, notebook,"Traceset");
5723fa24 1629
7a859036 1630 g_object_set_data_full(
bca3b81f 1631 G_OBJECT(new_m_window->mwindow),
7a859036 1632 "Main_Window_Data",
68b48a45 1633 new_m_window,
1634 (GDestroyNotify)main_window_free);
7a859036 1635
68b48a45 1636 g_win_count++;
5723fa24 1637}
1638
bca3b81f 1639void tab_destructor(Tab * tab_instance)
f7afe191 1640{
716e4367 1641 int i, nb, ref_count;
1642 LttvTrace * trace;
1643
bca3b81f 1644 if(tab_instance->attributes)
1645 g_object_unref(tab_instance->attributes);
2061e03d 1646
bca3b81f 1647 if(tab_instance->mw->tab == tab_instance){
1648 tab_instance->mw->tab = tab_instance->next;
2061e03d 1649 }else{
bca3b81f 1650 Tab * tmp1, *tmp = tab_instance->mw->tab;
68b48a45 1651 while(tmp != tab_instance){
2061e03d 1652 tmp1 = tmp;
bca3b81f 1653 tmp = tmp->next;
2061e03d 1654 }
bca3b81f 1655 tmp1->next = tab_instance->next;
2061e03d 1656 }
716e4367 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);
49bf71b5 1668 if(ref_count <= 1){
716e4367 1669 ltt_trace_close(lttv_trace(trace));
6f7ad7ae 1670 lttv_trace_destroy(trace);
49bf71b5 1671 }
6f7ad7ae 1672 // lttv_trace_destroy(trace);
716e4367 1673 }
1674 }
1675 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
1676 g_free(tab_instance->traceset_info);
68b48a45 1677 g_free(tab_instance);
f7afe191 1678}
1679
716e4367 1680void * create_tab(MainWindow * parent, MainWindow* current_window,
1681 GtkNotebook * notebook, char * label)
5723fa24 1682{
1683 GList * list;
bca3b81f 1684 Tab * tmp_tab;
716e4367 1685 MainWindow * mw_data = current_window;
68b48a45 1686 LttTime tmp_time;
1687
bca3b81f 1688 tmp_tab = mw_data->tab;
1689 while(tmp_tab && tmp_tab->next) tmp_tab = tmp_tab->next;
68b48a45 1690 if(!tmp_tab){
bca3b81f 1691 mw_data->current_tab = NULL;
1692 tmp_tab = g_new(Tab,1);
1693 mw_data->tab = tmp_tab;
5723fa24 1694 }else{
bca3b81f 1695 tmp_tab->next = g_new(Tab,1);
1696 tmp_tab = tmp_tab->next;
5723fa24 1697 }
716e4367 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();
49bf71b5 1709 /* Add the command line trace */
1710 if(g_init_trace != NULL)
1711 lttv_traceset_add(tmp_tab->traceset_info->traceset, g_init_trace);
716e4367 1712 }
716e4367 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
bca3b81f 1721 if(mw_data->current_tab){
716e4367 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.
bca3b81f 1724 tmp_tab->time_window = mw_data->current_tab->time_window;
1725 tmp_tab->current_time = mw_data->current_tab->current_time;
5723fa24 1726 }else{
716e4367 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);
bca3b81f 1730 tmp_tab->time_window.start_time =
716e4367 1731 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime;
f7afe191 1732 if(DEFAULT_TIME_WIDTH_S <
716e4367 1733 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec)
68b48a45 1734 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 1735 else
68b48a45 1736 tmp_time.tv_sec =
716e4367 1737 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec;
68b48a45 1738 tmp_time.tv_nsec = 0;
bca3b81f 1739 tmp_tab->time_window.time_width = tmp_time ;
a8c0f09d 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;
5723fa24 1744 }
bca3b81f 1745 tmp_tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1746 // mw_data->current_tab = tmp_tab;
daecc161 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);
bca3b81f 1750 tmp_tab->next = NULL;
68b48a45 1751 tmp_tab->mw = mw_data;
5723fa24 1752
68b48a45 1753 tmp_tab->label = gtk_label_new (label);
1754 gtk_widget_show (tmp_tab->label);
5723fa24 1755
f7afe191 1756 g_object_set_data_full(
daecc161 1757 G_OBJECT(tmp_tab->multi_vpaned),
f7afe191 1758 "Tab_Info",
68b48a45 1759 tmp_tab,
1760 (GDestroyNotify)tab_destructor);
540edb40 1761
1762 lttv_state_add_event_hooks(
1763 (LttvTracesetState*)tmp_tab->traceset_info->traceset_context);
5723fa24 1764
daecc161 1765 gtk_notebook_append_page(notebook, (GtkWidget*)tmp_tab->multi_vpaned, tmp_tab->label);
5723fa24 1766 list = gtk_container_get_children(GTK_CONTAINER(notebook));
1767 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
1768}
2061e03d 1769
1770void remove_menu_item(gpointer main_win, gpointer user_data)
1771{
bca3b81f 1772 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1773 lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data;
1774 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1775
bca3b81f 1776 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
2061e03d 1777 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item,
68b48a45 1778 menu_item->menuText);
2061e03d 1779 if(insert_view){
68b48a45 1780 g_hash_table_remove(mw->hash_menu_item, menu_item->menuText);
1781 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1782 }
1783}
1784
1785void remove_toolbar_item(gpointer main_win, gpointer user_data)
1786{
bca3b81f 1787 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1788 lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data;
1789 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1790
1791
bca3b81f 1792 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
2061e03d 1793 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item,
68b48a45 1794 toolbar_item->tooltip);
2061e03d 1795 if(insert_view){
68b48a45 1796 g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip);
1797 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1798 }
1799}
1800
1801/**
1802 * Remove menu and toolbar item when a module unloaded
1803 */
2176f952 1804
2061e03d 1805void main_window_remove_menu_item(lttv_constructor constructor)
1806{
1807 int i;
1808 LttvMenus * menu;
68b48a45 1809 lttv_menu_closure *menu_item;
2061e03d 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++){
68b48a45 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);
2176f952 1823 }
2061e03d 1824 break;
1825 }
1826 }
1827
1828}
1829
1830void main_window_remove_toolbar_item(lttv_constructor constructor)
1831{
1832 int i;
1833 LttvToolbars * toolbar;
68b48a45 1834 lttv_toolbar_closure *toolbar_item;
2061e03d 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++){
68b48a45 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);
2176f952 1848 }
2061e03d 1849 break;
1850 }
1851 }
1852}
This page took 0.111229 seconds and 4 git commands to generate.