New attributes to use or not saved state
[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
716e4367 192void 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);
223 break;
224 }
225}
226
bca3b81f 227MainWindow * get_window_data_struct(GtkWidget * widget)
561eba2a 228{
229 GtkWidget * mw;
bca3b81f 230 MainWindow * mw_data;
561eba2a 231
232 mw = lookup_widget(widget, "MWindow");
233 if(mw == NULL){
234 g_printf("Main window does not exist\n");
235 return;
236 }
237
bca3b81f 238 mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"mainWindow");
68b48a45 239 if(mw_data == NULL){
561eba2a 240 g_printf("Main window data does not exist\n");
241 return;
242 }
68b48a45 243 return mw_data;
561eba2a 244}
245
68b48a45 246void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
561eba2a 247{
bca3b81f 248 MainWindow * parent = get_window_data_struct(widget);
561eba2a 249
561eba2a 250 if(clone){
251 g_printf("Clone : use the same traceset\n");
716e4367 252 construct_main_window(parent, NULL);
561eba2a 253 }else{
254 g_printf("Empty : traceset is set to NULL\n");
716e4367 255 construct_main_window(NULL, parent->win_creation_data);
561eba2a 256 }
257}
258
259void move_up_viewer(GtkWidget * widget, gpointer user_data)
260{
bca3b81f 261 MainWindow * mw = get_window_data_struct(widget);
262 if(!mw->current_tab) return;
daecc161 263 gtk_multi_vpaned_widget_move_up(mw->current_tab->multi_vpaned);
561eba2a 264}
265
266void move_down_viewer(GtkWidget * widget, gpointer user_data)
267{
bca3b81f 268 MainWindow * mw = get_window_data_struct(widget);
269 if(!mw->current_tab) return;
daecc161 270 gtk_multi_vpaned_widget_move_down(mw->current_tab->multi_vpaned);
561eba2a 271}
272
273void delete_viewer(GtkWidget * widget, gpointer user_data)
274{
bca3b81f 275 MainWindow * mw = get_window_data_struct(widget);
276 if(!mw->current_tab) return;
daecc161 277 gtk_multi_vpaned_widget_delete(mw->current_tab->multi_vpaned);
561eba2a 278}
279
280void open_traceset(GtkWidget * widget, gpointer user_data)
281{
2176f952 282 char ** dir;
283 gint id;
284 LttvTraceset * traceset;
bca3b81f 285 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 286 GtkFileSelection * file_selector =
2176f952 287 (GtkFileSelection *)gtk_file_selection_new("Select a traceset");
288
68b48a45 289 gtk_file_selection_hide_fileop_buttons(file_selector);
c64c7ea1 290
68b48a45 291 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 292 switch(id){
293 case GTK_RESPONSE_ACCEPT:
294 case GTK_RESPONSE_OK:
68b48a45 295 dir = gtk_file_selection_get_selections (file_selector);
2176f952 296 traceset = lttv_traceset_load(dir[0]);
297 g_printf("Open a trace set %s\n", dir[0]);
298 //Not finished yet
299 g_strfreev(dir);
300 case GTK_RESPONSE_REJECT:
301 case GTK_RESPONSE_CANCEL:
302 default:
68b48a45 303 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 304 break;
305 }
c64c7ea1 306
561eba2a 307}
308
a8c0f09d 309unsigned get_max_event_number(MainWindow * mw_data)
202f6c8f 310{
a8c0f09d 311 unsigned nb = 0, *size;
312 GtkWidget * w;
313
314 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
315 while(w){
316 size = (unsigned*)g_object_get_data(G_OBJECT(w), MAX_NUMBER_EVENT);
317 if(size == NULL){
318 nb = G_MAXULONG;
319 break;
320 }else{
321 if(nb < *size)
322 nb = *size;
323 }
324 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
325 }
326 return nb;
327}
328
329void redraw_viewer(MainWindow * mw_data, TimeWindow * time_window)
330{
331 unsigned max_nb_events;
332 GdkWindow * win;
333 GdkCursor * new;
334 GtkWidget* widget;
335
336 new = gdk_cursor_new(GDK_X_CURSOR);
337 widget = lookup_widget(mw_data->mwindow, "MToolbar2");
338 win = gtk_widget_get_parent_window(widget);
339 gdk_window_set_cursor(win, new);
340 gdk_cursor_unref(new);
341 gdk_window_stick(win);
342 gdk_window_unstick(win);
343
202f6c8f 344 //update time window of each viewer, let viewer insert hooks needed by process_traceset
345 set_time_window(mw_data, time_window);
a8c0f09d 346
347 max_nb_events = get_max_event_number(mw_data);
202f6c8f 348
349 process_traceset_api(mw_data, time_window->start_time,
350 ltt_time_add(time_window->start_time,time_window->time_width),
a8c0f09d 351 max_nb_events);
202f6c8f 352
353 //call hooks to show each viewer and let them remove hooks
354 show_viewer(mw_data);
a8c0f09d 355
356 gdk_window_set_cursor(win, NULL);
202f6c8f 357}
358
49bf71b5 359void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * t)
360{
ed3b99b6 361 int j, k, m, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
49bf71b5 362 LttvTracesetSelector * s;
363 LttvTraceSelector * trace;
364 LttvTracefileSelector * tracefile;
ed3b99b6 365 LttvEventtypeSelector * eventtype;
49bf71b5 366 LttTracefile * tf;
367 GtkWidget * w;
ed3b99b6 368 LttFacility * fac;
369 LttEventType * et;
49bf71b5 370
371 w = gtk_multi_vpaned_get_first_widget(paned);
372 while(w){
373 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
374
375 trace = lttv_trace_selector_new(t);
ed3b99b6 376 lttv_traceset_selector_trace_add(s, trace);
377
378 nb_facility = ltt_trace_facility_number(t);
379 for(k=0;k<nb_facility;k++){
380 fac = ltt_trace_facility_get(t,k);
381 nb_event = (int) ltt_facility_eventtype_number(fac);
382 for(m=0;m<nb_event;m++){
383 et = ltt_facility_eventtype_get(fac,m);
384 eventtype = lttv_eventtype_selector_new(et);
385 lttv_trace_selector_eventtype_add(trace, eventtype);
386 }
387 }
388
49bf71b5 389 nb_control = ltt_trace_control_tracefile_number(t);
390 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
391 nb_tracefile = nb_control + nb_per_cpu;
392
393 for(j = 0 ; j < nb_tracefile ; j++) {
394 if(j < nb_control)
395 tf = ltt_trace_control_tracefile_get(t, j);
396 else
397 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
398 tracefile = lttv_tracefile_selector_new(tf);
ed3b99b6 399 lttv_trace_selector_tracefile_add(trace, tracefile);
400 lttv_eventtype_selector_copy(trace, tracefile);
49bf71b5 401 }
402
403 w = gtk_multi_vpaned_get_next_widget(paned);
404 }
405}
406
561eba2a 407void add_trace(GtkWidget * widget, gpointer user_data)
408{
2176f952 409 LttTrace *trace;
410 LttvTrace * trace_v;
411 LttvTraceset * traceset;
94dcfb9e 412 const char * dir;
2176f952 413 gint id;
bca3b81f 414 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 415 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
416 gtk_dir_selection_hide_fileop_buttons(file_selector);
2176f952 417
68b48a45 418 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 419 switch(id){
420 case GTK_RESPONSE_ACCEPT:
421 case GTK_RESPONSE_OK:
68b48a45 422 dir = gtk_dir_selection_get_dir (file_selector);
2176f952 423 trace = ltt_trace_open(dir);
424 if(trace == NULL) g_critical("cannot open trace %s", dir);
425 trace_v = lttv_trace_new(trace);
716e4367 426 traceset = mw_data->current_tab->traceset_info->traceset;
427 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
428 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
429 traceset_info->traceset_context));
430 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
2176f952 431 }
432 lttv_traceset_add(traceset, trace_v);
716e4367 433 mw_data->current_tab->traceset_info->traceset_context =
2176f952 434 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
435 lttv_context_init(
716e4367 436 LTTV_TRACESET_CONTEXT(mw_data->current_tab->traceset_info->
49bf71b5 437 traceset_context),traceset);
438 add_trace_into_traceset_selector(mw_data->current_tab->multi_vpaned, trace);
439
440 gtk_widget_destroy((GtkWidget*)file_selector);
441
442 //update current tab
a8c0f09d 443 update_traceset(mw_data);
444 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
202f6c8f 445 set_current_time(mw_data,&(mw_data->current_tab->current_time));
49bf71b5 446 break;
2176f952 447 case GTK_RESPONSE_REJECT:
448 case GTK_RESPONSE_CANCEL:
449 default:
68b48a45 450 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 451 break;
452 }
49bf71b5 453}
454
455void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i)
456{
457 LttvTracesetSelector * s;
458 LttvTraceSelector * t;
459 GtkWidget * w;
460
461 w = gtk_multi_vpaned_get_first_widget(paned);
462 while(w){
463 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
ed3b99b6 464 t = lttv_traceset_selector_trace_get(s,i);
465 lttv_traceset_selector_trace_remove(s, i);
49bf71b5 466 lttv_trace_selector_destroy(t);
467 w = gtk_multi_vpaned_get_next_widget(paned);
468 }
561eba2a 469}
470
471void remove_trace(GtkWidget * widget, gpointer user_data)
472{
2176f952 473 LttTrace *trace;
474 LttvTrace * trace_v;
475 LttvTraceset * traceset;
476 gint i, nb_trace;
477 char ** name, *remove_trace_name;
bca3b81f 478 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 479 LttvTracesetSelector * s;
480 LttvTraceSelector * t;
481 GtkWidget * w;
482 gboolean selected;
2176f952 483
716e4367 484 nb_trace =lttv_traceset_number(mw_data->current_tab->traceset_info->traceset);
2176f952 485 name = g_new(char*,nb_trace);
486 for(i = 0; i < nb_trace; i++){
716e4367 487 trace_v = lttv_traceset_get(mw_data->current_tab->
488 traceset_info->traceset, i);
2176f952 489 trace = lttv_trace(trace_v);
a5dcde2f 490 name[i] = ltt_trace_name(trace);
2176f952 491 }
492
493 remove_trace_name = get_remove_trace(name, nb_trace);
494
495 if(remove_trace_name){
496 for(i=0; i<nb_trace; i++){
497 if(strcmp(remove_trace_name,name[i]) == 0){
49bf71b5 498 //unselect the trace from the current viewer
499 w = gtk_multi_vpaned_get_widget(mw_data->current_tab->multi_vpaned);
500 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
ed3b99b6 501 t = lttv_traceset_selector_trace_get(s,i);
49bf71b5 502 lttv_trace_selector_set_selected(t, FALSE);
503
504 //check if other viewers select the trace
505 w = gtk_multi_vpaned_get_first_widget(mw_data->current_tab->multi_vpaned);
506 while(w){
507 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
ed3b99b6 508 t = lttv_traceset_selector_trace_get(s,i);
49bf71b5 509 selected = lttv_trace_selector_get_selected(t);
510 if(selected)break;
511 w = gtk_multi_vpaned_get_next_widget(mw_data->current_tab->multi_vpaned);
512 }
513
514 //if no viewer selects the trace, remove it
515 if(!selected){
516 remove_trace_from_traceset_selector(mw_data->current_tab->multi_vpaned, i);
517
518 traceset = mw_data->current_tab->traceset_info->traceset;
519 trace_v = lttv_traceset_get(traceset, i);
520 if(lttv_trace_get_ref_number(trace_v) <= 1)
521 ltt_trace_close(lttv_trace(trace_v));
522
523 if(mw_data->current_tab->traceset_info->traceset_context != NULL){
524 lttv_context_fini(LTTV_TRACESET_CONTEXT(mw_data->current_tab->
525 traceset_info->traceset_context));
526 g_object_unref(mw_data->current_tab->traceset_info->traceset_context);
527 }
528 lttv_traceset_remove(traceset, i);
529 lttv_trace_destroy(trace_v);
530 mw_data->current_tab->traceset_info->traceset_context =
531 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
532 lttv_context_init(
533 LTTV_TRACESET_CONTEXT(mw_data->current_tab->
534 traceset_info->traceset_context),traceset);
535 //update current tab
a8c0f09d 536 update_traceset(mw_data);
537 redraw_viewer(mw_data, &(mw_data->current_tab->time_window));
202f6c8f 538 set_current_time(mw_data,&(mw_data->current_tab->current_time));
2176f952 539 }
2176f952 540 break;
541 }
542 }
543 }
544
545 g_free(name);
561eba2a 546}
547
548void save(GtkWidget * widget, gpointer user_data)
549{
550 g_printf("Save\n");
551}
552
553void save_as(GtkWidget * widget, gpointer user_data)
554{
555 g_printf("Save as\n");
556}
557
1f1ae829 558void zoom(GtkWidget * widget, double size)
559{
560 TimeInterval *time_span;
561 TimeWindow time_window;
a8c0f09d 562 LttTime current_time, time_delta, time_s, time_e, time_t;
1f1ae829 563 MainWindow * mw_data = get_window_data_struct(widget);
564
fda16332 565 if(size == 1) return;
566
716e4367 567 time_span = LTTV_TRACESET_CONTEXT(mw_data->current_tab->
568 traceset_info->traceset_context)->Time_Span;
1f1ae829 569 time_window = mw_data->current_tab->time_window;
570 current_time = mw_data->current_tab->current_time;
571
572 time_delta = ltt_time_sub(time_span->endTime,time_span->startTime);
573 if(size == 0){
574 time_window.start_time = time_span->startTime;
575 time_window.time_width = time_delta;
576 }else{
577 time_window.time_width = ltt_time_div(time_window.time_width, size);
578 if(ltt_time_compare(time_window.time_width,time_delta) > 0)
fda16332 579 time_window.time_width = time_delta;
1f1ae829 580
a8c0f09d 581 time_t = ltt_time_div(time_window.time_width, 2);
582 if(ltt_time_compare(current_time, time_t) < 0){
583 time_s = time_span->startTime;
584 } else {
585 time_s = ltt_time_sub(current_time,time_t);
586 }
587 time_e = ltt_time_add(current_time,time_t);
1f1ae829 588 if(ltt_time_compare(time_span->startTime, time_s) > 0){
589 time_s = time_span->startTime;
590 }else if(ltt_time_compare(time_span->endTime, time_e) < 0){
591 time_e = time_span->endTime;
592 time_s = ltt_time_sub(time_e,time_window.time_width);
593 }
594 time_window.start_time = time_s;
595 }
a8c0f09d 596 redraw_viewer(mw_data, &time_window);
202f6c8f 597 set_current_time(mw_data,&(mw_data->current_tab->current_time));
daecc161 598 gtk_multi_vpaned_set_adjust(mw_data->current_tab->multi_vpaned, FALSE);
1f1ae829 599}
600
561eba2a 601void zoom_in(GtkWidget * widget, gpointer user_data)
602{
1f1ae829 603 zoom(widget, 2);
561eba2a 604}
605
606void zoom_out(GtkWidget * widget, gpointer user_data)
607{
1f1ae829 608 zoom(widget, 0.5);
561eba2a 609}
610
611void zoom_extended(GtkWidget * widget, gpointer user_data)
612{
1f1ae829 613 zoom(widget, 0);
561eba2a 614}
615
616void go_to_time(GtkWidget * widget, gpointer user_data)
617{
618 g_printf("Go to time\n");
619}
620
621void show_time_frame(GtkWidget * widget, gpointer user_data)
622{
623 g_printf("Show time frame\n");
624}
625
626
627/* callback function */
628
629void
630on_empty_traceset_activate (GtkMenuItem *menuitem,
631 gpointer user_data)
632{
68b48a45 633 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 634}
635
636
637void
638on_clone_traceset_activate (GtkMenuItem *menuitem,
639 gpointer user_data)
640{
68b48a45 641 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 642}
643
2901f314 644void create_new_tab(GtkWidget* widget, gpointer user_data){
6b1d3120 645 gchar label[PATH_LENGTH];
2901f314 646 MainWindow * mw_data = get_window_data_struct(widget);
647 GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
561eba2a 648 if(notebook == NULL){
649 g_printf("Notebook does not exist\n");
650 return;
651 }
652
6b1d3120 653 strcpy(label,"Page");
716e4367 654 get_label(mw_data, label,"Get the name of the tab","Please input tab's name");
561eba2a 655
716e4367 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{
68b48a45 1019 create_new_window((GtkWidget*)button, user_data, FALSE);
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{
bca3b81f 1136 MainWindow *Main_Window = (MainWindow*)user_data;
f7afe191 1137
68b48a45 1138 g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
561eba2a 1139
68b48a45 1140 g_win_count--;
1141 if(g_win_count == 0)
7a859036 1142 gtk_main_quit ();
561eba2a 1143}
1144
58eecf4a 1145gboolean
1146on_MWindow_configure (GtkWidget *widget,
1147 GdkEventConfigure *event,
1148 gpointer user_data)
1149{
1150 MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
1151 float width = event->width;
1152 Tab * tab = mw_data->tab;
1153 TimeWindow time_win;
1154 double ratio;
1155 TimeInterval *time_span;
1156 LttTime time;
bd24a9af 1157
1158 // MD : removed time width modification upon resizing of the main window.
1159 // The viewers will redraw themselves completely, without time interval
1160 // modification.
1161/* while(tab){
58eecf4a 1162 if(mw_data->window_width){
1163 time_span = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->Time_Span ;
1164 time_win = tab->time_window;
1165 ratio = width / mw_data->window_width;
1166 tab->time_window.time_width = ltt_time_mul(time_win.time_width,ratio);
1167 time = ltt_time_sub(time_span->endTime, time_win.start_time);
1168 if(ltt_time_compare(time, tab->time_window.time_width) < 0){
1169 tab->time_window.time_width = time;
1170 }
1171 }
1172 tab = tab->next;
1173 }
1174
1175 mw_data->window_width = (int)width;
bd24a9af 1176 */
58eecf4a 1177 return FALSE;
1178}
561eba2a 1179
1180void
1181on_MNotebook_switch_page (GtkNotebook *notebook,
1182 GtkNotebookPage *page,
1183 guint page_num,
1184 gpointer user_data)
1185{
bca3b81f 1186 MainWindow * mw = get_window_data_struct((GtkWidget*)notebook);
1187 Tab * tab = mw->tab;
561eba2a 1188
1189 while(page_num){
bca3b81f 1190 tab = tab->next;
561eba2a 1191 page_num--;
1192 }
bca3b81f 1193 mw->current_tab = tab;
561eba2a 1194}
1195
49bf71b5 1196void checkbox_changed(GtkTreeView *treeview,
1197 GtkTreePath *arg1,
1198 GtkTreeViewColumn *arg2,
1199 gpointer user_data)
1200{
1201 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
1202 GtkTreeIter iter;
1203 gboolean value;
1204
1205 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
1206 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
1207 value = value? FALSE : TRUE;
1208 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
1209 }
1210
1211}
1212
1213void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
1214{
ed3b99b6 1215 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1216 int i, j, k, nb_eventtype;
49bf71b5 1217 LttvTraceSelector * trace;
1218 LttvTracefileSelector * tracefile;
ed3b99b6 1219 LttvEventtypeSelector * eventtype;
1220 gboolean value, value1, value2;
49bf71b5 1221
1222 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
1223 i = 0;
1224 do{
ed3b99b6 1225 trace = lttv_traceset_selector_trace_get(s, i);
1226 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
49bf71b5 1227 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
1228 if(value){
1229 j = 0;
1230 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
1231 do{
ed3b99b6 1232 if(j<1){//eventtype selector for trace
1233 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value2,-1);
1234 if(value2){
1235 k=0;
1236 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter1, &child_iter)){
1237 do{
1238 eventtype = lttv_trace_selector_eventtype_get(trace,k);
1239 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
1240 lttv_eventtype_selector_set_selected(eventtype,value2);
1241 k++;
1242 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter1));
1243 }
1244 }
1245 }else{ //tracefile selector
1246 tracefile = lttv_trace_selector_tracefile_get(trace, j - 1);
1247 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
1248 lttv_tracefile_selector_set_selected(tracefile,value1);
1249 if(value1){
1250 gtk_tree_model_iter_children((GtkTreeModel*)store, &child_iter1, &child_iter); //eventtype selector
1251 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
1252 if(value2){
1253 k = 0;
1254 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter2, &child_iter1)){
1255 do{//eventtype selector for tracefile
1256 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
1257 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter2, CHECKBOX_COLUMN, &value2,-1);
1258 lttv_eventtype_selector_set_selected(eventtype,value2);
1259 k++;
1260 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter2));
1261 }
1262 }
1263 }
1264 }
49bf71b5 1265 j++;
1266 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
1267 }
1268 }
1269 lttv_trace_selector_set_selected(trace,value);
1270 i++;
1271 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
1272 }
1273}
1274
a8c0f09d 1275gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
49bf71b5 1276{
1277 GtkWidget * dialogue;
1278 GtkTreeStore * store;
1279 GtkWidget * tree;
1280 GtkWidget * scroll_win;
1281 GtkCellRenderer * renderer;
1282 GtkTreeViewColumn * column;
ed3b99b6 1283 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
1284 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
49bf71b5 1285 LttvTraceSelector * trace;
1286 LttvTracefileSelector * tracefile;
ed3b99b6 1287 LttvEventtypeSelector * eventtype;
49bf71b5 1288 char * name;
1289 gboolean checked;
1290
1291 dialogue = gtk_dialog_new_with_buttons(title,
1292 NULL,
1293 GTK_DIALOG_MODAL,
1294 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1295 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1296 NULL);
ed3b99b6 1297 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
49bf71b5 1298
1299 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
1300 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
1301 g_object_unref (G_OBJECT (store));
1302 g_signal_connect (G_OBJECT (tree), "row-activated",
1303 G_CALLBACK (checkbox_changed),
1304 NULL);
1305
1306
1307 renderer = gtk_cell_renderer_toggle_new ();
1308 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
1309
1310 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
1311
1312 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
1313 renderer,
1314 "active", CHECKBOX_COLUMN,
1315 NULL);
1316 gtk_tree_view_column_set_alignment (column, 0.5);
1317 gtk_tree_view_column_set_fixed_width (column, 20);
1318 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1319
1320 renderer = gtk_cell_renderer_text_new ();
1321 column = gtk_tree_view_column_new_with_attributes (column_title,
1322 renderer,
1323 "text", NAME_COLUMN,
1324 NULL);
1325 gtk_tree_view_column_set_alignment (column, 0.0);
1326 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1327 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
1328
1329 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1330 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1331 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
1332 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1333
1334 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1335
1336 gtk_widget_show(scroll_win);
1337 gtk_widget_show(tree);
1338
ed3b99b6 1339 nb_trace = lttv_traceset_selector_trace_number(s);
49bf71b5 1340 for(i=0;i<nb_trace;i++){
ed3b99b6 1341 trace = lttv_traceset_selector_trace_get(s, i);
49bf71b5 1342 name = lttv_trace_selector_get_name(trace);
1343 gtk_tree_store_append (store, &iter, NULL);
1344 checked = lttv_trace_selector_get_selected(trace);
1345 gtk_tree_store_set (store, &iter,
1346 CHECKBOX_COLUMN,checked,
1347 NAME_COLUMN,name,
1348 -1);
ed3b99b6 1349
1350 gtk_tree_store_append (store, &child_iter, &iter);
1351 gtk_tree_store_set (store, &child_iter,
1352 CHECKBOX_COLUMN, checked,
1353 NAME_COLUMN,"eventtype",
1354 -1);
1355
1356 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
1357 for(j=0;j<nb_eventtype;j++){
1358 eventtype = lttv_trace_selector_eventtype_get(trace,j);
1359 name = lttv_eventtype_selector_get_name(eventtype);
1360 checked = lttv_eventtype_selector_get_selected(eventtype);
1361 gtk_tree_store_append (store, &child_iter1, &child_iter);
1362 gtk_tree_store_set (store, &child_iter1,
1363 CHECKBOX_COLUMN, checked,
1364 NAME_COLUMN,name,
1365 -1);
1366 }
1367
1368 nb_tracefile = lttv_trace_selector_tracefile_number(trace);
49bf71b5 1369 for(j=0;j<nb_tracefile;j++){
ed3b99b6 1370 tracefile = lttv_trace_selector_tracefile_get(trace, j);
49bf71b5 1371 name = lttv_tracefile_selector_get_name(tracefile);
1372 gtk_tree_store_append (store, &child_iter, &iter);
1373 checked = lttv_tracefile_selector_get_selected(tracefile);
1374 gtk_tree_store_set (store, &child_iter,
1375 CHECKBOX_COLUMN, checked,
1376 NAME_COLUMN,name,
1377 -1);
ed3b99b6 1378
1379 gtk_tree_store_append (store, &child_iter1, &child_iter);
1380 gtk_tree_store_set (store, &child_iter1,
1381 CHECKBOX_COLUMN, checked,
1382 NAME_COLUMN,"eventtype",
1383 -1);
1384
1385 for(k=0;k<nb_eventtype;k++){
1386 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
1387 name = lttv_eventtype_selector_get_name(eventtype);
1388 checked = lttv_eventtype_selector_get_selected(eventtype);
1389 gtk_tree_store_append (store, &child_iter2, &child_iter1);
1390 gtk_tree_store_set (store, &child_iter2,
1391 CHECKBOX_COLUMN, checked,
1392 NAME_COLUMN,name,
1393 -1);
1394 }
49bf71b5 1395 }
1396 }
1397
1398 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1399 switch(id){
1400 case GTK_RESPONSE_ACCEPT:
1401 case GTK_RESPONSE_OK:
1402 update_filter(s, store);
a8c0f09d 1403 gtk_widget_destroy(dialogue);
1404 return TRUE;
49bf71b5 1405 case GTK_RESPONSE_REJECT:
1406 case GTK_RESPONSE_CANCEL:
1407 default:
1408 gtk_widget_destroy(dialogue);
1409 break;
1410 }
a8c0f09d 1411 return FALSE;
49bf71b5 1412}
1413
2176f952 1414char * get_remove_trace(char ** all_trace_name, int nb_trace)
1415{
1416 return get_selection(all_trace_name, nb_trace,
1417 "Select a trace", "Trace pathname");
1418}
36b3c068 1419char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 1420{
1421 return get_selection(loaded_module_name, nb_module,
1422 "Select an unload module", "Module pathname");
1423}
1424
1425char * get_selection(char ** loaded_module_name, int nb_module,
1426 char *title, char * column_title)
36b3c068 1427{
1428 GtkWidget * dialogue;
1429 GtkWidget * scroll_win;
1430 GtkWidget * tree;
1431 GtkListStore * store;
1432 GtkTreeViewColumn * column;
1433 GtkCellRenderer * renderer;
1434 GtkTreeSelection * select;
1435 GtkTreeIter iter;
1436 gint id, i;
1437 char * unload_module_name = NULL;
1438
2176f952 1439 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 1440 NULL,
1441 GTK_DIALOG_MODAL,
1442 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
1443 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
1444 NULL);
1445 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
1446
1447 scroll_win = gtk_scrolled_window_new (NULL, NULL);
1448 gtk_widget_show ( scroll_win);
1449 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
1450 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1451
1452 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
1453 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
1454 gtk_widget_show ( tree);
1455 g_object_unref (G_OBJECT (store));
1456
1457 renderer = gtk_cell_renderer_text_new ();
2176f952 1458 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 1459 renderer,
1460 "text", MODULE_COLUMN,
1461 NULL);
1462 gtk_tree_view_column_set_alignment (column, 0.5);
1463 gtk_tree_view_column_set_fixed_width (column, 150);
1464 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1465
1466 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
1467 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
1468
1469 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
1470
1471 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
1472
1473 for(i=0;i<nb_module;i++){
1474 gtk_list_store_append (store, &iter);
1475 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
1476 }
1477
1478 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1479 switch(id){
1480 case GTK_RESPONSE_ACCEPT:
1481 case GTK_RESPONSE_OK:
1482 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
1483 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
1484 }
1485 case GTK_RESPONSE_REJECT:
1486 case GTK_RESPONSE_CANCEL:
1487 default:
1488 gtk_widget_destroy(dialogue);
1489 break;
1490 }
1491
1492 return unload_module_name;
1493}
5723fa24 1494
2176f952 1495void main_window_destroy_hash_key(gpointer key)
2061e03d 1496{
1497 g_free(key);
1498}
1499
2176f952 1500void main_window_destroy_hash_data(gpointer data)
2061e03d 1501{
1502}
1503
1504
bca3b81f 1505void insert_menu_toolbar_item(MainWindow * mw, gpointer user_data)
5723fa24 1506{
1507 int i;
1508 GdkPixbuf *pixbuf;
1509 view_constructor constructor;
1510 LttvMenus * menu;
1511 LttvToolbars * toolbar;
68b48a45 1512 lttv_menu_closure *menu_item;
1513 lttv_toolbar_closure *toolbar_item;
5723fa24 1514 LttvAttributeValue value;
1515 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
68b48a45 1516 GtkWidget * tool_menu_title_menu, *insert_view, *pixmap, *tmp;
5723fa24 1517
1518 g_assert(lttv_iattribute_find_by_path(attributes,
1519 "viewers/menu", LTTV_POINTER, &value));
1520 menu = (LttvMenus*)*(value.v_pointer);
1521
1522 if(menu){
1523 for(i=0;i<menu->len;i++){
68b48a45 1524 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1525 tmp = g_hash_table_lookup(mw->hash_menu_item, g_strdup(menu_item->menuText));
3872a20e 1526 if(tmp)continue;
68b48a45 1527 constructor = menu_item->con;
bca3b81f 1528 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
68b48a45 1529 insert_view = gtk_menu_item_new_with_mnemonic (menu_item->menuText);
5723fa24 1530 gtk_widget_show (insert_view);
68b48a45 1531 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu), insert_view);
5723fa24 1532 g_signal_connect ((gpointer) insert_view, "activate",
68b48a45 1533 G_CALLBACK (insert_viewer_wrap),
5723fa24 1534 constructor);
68b48a45 1535 g_hash_table_insert(mw->hash_menu_item, g_strdup(menu_item->menuText),
2061e03d 1536 insert_view);
5723fa24 1537 }
1538 }
1539
1540 g_assert(lttv_iattribute_find_by_path(attributes,
1541 "viewers/toolbar", LTTV_POINTER, &value));
1542 toolbar = (LttvToolbars*)*(value.v_pointer);
1543
1544 if(toolbar){
1545 for(i=0;i<toolbar->len;i++){
68b48a45 1546 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1547 tmp = g_hash_table_lookup(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip));
3872a20e 1548 if(tmp)continue;
68b48a45 1549 constructor = toolbar_item->con;
bca3b81f 1550 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
68b48a45 1551 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**)toolbar_item->pixmap);
5723fa24 1552 pixmap = gtk_image_new_from_pixbuf(pixbuf);
68b48a45 1553 insert_view = gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
5723fa24 1554 GTK_TOOLBAR_CHILD_BUTTON,
1555 NULL,
1556 "",
68b48a45 1557 toolbar_item->tooltip, NULL,
5723fa24 1558 pixmap, NULL, NULL);
68b48a45 1559 gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (tool_menu_title_menu)->children)->data))->label), TRUE);
5723fa24 1560 gtk_widget_show (insert_view);
1561 gtk_container_set_border_width (GTK_CONTAINER (insert_view), 1);
68b48a45 1562 g_signal_connect ((gpointer) insert_view, "clicked",G_CALLBACK (insert_viewer_wrap),constructor);
1563 g_hash_table_insert(mw->hash_toolbar_item, g_strdup(toolbar_item->tooltip),
2061e03d 1564 insert_view);
5723fa24 1565 }
1566 }
1567}
1568
716e4367 1569void construct_main_window(MainWindow * parent, WindowCreationData * win_creation_data)
5723fa24 1570{
68b48a45 1571 g_critical("construct_main_window()");
1572 GtkWidget * new_window; /* New generated main window */
bca3b81f 1573 MainWindow * new_m_window;/* New main window structure */
5723fa24 1574 GtkNotebook * notebook;
f7afe191 1575 LttvIAttribute *attributes =
1576 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1577 LttvAttributeValue value;
2061e03d 1578
bca3b81f 1579 new_m_window = g_new(MainWindow, 1);
5723fa24 1580
1581 // Add the object's information to the module's array
68b48a45 1582 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 1583
f7afe191 1584
68b48a45 1585 new_window = create_MWindow();
1586 gtk_widget_show (new_window);
5723fa24 1587
bca3b81f 1588 new_m_window->attributes = attributes;
f7afe191 1589
bca3b81f 1590 new_m_window->mwindow = new_window;
1591 new_m_window->tab = NULL;
1592 new_m_window->current_tab = NULL;
1593 new_m_window->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
5723fa24 1594 if(parent){
bca3b81f 1595 new_m_window->win_creation_data = parent->win_creation_data;
5723fa24 1596 }else{
bca3b81f 1597 new_m_window->win_creation_data = win_creation_data;
5723fa24 1598 }
1599
68b48a45 1600 new_m_window->hash_menu_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1601 main_window_destroy_hash_key,
1602 main_window_destroy_hash_data);
68b48a45 1603 new_m_window->hash_toolbar_item = g_hash_table_new_full (g_str_hash, g_str_equal,
2176f952 1604 main_window_destroy_hash_key,
1605 main_window_destroy_hash_data);
2061e03d 1606
68b48a45 1607 insert_menu_toolbar_item(new_m_window, NULL);
5723fa24 1608
68b48a45 1609 g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);
5723fa24 1610
1611 //create a default tab
bca3b81f 1612 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 1613 if(notebook == NULL){
1614 g_printf("Notebook does not exist\n");
1615 return;
1616 }
1617 //for now there is no name field in LttvTraceset structure
1618 //Use "Traceset" as the label for the default tab
716e4367 1619 create_tab(NULL, new_m_window, notebook,"Traceset");
5723fa24 1620
7a859036 1621 g_object_set_data_full(
bca3b81f 1622 G_OBJECT(new_m_window->mwindow),
7a859036 1623 "Main_Window_Data",
68b48a45 1624 new_m_window,
1625 (GDestroyNotify)main_window_free);
7a859036 1626
68b48a45 1627 g_win_count++;
5723fa24 1628}
1629
bca3b81f 1630void tab_destructor(Tab * tab_instance)
f7afe191 1631{
716e4367 1632 int i, nb, ref_count;
1633 LttvTrace * trace;
1634
bca3b81f 1635 if(tab_instance->attributes)
1636 g_object_unref(tab_instance->attributes);
2061e03d 1637
bca3b81f 1638 if(tab_instance->mw->tab == tab_instance){
1639 tab_instance->mw->tab = tab_instance->next;
2061e03d 1640 }else{
bca3b81f 1641 Tab * tmp1, *tmp = tab_instance->mw->tab;
68b48a45 1642 while(tmp != tab_instance){
2061e03d 1643 tmp1 = tmp;
bca3b81f 1644 tmp = tmp->next;
2061e03d 1645 }
bca3b81f 1646 tmp1->next = tab_instance->next;
2061e03d 1647 }
716e4367 1648
1649 if(tab_instance->traceset_info->traceset_context != NULL){
1650 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
1651 traceset_context));
1652 g_object_unref(tab_instance->traceset_info->traceset_context);
1653 }
1654 if(tab_instance->traceset_info->traceset != NULL) {
1655 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
1656 for(i = 0 ; i < nb ; i++) {
1657 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
1658 ref_count = lttv_trace_get_ref_number(trace);
49bf71b5 1659 if(ref_count <= 1){
716e4367 1660 ltt_trace_close(lttv_trace(trace));
49bf71b5 1661 }
1662 lttv_trace_destroy(trace);
716e4367 1663 }
1664 }
1665 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
1666 g_free(tab_instance->traceset_info);
68b48a45 1667 g_free(tab_instance);
f7afe191 1668}
1669
716e4367 1670void * create_tab(MainWindow * parent, MainWindow* current_window,
1671 GtkNotebook * notebook, char * label)
5723fa24 1672{
1673 GList * list;
bca3b81f 1674 Tab * tmp_tab;
716e4367 1675 MainWindow * mw_data = current_window;
68b48a45 1676 LttTime tmp_time;
1677
bca3b81f 1678 tmp_tab = mw_data->tab;
1679 while(tmp_tab && tmp_tab->next) tmp_tab = tmp_tab->next;
68b48a45 1680 if(!tmp_tab){
bca3b81f 1681 mw_data->current_tab = NULL;
1682 tmp_tab = g_new(Tab,1);
1683 mw_data->tab = tmp_tab;
5723fa24 1684 }else{
bca3b81f 1685 tmp_tab->next = g_new(Tab,1);
1686 tmp_tab = tmp_tab->next;
5723fa24 1687 }
716e4367 1688
1689 tmp_tab->traceset_info = g_new(TracesetInfo,1);
1690 if(parent){
1691 tmp_tab->traceset_info->traceset =
1692 lttv_traceset_copy(parent->current_tab->traceset_info->traceset);
1693 }else{
1694 if(mw_data->current_tab){
1695 tmp_tab->traceset_info->traceset =
1696 lttv_traceset_copy(mw_data->current_tab->traceset_info->traceset);
1697 }else{
1698 tmp_tab->traceset_info->traceset = lttv_traceset_new();
49bf71b5 1699 /* Add the command line trace */
1700 if(g_init_trace != NULL)
1701 lttv_traceset_add(tmp_tab->traceset_info->traceset, g_init_trace);
716e4367 1702 }
716e4367 1703 }
1704 //FIXME copy not implemented in lower level
1705 tmp_tab->traceset_info->traceset_context =
1706 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1707 lttv_context_init(
1708 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context),
1709 tmp_tab->traceset_info->traceset);
1710
bca3b81f 1711 if(mw_data->current_tab){
716e4367 1712 // Will have to read directly at the main window level, as we want
1713 // to be able to modify a traceset on the fly.
bca3b81f 1714 tmp_tab->time_window = mw_data->current_tab->time_window;
1715 tmp_tab->current_time = mw_data->current_tab->current_time;
5723fa24 1716 }else{
716e4367 1717 // Will have to read directly at the main window level, as we want
1718 // to be able to modify a traceset on the fly.
1719 // get_traceset_time_span(mw_data,&tmp_tab->traceStartTime, &tmp_tab->traceEndTime);
bca3b81f 1720 tmp_tab->time_window.start_time =
716e4367 1721 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime;
f7afe191 1722 if(DEFAULT_TIME_WIDTH_S <
716e4367 1723 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec)
68b48a45 1724 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 1725 else
68b48a45 1726 tmp_time.tv_sec =
716e4367 1727 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->endTime.tv_sec;
68b48a45 1728 tmp_time.tv_nsec = 0;
bca3b81f 1729 tmp_tab->time_window.time_width = tmp_time ;
a8c0f09d 1730 tmp_tab->current_time.tv_sec =
1731 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime.tv_sec;
1732 tmp_tab->current_time.tv_nsec =
1733 LTTV_TRACESET_CONTEXT(tmp_tab->traceset_info->traceset_context)->Time_Span->startTime.tv_nsec;
5723fa24 1734 }
bca3b81f 1735 tmp_tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
1736 // mw_data->current_tab = tmp_tab;
daecc161 1737 tmp_tab->multi_vpaned = (GtkMultiVPaned*)gtk_multi_vpaned_new();
1738 tmp_tab->multi_vpaned->mw = mw_data;
1739 gtk_widget_show((GtkWidget*)tmp_tab->multi_vpaned);
bca3b81f 1740 tmp_tab->next = NULL;
68b48a45 1741 tmp_tab->mw = mw_data;
5723fa24 1742
68b48a45 1743 tmp_tab->label = gtk_label_new (label);
1744 gtk_widget_show (tmp_tab->label);
5723fa24 1745
f7afe191 1746 g_object_set_data_full(
daecc161 1747 G_OBJECT(tmp_tab->multi_vpaned),
f7afe191 1748 "Tab_Info",
68b48a45 1749 tmp_tab,
1750 (GDestroyNotify)tab_destructor);
540edb40 1751
1752 lttv_state_add_event_hooks(
1753 (LttvTracesetState*)tmp_tab->traceset_info->traceset_context);
5723fa24 1754
daecc161 1755 gtk_notebook_append_page(notebook, (GtkWidget*)tmp_tab->multi_vpaned, tmp_tab->label);
5723fa24 1756 list = gtk_container_get_children(GTK_CONTAINER(notebook));
1757 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
1758}
2061e03d 1759
1760void remove_menu_item(gpointer main_win, gpointer user_data)
1761{
bca3b81f 1762 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1763 lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data;
1764 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1765
bca3b81f 1766 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
2061e03d 1767 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item,
68b48a45 1768 menu_item->menuText);
2061e03d 1769 if(insert_view){
68b48a45 1770 g_hash_table_remove(mw->hash_menu_item, menu_item->menuText);
1771 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1772 }
1773}
1774
1775void remove_toolbar_item(gpointer main_win, gpointer user_data)
1776{
bca3b81f 1777 MainWindow * mw = (MainWindow *) main_win;
68b48a45 1778 lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data;
1779 GtkWidget * tool_menu_title_menu, *insert_view;
2061e03d 1780
1781
bca3b81f 1782 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar2");
2061e03d 1783 insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item,
68b48a45 1784 toolbar_item->tooltip);
2061e03d 1785 if(insert_view){
68b48a45 1786 g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip);
1787 gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view);
2061e03d 1788 }
1789}
1790
1791/**
1792 * Remove menu and toolbar item when a module unloaded
1793 */
2176f952 1794
2061e03d 1795void main_window_remove_menu_item(lttv_constructor constructor)
1796{
1797 int i;
1798 LttvMenus * menu;
68b48a45 1799 lttv_menu_closure *menu_item;
2061e03d 1800 LttvAttributeValue value;
1801 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1802
1803 g_assert(lttv_iattribute_find_by_path(attributes,
1804 "viewers/menu", LTTV_POINTER, &value));
1805 menu = (LttvMenus*)*(value.v_pointer);
1806
1807 if(menu){
1808 for(i=0;i<menu->len;i++){
68b48a45 1809 menu_item = &g_array_index(menu, lttv_menu_closure, i);
1810 if(menu_item->con != constructor) continue;
1811 if(g_main_window_list){
1812 g_slist_foreach(g_main_window_list, remove_menu_item, menu_item);
2176f952 1813 }
2061e03d 1814 break;
1815 }
1816 }
1817
1818}
1819
1820void main_window_remove_toolbar_item(lttv_constructor constructor)
1821{
1822 int i;
1823 LttvToolbars * toolbar;
68b48a45 1824 lttv_toolbar_closure *toolbar_item;
2061e03d 1825 LttvAttributeValue value;
1826 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
1827
1828 g_assert(lttv_iattribute_find_by_path(attributes,
1829 "viewers/toolbar", LTTV_POINTER, &value));
1830 toolbar = (LttvToolbars*)*(value.v_pointer);
1831
1832 if(toolbar){
1833 for(i=0;i<toolbar->len;i++){
68b48a45 1834 toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i);
1835 if(toolbar_item->con != constructor) continue;
1836 if(g_main_window_list){
1837 g_slist_foreach(g_main_window_list, remove_toolbar_item, toolbar_item);
2176f952 1838 }
2061e03d 1839 break;
1840 }
1841 }
1842}
This page took 0.112773 seconds and 4 git commands to generate.