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