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