traceset change fix
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
CommitLineData
e076699e 1/* This file is part of the Linux Trace Toolkit viewer
b052368a 2 * Copyright (C) 2003-2004 XangXiu Yang, Mathieu Desnoyers
e076699e 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
a1a2b649 23#include <limits.h> // for PATH_MAX
24#include <stdlib.h>
25
561eba2a 26#include <gtk/gtk.h>
561eba2a 27
28#include "callbacks.h"
29#include "interface.h"
30#include "support.h"
a43d67ba 31#include <ltt/trace.h>
32#include <ltt/facility.h>
33#include <ltt/time.h>
34#include <ltt/event.h>
2a2fa4f0 35#include <lttv/lttv.h>
a43d67ba 36#include <lttv/module.h>
37#include <lttv/iattribute.h>
38#include <lttv/stats.h>
13f86ce2 39#include <lttvwindow/mainwindow.h>
2d262115 40#include <lttvwindow/mainwindow-private.h>
13f86ce2 41#include <lttvwindow/menu.h>
42#include <lttvwindow/toolbar.h>
501e4e70 43#include <lttvwindow/lttvwindow.h>
a1a2b649 44#include <lttvwindow/lttvwindowtraces.h>
13f86ce2 45#include <lttvwindow/gtkdirsel.h>
13f86ce2 46#include <lttvwindow/lttvfilter.h>
6b1d3120 47
a1a2b649 48
f7afe191 49#define DEFAULT_TIME_WIDTH_S 1
50
49bf71b5 51extern LttvTrace *g_init_trace ;
561eba2a 52
ec25ff5e 53
54/** Array containing instanced objects. */
68b48a45 55extern GSList * g_main_window_list;
561eba2a 56
a43d67ba 57/** MD : keep old directory. */
a1a2b649 58static char remember_plugins_dir[PATH_MAX] = "";
59static char remember_trace_dir[PATH_MAX] = "";
6fbb1ddf 60
61
bca3b81f 62MainWindow * get_window_data_struct(GtkWidget * widget);
b052368a 63char * get_load_module(char ** load_module_name, int nb_module);
36b3c068 64char * get_unload_module(char ** loaded_module_name, int nb_module);
2176f952 65char * get_remove_trace(char ** all_trace_name, int nb_trace);
66char * get_selection(char ** all_name, int nb, char *title, char * column_title);
a8c0f09d 67gboolean get_filter_selection(LttvTracesetSelector *s, char *title, char * column_title);
6ced96ef 68Tab* create_tab(MainWindow * mw, Tab *copy_tab,
716e4367 69 GtkNotebook * notebook, char * label);
561eba2a 70
2d262115 71static void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor);
49bf71b5 72void update_filter(LttvTracesetSelector *s, GtkTreeStore *store );
73
74void checkbox_changed(GtkTreeView *treeview,
75 GtkTreePath *arg1,
76 GtkTreeViewColumn *arg2,
77 gpointer user_data);
b052368a 78void remove_trace_from_traceset_selector(GtkWidget * paned, unsigned i);
79void add_trace_into_traceset_selector(GtkWidget * paned, LttTrace * trace);
6ced96ef 80Tab *create_new_tab(GtkWidget* widget, gpointer user_data);
49bf71b5 81
82LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset);
83
501e4e70 84static gboolean lttvwindow_process_pending_requests(Tab *tab);
202f6c8f 85
49bf71b5 86enum {
87 CHECKBOX_COLUMN,
88 NAME_COLUMN,
89 TOTAL_COLUMNS
90};
561eba2a 91
36b3c068 92enum
93{
94 MODULE_COLUMN,
95 N_COLUMNS
96};
97
abe346a3 98/* Construct a selector(filter), which will be associated with a viewer,
99 * and provides an interface for user to select interested events and traces
100 */
561eba2a 101
49bf71b5 102LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
103{
104 LttvTracesetSelector * s;
105 LttvTraceSelector * trace;
106 LttvTracefileSelector * tracefile;
ed3b99b6 107 LttvEventtypeSelector * eventtype;
108 int i, j, k, m;
109 int nb_trace, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
49bf71b5 110 LttvTrace * trace_v;
111 LttTrace * t;
112 LttTracefile *tf;
ed3b99b6 113 LttFacility * fac;
114 LttEventType * et;
49bf71b5 115
116 s = lttv_traceset_selector_new(lttv_traceset_name(traceset));
117 nb_trace = lttv_traceset_number(traceset);
118 for(i=0;i<nb_trace;i++){
119 trace_v = lttv_traceset_get(traceset, i);
120 t = lttv_trace(trace_v);
121 trace = lttv_trace_selector_new(t);
ed3b99b6 122 lttv_traceset_selector_trace_add(s, trace);
123
124 nb_facility = ltt_trace_facility_number(t);
125 for(k=0;k<nb_facility;k++){
126 fac = ltt_trace_facility_get(t,k);
127 nb_event = (int) ltt_facility_eventtype_number(fac);
128 for(m=0;m<nb_event;m++){
129 et = ltt_facility_eventtype_get(fac,m);
130 eventtype = lttv_eventtype_selector_new(et);
131 lttv_trace_selector_eventtype_add(trace, eventtype);
132 }
133 }
134
49bf71b5 135 nb_control = ltt_trace_control_tracefile_number(t);
136 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
137 nb_tracefile = nb_control + nb_per_cpu;
138
139 for(j = 0 ; j < nb_tracefile ; j++) {
140 if(j < nb_control)
141 tf = ltt_trace_control_tracefile_get(t, j);
142 else
143 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
144 tracefile = lttv_tracefile_selector_new(tf);
ed3b99b6 145 lttv_trace_selector_tracefile_add(trace, tracefile);
146 lttv_eventtype_selector_copy(trace, tracefile);
49bf71b5 147 }
148 }
149 return s;
150}
151
abe346a3 152
b052368a 153static gboolean viewer_grab_focus(GtkWidget *widget, GdkEventButton *event,
154 gpointer data)
155{
156 GtkWidget *viewer_container = GTK_WIDGET(data);
157
158 g_debug("FOCUS GRABBED");
159 g_object_set_data(G_OBJECT(viewer_container), "focused_viewer", widget);
160}
161
162
abe346a3 163/* insert_viewer function constructs an instance of a viewer first,
164 * then inserts the widget of the instance into the container of the
165 * main window
166 */
167
561eba2a 168void
606309a4 169insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
561eba2a 170{
171 guint val = 20;
606309a4 172
42fcbb71 173 insert_viewer((GtkWidget*)menuitem, (lttvwindow_viewer_constructor)user_data);
37d0eca6 174 // selected_hook(&val);
561eba2a 175}
176
561eba2a 177
178/* internal functions */
2d262115 179void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
561eba2a 180{
b052368a 181 GtkWidget * viewer_container;
501e4e70 182 MainWindow * mw_data = get_window_data_struct(widget);
6ced96ef 183 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
f9334f6f 184 GtkWidget * viewer;
49bf71b5 185 LttvTracesetSelector * s;
202f6c8f 186 TimeInterval * time_interval;
6ced96ef 187 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
188 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
189 Tab *tab;
190
191 if(!page) {
192 tab = create_new_tab(widget, NULL);
193 } else {
194 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
47cd8a09 195 }
196
b052368a 197 viewer_container = tab->viewer_container;
561eba2a 198
501e4e70 199 s = construct_traceset_selector(tab->traceset_info->traceset);
200 viewer = (GtkWidget*)constructor(tab, s, "Traceset_Selector");
f9334f6f 201 if(viewer)
f0d936c0 202 {
b052368a 203 //gtk_multivpaned_widget_add(GTK_MULTIVPANED(multivpaned), viewer);
204
205 gtk_box_pack_end(GTK_BOX(viewer_container),
206 viewer,
207 TRUE,
208 TRUE,
209 0);
210
211 g_signal_connect (G_OBJECT(viewer),
212 "button-press-event",
213 G_CALLBACK (viewer_grab_focus),
214 (gpointer)viewer_container);
215
216 // We unref here, because it is now referenced by the viewer_container!
217 // not for a box ... g_object_unref(G_OBJECT(viewer));
a43d67ba 218
219 // The viewer will show itself when it receives a show notify
220 // So we call the show notify hooks here. It will
221 // typically add hooks for reading, we call process trace, and the
222 // end of reading hook will call gtk_widget_show and unregister the
223 // hooks.
224 // Note that show notify gets the time_requested through the call_data.
225 //show_viewer(mw_data);
226 // in expose now call_pending_read_hooks(mw_data);
f0d936c0 227 }
561eba2a 228}
229
313bd6fc 230/**
231 * Function to set/update traceset for the viewers
232 * @param tab viewer's tab
233 * @param traceset traceset of the main window.
234 * return value :
235 * 0 : traceset updated
236 * 1 : no traceset hooks to update; not an error.
237 */
238
239int SetTraceset(Tab * tab, LttvTraceset *traceset)
240{
241 LttvHooks * tmp;
242 LttvAttributeValue value;
b052368a 243 gint retval = 0;
313bd6fc 244
b052368a 245
313bd6fc 246 g_assert( lttv_iattribute_find_by_path(tab->attributes,
247 "hooks/updatetraceset", LTTV_POINTER, &value));
248
249 tmp = (LttvHooks*)*(value.v_pointer);
b052368a 250 if(tmp == NULL) retval = 1;
251 else lttv_hooks_call(tmp,traceset);
252
253
254 /* Set scrollbar */
255 LttvTracesetContext *tsc =
256 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
257 TimeInterval time_span = tsc->time_span;
258 GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
0c5dbe3b 259 LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time);
b052368a 260
261 g_object_set(G_OBJECT(adjustment),
262 "lower",
0c5dbe3b 263 0.0, /* lower */
b052368a 264 "upper",
0c5dbe3b 265 ltt_time_to_double(upper)
b052368a 266 * NANOSECONDS_PER_SECOND, /* upper */
267 "step_increment",
268 ltt_time_to_double(tab->time_window.time_width)
269 / SCROLL_STEP_PER_PAGE
270 * NANOSECONDS_PER_SECOND, /* step increment */
271 "page_increment",
272 ltt_time_to_double(tab->time_window.time_width)
273 * NANOSECONDS_PER_SECOND, /* page increment */
274 "page_size",
275 ltt_time_to_double(tab->time_window.time_width)
276 * NANOSECONDS_PER_SECOND, /* page size */
277 NULL);
278 gtk_adjustment_changed(adjustment);
279
280 g_object_set(G_OBJECT(adjustment),
281 "value",
b9a010a2 282 ltt_time_to_double(
283 ltt_time_sub(tab->time_window.start_time, time_span.start_time))
284 * NANOSECONDS_PER_SECOND, /* value */
b052368a 285 NULL);
286 gtk_adjustment_value_changed(adjustment);
313bd6fc 287
b052368a 288 return retval;
313bd6fc 289}
290
291/**
292 * Function to set/update filter for the viewers
293 * @param tab viewer's tab
294 * @param filter filter of the main window.
295 * return value :
296 * -1 : error
297 * 0 : filters updated
298 * 1 : no filter hooks to update; not an error.
299 */
300
301int SetFilter(Tab * tab, gpointer filter)
302{
303 LttvHooks * tmp;
304 LttvAttributeValue value;
305
306 g_assert(lttv_iattribute_find_by_path(tab->attributes,
307 "hooks/updatefilter", LTTV_POINTER, &value));
308
309 tmp = (LttvHooks*)*(value.v_pointer);
310
311 if(tmp == NULL) return 1;
312 lttv_hooks_call(tmp,filter);
313
314 return 0;
315}
316
317
318
319/**
320 * Function to redraw each viewer belonging to the current tab
321 * @param tab viewer's tab
322 */
323
324void update_traceset(Tab *tab)
325{
326 LttvAttributeValue value;
327 LttvHooks * tmp;
328 g_assert(lttv_iattribute_find_by_path(tab->attributes,
329 "hooks/updatetraceset", LTTV_POINTER, &value));
330 tmp = (LttvHooks*)*(value.v_pointer);
331 if(tmp == NULL) return;
332 lttv_hooks_call(tmp, NULL);
333}
334
abe346a3 335
336/* get_label function is used to get user input, it displays an input
337 * box, which allows user to input a string
338 */
339
561eba2a 340void get_label_string (GtkWidget * text, gchar * label)
341{
342 GtkEntry * entry = (GtkEntry*)text;
343 if(strlen(gtk_entry_get_text(entry))!=0)
344 strcpy(label,gtk_entry_get_text(entry));
345}
346
eb38aea5 347gboolean get_label(MainWindow * mw, gchar * str, gchar* dialogue_title, gchar * label_str)
561eba2a 348{
349 GtkWidget * dialogue;
350 GtkWidget * text;
351 GtkWidget * label;
352 gint id;
353
5723fa24 354 dialogue = gtk_dialog_new_with_buttons(dialogue_title,NULL,
561eba2a 355 GTK_DIALOG_MODAL,
356 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
357 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
358 NULL);
359
6b1d3120 360 label = gtk_label_new(label_str);
561eba2a 361 gtk_widget_show(label);
362
363 text = gtk_entry_new();
364 gtk_widget_show(text);
365
366 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), label,TRUE, TRUE,0);
367 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), text,FALSE, FALSE,0);
368
369 id = gtk_dialog_run(GTK_DIALOG(dialogue));
370 switch(id){
371 case GTK_RESPONSE_ACCEPT:
372 get_label_string(text,str);
373 gtk_widget_destroy(dialogue);
374 break;
375 case GTK_RESPONSE_REJECT:
376 default:
377 gtk_widget_destroy(dialogue);
eb38aea5 378 return FALSE;
561eba2a 379 }
eb38aea5 380 return TRUE;
561eba2a 381}
382
abe346a3 383
384/* get_window_data_struct function is actually a lookup function,
385 * given a widget which is in the tree of the main window, it will
386 * return the MainWindow data structure associated with main window
387 */
388
bca3b81f 389MainWindow * get_window_data_struct(GtkWidget * widget)
561eba2a 390{
391 GtkWidget * mw;
bca3b81f 392 MainWindow * mw_data;
561eba2a 393
394 mw = lookup_widget(widget, "MWindow");
395 if(mw == NULL){
396 g_printf("Main window does not exist\n");
2d262115 397 return NULL;
561eba2a 398 }
399
2d262115 400 mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"main_window_data");
68b48a45 401 if(mw_data == NULL){
561eba2a 402 g_printf("Main window data does not exist\n");
2d262115 403 return NULL;
561eba2a 404 }
68b48a45 405 return mw_data;
561eba2a 406}
407
abe346a3 408
409/* create_new_window function, just constructs a new main window
410 */
411
68b48a45 412void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
561eba2a 413{
bca3b81f 414 MainWindow * parent = get_window_data_struct(widget);
561eba2a 415
561eba2a 416 if(clone){
417 g_printf("Clone : use the same traceset\n");
08b1c66e 418 construct_main_window(parent);
561eba2a 419 }else{
420 g_printf("Empty : traceset is set to NULL\n");
08b1c66e 421 construct_main_window(NULL);
561eba2a 422 }
423}
424
b052368a 425GtkWidget *viewer_container_focus(GtkWidget *container)
426{
427 GtkWidget *widget;
428
429 widget = (GtkWidget*)g_object_get_data(G_OBJECT(container),
430 "focused_viewer");
431
432 if(widget == NULL) g_debug("no widget focused");
433 return widget;
434
435
436}
437
438gint viewer_container_position(GtkWidget *container, GtkWidget *child)
439{
440
441 if(child == NULL) return -1;
442
443 gint pos;
444 GValue value = { 0, };
445 g_value_init(&value, G_TYPE_INT);
446 gtk_container_child_get_property(GTK_CONTAINER(container),
447 child,
448 "position",
449 &value);
450 pos = g_value_get_int(&value);
451
452 return pos;
453}
454
abe346a3 455
456/* move_*_viewer functions move the selected view up/down in
457 * the current tab
458 */
459
b052368a 460void move_down_viewer(GtkWidget * widget, gpointer user_data)
561eba2a 461{
bca3b81f 462 MainWindow * mw = get_window_data_struct(widget);
6ced96ef 463 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
464
465 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
466 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
467
468 Tab *tab;
6ced96ef 469 if(!page) {
470 return;
471 } else {
472 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
473 }
474
b052368a 475 //gtk_multivpaned_widget_move_up(GTK_MULTIVPANED(tab->multivpaned));
476
477 /* change the position in the vbox */
478 GtkWidget *focus_widget;
479 gint position;
480 focus_widget = viewer_container_focus(tab->viewer_container);
481 position = viewer_container_position(tab->viewer_container, focus_widget);
482
483 if(position > 0) {
484 /* can move up one position */
485 gtk_box_reorder_child(GTK_BOX(tab->viewer_container),
486 focus_widget,
487 position-1);
488 }
489
561eba2a 490}
491
b052368a 492void move_up_viewer(GtkWidget * widget, gpointer user_data)
561eba2a 493{
bca3b81f 494 MainWindow * mw = get_window_data_struct(widget);
6ced96ef 495 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
496
497 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
498 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
499 Tab *tab;
500
501 if(!page) {
502 return;
503 } else {
504 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
505 }
506
b052368a 507 //gtk_multivpaned_widget_move_down(GTK_MULTIVPANED(tab->multivpaned));
508 /* change the position in the vbox */
509 GtkWidget *focus_widget;
510 gint position;
511 focus_widget = viewer_container_focus(tab->viewer_container);
512 position = viewer_container_position(tab->viewer_container, focus_widget);
513
514 if(position != -1 &&
515 position <
516 g_list_length(gtk_container_get_children(
517 GTK_CONTAINER(tab->viewer_container)))-1
518 ) {
519 /* can move down one position */
520 gtk_box_reorder_child(GTK_BOX(tab->viewer_container),
521 focus_widget,
522 position+1);
523 }
524
561eba2a 525}
526
abe346a3 527
528/* delete_viewer deletes the selected viewer in the current tab
529 */
530
561eba2a 531void delete_viewer(GtkWidget * widget, gpointer user_data)
532{
bca3b81f 533 MainWindow * mw = get_window_data_struct(widget);
6ced96ef 534 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
535
536 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
537 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
538 Tab *tab;
539
540 if(!page) {
541 return;
542 } else {
543 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
544 }
545
b052368a 546 //gtk_multivpaned_widget_delete(GTK_MULTIVPANED(tab->multivpaned));
547
548 GtkWidget *focus_widget = viewer_container_focus(tab->viewer_container);
549
550 if(focus_widget != NULL)
551 gtk_widget_destroy(focus_widget);
552
553 g_object_set_data(G_OBJECT(tab->viewer_container), "focused_viewer", NULL);
561eba2a 554}
555
abe346a3 556
557/* open_traceset will open a traceset saved in a file
558 * Right now, it is not finished yet, (not working)
a43d67ba 559 * FIXME
abe346a3 560 */
561
561eba2a 562void open_traceset(GtkWidget * widget, gpointer user_data)
563{
2176f952 564 char ** dir;
565 gint id;
566 LttvTraceset * traceset;
bca3b81f 567 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 568 GtkFileSelection * file_selector =
2176f952 569 (GtkFileSelection *)gtk_file_selection_new("Select a traceset");
570
68b48a45 571 gtk_file_selection_hide_fileop_buttons(file_selector);
c64c7ea1 572
68b48a45 573 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 574 switch(id){
575 case GTK_RESPONSE_ACCEPT:
576 case GTK_RESPONSE_OK:
68b48a45 577 dir = gtk_file_selection_get_selections (file_selector);
2176f952 578 traceset = lttv_traceset_load(dir[0]);
579 g_printf("Open a trace set %s\n", dir[0]);
580 //Not finished yet
581 g_strfreev(dir);
582 case GTK_RESPONSE_REJECT:
583 case GTK_RESPONSE_CANCEL:
584 default:
68b48a45 585 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 586 break;
587 }
c64c7ea1 588
561eba2a 589}
590
b052368a 591static void events_request_free(EventsRequest *events_request)
592{
593 if(events_request == NULL) return;
594
595 if(events_request->start_position != NULL)
596 lttv_traceset_context_position_destroy(events_request->start_position);
597 if(events_request->end_position != NULL)
598 lttv_traceset_context_position_destroy(events_request->end_position);
599 if(events_request->before_chunk_traceset != NULL)
600 lttv_hooks_destroy(events_request->before_chunk_traceset);
601 if(events_request->before_chunk_trace != NULL)
602 lttv_hooks_destroy(events_request->before_chunk_trace);
603 if(events_request->before_chunk_tracefile != NULL)
604 lttv_hooks_destroy(events_request->before_chunk_tracefile);
605 if(events_request->event != NULL)
606 lttv_hooks_destroy(events_request->event);
607 if(events_request->event_by_id != NULL)
608 lttv_hooks_by_id_destroy(events_request->event_by_id);
609 if(events_request->after_chunk_tracefile != NULL)
610 lttv_hooks_destroy(events_request->after_chunk_tracefile);
611 if(events_request->after_chunk_trace != NULL)
612 lttv_hooks_destroy(events_request->after_chunk_trace);
613 if(events_request->after_chunk_traceset != NULL)
614 lttv_hooks_destroy(events_request->after_chunk_traceset);
615 if(events_request->before_request != NULL)
616 lttv_hooks_destroy(events_request->before_request);
617 if(events_request->after_request != NULL)
618 lttv_hooks_destroy(events_request->after_request);
619
620 g_free(events_request);
621}
622
623
abe346a3 624
501e4e70 625/* lttvwindow_process_pending_requests
626 *
627 * This internal function gets called by g_idle, taking care of the pending
628 * requests. It is responsible for concatenation of time intervals and position
629 * requests. It does it with the following algorithm organizing process traceset
630 * calls. Here is the detailed description of the way it works :
631 *
632 * - Events Requests Servicing Algorithm
633 *
634 * Data structures necessary :
635 *
636 * List of requests added to context : list_in
637 * List of requests not added to context : list_out
638 *
639 * Initial state :
640 *
641 * list_in : empty
642 * list_out : many events requests
643 *
644 * FIXME : insert rest of algorithm here
645 *
abe346a3 646 */
647
6ea08962 648#define list_out tab->events_requests
a43d67ba 649
501e4e70 650gboolean lttvwindow_process_pending_requests(Tab *tab)
a8c0f09d 651{
652 unsigned max_nb_events;
653 GdkWindow * win;
654 GdkCursor * new;
655 GtkWidget* widget;
a43d67ba 656 LttvTracesetContext *tsc;
501e4e70 657 LttvTracefileContext *tfc;
501e4e70 658 GSList *list_in = NULL;
659 LttTime end_time;
660 guint end_nb_events;
2d262115 661 guint count;
501e4e70 662 LttvTracesetContextPosition *end_position;
a43d67ba 663
b052368a 664 if(tab == NULL) {
665 g_critical("Foreground processing : tab does not exist. Processing removed.");
501e4e70 666 return FALSE;
b052368a 667 }
a43d67ba 668
501e4e70 669 /* There is no events requests pending : we should never have been called! */
6ea08962 670 g_assert(g_slist_length(list_out) != 0);
a43d67ba 671
501e4e70 672 tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
a8c0f09d 673
abe346a3 674 //set the cursor to be X shape, indicating that the computer is busy in doing its job
a0577796 675#if 0
a8c0f09d 676 new = gdk_cursor_new(GDK_X_CURSOR);
2d262115 677 widget = lookup_widget(tab->mw->mwindow, "MToolbar1");
a8c0f09d 678 win = gtk_widget_get_parent_window(widget);
679 gdk_window_set_cursor(win, new);
680 gdk_cursor_unref(new);
681 gdk_window_stick(win);
682 gdk_window_unstick(win);
a0577796 683#endif //0
a43d67ba 684
6ea08962 685 g_debug("SIZE events req len : %d", g_slist_length(list_out));
686
687 /* Preliminary check for no trace in traceset */
688 /* Unregister the routine if empty, empty list_out too */
689 if(lttv_traceset_number(tsc->ts) == 0) {
690
691 /* - For each req in list_out */
692 GSList *iter = list_out;
693
694 while(iter != NULL) {
695
696 gboolean remove = FALSE;
697 gboolean free_data = FALSE;
698 EventsRequest *events_request = (EventsRequest *)iter->data;
699
700 /* - Call end request for req */
701 if(events_request->servicing == TRUE)
702 lttv_hooks_call(events_request->after_request, (gpointer)tsc);
703
704 /* - remove req from list_out */
705 /* Destroy the request */
706 remove = TRUE;
707 free_data = TRUE;
708
709 /* Go to next */
710 if(remove)
711 {
712 GSList *remove_iter = iter;
713
714 iter = g_slist_next(iter);
b052368a 715 if(free_data) events_request_free((EventsRequest*)remove_iter->data);
6ea08962 716 list_out = g_slist_remove_link(list_out, remove_iter);
717 } else { // not remove
718 iter = g_slist_next(iter);
719 }
720 }
721 }
501e4e70 722
b052368a 723 /* 0.1 Lock Traces */
724 {
725 guint iter_trace=0;
726
727 for(iter_trace=0;
728 iter_trace<lttv_traceset_number(tsc->ts);
729 iter_trace++) {
730 LttvTrace *trace_v = lttv_traceset_get(tsc->ts, iter_trace);
731
732 if(lttvwindowtraces_lock(trace_v) != 0) {
733 g_critical("Foreground processing : Unable to get trace lock");
734 return TRUE; /* Cannot get lock, try later */
735 }
736 }
737 }
738
739 /* 0.2 Seek tracefiles positions to context position */
740 lttv_process_traceset_synchronize_tracefiles(tsc);
741
742
501e4e70 743 /* Events processing algorithm implementation */
dd316a11 744 /* Warning : the gtk_events_pending takes a LOT of cpu time. So what we do
745 * instead is to leave the control to GTK and take it back.
746 */
501e4e70 747 /* A. Servicing loop */
dd316a11 748 //while( (g_slist_length(list_in) != 0 || g_slist_length(list_out) != 0)) {
3bafb436 749 if((g_slist_length(list_in) != 0 || g_slist_length(list_out) != 0)) {
750 /* Servicing */
751 /* 1. If list_in is empty (need a seek) */
752 if( g_slist_length(list_in) == 0 ) {
501e4e70 753
3bafb436 754 /* list in is empty, need a seek */
dd316a11 755 {
3bafb436 756 /* 1.1 Add requests to list_in */
757 GSList *ltime = NULL;
758 GSList *lpos = NULL;
759 GSList *iter = NULL;
501e4e70 760
3bafb436 761 /* 1.1.1 Find all time requests with the lowest start time in list_out
762 * (ltime)
763 */
764 if(g_slist_length(list_out) > 0)
765 ltime = g_slist_append(ltime, g_slist_nth_data(list_out, 0));
766 for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
767 /* Find all time requests with the lowest start time in list_out */
768 guint index_ltime = g_array_index(ltime, guint, 0);
769 EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
770 EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
771
772 int comp;
773 comp = ltt_time_compare(event_request_ltime->start_time,
774 event_request_list_out->start_time);
775 if(comp == 0)
776 ltime = g_slist_append(ltime, event_request_list_out);
777 else if(comp > 0) {
778 /* Remove all elements from ltime, and add current */
779 while(ltime != NULL)
780 ltime = g_slist_delete_link(ltime, g_slist_nth(ltime, 0));
781 ltime = g_slist_append(ltime, event_request_list_out);
782 }
501e4e70 783 }
784
3bafb436 785 /* 1.1.2 Find all position requests with the lowest position in list_out
786 * (lpos)
787 */
788 if(g_slist_length(list_out) > 0)
789 lpos = g_slist_append(lpos, g_slist_nth_data(list_out, 0));
790 for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
791 /* Find all position requests with the lowest position in list_out */
792 EventsRequest *event_request_lpos = (EventsRequest*)g_slist_nth_data(lpos, 0);
793 EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
794
795 int comp;
796 if(event_request_lpos->start_position != NULL
797 && event_request_list_out->start_position != NULL)
798 {
799 comp = lttv_traceset_context_pos_pos_compare
800 (event_request_lpos->start_position,
801 event_request_list_out->start_position);
802 } else {
803 comp = -1;
553d1e7b 804 }
3bafb436 805 if(comp == 0)
806 lpos = g_slist_append(lpos, event_request_list_out);
807 else if(comp > 0) {
808 /* Remove all elements from lpos, and add current */
809 while(lpos != NULL)
810 lpos = g_slist_delete_link(lpos, g_slist_nth(lpos, 0));
811 lpos = g_slist_append(lpos, event_request_list_out);
501e4e70 812 }
813 }
3bafb436 814
815 {
816 EventsRequest *event_request_lpos = (EventsRequest*)g_slist_nth_data(lpos, 0);
817 EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
818 LttTime lpos_start_time;
dd316a11 819
3bafb436 820 if(event_request_lpos != NULL
821 && event_request_lpos->start_position != NULL) {
822 lpos_start_time = lttv_traceset_context_position_get_time(
823 event_request_lpos->start_position);
824 }
825
826 /* 1.1.3 If lpos.start time < ltime */
827 if(event_request_lpos != NULL
828 && event_request_lpos->start_position != NULL
829 && ltt_time_compare(lpos_start_time,
830 event_request_ltime->start_time)<0) {
831 /* Add lpos to list_in, remove them from list_out */
832 for(iter=lpos;iter!=NULL;iter=g_slist_next(iter)) {
833 /* Add to list_in */
834 EventsRequest *event_request_lpos =
835 (EventsRequest*)iter->data;
836
837 list_in = g_slist_append(list_in, event_request_lpos);
838 /* Remove from list_out */
839 list_out = g_slist_remove(list_out, event_request_lpos);
840 }
841 } else {
842 /* 1.1.4 (lpos.start time >= ltime) */
843 /* Add ltime to list_in, remove them from list_out */
844
845 for(iter=ltime;iter!=NULL;iter=g_slist_next(iter)) {
846 /* Add to list_in */
847 EventsRequest *event_request_ltime =
848 (EventsRequest*)iter->data;
849
850 list_in = g_slist_append(list_in, event_request_ltime);
851 /* Remove from list_out */
852 list_out = g_slist_remove(list_out, event_request_ltime);
853 }
854 }
dd316a11 855 }
3bafb436 856 g_slist_free(lpos);
857 g_slist_free(ltime);
dd316a11 858 }
dd316a11 859
3bafb436 860 /* 1.2 Seek */
861 {
862 tfc = lttv_traceset_context_get_current_tfc(tsc);
863 g_assert(g_slist_length(list_in)>0);
864 EventsRequest *events_request = g_slist_nth_data(list_in, 0);
865 guint seek_count;
866
867 /* 1.2.1 If first request in list_in is a time request */
868 if(events_request->start_position == NULL) {
869 /* - If first req in list_in start time != current time */
870 if(tfc == NULL || ltt_time_compare(events_request->start_time,
871 tfc->timestamp) != 0)
872 /* - Seek to that time */
873 g_debug("SEEK TIME : %lu, %lu", events_request->start_time.tv_sec,
874 events_request->start_time.tv_nsec);
875 //lttv_process_traceset_seek_time(tsc, events_request->start_time);
876 lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
877 events_request->start_time);
878
879 /* Process the traceset with only state hooks */
880 seek_count =
881 lttv_process_traceset_middle(tsc,
882 events_request->start_time,
883 G_MAXUINT, NULL);
6ea08962 884
a43d67ba 885
3bafb436 886 } else {
887 LttTime pos_time;
888 /* Else, the first request in list_in is a position request */
889 /* If first req in list_in pos != current pos */
890 g_assert(events_request->start_position != NULL);
891 g_debug("SEEK POS time : %lu, %lu",
892 lttv_traceset_context_position_get_time(
893 events_request->start_position).tv_sec,
894 lttv_traceset_context_position_get_time(
895 events_request->start_position).tv_nsec);
896
897 g_debug("SEEK POS context time : %lu, %lu",
898 lttv_traceset_context_get_current_tfc(tsc)->timestamp.tv_sec,
899 lttv_traceset_context_get_current_tfc(tsc)->timestamp.tv_nsec);
900 g_assert(events_request->start_position != NULL);
901 if(lttv_traceset_context_ctx_pos_compare(tsc,
902 events_request->start_position) != 0) {
903 /* 1.2.2.1 Seek to that position */
904 g_debug("SEEK POSITION");
905 //lttv_process_traceset_seek_position(tsc, events_request->start_position);
906 pos_time = lttv_traceset_context_position_get_time(
907 events_request->start_position);
908
909 lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
910 pos_time);
911
912 /* Process the traceset with only state hooks */
913 seek_count =
914 lttv_process_traceset_middle(tsc,
915 ltt_time_infinite,
916 G_MAXUINT,
917 events_request->start_position);
918 g_assert(lttv_traceset_context_ctx_pos_compare(tsc,
919 events_request->start_position) == 0);
dd316a11 920
dd316a11 921
3bafb436 922 }
923 }
924 }
2d262115 925
3bafb436 926 /* 1.3 Add hooks and call before request for all list_in members */
927 {
928 GSList *iter = NULL;
dd316a11 929
3bafb436 930 for(iter=list_in;iter!=NULL;iter=g_slist_next(iter)) {
931 EventsRequest *events_request = (EventsRequest*)iter->data;
932 /* 1.3.1 If !servicing */
2d262115 933 if(events_request->servicing == FALSE) {
934 /* - begin request hooks called
935 * - servicing = TRUE
936 */
6ea08962 937 lttv_hooks_call(events_request->before_request, (gpointer)tsc);
2d262115 938 events_request->servicing = TRUE;
939 }
3bafb436 940 /* 1.3.2 call before chunk
941 * 1.3.3 events hooks added
2d262115 942 */
943 lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
944 events_request->before_chunk_trace,
945 events_request->before_chunk_tracefile,
501e4e70 946 events_request->event,
947 events_request->event_by_id);
948 }
3bafb436 949 }
950 } else {
951 /* 2. Else, list_in is not empty, we continue a read */
952
953 {
954 /* 2.0 For each req of list_in */
955 GSList *iter = list_in;
956
957 while(iter != NULL) {
2d262115 958
3bafb436 959 EventsRequest *events_request = (EventsRequest *)iter->data;
960
961 /* - Call before chunk
962 * - events hooks added
963 */
964 lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
965 events_request->before_chunk_trace,
966 events_request->before_chunk_tracefile,
967 events_request->event,
968 events_request->event_by_id);
6ea08962 969
970 iter = g_slist_next(iter);
971 }
972 }
973
3bafb436 974 {
975 tfc = lttv_traceset_context_get_current_tfc(tsc);
976
977 /* 2.1 For each req of list_out */
978 GSList *iter = list_out;
553d1e7b 979
3bafb436 980 while(iter != NULL) {
6ea08962 981
3bafb436 982 gboolean remove = FALSE;
983 gboolean free_data = FALSE;
984 EventsRequest *events_request = (EventsRequest *)iter->data;
985
986 /* if req.start time == current context time
987 * or req.start position == current position*/
988 if( ltt_time_compare(events_request->start_time,
989 tfc->timestamp) == 0
990 ||
991 (events_request->start_position != NULL
992 &&
993 lttv_traceset_context_ctx_pos_compare(tsc,
994 events_request->start_position) == 0)
995 ) {
996 /* - Add to list_in, remove from list_out */
997 list_in = g_slist_append(list_in, events_request);
998 remove = TRUE;
999 free_data = FALSE;
1000
1001 /* - If !servicing */
1002 if(events_request->servicing == FALSE) {
1003 /* - begin request hooks called
1004 * - servicing = TRUE
1005 */
1006 lttv_hooks_call(events_request->before_request, (gpointer)tsc);
1007 events_request->servicing = TRUE;
1008 }
1009 /* call before chunk
1010 * events hooks added
1011 */
1012 lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
1013 events_request->before_chunk_trace,
1014 events_request->before_chunk_tracefile,
1015 events_request->event,
1016 events_request->event_by_id);
1017 }
501e4e70 1018
3bafb436 1019 /* Go to next */
1020 if(remove)
1021 {
1022 GSList *remove_iter = iter;
2d262115 1023
3bafb436 1024 iter = g_slist_next(iter);
1025 if(free_data) events_request_free((EventsRequest*)remove_iter->data);
1026 list_out = g_slist_remove_link(list_out, remove_iter);
1027 } else { // not remove
1028 iter = g_slist_next(iter);
1029 }
1030 }
1031 }
1032 }
8f2872f4 1033
3bafb436 1034 /* 3. Find end criterions */
1035 {
1036 /* 3.1 End time */
1037 GSList *iter;
1038
1039 /* 3.1.1 Find lowest end time in list_in */
1040 g_assert(g_slist_length(list_in)>0);
1041 end_time = ((EventsRequest*)g_slist_nth_data(list_in,0))->end_time;
1042
1043 for(iter=g_slist_nth(list_in,1);iter!=NULL;iter=g_slist_next(iter)) {
1044 EventsRequest *events_request = (EventsRequest*)iter->data;
501e4e70 1045
3bafb436 1046 if(ltt_time_compare(events_request->end_time,
1047 end_time) < 0)
1048 end_time = events_request->end_time;
1049 }
1050
1051 /* 3.1.2 Find lowest start time in list_out */
1052 for(iter=list_out;iter!=NULL;iter=g_slist_next(iter)) {
1053 EventsRequest *events_request = (EventsRequest*)iter->data;
2d262115 1054
3bafb436 1055 if(ltt_time_compare(events_request->start_time,
1056 end_time) < 0)
1057 end_time = events_request->start_time;
1058 }
501e4e70 1059 }
1060
3bafb436 1061 {
1062 /* 3.2 Number of events */
dd316a11 1063
3bafb436 1064 /* 3.2.1 Find lowest number of events in list_in */
1065 GSList *iter;
501e4e70 1066
3bafb436 1067 end_nb_events = ((EventsRequest*)g_slist_nth_data(list_in,0))->num_events;
501e4e70 1068
3bafb436 1069 for(iter=g_slist_nth(list_in,1);iter!=NULL;iter=g_slist_next(iter)) {
1070 EventsRequest *events_request = (EventsRequest*)iter->data;
501e4e70 1071
3bafb436 1072 if(events_request->num_events < end_nb_events)
1073 end_nb_events = events_request->num_events;
1074 }
501e4e70 1075
3bafb436 1076 /* 3.2.2 Use min(CHUNK_NUM_EVENTS, min num events in list_in) as
1077 * num_events */
1078
1079 end_nb_events = MIN(CHUNK_NUM_EVENTS, end_nb_events);
501e4e70 1080 }
501e4e70 1081
3bafb436 1082 {
1083 /* 3.3 End position */
501e4e70 1084
3bafb436 1085 /* 3.3.1 Find lowest end position in list_in */
1086 GSList *iter;
6ea08962 1087
3bafb436 1088 end_position =((EventsRequest*)g_slist_nth_data(list_in,0))->end_position;
6ea08962 1089
3bafb436 1090 for(iter=g_slist_nth(list_in,1);iter!=NULL;iter=g_slist_next(iter)) {
1091 EventsRequest *events_request = (EventsRequest*)iter->data;
dd316a11 1092
3bafb436 1093 if(events_request->end_position != NULL && end_position != NULL &&
1094 lttv_traceset_context_pos_pos_compare(events_request->end_position,
1095 end_position) <0)
1096 end_position = events_request->end_position;
1097 }
1098 }
1099
1100 {
1101 /* 3.3.2 Find lowest start position in list_out */
1102 GSList *iter;
dd316a11 1103
3bafb436 1104 for(iter=list_out;iter!=NULL;iter=g_slist_next(iter)) {
1105 EventsRequest *events_request = (EventsRequest*)iter->data;
dd316a11 1106
3bafb436 1107 if(events_request->end_position != NULL && end_position != NULL &&
1108 lttv_traceset_context_pos_pos_compare(events_request->end_position,
1109 end_position) <0)
1110 end_position = events_request->end_position;
dd316a11 1111 }
2d262115 1112 }
3bafb436 1113
2d262115 1114 {
3bafb436 1115 /* 4. Call process traceset middle */
1116 g_debug("Calling process traceset middle with %p, %lu sec %lu nsec, %lu nb ev, %p end pos", tsc, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position);
1117 count = lttv_process_traceset_middle(tsc, end_time, end_nb_events, end_position);
2d262115 1118
3bafb436 1119 tfc = lttv_traceset_context_get_current_tfc(tsc);
1120 if(tfc != NULL)
1121 g_debug("Context time after middle : %lu, %lu", tfc->timestamp.tv_sec,
1122 tfc->timestamp.tv_nsec);
1123 else
1124 g_debug("End of trace reached after middle.");
2d262115 1125
3bafb436 1126 }
1127 {
1128 /* 5. After process traceset middle */
1129 tfc = lttv_traceset_context_get_current_tfc(tsc);
1130
1131 /* - if current context time > traceset.end time */
1132 if(tfc == NULL || ltt_time_compare(tfc->timestamp,
1133 tsc->time_span.end_time) > 0) {
1134 /* - For each req in list_in */
1135 GSList *iter = list_in;
1136
1137 while(iter != NULL) {
1138
1139 gboolean remove = FALSE;
1140 gboolean free_data = FALSE;
1141 EventsRequest *events_request = (EventsRequest *)iter->data;
1142
1143 /* - Remove events hooks for req
1144 * - Call end chunk for req
1145 */
1146 lttv_process_traceset_end(tsc, events_request->after_chunk_traceset,
1147 events_request->after_chunk_trace,
1148 events_request->after_chunk_tracefile,
1149 events_request->event,
1150 events_request->event_by_id);
1151 /* - Call end request for req */
6ea08962 1152 lttv_hooks_call(events_request->after_request, (gpointer)tsc);
3bafb436 1153
2d262115 1154 /* - remove req from list_in */
1155 /* Destroy the request */
1156 remove = TRUE;
1157 free_data = TRUE;
3bafb436 1158
1159 /* Go to next */
1160 if(remove)
1161 {
1162 GSList *remove_iter = iter;
1163
1164 iter = g_slist_next(iter);
1165 if(free_data) events_request_free((EventsRequest*)remove_iter->data);
1166 list_in = g_slist_remove_link(list_in, remove_iter);
1167 } else { // not remove
1168 iter = g_slist_next(iter);
1169 }
2d262115 1170 }
3bafb436 1171 }
1172 {
1173 /* 5.1 For each req in list_in */
1174 GSList *iter = list_in;
1175
1176 while(iter != NULL) {
501e4e70 1177
3bafb436 1178 gboolean remove = FALSE;
1179 gboolean free_data = FALSE;
1180 EventsRequest *events_request = (EventsRequest *)iter->data;
1181
1182 /* - Remove events hooks for req
1183 * - Call end chunk for req
1184 */
1185 lttv_process_traceset_end(tsc, events_request->after_chunk_traceset,
1186 events_request->after_chunk_trace,
1187 events_request->after_chunk_tracefile,
1188 events_request->event,
1189 events_request->event_by_id);
1190
1191 /* - req.num -= count */
1192 g_assert(events_request->num_events >= count);
1193 events_request->num_events -= count;
1194
1195 g_assert(tfc != NULL);
1196 /* - if req.num == 0
1197 * or
1198 * current context time >= req.end time
1199 * or
1200 * req.end pos == current pos
1201 * or
1202 * req.stop_flag == TRUE
1203 */
1204 if( events_request->num_events == 0
1205 ||
1206 events_request->stop_flag == TRUE
1207 ||
1208 ltt_time_compare(tfc->timestamp,
1209 events_request->end_time) >= 0
1210 ||
1211 (events_request->end_position != NULL
1212 &&
1213 lttv_traceset_context_ctx_pos_compare(tsc,
1214 events_request->end_position) == 0)
1215
1216 ) {
1217 g_assert(events_request->servicing == TRUE);
1218 /* - Call end request for req
1219 * - remove req from list_in */
1220 lttv_hooks_call(events_request->after_request, (gpointer)tsc);
1221 /* - remove req from list_in */
1222 /* Destroy the request */
1223 remove = TRUE;
1224 free_data = TRUE;
1225 }
1226
1227 /* Go to next */
1228 if(remove)
1229 {
1230 GSList *remove_iter = iter;
1231
1232 iter = g_slist_next(iter);
1233 if(free_data) events_request_free((EventsRequest*)remove_iter->data);
1234 list_in = g_slist_remove_link(list_in, remove_iter);
1235 } else { // not remove
1236 iter = g_slist_next(iter);
1237 }
2d262115 1238 }
1239 }
1240 }
501e4e70 1241 }
dd316a11 1242 /* End of removed servicing loop : leave control to GTK instead. */
1243 // if(gtk_events_pending()) break;
1244 //}
1245
2d262115 1246 /* B. When interrupted between chunks */
501e4e70 1247
501e4e70 1248 {
1249 GSList *iter = list_in;
1250
2d262115 1251 /* 1. for each request in list_in */
501e4e70 1252 while(iter != NULL) {
1253
1254 gboolean remove = FALSE;
1255 gboolean free_data = FALSE;
2d262115 1256 EventsRequest *events_request = (EventsRequest *)iter->data;
501e4e70 1257
1258 /* 1.1. Use current postition as start position */
a1a2b649 1259 if(events_request->start_position != NULL)
1260 lttv_traceset_context_position_destroy(events_request->start_position);
b052368a 1261 events_request->start_position = lttv_traceset_context_position_new();
501e4e70 1262 lttv_traceset_context_position_save(tsc, events_request->start_position);
1263
1264 /* 1.2. Remove start time */
2d262115 1265 events_request->start_time.tv_sec = G_MAXUINT;
1266 events_request->start_time.tv_nsec = G_MAXUINT;
501e4e70 1267
2d262115 1268 /* 1.3. Move from list_in to list_out */
501e4e70 1269 remove = TRUE;
1270 free_data = FALSE;
1271 list_out = g_slist_append(list_out, events_request);
1272
501e4e70 1273 /* Go to next */
1274 if(remove)
8f2872f4 1275 {
501e4e70 1276 GSList *remove_iter = iter;
1277
1278 iter = g_slist_next(iter);
b052368a 1279 if(free_data) events_request_free((EventsRequest*)remove_iter->data);
501e4e70 1280 list_in = g_slist_remove_link(list_in, remove_iter);
1281 } else { // not remove
1282 iter = g_slist_next(iter);
8f2872f4 1283 }
1284 }
a43d67ba 1285
501e4e70 1286
1287 }
b052368a 1288
1289 /* C Unlock Traces */
1290 {
1291 //lttv_process_traceset_get_sync_data(tsc);
1292
1293 guint iter_trace;
1294
1295 for(iter_trace=0;
1296 iter_trace<lttv_traceset_number(tsc->ts);
1297 iter_trace++) {
1298 LttvTrace *trace_v = lttv_traceset_get(tsc->ts, iter_trace);
1299
1300 lttvwindowtraces_unlock(trace_v);
1301 }
1302 }
501e4e70 1303
a0577796 1304#if 0
abe346a3 1305 //set the cursor back to normal
a8c0f09d 1306 gdk_window_set_cursor(win, NULL);
a0577796 1307#endif //0
501e4e70 1308
2d262115 1309 g_assert(g_slist_length(list_in) == 0);
6ea08962 1310
2d262115 1311 if( g_slist_length(list_out) == 0 ) {
501e4e70 1312 /* Put tab's request pending flag back to normal */
2d262115 1313 tab->events_request_pending = FALSE;
b052368a 1314 g_debug("remove the idle fct");
501e4e70 1315 return FALSE; /* Remove the idle function */
1316 }
b052368a 1317 g_debug("leave the idle fct");
501e4e70 1318 return TRUE; /* Leave the idle function */
b052368a 1319
1320 /* We do not use simili-round-robin, it may require to read 1 meg buffers
1321 * again and again if many tracesets use the same tracefiles. */
1322 /* Hack for round-robin idle functions */
1323 /* It will put the idle function at the end of the pool */
1324 /*g_idle_add_full((G_PRIORITY_HIGH_IDLE + 21),
1325 (GSourceFunc)execute_events_requests,
1326 tab,
1327 NULL);
1328 return FALSE;
1329 */
202f6c8f 1330}
1331
6ea08962 1332#undef list_out
501e4e70 1333
abe346a3 1334
1335/* add_trace_into_traceset_selector, each instance of a viewer has an associated
1336 * selector (filter), when a trace is added into traceset, the selector should
1337 * reflect the change. The function is used to update the selector
1338 */
b052368a 1339#if 0
1340void add_trace_into_traceset_selector(GtkWidget * paned, LttTrace * t)
49bf71b5 1341{
ed3b99b6 1342 int j, k, m, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
49bf71b5 1343 LttvTracesetSelector * s;
1344 LttvTraceSelector * trace;
1345 LttvTracefileSelector * tracefile;
ed3b99b6 1346 LttvEventtypeSelector * eventtype;
49bf71b5 1347 LttTracefile * tf;
1348 GtkWidget * w;
ed3b99b6 1349 LttFacility * fac;
1350 LttEventType * et;
49bf71b5 1351
b052368a 1352 w = gtk_multivpaned_get_first_widget(GTK_MULTIVPANED(paned));
49bf71b5 1353 while(w){
1354 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
49bf71b5 1355
abe346a3 1356 if(s){
1357 trace = lttv_trace_selector_new(t);
1358 lttv_traceset_selector_trace_add(s, trace);
1359
1360 nb_facility = ltt_trace_facility_number(t);
1361 for(k=0;k<nb_facility;k++){
1362 fac = ltt_trace_facility_get(t,k);
1363 nb_event = (int) ltt_facility_eventtype_number(fac);
1364 for(m=0;m<nb_event;m++){
1365 et = ltt_facility_eventtype_get(fac,m);
1366 eventtype = lttv_eventtype_selector_new(et);
1367 lttv_trace_selector_eventtype_add(trace, eventtype);
1368 }
1369 }
1370
1371 nb_control = ltt_trace_control_tracefile_number(t);
1372 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
1373 nb_tracefile = nb_control + nb_per_cpu;
1374
1375 for(j = 0 ; j < nb_tracefile ; j++) {
1376 if(j < nb_control)
1377 tf = ltt_trace_control_tracefile_get(t, j);
1378 else
1379 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
1380 tracefile = lttv_tracefile_selector_new(tf);
1381 lttv_trace_selector_tracefile_add(trace, tracefile);
1382 lttv_eventtype_selector_copy(trace, tracefile);
1383 }
1384 }else g_warning("Module does not support filtering\n");
49bf71b5 1385
b052368a 1386 w = gtk_multivpaned_get_next_widget(GTK_MULTIVPANED(paned));
49bf71b5 1387 }
1388}
b052368a 1389#endif //0
abe346a3 1390
4266dc7f 1391static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v)
1392{
1393 LttvTraceset *traceset = tab->traceset_info->traceset;
1394 guint i;
91fd6881 1395 guint num_traces = lttv_traceset_number(traceset);
4266dc7f 1396
a1a2b649 1397 //Verify if trace is already present.
91fd6881 1398 for(i=0; i<num_traces; i++)
a1a2b649 1399 {
1400 LttvTrace * trace = lttv_traceset_get(traceset, i);
1401 if(trace == trace_v)
1402 return;
1403 }
1404
4266dc7f 1405 //Keep a reference to the traces so they are not freed.
1406 for(i=0; i<lttv_traceset_number(traceset); i++)
1407 {
1408 LttvTrace * trace = lttv_traceset_get(traceset, i);
1409 lttv_trace_ref(trace);
1410 }
1411
1412 //remove state update hooks
1413 lttv_state_remove_event_hooks(
1414 (LttvTracesetState*)tab->traceset_info->traceset_context);
1415
1416 lttv_context_fini(LTTV_TRACESET_CONTEXT(
1417 tab->traceset_info->traceset_context));
1418 g_object_unref(tab->traceset_info->traceset_context);
1419
1420 lttv_traceset_add(traceset, trace_v);
a1a2b649 1421 lttv_trace_ref(trace_v); /* local ref */
4266dc7f 1422
1423 /* Create new context */
1424 tab->traceset_info->traceset_context =
1425 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1426 lttv_context_init(
1427 LTTV_TRACESET_CONTEXT(tab->traceset_info->
1428 traceset_context),
1429 traceset);
6ea08962 1430
b052368a 1431 /* Set the tab's time window and current time if
1432 * out of bounds */
1433 TimeInterval time_span =
1434 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->time_span;
1435 if(ltt_time_compare(tab->time_window.start_time, time_span.start_time) < 0
1436 || ltt_time_compare( ltt_time_add(tab->time_window.start_time,
1437 tab->time_window.time_width),
1438 time_span.end_time) > 0) {
6ea08962 1439 tab->time_window.start_time =
1440 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1441 time_span.start_time;
b052368a 1442 tab->current_time =
1443 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1444 time_span.start_time;
1445
6ea08962 1446 LttTime tmp_time;
1447
1448 if(DEFAULT_TIME_WIDTH_S <
1449 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1450 time_span.end_time.tv_sec)
1451 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
1452 else
1453 tmp_time.tv_sec =
1454 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1455 time_span.end_time.tv_sec;
1456 tmp_time.tv_nsec = 0;
1457 tab->time_window.time_width = tmp_time ;
b052368a 1458
6ea08962 1459 }
b052368a 1460
4266dc7f 1461 //add state update hooks
1462 lttv_state_add_event_hooks(
1463 (LttvTracesetState*)tab->traceset_info->traceset_context);
1464 //Remove local reference to the traces.
1465 for(i=0; i<lttv_traceset_number(traceset); i++)
1466 {
1467 LttvTrace * trace = lttv_traceset_get(traceset, i);
1468 lttv_trace_unref(trace);
1469 }
1470
b052368a 1471 //FIXME
1472 //add_trace_into_traceset_selector(GTK_MULTIVPANED(tab->multivpaned), lttv_trace(trace_v));
4266dc7f 1473}
1474
abe346a3 1475/* add_trace adds a trace into the current traceset. It first displays a
1476 * directory selection dialogue to let user choose a trace, then recreates
1477 * tracset_context, and redraws all the viewer of the current tab
1478 */
1479
561eba2a 1480void add_trace(GtkWidget * widget, gpointer user_data)
1481{
2176f952 1482 LttTrace *trace;
1483 LttvTrace * trace_v;
1484 LttvTraceset * traceset;
94dcfb9e 1485 const char * dir;
a1a2b649 1486 char abs_path[PATH_MAX];
2176f952 1487 gint id;
a43d67ba 1488 gint i;
bca3b81f 1489 MainWindow * mw_data = get_window_data_struct(widget);
6ced96ef 1490 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1491
1492 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1493 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1494 Tab *tab;
1495
1496 if(!page) {
1497 tab = create_new_tab(widget, NULL);
1498 } else {
1499 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1500 }
4266dc7f 1501
68b48a45 1502 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
1503 gtk_dir_selection_hide_fileop_buttons(file_selector);
4266dc7f 1504
3658a338 1505 if(remember_trace_dir[0] != '\0')
1506 gtk_dir_selection_set_filename(file_selector, remember_trace_dir);
2176f952 1507
68b48a45 1508 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 1509 switch(id){
1510 case GTK_RESPONSE_ACCEPT:
1511 case GTK_RESPONSE_OK:
68b48a45 1512 dir = gtk_dir_selection_get_dir (file_selector);
a1a2b649 1513 strncpy(remember_trace_dir, dir, PATH_MAX);
a43d67ba 1514 if(!dir || strlen(dir) == 0){
1515 gtk_widget_destroy((GtkWidget*)file_selector);
1516 break;
284675e3 1517 }
a1a2b649 1518 get_absolute_pathname(dir, abs_path);
1519 trace_v = lttvwindowtraces_get_trace_by_name(abs_path);
1520 if(trace_v == NULL) {
1521 trace = ltt_trace_open(abs_path);
2a74fbf4 1522 if(trace == NULL) {
1523 g_warning("cannot open trace %s", abs_path);
1524 } else {
1525 trace_v = lttv_trace_new(trace);
1526 lttvwindowtraces_add_trace(trace_v);
1527 lttvwindow_add_trace(tab, trace_v);
1528 }
1529 } else {
1530 lttvwindow_add_trace(tab, trace_v);
a1a2b649 1531 }
c2619a30 1532
49bf71b5 1533 gtk_widget_destroy((GtkWidget*)file_selector);
1534
1535 //update current tab
a43d67ba 1536 //update_traceset(mw_data);
21e8c385 1537
a43d67ba 1538 /* Call the updatetraceset hooks */
1539
4266dc7f 1540 traceset = tab->traceset_info->traceset;
1541 SetTraceset(tab, traceset);
a43d67ba 1542 // in expose now call_pending_read_hooks(mw_data);
1543
4266dc7f 1544 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
49bf71b5 1545 break;
2176f952 1546 case GTK_RESPONSE_REJECT:
1547 case GTK_RESPONSE_CANCEL:
1548 default:
68b48a45 1549 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 1550 break;
1551 }
49bf71b5 1552}
1553
abe346a3 1554
1555/* remove_trace_into_traceset_selector, each instance of a viewer has an associated
1556 * selector (filter), when a trace is remove from traceset, the selector should
1557 * reflect the change. The function is used to update the selector
1558 */
b052368a 1559#if 0
1560void remove_trace_from_traceset_selector(GtkWidget * paned, unsigned i)
49bf71b5 1561{
1562 LttvTracesetSelector * s;
1563 LttvTraceSelector * t;
1564 GtkWidget * w;
1565
b052368a 1566 w = gtk_multivpaned_get_first_widget(GTK_MULTIVPANED(paned));
49bf71b5 1567 while(w){
1568 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
abe346a3 1569 if(s){
1570 t = lttv_traceset_selector_trace_get(s,i);
1571 lttv_traceset_selector_trace_remove(s, i);
1572 lttv_trace_selector_destroy(t);
1573 }g_warning("Module dose not support filtering\n");
b052368a 1574 w = gtk_multivpaned_get_next_widget(GTK_MULTIVPANED(paned));
49bf71b5 1575 }
561eba2a 1576}
b052368a 1577#endif //0
abe346a3 1578
1579/* remove_trace removes a trace from the current traceset if all viewers in
1580 * the current tab are not interested in the trace. It first displays a
1581 * dialogue, which shows all traces in the current traceset, to let user choose
1582 * a trace, then it checks if all viewers unselect the trace, if it is true,
1583 * it will remove the trace, recreate the traceset_contex,
1584 * and redraws all the viewer of the current tab. If there is on trace in the
1585 * current traceset, it will delete all viewers of the current tab
1586 */
1587
b052368a 1588// MD : no filter version.
1589void remove_trace(GtkWidget *widget, gpointer user_data)
1590{
1591 LttTrace *trace;
1592 LttvTrace * trace_v;
1593 LttvTraceset * traceset;
1594 gint i, j, nb_trace, index=-1;
1595 char ** name, *remove_trace_name;
1596 MainWindow * mw_data = get_window_data_struct(widget);
1597 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1598
1599 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1600 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1601 Tab *tab;
1602
1603 if(!page) {
1604 return;
1605 } else {
1606 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1607 }
1608
1609 nb_trace =lttv_traceset_number(tab->traceset_info->traceset);
1610 name = g_new(char*,nb_trace);
1611 for(i = 0; i < nb_trace; i++){
1612 trace_v = lttv_traceset_get(tab->traceset_info->traceset, i);
1613 trace = lttv_trace(trace_v);
1614 name[i] = ltt_trace_name(trace);
1615 }
1616
1617 remove_trace_name = get_remove_trace(name, nb_trace);
1618
1619
1620 if(remove_trace_name){
1621
1622 /* yuk, cut n paste from old code.. should be better (MD)*/
1623 for(i = 0; i<nb_trace; i++) {
1624 if(strcmp(remove_trace_name,name[i]) == 0){
1625 index = i;
1626 }
1627 }
1628
1629 traceset = tab->traceset_info->traceset;
1630 //Keep a reference to the traces so they are not freed.
1631 for(j=0; j<lttv_traceset_number(traceset); j++)
1632 {
1633 LttvTrace * trace = lttv_traceset_get(traceset, j);
1634 lttv_trace_ref(trace);
1635 }
1636
1637 //remove state update hooks
1638 lttv_state_remove_event_hooks(
1639 (LttvTracesetState*)tab->traceset_info->traceset_context);
1640 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context));
1641 g_object_unref(tab->traceset_info->traceset_context);
1642
1643 trace_v = lttv_traceset_get(traceset, index);
1644
1645 if(lttv_trace_get_ref_number(trace_v) <= 2) {
1646 /* ref 2 : traceset, local */
1647 lttvwindowtraces_remove_trace(trace_v);
1648 ltt_trace_close(lttv_trace(trace_v));
1649 }
1650
1651 lttv_traceset_remove(traceset, index);
1652 lttv_trace_unref(trace_v); // Remove local reference
1653
1654 if(!lttv_trace_get_ref_number(trace_v))
1655 lttv_trace_destroy(trace_v);
1656
1657 tab->traceset_info->traceset_context =
1658 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1659 lttv_context_init(
1660 LTTV_TRACESET_CONTEXT(tab->
1661 traceset_info->traceset_context),traceset);
1662 //add state update hooks
1663 lttv_state_add_event_hooks(
1664 (LttvTracesetState*)tab->traceset_info->traceset_context);
1665
1666 //Remove local reference to the traces.
1667 for(j=0; j<lttv_traceset_number(traceset); j++)
1668 {
1669 LttvTrace * trace = lttv_traceset_get(traceset, j);
1670 lttv_trace_unref(trace);
1671 }
1672
1673 SetTraceset(tab, (gpointer)traceset);
1674 }
1675 g_free(name);
1676}
1677
1678#if 0
561eba2a 1679void remove_trace(GtkWidget * widget, gpointer user_data)
1680{
2176f952 1681 LttTrace *trace;
1682 LttvTrace * trace_v;
1683 LttvTraceset * traceset;
a43d67ba 1684 gint i, j, nb_trace;
2176f952 1685 char ** name, *remove_trace_name;
bca3b81f 1686 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 1687 LttvTracesetSelector * s;
1688 LttvTraceSelector * t;
1689 GtkWidget * w;
1690 gboolean selected;
6ced96ef 1691 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1692
1693 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1694 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1695 Tab *tab;
1696
1697 if(!page) {
1698 return;
1699 } else {
1700 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1701 }
1702
4266dc7f 1703 nb_trace =lttv_traceset_number(tab->traceset_info->traceset);
2176f952 1704 name = g_new(char*,nb_trace);
1705 for(i = 0; i < nb_trace; i++){
4266dc7f 1706 trace_v = lttv_traceset_get(tab->traceset_info->traceset, i);
2176f952 1707 trace = lttv_trace(trace_v);
a5dcde2f 1708 name[i] = ltt_trace_name(trace);
2176f952 1709 }
1710
1711 remove_trace_name = get_remove_trace(name, nb_trace);
1712
1713 if(remove_trace_name){
1714 for(i=0; i<nb_trace; i++){
1715 if(strcmp(remove_trace_name,name[i]) == 0){
6ced96ef 1716 //unselect the trace from the current viewer
b052368a 1717 //FIXME
1718 w = gtk_multivpaned_get_widget(GTK_MULTIVPANED(tab->multivpaned));
6ced96ef 1719 if(w){
1720 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1721 if(s){
1722 t = lttv_traceset_selector_trace_get(s,i);
1723 lttv_trace_selector_set_selected(t, FALSE);
1724 }
1725
1726 //check if other viewers select the trace
b052368a 1727 w = gtk_multivpaned_get_first_widget(GTK_MULTIVPANED(tab->multivpaned));
6ced96ef 1728 while(w){
1729 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1730 if(s){
1731 t = lttv_traceset_selector_trace_get(s,i);
1732 selected = lttv_trace_selector_get_selected(t);
1733 if(selected)break;
1734 }
b052368a 1735 w = gtk_multivpaned_get_next_widget(GTK_MULTIVPANED(tab->multivpaned));
6ced96ef 1736 }
1737 }else selected = FALSE;
49bf71b5 1738
6ced96ef 1739 //if no viewer selects the trace, remove it
1740 if(!selected){
b052368a 1741 remove_trace_from_traceset_selector(GTK_MULTIVPANED(tab->multivpaned), i);
49bf71b5 1742
6ced96ef 1743 traceset = tab->traceset_info->traceset;
1744 //Keep a reference to the traces so they are not freed.
1745 for(j=0; j<lttv_traceset_number(traceset); j++)
1746 {
1747 LttvTrace * trace = lttv_traceset_get(traceset, j);
1748 lttv_trace_ref(trace);
1749 }
a43d67ba 1750
6ced96ef 1751 //remove state update hooks
1752 lttv_state_remove_event_hooks(
1753 (LttvTracesetState*)tab->traceset_info->traceset_context);
1754 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context));
1755 g_object_unref(tab->traceset_info->traceset_context);
a43d67ba 1756
a43d67ba 1757
6ced96ef 1758 trace_v = lttv_traceset_get(traceset, i);
a43d67ba 1759
a1a2b649 1760 if(lttv_trace_get_ref_number(trace_v) <= 2) {
1761 /* ref 2 : traceset, local */
1762 lttvwindowtraces_remove_trace(trace_v);
6ced96ef 1763 ltt_trace_close(lttv_trace(trace_v));
a1a2b649 1764 }
6ced96ef 1765
1766 lttv_traceset_remove(traceset, i);
1767 lttv_trace_unref(trace_v); // Remove local reference
c2619a30 1768
6ced96ef 1769 if(!lttv_trace_get_ref_number(trace_v))
1770 lttv_trace_destroy(trace_v);
1771
1772 tab->traceset_info->traceset_context =
1773 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1774 lttv_context_init(
1775 LTTV_TRACESET_CONTEXT(tab->
1776 traceset_info->traceset_context),traceset);
1777 //add state update hooks
1778 lttv_state_add_event_hooks(
1779 (LttvTracesetState*)tab->traceset_info->traceset_context);
1780
1781 //Remove local reference to the traces.
1782 for(j=0; j<lttv_traceset_number(traceset); j++)
1783 {
1784 LttvTrace * trace = lttv_traceset_get(traceset, j);
1785 lttv_trace_unref(trace);
1786 }
a43d67ba 1787
a43d67ba 1788
6ced96ef 1789 //update current tab
1790 //update_traceset(mw_data);
313bd6fc 1791 //if(nb_trace > 1){
6ced96ef 1792
313bd6fc 1793 SetTraceset(tab, (gpointer)traceset);
6ced96ef 1794 // in expose now call_pending_read_hooks(mw_data);
1795
1796 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
313bd6fc 1797 //}else{
1798 // if(tab){
1799 // while(tab->multi_vpaned->num_children){
1800 // gtk_multi_vpaned_widget_delete(tab->multi_vpaned);
1801 // }
1802 // }
1803 //}
6ced96ef 1804 }
1805 break;
2176f952 1806 }
1807 }
1808 }
1809
1810 g_free(name);
561eba2a 1811}
b052368a 1812#endif //0
abe346a3 1813
9878c8a4 1814/* Redraw all the viewers in the current tab */
1815void redraw(GtkWidget *widget, gpointer user_data)
1816{
1817 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1818 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1819 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1820 Tab *tab;
1821 if(!page) {
1822 return;
1823 } else {
1824 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1825 }
1826
1827 LttvHooks * tmp;
1828 LttvAttributeValue value;
1829
1830 g_assert(lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value));
1831
1832 tmp = (LttvHooks*)*(value.v_pointer);
c07e9b26 1833 if(tmp != NULL)
1834 lttv_hooks_call(tmp,NULL);
9878c8a4 1835}
1836
1837
1838void continue_processing(GtkWidget *widget, gpointer user_data)
1839{
1840 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1841 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1842 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1843 Tab *tab;
1844 if(!page) {
1845 return;
1846 } else {
1847 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1848 }
1849
1850 LttvHooks * tmp;
1851 LttvAttributeValue value;
1852
1853 g_assert(lttv_iattribute_find_by_path(tab->attributes,
1854 "hooks/continue", LTTV_POINTER, &value));
1855
1856 tmp = (LttvHooks*)*(value.v_pointer);
c07e9b26 1857 if(tmp != NULL)
1858 lttv_hooks_call(tmp,NULL);
9878c8a4 1859}
1860
1861/* Stop the processing for the calling main window's current tab.
1862 * It removes every processing requests that are in its list. It does not call
1863 * the end request hooks, because the request is not finished.
1864 */
1865
1866void stop_processing(GtkWidget *widget, gpointer user_data)
1867{
1868 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1869 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1870 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1871 Tab *tab;
1872 if(!page) {
1873 return;
1874 } else {
1875 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1876 }
a0577796 1877 GSList *iter = tab->events_requests;
9878c8a4 1878
1879 while(iter != NULL) {
1880 GSList *remove_iter = iter;
1881 iter = g_slist_next(iter);
1882
1883 g_free(remove_iter->data);
a0577796 1884 tab->events_requests =
1885 g_slist_remove_link(tab->events_requests, remove_iter);
9878c8a4 1886 }
a0577796 1887 tab->events_request_pending = FALSE;
1888 g_idle_remove_by_data(tab);
1889 g_assert(g_slist_length(tab->events_requests) == 0);
9878c8a4 1890}
1891
1892
abe346a3 1893/* save will save the traceset to a file
a43d67ba 1894 * Not implemented yet FIXME
abe346a3 1895 */
1896
561eba2a 1897void save(GtkWidget * widget, gpointer user_data)
1898{
1899 g_printf("Save\n");
1900}
1901
1902void save_as(GtkWidget * widget, gpointer user_data)
1903{
1904 g_printf("Save as\n");
1905}
1906
abe346a3 1907
1908/* zoom will change the time_window of all the viewers of the
1909 * current tab, and redisplay them. The main functionality is to
1910 * determine the new time_window of the current tab
1911 */
1912
1f1ae829 1913void zoom(GtkWidget * widget, double size)
1914{
b052368a 1915 TimeInterval time_span;
a43d67ba 1916 TimeWindow new_time_window;
1917 LttTime current_time, time_delta, time_s, time_e, time_tmp;
1f1ae829 1918 MainWindow * mw_data = get_window_data_struct(widget);
4266dc7f 1919 LttvTracesetContext *tsc;
6ced96ef 1920 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1921
1922 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1923 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1924 Tab *tab;
1925
1926 if(!page) {
1927 return;
1928 } else {
1929 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1930 }
1f1ae829 1931
fda16332 1932 if(size == 1) return;
1933
4266dc7f 1934 tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
b052368a 1935 time_span = tsc->time_span;
501e4e70 1936 new_time_window = tab->time_window;
1937 current_time = tab->current_time;
1f1ae829 1938
b052368a 1939 time_delta = ltt_time_sub(time_span.end_time,time_span.start_time);
1f1ae829 1940 if(size == 0){
b052368a 1941 new_time_window.start_time = time_span.start_time;
a43d67ba 1942 new_time_window.time_width = time_delta;
1f1ae829 1943 }else{
a43d67ba 1944 new_time_window.time_width = ltt_time_div(new_time_window.time_width, size);
1945 if(ltt_time_compare(new_time_window.time_width,time_delta) > 0)
1946 { /* Case where zoom out is bigger than trace length */
b052368a 1947 new_time_window.start_time = time_span.start_time;
a43d67ba 1948 new_time_window.time_width = time_delta;
a8c0f09d 1949 }
a43d67ba 1950 else
1951 {
1952 /* Center the image on the current time */
a43d67ba 1953 new_time_window.start_time =
1954 ltt_time_sub(current_time, ltt_time_div(new_time_window.time_width, 2.0));
1955 /* If on borders, don't fall off */
b052368a 1956 if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0)
a43d67ba 1957 {
b052368a 1958 new_time_window.start_time = time_span.start_time;
a43d67ba 1959 }
1960 else
1961 {
1962 if(ltt_time_compare(
1963 ltt_time_add(new_time_window.start_time, new_time_window.time_width),
b052368a 1964 time_span.end_time) > 0)
a43d67ba 1965 {
1966 new_time_window.start_time =
b052368a 1967 ltt_time_sub(time_span.end_time, new_time_window.time_width);
a43d67ba 1968 }
1969 }
1970
1f1ae829 1971 }
a43d67ba 1972
a43d67ba 1973 //time_tmp = ltt_time_div(new_time_window.time_width, 2);
1974 //if(ltt_time_compare(current_time, time_tmp) < 0){
1975 // time_s = time_span->startTime;
1976 //} else {
1977 // time_s = ltt_time_sub(current_time,time_tmp);
1978 //}
1979 //time_e = ltt_time_add(current_time,time_tmp);
1980 //if(ltt_time_compare(time_span->startTime, time_s) > 0){
1981 // time_s = time_span->startTime;
1982 //}else if(ltt_time_compare(time_span->endTime, time_e) < 0){
1983 // time_e = time_span->endTime;
1984 // time_s = ltt_time_sub(time_e,new_time_window.time_width);
1985 //}
1986 //new_time_window.start_time = time_s;
1f1ae829 1987 }
a43d67ba 1988
1989 //lttvwindow_report_time_window(mw_data, &new_time_window);
1990 //call_pending_read_hooks(mw_data);
1991
4266dc7f 1992 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
b052368a 1993 //set_time_window(tab, &new_time_window);
a43d67ba 1994 // in expose now call_pending_read_hooks(mw_data);
b052368a 1995 //gtk_multi_vpaned_set_adjust(tab->multi_vpaned, &new_time_window, FALSE);
1996 //
1997 //
1998
0c5dbe3b 1999 LttTime rel_time =
2000 ltt_time_sub(new_time_window.start_time, time_span.start_time);
b052368a 2001 if( ltt_time_to_double(new_time_window.time_width)
2002 * NANOSECONDS_PER_SECOND
2003 / SCROLL_STEP_PER_PAGE/* step increment */
2004 +
0c5dbe3b 2005 ltt_time_to_double(rel_time) * NANOSECONDS_PER_SECOND /* page size */
b052368a 2006 ==
0c5dbe3b 2007 ltt_time_to_double(rel_time) * NANOSECONDS_PER_SECOND /* page size */
b052368a 2008 ) {
2009 g_warning("Can not zoom that far due to scrollbar precision");
2010 } else if(
2011 ltt_time_compare(
2012 ltt_time_from_double(
2013 ltt_time_to_double(new_time_window.time_width)
2014 /SCROLL_STEP_PER_PAGE ),
2015 ltt_time_zero)
2016 == 0 ) {
2017 g_warning("Can not zoom that far due to time nanosecond precision");
2018 } else {
2019 /* Set scrollbar */
2020 GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
2021
2022 g_object_set(G_OBJECT(adjustment),
2023 //"value",
2024 //ltt_time_to_double(new_time_window.start_time)
2025 // * NANOSECONDS_PER_SECOND, /* value */
2026 "lower",
0c5dbe3b 2027 0.0, /* lower */
b052368a 2028 "upper",
b9a010a2 2029 ltt_time_to_double(
2030 ltt_time_sub(time_span.end_time, time_span.start_time))
b052368a 2031 * NANOSECONDS_PER_SECOND, /* upper */
2032 "step_increment",
2033 ltt_time_to_double(new_time_window.time_width)
2034 / SCROLL_STEP_PER_PAGE
2035 * NANOSECONDS_PER_SECOND, /* step increment */
2036 "page_increment",
2037 ltt_time_to_double(new_time_window.time_width)
2038 * NANOSECONDS_PER_SECOND, /* page increment */
2039 "page_size",
2040 ltt_time_to_double(new_time_window.time_width)
2041 * NANOSECONDS_PER_SECOND, /* page size */
2042 NULL);
2043 gtk_adjustment_changed(adjustment);
2044 //gtk_range_set_adjustment(GTK_RANGE(tab->scrollbar), adjustment);
2045 //gtk_adjustment_value_changed(adjustment);
2046 g_object_set(G_OBJECT(adjustment),
2047 "value",
b9a010a2 2048 ltt_time_to_double(
2049 ltt_time_sub(new_time_window.start_time, time_span.start_time))
b052368a 2050 * NANOSECONDS_PER_SECOND, /* value */
2051 NULL);
2052 gtk_adjustment_value_changed(adjustment);
2053
2054
2055 //g_object_set(G_OBJECT(adjustment),
2056 // "value",
2057 // ltt_time_to_double(time_window->start_time)
2058 // * NANOSECONDS_PER_SECOND, /* value */
2059 // NULL);
2060 /* Note : the set value will call set_time_window if scrollbar value changed
2061 */
2062 //gtk_adjustment_set_value(adjustment,
2063 // ltt_time_to_double(new_time_window.start_time)
2064 // * NANOSECONDS_PER_SECOND);
2065 }
1f1ae829 2066}
2067
561eba2a 2068void zoom_in(GtkWidget * widget, gpointer user_data)
2069{
1f1ae829 2070 zoom(widget, 2);
561eba2a 2071}
2072
2073void zoom_out(GtkWidget * widget, gpointer user_data)
2074{
1f1ae829 2075 zoom(widget, 0.5);
561eba2a 2076}
2077
2078void zoom_extended(GtkWidget * widget, gpointer user_data)
2079{
1f1ae829 2080 zoom(widget, 0);
561eba2a 2081}
2082
2083void go_to_time(GtkWidget * widget, gpointer user_data)
2084{
2085 g_printf("Go to time\n");
2086}
2087
2088void show_time_frame(GtkWidget * widget, gpointer user_data)
2089{
2090 g_printf("Show time frame\n");
2091}
2092
2093
2094/* callback function */
2095
2096void
2097on_empty_traceset_activate (GtkMenuItem *menuitem,
2098 gpointer user_data)
2099{
68b48a45 2100 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 2101}
2102
2103
2104void
2105on_clone_traceset_activate (GtkMenuItem *menuitem,
2106 gpointer user_data)
2107{
68b48a45 2108 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 2109}
2110
abe346a3 2111
2112/* create_new_tab calls create_tab to construct a new tab in the main window
2113 */
2114
6ced96ef 2115Tab *create_new_tab(GtkWidget* widget, gpointer user_data){
a1a2b649 2116 gchar label[PATH_MAX];
2901f314 2117 MainWindow * mw_data = get_window_data_struct(widget);
4266dc7f 2118
2901f314 2119 GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
561eba2a 2120 if(notebook == NULL){
2121 g_printf("Notebook does not exist\n");
6ced96ef 2122 return NULL;
2123 }
2124 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
2125 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
2126 Tab *copy_tab;
2127
2128 if(!page) {
2129 copy_tab = NULL;
2130 } else {
2131 copy_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
561eba2a 2132 }
4266dc7f 2133
6b1d3120 2134 strcpy(label,"Page");
eb38aea5 2135 if(get_label(mw_data, label,"Get the name of the tab","Please input tab's name"))
6ced96ef 2136 return (create_tab (mw_data, copy_tab, notebook, label));
561eba2a 2137}
2138
2901f314 2139void
2140on_tab_activate (GtkMenuItem *menuitem,
2141 gpointer user_data)
2142{
2143 create_new_tab((GtkWidget*)menuitem, user_data);
2144}
2145
561eba2a 2146
2147void
2148on_open_activate (GtkMenuItem *menuitem,
2149 gpointer user_data)
2150{
2151 open_traceset((GtkWidget*)menuitem, user_data);
2152}
2153
2154
2155void
2156on_close_activate (GtkMenuItem *menuitem,
2157 gpointer user_data)
2158{
bca3b81f 2159 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 2160 main_window_destructor(mw_data);
561eba2a 2161}
2162
2163
4266dc7f 2164/* remove the current tab from the main window
abe346a3 2165 */
2166
561eba2a 2167void
27a559b9 2168on_close_tab_activate (GtkWidget *widget,
561eba2a 2169 gpointer user_data)
2170{
4266dc7f 2171 gint page_num;
2061e03d 2172 GtkWidget * notebook;
4266dc7f 2173 GtkWidget * page;
27a559b9 2174 MainWindow * mw_data = get_window_data_struct(widget);
2175 notebook = lookup_widget(widget, "MNotebook");
2061e03d 2176 if(notebook == NULL){
2177 g_printf("Notebook does not exist\n");
2178 return;
2179 }
4266dc7f 2180
2181 page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
2061e03d 2182
4266dc7f 2183 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
2061e03d 2184
561eba2a 2185}
2186
27a559b9 2187void
2188on_close_tab_X_clicked (GtkWidget *widget,
2189 gpointer user_data)
2190{
2191 gint page_num;
2192 GtkWidget *notebook = lookup_widget(widget, "MNotebook");
2193 if(notebook == NULL){
2194 g_printf("Notebook does not exist\n");
2195 return;
2196 }
2197
2198 if((page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), widget)) != -1)
2199 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
2200
2201}
2202
561eba2a 2203
2204void
2205on_add_trace_activate (GtkMenuItem *menuitem,
2206 gpointer user_data)
2207{
2208 add_trace((GtkWidget*)menuitem, user_data);
2209}
2210
2211
2212void
2213on_remove_trace_activate (GtkMenuItem *menuitem,
2214 gpointer user_data)
2215{
2216 remove_trace((GtkWidget*)menuitem, user_data);
2217}
2218
2219
2220void
2221on_save_activate (GtkMenuItem *menuitem,
2222 gpointer user_data)
2223{
2224 save((GtkWidget*)menuitem, user_data);
2225}
2226
2227
2228void
2229on_save_as_activate (GtkMenuItem *menuitem,
2230 gpointer user_data)
2231{
2232 save_as((GtkWidget*)menuitem, user_data);
2233}
2234
2235
2236void
2237on_quit_activate (GtkMenuItem *menuitem,
2238 gpointer user_data)
2239{
2061e03d 2240 gtk_main_quit ();
561eba2a 2241}
2242
2243
2244void
2245on_cut_activate (GtkMenuItem *menuitem,
2246 gpointer user_data)
2247{
2248 g_printf("Cut\n");
2249}
2250
2251
2252void
2253on_copy_activate (GtkMenuItem *menuitem,
2254 gpointer user_data)
2255{
2256 g_printf("Copye\n");
2257}
2258
2259
2260void
2261on_paste_activate (GtkMenuItem *menuitem,
2262 gpointer user_data)
2263{
2264 g_printf("Paste\n");
2265}
2266
2267
2268void
2269on_delete_activate (GtkMenuItem *menuitem,
2270 gpointer user_data)
2271{
2272 g_printf("Delete\n");
2273}
2274
2275
2276void
2277on_zoom_in_activate (GtkMenuItem *menuitem,
2278 gpointer user_data)
2279{
2280 zoom_in((GtkWidget*)menuitem, user_data);
2281}
2282
2283
2284void
2285on_zoom_out_activate (GtkMenuItem *menuitem,
2286 gpointer user_data)
2287{
2288 zoom_out((GtkWidget*)menuitem, user_data);
2289}
2290
2291
2292void
2293on_zoom_extended_activate (GtkMenuItem *menuitem,
2294 gpointer user_data)
2295{
2296 zoom_extended((GtkWidget*)menuitem, user_data);
2297}
2298
2299
2300void
2301on_go_to_time_activate (GtkMenuItem *menuitem,
2302 gpointer user_data)
2303{
2304 go_to_time((GtkWidget*)menuitem, user_data);
2305}
2306
2307
2308void
2309on_show_time_frame_activate (GtkMenuItem *menuitem,
2310 gpointer user_data)
2311{
2312 show_time_frame((GtkWidget*)menuitem, user_data);
2313}
2314
2315
2316void
2317on_move_viewer_up_activate (GtkMenuItem *menuitem,
2318 gpointer user_data)
2319{
2320 move_up_viewer((GtkWidget*)menuitem, user_data);
2321}
2322
2323
2324void
2325on_move_viewer_down_activate (GtkMenuItem *menuitem,
2326 gpointer user_data)
2327{
2328 move_down_viewer((GtkWidget*)menuitem, user_data);
2329}
2330
2331
2332void
2333on_remove_viewer_activate (GtkMenuItem *menuitem,
2334 gpointer user_data)
2335{
2336 delete_viewer((GtkWidget*)menuitem, user_data);
2337}
2338
b052368a 2339#if 0
49bf71b5 2340void
2341on_trace_filter_activate (GtkMenuItem *menuitem,
2342 gpointer user_data)
2343{
2344 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2345 LttvTracesetSelector * s;
4266dc7f 2346 GtkWidget * w;
6ced96ef 2347 GtkWidget * notebook = lookup_widget(GTK_WIDGET(menuitem), "MNotebook");
2348
2349 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
2350 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
2351 Tab *tab;
2352
2353 if(!page) {
2354 return;
2355 } else {
2356 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
2357 }
4266dc7f 2358
b052368a 2359 w = gtk_multivpaned_get_widget(GTK_MULTIVPANED(tab->multivpaned));
49bf71b5 2360
2361 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
2362 if(!s){
2363 g_printf("There is no viewer yet\n");
2364 return;
2365 }
a8c0f09d 2366 if(get_filter_selection(s, "Configure trace and tracefile filter", "Select traces and tracefiles")){
a43d67ba 2367 //FIXME report filter change
2368 //update_traceset(mw_data);
2369 //call_pending_read_hooks(mw_data);
4266dc7f 2370 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
a8c0f09d 2371 }
49bf71b5 2372}
b052368a 2373#endif //0
49bf71b5 2374
2375void
2376on_trace_facility_activate (GtkMenuItem *menuitem,
2377 gpointer user_data)
2378{
2379 g_printf("Trace facility selector: %s\n");
2380}
561eba2a 2381
abe346a3 2382
b052368a 2383/* Dispaly a file selection dialogue to let user select a library, then call
2384 * lttv_library_load().
2385 */
2386
2387void
2388on_load_library_activate (GtkMenuItem *menuitem,
2389 gpointer user_data)
2390{
2391 GError *error = NULL;
2392 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2393
2394 gchar load_module_path_alter[PATH_MAX];
2395 {
2396 GPtrArray *name;
2397 guint nb,i;
2398 gchar *load_module_path;
2399 name = g_ptr_array_new();
2400 nb = lttv_library_path_number();
2401 /* ask for the library path */
2402
2403 for(i=0;i<nb;i++){
2404 gchar *path;
2405 path = lttv_library_path_get(i);
2406 g_ptr_array_add(name, path);
2407 }
2408
2409 load_module_path = get_selection((char **)(name->pdata), name->len,
2410 "Select a library path", "Library paths");
2411 if(load_module_path != NULL)
2412 strncpy(load_module_path_alter, load_module_path, PATH_MAX-1); // -1 for /
2413
2414 g_ptr_array_free(name, TRUE);
2415
2416 if(load_module_path == NULL) return;
2417 }
2418
2419 {
2420 /* Make sure the module path ends with a / */
2421 gchar *ptr = load_module_path_alter;
2422
2423 ptr = strchr(ptr, '\0');
2424
2425 if(*(ptr-1) != '/') {
2426 *ptr = '/';
2427 *(ptr+1) = '\0';
2428 }
2429 }
2430
2431 {
2432 /* Ask for the library to load : list files in the previously selected
2433 * directory */
2434 gchar str[PATH_MAX];
2435 gchar ** dir;
2436 gint id;
2437 GtkFileSelection * file_selector =
2438 (GtkFileSelection *)gtk_file_selection_new("Select a module");
2439 gtk_file_selection_set_filename(file_selector, load_module_path_alter);
2440 gtk_file_selection_hide_fileop_buttons(file_selector);
2441
2442 str[0] = '\0';
2443 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2444 switch(id){
2445 case GTK_RESPONSE_ACCEPT:
2446 case GTK_RESPONSE_OK:
2447 dir = gtk_file_selection_get_selections (file_selector);
2448 strncpy(str,dir[0],PATH_MAX);
2449 strncpy(remember_plugins_dir,dir[0],PATH_MAX);
2450 /* only keep file name */
2451 gchar *str1;
2452 str1 = strrchr(str,'/');
2453 if(str1)str1++;
2454 else{
2455 str1 = strrchr(str,'\\');
2456 str1++;
2457 }
2458#if 0
2459 /* remove "lib" */
2460 if(*str1 == 'l' && *(str1+1)== 'i' && *(str1+2)=='b')
2461 str1=str1+3;
2462 remove info after . */
2463 {
2464 gchar *str2 = str1;
2465
2466 str2 = strrchr(str2, '.');
2467 if(str2 != NULL) *str2 = '\0';
2468 }
2469 lttv_module_require(str1, &error);
2470#endif //0
2471 lttv_library_load(str1, &error);
2472 if(error != NULL) g_warning(error->message);
2473 else g_printf("Load library: %s\n", str);
2474 g_strfreev(dir);
2475 case GTK_RESPONSE_REJECT:
2476 case GTK_RESPONSE_CANCEL:
2477 default:
2478 gtk_widget_destroy((GtkWidget*)file_selector);
2479 break;
2480 }
2481
2482 }
2483
2484
2485
2486}
2487
2488
2489/* Display all loaded modules, let user to select a module to unload
2490 * by calling lttv_module_unload
2491 */
2492
2493void
2494on_unload_library_activate (GtkMenuItem *menuitem,
2495 gpointer user_data)
2496{
2497 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2498
2499 LttvLibrary *library;
2500 {
2501 GPtrArray *name;
2502 guint nb,i;
2503 gchar *lib_name;
2504 name = g_ptr_array_new();
2505 nb = lttv_library_number();
2506 LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
2507 /* ask for the library name */
2508
2509 for(i=0;i<nb;i++){
2510 LttvLibrary *iter_lib = lttv_library_get(i);
2511 lttv_library_info(iter_lib, &lib_info[i]);
2512
2513 gchar *path = lib_info[i].name;
2514 g_ptr_array_add(name, lib_info[i].name);
2515 }
2516 lib_name = get_selection((char **)(name->pdata), name->len,
2517 "Select a library", "Libraries");
2518 if(lib_name != NULL) {
2519 for(i=0;i<nb;i++){
2520 if(strcmp(lib_name, lib_info[i].name) == 0) {
2521 library = lttv_library_get(i);
2522 break;
2523 }
2524 }
2525 }
2526 g_ptr_array_free(name, TRUE);
2527 g_free(lib_info);
2528
2529 if(lib_name == NULL) return;
2530 }
2531
2532 lttv_library_unload(library);
2533}
2534
2535
abe346a3 2536/* Dispaly a file selection dialogue to let user select a module, then call
b052368a 2537 * lttv_module_require().
abe346a3 2538 */
2539
561eba2a 2540void
2541on_load_module_activate (GtkMenuItem *menuitem,
2542 gpointer user_data)
2543{
b052368a 2544 GError *error = NULL;
bca3b81f 2545 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
b052368a 2546
2547 LttvLibrary *library;
2548 {
2549 GPtrArray *name;
2550 guint nb,i;
2551 gchar *lib_name;
2552 name = g_ptr_array_new();
2553 nb = lttv_library_number();
2554 LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
2555 /* ask for the library name */
2556
2557 for(i=0;i<nb;i++){
2558 LttvLibrary *iter_lib = lttv_library_get(i);
2559 lttv_library_info(iter_lib, &lib_info[i]);
2560
2561 gchar *path = lib_info[i].name;
2562 g_ptr_array_add(name, path);
2563 }
2564 lib_name = get_selection((char **)(name->pdata), name->len,
2565 "Select a library", "Libraries");
2566 if(lib_name != NULL) {
2567 for(i=0;i<nb;i++){
2568 if(strcmp(lib_name, lib_info[i].name) == 0) {
2569 library = lttv_library_get(i);
2570 break;
2571 }
3872a20e 2572 }
b052368a 2573 }
2574 g_ptr_array_free(name, TRUE);
2575 g_free(lib_info);
2576
2577 if(lib_name == NULL) return;
36b3c068 2578 }
b052368a 2579
2580 //LttvModule *module;
2581 gchar module_name_out[PATH_MAX];
2582 {
2583 /* Ask for the module to load : list modules in the selected lib */
2584 GPtrArray *name;
2585 guint nb,i;
2586 gchar *module_name;
2587 LttvModuleInfo *module_info = g_new(LttvModuleInfo,nb);
2588 name = g_ptr_array_new();
2589 nb = lttv_library_module_number(library);
2590 /* ask for the module name */
2591
2592 for(i=0;i<nb;i++){
2593 LttvModule *iter_module = lttv_library_module_get(library, i);
2594 lttv_module_info(iter_module, &module_info[i]);
2595
2596 gchar *path = module_info[i].name;
2597 g_ptr_array_add(name, path);
2598 }
2599 module_name = get_selection((char **)(name->pdata), name->len,
2600 "Select a module", "Modules");
2601 if(module_name != NULL) {
2602 for(i=0;i<nb;i++){
2603 if(strcmp(module_name, module_info[i].name) == 0) {
2604 strncpy(module_name_out, module_name, PATH_MAX);
2605 //module = lttv_library_module_get(i);
2606 break;
2607 }
2608 }
2609 }
2610
2611 g_ptr_array_free(name, TRUE);
2612 g_free(module_info);
2613
2614 if(module_name == NULL) return;
2615 }
2616
2617 lttv_module_require(module_name_out, &error);
2618 if(error != NULL) g_warning(error->message);
2619 else g_printf("Load module: %s\n", module_name_out);
2620
2621
2622#if 0
2623 {
2624
2625
2626 gchar str[PATH_MAX];
2627 gchar ** dir;
2628 gint id;
2629 GtkFileSelection * file_selector =
2630 (GtkFileSelection *)gtk_file_selection_new("Select a module");
2631 gtk_file_selection_set_filename(file_selector, load_module_path_alter);
2632 gtk_file_selection_hide_fileop_buttons(file_selector);
2633
2634 str[0] = '\0';
2635 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2636 switch(id){
2637 case GTK_RESPONSE_ACCEPT:
2638 case GTK_RESPONSE_OK:
2639 dir = gtk_file_selection_get_selections (file_selector);
2640 strncpy(str,dir[0],PATH_MAX);
2641 strncpy(remember_plugins_dir,dir[0],PATH_MAX);
2642 {
2643 /* only keep file name */
2644 gchar *str1;
2645 str1 = strrchr(str,'/');
2646 if(str1)str1++;
2647 else{
2648 str1 = strrchr(str,'\\');
2649 str1++;
2650 }
2651#if 0
2652 /* remove "lib" */
2653 if(*str1 == 'l' && *(str1+1)== 'i' && *(str1+2)=='b')
2654 str1=str1+3;
2655 remove info after . */
2656 {
2657 gchar *str2 = str1;
2658
2659 str2 = strrchr(str2, '.');
2660 if(str2 != NULL) *str2 = '\0';
2661 }
2662 lttv_module_require(str1, &error);
2663#endif //0
2664 lttv_library_load(str1, &error);
2665 if(error != NULL) g_warning(error->message);
2666 else g_printf("Load library: %s\n", str);
2667 g_strfreev(dir);
2668 case GTK_RESPONSE_REJECT:
2669 case GTK_RESPONSE_CANCEL:
2670 default:
2671 gtk_widget_destroy((GtkWidget*)file_selector);
2672 break;
2673 }
2674
2675 }
2676#endif //0
2677
2678
561eba2a 2679}
2680
2681
b052368a 2682
abe346a3 2683/* Display all loaded modules, let user to select a module to unload
2684 * by calling lttv_module_unload
2685 */
2686
561eba2a 2687void
2688on_unload_module_activate (GtkMenuItem *menuitem,
2689 gpointer user_data)
2690{
b052368a 2691 GError *error = NULL;
bca3b81f 2692 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
08b1c66e 2693
b052368a 2694 LttvLibrary *library;
2695 {
2696 GPtrArray *name;
2697 guint nb,i;
2698 gchar *lib_name;
2699 name = g_ptr_array_new();
2700 nb = lttv_library_number();
2701 LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
2702 /* ask for the library name */
36b3c068 2703
36b3c068 2704 for(i=0;i<nb;i++){
b052368a 2705 LttvLibrary *iter_lib = lttv_library_get(i);
2706 lttv_library_info(iter_lib, &lib_info[i]);
2707
2708 gchar *path = lib_info[i].name;
2709 g_ptr_array_add(name, path);
2710 }
2711 lib_name = get_selection((char **)(name->pdata), name->len,
2712 "Select a library", "Libraries");
2713 if(lib_name != NULL) {
2714 for(i=0;i<nb;i++){
2715 if(strcmp(lib_name, lib_info[i].name) == 0) {
2716 library = lttv_library_get(i);
2717 break;
2718 }
36b3c068 2719 }
b052368a 2720 }
2721 g_ptr_array_free(name, TRUE);
2722 g_free(lib_info);
2723
2724 if(lib_name == NULL) return;
36b3c068 2725 }
2726
b052368a 2727 LttvModule *module;
2728 {
2729 /* Ask for the module to load : list modules in the selected lib */
2730 GPtrArray *name;
2731 guint nb,i;
2732 gchar *module_name;
6d677a86 2733 nb = lttv_library_module_number(library);
b052368a 2734 LttvModuleInfo *module_info = g_new(LttvModuleInfo,nb);
2735 name = g_ptr_array_new();
b052368a 2736 /* ask for the module name */
2737
2738 for(i=0;i<nb;i++){
2739 LttvModule *iter_module = lttv_library_module_get(library, i);
2740 lttv_module_info(iter_module, &module_info[i]);
2741
2742 gchar *path = module_info[i].name;
2743 if(module_info[i].use_count > 0) g_ptr_array_add(name, path);
2744 }
2745 module_name = get_selection((char **)(name->pdata), name->len,
2746 "Select a module", "Modules");
2747 if(module_name != NULL) {
2748 for(i=0;i<nb;i++){
2749 if(strcmp(module_name, module_info[i].name) == 0) {
2750 module = lttv_library_module_get(library, i);
2751 break;
2752 }
2753 }
2754 }
2755
2756 g_ptr_array_free(name, TRUE);
2757 g_free(module_info);
2758
2759 if(module_name == NULL) return;
2760 }
2761
b052368a 2762 LttvModuleInfo module_info;
2763 lttv_module_info(module, &module_info);
2764 g_printf("Release module: %s\n", module_info.name);
fce9a2fc 2765
2766 lttv_module_release(module);
561eba2a 2767}
2768
2769
b052368a 2770/* Display a directory dialogue to let user select a path for library searching
abe346a3 2771 */
2772
561eba2a 2773void
b052368a 2774on_add_library_search_path_activate (GtkMenuItem *menuitem,
561eba2a 2775 gpointer user_data)
2776{
b052368a 2777 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select library path");
67b98724 2778 const char * dir;
fc188b78 2779 gint id;
2780
bca3b81f 2781 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
3658a338 2782 if(remember_plugins_dir[0] != '\0')
2783 gtk_dir_selection_set_filename(file_selector, remember_plugins_dir);
fc188b78 2784
68b48a45 2785 id = gtk_dialog_run(GTK_DIALOG(file_selector));
fc188b78 2786 switch(id){
2787 case GTK_RESPONSE_ACCEPT:
2788 case GTK_RESPONSE_OK:
68b48a45 2789 dir = gtk_dir_selection_get_dir (file_selector);
a1a2b649 2790 strncpy(remember_plugins_dir,dir,PATH_MAX);
2791 strncat(remember_plugins_dir,"/",PATH_MAX);
08b1c66e 2792 lttv_library_path_add(dir);
fc188b78 2793 case GTK_RESPONSE_REJECT:
2794 case GTK_RESPONSE_CANCEL:
2795 default:
68b48a45 2796 gtk_widget_destroy((GtkWidget*)file_selector);
fc188b78 2797 break;
6b1d3120 2798 }
561eba2a 2799}
2800
2801
b052368a 2802/* Display a directory dialogue to let user select a path for library searching
2803 */
2804
2805void
2806on_remove_library_search_path_activate (GtkMenuItem *menuitem,
2807 gpointer user_data)
2808{
2809 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2810
2811 const char *lib_path;
2812 {
2813 GPtrArray *name;
2814 guint nb,i;
2815 gchar *lib_name;
2816 name = g_ptr_array_new();
2817 nb = lttv_library_path_number();
2818 /* ask for the library name */
2819
2820 for(i=0;i<nb;i++){
2821 gchar *path = lttv_library_path_get(i);
2822 g_ptr_array_add(name, path);
2823 }
2824 lib_path = get_selection((char **)(name->pdata), name->len,
2825 "Select a library path", "Library paths");
2826
2827 g_ptr_array_free(name, TRUE);
2828
2829 if(lib_path == NULL) return;
2830 }
2831
2832 lttv_library_path_remove(lib_path);
2833}
2834
561eba2a 2835void
2836on_color_activate (GtkMenuItem *menuitem,
2837 gpointer user_data)
2838{
2839 g_printf("Color\n");
2840}
2841
2842
2843void
2844on_filter_activate (GtkMenuItem *menuitem,
2845 gpointer user_data)
2846{
2847 g_printf("Filter\n");
2848}
2849
2850
2851void
2852on_save_configuration_activate (GtkMenuItem *menuitem,
2853 gpointer user_data)
2854{
2855 g_printf("Save configuration\n");
2856}
2857
2858
2859void
2860on_content_activate (GtkMenuItem *menuitem,
2861 gpointer user_data)
2862{
2863 g_printf("Content\n");
2864}
2865
2866
2867void
2868on_about_activate (GtkMenuItem *menuitem,
2869 gpointer user_data)
2870{
2871 g_printf("About...\n");
2872}
2873
2874
2875void
2876on_button_new_clicked (GtkButton *button,
2877 gpointer user_data)
2878{
6f7ad7ae 2879 create_new_window((GtkWidget*)button, user_data, TRUE);
561eba2a 2880}
2881
2901f314 2882void
2883on_button_new_tab_clicked (GtkButton *button,
2884 gpointer user_data)
2885{
2886 create_new_tab((GtkWidget*)button, user_data);
2887}
561eba2a 2888
2889void
2890on_button_open_clicked (GtkButton *button,
2891 gpointer user_data)
2892{
2893 open_traceset((GtkWidget*)button, user_data);
2894}
2895
2896
2897void
2898on_button_add_trace_clicked (GtkButton *button,
2899 gpointer user_data)
2900{
2901 add_trace((GtkWidget*)button, user_data);
2902}
2903
2904
2905void
2906on_button_remove_trace_clicked (GtkButton *button,
2907 gpointer user_data)
2908{
2909 remove_trace((GtkWidget*)button, user_data);
2910}
2911
9878c8a4 2912void
2913on_button_redraw_clicked (GtkButton *button,
2914 gpointer user_data)
2915{
2916 redraw((GtkWidget*)button, user_data);
2917}
2918
2919void
2920on_button_continue_processing_clicked (GtkButton *button,
2921 gpointer user_data)
2922{
2923 continue_processing((GtkWidget*)button, user_data);
2924}
2925
2926void
2927on_button_stop_processing_clicked (GtkButton *button,
2928 gpointer user_data)
2929{
2930 stop_processing((GtkWidget*)button, user_data);
2931}
2932
2933
561eba2a 2934
2935void
2936on_button_save_clicked (GtkButton *button,
2937 gpointer user_data)
2938{
2939 save((GtkWidget*)button, user_data);
2940}
2941
2942
2943void
2944on_button_save_as_clicked (GtkButton *button,
2945 gpointer user_data)
2946{
2947 save_as((GtkWidget*)button, user_data);
2948}
2949
2950
2951void
2952on_button_zoom_in_clicked (GtkButton *button,
2953 gpointer user_data)
2954{
2955 zoom_in((GtkWidget*)button, user_data);
2956}
2957
2958
2959void
2960on_button_zoom_out_clicked (GtkButton *button,
2961 gpointer user_data)
2962{
2963 zoom_out((GtkWidget*)button, user_data);
2964}
2965
2966
2967void
2968on_button_zoom_extended_clicked (GtkButton *button,
2969 gpointer user_data)
2970{
2971 zoom_extended((GtkWidget*)button, user_data);
2972}
2973
2974
2975void
2976on_button_go_to_time_clicked (GtkButton *button,
2977 gpointer user_data)
2978{
2979 go_to_time((GtkWidget*)button, user_data);
2980}
2981
2982
2983void
2984on_button_show_time_frame_clicked (GtkButton *button,
2985 gpointer user_data)
2986{
2987 show_time_frame((GtkWidget*)button, user_data);
2988}
2989
2990
2991void
2992on_button_move_up_clicked (GtkButton *button,
2993 gpointer user_data)
2994{
2995 move_up_viewer((GtkWidget*)button, user_data);
2996}
2997
2998
2999void
3000on_button_move_down_clicked (GtkButton *button,
3001 gpointer user_data)
3002{
3003 move_down_viewer((GtkWidget*)button, user_data);
3004}
3005
3006
3007void
3008on_button_delete_viewer_clicked (GtkButton *button,
3009 gpointer user_data)
3010{
3011 delete_viewer((GtkWidget*)button, user_data);
3012}
3013
3014void
2d262115 3015on_MWindow_destroy (GtkWidget *widget,
561eba2a 3016 gpointer user_data)
3017{
2d262115 3018 MainWindow *main_window = get_window_data_struct(widget);
ef68c3ac 3019 LttvIAttribute *attributes = main_window->attributes;
3020 LttvAttributeValue value;
e4d09234 3021
ef68c3ac 3022 //This is unnecessary, since widgets will be destroyed
3023 //by the main window widget anyway.
3024 //remove_all_menu_toolbar_constructors(main_window, NULL);
3025
3026 g_assert(lttv_iattribute_find_by_path(attributes,
3027 "viewers/menu", LTTV_POINTER, &value));
3028 lttv_menus_destroy((LttvMenus*)*(value.v_pointer));
3029
501e4e70 3030 g_assert(lttv_iattribute_find_by_path(attributes,
ef68c3ac 3031 "viewers/toolbar", LTTV_POINTER, &value));
3032 lttv_toolbars_destroy((LttvToolbars*)*(value.v_pointer));
2d262115 3033
ef68c3ac 3034 g_object_unref(main_window->attributes);
3035 g_main_window_list = g_slist_remove(g_main_window_list, main_window);
561eba2a 3036
ef68c3ac 3037 g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
2d262115 3038 if(g_slist_length(g_main_window_list) == 0)
7a859036 3039 gtk_main_quit ();
561eba2a 3040}
3041
58eecf4a 3042gboolean
3043on_MWindow_configure (GtkWidget *widget,
3044 GdkEventConfigure *event,
3045 gpointer user_data)
3046{
3047 MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
3048 float width = event->width;
58eecf4a 3049 TimeWindow time_win;
3050 double ratio;
3051 TimeInterval *time_span;
3052 LttTime time;
bd24a9af 3053
3054 // MD : removed time width modification upon resizing of the main window.
3055 // The viewers will redraw themselves completely, without time interval
3056 // modification.
3057/* while(tab){
58eecf4a 3058 if(mw_data->window_width){
3059 time_span = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->Time_Span ;
3060 time_win = tab->time_window;
3061 ratio = width / mw_data->window_width;
3062 tab->time_window.time_width = ltt_time_mul(time_win.time_width,ratio);
3063 time = ltt_time_sub(time_span->endTime, time_win.start_time);
3064 if(ltt_time_compare(time, tab->time_window.time_width) < 0){
3065 tab->time_window.time_width = time;
3066 }
3067 }
3068 tab = tab->next;
3069 }
3070
3071 mw_data->window_width = (int)width;
bd24a9af 3072 */
58eecf4a 3073 return FALSE;
3074}
561eba2a 3075
abe346a3 3076/* Set current tab
3077 */
3078
561eba2a 3079void
3080on_MNotebook_switch_page (GtkNotebook *notebook,
3081 GtkNotebookPage *page,
3082 guint page_num,
3083 gpointer user_data)
3084{
47cd8a09 3085
561eba2a 3086}
3087
abe346a3 3088
b052368a 3089void scroll_value_changed_cb(GtkWidget *scrollbar,
3090 gpointer user_data)
3091{
3092 Tab *tab = (Tab *)user_data;
3093 TimeWindow time_window;
b052368a 3094 LttTime time;
3095 GtkAdjustment *adjust = gtk_range_get_adjustment(GTK_RANGE(scrollbar));
3096 gdouble value = gtk_adjustment_get_value(adjust);
3097 gdouble upper, lower, ratio, page_size;
3098 LttvTracesetContext * tsc =
3099 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
b9a010a2 3100 TimeInterval time_span = tsc->time_span;
b052368a 3101
3102 //time_window = tab->time_window;
3103
b052368a 3104 lower = adjust->lower;
3105 upper = adjust->upper;
3106 ratio = (value - lower) / (upper - lower);
2b5cc5a5 3107 g_info("lower %lu, upper %lu, value %lu, ratio %lu", lower, upper, value, ratio);
b052368a 3108
3109 //time = ltt_time_sub(time_span->end_time, time_span->start_time);
3110 //time = ltt_time_mul(time, (float)ratio);
3111 //time = ltt_time_add(time_span->start_time, time);
b9a010a2 3112 time = ltt_time_add(ltt_time_from_double(value/NANOSECONDS_PER_SECOND),
3113 time_span.start_time);
b052368a 3114
3115 time_window.start_time = time;
3116
3117 page_size = adjust->page_size;
3118
3119 time_window.time_width =
3120 ltt_time_from_double(page_size/NANOSECONDS_PER_SECOND);
b9a010a2 3121 //time = ltt_time_sub(time_span.end_time, time);
b052368a 3122 //if(ltt_time_compare(time,time_window.time_width) < 0){
3123 // time_window.time_width = time;
3124 //}
3125
3126 /* call viewer hooks for new time window */
3127 set_time_window(tab, &time_window);
3128
3129}
3130
3131
abe346a3 3132/* callback function to check or uncheck the check box (filter)
3133 */
3134
49bf71b5 3135void checkbox_changed(GtkTreeView *treeview,
3136 GtkTreePath *arg1,
3137 GtkTreeViewColumn *arg2,
3138 gpointer user_data)
3139{
3140 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
3141 GtkTreeIter iter;
3142 gboolean value;
3143
3144 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
3145 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
3146 value = value? FALSE : TRUE;
3147 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
3148 }
3149
3150}
3151
abe346a3 3152
3153/* According to user's selection, update selector(filter)
3154 */
3155
49bf71b5 3156void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
3157{
ed3b99b6 3158 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
3159 int i, j, k, nb_eventtype;
49bf71b5 3160 LttvTraceSelector * trace;
3161 LttvTracefileSelector * tracefile;
ed3b99b6 3162 LttvEventtypeSelector * eventtype;
3163 gboolean value, value1, value2;
49bf71b5 3164
3165 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
3166 i = 0;
3167 do{
ed3b99b6 3168 trace = lttv_traceset_selector_trace_get(s, i);
3169 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
49bf71b5 3170 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
3171 if(value){
3172 j = 0;
3173 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
3174 do{
ed3b99b6 3175 if(j<1){//eventtype selector for trace
3176 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value2,-1);
3177 if(value2){
3178 k=0;
3179 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter1, &child_iter)){
3180 do{
3181 eventtype = lttv_trace_selector_eventtype_get(trace,k);
3182 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
3183 lttv_eventtype_selector_set_selected(eventtype,value2);
3184 k++;
3185 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter1));
3186 }
3187 }
3188 }else{ //tracefile selector
3189 tracefile = lttv_trace_selector_tracefile_get(trace, j - 1);
3190 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
3191 lttv_tracefile_selector_set_selected(tracefile,value1);
3192 if(value1){
3193 gtk_tree_model_iter_children((GtkTreeModel*)store, &child_iter1, &child_iter); //eventtype selector
3194 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
3195 if(value2){
3196 k = 0;
3197 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter2, &child_iter1)){
3198 do{//eventtype selector for tracefile
3199 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
3200 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter2, CHECKBOX_COLUMN, &value2,-1);
3201 lttv_eventtype_selector_set_selected(eventtype,value2);
3202 k++;
3203 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter2));
3204 }
3205 }
3206 }
3207 }
49bf71b5 3208 j++;
3209 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
3210 }
3211 }
3212 lttv_trace_selector_set_selected(trace,value);
3213 i++;
3214 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
3215 }
3216}
3217
abe346a3 3218
3219/* Display a dialogue showing all eventtypes and traces, let user to select the interested
3220 * eventtypes, tracefiles and traces (filter)
3221 */
3222
a8c0f09d 3223gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
49bf71b5 3224{
3225 GtkWidget * dialogue;
3226 GtkTreeStore * store;
3227 GtkWidget * tree;
3228 GtkWidget * scroll_win;
3229 GtkCellRenderer * renderer;
3230 GtkTreeViewColumn * column;
ed3b99b6 3231 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
3232 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
49bf71b5 3233 LttvTraceSelector * trace;
3234 LttvTracefileSelector * tracefile;
ed3b99b6 3235 LttvEventtypeSelector * eventtype;
49bf71b5 3236 char * name;
3237 gboolean checked;
3238
3239 dialogue = gtk_dialog_new_with_buttons(title,
3240 NULL,
3241 GTK_DIALOG_MODAL,
3242 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
3243 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
3244 NULL);
ed3b99b6 3245 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
49bf71b5 3246
3247 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
3248 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
3249 g_object_unref (G_OBJECT (store));
3250 g_signal_connect (G_OBJECT (tree), "row-activated",
3251 G_CALLBACK (checkbox_changed),
3252 NULL);
3253
3254
3255 renderer = gtk_cell_renderer_toggle_new ();
3256 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
3257
3258 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
3259
3260 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
3261 renderer,
3262 "active", CHECKBOX_COLUMN,
3263 NULL);
3264 gtk_tree_view_column_set_alignment (column, 0.5);
3265 gtk_tree_view_column_set_fixed_width (column, 20);
3266 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3267
3268 renderer = gtk_cell_renderer_text_new ();
3269 column = gtk_tree_view_column_new_with_attributes (column_title,
3270 renderer,
3271 "text", NAME_COLUMN,
3272 NULL);
3273 gtk_tree_view_column_set_alignment (column, 0.0);
3274 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3275 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
3276
3277 scroll_win = gtk_scrolled_window_new (NULL, NULL);
3278 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
3279 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
3280 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
3281
3282 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
3283
3284 gtk_widget_show(scroll_win);
3285 gtk_widget_show(tree);
3286
ed3b99b6 3287 nb_trace = lttv_traceset_selector_trace_number(s);
49bf71b5 3288 for(i=0;i<nb_trace;i++){
ed3b99b6 3289 trace = lttv_traceset_selector_trace_get(s, i);
49bf71b5 3290 name = lttv_trace_selector_get_name(trace);
3291 gtk_tree_store_append (store, &iter, NULL);
3292 checked = lttv_trace_selector_get_selected(trace);
3293 gtk_tree_store_set (store, &iter,
3294 CHECKBOX_COLUMN,checked,
3295 NAME_COLUMN,name,
3296 -1);
ed3b99b6 3297
3298 gtk_tree_store_append (store, &child_iter, &iter);
3299 gtk_tree_store_set (store, &child_iter,
3300 CHECKBOX_COLUMN, checked,
3301 NAME_COLUMN,"eventtype",
3302 -1);
3303
3304 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
3305 for(j=0;j<nb_eventtype;j++){
3306 eventtype = lttv_trace_selector_eventtype_get(trace,j);
3307 name = lttv_eventtype_selector_get_name(eventtype);
3308 checked = lttv_eventtype_selector_get_selected(eventtype);
3309 gtk_tree_store_append (store, &child_iter1, &child_iter);
3310 gtk_tree_store_set (store, &child_iter1,
3311 CHECKBOX_COLUMN, checked,
3312 NAME_COLUMN,name,
3313 -1);
3314 }
3315
3316 nb_tracefile = lttv_trace_selector_tracefile_number(trace);
49bf71b5 3317 for(j=0;j<nb_tracefile;j++){
ed3b99b6 3318 tracefile = lttv_trace_selector_tracefile_get(trace, j);
49bf71b5 3319 name = lttv_tracefile_selector_get_name(tracefile);
3320 gtk_tree_store_append (store, &child_iter, &iter);
3321 checked = lttv_tracefile_selector_get_selected(tracefile);
3322 gtk_tree_store_set (store, &child_iter,
3323 CHECKBOX_COLUMN, checked,
3324 NAME_COLUMN,name,
3325 -1);
ed3b99b6 3326
3327 gtk_tree_store_append (store, &child_iter1, &child_iter);
3328 gtk_tree_store_set (store, &child_iter1,
3329 CHECKBOX_COLUMN, checked,
3330 NAME_COLUMN,"eventtype",
3331 -1);
3332
3333 for(k=0;k<nb_eventtype;k++){
3334 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
3335 name = lttv_eventtype_selector_get_name(eventtype);
3336 checked = lttv_eventtype_selector_get_selected(eventtype);
3337 gtk_tree_store_append (store, &child_iter2, &child_iter1);
3338 gtk_tree_store_set (store, &child_iter2,
3339 CHECKBOX_COLUMN, checked,
3340 NAME_COLUMN,name,
3341 -1);
3342 }
49bf71b5 3343 }
3344 }
3345
3346 id = gtk_dialog_run(GTK_DIALOG(dialogue));
3347 switch(id){
3348 case GTK_RESPONSE_ACCEPT:
3349 case GTK_RESPONSE_OK:
3350 update_filter(s, store);
a8c0f09d 3351 gtk_widget_destroy(dialogue);
3352 return TRUE;
49bf71b5 3353 case GTK_RESPONSE_REJECT:
3354 case GTK_RESPONSE_CANCEL:
3355 default:
3356 gtk_widget_destroy(dialogue);
3357 break;
3358 }
a8c0f09d 3359 return FALSE;
49bf71b5 3360}
3361
abe346a3 3362
3363/* Select a trace which will be removed from traceset
3364 */
3365
2176f952 3366char * get_remove_trace(char ** all_trace_name, int nb_trace)
3367{
3368 return get_selection(all_trace_name, nb_trace,
3369 "Select a trace", "Trace pathname");
3370}
abe346a3 3371
3372
b052368a 3373/* Select a module which will be loaded
3374 */
3375
3376char * get_load_module(char ** load_module_name, int nb_module)
3377{
3378 return get_selection(load_module_name, nb_module,
3379 "Select a module to load", "Module name");
3380}
3381
3382
3383
3384
abe346a3 3385/* Select a module which will be unloaded
3386 */
3387
36b3c068 3388char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 3389{
3390 return get_selection(loaded_module_name, nb_module,
b052368a 3391 "Select a module to unload", "Module name");
2176f952 3392}
3393
abe346a3 3394
3395/* Display a dialogue which shows all selectable items, let user to
3396 * select one of them
3397 */
3398
2176f952 3399char * get_selection(char ** loaded_module_name, int nb_module,
3400 char *title, char * column_title)
36b3c068 3401{
3402 GtkWidget * dialogue;
3403 GtkWidget * scroll_win;
3404 GtkWidget * tree;
3405 GtkListStore * store;
3406 GtkTreeViewColumn * column;
3407 GtkCellRenderer * renderer;
3408 GtkTreeSelection * select;
3409 GtkTreeIter iter;
3410 gint id, i;
3411 char * unload_module_name = NULL;
3412
2176f952 3413 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 3414 NULL,
3415 GTK_DIALOG_MODAL,
3416 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
3417 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
3418 NULL);
3419 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
3420
3421 scroll_win = gtk_scrolled_window_new (NULL, NULL);
3422 gtk_widget_show ( scroll_win);
3423 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
3424 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3425
3426 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
3427 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
3428 gtk_widget_show ( tree);
3429 g_object_unref (G_OBJECT (store));
3430
3431 renderer = gtk_cell_renderer_text_new ();
2176f952 3432 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 3433 renderer,
3434 "text", MODULE_COLUMN,
3435 NULL);
3436 gtk_tree_view_column_set_alignment (column, 0.5);
3437 gtk_tree_view_column_set_fixed_width (column, 150);
3438 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3439
3440 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
3441 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
3442
3443 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
3444
3445 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
3446
3447 for(i=0;i<nb_module;i++){
3448 gtk_list_store_append (store, &iter);
3449 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
3450 }
3451
3452 id = gtk_dialog_run(GTK_DIALOG(dialogue));
3453 switch(id){
3454 case GTK_RESPONSE_ACCEPT:
3455 case GTK_RESPONSE_OK:
3456 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
3457 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
3458 }
3459 case GTK_RESPONSE_REJECT:
3460 case GTK_RESPONSE_CANCEL:
3461 default:
3462 gtk_widget_destroy(dialogue);
3463 break;
3464 }
3465
3466 return unload_module_name;
3467}
5723fa24 3468
abe346a3 3469
ef68c3ac 3470/* Insert all menu entry and tool buttons into this main window
001d8606 3471 * for modules.
3472 *
abe346a3 3473 */
3474
6c9d86dd 3475void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
5723fa24 3476{
3477 int i;
3478 GdkPixbuf *pixbuf;
42fcbb71 3479 lttvwindow_viewer_constructor constructor;
001d8606 3480 LttvMenus * global_menu, * instance_menu;
3481 LttvToolbars * global_toolbar, * instance_toolbar;
6c9d86dd 3482 LttvMenuClosure *menu_item;
3483 LttvToolbarClosure *toolbar_item;
5723fa24 3484 LttvAttributeValue value;
001d8606 3485 LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
501e4e70 3486 LttvIAttribute *attributes = mw->attributes;
001d8606 3487 GtkWidget * tool_menu_title_menu, *new_widget, *pixmap;
3488
3489 g_assert(lttv_iattribute_find_by_path(global_attributes,
3490 "viewers/menu", LTTV_POINTER, &value));
3491 if(*(value.v_pointer) == NULL)
501e4e70 3492 *(value.v_pointer) = lttv_menus_new();
001d8606 3493 global_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 3494
3495 g_assert(lttv_iattribute_find_by_path(attributes,
3496 "viewers/menu", LTTV_POINTER, &value));
001d8606 3497 if(*(value.v_pointer) == NULL)
501e4e70 3498 *(value.v_pointer) = lttv_menus_new();
001d8606 3499 instance_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 3500
001d8606 3501
3502
3503 g_assert(lttv_iattribute_find_by_path(global_attributes,
3504 "viewers/toolbar", LTTV_POINTER, &value));
3505 if(*(value.v_pointer) == NULL)
501e4e70 3506 *(value.v_pointer) = lttv_toolbars_new();
001d8606 3507 global_toolbar = (LttvToolbars*)*(value.v_pointer);
3508
3509 g_assert(lttv_iattribute_find_by_path(attributes,
3510 "viewers/toolbar", LTTV_POINTER, &value));
3511 if(*(value.v_pointer) == NULL)
501e4e70 3512 *(value.v_pointer) = lttv_toolbars_new();
001d8606 3513 instance_toolbar = (LttvToolbars*)*(value.v_pointer);
3514
3515 /* Add missing menu entries to window instance */
3516 for(i=0;i<global_menu->len;i++) {
6c9d86dd 3517 menu_item = &g_array_index(global_menu, LttvMenuClosure, i);
3518
3519 //add menu_item to window instance;
3520 constructor = menu_item->con;
3521 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
3522 new_widget =
501e4e70 3523 gtk_menu_item_new_with_mnemonic (menu_item->menu_text);
6c9d86dd 3524 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu),
3525 new_widget);
3526 g_signal_connect ((gpointer) new_widget, "activate",
3527 G_CALLBACK (insert_viewer_wrap),
3528 constructor);
3529 gtk_widget_show (new_widget);
3530 lttv_menus_add(instance_menu, menu_item->con,
3531 menu_item->menu_path,
3532 menu_item->menu_text,
3533 new_widget);
001d8606 3534
001d8606 3535 }
3536
3537 /* Add missing toolbar entries to window instance */
3538 for(i=0;i<global_toolbar->len;i++) {
6c9d86dd 3539 toolbar_item = &g_array_index(global_toolbar, LttvToolbarClosure, i);
3540
3541 //add toolbar_item to window instance;
3542 constructor = toolbar_item->con;
3543 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1");
3544 pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)toolbar_item->pixmap);
3545 pixmap = gtk_image_new_from_pixbuf(pixbuf);
3546 new_widget =
3547 gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
3548 GTK_TOOLBAR_CHILD_BUTTON,
3549 NULL,
3550 "",
3551 toolbar_item->tooltip, NULL,
3552 pixmap, NULL, NULL);
3553 gtk_label_set_use_underline(
3554 GTK_LABEL (((GtkToolbarChild*) (
3555 g_list_last (GTK_TOOLBAR
3556 (tool_menu_title_menu)->children)->data))->label),
3557 TRUE);
3558 gtk_container_set_border_width (GTK_CONTAINER (new_widget), 1);
3559 g_signal_connect ((gpointer) new_widget,
3560 "clicked",
3561 G_CALLBACK (insert_viewer_wrap),
3562 constructor);
3563 gtk_widget_show (new_widget);
001d8606 3564
6c9d86dd 3565 lttv_toolbars_add(instance_toolbar, toolbar_item->con,
3566 toolbar_item->tooltip,
3567 toolbar_item->pixmap,
3568 new_widget);
001d8606 3569
5723fa24 3570 }
6c9d86dd 3571
5723fa24 3572}
3573
abe346a3 3574
3575/* Create a main window
3576 */
3577
08b1c66e 3578void construct_main_window(MainWindow * parent)
5723fa24 3579{
2a2fa4f0 3580 g_debug("construct_main_window()");
68b48a45 3581 GtkWidget * new_window; /* New generated main window */
bca3b81f 3582 MainWindow * new_m_window;/* New main window structure */
5723fa24 3583 GtkNotebook * notebook;
f7afe191 3584 LttvIAttribute *attributes =
3585 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
3586 LttvAttributeValue value;
6ced96ef 3587 Tab *new_tab;
2061e03d 3588
bca3b81f 3589 new_m_window = g_new(MainWindow, 1);
5723fa24 3590
3591 // Add the object's information to the module's array
68b48a45 3592 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 3593
f7afe191 3594
68b48a45 3595 new_window = create_MWindow();
3596 gtk_widget_show (new_window);
5723fa24 3597
bca3b81f 3598 new_m_window->mwindow = new_window;
a43d67ba 3599 new_m_window->attributes = attributes;
5723fa24 3600
001d8606 3601 g_assert(lttv_iattribute_find_by_path(attributes,
3602 "viewers/menu", LTTV_POINTER, &value));
501e4e70 3603 *(value.v_pointer) = lttv_menus_new();
001d8606 3604
501e4e70 3605 g_assert(lttv_iattribute_find_by_path(attributes,
001d8606 3606 "viewers/toolbar", LTTV_POINTER, &value));
501e4e70 3607 *(value.v_pointer) = lttv_toolbars_new();
2061e03d 3608
6c9d86dd 3609 add_all_menu_toolbar_constructors(new_m_window, NULL);
5723fa24 3610
2d262115 3611 g_object_set_data_full(G_OBJECT(new_window),
3612 "main_window_data",
3613 (gpointer)new_m_window,
3614 (GDestroyNotify)g_free);
5723fa24 3615 //create a default tab
bca3b81f 3616 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 3617 if(notebook == NULL){
3618 g_printf("Notebook does not exist\n");
3619 return;
3620 }
27a559b9 3621 gtk_notebook_popup_enable (GTK_NOTEBOOK(notebook));
5723fa24 3622 //for now there is no name field in LttvTraceset structure
3623 //Use "Traceset" as the label for the default tab
6ced96ef 3624 if(parent) {
3625 GtkWidget * parent_notebook = lookup_widget(parent->mwindow, "MNotebook");
3626 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(parent_notebook),
3627 gtk_notebook_get_current_page(GTK_NOTEBOOK(parent_notebook)));
3628 Tab *parent_tab;
3629
3630 if(!page) {
3631 parent_tab = NULL;
3632 } else {
3633 parent_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
3634 }
3635 new_tab = create_tab(new_m_window, parent_tab, notebook, "Traceset");
3636 } else {
3637 new_tab = create_tab(new_m_window, NULL, notebook, "Traceset");
91fd6881 3638 /* First window, use command line trace */
4266dc7f 3639 if(g_init_trace != NULL){
6ced96ef 3640 lttvwindow_add_trace(new_tab,
4266dc7f 3641 g_init_trace);
91fd6881 3642
3643 LttvTraceset *traceset = new_tab->traceset_info->traceset;
3644 SetTraceset(new_tab, traceset);
4266dc7f 3645 }
3646 }
5723fa24 3647
ef68c3ac 3648 g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
5723fa24 3649}
3650
abe346a3 3651
3652/* Free the memory occupied by a tab structure
3653 * destroy the tab
3654 */
3655
bca3b81f 3656void tab_destructor(Tab * tab_instance)
f7afe191 3657{
716e4367 3658 int i, nb, ref_count;
3659 LttvTrace * trace;
3660
bca3b81f 3661 if(tab_instance->attributes)
501e4e70 3662 g_object_unref(tab_instance->attributes);
3663
3664 if(tab_instance->interrupted_state)
3665 g_object_unref(tab_instance->interrupted_state);
3666
2061e03d 3667
716e4367 3668 if(tab_instance->traceset_info->traceset_context != NULL){
784705cc 3669 //remove state update hooks
3670 lttv_state_remove_event_hooks(
3671 (LttvTracesetState*)tab_instance->traceset_info->
3672 traceset_context);
716e4367 3673 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
3674 traceset_context));
3675 g_object_unref(tab_instance->traceset_info->traceset_context);
3676 }
3677 if(tab_instance->traceset_info->traceset != NULL) {
3678 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
3679 for(i = 0 ; i < nb ; i++) {
3680 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
3681 ref_count = lttv_trace_get_ref_number(trace);
49bf71b5 3682 if(ref_count <= 1){
a1a2b649 3683 ltt_trace_close(lttv_trace(trace));
49bf71b5 3684 }
716e4367 3685 }
3686 }
a43d67ba 3687 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
501e4e70 3688 /* Remove the idle events requests processing function of the tab */
3689 g_idle_remove_by_data(tab_instance);
3690
3691 g_slist_free(tab_instance->events_requests);
716e4367 3692 g_free(tab_instance->traceset_info);
68b48a45 3693 g_free(tab_instance);
f7afe191 3694}
3695
abe346a3 3696
3697/* Create a tab and insert it into the current main window
3698 */
3699
6ced96ef 3700Tab* create_tab(MainWindow * mw, Tab *copy_tab,
716e4367 3701 GtkNotebook * notebook, char * label)
5723fa24 3702{
3703 GList * list;
6ced96ef 3704 Tab * tab;
68b48a45 3705 LttTime tmp_time;
a43d67ba 3706
abe346a3 3707 //create a new tab data structure
6ced96ef 3708 tab = g_new(Tab,1);
716e4367 3709
abe346a3 3710 //construct and initialize the traceset_info
6ced96ef 3711 tab->traceset_info = g_new(TracesetInfo,1);
a43d67ba 3712
4266dc7f 3713 if(copy_tab) {
6ced96ef 3714 tab->traceset_info->traceset =
4266dc7f 3715 lttv_traceset_copy(copy_tab->traceset_info->traceset);
3716 } else {
6ced96ef 3717 tab->traceset_info->traceset = lttv_traceset_new();
716e4367 3718 }
20fde85f 3719
84ddf5c9 3720#ifdef DEBUG
20fde85f 3721 lttv_attribute_write_xml(
6ced96ef 3722 lttv_traceset_attribute(tab->traceset_info->traceset),
20fde85f 3723 stdout,
3724 0, 4);
3725 fflush(stdout);
84ddf5c9 3726#endif //DEBUG
20fde85f 3727
3728
716e4367 3729 //FIXME copy not implemented in lower level
6ced96ef 3730 tab->traceset_info->traceset_context =
716e4367 3731 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
6ced96ef 3732 g_assert(tab->traceset_info->traceset_context != NULL);
716e4367 3733 lttv_context_init(
6ced96ef 3734 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context),
3735 tab->traceset_info->traceset);
784705cc 3736 //add state update hooks
3737 lttv_state_add_event_hooks(
6ced96ef 3738 (LttvTracesetState*)tab->traceset_info->traceset_context);
784705cc 3739
abe346a3 3740 //determine the current_time and time_window of the tab
6ced96ef 3741 if(copy_tab != NULL){
3742 tab->time_window = copy_tab->time_window;
3743 tab->current_time = copy_tab->current_time;
5723fa24 3744 }else{
6ced96ef 3745 tab->time_window.start_time =
3746 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3747 time_span.start_time;
f7afe191 3748 if(DEFAULT_TIME_WIDTH_S <
6ced96ef 3749 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3750 time_span.end_time.tv_sec)
68b48a45 3751 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 3752 else
68b48a45 3753 tmp_time.tv_sec =
6ced96ef 3754 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3755 time_span.end_time.tv_sec;
68b48a45 3756 tmp_time.tv_nsec = 0;
6ced96ef 3757 tab->time_window.time_width = tmp_time ;
3758 tab->current_time.tv_sec =
3759 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3760 time_span.start_time.tv_sec;
3761 tab->current_time.tv_nsec =
3762 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3763 time_span.start_time.tv_nsec;
5723fa24 3764 }
6ced96ef 3765 tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
3766 tab->interrupted_state = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
b052368a 3767
58f6c2a4 3768 tab->vbox = gtk_vbox_new(FALSE, 2);
3769 tab->viewer_container = gtk_vbox_new(TRUE, 2);
b052368a 3770 tab->scrollbar = gtk_hscrollbar_new(NULL);
3771 //tab->multivpaned = gtk_multi_vpaned_new();
3772
3773 gtk_box_pack_start(GTK_BOX(tab->vbox),
3774 tab->viewer_container,
3775 TRUE, /* expand */
3776 TRUE, /* Give the extra space to the child */
3777 0); /* No padding */
3778
3779 gtk_box_pack_end(GTK_BOX(tab->vbox),
3780 tab->scrollbar,
3781 FALSE, /* Do not expand */
3782 FALSE, /* Fill has no effect here (expand false) */
3783 0); /* No padding */
3784
3785 g_object_set_data(G_OBJECT(tab->viewer_container), "focused_viewer", NULL);
3786
3787
6ced96ef 3788 tab->mw = mw;
27a559b9 3789
3c031040 3790 /*{
3791 // Display a label with a X
27a559b9 3792 GtkWidget *w_hbox = gtk_hbox_new(FALSE, 4);
3793 GtkWidget *w_label = gtk_label_new (label);
3794 GtkWidget *pixmap = create_pixmap(GTK_WIDGET(notebook), "close.png");
3795 GtkWidget *w_button = gtk_button_new ();
3796 gtk_container_add(GTK_CONTAINER(w_button), pixmap);
3797 //GtkWidget *w_button = gtk_button_new_with_label("x");
3798
3799 gtk_button_set_relief(GTK_BUTTON(w_button), GTK_RELIEF_NONE);
3800
3801 gtk_box_pack_start(GTK_BOX(w_hbox), w_label, TRUE, TRUE, 0);
3802 gtk_box_pack_end(GTK_BOX(w_hbox), w_button, FALSE,
3803 FALSE, 0);
a43d67ba 3804
27a559b9 3805 g_signal_connect_swapped (w_button, "clicked",
3806 G_CALLBACK (on_close_tab_X_clicked),
3807 tab->multi_vpaned);
5723fa24 3808
3c031040 3809 gtk_widget_set_state(w_button, GTK_STATE_ACTIVE);
3810
27a559b9 3811 gtk_widget_show (w_label);
3812 gtk_widget_show (pixmap);
3813 gtk_widget_show (w_button);
3814 gtk_widget_show (w_hbox);
3815
3816 tab->label = w_hbox;
3c031040 3817 }*/
3818
3819
3820 tab->label = gtk_label_new (label);
b052368a 3821
3822 gtk_widget_show(tab->label);
3823 gtk_widget_show(tab->scrollbar);
3824 gtk_widget_show(tab->viewer_container);
3825 gtk_widget_show(tab->vbox);
3826 //gtk_widget_show(tab->multivpaned);
3c031040 3827
3828
501e4e70 3829 /* Start with empty events requests list */
6ced96ef 3830 tab->events_requests = NULL;
3831 tab->events_request_pending = FALSE;
a43d67ba 3832
f7afe191 3833 g_object_set_data_full(
b052368a 3834 G_OBJECT(tab->vbox),
f7afe191 3835 "Tab_Info",
6ced96ef 3836 tab,
3837 (GDestroyNotify)tab_destructor);
540edb40 3838
b052368a 3839 g_signal_connect(G_OBJECT(tab->scrollbar), "value-changed",
3840 G_CALLBACK(scroll_value_changed_cb), tab);
3841 //g_signal_connect(G_OBJECT(tab->scrollbar), "changed",
3842 // G_CALLBACK(scroll_value_changed_cb), tab);
3843
3844
784705cc 3845 //insert tab into notebook
6ced96ef 3846 gtk_notebook_append_page(notebook,
b052368a 3847 tab->vbox,
3848 tab->label);
5723fa24 3849 list = gtk_container_get_children(GTK_CONTAINER(notebook));
3850 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
a43d67ba 3851 // always show : not if(g_list_length(list)>1)
3852 gtk_notebook_set_show_tabs(notebook, TRUE);
3853
6ced96ef 3854 return tab;
a43d67ba 3855}
3856
501e4e70 3857/*
3858 * execute_events_requests
3859 *
3860 * Idle function that executes the pending requests for a tab.
3861 *
3862 * @return return value : TRUE : keep the idle function, FALSE : remove it.
3863 */
3864gboolean execute_events_requests(Tab *tab)
a43d67ba 3865{
501e4e70 3866 return ( lttvwindow_process_pending_requests(tab) );
a43d67ba 3867}
3868
This page took 0.227437 seconds and 4 git commands to generate.