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