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