Add warning popup when trying to open multiple traces
[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
FD
1635 traceset = lttvwindow_get_traceset(tab);
1636 if(traceset != NULL && traceset->traces->len > 0){
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 */
1e3594a3 1652 GtkWidget *extra_live_button;
ba013432
MD
1653 GtkFileChooser * file_chooser =
1654 GTK_FILE_CHOOSER(
1655 gtk_file_chooser_dialog_new ("Select a trace",
1656 GTK_WINDOW(mw_data->mwindow),
1657 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1658 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1659 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
861fbe5f 1660 NULL));
ba013432 1661
1e3594a3
YB
1662 /* Button to indicate the opening of a live trace */
1663 extra_live_button = gtk_check_button_new_with_mnemonic ("Trace is live (currently being writen)");
1664 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (extra_live_button), FALSE);
1665 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (file_chooser), extra_live_button);
1666
ba013432 1667 gtk_file_chooser_set_show_hidden (file_chooser, TRUE);
3658a338 1668 if(remember_trace_dir[0] != '\0')
ba013432
MD
1669 gtk_file_chooser_set_filename(file_chooser, remember_trace_dir);
1670
861fbe5f 1671 gboolean closeFileChooserDialog = TRUE;
1e3594a3 1672
861fbe5f
FD
1673 do
1674 {
1675 id = gtk_dialog_run(GTK_DIALOG(file_chooser));
1676 switch(id){
1677 case GTK_RESPONSE_ACCEPT:
1678 case GTK_RESPONSE_OK:
1679 path = gtk_file_chooser_get_filename (file_chooser);
1680
1681 strncpy(remember_trace_dir, path, PATH_MAX);
1682 strncat(remember_trace_dir, "/", PATH_MAX);
1683 if(!path || strlen(path) == 0){
1684 break;
1e3594a3 1685 }
861fbe5f
FD
1686 get_absolute_pathname(path, abs_path);
1687
1688 if(lttv_traceset_add_path(traceset,abs_path) != 0 ){ /*failure*/
49bf71b5 1689
861fbe5f
FD
1690 g_warning("cannot open trace %s", abs_path);
1691 strncpy(remember_trace_dir, "\0", PATH_MAX);
1692 GtkWidget *dialogue =
1693 gtk_message_dialog_new(
1694 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
1695 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
1696 GTK_MESSAGE_ERROR,
1697 GTK_BUTTONS_OK,
1698 "Cannot open trace : maybe you should enter in the directory "
1699 "to select it ?");
1700 gtk_dialog_run(GTK_DIALOG(dialogue));
1701 gtk_widget_destroy(dialogue);
1702 closeFileChooserDialog = FALSE;
1703 }
1704 else{
1705 closeFileChooserDialog = TRUE;
1706 SetTraceset(tab, traceset);
1707 }
1708 break;
1709 //update current tab
1710 //update_traceset(mw_data);
21e8c385 1711
861fbe5f
FD
1712 // in expose now call_pending_read_hooks(mw_data);
1713
1714 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
a43d67ba 1715
861fbe5f
FD
1716 case GTK_RESPONSE_REJECT:
1717 case GTK_RESPONSE_CANCEL:
1718 default:
1719 closeFileChooserDialog = TRUE;
1720 break;
1721 }
1722 }while(!closeFileChooserDialog);
451aaf27 1723
861fbe5f 1724 gtk_widget_destroy((GtkWidget*)file_chooser);
ba013432 1725
49bf71b5 1726}
1727
abe346a3 1728/* remove_trace removes a trace from the current traceset if all viewers in
1729 * the current tab are not interested in the trace. It first displays a
1730 * dialogue, which shows all traces in the current traceset, to let user choose
1731 * a trace, then it checks if all viewers unselect the trace, if it is true,
1732 * it will remove the trace, recreate the traceset_contex,
1733 * and redraws all the viewer of the current tab. If there is on trace in the
1734 * current traceset, it will delete all viewers of the current tab
3a5f75c1 1735 *
1736 * It destroys the filter tree. FIXME... we should request for an update
1737 * instead.
abe346a3 1738 */
1739
b052368a 1740void remove_trace(GtkWidget *widget, gpointer user_data)
1741{
9a366873 1742#ifdef BABEL_CLEANUP
b052368a 1743 LttTrace *trace;
1744 LttvTrace * trace_v;
1745 LttvTraceset * traceset;
1746 gint i, j, nb_trace, index=-1;
1747 char ** name, *remove_trace_name;
1748 MainWindow * mw_data = get_window_data_struct(widget);
1749 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1750
1751 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1752 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1753 Tab *tab;
1754
1755 if(!page) {
1756 return;
1757 } else {
e433e6d6 1758 LttvPluginTab *ptab;
1759 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
1760 tab = ptab->tab;
b052368a 1761 }
1762
1763 nb_trace =lttv_traceset_number(tab->traceset_info->traceset);
1764 name = g_new(char*,nb_trace);
1765 for(i = 0; i < nb_trace; i++){
1766 trace_v = lttv_traceset_get(tab->traceset_info->traceset, i);
1767 trace = lttv_trace(trace_v);
8d8c5ea7 1768 name[i] = (char *) g_quark_to_string(ltt_trace_name(trace));
b052368a 1769 }
1770
93ac601b 1771 remove_trace_name = get_remove_trace(mw_data, name, nb_trace);
b052368a 1772
1773
1774 if(remove_trace_name){
1775
1776 /* yuk, cut n paste from old code.. should be better (MD)*/
1777 for(i = 0; i<nb_trace; i++) {
1778 if(strcmp(remove_trace_name,name[i]) == 0){
1779 index = i;
1780 }
1781 }
1782
1783 traceset = tab->traceset_info->traceset;
1784 //Keep a reference to the traces so they are not freed.
1785 for(j=0; j<lttv_traceset_number(traceset); j++)
1786 {
1787 LttvTrace * trace = lttv_traceset_get(traceset, j);
1788 lttv_trace_ref(trace);
1789 }
1790
1791 //remove state update hooks
1792 lttv_state_remove_event_hooks(
1793 (LttvTracesetState*)tab->traceset_info->traceset_context);
1794 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context));
1795 g_object_unref(tab->traceset_info->traceset_context);
1796
1797 trace_v = lttv_traceset_get(traceset, index);
1798
b052368a 1799 lttv_traceset_remove(traceset, index);
1800 lttv_trace_unref(trace_v); // Remove local reference
1801
d27948a3 1802 if(lttv_trace_get_ref_number(trace_v) <= 1) {
1ba187d3 1803 /* ref 1 : lttvwindowtraces only*/
1804 ltt_trace_close(lttv_trace(trace_v));
1805 /* lttvwindowtraces_remove_trace takes care of destroying
1806 * the traceset linked with the trace_v and also of destroying
1807 * the trace_v at the same time.
1808 */
d27948a3 1809 lttvwindowtraces_remove_trace(trace_v);
1810 }
b052368a 1811
1812 tab->traceset_info->traceset_context =
1813 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1814 lttv_context_init(
1815 LTTV_TRACESET_CONTEXT(tab->
1816 traceset_info->traceset_context),traceset);
1817 //add state update hooks
1818 lttv_state_add_event_hooks(
1819 (LttvTracesetState*)tab->traceset_info->traceset_context);
1820
1821 //Remove local reference to the traces.
1822 for(j=0; j<lttv_traceset_number(traceset); j++)
1823 {
1824 LttvTrace * trace = lttv_traceset_get(traceset, j);
1825 lttv_trace_unref(trace);
1826 }
1827
1828 SetTraceset(tab, (gpointer)traceset);
1829 }
1830 g_free(name);
451aaf27 1831#endif /* BABEL_CLEANUP */
b052368a 1832}
1833
1834#if 0
561eba2a 1835void remove_trace(GtkWidget * widget, gpointer user_data)
1836{
2176f952 1837 LttTrace *trace;
1838 LttvTrace * trace_v;
1839 LttvTraceset * traceset;
a43d67ba 1840 gint i, j, nb_trace;
2176f952 1841 char ** name, *remove_trace_name;
bca3b81f 1842 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 1843 LttvTracesetSelector * s;
1844 LttvTraceSelector * t;
1845 GtkWidget * w;
1846 gboolean selected;
6ced96ef 1847 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1848
1849 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1850 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1851 Tab *tab;
1852
1853 if(!page) {
1854 return;
1855 } else {
1856 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1857 }
1858
4266dc7f 1859 nb_trace =lttv_traceset_number(tab->traceset_info->traceset);
2176f952 1860 name = g_new(char*,nb_trace);
1861 for(i = 0; i < nb_trace; i++){
4266dc7f 1862 trace_v = lttv_traceset_get(tab->traceset_info->traceset, i);
2176f952 1863 trace = lttv_trace(trace_v);
a5dcde2f 1864 name[i] = ltt_trace_name(trace);
2176f952 1865 }
1866
1867 remove_trace_name = get_remove_trace(name, nb_trace);
1868
1869 if(remove_trace_name){
1870 for(i=0; i<nb_trace; i++){
1871 if(strcmp(remove_trace_name,name[i]) == 0){
6ced96ef 1872 //unselect the trace from the current viewer
b052368a 1873 //FIXME
1874 w = gtk_multivpaned_get_widget(GTK_MULTIVPANED(tab->multivpaned));
6ced96ef 1875 if(w){
1876 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1877 if(s){
1878 t = lttv_traceset_selector_trace_get(s,i);
1879 lttv_trace_selector_set_selected(t, FALSE);
1880 }
1881
1882 //check if other viewers select the trace
b052368a 1883 w = gtk_multivpaned_get_first_widget(GTK_MULTIVPANED(tab->multivpaned));
6ced96ef 1884 while(w){
1885 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1886 if(s){
1887 t = lttv_traceset_selector_trace_get(s,i);
1888 selected = lttv_trace_selector_get_selected(t);
1889 if(selected)break;
1890 }
b052368a 1891 w = gtk_multivpaned_get_next_widget(GTK_MULTIVPANED(tab->multivpaned));
6ced96ef 1892 }
1893 }else selected = FALSE;
49bf71b5 1894
6ced96ef 1895 //if no viewer selects the trace, remove it
1896 if(!selected){
b052368a 1897 remove_trace_from_traceset_selector(GTK_MULTIVPANED(tab->multivpaned), i);
49bf71b5 1898
6ced96ef 1899 traceset = tab->traceset_info->traceset;
1900 //Keep a reference to the traces so they are not freed.
1901 for(j=0; j<lttv_traceset_number(traceset); j++)
1902 {
1903 LttvTrace * trace = lttv_traceset_get(traceset, j);
1904 lttv_trace_ref(trace);
1905 }
a43d67ba 1906
6ced96ef 1907 //remove state update hooks
1908 lttv_state_remove_event_hooks(
1909 (LttvTracesetState*)tab->traceset_info->traceset_context);
1910 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context));
1911 g_object_unref(tab->traceset_info->traceset_context);
a43d67ba 1912
a43d67ba 1913
6ced96ef 1914 trace_v = lttv_traceset_get(traceset, i);
a43d67ba 1915
a1a2b649 1916 if(lttv_trace_get_ref_number(trace_v) <= 2) {
1917 /* ref 2 : traceset, local */
1918 lttvwindowtraces_remove_trace(trace_v);
6ced96ef 1919 ltt_trace_close(lttv_trace(trace_v));
a1a2b649 1920 }
6ced96ef 1921
1922 lttv_traceset_remove(traceset, i);
1923 lttv_trace_unref(trace_v); // Remove local reference
c2619a30 1924
6ced96ef 1925 if(!lttv_trace_get_ref_number(trace_v))
1926 lttv_trace_destroy(trace_v);
1927
1928 tab->traceset_info->traceset_context =
1929 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1930 lttv_context_init(
1931 LTTV_TRACESET_CONTEXT(tab->
1932 traceset_info->traceset_context),traceset);
1933 //add state update hooks
1934 lttv_state_add_event_hooks(
1935 (LttvTracesetState*)tab->traceset_info->traceset_context);
1936
1937 //Remove local reference to the traces.
1938 for(j=0; j<lttv_traceset_number(traceset); j++)
1939 {
1940 LttvTrace * trace = lttv_traceset_get(traceset, j);
1941 lttv_trace_unref(trace);
1942 }
a43d67ba 1943
a43d67ba 1944
6ced96ef 1945 //update current tab
1946 //update_traceset(mw_data);
313bd6fc 1947 //if(nb_trace > 1){
6ced96ef 1948
313bd6fc 1949 SetTraceset(tab, (gpointer)traceset);
6ced96ef 1950 // in expose now call_pending_read_hooks(mw_data);
1951
1952 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
313bd6fc 1953 //}else{
1954 // if(tab){
1955 // while(tab->multi_vpaned->num_children){
1956 // gtk_multi_vpaned_widget_delete(tab->multi_vpaned);
1957 // }
1958 // }
1959 //}
6ced96ef 1960 }
1961 break;
2176f952 1962 }
1963 }
1964 }
1965
1966 g_free(name);
561eba2a 1967}
b052368a 1968#endif //0
abe346a3 1969
9878c8a4 1970/* Redraw all the viewers in the current tab */
1971void redraw(GtkWidget *widget, gpointer user_data)
1972{
1973 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1974 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1975 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1976 Tab *tab;
8f318283
BP
1977 gboolean retval;
1978
9878c8a4 1979 if(!page) {
1980 return;
1981 } else {
e433e6d6 1982 LttvPluginTab *ptab;
1983 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
1984 tab = ptab->tab;
9878c8a4 1985 }
1986
1987 LttvHooks * tmp;
1988 LttvAttributeValue value;
1989
8f318283
BP
1990 retval= lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value);
1991 g_assert(retval);
9878c8a4 1992
1993 tmp = (LttvHooks*)*(value.v_pointer);
c07e9b26 1994 if(tmp != NULL)
1995 lttv_hooks_call(tmp,NULL);
9878c8a4 1996}
1997
1998
1999void continue_processing(GtkWidget *widget, gpointer user_data)
2000{
2001 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
2002 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
2003 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
2004 Tab *tab;
8f318283
BP
2005 gboolean retval;
2006
9878c8a4 2007 if(!page) {
2008 return;
2009 } else {
e433e6d6 2010 LttvPluginTab *ptab;
2011 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
2012 tab = ptab->tab;
9878c8a4 2013 }
2014
2015 LttvHooks * tmp;
2016 LttvAttributeValue value;
2017
8f318283
BP
2018 retval= lttv_iattribute_find_by_path(tab->attributes, "hooks/continue",
2019 LTTV_POINTER, &value);
2020 g_assert(retval);
9878c8a4 2021
2022 tmp = (LttvHooks*)*(value.v_pointer);
c07e9b26 2023 if(tmp != NULL)
2024 lttv_hooks_call(tmp,NULL);
9878c8a4 2025}
2026
2027/* Stop the processing for the calling main window's current tab.
2028 * It removes every processing requests that are in its list. It does not call
2029 * the end request hooks, because the request is not finished.
2030 */
2031
2032void stop_processing(GtkWidget *widget, gpointer user_data)
2033{
2034 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
2035 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
2036 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
2037 Tab *tab;
2038 if(!page) {
2039 return;
2040 } else {
e433e6d6 2041 LttvPluginTab *ptab;
2042 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
2043 tab = ptab->tab;
9878c8a4 2044 }
a0577796 2045 GSList *iter = tab->events_requests;
9878c8a4 2046
2047 while(iter != NULL) {
2048 GSList *remove_iter = iter;
2049 iter = g_slist_next(iter);
2050
2051 g_free(remove_iter->data);
a0577796 2052 tab->events_requests =
2053 g_slist_remove_link(tab->events_requests, remove_iter);
9878c8a4 2054 }
a0577796 2055 tab->events_request_pending = FALSE;
5698740e 2056 tab->stop_foreground = TRUE;
a0577796 2057 g_idle_remove_by_data(tab);
2058 g_assert(g_slist_length(tab->events_requests) == 0);
9878c8a4 2059}
2060
2061
abe346a3 2062/* save will save the traceset to a file
a43d67ba 2063 * Not implemented yet FIXME
abe346a3 2064 */
2065
561eba2a 2066void save(GtkWidget * widget, gpointer user_data)
2067{
56e5a0f7 2068 g_info("Save\n");
561eba2a 2069}
2070
2071void save_as(GtkWidget * widget, gpointer user_data)
2072{
56e5a0f7 2073 g_info("Save as\n");
561eba2a 2074}
2075
abe346a3 2076
2077/* zoom will change the time_window of all the viewers of the
2078 * current tab, and redisplay them. The main functionality is to
2079 * determine the new time_window of the current tab
2080 */
2081
1f1ae829 2082void zoom(GtkWidget * widget, double size)
2083{
9a366873 2084#ifdef BABEL_CLEANUP
b052368a 2085 TimeInterval time_span;
a43d67ba 2086 TimeWindow new_time_window;
2eef04b5 2087 LttTime current_time, time_delta;
4266dc7f 2088 LttvTracesetContext *tsc;
6ced96ef 2089 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
2090
2091 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
2092 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
2093 Tab *tab;
2094
2095 if(!page) {
2096 return;
2097 } else {
e433e6d6 2098 LttvPluginTab *ptab;
2099 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
2100 tab = ptab->tab;
6ced96ef 2101 }
1f1ae829 2102
fda16332 2103 if(size == 1) return;
2104
4266dc7f 2105 tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
b052368a 2106 time_span = tsc->time_span;
501e4e70 2107 new_time_window = tab->time_window;
2108 current_time = tab->current_time;
1f1ae829 2109
b052368a 2110 time_delta = ltt_time_sub(time_span.end_time,time_span.start_time);
1f1ae829 2111 if(size == 0){
b052368a 2112 new_time_window.start_time = time_span.start_time;
a43d67ba 2113 new_time_window.time_width = time_delta;
a18124ff 2114 new_time_window.time_width_double = ltt_time_to_double(time_delta);
6f26fc38 2115 new_time_window.end_time = ltt_time_add(new_time_window.start_time,
2116 new_time_window.time_width) ;
1f1ae829 2117 }else{
a43d67ba 2118 new_time_window.time_width = ltt_time_div(new_time_window.time_width, size);
a18124ff 2119 new_time_window.time_width_double =
2120 ltt_time_to_double(new_time_window.time_width);
a43d67ba 2121 if(ltt_time_compare(new_time_window.time_width,time_delta) > 0)
2122 { /* Case where zoom out is bigger than trace length */
b052368a 2123 new_time_window.start_time = time_span.start_time;
a43d67ba 2124 new_time_window.time_width = time_delta;
a18124ff 2125 new_time_window.time_width_double = ltt_time_to_double(time_delta);
6f26fc38 2126 new_time_window.end_time = ltt_time_add(new_time_window.start_time,
2127 new_time_window.time_width) ;
a8c0f09d 2128 }
a43d67ba 2129 else
2130 {
2131 /* Center the image on the current time */
a43d67ba 2132 new_time_window.start_time =
a18124ff 2133 ltt_time_sub(current_time,
2134 ltt_time_from_double(new_time_window.time_width_double/2.0));
6f26fc38 2135 new_time_window.end_time = ltt_time_add(new_time_window.start_time,
2136 new_time_window.time_width) ;
a43d67ba 2137 /* If on borders, don't fall off */
9e494e53 2138 if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0
2139 || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0)
a43d67ba 2140 {
b052368a 2141 new_time_window.start_time = time_span.start_time;
6f26fc38 2142 new_time_window.end_time = ltt_time_add(new_time_window.start_time,
2143 new_time_window.time_width) ;
a43d67ba 2144 }
2145 else
2146 {
6f26fc38 2147 if(ltt_time_compare(new_time_window.end_time,
9e494e53 2148 time_span.end_time) > 0
2149 || ltt_time_compare(new_time_window.end_time,
2150 time_span.start_time) < 0)
a43d67ba 2151 {
2152 new_time_window.start_time =
b052368a 2153 ltt_time_sub(time_span.end_time, new_time_window.time_width);
6f26fc38 2154
2155 new_time_window.end_time = ltt_time_add(new_time_window.start_time,
2156 new_time_window.time_width) ;
a43d67ba 2157 }
2158 }
2159
1f1ae829 2160 }
1f1ae829 2161 }
a43d67ba 2162
f02b5e22 2163 if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) {
2164 g_warning("Zoom more than 1 ns impossible");
b052368a 2165 } else {
e800cf84 2166 time_change_manager(tab, new_time_window);
b052368a 2167 }
451aaf27
FD
2168
2169#endif /* BABEL_CLEANUP */
1f1ae829 2170}
2171
561eba2a 2172void zoom_in(GtkWidget * widget, gpointer user_data)
2173{
1f1ae829 2174 zoom(widget, 2);
561eba2a 2175}
2176
2177void zoom_out(GtkWidget * widget, gpointer user_data)
2178{
1f1ae829 2179 zoom(widget, 0.5);
561eba2a 2180}
2181
2182void zoom_extended(GtkWidget * widget, gpointer user_data)
2183{
1f1ae829 2184 zoom(widget, 0);
561eba2a 2185}
2186
2187void go_to_time(GtkWidget * widget, gpointer user_data)
2188{
56e5a0f7 2189 g_info("Go to time\n");
561eba2a 2190}
2191
2192void show_time_frame(GtkWidget * widget, gpointer user_data)
2193{
56e5a0f7 2194 g_info("Show time frame\n");
561eba2a 2195}
2196
2197
2198/* callback function */
2199
2200void
2201on_empty_traceset_activate (GtkMenuItem *menuitem,
2202 gpointer user_data)
2203{
68b48a45 2204 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 2205}
2206
2207
2208void
2209on_clone_traceset_activate (GtkMenuItem *menuitem,
2210 gpointer user_data)
2211{
68b48a45 2212 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 2213}
2214
abe346a3 2215
2216/* create_new_tab calls create_tab to construct a new tab in the main window
2217 */
2218
e433e6d6 2219LttvPluginTab *create_new_tab(GtkWidget* widget, gpointer user_data)
2220{
a1a2b649 2221 gchar label[PATH_MAX];
2901f314 2222 MainWindow * mw_data = get_window_data_struct(widget);
4266dc7f 2223
2901f314 2224 GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
561eba2a 2225 if(notebook == NULL){
56e5a0f7 2226 g_info("Notebook does not exist\n");
6ced96ef 2227 return NULL;
2228 }
2229 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
2230 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
2231 Tab *copy_tab;
2232
2233 if(!page) {
2234 copy_tab = NULL;
2235 } else {
e433e6d6 2236 LttvPluginTab *ptab;
2237 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
2238 copy_tab = ptab->tab;
561eba2a 2239 }
4266dc7f 2240
6b1d3120 2241 strcpy(label,"Page");
e433e6d6 2242 if(get_label(mw_data, label,"Get the name of the tab","Please input tab's name")) {
2243 LttvPluginTab *ptab;
2244
2245 ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL);
2246 init_tab (ptab->tab, mw_data, copy_tab, notebook, label);
2247 ptab->parent.top_widget = ptab->tab->top_widget;
2248 g_object_set_data_full(
2249 G_OBJECT(ptab->tab->vbox),
2250 "Tab_Plugin",
2251 ptab,
2252 (GDestroyNotify)tab_destructor);
2253 return ptab;
2254 }
2255 else return NULL;
561eba2a 2256}
2257
2901f314 2258void
2259on_tab_activate (GtkMenuItem *menuitem,
2260 gpointer user_data)
2261{
2262 create_new_tab((GtkWidget*)menuitem, user_data);
2263}
2264
561eba2a 2265
2266void
2267on_open_activate (GtkMenuItem *menuitem,
2268 gpointer user_data)
2269{
e865422c 2270#ifdef UNFINISHED_FEATURE
561eba2a 2271 open_traceset((GtkWidget*)menuitem, user_data);
e865422c 2272#endif
561eba2a 2273}
2274
2275
2276void
2277on_close_activate (GtkMenuItem *menuitem,
2278 gpointer user_data)
2279{
bca3b81f 2280 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 2281 main_window_destructor(mw_data);
561eba2a 2282}
2283
2284
4266dc7f 2285/* remove the current tab from the main window
abe346a3 2286 */
2287
561eba2a 2288void
27a559b9 2289on_close_tab_activate (GtkWidget *widget,
561eba2a 2290 gpointer user_data)
2291{
4266dc7f 2292 gint page_num;
2061e03d 2293 GtkWidget * notebook;
27a559b9 2294 notebook = lookup_widget(widget, "MNotebook");
2061e03d 2295 if(notebook == NULL){
56e5a0f7 2296 g_info("Notebook does not exist\n");
2061e03d 2297 return;
2298 }
4266dc7f 2299
2300 page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
2061e03d 2301
4266dc7f 2302 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
2061e03d 2303
561eba2a 2304}
2305
27a559b9 2306void
2307on_close_tab_X_clicked (GtkWidget *widget,
2308 gpointer user_data)
2309{
2310 gint page_num;
2311 GtkWidget *notebook = lookup_widget(widget, "MNotebook");
2312 if(notebook == NULL){
56e5a0f7 2313 g_info("Notebook does not exist\n");
27a559b9 2314 return;
2315 }
2316
2317 if((page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), widget)) != -1)
2318 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
2319
2320}
2321
561eba2a 2322
2323void
2324on_add_trace_activate (GtkMenuItem *menuitem,
2325 gpointer user_data)
2326{
2327 add_trace((GtkWidget*)menuitem, user_data);
2328}
2329
2330
2331void
2332on_remove_trace_activate (GtkMenuItem *menuitem,
2333 gpointer user_data)
2334{
2335 remove_trace((GtkWidget*)menuitem, user_data);
2336}
2337
2338
2339void
2340on_save_activate (GtkMenuItem *menuitem,
2341 gpointer user_data)
2342{
2343 save((GtkWidget*)menuitem, user_data);
2344}
2345
2346
2347void
2348on_save_as_activate (GtkMenuItem *menuitem,
2349 gpointer user_data)
2350{
2351 save_as((GtkWidget*)menuitem, user_data);
2352}
2353
2354
2355void
2356on_quit_activate (GtkMenuItem *menuitem,
2357 gpointer user_data)
2358{
6f9c921e 2359 while (g_slist_length(g_main_window_list) != 0) {
2360 on_MWindow_destroy(((MainWindow *)g_main_window_list->data)->mwindow,
2361 user_data);
2362 }
561eba2a 2363}
2364
2365
2366void
2367on_cut_activate (GtkMenuItem *menuitem,
2368 gpointer user_data)
2369{
56e5a0f7 2370 g_info("Cut\n");
561eba2a 2371}
2372
2373
2374void
2375on_copy_activate (GtkMenuItem *menuitem,
2376 gpointer user_data)
2377{
56e5a0f7 2378 g_info("Copye\n");
561eba2a 2379}
2380
2381
2382void
2383on_paste_activate (GtkMenuItem *menuitem,
2384 gpointer user_data)
2385{
56e5a0f7 2386 g_info("Paste\n");
561eba2a 2387}
2388
2389
2390void
2391on_delete_activate (GtkMenuItem *menuitem,
2392 gpointer user_data)
2393{
56e5a0f7 2394 g_info("Delete\n");
561eba2a 2395}
2396
2397
2398void
2399on_zoom_in_activate (GtkMenuItem *menuitem,
2400 gpointer user_data)
2401{
2402 zoom_in((GtkWidget*)menuitem, user_data);
2403}
2404
2405
2406void
2407on_zoom_out_activate (GtkMenuItem *menuitem,
2408 gpointer user_data)
2409{
2410 zoom_out((GtkWidget*)menuitem, user_data);
2411}
2412
2413
2414void
2415on_zoom_extended_activate (GtkMenuItem *menuitem,
2416 gpointer user_data)
2417{
2418 zoom_extended((GtkWidget*)menuitem, user_data);
2419}
2420
2421
2422void
2423on_go_to_time_activate (GtkMenuItem *menuitem,
2424 gpointer user_data)
2425{
2426 go_to_time((GtkWidget*)menuitem, user_data);
2427}
2428
2429
2430void
2431on_show_time_frame_activate (GtkMenuItem *menuitem,
2432 gpointer user_data)
2433{
2434 show_time_frame((GtkWidget*)menuitem, user_data);
2435}
2436
2437
2438void
2439on_move_viewer_up_activate (GtkMenuItem *menuitem,
2440 gpointer user_data)
2441{
2442 move_up_viewer((GtkWidget*)menuitem, user_data);
2443}
2444
2445
2446void
2447on_move_viewer_down_activate (GtkMenuItem *menuitem,
2448 gpointer user_data)
2449{
2450 move_down_viewer((GtkWidget*)menuitem, user_data);
2451}
2452
2453
2454void
2455on_remove_viewer_activate (GtkMenuItem *menuitem,
2456 gpointer user_data)
2457{
2458 delete_viewer((GtkWidget*)menuitem, user_data);
2459}
2460
49bf71b5 2461void
2462on_trace_facility_activate (GtkMenuItem *menuitem,
2463 gpointer user_data)
2464{
43ed82b5 2465 g_info("Trace facility selector: %s\n", "");
49bf71b5 2466}
561eba2a 2467
abe346a3 2468
b052368a 2469/* Dispaly a file selection dialogue to let user select a library, then call
2470 * lttv_library_load().
2471 */
2472
2473void
2474on_load_library_activate (GtkMenuItem *menuitem,
2475 gpointer user_data)
2476{
2477 GError *error = NULL;
2478 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2479
2480 gchar load_module_path_alter[PATH_MAX];
2481 {
2482 GPtrArray *name;
2483 guint nb,i;
2484 gchar *load_module_path;
2485 name = g_ptr_array_new();
2486 nb = lttv_library_path_number();
2487 /* ask for the library path */
2488
2489 for(i=0;i<nb;i++){
2490 gchar *path;
2491 path = lttv_library_path_get(i);
2492 g_ptr_array_add(name, path);
2493 }
2494
93ac601b 2495 load_module_path = get_selection(mw_data,
2496 (char **)(name->pdata), name->len,
b052368a 2497 "Select a library path", "Library paths");
2498 if(load_module_path != NULL)
2499 strncpy(load_module_path_alter, load_module_path, PATH_MAX-1); // -1 for /
2500
2501 g_ptr_array_free(name, TRUE);
2502
2503 if(load_module_path == NULL) return;
2504 }
2505
2506 {
2507 /* Make sure the module path ends with a / */
2508 gchar *ptr = load_module_path_alter;
2509
2510 ptr = strchr(ptr, '\0');
2511
2512 if(*(ptr-1) != '/') {
2513 *ptr = '/';
2514 *(ptr+1) = '\0';
2515 }
2516 }
2517
2518 {
2519 /* Ask for the library to load : list files in the previously selected
2520 * directory */
2521 gchar str[PATH_MAX];
2522 gchar ** dir;
2523 gint id;
2524 GtkFileSelection * file_selector =
2525 (GtkFileSelection *)gtk_file_selection_new("Select a module");
2526 gtk_file_selection_set_filename(file_selector, load_module_path_alter);
2527 gtk_file_selection_hide_fileop_buttons(file_selector);
2528
93ac601b 2529 gtk_window_set_transient_for(GTK_WINDOW(file_selector),
2530 GTK_WINDOW(mw_data->mwindow));
2531
b052368a 2532 str[0] = '\0';
2533 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2534 switch(id){
2535 case GTK_RESPONSE_ACCEPT:
2536 case GTK_RESPONSE_OK:
2537 dir = gtk_file_selection_get_selections (file_selector);
2538 strncpy(str,dir[0],PATH_MAX);
2539 strncpy(remember_plugins_dir,dir[0],PATH_MAX);
2540 /* only keep file name */
2541 gchar *str1;
2542 str1 = strrchr(str,'/');
2543 if(str1)str1++;
2544 else{
2545 str1 = strrchr(str,'\\');
2546 str1++;
2547 }
2548#if 0
2549 /* remove "lib" */
2550 if(*str1 == 'l' && *(str1+1)== 'i' && *(str1+2)=='b')
2551 str1=str1+3;
2552 remove info after . */
2553 {
2554 gchar *str2 = str1;
2555
2556 str2 = strrchr(str2, '.');
2557 if(str2 != NULL) *str2 = '\0';
2558 }
2559 lttv_module_require(str1, &error);
2560#endif //0
2561 lttv_library_load(str1, &error);
2eef04b5 2562 if(error != NULL) g_warning("%s", error->message);
56e5a0f7 2563 else g_info("Load library: %s\n", str);
b052368a 2564 g_strfreev(dir);
2565 case GTK_RESPONSE_REJECT:
2566 case GTK_RESPONSE_CANCEL:
2567 default:
2568 gtk_widget_destroy((GtkWidget*)file_selector);
2569 break;
2570 }
2571
2572 }
2573
2574
2575
2576}
2577
2578
2579/* Display all loaded modules, let user to select a module to unload
2580 * by calling lttv_module_unload
2581 */
2582
2583void
2584on_unload_library_activate (GtkMenuItem *menuitem,
2585 gpointer user_data)
2586{
2587 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2588
2eef04b5 2589 LttvLibrary *library = NULL;
b052368a 2590
2eef04b5 2591 GPtrArray *name;
2592 guint nb,i;
2593 gchar *lib_name;
2594 name = g_ptr_array_new();
2595 nb = lttv_library_number();
2596 LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
2597 /* ask for the library name */
2598
2599 for(i=0;i<nb;i++){
2600 LttvLibrary *iter_lib = lttv_library_get(i);
2601 lttv_library_info(iter_lib, &lib_info[i]);
2602
2603 gchar *path = lib_info[i].name;
2604 g_ptr_array_add(name, path);
2605 }
93ac601b 2606 lib_name = get_selection(mw_data, (char **)(name->pdata), name->len,
2eef04b5 2607 "Select a library", "Libraries");
2608 if(lib_name != NULL) {
b052368a 2609 for(i=0;i<nb;i++){
2eef04b5 2610 if(strcmp(lib_name, lib_info[i].name) == 0) {
2611 library = lttv_library_get(i);
2612 break;
b052368a 2613 }
2614 }
b052368a 2615 }
2eef04b5 2616 g_ptr_array_free(name, TRUE);
2617 g_free(lib_info);
2618
2619 if(lib_name == NULL) return;
2620
2621 if(library != NULL) lttv_library_unload(library);
b052368a 2622}
2623
2624
abe346a3 2625/* Dispaly a file selection dialogue to let user select a module, then call
b052368a 2626 * lttv_module_require().
abe346a3 2627 */
2628
561eba2a 2629void
2630on_load_module_activate (GtkMenuItem *menuitem,
2631 gpointer user_data)
2632{
b052368a 2633 GError *error = NULL;
bca3b81f 2634 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
b052368a 2635
2eef04b5 2636 LttvLibrary *library = NULL;
b052368a 2637 {
2638 GPtrArray *name;
2639 guint nb,i;
2640 gchar *lib_name;
2641 name = g_ptr_array_new();
2642 nb = lttv_library_number();
2643 LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
2644 /* ask for the library name */
2645
2646 for(i=0;i<nb;i++){
2647 LttvLibrary *iter_lib = lttv_library_get(i);
2648 lttv_library_info(iter_lib, &lib_info[i]);
2649
2650 gchar *path = lib_info[i].name;
2651 g_ptr_array_add(name, path);
2652 }
93ac601b 2653 lib_name = get_selection(mw_data,(char **)(name->pdata), name->len,
b052368a 2654 "Select a library", "Libraries");
2655 if(lib_name != NULL) {
2656 for(i=0;i<nb;i++){
2657 if(strcmp(lib_name, lib_info[i].name) == 0) {
2658 library = lttv_library_get(i);
2659 break;
2660 }
3872a20e 2661 }
b052368a 2662 }
2663 g_ptr_array_free(name, TRUE);
2664 g_free(lib_info);
2665
2666 if(lib_name == NULL) return;
36b3c068 2667 }
b052368a 2668
2669 //LttvModule *module;
2670 gchar module_name_out[PATH_MAX];
2671 {
2672 /* Ask for the module to load : list modules in the selected lib */
2673 GPtrArray *name;
2674 guint nb,i;
2675 gchar *module_name;
bbbd6c25 2676 nb = lttv_library_module_number(library);
b052368a 2677 LttvModuleInfo *module_info = g_new(LttvModuleInfo,nb);
2678 name = g_ptr_array_new();
b052368a 2679 /* ask for the module name */
2680
2681 for(i=0;i<nb;i++){
2682 LttvModule *iter_module = lttv_library_module_get(library, i);
2683 lttv_module_info(iter_module, &module_info[i]);
2684
2685 gchar *path = module_info[i].name;
2686 g_ptr_array_add(name, path);
2687 }
93ac601b 2688 module_name = get_selection(mw_data, (char **)(name->pdata), name->len,
b052368a 2689 "Select a module", "Modules");
2690 if(module_name != NULL) {
2691 for(i=0;i<nb;i++){
2692 if(strcmp(module_name, module_info[i].name) == 0) {
2693 strncpy(module_name_out, module_name, PATH_MAX);
2694 //module = lttv_library_module_get(i);
2695 break;
2696 }
2697 }
2698 }
2699
2700 g_ptr_array_free(name, TRUE);
2701 g_free(module_info);
2702
2703 if(module_name == NULL) return;
2704 }
2705
2706 lttv_module_require(module_name_out, &error);
2eef04b5 2707 if(error != NULL) g_warning("%s", error->message);
56e5a0f7 2708 else g_info("Load module: %s", module_name_out);
b052368a 2709
2710
2711#if 0
2712 {
2713
2714
2715 gchar str[PATH_MAX];
2716 gchar ** dir;
2717 gint id;
2718 GtkFileSelection * file_selector =
2719 (GtkFileSelection *)gtk_file_selection_new("Select a module");
2720 gtk_file_selection_set_filename(file_selector, load_module_path_alter);
2721 gtk_file_selection_hide_fileop_buttons(file_selector);
2722
2723 str[0] = '\0';
2724 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2725 switch(id){
2726 case GTK_RESPONSE_ACCEPT:
2727 case GTK_RESPONSE_OK:
2728 dir = gtk_file_selection_get_selections (file_selector);
2729 strncpy(str,dir[0],PATH_MAX);
2730 strncpy(remember_plugins_dir,dir[0],PATH_MAX);
2731 {
2732 /* only keep file name */
2733 gchar *str1;
2734 str1 = strrchr(str,'/');
2735 if(str1)str1++;
2736 else{
2737 str1 = strrchr(str,'\\');
2738 str1++;
2739 }
2740#if 0
2741 /* remove "lib" */
2742 if(*str1 == 'l' && *(str1+1)== 'i' && *(str1+2)=='b')
2743 str1=str1+3;
2744 remove info after . */
2745 {
2746 gchar *str2 = str1;
2747
2748 str2 = strrchr(str2, '.');
2749 if(str2 != NULL) *str2 = '\0';
2750 }
2751 lttv_module_require(str1, &error);
2752#endif //0
2753 lttv_library_load(str1, &error);
2754 if(error != NULL) g_warning(error->message);
56e5a0f7 2755 else g_info("Load library: %s\n", str);
b052368a 2756 g_strfreev(dir);
2757 case GTK_RESPONSE_REJECT:
2758 case GTK_RESPONSE_CANCEL:
2759 default:
2760 gtk_widget_destroy((GtkWidget*)file_selector);
2761 break;
2762 }
2763
2764 }
2765#endif //0
2766
2767
561eba2a 2768}
2769
2770
b052368a 2771
abe346a3 2772/* Display all loaded modules, let user to select a module to unload
2773 * by calling lttv_module_unload
2774 */
2775
561eba2a 2776void
2777on_unload_module_activate (GtkMenuItem *menuitem,
2778 gpointer user_data)
2779{
bca3b81f 2780 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
08b1c66e 2781
43ed82b5 2782 LttvLibrary *library = NULL;
b052368a 2783 {
2784 GPtrArray *name;
2785 guint nb,i;
2786 gchar *lib_name;
2787 name = g_ptr_array_new();
2788 nb = lttv_library_number();
2789 LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
2790 /* ask for the library name */
36b3c068 2791
36b3c068 2792 for(i=0;i<nb;i++){
b052368a 2793 LttvLibrary *iter_lib = lttv_library_get(i);
2794 lttv_library_info(iter_lib, &lib_info[i]);
2795
2796 gchar *path = lib_info[i].name;
2797 g_ptr_array_add(name, path);
2798 }
93ac601b 2799 lib_name = get_selection(mw_data, (char **)(name->pdata), name->len,
b052368a 2800 "Select a library", "Libraries");
2801 if(lib_name != NULL) {
2802 for(i=0;i<nb;i++){
2803 if(strcmp(lib_name, lib_info[i].name) == 0) {
2804 library = lttv_library_get(i);
2805 break;
2806 }
36b3c068 2807 }
b052368a 2808 }
2809 g_ptr_array_free(name, TRUE);
2810 g_free(lib_info);
2811
2812 if(lib_name == NULL) return;
36b3c068 2813 }
2814
2eef04b5 2815 LttvModule *module = NULL;
b052368a 2816 {
2817 /* Ask for the module to load : list modules in the selected lib */
2818 GPtrArray *name;
2819 guint nb,i;
2820 gchar *module_name;
6d677a86 2821 nb = lttv_library_module_number(library);
b052368a 2822 LttvModuleInfo *module_info = g_new(LttvModuleInfo,nb);
2823 name = g_ptr_array_new();
b052368a 2824 /* ask for the module name */
2825
2826 for(i=0;i<nb;i++){
2827 LttvModule *iter_module = lttv_library_module_get(library, i);
2828 lttv_module_info(iter_module, &module_info[i]);
2829
2830 gchar *path = module_info[i].name;
2831 if(module_info[i].use_count > 0) g_ptr_array_add(name, path);
2832 }
93ac601b 2833 module_name = get_selection(mw_data, (char **)(name->pdata), name->len,
b052368a 2834 "Select a module", "Modules");
2835 if(module_name != NULL) {
2836 for(i=0;i<nb;i++){
2837 if(strcmp(module_name, module_info[i].name) == 0) {
2838 module = lttv_library_module_get(library, i);
2839 break;
2840 }
2841 }
2842 }
2843
2844 g_ptr_array_free(name, TRUE);
2845 g_free(module_info);
2846
2847 if(module_name == NULL) return;
2848 }
2849
b052368a 2850 LttvModuleInfo module_info;
2851 lttv_module_info(module, &module_info);
56e5a0f7 2852 g_info("Release module: %s\n", module_info.name);
fce9a2fc 2853
2854 lttv_module_release(module);
561eba2a 2855}
2856
2857
b052368a 2858/* Display a directory dialogue to let user select a path for library searching
abe346a3 2859 */
2860
561eba2a 2861void
b052368a 2862on_add_library_search_path_activate (GtkMenuItem *menuitem,
561eba2a 2863 gpointer user_data)
2864{
93ac601b 2865 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
0a946563 2866 //GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select library path");
2867 GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a trace");
2868 gtk_widget_hide( (file_selector)->file_list->parent) ;
93ac601b 2869
2870 gtk_window_set_transient_for(GTK_WINDOW(file_selector),
2871 GTK_WINDOW(mw_data->mwindow));
2872
67b98724 2873 const char * dir;
fc188b78 2874 gint id;
2875
3658a338 2876 if(remember_plugins_dir[0] != '\0')
0a946563 2877 gtk_file_selection_set_filename(file_selector, remember_plugins_dir);
fc188b78 2878
68b48a45 2879 id = gtk_dialog_run(GTK_DIALOG(file_selector));
fc188b78 2880 switch(id){
2881 case GTK_RESPONSE_ACCEPT:
2882 case GTK_RESPONSE_OK:
0a946563 2883 dir = gtk_file_selection_get_filename (file_selector);
a1a2b649 2884 strncpy(remember_plugins_dir,dir,PATH_MAX);
2885 strncat(remember_plugins_dir,"/",PATH_MAX);
08b1c66e 2886 lttv_library_path_add(dir);
fc188b78 2887 case GTK_RESPONSE_REJECT:
2888 case GTK_RESPONSE_CANCEL:
2889 default:
68b48a45 2890 gtk_widget_destroy((GtkWidget*)file_selector);
fc188b78 2891 break;
6b1d3120 2892 }
561eba2a 2893}
2894
2895
b052368a 2896/* Display a directory dialogue to let user select a path for library searching
2897 */
2898
2899void
2900on_remove_library_search_path_activate (GtkMenuItem *menuitem,
2901 gpointer user_data)
2902{
2903 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
2904
2905 const char *lib_path;
2906 {
2907 GPtrArray *name;
2908 guint nb,i;
b052368a 2909 name = g_ptr_array_new();
2910 nb = lttv_library_path_number();
2911 /* ask for the library name */
2912
2913 for(i=0;i<nb;i++){
2914 gchar *path = lttv_library_path_get(i);
2915 g_ptr_array_add(name, path);
2916 }
93ac601b 2917 lib_path = get_selection(mw_data, (char **)(name->pdata), name->len,
b052368a 2918 "Select a library path", "Library paths");
2919
2920 g_ptr_array_free(name, TRUE);
2921
2922 if(lib_path == NULL) return;
2923 }
2924
2925 lttv_library_path_remove(lib_path);
2926}
2927
561eba2a 2928void
2929on_color_activate (GtkMenuItem *menuitem,
2930 gpointer user_data)
2931{
56e5a0f7 2932 g_info("Color\n");
561eba2a 2933}
2934
2935
561eba2a 2936void
2937on_save_configuration_activate (GtkMenuItem *menuitem,
2938 gpointer user_data)
2939{
56e5a0f7 2940 g_info("Save configuration\n");
561eba2a 2941}
2942
2943
2944void
2945on_content_activate (GtkMenuItem *menuitem,
2946 gpointer user_data)
2947{
7e18bb76
F
2948 char* filename = NULL,
2949 *path;
2950 GdkScreen *screen;
2951 const char* relativePath = "doc/user/user_guide/html/index.html";
2952 filename = g_build_filename (g_get_current_dir(), relativePath, NULL);
2953 path = g_strdup_printf ("ghelp://%s", filename);
2954
2955 screen = gdk_screen_get_default();
2956 gtk_show_uri (screen, path, gtk_get_current_event_time(), NULL);
2957
2958 g_free(filename);
2959 g_free(path);
56e5a0f7 2960 g_info("Content\n");
561eba2a 2961}
2962
2963
51ef553b 2964static void
2965on_about_close_activate (GtkButton *button,
2966 gpointer user_data)
2967{
2968 GtkWidget *about_widget = GTK_WIDGET(user_data);
2969
2970 gtk_widget_destroy(about_widget);
2971}
2972
561eba2a 2973void
2974on_about_activate (GtkMenuItem *menuitem,
2975 gpointer user_data)
2976{
51ef553b 2977 MainWindow *main_window = get_window_data_struct(GTK_WIDGET(menuitem));
2978 GtkWidget *window_widget = main_window->mwindow;
2979 GtkWidget *about_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2980 GtkWindow *about_window = GTK_WINDOW(about_widget);
51ef553b 2981
2982 gtk_window_set_title(about_window, "About Linux Trace Toolkit");
2983
2984 gtk_window_set_resizable(about_window, FALSE);
f5f1a04e 2985 gtk_window_set_transient_for(about_window, GTK_WINDOW(window_widget));
51ef553b 2986 gtk_window_set_destroy_with_parent(about_window, TRUE);
2987 gtk_window_set_modal(about_window, FALSE);
2988
2989 /* Put the about window at the center of the screen */
7e18bb76
F
2990 gtk_window_set_position(about_window, GTK_WIN_POS_CENTER_ALWAYS);
2991
51ef553b 2992 GtkWidget *vbox = gtk_vbox_new(FALSE, 1);
2993
2994 gtk_container_add(GTK_CONTAINER(about_widget), vbox);
2995
51ef553b 2996 /* Text to show */
2997 GtkWidget *label1 = gtk_label_new("");
c8bba5fa 2998 gtk_misc_set_padding(GTK_MISC(label1), 10, 20);
51ef553b 2999 gtk_label_set_markup(GTK_LABEL(label1), "\
f5f1a04e 3000<big>Linux Trace Toolkit " VERSION "</big>");
51ef553b 3001 gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_CENTER);
3002
3003 GtkWidget *label2 = gtk_label_new("");
c8bba5fa 3004 gtk_misc_set_padding(GTK_MISC(label2), 10, 20);
51ef553b 3005 gtk_label_set_markup(GTK_LABEL(label2), "\
51ef553b 3006Contributors :\n\
3007\n\
3008Michel Dagenais (New trace format, lttv main)\n\
4b601423 3009Mathieu Desnoyers (Kernel Tracer, Directory structure, build with automake/conf,\n\
ef26c1ea 3010 lttv gui, control flow view, gui cooperative trace reading\n\
4b7bd7e1 3011 scheduler with interruptible foreground and background\n\
57ca4914 3012 computation, detailed event list (rewrite), trace reading\n\
3013 library (rewrite))\n\
7d2855bf 3014Benoit Des Ligneris, Eric Clement (Cluster adaptation, work in progress)\n\
51ef553b 3015Xang-Xiu Yang (new trace reading library and converter, lttv gui, \n\
3016 detailed event list and statistics view)\n\
e8ac6a5e 3017Tom Zanussi (RelayFS)\n\
3018\n\
f5f1a04e 3019Inspired from the original Linux Trace Toolkit Visualizer made by\n\
e8ac6a5e 3020Karim Yaghmour");
c8bba5fa 3021
3022 GtkWidget *label3 = gtk_label_new("");
3023 gtk_label_set_markup(GTK_LABEL(label3), "\
f5f1a04e 3024Linux Trace Toolkit Viewer, Copyright (C) 2004, 2005, 2006\n\
7d2855bf 3025 Michel Dagenais\n\
e8ac6a5e 3026 Mathieu Desnoyers\n\
3027 Xang-Xiu Yang\n\
c8bba5fa 3028Linux Trace Toolkit comes with ABSOLUTELY NO WARRANTY.\n\
3029This is free software, and you are welcome to redistribute it\n\
3030under certain conditions. See COPYING for details.");
3031 gtk_misc_set_padding(GTK_MISC(label3), 10, 20);
3032
51ef553b 3033 gtk_box_pack_start_defaults(GTK_BOX(vbox), label1);
3034 gtk_box_pack_start_defaults(GTK_BOX(vbox), label2);
c8bba5fa 3035 gtk_box_pack_start_defaults(GTK_BOX(vbox), label3);
51ef553b 3036
3037 GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
3038 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
3039 GtkWidget *close_button = gtk_button_new_with_mnemonic("_Close");
3040 gtk_box_pack_end(GTK_BOX(hbox), close_button, FALSE, FALSE, 0);
3041 gtk_container_set_border_width(GTK_CONTAINER(close_button), 20);
3042
3043 g_signal_connect(G_OBJECT(close_button), "clicked",
3044 G_CALLBACK(on_about_close_activate),
3045 (gpointer)about_widget);
3046
3047 gtk_widget_show_all(about_widget);
561eba2a 3048}
3049
3050
3051void
3052on_button_new_clicked (GtkButton *button,
3053 gpointer user_data)
3054{
6f7ad7ae 3055 create_new_window((GtkWidget*)button, user_data, TRUE);
561eba2a 3056}
3057
2901f314 3058void
3059on_button_new_tab_clicked (GtkButton *button,
3060 gpointer user_data)
3061{
3062 create_new_tab((GtkWidget*)button, user_data);
3063}
561eba2a 3064
3065void
3066on_button_open_clicked (GtkButton *button,
3067 gpointer user_data)
3068{
e865422c 3069#ifdef UNFINISHED_FEATURE
561eba2a 3070 open_traceset((GtkWidget*)button, user_data);
e865422c 3071#endif
561eba2a 3072}
3073
3074
3075void
3076on_button_add_trace_clicked (GtkButton *button,
3077 gpointer user_data)
3078{
3079 add_trace((GtkWidget*)button, user_data);
3080}
3081
3082
3083void
3084on_button_remove_trace_clicked (GtkButton *button,
3085 gpointer user_data)
3086{
3087 remove_trace((GtkWidget*)button, user_data);
3088}
3089
9878c8a4 3090void
3091on_button_redraw_clicked (GtkButton *button,
3092 gpointer user_data)
3093{
3094 redraw((GtkWidget*)button, user_data);
3095}
3096
3097void
3098on_button_continue_processing_clicked (GtkButton *button,
3099 gpointer user_data)
3100{
3101 continue_processing((GtkWidget*)button, user_data);
3102}
3103
3104void
3105on_button_stop_processing_clicked (GtkButton *button,
3106 gpointer user_data)
3107{
3108 stop_processing((GtkWidget*)button, user_data);
3109}
3110
3111
561eba2a 3112
3113void
3114on_button_save_clicked (GtkButton *button,
3115 gpointer user_data)
3116{
3117 save((GtkWidget*)button, user_data);
3118}
3119
3120
3121void
3122on_button_save_as_clicked (GtkButton *button,
3123 gpointer user_data)
3124{
3125 save_as((GtkWidget*)button, user_data);
3126}
3127
3128
3129void
3130on_button_zoom_in_clicked (GtkButton *button,
3131 gpointer user_data)
3132{
3133 zoom_in((GtkWidget*)button, user_data);
3134}
3135
3136
3137void
3138on_button_zoom_out_clicked (GtkButton *button,
3139 gpointer user_data)
3140{
3141 zoom_out((GtkWidget*)button, user_data);
3142}
3143
3144
3145void
3146on_button_zoom_extended_clicked (GtkButton *button,
3147 gpointer user_data)
3148{
3149 zoom_extended((GtkWidget*)button, user_data);
3150}
3151
3152
3153void
3154on_button_go_to_time_clicked (GtkButton *button,
3155 gpointer user_data)
3156{
3157 go_to_time((GtkWidget*)button, user_data);
3158}
3159
3160
3161void
3162on_button_show_time_frame_clicked (GtkButton *button,
3163 gpointer user_data)
3164{
3165 show_time_frame((GtkWidget*)button, user_data);
3166}
3167
3168
3169void
3170on_button_move_up_clicked (GtkButton *button,
3171 gpointer user_data)
3172{
3173 move_up_viewer((GtkWidget*)button, user_data);
3174}
3175
3176
3177void
3178on_button_move_down_clicked (GtkButton *button,
3179 gpointer user_data)
3180{
3181 move_down_viewer((GtkWidget*)button, user_data);
3182}
3183
3184
3185void
3186on_button_delete_viewer_clicked (GtkButton *button,
3187 gpointer user_data)
3188{
3189 delete_viewer((GtkWidget*)button, user_data);
3190}
3191
3192void
2d262115 3193on_MWindow_destroy (GtkWidget *widget,
561eba2a 3194 gpointer user_data)
3195{
2d262115 3196 MainWindow *main_window = get_window_data_struct(widget);
ef68c3ac 3197 LttvIAttribute *attributes = main_window->attributes;
3198 LttvAttributeValue value;
8f318283 3199 gboolean retval;
e4d09234 3200
ef68c3ac 3201 //This is unnecessary, since widgets will be destroyed
3202 //by the main window widget anyway.
3203 //remove_all_menu_toolbar_constructors(main_window, NULL);
3204
8f318283
BP
3205 retval= lttv_iattribute_find_by_path(attributes, "viewers/menu",
3206 LTTV_POINTER, &value);
3207 g_assert(retval);
ef68c3ac 3208 lttv_menus_destroy((LttvMenus*)*(value.v_pointer));
3209
8f318283
BP
3210 retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar",
3211 LTTV_POINTER, &value);
3212 g_assert(retval);
ef68c3ac 3213 lttv_toolbars_destroy((LttvToolbars*)*(value.v_pointer));
2d262115 3214
ef68c3ac 3215 g_object_unref(main_window->attributes);
3216 g_main_window_list = g_slist_remove(g_main_window_list, main_window);
561eba2a 3217
56e5a0f7 3218 g_info("There are now : %d windows\n",g_slist_length(g_main_window_list));
2d262115 3219 if(g_slist_length(g_main_window_list) == 0)
d27948a3 3220 mainwindow_quit();
561eba2a 3221}
3222
58eecf4a 3223gboolean
3224on_MWindow_configure (GtkWidget *widget,
3225 GdkEventConfigure *event,
3226 gpointer user_data)
3227{
bd24a9af 3228 // MD : removed time width modification upon resizing of the main window.
3229 // The viewers will redraw themselves completely, without time interval
3230 // modification.
3231/* while(tab){
58eecf4a 3232 if(mw_data->window_width){
3233 time_span = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->Time_Span ;
3234 time_win = tab->time_window;
3235 ratio = width / mw_data->window_width;
3236 tab->time_window.time_width = ltt_time_mul(time_win.time_width,ratio);
3237 time = ltt_time_sub(time_span->endTime, time_win.start_time);
3238 if(ltt_time_compare(time, tab->time_window.time_width) < 0){
3239 tab->time_window.time_width = time;
3240 }
3241 }
3242 tab = tab->next;
3243 }
3244
3245 mw_data->window_width = (int)width;
bd24a9af 3246 */
58eecf4a 3247 return FALSE;
3248}
561eba2a 3249
abe346a3 3250/* Set current tab
3251 */
3252
561eba2a 3253void
3254on_MNotebook_switch_page (GtkNotebook *notebook,
3255 GtkNotebookPage *page,
3256 guint page_num,
3257 gpointer user_data)
3258{
47cd8a09 3259
561eba2a 3260}
3261
abe346a3 3262
e800cf84 3263void time_change_manager (Tab *tab,
3264 TimeWindow new_time_window)
451aaf27
FD
3265{
3266
e800cf84 3267 /* Only one source of time change */
3268 if(tab->time_manager_lock == TRUE) return;
3269
3270 tab->time_manager_lock = TRUE;
451aaf27
FD
3271 TimeInterval time_span;
3272
3273 LttvTraceset *ts = tab->traceset_info->traceset;
3274 time_span.start_time =ltt_time_from_uint64( lttv_traceset_get_timestamp_begin(ts));
3275 time_span.end_time = ltt_time_from_uint64(lttv_traceset_get_timestamp_end(ts));
3276
e800cf84 3277
e800cf84 3278 LttTime start_time = new_time_window.start_time;
6f26fc38 3279 LttTime end_time = new_time_window.end_time;
e800cf84 3280
a998b781 3281 g_assert(ltt_time_compare(start_time, end_time) < 0);
3282
e800cf84 3283 /* Set scrollbar */
3284 GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
451aaf27
FD
3285 LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time);
3286
e800cf84 3287#if 0
3288 gtk_range_set_increments(GTK_RANGE(tab->scrollbar),
3289 ltt_time_to_double(new_time_window.time_width)
3290 / SCROLL_STEP_PER_PAGE
3291 * NANOSECONDS_PER_SECOND, /* step increment */
3292 ltt_time_to_double(new_time_window.time_width)
3293 * NANOSECONDS_PER_SECOND); /* page increment */
3294 gtk_range_set_range(GTK_RANGE(tab->scrollbar),
3295 0.0, /* lower */
3296 ltt_time_to_double(upper)
3297 * NANOSECONDS_PER_SECOND); /* upper */
3298#endif //0
3299 g_object_set(G_OBJECT(adjustment),
3300 "lower",
3301 0.0, /* lower */
3302 "upper",
c74e0cf9 3303 ltt_time_to_double(upper), /* upper */
e800cf84 3304 "step_increment",
a18124ff 3305 new_time_window.time_width_double
c74e0cf9 3306 / SCROLL_STEP_PER_PAGE, /* step increment */
e800cf84 3307 "page_increment",
a18124ff 3308 new_time_window.time_width_double,
c74e0cf9 3309 /* page increment */
e800cf84 3310 "page_size",
a18124ff 3311 new_time_window.time_width_double, /* page size */
e800cf84 3312 NULL);
3313 gtk_adjustment_changed(adjustment);
3314
3315 // g_object_set(G_OBJECT(adjustment),
3316 // "value",
3317 // ltt_time_to_double(
3318 // ltt_time_sub(start_time, time_span.start_time))
c74e0cf9 3319 // , /* value */
e800cf84 3320 // NULL);
3321 //gtk_adjustment_value_changed(adjustment);
3322 gtk_range_set_value(GTK_RANGE(tab->scrollbar),
3323 ltt_time_to_double(
c74e0cf9 3324 ltt_time_sub(start_time, time_span.start_time)) /* value */);
e800cf84 3325
3326 /* set the time bar. */
e800cf84 3327
6f26fc38 3328
4172f013
YB
3329 timebar_set_minmax_time(TIMEBAR(tab->MTimebar),
3330 &time_span.start_time,
3331 &time_span.end_time );
3332 timebar_set_start_time(TIMEBAR(tab->MTimebar),&start_time);
3333 timebar_set_end_time(TIMEBAR(tab->MTimebar),&end_time);
e800cf84 3334
e800cf84 3335
58de9fc1 3336
4172f013
YB
3337 /* call viewer hooks for new time window */
3338 set_time_window(tab, &new_time_window);
58de9fc1 3339
4172f013 3340 tab->time_manager_lock = FALSE;
451aaf27
FD
3341
3342
58de9fc1 3343}
3344
58de9fc1 3345
58de9fc1 3346
3347
e800cf84 3348
3349void current_time_change_manager (Tab *tab,
3350 LttTime new_current_time)
3351{
3352 /* Only one source of time change */
3353 if(tab->current_time_manager_lock == TRUE) return;
3354
3355 tab->current_time_manager_lock = TRUE;
3356
4172f013 3357 timebar_set_current_time(TIMEBAR(tab->MTimebar), &new_current_time);
e800cf84 3358
db8bc917 3359 set_current_time(tab, &new_current_time);
e800cf84 3360
3361 tab->current_time_manager_lock = FALSE;
3362}
3363
9a366873 3364void current_position_change_manager(Tab *tab, LttvTracesetPosition *pos)
5290ec02 3365{
9a366873 3366 lttv_traceset_seek_to_position( pos);
5290ec02 3367
9a366873 3368 LttTime new_time = lttv_traceset_position_get_time(pos);
16e2bb34 3369 /* Put the context in a state coherent position */
9a366873
FD
3370#ifdef BABEL_CLEANUP
3371 lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc, ltt_time_zero);
3372#endif /* BABEL_CLEANUP */
5290ec02 3373 current_time_change_manager(tab, new_time);
3374
3375 set_current_position(tab, pos);
3376}
3377
4172f013
YB
3378static void on_timebar_starttime_changed(Timebar *timebar,
3379 gpointer user_data)
e800cf84 3380{
4172f013 3381 Tab *tab = (Tab *)user_data;
9aaa78dc
FD
3382 LttvTraceset * ts =tab->traceset_info->traceset;
3383 TimeInterval time_span = lttv_traceset_get_time_span(ts);
4172f013
YB
3384
3385 TimeWindow new_time_window = tab->time_window;
3386 new_time_window.start_time = timebar_get_start_time(timebar);
3387
3388 LttTime end_time = new_time_window.end_time;
3389
3390 /* TODO ybrosseau 2010-12-02: This if should have been checked
3391 by the timebar already */
3392 if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
3393 /* Then, we must push back end time : keep the same time width
3394 * if possible, else end traceset time */
3395 end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time,
3396 new_time_window.time_width),
3397 time_span.end_time);
3398 }
3399
3400 /* Fix the time width to fit start time and end time */
3401 new_time_window.time_width = ltt_time_sub(end_time,
3402 new_time_window.start_time);
3403
3404 new_time_window.time_width_double =
3405 ltt_time_to_double(new_time_window.time_width);
3406
3407 new_time_window.end_time = end_time;
3408
3409 /* Notify the time_manager */
3410 time_change_manager(tab, new_time_window);
9aaa78dc 3411
e800cf84 3412}
3413
4172f013
YB
3414static void on_timebar_endtime_changed(Timebar *timebar,
3415 gpointer user_data)
e800cf84 3416{
4172f013 3417 Tab *tab = (Tab *)user_data;
9aaa78dc
FD
3418 LttvTraceset * ts =tab->traceset_info->traceset;
3419 TimeInterval time_span = lttv_traceset_get_time_span(ts);
e800cf84 3420
4172f013
YB
3421 TimeWindow new_time_window = tab->time_window;
3422
3423 LttTime end_time = timebar_get_end_time(timebar);
3424
3425 /* TODO ybrosseau 2010-12-02: This if should have been
3426 checked by the timebar already */
3427 if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
3428 /* Then, we must push front start time : keep the same time
3429 width if possible, else end traceset time */
3430 new_time_window.start_time = LTT_TIME_MAX(
3431 ltt_time_sub(end_time,
3432 new_time_window.time_width),
3433 time_span.start_time);
3434 }
e800cf84 3435
4172f013
YB
3436 /* Fix the time width to fit start time and end time */
3437 new_time_window.time_width = ltt_time_sub(end_time,
3438 new_time_window.start_time);
3439
3440 new_time_window.time_width_double =
3441 ltt_time_to_double(new_time_window.time_width);
3442
3443 new_time_window.end_time = end_time;
3444
3445 /* Notify the time_manager */
9aaa78dc 3446 time_change_manager(tab, new_time_window);
4172f013
YB
3447}
3448static void on_timebar_currenttime_changed(Timebar *timebar,
3449 gpointer user_data)
3450{
3451 Tab *tab = (Tab *)user_data;
3452
3453 LttTime new_current_time = timebar_get_current_time(timebar);
3454
3455 current_time_change_manager(tab, new_current_time);
3456}
e800cf84 3457
b052368a 3458void scroll_value_changed_cb(GtkWidget *scrollbar,
3459 gpointer user_data)
3460{
3461 Tab *tab = (Tab *)user_data;
e800cf84 3462 TimeWindow new_time_window;
b052368a 3463 LttTime time;
3464 GtkAdjustment *adjust = gtk_range_get_adjustment(GTK_RANGE(scrollbar));
3465 gdouble value = gtk_adjustment_get_value(adjust);
e800cf84 3466 // gdouble upper, lower, ratio, page_size;
3467 gdouble page_size;
9aaa78dc
FD
3468
3469 LttvTraceset * ts = tab->traceset_info->traceset;
3470 TimeInterval time_span = lttv_traceset_get_time_span(ts);
b052368a 3471
c74e0cf9 3472 time = ltt_time_add(ltt_time_from_double(value),
e800cf84 3473 time_span.start_time);
3474
3475 new_time_window.start_time = time;
3476
3477 page_size = adjust->page_size;
3478
3479 new_time_window.time_width =
c74e0cf9 3480 ltt_time_from_double(page_size);
e800cf84 3481
a18124ff 3482 new_time_window.time_width_double =
3483 page_size;
3484
6f26fc38 3485 new_time_window.end_time = ltt_time_add(new_time_window.start_time,
3486 new_time_window.time_width);
3487
e800cf84 3488
3489 time_change_manager(tab, new_time_window);
9aaa78dc 3490
e800cf84 3491#if 0
b052368a 3492 //time_window = tab->time_window;
3493
b052368a 3494 lower = adjust->lower;
3495 upper = adjust->upper;
3496 ratio = (value - lower) / (upper - lower);
2b5cc5a5 3497 g_info("lower %lu, upper %lu, value %lu, ratio %lu", lower, upper, value, ratio);
b052368a 3498
3499 //time = ltt_time_sub(time_span->end_time, time_span->start_time);
3500 //time = ltt_time_mul(time, (float)ratio);
3501 //time = ltt_time_add(time_span->start_time, time);
c74e0cf9 3502 time = ltt_time_add(ltt_time_from_double(value),
b9a010a2 3503 time_span.start_time);
b052368a 3504
3505 time_window.start_time = time;
3506
3507 page_size = adjust->page_size;
3508
3509 time_window.time_width =
c74e0cf9 3510 ltt_time_from_double(page_size);
b9a010a2 3511 //time = ltt_time_sub(time_span.end_time, time);
b052368a 3512 //if(ltt_time_compare(time,time_window.time_width) < 0){
3513 // time_window.time_width = time;
3514 //}
3515
3516 /* call viewer hooks for new time window */
3517 set_time_window(tab, &time_window);
e800cf84 3518#endif //0
9aaa78dc 3519
b052368a 3520}
3521
3522
abe346a3 3523/* Display a dialogue showing all eventtypes and traces, let user to select the interested
3524 * eventtypes, tracefiles and traces (filter)
3525 */
3526
abe346a3 3527/* Select a trace which will be removed from traceset
3528 */
3529
93ac601b 3530char * get_remove_trace(MainWindow *mw_data,
3531 char ** all_trace_name, int nb_trace)
2176f952 3532{
93ac601b 3533 return get_selection(mw_data, all_trace_name, nb_trace,
2176f952 3534 "Select a trace", "Trace pathname");
3535}
abe346a3 3536
3537
b052368a 3538/* Select a module which will be loaded
3539 */
3540
93ac601b 3541char * get_load_module(MainWindow *mw_data,
3542 char ** load_module_name, int nb_module)
b052368a 3543{
93ac601b 3544 return get_selection(mw_data, load_module_name, nb_module,
b052368a 3545 "Select a module to load", "Module name");
3546}
3547
3548
3549
3550
abe346a3 3551/* Select a module which will be unloaded
3552 */
3553
93ac601b 3554char * get_unload_module(MainWindow *mw_data,
3555 char ** loaded_module_name, int nb_module)
2176f952 3556{
93ac601b 3557 return get_selection(mw_data, loaded_module_name, nb_module,
b052368a 3558 "Select a module to unload", "Module name");
2176f952 3559}
3560
abe346a3 3561
3562/* Display a dialogue which shows all selectable items, let user to
3563 * select one of them
3564 */
3565
93ac601b 3566char * get_selection(MainWindow *mw_data,
3567 char ** loaded_module_name, int nb_module,
3568 char *title, char * column_title)
36b3c068 3569{
3570 GtkWidget * dialogue;
3571 GtkWidget * scroll_win;
3572 GtkWidget * tree;
3573 GtkListStore * store;
3574 GtkTreeViewColumn * column;
3575 GtkCellRenderer * renderer;
3576 GtkTreeSelection * select;
3577 GtkTreeIter iter;
3578 gint id, i;
3579 char * unload_module_name = NULL;
3580
2176f952 3581 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 3582 NULL,
3583 GTK_DIALOG_MODAL,
3584 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
3585 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
3586 NULL);
3587 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
93ac601b 3588 gtk_window_set_transient_for(GTK_WINDOW(dialogue),
3589 GTK_WINDOW(mw_data->mwindow));
36b3c068 3590
3591 scroll_win = gtk_scrolled_window_new (NULL, NULL);
3592 gtk_widget_show ( scroll_win);
3593 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
3594 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3595
3596 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
3597 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
3598 gtk_widget_show ( tree);
3599 g_object_unref (G_OBJECT (store));
3600
3601 renderer = gtk_cell_renderer_text_new ();
2176f952 3602 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 3603 renderer,
3604 "text", MODULE_COLUMN,
3605 NULL);
3606 gtk_tree_view_column_set_alignment (column, 0.5);
3607 gtk_tree_view_column_set_fixed_width (column, 150);
3608 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
3609
3610 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
3611 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
3612
3613 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
3614
3615 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
3616
3617 for(i=0;i<nb_module;i++){
3618 gtk_list_store_append (store, &iter);
3619 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
3620 }
3621
3622 id = gtk_dialog_run(GTK_DIALOG(dialogue));
d27948a3 3623 GtkTreeModel **store_model = (GtkTreeModel**)&store;
36b3c068 3624 switch(id){
3625 case GTK_RESPONSE_ACCEPT:
3626 case GTK_RESPONSE_OK:
2eef04b5 3627 if (gtk_tree_selection_get_selected (select, store_model, &iter)){
36b3c068 3628 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
3629 }
3630 case GTK_RESPONSE_REJECT:
3631 case GTK_RESPONSE_CANCEL:
3632 default:
3633 gtk_widget_destroy(dialogue);
3634 break;
3635 }
3636
3637 return unload_module_name;
3638}
5723fa24 3639
abe346a3 3640
ef68c3ac 3641/* Insert all menu entry and tool buttons into this main window
001d8606 3642 * for modules.
3643 *
abe346a3 3644 */
3645
6c9d86dd 3646void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
5723fa24 3647{
2eef04b5 3648 guint i;
5723fa24 3649 GdkPixbuf *pixbuf;
42fcbb71 3650 lttvwindow_viewer_constructor constructor;
001d8606 3651 LttvMenus * global_menu, * instance_menu;
3652 LttvToolbars * global_toolbar, * instance_toolbar;
6c9d86dd 3653 LttvMenuClosure *menu_item;
3654 LttvToolbarClosure *toolbar_item;
5723fa24 3655 LttvAttributeValue value;
001d8606 3656 LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
501e4e70 3657 LttvIAttribute *attributes = mw->attributes;
001d8606 3658 GtkWidget * tool_menu_title_menu, *new_widget, *pixmap;
8f318283 3659 gboolean retval;
001d8606 3660
8f318283
BP
3661 retval= lttv_iattribute_find_by_path(global_attributes, "viewers/menu",
3662 LTTV_POINTER, &value);
3663 g_assert(retval);
001d8606 3664 if(*(value.v_pointer) == NULL)
501e4e70 3665 *(value.v_pointer) = lttv_menus_new();
001d8606 3666 global_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 3667
8f318283
BP
3668 retval= lttv_iattribute_find_by_path(attributes, "viewers/menu",
3669 LTTV_POINTER, &value);
3670 g_assert(retval);
001d8606 3671 if(*(value.v_pointer) == NULL)
501e4e70 3672 *(value.v_pointer) = lttv_menus_new();
001d8606 3673 instance_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 3674
8f318283
BP
3675 retval= lttv_iattribute_find_by_path(global_attributes, "viewers/toolbar",
3676 LTTV_POINTER, &value);
3677 g_assert(retval);
001d8606 3678 if(*(value.v_pointer) == NULL)
501e4e70 3679 *(value.v_pointer) = lttv_toolbars_new();
001d8606 3680 global_toolbar = (LttvToolbars*)*(value.v_pointer);
3681
8f318283
BP
3682 retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar",
3683 LTTV_POINTER, &value);
3684 g_assert(retval);
001d8606 3685 if(*(value.v_pointer) == NULL)
501e4e70 3686 *(value.v_pointer) = lttv_toolbars_new();
001d8606 3687 instance_toolbar = (LttvToolbars*)*(value.v_pointer);
3688
3689 /* Add missing menu entries to window instance */
3690 for(i=0;i<global_menu->len;i++) {
6c9d86dd 3691 menu_item = &g_array_index(global_menu, LttvMenuClosure, i);
3692
3693 //add menu_item to window instance;
3694 constructor = menu_item->con;
3695 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
3696 new_widget =
501e4e70 3697 gtk_menu_item_new_with_mnemonic (menu_item->menu_text);
6c9d86dd 3698 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu),
3699 new_widget);
3700 g_signal_connect ((gpointer) new_widget, "activate",
3701 G_CALLBACK (insert_viewer_wrap),
3702 constructor);
3703 gtk_widget_show (new_widget);
3704 lttv_menus_add(instance_menu, menu_item->con,
3705 menu_item->menu_path,
3706 menu_item->menu_text,
3707 new_widget);
001d8606 3708
001d8606 3709 }
3710
3711 /* Add missing toolbar entries to window instance */
3712 for(i=0;i<global_toolbar->len;i++) {
6c9d86dd 3713 toolbar_item = &g_array_index(global_toolbar, LttvToolbarClosure, i);
3714
3715 //add toolbar_item to window instance;
3716 constructor = toolbar_item->con;
3717 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1");
3718 pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)toolbar_item->pixmap);
3719 pixmap = gtk_image_new_from_pixbuf(pixbuf);
3720 new_widget =
3721 gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
3722 GTK_TOOLBAR_CHILD_BUTTON,
3723 NULL,
3724 "",
3725 toolbar_item->tooltip, NULL,
3726 pixmap, NULL, NULL);
3727 gtk_label_set_use_underline(
3728 GTK_LABEL (((GtkToolbarChild*) (
3729 g_list_last (GTK_TOOLBAR
3730 (tool_menu_title_menu)->children)->data))->label),
3731 TRUE);
3732 gtk_container_set_border_width (GTK_CONTAINER (new_widget), 1);
3733 g_signal_connect ((gpointer) new_widget,
3734 "clicked",
3735 G_CALLBACK (insert_viewer_wrap),
3736 constructor);
3737 gtk_widget_show (new_widget);
001d8606 3738
6c9d86dd 3739 lttv_toolbars_add(instance_toolbar, toolbar_item->con,
3740 toolbar_item->tooltip,
3741 toolbar_item->pixmap,
3742 new_widget);
001d8606 3743
5723fa24 3744 }
6c9d86dd 3745
5723fa24 3746}
3747
abe346a3 3748
3749/* Create a main window
3750 */
3751
8321ae6a 3752MainWindow *construct_main_window(MainWindow * parent)
5723fa24 3753{
8f318283
BP
3754 gboolean retval;
3755
2a2fa4f0 3756 g_debug("construct_main_window()");
68b48a45 3757 GtkWidget * new_window; /* New generated main window */
bca3b81f 3758 MainWindow * new_m_window;/* New main window structure */
5723fa24 3759 GtkNotebook * notebook;
f7afe191 3760 LttvIAttribute *attributes =
3761 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
3762 LttvAttributeValue value;
e865422c 3763
bca3b81f 3764 new_m_window = g_new(MainWindow, 1);
5723fa24 3765
3766 // Add the object's information to the module's array
68b48a45 3767 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 3768
68b48a45 3769 new_window = create_MWindow();
3770 gtk_widget_show (new_window);
5723fa24 3771
bca3b81f 3772 new_m_window->mwindow = new_window;
a43d67ba 3773 new_m_window->attributes = attributes;
5723fa24 3774
8f318283
BP
3775 retval= lttv_iattribute_find_by_path(attributes, "viewers/menu",
3776 LTTV_POINTER, &value);
3777 g_assert(retval);
501e4e70 3778 *(value.v_pointer) = lttv_menus_new();
001d8606 3779
8f318283
BP
3780 retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar",
3781 LTTV_POINTER, &value);
3782 g_assert(retval);
501e4e70 3783 *(value.v_pointer) = lttv_toolbars_new();
2061e03d 3784
6c9d86dd 3785 add_all_menu_toolbar_constructors(new_m_window, NULL);
5723fa24 3786
2d262115 3787 g_object_set_data_full(G_OBJECT(new_window),
3788 "main_window_data",
3789 (gpointer)new_m_window,
3790 (GDestroyNotify)g_free);
5723fa24 3791 //create a default tab
bca3b81f 3792 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 3793 if(notebook == NULL){
56e5a0f7 3794 g_info("Notebook does not exist\n");
8321ae6a 3795 /* FIXME : destroy partially created widgets */
3796 g_free(new_m_window);
3797 return NULL;
5723fa24 3798 }
e800cf84 3799 //gtk_notebook_popup_enable (GTK_NOTEBOOK(notebook));
5723fa24 3800 //for now there is no name field in LttvTraceset structure
3801 //Use "Traceset" as the label for the default tab
6ced96ef 3802 if(parent) {
3803 GtkWidget * parent_notebook = lookup_widget(parent->mwindow, "MNotebook");
3804 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(parent_notebook),
3805 gtk_notebook_get_current_page(GTK_NOTEBOOK(parent_notebook)));
3806 Tab *parent_tab;
3807
3808 if(!page) {
3809 parent_tab = NULL;
3810 } else {
e433e6d6 3811 LttvPluginTab *ptab;
3812 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
3813 parent_tab = ptab->tab;
6ced96ef 3814 }
e433e6d6 3815 LttvPluginTab *ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL);
3816 init_tab(ptab->tab,
3817 new_m_window, parent_tab, notebook, "Traceset");
3818 ptab->parent.top_widget = ptab->tab->top_widget;
3819 g_object_set_data_full(
3820 G_OBJECT(ptab->tab->vbox),
3821 "Tab_Plugin",
3822 ptab,
3823 (GDestroyNotify)tab_destructor);
6ced96ef 3824 } else {
e433e6d6 3825 LttvPluginTab *ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL);
3826 init_tab(ptab->tab, new_m_window, NULL, notebook, "Traceset");
3827 ptab->parent.top_widget = ptab->tab->top_widget;
3828 g_object_set_data_full(
3829 G_OBJECT(ptab->tab->vbox),
3830 "Tab_Plugin",
3831 ptab,
3832 (GDestroyNotify)tab_destructor);
6cec4cd2 3833 }
91fd6881 3834
6cec4cd2 3835 /* Insert default viewers */
3836 {
3837 LttvAttributeType type;
3838 LttvAttributeName name;
3839 LttvAttributeValue value;
3840 LttvAttribute *attribute;
3841
3842 LttvIAttribute *attributes_global =
3843 LTTV_IATTRIBUTE(lttv_global_attributes());
3844
43ed82b5 3845 attribute = LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
3846 LTTV_IATTRIBUTE(attributes_global),
3847 LTTV_VIEWER_CONSTRUCTORS));
3848 g_assert(attribute);
6cec4cd2 3849
3850 name = g_quark_from_string("guievents");
3851 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
3852 name, &value);
3853 if(type == LTTV_POINTER) {
3854 lttvwindow_viewer_constructor viewer_constructor =
3855 (lttvwindow_viewer_constructor)*value.v_pointer;
3856 insert_viewer(new_window, viewer_constructor);
4266dc7f 3857 }
e025a729 3858
6cec4cd2 3859 name = g_quark_from_string("guicontrolflow");
3860 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
3861 name, &value);
3862 if(type == LTTV_POINTER) {
3863 lttvwindow_viewer_constructor viewer_constructor =
3864 (lttvwindow_viewer_constructor)*value.v_pointer;
3865 insert_viewer(new_window, viewer_constructor);
3866 }
e025a729 3867
6cec4cd2 3868 name = g_quark_from_string("guistatistics");
3869 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
3870 name, &value);
3871 if(type == LTTV_POINTER) {
3872 lttvwindow_viewer_constructor viewer_constructor =
3873 (lttvwindow_viewer_constructor)*value.v_pointer;
3874 insert_viewer(new_window, viewer_constructor);
e025a729 3875 }
4266dc7f 3876 }
5723fa24 3877
56e5a0f7 3878 g_info("There are now : %d windows\n",g_slist_length(g_main_window_list));
8321ae6a 3879
3880 return new_m_window;
5723fa24 3881}
3882
abe346a3 3883
3884/* Free the memory occupied by a tab structure
3885 * destroy the tab
3886 */
3887
e433e6d6 3888void tab_destructor(LttvPluginTab * ptab)
f7afe191 3889{
451aaf27 3890#ifdef BABEL_CLEANUP
716e4367 3891 int i, nb, ref_count;
3892 LttvTrace * trace;
e433e6d6 3893 Tab *tab = ptab->tab;
716e4367 3894
3234f094 3895 if(tab->attributes)
3896 g_object_unref(tab->attributes);
501e4e70 3897
3234f094 3898 if(tab->interrupted_state)
3899 g_object_unref(tab->interrupted_state);
501e4e70 3900
2061e03d 3901
3234f094 3902 if(tab->traceset_info->traceset_context != NULL){
784705cc 3903 //remove state update hooks
3904 lttv_state_remove_event_hooks(
3234f094 3905 (LttvTracesetState*)tab->traceset_info->
784705cc 3906 traceset_context);
3234f094 3907 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->
716e4367 3908 traceset_context));
3234f094 3909 g_object_unref(tab->traceset_info->traceset_context);
716e4367 3910 }
3234f094 3911 if(tab->traceset_info->traceset != NULL) {
3912 nb = lttv_traceset_number(tab->traceset_info->traceset);
716e4367 3913 for(i = 0 ; i < nb ; i++) {
3234f094 3914 trace = lttv_traceset_get(tab->traceset_info->traceset, i);
716e4367 3915 ref_count = lttv_trace_get_ref_number(trace);
49bf71b5 3916 if(ref_count <= 1){
a1a2b649 3917 ltt_trace_close(lttv_trace(trace));
49bf71b5 3918 }
716e4367 3919 }
dc5e5266 3920 }
3234f094 3921 lttv_traceset_destroy(tab->traceset_info->traceset);
501e4e70 3922 /* Remove the idle events requests processing function of the tab */
3234f094 3923 g_idle_remove_by_data(tab);
501e4e70 3924
3234f094 3925 g_slist_free(tab->events_requests);
3926 g_free(tab->traceset_info);
e433e6d6 3927 //g_free(tab);
3928 g_object_unref(ptab);
451aaf27 3929#endif /* BABEL_CLEANUP */
f7afe191 3930}
3931
abe346a3 3932
3933/* Create a tab and insert it into the current main window
3934 */
3935
e433e6d6 3936void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
716e4367 3937 GtkNotebook * notebook, char * label)
5723fa24 3938{
451aaf27 3939
5723fa24 3940 GList * list;
e433e6d6 3941 //Tab * tab;
3942 //LttvFilter *filter = NULL;
a43d67ba 3943
abe346a3 3944 //create a new tab data structure
e433e6d6 3945 //tab = g_new(Tab,1);
716e4367 3946
abe346a3 3947 //construct and initialize the traceset_info
6ced96ef 3948 tab->traceset_info = g_new(TracesetInfo,1);
a43d67ba 3949
4266dc7f 3950 if(copy_tab) {
6ced96ef 3951 tab->traceset_info->traceset =
4266dc7f 3952 lttv_traceset_copy(copy_tab->traceset_info->traceset);
dc5e5266 3953
3954 /* Copy the previous tab's filter */
3955 /* We can clone the filter, as we copy the trace set also */
3956 /* The filter must always be in sync with the trace set */
451aaf27
FD
3957
3958#ifdef BABEL_CLEANUP
ebcead4a 3959 tab->filter = lttv_filter_clone(copy_tab->filter);
451aaf27 3960#endif /* BABEL_CLEANUP */
4266dc7f 3961 } else {
6ced96ef 3962 tab->traceset_info->traceset = lttv_traceset_new();
451aaf27 3963
dc5e5266 3964 tab->filter = NULL;
716e4367 3965 }
84ddf5c9 3966#ifdef DEBUG
20fde85f 3967 lttv_attribute_write_xml(
6ced96ef 3968 lttv_traceset_attribute(tab->traceset_info->traceset),
20fde85f 3969 stdout,
3970 0, 4);
3971 fflush(stdout);
84ddf5c9 3972#endif //DEBUG
451aaf27 3973//
e800cf84 3974 tab->time_manager_lock = FALSE;
3975 tab->current_time_manager_lock = FALSE;
451aaf27 3976#ifdef BABEL_CLEANUP
716e4367 3977 //FIXME copy not implemented in lower level
6ced96ef 3978 tab->traceset_info->traceset_context =
716e4367 3979 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
784705cc 3980 //add state update hooks
3981 lttv_state_add_event_hooks(
6ced96ef 3982 (LttvTracesetState*)tab->traceset_info->traceset_context);
451aaf27 3983#endif //BABEL_CLEANUP
abe346a3 3984 //determine the current_time and time_window of the tab
e800cf84 3985#if 0
6ced96ef 3986 if(copy_tab != NULL){
3987 tab->time_window = copy_tab->time_window;
3988 tab->current_time = copy_tab->current_time;
5723fa24 3989 }else{
6ced96ef 3990 tab->time_window.start_time =
3991 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3992 time_span.start_time;
f7afe191 3993 if(DEFAULT_TIME_WIDTH_S <
6ced96ef 3994 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
3995 time_span.end_time.tv_sec)
68b48a45 3996 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 3997 else
68b48a45 3998 tmp_time.tv_sec =
6ced96ef 3999 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4000 time_span.end_time.tv_sec;
68b48a45 4001 tmp_time.tv_nsec = 0;
6ced96ef 4002 tab->time_window.time_width = tmp_time ;
4003 tab->current_time.tv_sec =
4004 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4005 time_span.start_time.tv_sec;
4006 tab->current_time.tv_nsec =
4007 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
4008 time_span.start_time.tv_nsec;
5723fa24 4009 }
e800cf84 4010#endif //0
6ced96ef 4011 tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
4012 tab->interrupted_state = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
b052368a 4013
58f6c2a4 4014 tab->vbox = gtk_vbox_new(FALSE, 2);
e433e6d6 4015 tab->top_widget = tab->vbox;
4016 //g_object_set_data_full(G_OBJECT(tab->top_widget), "filter",
4017// filter, (GDestroyNotify)lttv_filter_destroy);
4018
4019// g_signal_connect (G_OBJECT(tab->top_widget),
4020// "notify",
4021// G_CALLBACK (on_top_notify),
4022// (gpointer)tab);
4023
58f6c2a4 4024 tab->viewer_container = gtk_vbox_new(TRUE, 2);
b052368a 4025 tab->scrollbar = gtk_hscrollbar_new(NULL);
4026 //tab->multivpaned = gtk_multi_vpaned_new();
6c35c853 4027
b052368a 4028 gtk_box_pack_start(GTK_BOX(tab->vbox),
4029 tab->viewer_container,
4030 TRUE, /* expand */
4031 TRUE, /* Give the extra space to the child */
4032 0); /* No padding */
4249a3e8 4033
4034// if(copy_tab) {
4035// tab->time_window = copy_tab->time_window;
4036// tab->current_time = copy_tab->current_time;
4037// }
e800cf84 4038
4039 /* Create the timebar */
4172f013
YB
4040
4041 tab->MTimebar = timebar_new();
e800cf84 4042
b052368a 4043 gtk_box_pack_end(GTK_BOX(tab->vbox),
4044 tab->scrollbar,
4045 FALSE, /* Do not expand */
4046 FALSE, /* Fill has no effect here (expand false) */
4047 0); /* No padding */
e800cf84 4048
4049 gtk_box_pack_end(GTK_BOX(tab->vbox),
4050 tab->MTimebar,
4051 FALSE, /* Do not expand */
4052 FALSE, /* Fill has no effect here (expand false) */
4053 0); /* No padding */
4054
b052368a 4055 g_object_set_data(G_OBJECT(tab->viewer_container), "focused_viewer", NULL);
4056
4057
6ced96ef 4058 tab->mw = mw;
27a559b9 4059
3c031040 4060 /*{
4061 // Display a label with a X
27a559b9 4062 GtkWidget *w_hbox = gtk_hbox_new(FALSE, 4);
4063 GtkWidget *w_label = gtk_label_new (label);
4064 GtkWidget *pixmap = create_pixmap(GTK_WIDGET(notebook), "close.png");
4065 GtkWidget *w_button = gtk_button_new ();
4066 gtk_container_add(GTK_CONTAINER(w_button), pixmap);
4067 //GtkWidget *w_button = gtk_button_new_with_label("x");
4068
4069 gtk_button_set_relief(GTK_BUTTON(w_button), GTK_RELIEF_NONE);
4070
4071 gtk_box_pack_start(GTK_BOX(w_hbox), w_label, TRUE, TRUE, 0);
4072 gtk_box_pack_end(GTK_BOX(w_hbox), w_button, FALSE,
4073 FALSE, 0);
a43d67ba 4074
27a559b9 4075 g_signal_connect_swapped (w_button, "clicked",
4076 G_CALLBACK (on_close_tab_X_clicked),
4077 tab->multi_vpaned);
5723fa24 4078
3c031040 4079 gtk_widget_set_state(w_button, GTK_STATE_ACTIVE);
4080
27a559b9 4081 gtk_widget_show (w_label);
4082 gtk_widget_show (pixmap);
4083 gtk_widget_show (w_button);
4084 gtk_widget_show (w_hbox);
4085
4086 tab->label = w_hbox;
3c031040 4087 }*/
4088
4089
4090 tab->label = gtk_label_new (label);
b052368a 4091
4092 gtk_widget_show(tab->label);
4093 gtk_widget_show(tab->scrollbar);
4172f013 4094 gtk_widget_show(tab->MTimebar);
b052368a 4095 gtk_widget_show(tab->viewer_container);
4096 gtk_widget_show(tab->vbox);
4172f013 4097
b052368a 4098 //gtk_widget_show(tab->multivpaned);
3c031040 4099
4100
501e4e70 4101 /* Start with empty events requests list */
6ced96ef 4102 tab->events_requests = NULL;
4103 tab->events_request_pending = FALSE;
5698740e 4104 tab->stop_foreground = FALSE;
4105
a43d67ba 4106
540edb40 4107
b052368a 4108 g_signal_connect(G_OBJECT(tab->scrollbar), "value-changed",
4109 G_CALLBACK(scroll_value_changed_cb), tab);
e800cf84 4110
4172f013
YB
4111
4112 /* Timebar signal handler */
4113 g_signal_connect(G_OBJECT(tab->MTimebar), "start-time-changed",
4114 G_CALLBACK(on_timebar_starttime_changed), tab);
4115 g_signal_connect(G_OBJECT(tab->MTimebar), "end-time-changed",
4116 G_CALLBACK(on_timebar_endtime_changed), tab);
4117 g_signal_connect(G_OBJECT(tab->MTimebar), "current-time-changed",
4118 G_CALLBACK(on_timebar_currenttime_changed), tab);
e800cf84 4119
b052368a 4120 //g_signal_connect(G_OBJECT(tab->scrollbar), "changed",
4121 // G_CALLBACK(scroll_value_changed_cb), tab);
4122
4123
784705cc 4124 //insert tab into notebook
6ced96ef 4125 gtk_notebook_append_page(notebook,
b052368a 4126 tab->vbox,
4127 tab->label);
5723fa24 4128 list = gtk_container_get_children(GTK_CONTAINER(notebook));
4129 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
a43d67ba 4130 // always show : not if(g_list_length(list)>1)
4131 gtk_notebook_set_show_tabs(notebook, TRUE);
4132
4249a3e8 4133 if(copy_tab) {
4134 lttvwindow_report_time_window(tab, copy_tab->time_window);
4135 lttvwindow_report_current_time(tab, copy_tab->current_time);
4136 } else {
4137 TimeWindow time_window;
4138
4139 time_window.start_time = ltt_time_zero;
4140 time_window.end_time = ltt_time_add(time_window.start_time,
4141 lttvwindow_default_time_width);
4142 time_window.time_width = lttvwindow_default_time_width;
4143 time_window.time_width_double = ltt_time_to_double(time_window.time_width);
4144
4145 lttvwindow_report_time_window(tab, time_window);
4146 lttvwindow_report_current_time(tab, ltt_time_zero);
4147 }
451aaf27 4148
4249a3e8 4149 LttvTraceset *traceset = tab->traceset_info->traceset;
4150 SetTraceset(tab, traceset);
a43d67ba 4151}
4152
501e4e70 4153/*
4154 * execute_events_requests
4155 *
4156 * Idle function that executes the pending requests for a tab.
4157 *
4158 * @return return value : TRUE : keep the idle function, FALSE : remove it.
4159 */
4160gboolean execute_events_requests(Tab *tab)
a43d67ba 4161{
501e4e70 4162 return ( lttvwindow_process_pending_requests(tab) );
a43d67ba 4163}
4164
8321ae6a 4165
451aaf27 4166__EXPORT void create_main_window_with_trace_list(GSList *traces)
8321ae6a 4167{
451aaf27 4168
8e3a7c75 4169 GSList *iter = NULL;
8321ae6a 4170
4171 /* Create window */
4172 MainWindow *mw = construct_main_window(NULL);
4173 GtkWidget *widget = mw->mwindow;
4174
4175 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
4176 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
4177 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
e433e6d6 4178 LttvPluginTab *ptab;
8321ae6a 4179 Tab *tab;
4180
4181 if(!page) {
e433e6d6 4182 ptab = create_new_tab(widget, NULL);
4183 tab = ptab->tab;
8321ae6a 4184 } else {
e433e6d6 4185 ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
4186 tab = ptab->tab;
8321ae6a 4187 }
451aaf27
FD
4188
4189 LttvTraceset * traceset = lttv_traceset_new();
8e3a7c75 4190 for(iter=traces; iter!=NULL; iter=g_slist_next(iter)) {
4191 gchar *path = (gchar*)iter->data;
4192 /* Add trace */
4193 gchar abs_path[PATH_MAX];
8e3a7c75 4194
451aaf27 4195
8e3a7c75 4196 get_absolute_pathname(path, abs_path);
451aaf27
FD
4197
4198 if(lttv_traceset_add_path(traceset,abs_path) != 0 ){ /*failure*/
4199
4200 g_warning("cannot open trace %s", abs_path);
8e3a7c75 4201
4202 GtkWidget *dialogue =
4203 gtk_message_dialog_new(
4204 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
4205 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
4206 GTK_MESSAGE_ERROR,
4207 GTK_BUTTONS_OK,
0246f776 4208 "Cannot open trace : maybe you should enter in the directory "
8e3a7c75 4209 "to select it ?");
4210 gtk_dialog_run(GTK_DIALOG(dialogue));
4211 gtk_widget_destroy(dialogue);
8321ae6a 4212 }
451aaf27
FD
4213 else{
4214 SetTraceset(tab, traceset);
4215 }
4216 }
8321ae6a 4217}
4218
This page took 0.316778 seconds and 4 git commands to generate.