icons changed
[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{
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.115107 seconds and 4 git commands to generate.