whole new time bar, plus some additions to control flow viewer.. this is work in...
[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
3480 tab->current_time = new_current_time;
3481
3482 /* current seconds */
3483 gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry5),
3484 (double)time_span.start_time.tv_sec,
3485 (double)time_span.end_time.tv_sec);
3486
3487 /* start nanoseconds */
3488 if(new_current_time.tv_sec == time_span.start_time.tv_sec) {
3489 gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
3490 (double)time_span.start_time.tv_nsec,
3491 (double)NANOSECONDS_PER_SECOND-1);
3492 }
3493 else if(new_current_time.tv_sec == time_span.end_time.tv_sec) {
3494 /* If we are at the end, max nsec to end.. */
3495 gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
3496 0.0,
3497 (double)time_span.end_time.tv_nsec);
3498 }
3499 else /* anywhere else */
3500 gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
3501 0.0,
3502 (double)NANOSECONDS_PER_SECOND-1);
3503 gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry6),
3504 (double)new_current_time.tv_nsec);
3505
3506 lttvwindow_report_current_time(tab, tab->current_time);
3507
3508 tab->current_time_manager_lock = FALSE;
3509}
3510
3511void
3512on_MEntry5_value_changed (GtkSpinButton *spinbutton,
3513 gpointer user_data)
3514{
3515 Tab *tab = (Tab*)user_data;
3516 LttvTracesetContext * tsc =
3517 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
3518 TimeInterval time_span = tsc->time_span;
3519 gint value = gtk_spin_button_get_value_as_int(spinbutton);
3520 LttTime new_current_time = tab->current_time;
3521 new_current_time.tv_sec = value;
3522
3523 /* current nanoseconds */
3524 if(new_current_time.tv_sec == time_span.start_time.tv_sec) {
3525 if(new_current_time.tv_nsec < time_span.start_time.tv_nsec)
3526 new_current_time.tv_nsec = time_span.start_time.tv_nsec;
3527 }
3528 else if(new_current_time.tv_sec == time_span.end_time.tv_sec) {
3529 if(new_current_time.tv_nsec > time_span.end_time.tv_nsec)
3530 new_current_time.tv_nsec = time_span.end_time.tv_nsec;
3531 }
3532
3533 current_time_change_manager(tab, new_current_time);
3534}
3535
3536void
3537on_MEntry6_value_changed (GtkSpinButton *spinbutton,
3538 gpointer user_data)
3539{
3540 Tab *tab = (Tab*)user_data;
3541 gint value = gtk_spin_button_get_value_as_int(spinbutton);
3542 LttTime new_current_time = tab->current_time;
3543 new_current_time.tv_nsec = value;
3544
3545 current_time_change_manager(tab, new_current_time);
3546}
3547
3548
b052368a 3549void scroll_value_changed_cb(GtkWidget *scrollbar,
3550 gpointer user_data)
3551{
3552 Tab *tab = (Tab *)user_data;
e800cf84 3553 TimeWindow new_time_window;
b052368a 3554 LttTime time;
3555 GtkAdjustment *adjust = gtk_range_get_adjustment(GTK_RANGE(scrollbar));
3556 gdouble value = gtk_adjustment_get_value(adjust);
e800cf84 3557 // gdouble upper, lower, ratio, page_size;
3558 gdouble page_size;
b052368a 3559 LttvTracesetContext * tsc =
3560 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
b9a010a2 3561 TimeInterval time_span = tsc->time_span;
b052368a 3562
e800cf84 3563 time = ltt_time_add(ltt_time_from_double(value/NANOSECONDS_PER_SECOND),
3564 time_span.start_time);
3565
3566 new_time_window.start_time = time;
3567
3568 page_size = adjust->page_size;
3569
3570 new_time_window.time_width =
3571 ltt_time_from_double(page_size/NANOSECONDS_PER_SECOND);
3572
3573
3574 time_change_manager(tab, new_time_window);
3575#if 0
b052368a 3576 //time_window = tab->time_window;
3577
b052368a 3578 lower = adjust->lower;
3579 upper = adjust->upper;
3580 ratio = (value - lower) / (upper - lower);
2b5cc5a5 3581 g_info("lower %lu, upper %lu, value %lu, ratio %lu", lower, upper, value, ratio);
b052368a 3582
3583 //time = ltt_time_sub(time_span->end_time, time_span->start_time);
3584 //time = ltt_time_mul(time, (float)ratio);
3585 //time = ltt_time_add(time_span->start_time, time);
b9a010a2 3586 time = ltt_time_add(ltt_time_from_double(value/NANOSECONDS_PER_SECOND),
3587 time_span.start_time);
b052368a 3588
3589 time_window.start_time = time;
3590
3591 page_size = adjust->page_size;
3592
3593 time_window.time_width =
3594 ltt_time_from_double(page_size/NANOSECONDS_PER_SECOND);
b9a010a2 3595 //time = ltt_time_sub(time_span.end_time, time);
b052368a 3596 //if(ltt_time_compare(time,time_window.time_width) < 0){
3597 // time_window.time_width = time;
3598 //}
3599
3600 /* call viewer hooks for new time window */
3601 set_time_window(tab, &time_window);
e800cf84 3602#endif //0
b052368a 3603}
3604
3605
abe346a3 3606/* callback function to check or uncheck the check box (filter)
3607 */
3608
49bf71b5 3609void checkbox_changed(GtkTreeView *treeview,
3610 GtkTreePath *arg1,
3611 GtkTreeViewColumn *arg2,
3612 gpointer user_data)
3613{
3614 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
3615 GtkTreeIter iter;
3616 gboolean value;
3617
3618 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
3619 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
3620 value = value? FALSE : TRUE;
3621 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
3622 }
3623
3624}
3625
abe346a3 3626
3627/* According to user's selection, update selector(filter)
3628 */
3629
49bf71b5 3630void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
3631{
ed3b99b6 3632 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
3633 int i, j, k, nb_eventtype;
49bf71b5 3634 LttvTraceSelector * trace;
3635 LttvTracefileSelector * tracefile;
ed3b99b6 3636 LttvEventtypeSelector * eventtype;
3637 gboolean value, value1, value2;
49bf71b5 3638
3639 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
3640 i = 0;
3641 do{
ed3b99b6 3642 trace = lttv_traceset_selector_trace_get(s, i);
3643 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
49bf71b5 3644 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
3645 if(value){
3646 j = 0;
3647 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
3648 do{
ed3b99b6 3649 if(j<1){//eventtype selector for trace
3650 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value2,-1);
3651 if(value2){
3652 k=0;
3653 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter1, &child_iter)){
3654 do{
3655 eventtype = lttv_trace_selector_eventtype_get(trace,k);
3656 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
3657 lttv_eventtype_selector_set_selected(eventtype,value2);
3658 k++;
3659 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter1));
3660 }
3661 }
3662 }else{ //tracefile selector
3663 tracefile = lttv_trace_selector_tracefile_get(trace, j - 1);
3664 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
3665 lttv_tracefile_selector_set_selected(tracefile,value1);
3666 if(value1){
3667 gtk_tree_model_iter_children((GtkTreeModel*)store, &child_iter1, &child_iter); //eventtype selector
3668 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
3669 if(value2){
3670 k = 0;
3671 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter2, &child_iter1)){
3672 do{//eventtype selector for tracefile
3673 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
3674 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter2, CHECKBOX_COLUMN, &value2,-1);
3675 lttv_eventtype_selector_set_selected(eventtype,value2);
3676 k++;
3677 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter2));
3678 }
3679 }
3680 }
3681 }
49bf71b5 3682 j++;
3683 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
3684 }
3685 }
3686 lttv_trace_selector_set_selected(trace,value);
3687 i++;
3688 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
3689 }
3690}
3691
abe346a3 3692
3693/* Display a dialogue showing all eventtypes and traces, let user to select the interested
3694 * eventtypes, tracefiles and traces (filter)
3695 */
3696
a8c0f09d 3697gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
49bf71b5 3698{
3699 GtkWidget * dialogue;
3700 GtkTreeStore * store;
3701 GtkWidget * tree;
3702 GtkWidget * scroll_win;
3703 GtkCellRenderer * renderer;
3704 GtkTreeViewColumn * column;
ed3b99b6 3705 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
3706 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
49bf71b5 3707 LttvTraceSelector * trace;
3708 LttvTracefileSelector * tracefile;
ed3b99b6 3709 LttvEventtypeSelector * eventtype;
49bf71b5 3710 char * name;
3711 gboolean checked;
3712
3713 dialogue = gtk_dialog_new_with_buttons(title,
3714 NULL,
3715 GTK_DIALOG_MODAL,
3716 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
3717 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
3718 NULL);
ed3b99b6 3719 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
49bf71b5 3720
3721 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
3722 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
3723 g_object_unref (G_OBJECT (store));
3724 g_signal_connect (G_OBJECT (tree), "row-activated",
3725 G_CALLBACK (checkbox_changed),
3726 NULL);
3727
3728
3729 renderer = gtk_cell_renderer_toggle_new ();
3730 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
3731
3732 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
3733
3734 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
3735 renderer,
3736 "active", CHECKBOX_COLUMN,
3737 NULL);
3738 gtk_tree_view_column_set_alignment (column, 0.5);
3739 gtk_tree_view_column_set_fixed_width (column, 20);
3740 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3741
3742 renderer = gtk_cell_renderer_text_new ();
3743 column = gtk_tree_view_column_new_with_attributes (column_title,
3744 renderer,
3745 "text", NAME_COLUMN,
3746 NULL);
3747 gtk_tree_view_column_set_alignment (column, 0.0);
3748 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3749 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
3750
3751 scroll_win = gtk_scrolled_window_new (NULL, NULL);
3752 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
3753 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
3754 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
3755
3756 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
3757
3758 gtk_widget_show(scroll_win);
3759 gtk_widget_show(tree);
3760
ed3b99b6 3761 nb_trace = lttv_traceset_selector_trace_number(s);
49bf71b5 3762 for(i=0;i<nb_trace;i++){
ed3b99b6 3763 trace = lttv_traceset_selector_trace_get(s, i);
49bf71b5 3764 name = lttv_trace_selector_get_name(trace);
3765 gtk_tree_store_append (store, &iter, NULL);
3766 checked = lttv_trace_selector_get_selected(trace);
3767 gtk_tree_store_set (store, &iter,
3768 CHECKBOX_COLUMN,checked,
3769 NAME_COLUMN,name,
3770 -1);
ed3b99b6 3771
3772 gtk_tree_store_append (store, &child_iter, &iter);
3773 gtk_tree_store_set (store, &child_iter,
3774 CHECKBOX_COLUMN, checked,
3775 NAME_COLUMN,"eventtype",
3776 -1);
3777
3778 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
3779 for(j=0;j<nb_eventtype;j++){
3780 eventtype = lttv_trace_selector_eventtype_get(trace,j);
3781 name = lttv_eventtype_selector_get_name(eventtype);
3782 checked = lttv_eventtype_selector_get_selected(eventtype);
3783 gtk_tree_store_append (store, &child_iter1, &child_iter);
3784 gtk_tree_store_set (store, &child_iter1,
3785 CHECKBOX_COLUMN, checked,
3786 NAME_COLUMN,name,
3787 -1);
3788 }
3789
3790 nb_tracefile = lttv_trace_selector_tracefile_number(trace);
49bf71b5 3791 for(j=0;j<nb_tracefile;j++){
ed3b99b6 3792 tracefile = lttv_trace_selector_tracefile_get(trace, j);
49bf71b5 3793 name = lttv_tracefile_selector_get_name(tracefile);
3794 gtk_tree_store_append (store, &child_iter, &iter);
3795 checked = lttv_tracefile_selector_get_selected(tracefile);
3796 gtk_tree_store_set (store, &child_iter,
3797 CHECKBOX_COLUMN, checked,
3798 NAME_COLUMN,name,
3799 -1);
ed3b99b6 3800
3801 gtk_tree_store_append (store, &child_iter1, &child_iter);
3802 gtk_tree_store_set (store, &child_iter1,
3803 CHECKBOX_COLUMN, checked,
3804 NAME_COLUMN,"eventtype",
3805 -1);
3806
3807 for(k=0;k<nb_eventtype;k++){
3808 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
3809 name = lttv_eventtype_selector_get_name(eventtype);
3810 checked = lttv_eventtype_selector_get_selected(eventtype);
3811 gtk_tree_store_append (store, &child_iter2, &child_iter1);
3812 gtk_tree_store_set (store, &child_iter2,
3813 CHECKBOX_COLUMN, checked,
3814 NAME_COLUMN,name,
3815 -1);
3816 }
49bf71b5 3817 }
3818 }
3819
3820 id = gtk_dialog_run(GTK_DIALOG(dialogue));
3821 switch(id){
3822 case GTK_RESPONSE_ACCEPT:
3823 case GTK_RESPONSE_OK:
3824 update_filter(s, store);
a8c0f09d 3825 gtk_widget_destroy(dialogue);
3826 return TRUE;
49bf71b5 3827 case GTK_RESPONSE_REJECT:
3828 case GTK_RESPONSE_CANCEL:
3829 default:
3830 gtk_widget_destroy(dialogue);
3831 break;
3832 }
a8c0f09d 3833 return FALSE;
49bf71b5 3834}
3835
abe346a3 3836
3837/* Select a trace which will be removed from traceset
3838 */
3839
2176f952 3840char * get_remove_trace(char ** all_trace_name, int nb_trace)
3841{
3842 return get_selection(all_trace_name, nb_trace,
3843 "Select a trace", "Trace pathname");
3844}
abe346a3 3845
3846
b052368a 3847/* Select a module which will be loaded
3848 */
3849
3850char * get_load_module(char ** load_module_name, int nb_module)
3851{
3852 return get_selection(load_module_name, nb_module,
3853 "Select a module to load", "Module name");
3854}
3855
3856
3857
3858
abe346a3 3859/* Select a module which will be unloaded
3860 */
3861
36b3c068 3862char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 3863{
3864 return get_selection(loaded_module_name, nb_module,
b052368a 3865 "Select a module to unload", "Module name");
2176f952 3866}
3867
abe346a3 3868
3869/* Display a dialogue which shows all selectable items, let user to
3870 * select one of them
3871 */
3872
2176f952 3873char * get_selection(char ** loaded_module_name, int nb_module,
3874 char *title, char * column_title)
36b3c068 3875{
3876 GtkWidget * dialogue;
3877 GtkWidget * scroll_win;
3878 GtkWidget * tree;
3879 GtkListStore * store;
3880 GtkTreeViewColumn * column;
3881 GtkCellRenderer * renderer;
3882 GtkTreeSelection * select;
3883 GtkTreeIter iter;
3884 gint id, i;
3885 char * unload_module_name = NULL;
3886
2176f952 3887 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 3888 NULL,
3889 GTK_DIALOG_MODAL,
3890 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
3891 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
3892 NULL);
3893 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
3894
3895 scroll_win = gtk_scrolled_window_new (NULL, NULL);
3896 gtk_widget_show ( scroll_win);
3897 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
3898 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3899
3900 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
3901 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
3902 gtk_widget_show ( tree);
3903 g_object_unref (G_OBJECT (store));
3904
3905 renderer = gtk_cell_renderer_text_new ();
2176f952 3906 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 3907 renderer,
3908 "text", MODULE_COLUMN,
3909 NULL);
3910 gtk_tree_view_column_set_alignment (column, 0.5);
3911 gtk_tree_view_column_set_fixed_width (column, 150);
3912 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3913
3914 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
3915 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
3916
3917 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
3918
3919 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
3920
3921 for(i=0;i<nb_module;i++){
3922 gtk_list_store_append (store, &iter);
3923 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
3924 }
3925
3926 id = gtk_dialog_run(GTK_DIALOG(dialogue));
3927 switch(id){
3928 case GTK_RESPONSE_ACCEPT:
3929 case GTK_RESPONSE_OK:
3930 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
3931 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
3932 }
3933 case GTK_RESPONSE_REJECT:
3934 case GTK_RESPONSE_CANCEL:
3935 default:
3936 gtk_widget_destroy(dialogue);
3937 break;
3938 }
3939
3940 return unload_module_name;
3941}
5723fa24 3942
abe346a3 3943
ef68c3ac 3944/* Insert all menu entry and tool buttons into this main window
001d8606 3945 * for modules.
3946 *
abe346a3 3947 */
3948
6c9d86dd 3949void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
5723fa24 3950{
3951 int i;
3952 GdkPixbuf *pixbuf;
42fcbb71 3953 lttvwindow_viewer_constructor constructor;
001d8606 3954 LttvMenus * global_menu, * instance_menu;
3955 LttvToolbars * global_toolbar, * instance_toolbar;
6c9d86dd 3956 LttvMenuClosure *menu_item;
3957 LttvToolbarClosure *toolbar_item;
5723fa24 3958 LttvAttributeValue value;
001d8606 3959 LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
501e4e70 3960 LttvIAttribute *attributes = mw->attributes;
001d8606 3961 GtkWidget * tool_menu_title_menu, *new_widget, *pixmap;
3962
3963 g_assert(lttv_iattribute_find_by_path(global_attributes,
3964 "viewers/menu", LTTV_POINTER, &value));
3965 if(*(value.v_pointer) == NULL)
501e4e70 3966 *(value.v_pointer) = lttv_menus_new();
001d8606 3967 global_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 3968
3969 g_assert(lttv_iattribute_find_by_path(attributes,
3970 "viewers/menu", LTTV_POINTER, &value));
001d8606 3971 if(*(value.v_pointer) == NULL)
501e4e70 3972 *(value.v_pointer) = lttv_menus_new();
001d8606 3973 instance_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 3974
001d8606 3975
3976
3977 g_assert(lttv_iattribute_find_by_path(global_attributes,
3978 "viewers/toolbar", LTTV_POINTER, &value));
3979 if(*(value.v_pointer) == NULL)
501e4e70 3980 *(value.v_pointer) = lttv_toolbars_new();
001d8606 3981 global_toolbar = (LttvToolbars*)*(value.v_pointer);
3982
3983 g_assert(lttv_iattribute_find_by_path(attributes,
3984 "viewers/toolbar", LTTV_POINTER, &value));
3985 if(*(value.v_pointer) == NULL)
501e4e70 3986 *(value.v_pointer) = lttv_toolbars_new();
001d8606 3987 instance_toolbar = (LttvToolbars*)*(value.v_pointer);
3988
3989 /* Add missing menu entries to window instance */
3990 for(i=0;i<global_menu->len;i++) {
6c9d86dd 3991 menu_item = &g_array_index(global_menu, LttvMenuClosure, i);
3992
3993 //add menu_item to window instance;
3994 constructor = menu_item->con;
3995 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
3996 new_widget =
501e4e70 3997 gtk_menu_item_new_with_mnemonic (menu_item->menu_text);
6c9d86dd 3998 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu),
3999 new_widget);
4000 g_signal_connect ((gpointer) new_widget, "activate",
4001 G_CALLBACK (insert_viewer_wrap),
4002 constructor);
4003 gtk_widget_show (new_widget);
4004 lttv_menus_add(instance_menu, menu_item->con,
4005 menu_item->menu_path,
4006 menu_item->menu_text,
4007 new_widget);
001d8606 4008
001d8606 4009 }
4010
4011 /* Add missing toolbar entries to window instance */
4012 for(i=0;i<global_toolbar->len;i++) {
6c9d86dd 4013 toolbar_item = &g_array_index(global_toolbar, LttvToolbarClosure, i);
4014
4015 //add toolbar_item to window instance;
4016 constructor = toolbar_item->con;
4017 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1");
4018 pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)toolbar_item->pixmap);
4019 pixmap = gtk_image_new_from_pixbuf(pixbuf);
4020 new_widget =
4021 gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
4022 GTK_TOOLBAR_CHILD_BUTTON,
4023 NULL,
4024 "",
4025 toolbar_item->tooltip, NULL,
4026 pixmap, NULL, NULL);
4027 gtk_label_set_use_underline(
4028 GTK_LABEL (((GtkToolbarChild*) (
4029 g_list_last (GTK_TOOLBAR
4030 (tool_menu_title_menu)->children)->data))->label),
4031 TRUE);
4032 gtk_container_set_border_width (GTK_CONTAINER (new_widget), 1);
4033 g_signal_connect ((gpointer) new_widget,
4034 "clicked",
4035 G_CALLBACK (insert_viewer_wrap),
4036 constructor);
4037 gtk_widget_show (new_widget);
001d8606 4038
6c9d86dd 4039 lttv_toolbars_add(instance_toolbar, toolbar_item->con,
4040 toolbar_item->tooltip,
4041 toolbar_item->pixmap,
4042 new_widget);
001d8606 4043
5723fa24 4044 }
6c9d86dd 4045
5723fa24 4046}
4047
abe346a3 4048
4049/* Create a main window
4050 */
4051
08b1c66e 4052void construct_main_window(MainWindow * parent)
5723fa24 4053{
2a2fa4f0 4054 g_debug("construct_main_window()");
68b48a45 4055 GtkWidget * new_window; /* New generated main window */
bca3b81f 4056 MainWindow * new_m_window;/* New main window structure */
5723fa24 4057 GtkNotebook * notebook;
f7afe191 4058 LttvIAttribute *attributes =
4059 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
4060 LttvAttributeValue value;
6ced96ef 4061 Tab *new_tab;
2061e03d 4062
bca3b81f 4063 new_m_window = g_new(MainWindow, 1);
5723fa24 4064
4065 // Add the object's information to the module's array
68b48a45 4066 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 4067
68b48a45 4068 new_window = create_MWindow();
4069 gtk_widget_show (new_window);
5723fa24 4070
bca3b81f 4071 new_m_window->mwindow = new_window;
a43d67ba 4072 new_m_window->attributes = attributes;
5723fa24 4073
001d8606 4074 g_assert(lttv_iattribute_find_by_path(attributes,
4075 "viewers/menu", LTTV_POINTER, &value));
501e4e70 4076 *(value.v_pointer) = lttv_menus_new();
001d8606 4077
501e4e70 4078 g_assert(lttv_iattribute_find_by_path(attributes,
001d8606 4079 "viewers/toolbar", LTTV_POINTER, &value));
501e4e70 4080 *(value.v_pointer) = lttv_toolbars_new();
2061e03d 4081
6c9d86dd 4082 add_all_menu_toolbar_constructors(new_m_window, NULL);
5723fa24 4083
2d262115 4084 g_object_set_data_full(G_OBJECT(new_window),
4085 "main_window_data",
4086 (gpointer)new_m_window,
4087 (GDestroyNotify)g_free);
5723fa24 4088 //create a default tab
bca3b81f 4089 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 4090 if(notebook == NULL){
4091 g_printf("Notebook does not exist\n");
4092 return;
4093 }
e800cf84 4094 //gtk_notebook_popup_enable (GTK_NOTEBOOK(notebook));
5723fa24 4095 //for now there is no name field in LttvTraceset structure
4096 //Use "Traceset" as the label for the default tab
6ced96ef 4097 if(parent) {
4098 GtkWidget * parent_notebook = lookup_widget(parent->mwindow, "MNotebook");
4099 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(parent_notebook),
4100 gtk_notebook_get_current_page(GTK_NOTEBOOK(parent_notebook)));
4101 Tab *parent_tab;
4102
4103 if(!page) {
4104 parent_tab = NULL;
4105 } else {
4106 parent_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
4107 }
4108 new_tab = create_tab(new_m_window, parent_tab, notebook, "Traceset");
4109 } else {
4110 new_tab = create_tab(new_m_window, NULL, notebook, "Traceset");
91fd6881 4111 /* First window, use command line trace */
4266dc7f 4112 if(g_init_trace != NULL){
6ced96ef 4113 lttvwindow_add_trace(new_tab,
4266dc7f 4114 g_init_trace);
91fd6881 4115
4266dc7f 4116 }
e800cf84 4117 LttvTraceset *traceset = new_tab->traceset_info->traceset;
4118 SetTraceset(new_tab, traceset);
4266dc7f 4119 }
5723fa24 4120
ef68c3ac 4121 g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
5723fa24 4122}
4123
abe346a3 4124
4125/* Free the memory occupied by a tab structure
4126 * destroy the tab
4127 */
4128
bca3b81f 4129void tab_destructor(Tab * tab_instance)
f7afe191 4130{
716e4367 4131 int i, nb, ref_count;
4132 LttvTrace * trace;
4133
bca3b81f 4134 if(tab_instance->attributes)
501e4e70 4135 g_object_unref(tab_instance->attributes);
4136
4137 if(tab_instance->interrupted_state)
4138 g_object_unref(tab_instance->interrupted_state);
4139
2061e03d 4140
716e4367 4141 if(tab_instance->traceset_info->traceset_context != NULL){
784705cc 4142 //remove state update hooks
4143 lttv_state_remove_event_hooks(
4144 (LttvTracesetState*)tab_instance->traceset_info->
4145 traceset_context);
716e4367 4146 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
4147 traceset_context));
4148 g_object_unref(tab_instance->traceset_info->traceset_context);
4149 }
4150 if(tab_instance->traceset_info->traceset != NULL) {
4151 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
4152 for(i = 0 ; i < nb ; i++) {
4153 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
4154 ref_count = lttv_trace_get_ref_number(trace);
49bf71b5 4155 if(ref_count <= 1){
a1a2b649 4156 ltt_trace_close(lttv_trace(trace));
49bf71b5 4157 }
716e4367 4158 }
4159 }
a43d67ba 4160 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
501e4e70 4161 /* Remove the idle events requests processing function of the tab */
4162 g_idle_remove_by_data(tab_instance);
4163
4164 g_slist_free(tab_instance->events_requests);
716e4367 4165 g_free(tab_instance->traceset_info);
68b48a45 4166 g_free(tab_instance);
f7afe191 4167}
4168
abe346a3 4169
4170/* Create a tab and insert it into the current main window
4171 */
4172
6ced96ef 4173Tab* create_tab(MainWindow * mw, Tab *copy_tab,
716e4367 4174 GtkNotebook * notebook, char * label)
5723fa24 4175{
4176 GList * list;
6ced96ef 4177 Tab * tab;
68b48a45 4178 LttTime tmp_time;
a43d67ba 4179
abe346a3 4180 //create a new tab data structure
6ced96ef 4181 tab = g_new(Tab,1);
716e4367 4182
abe346a3 4183 //construct and initialize the traceset_info
6ced96ef 4184 tab->traceset_info = g_new(TracesetInfo,1);
a43d67ba 4185
4266dc7f 4186 if(copy_tab) {
6ced96ef 4187 tab->traceset_info->traceset =
4266dc7f 4188 lttv_traceset_copy(copy_tab->traceset_info->traceset);
4189 } else {
6ced96ef 4190 tab->traceset_info->traceset = lttv_traceset_new();
716e4367 4191 }
20fde85f 4192
84ddf5c9 4193#ifdef DEBUG
20fde85f 4194 lttv_attribute_write_xml(
6ced96ef 4195 lttv_traceset_attribute(tab->traceset_info->traceset),
20fde85f 4196 stdout,
4197 0, 4);
4198 fflush(stdout);
84ddf5c9 4199#endif //DEBUG
20fde85f 4200
e800cf84 4201 tab->time_manager_lock = FALSE;
4202 tab->current_time_manager_lock = FALSE;
20fde85f 4203
716e4367 4204 //FIXME copy not implemented in lower level
6ced96ef 4205 tab->traceset_info->traceset_context =
716e4367 4206 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
6ced96ef 4207 g_assert(tab->traceset_info->traceset_context != NULL);
716e4367 4208 lttv_context_init(
6ced96ef 4209 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context),
4210 tab->traceset_info->traceset);
784705cc 4211 //add state update hooks
4212 lttv_state_add_event_hooks(
6ced96ef 4213 (LttvTracesetState*)tab->traceset_info->traceset_context);
784705cc 4214
abe346a3 4215 //determine the current_time and time_window of the tab
e800cf84 4216#if 0
6ced96ef 4217 if(copy_tab != NULL){
4218 tab->time_window = copy_tab->time_window;
4219 tab->current_time = copy_tab->current_time;
5723fa24 4220 }else{
6ced96ef 4221 tab->time_window.start_time =
4222 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4223 time_span.start_time;
f7afe191 4224 if(DEFAULT_TIME_WIDTH_S <
6ced96ef 4225 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4226 time_span.end_time.tv_sec)
68b48a45 4227 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 4228 else
68b48a45 4229 tmp_time.tv_sec =
6ced96ef 4230 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4231 time_span.end_time.tv_sec;
68b48a45 4232 tmp_time.tv_nsec = 0;
6ced96ef 4233 tab->time_window.time_width = tmp_time ;
4234 tab->current_time.tv_sec =
4235 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4236 time_span.start_time.tv_sec;
4237 tab->current_time.tv_nsec =
4238 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4239 time_span.start_time.tv_nsec;
5723fa24 4240 }
e800cf84 4241#endif //0
6ced96ef 4242 tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
4243 tab->interrupted_state = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
b052368a 4244
58f6c2a4 4245 tab->vbox = gtk_vbox_new(FALSE, 2);
4246 tab->viewer_container = gtk_vbox_new(TRUE, 2);
b052368a 4247 tab->scrollbar = gtk_hscrollbar_new(NULL);
4248 //tab->multivpaned = gtk_multi_vpaned_new();
4249
4250 gtk_box_pack_start(GTK_BOX(tab->vbox),
4251 tab->viewer_container,
4252 TRUE, /* expand */
4253 TRUE, /* Give the extra space to the child */
4254 0); /* No padding */
e800cf84 4255
4256 /* Create the timebar */
4257 {
4258 tab->MTimebar = gtk_hbox_new(FALSE, 2);
4259 gtk_widget_show(tab->MTimebar);
4260
4261 tab->MText1 = gtk_label_new("Time Frame start: ");
4262 gtk_widget_show(tab->MText1);
4263 tab->MText2 = gtk_label_new("s");
4264 gtk_widget_show(tab->MText2);
4265 tab->MText3a = gtk_label_new("ns");
4266 gtk_widget_show(tab->MText3a);
4267 tab->MText3b = gtk_label_new("end:");
4268 gtk_widget_show(tab->MText3b);
4269 tab->MText4 = gtk_label_new("s");
4270 gtk_widget_show(tab->MText4);
4271 tab->MText5a = gtk_label_new("ns");
4272 gtk_widget_show(tab->MText5a);
4273 tab->MText5b = gtk_label_new("Current Time:");
4274 gtk_widget_show(tab->MText5b);
4275 tab->MText6 = gtk_label_new("s");
4276 gtk_widget_show(tab->MText6);
4277 tab->MText7 = gtk_label_new("ns");
4278 gtk_widget_show(tab->MText7);
4279
4280 tab->MEntry1 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
4281 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry1),0);
4282 gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry1),TRUE);
4283 gtk_widget_show(tab->MEntry1);
4284 tab->MEntry2 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
4285 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry2),0);
4286 gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry2),TRUE);
4287 gtk_widget_show(tab->MEntry2);
4288 tab->MEntry3 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
4289 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry3),0);
4290 gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry3),TRUE);
4291 gtk_widget_show(tab->MEntry3);
4292 tab->MEntry4 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
4293 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry4),0);
4294 gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry4),TRUE);
4295 gtk_widget_show(tab->MEntry4);
4296 tab->MEntry5 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
4297 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry5),0);
4298 gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry5),TRUE);
4299 gtk_widget_show(tab->MEntry5);
4300 tab->MEntry6 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
4301 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry6),0);
4302 gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry6),TRUE);
4303 gtk_widget_show(tab->MEntry6);
4304
4305
4306 GtkWidget *temp_widget;
4307
4308 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText1, FALSE, FALSE, 0);
4309 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry1, FALSE, FALSE, 0);
4310 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText2, FALSE, FALSE, 0);
4311 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry2, FALSE, FALSE, 0);
4312 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText3a, FALSE, FALSE, 0);
4313 temp_widget = gtk_vseparator_new();
4314 gtk_widget_show(temp_widget);
4315 gtk_box_pack_start (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0);
4316 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText3b, FALSE, FALSE, 0);
4317 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry3, FALSE, FALSE, 0);
4318 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText4, FALSE, FALSE, 0);
4319 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry4, FALSE, FALSE, 0);
4320 gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText5a, FALSE, FALSE, 0);
4321 temp_widget = gtk_vseparator_new();
4322 gtk_widget_show(temp_widget);
4323 gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText7, FALSE, FALSE, 0);
4324 gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEntry6, FALSE, FALSE, 0);
4325 gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText6, FALSE, FALSE, 0);
4326 gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEntry5, FALSE, FALSE, 0);
4327 gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText5b, FALSE, FALSE, 0);
4328 gtk_box_pack_end (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0);
4329 }
4330
b052368a 4331 gtk_box_pack_end(GTK_BOX(tab->vbox),
4332 tab->scrollbar,
4333 FALSE, /* Do not expand */
4334 FALSE, /* Fill has no effect here (expand false) */
4335 0); /* No padding */
e800cf84 4336
4337 gtk_box_pack_end(GTK_BOX(tab->vbox),
4338 tab->MTimebar,
4339 FALSE, /* Do not expand */
4340 FALSE, /* Fill has no effect here (expand false) */
4341 0); /* No padding */
4342
b052368a 4343 g_object_set_data(G_OBJECT(tab->viewer_container), "focused_viewer", NULL);
4344
4345
6ced96ef 4346 tab->mw = mw;
27a559b9 4347
3c031040 4348 /*{
4349 // Display a label with a X
27a559b9 4350 GtkWidget *w_hbox = gtk_hbox_new(FALSE, 4);
4351 GtkWidget *w_label = gtk_label_new (label);
4352 GtkWidget *pixmap = create_pixmap(GTK_WIDGET(notebook), "close.png");
4353 GtkWidget *w_button = gtk_button_new ();
4354 gtk_container_add(GTK_CONTAINER(w_button), pixmap);
4355 //GtkWidget *w_button = gtk_button_new_with_label("x");
4356
4357 gtk_button_set_relief(GTK_BUTTON(w_button), GTK_RELIEF_NONE);
4358
4359 gtk_box_pack_start(GTK_BOX(w_hbox), w_label, TRUE, TRUE, 0);
4360 gtk_box_pack_end(GTK_BOX(w_hbox), w_button, FALSE,
4361 FALSE, 0);
a43d67ba 4362
27a559b9 4363 g_signal_connect_swapped (w_button, "clicked",
4364 G_CALLBACK (on_close_tab_X_clicked),
4365 tab->multi_vpaned);
5723fa24 4366
3c031040 4367 gtk_widget_set_state(w_button, GTK_STATE_ACTIVE);
4368
27a559b9 4369 gtk_widget_show (w_label);
4370 gtk_widget_show (pixmap);
4371 gtk_widget_show (w_button);
4372 gtk_widget_show (w_hbox);
4373
4374 tab->label = w_hbox;
3c031040 4375 }*/
4376
4377
4378 tab->label = gtk_label_new (label);
b052368a 4379
4380 gtk_widget_show(tab->label);
4381 gtk_widget_show(tab->scrollbar);
4382 gtk_widget_show(tab->viewer_container);
4383 gtk_widget_show(tab->vbox);
4384 //gtk_widget_show(tab->multivpaned);
3c031040 4385
4386
501e4e70 4387 /* Start with empty events requests list */
6ced96ef 4388 tab->events_requests = NULL;
4389 tab->events_request_pending = FALSE;
a43d67ba 4390
f7afe191 4391 g_object_set_data_full(
b052368a 4392 G_OBJECT(tab->vbox),
f7afe191 4393 "Tab_Info",
6ced96ef 4394 tab,
4395 (GDestroyNotify)tab_destructor);
540edb40 4396
b052368a 4397 g_signal_connect(G_OBJECT(tab->scrollbar), "value-changed",
4398 G_CALLBACK(scroll_value_changed_cb), tab);
e800cf84 4399
4400 g_signal_connect ((gpointer) tab->MEntry1, "value-changed",
4401 G_CALLBACK (on_MEntry1_value_changed),
4402 tab);
4403 g_signal_connect ((gpointer) tab->MEntry2, "value-changed",
4404 G_CALLBACK (on_MEntry2_value_changed),
4405 tab);
4406 g_signal_connect ((gpointer) tab->MEntry3, "value-changed",
4407 G_CALLBACK (on_MEntry3_value_changed),
4408 tab);
4409 g_signal_connect ((gpointer) tab->MEntry4, "value-changed",
4410 G_CALLBACK (on_MEntry4_value_changed),
4411 tab);
4412 g_signal_connect ((gpointer) tab->MEntry5, "value-changed",
4413 G_CALLBACK (on_MEntry5_value_changed),
4414 tab);
4415 g_signal_connect ((gpointer) tab->MEntry6, "value-changed",
4416 G_CALLBACK (on_MEntry6_value_changed),
4417 tab);
4418
b052368a 4419 //g_signal_connect(G_OBJECT(tab->scrollbar), "changed",
4420 // G_CALLBACK(scroll_value_changed_cb), tab);
4421
4422
784705cc 4423 //insert tab into notebook
6ced96ef 4424 gtk_notebook_append_page(notebook,
b052368a 4425 tab->vbox,
4426 tab->label);
5723fa24 4427 list = gtk_container_get_children(GTK_CONTAINER(notebook));
4428 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
a43d67ba 4429 // always show : not if(g_list_length(list)>1)
4430 gtk_notebook_set_show_tabs(notebook, TRUE);
4431
6ced96ef 4432 return tab;
a43d67ba 4433}
4434
501e4e70 4435/*
4436 * execute_events_requests
4437 *
4438 * Idle function that executes the pending requests for a tab.
4439 *
4440 * @return return value : TRUE : keep the idle function, FALSE : remove it.
4441 */
4442gboolean execute_events_requests(Tab *tab)
a43d67ba 4443{
501e4e70 4444 return ( lttvwindow_process_pending_requests(tab) );
a43d67ba 4445}
4446
This page took 0.275497 seconds and 4 git commands to generate.