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