enhancements and bugfixes
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
CommitLineData
e076699e 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 XangXiu Yang
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
561eba2a 19#ifdef HAVE_CONFIG_H
20# include <config.h>
21#endif
22
a1a2b649 23#include <limits.h> // for PATH_MAX
24#include <stdlib.h>
25
561eba2a 26#include <gtk/gtk.h>
561eba2a 27
28#include "callbacks.h"
29#include "interface.h"
30#include "support.h"
a43d67ba 31#include <ltt/trace.h>
32#include <ltt/facility.h>
33#include <ltt/time.h>
34#include <ltt/event.h>
2a2fa4f0 35#include <lttv/lttv.h>
a43d67ba 36#include <lttv/module.h>
37#include <lttv/iattribute.h>
38#include <lttv/stats.h>
13f86ce2 39#include <lttvwindow/mainwindow.h>
2d262115 40#include <lttvwindow/mainwindow-private.h>
13f86ce2 41#include <lttvwindow/menu.h>
42#include <lttvwindow/toolbar.h>
501e4e70 43#include <lttvwindow/lttvwindow.h>
a1a2b649 44#include <lttvwindow/lttvwindowtraces.h>
13f86ce2 45#include <lttvwindow/gtkdirsel.h>
13f86ce2 46#include <lttvwindow/lttvfilter.h>
6b1d3120 47
a1a2b649 48
f7afe191 49#define DEFAULT_TIME_WIDTH_S 1
50
49bf71b5 51extern LttvTrace *g_init_trace ;
561eba2a 52
ec25ff5e 53
54/** Array containing instanced objects. */
68b48a45 55extern GSList * g_main_window_list;
561eba2a 56
a43d67ba 57/** MD : keep old directory. */
a1a2b649 58static char remember_plugins_dir[PATH_MAX] = "";
59static char remember_trace_dir[PATH_MAX] = "";
6fbb1ddf 60
61
bca3b81f 62MainWindow * get_window_data_struct(GtkWidget * widget);
36b3c068 63char * get_unload_module(char ** loaded_module_name, int nb_module);
2176f952 64char * get_remove_trace(char ** all_trace_name, int nb_trace);
65char * get_selection(char ** all_name, int nb, char *title, char * column_title);
a8c0f09d 66gboolean get_filter_selection(LttvTracesetSelector *s, char *title, char * column_title);
6ced96ef 67Tab* create_tab(MainWindow * mw, Tab *copy_tab,
716e4367 68 GtkNotebook * notebook, char * label);
561eba2a 69
2d262115 70static void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor);
49bf71b5 71void update_filter(LttvTracesetSelector *s, GtkTreeStore *store );
72
73void checkbox_changed(GtkTreeView *treeview,
74 GtkTreePath *arg1,
75 GtkTreeViewColumn *arg2,
76 gpointer user_data);
77void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i);
78void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * trace);
6ced96ef 79Tab *create_new_tab(GtkWidget* widget, gpointer user_data);
49bf71b5 80
81LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset);
82
501e4e70 83static gboolean lttvwindow_process_pending_requests(Tab *tab);
202f6c8f 84
49bf71b5 85enum {
86 CHECKBOX_COLUMN,
87 NAME_COLUMN,
88 TOTAL_COLUMNS
89};
561eba2a 90
36b3c068 91enum
92{
93 MODULE_COLUMN,
94 N_COLUMNS
95};
96
abe346a3 97/* Construct a selector(filter), which will be associated with a viewer,
98 * and provides an interface for user to select interested events and traces
99 */
561eba2a 100
49bf71b5 101LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
102{
103 LttvTracesetSelector * s;
104 LttvTraceSelector * trace;
105 LttvTracefileSelector * tracefile;
ed3b99b6 106 LttvEventtypeSelector * eventtype;
107 int i, j, k, m;
108 int nb_trace, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
49bf71b5 109 LttvTrace * trace_v;
110 LttTrace * t;
111 LttTracefile *tf;
ed3b99b6 112 LttFacility * fac;
113 LttEventType * et;
49bf71b5 114
115 s = lttv_traceset_selector_new(lttv_traceset_name(traceset));
116 nb_trace = lttv_traceset_number(traceset);
117 for(i=0;i<nb_trace;i++){
118 trace_v = lttv_traceset_get(traceset, i);
119 t = lttv_trace(trace_v);
120 trace = lttv_trace_selector_new(t);
ed3b99b6 121 lttv_traceset_selector_trace_add(s, trace);
122
123 nb_facility = ltt_trace_facility_number(t);
124 for(k=0;k<nb_facility;k++){
125 fac = ltt_trace_facility_get(t,k);
126 nb_event = (int) ltt_facility_eventtype_number(fac);
127 for(m=0;m<nb_event;m++){
128 et = ltt_facility_eventtype_get(fac,m);
129 eventtype = lttv_eventtype_selector_new(et);
130 lttv_trace_selector_eventtype_add(trace, eventtype);
131 }
132 }
133
49bf71b5 134 nb_control = ltt_trace_control_tracefile_number(t);
135 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
136 nb_tracefile = nb_control + nb_per_cpu;
137
138 for(j = 0 ; j < nb_tracefile ; j++) {
139 if(j < nb_control)
140 tf = ltt_trace_control_tracefile_get(t, j);
141 else
142 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
143 tracefile = lttv_tracefile_selector_new(tf);
ed3b99b6 144 lttv_trace_selector_tracefile_add(trace, tracefile);
145 lttv_eventtype_selector_copy(trace, tracefile);
49bf71b5 146 }
147 }
148 return s;
149}
150
abe346a3 151
152/* insert_viewer function constructs an instance of a viewer first,
153 * then inserts the widget of the instance into the container of the
154 * main window
155 */
156
561eba2a 157void
606309a4 158insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
561eba2a 159{
160 guint val = 20;
606309a4 161
42fcbb71 162 insert_viewer((GtkWidget*)menuitem, (lttvwindow_viewer_constructor)user_data);
37d0eca6 163 // selected_hook(&val);
561eba2a 164}
165
561eba2a 166
167/* internal functions */
2d262115 168void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
561eba2a 169{
daecc161 170 GtkMultiVPaned * multi_vpaned;
501e4e70 171 MainWindow * mw_data = get_window_data_struct(widget);
6ced96ef 172 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
f9334f6f 173 GtkWidget * viewer;
49bf71b5 174 LttvTracesetSelector * s;
202f6c8f 175 TimeInterval * time_interval;
6ced96ef 176 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
177 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
178 Tab *tab;
179
180 if(!page) {
181 tab = create_new_tab(widget, NULL);
182 } else {
183 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
47cd8a09 184 }
185
501e4e70 186 multi_vpaned = tab->multi_vpaned;
561eba2a 187
501e4e70 188 s = construct_traceset_selector(tab->traceset_info->traceset);
189 viewer = (GtkWidget*)constructor(tab, s, "Traceset_Selector");
f9334f6f 190 if(viewer)
f0d936c0 191 {
daecc161 192 gtk_multi_vpaned_widget_add(multi_vpaned, viewer);
a43d67ba 193 // We unref here, because it is now referenced by the multi_vpaned!
194 g_object_unref(G_OBJECT(viewer));
195
196 // The viewer will show itself when it receives a show notify
197 // So we call the show notify hooks here. It will
198 // typically add hooks for reading, we call process trace, and the
199 // end of reading hook will call gtk_widget_show and unregister the
200 // hooks.
201 // Note that show notify gets the time_requested through the call_data.
202 //show_viewer(mw_data);
203 // in expose now call_pending_read_hooks(mw_data);
f0d936c0 204 }
561eba2a 205}
206
313bd6fc 207/**
208 * Function to set/update traceset for the viewers
209 * @param tab viewer's tab
210 * @param traceset traceset of the main window.
211 * return value :
212 * 0 : traceset updated
213 * 1 : no traceset hooks to update; not an error.
214 */
215
216int SetTraceset(Tab * tab, LttvTraceset *traceset)
217{
218 LttvHooks * tmp;
219 LttvAttributeValue value;
220
221 g_assert( lttv_iattribute_find_by_path(tab->attributes,
222 "hooks/updatetraceset", LTTV_POINTER, &value));
223
224 tmp = (LttvHooks*)*(value.v_pointer);
225 if(tmp == NULL) return 1;
226
227 lttv_hooks_call(tmp,traceset);
228
229 return 0;
230}
231
232/**
233 * Function to set/update filter for the viewers
234 * @param tab viewer's tab
235 * @param filter filter of the main window.
236 * return value :
237 * -1 : error
238 * 0 : filters updated
239 * 1 : no filter hooks to update; not an error.
240 */
241
242int SetFilter(Tab * tab, gpointer filter)
243{
244 LttvHooks * tmp;
245 LttvAttributeValue value;
246
247 g_assert(lttv_iattribute_find_by_path(tab->attributes,
248 "hooks/updatefilter", LTTV_POINTER, &value));
249
250 tmp = (LttvHooks*)*(value.v_pointer);
251
252 if(tmp == NULL) return 1;
253 lttv_hooks_call(tmp,filter);
254
255 return 0;
256}
257
258
259
260/**
261 * Function to redraw each viewer belonging to the current tab
262 * @param tab viewer's tab
263 */
264
265void update_traceset(Tab *tab)
266{
267 LttvAttributeValue value;
268 LttvHooks * tmp;
269 g_assert(lttv_iattribute_find_by_path(tab->attributes,
270 "hooks/updatetraceset", LTTV_POINTER, &value));
271 tmp = (LttvHooks*)*(value.v_pointer);
272 if(tmp == NULL) return;
273 lttv_hooks_call(tmp, NULL);
274}
275
abe346a3 276
277/* get_label function is used to get user input, it displays an input
278 * box, which allows user to input a string
279 */
280
561eba2a 281void get_label_string (GtkWidget * text, gchar * label)
282{
283 GtkEntry * entry = (GtkEntry*)text;
284 if(strlen(gtk_entry_get_text(entry))!=0)
285 strcpy(label,gtk_entry_get_text(entry));
286}
287
eb38aea5 288gboolean get_label(MainWindow * mw, gchar * str, gchar* dialogue_title, gchar * label_str)
561eba2a 289{
290 GtkWidget * dialogue;
291 GtkWidget * text;
292 GtkWidget * label;
293 gint id;
294
5723fa24 295 dialogue = gtk_dialog_new_with_buttons(dialogue_title,NULL,
561eba2a 296 GTK_DIALOG_MODAL,
297 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
298 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
299 NULL);
300
6b1d3120 301 label = gtk_label_new(label_str);
561eba2a 302 gtk_widget_show(label);
303
304 text = gtk_entry_new();
305 gtk_widget_show(text);
306
307 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), label,TRUE, TRUE,0);
308 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), text,FALSE, FALSE,0);
309
310 id = gtk_dialog_run(GTK_DIALOG(dialogue));
311 switch(id){
312 case GTK_RESPONSE_ACCEPT:
313 get_label_string(text,str);
314 gtk_widget_destroy(dialogue);
315 break;
316 case GTK_RESPONSE_REJECT:
317 default:
318 gtk_widget_destroy(dialogue);
eb38aea5 319 return FALSE;
561eba2a 320 }
eb38aea5 321 return TRUE;
561eba2a 322}
323
abe346a3 324
325/* get_window_data_struct function is actually a lookup function,
326 * given a widget which is in the tree of the main window, it will
327 * return the MainWindow data structure associated with main window
328 */
329
bca3b81f 330MainWindow * get_window_data_struct(GtkWidget * widget)
561eba2a 331{
332 GtkWidget * mw;
bca3b81f 333 MainWindow * mw_data;
561eba2a 334
335 mw = lookup_widget(widget, "MWindow");
336 if(mw == NULL){
337 g_printf("Main window does not exist\n");
2d262115 338 return NULL;
561eba2a 339 }
340
2d262115 341 mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"main_window_data");
68b48a45 342 if(mw_data == NULL){
561eba2a 343 g_printf("Main window data does not exist\n");
2d262115 344 return NULL;
561eba2a 345 }
68b48a45 346 return mw_data;
561eba2a 347}
348
abe346a3 349
350/* create_new_window function, just constructs a new main window
351 */
352
68b48a45 353void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
561eba2a 354{
bca3b81f 355 MainWindow * parent = get_window_data_struct(widget);
561eba2a 356
561eba2a 357 if(clone){
358 g_printf("Clone : use the same traceset\n");
08b1c66e 359 construct_main_window(parent);
561eba2a 360 }else{
361 g_printf("Empty : traceset is set to NULL\n");
08b1c66e 362 construct_main_window(NULL);
561eba2a 363 }
364}
365
abe346a3 366
367/* move_*_viewer functions move the selected view up/down in
368 * the current tab
369 */
370
561eba2a 371void move_up_viewer(GtkWidget * widget, gpointer user_data)
372{
bca3b81f 373 MainWindow * mw = get_window_data_struct(widget);
6ced96ef 374 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
375
376 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
377 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
378
379 Tab *tab;
380
381 if(!page) {
382 return;
383 } else {
384 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
385 }
386
387 gtk_multi_vpaned_widget_move_up(tab->multi_vpaned);
561eba2a 388}
389
390void move_down_viewer(GtkWidget * widget, gpointer user_data)
391{
bca3b81f 392 MainWindow * mw = get_window_data_struct(widget);
6ced96ef 393 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
394
395 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
396 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
397 Tab *tab;
398
399 if(!page) {
400 return;
401 } else {
402 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
403 }
404
405 gtk_multi_vpaned_widget_move_down(tab->multi_vpaned);
561eba2a 406}
407
abe346a3 408
409/* delete_viewer deletes the selected viewer in the current tab
410 */
411
561eba2a 412void delete_viewer(GtkWidget * widget, gpointer user_data)
413{
bca3b81f 414 MainWindow * mw = get_window_data_struct(widget);
6ced96ef 415 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
416
417 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
418 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
419 Tab *tab;
420
421 if(!page) {
422 return;
423 } else {
424 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
425 }
426
427 gtk_multi_vpaned_widget_delete(tab->multi_vpaned);
561eba2a 428}
429
abe346a3 430
431/* open_traceset will open a traceset saved in a file
432 * Right now, it is not finished yet, (not working)
a43d67ba 433 * FIXME
abe346a3 434 */
435
561eba2a 436void open_traceset(GtkWidget * widget, gpointer user_data)
437{
2176f952 438 char ** dir;
439 gint id;
440 LttvTraceset * traceset;
bca3b81f 441 MainWindow * mw_data = get_window_data_struct(widget);
68b48a45 442 GtkFileSelection * file_selector =
2176f952 443 (GtkFileSelection *)gtk_file_selection_new("Select a traceset");
444
68b48a45 445 gtk_file_selection_hide_fileop_buttons(file_selector);
c64c7ea1 446
68b48a45 447 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 448 switch(id){
449 case GTK_RESPONSE_ACCEPT:
450 case GTK_RESPONSE_OK:
68b48a45 451 dir = gtk_file_selection_get_selections (file_selector);
2176f952 452 traceset = lttv_traceset_load(dir[0]);
453 g_printf("Open a trace set %s\n", dir[0]);
454 //Not finished yet
455 g_strfreev(dir);
456 case GTK_RESPONSE_REJECT:
457 case GTK_RESPONSE_CANCEL:
458 default:
68b48a45 459 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 460 break;
461 }
c64c7ea1 462
561eba2a 463}
464
abe346a3 465
501e4e70 466/* lttvwindow_process_pending_requests
467 *
468 * This internal function gets called by g_idle, taking care of the pending
469 * requests. It is responsible for concatenation of time intervals and position
470 * requests. It does it with the following algorithm organizing process traceset
471 * calls. Here is the detailed description of the way it works :
472 *
473 * - Events Requests Servicing Algorithm
474 *
475 * Data structures necessary :
476 *
477 * List of requests added to context : list_in
478 * List of requests not added to context : list_out
479 *
480 * Initial state :
481 *
482 * list_in : empty
483 * list_out : many events requests
484 *
485 * FIXME : insert rest of algorithm here
486 *
abe346a3 487 */
488
6ea08962 489#define list_out tab->events_requests
a43d67ba 490
501e4e70 491gboolean lttvwindow_process_pending_requests(Tab *tab)
a8c0f09d 492{
493 unsigned max_nb_events;
494 GdkWindow * win;
495 GdkCursor * new;
496 GtkWidget* widget;
a43d67ba 497 LttvTracesetContext *tsc;
501e4e70 498 LttvTracefileContext *tfc;
501e4e70 499 GSList *list_in = NULL;
500 LttTime end_time;
501 guint end_nb_events;
2d262115 502 guint count;
501e4e70 503 LttvTracesetContextPosition *end_position;
a43d67ba 504
501e4e70 505 if(tab == NULL)
506 return FALSE;
a43d67ba 507
501e4e70 508 /* There is no events requests pending : we should never have been called! */
6ea08962 509 g_assert(g_slist_length(list_out) != 0);
a43d67ba 510
501e4e70 511 tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
a8c0f09d 512
abe346a3 513 //set the cursor to be X shape, indicating that the computer is busy in doing its job
a0577796 514#if 0
a8c0f09d 515 new = gdk_cursor_new(GDK_X_CURSOR);
2d262115 516 widget = lookup_widget(tab->mw->mwindow, "MToolbar1");
a8c0f09d 517 win = gtk_widget_get_parent_window(widget);
518 gdk_window_set_cursor(win, new);
519 gdk_cursor_unref(new);
520 gdk_window_stick(win);
521 gdk_window_unstick(win);
a0577796 522#endif //0
a43d67ba 523
6ea08962 524 g_debug("SIZE events req len : %d", g_slist_length(list_out));
525
526 /* Preliminary check for no trace in traceset */
527 /* Unregister the routine if empty, empty list_out too */
528 if(lttv_traceset_number(tsc->ts) == 0) {
529
530 /* - For each req in list_out */
531 GSList *iter = list_out;
532
533 while(iter != NULL) {
534
535 gboolean remove = FALSE;
536 gboolean free_data = FALSE;
537 EventsRequest *events_request = (EventsRequest *)iter->data;
538
539 /* - Call end request for req */
540 if(events_request->servicing == TRUE)
541 lttv_hooks_call(events_request->after_request, (gpointer)tsc);
542
543 /* - remove req from list_out */
544 /* Destroy the request */
545 remove = TRUE;
546 free_data = TRUE;
547
548 /* Go to next */
549 if(remove)
550 {
551 GSList *remove_iter = iter;
552
553 iter = g_slist_next(iter);
554 if(free_data) g_free(remove_iter->data);
555 list_out = g_slist_remove_link(list_out, remove_iter);
556 } else { // not remove
557 iter = g_slist_next(iter);
558 }
559 }
560 }
501e4e70 561
562 /* Events processing algorithm implementation */
563 /* A. Servicing loop */
6ea08962 564 while( (g_slist_length(list_in) != 0 || g_slist_length(list_out) != 0)) {
565 /* && !gtk_events_pending() ) */
501e4e70 566
567 /* 1. If list_in is empty (need a seek) */
568 if( g_slist_length(list_in) == 0 ) {
a43d67ba 569
501e4e70 570 /* list in is empty, need a seek */
571 {
572 /* 1.1 Add requests to list_in */
2d262115 573 GSList *ltime = NULL;
574 GSList *lpos = NULL;
575 GSList *iter = NULL;
501e4e70 576
577 /* 1.1.1 Find all time requests with the lowest start time in list_out
578 * (ltime)
579 */
2d262115 580 if(g_slist_length(list_out) > 0)
581 ltime = g_slist_append(ltime, g_slist_nth_data(list_out, 0));
582 for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
501e4e70 583 /* Find all time requests with the lowest start time in list_out */
584 guint index_ltime = g_array_index(ltime, guint, 0);
2d262115 585 EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
586 EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
587
501e4e70 588 int comp;
589 comp = ltt_time_compare(event_request_ltime->start_time,
590 event_request_list_out->start_time);
591 if(comp == 0)
2d262115 592 ltime = g_slist_append(ltime, event_request_list_out);
501e4e70 593 else if(comp > 0) {
594 /* Remove all elements from ltime, and add current */
2d262115 595 while(ltime != NULL)
596 ltime = g_slist_delete_link(ltime, g_slist_nth(ltime, 0));
597 ltime = g_slist_append(ltime, event_request_list_out);
501e4e70 598 }
599 }
600
601 /* 1.1.2 Find all position requests with the lowest position in list_out
602 * (lpos)
603 */
2d262115 604 if(g_slist_length(list_out) > 0)
605 lpos = g_slist_append(lpos, g_slist_nth_data(list_out, 0));
606 for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
501e4e70 607 /* Find all position requests with the lowest position in list_out */
2d262115 608 EventsRequest *event_request_lpos = (EventsRequest*)g_slist_nth_data(lpos, 0);
609 EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
610
501e4e70 611 int comp;
2d262115 612 if(event_request_lpos->start_position != NULL
613 && event_request_list_out->start_position != NULL)
614 {
615 comp = lttv_traceset_context_pos_pos_compare
616 (event_request_lpos->start_position,
501e4e70 617 event_request_list_out->start_position);
2d262115 618 } else {
619 comp = -1;
620 }
501e4e70 621 if(comp == 0)
2d262115 622 lpos = g_slist_append(lpos, event_request_list_out);
501e4e70 623 else if(comp > 0) {
624 /* Remove all elements from lpos, and add current */
2d262115 625 while(lpos != NULL)
626 lpos = g_slist_delete_link(lpos, g_slist_nth(lpos, 0));
627 lpos = g_slist_append(lpos, event_request_list_out);
501e4e70 628 }
629 }
630
501e4e70 631 {
2d262115 632 EventsRequest *event_request_lpos = (EventsRequest*)g_slist_nth_data(lpos, 0);
633 EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
634 LttTime lpos_start_time;
501e4e70 635
2d262115 636 if(event_request_lpos != NULL
637 && event_request_lpos->start_position != NULL) {
2d262115 638 lpos_start_time = lttv_traceset_context_position_get_time(
639 event_request_lpos->start_position);
553d1e7b 640 }
641
642 /* 1.1.3 If lpos.start time < ltime */
643 if(event_request_lpos != NULL
644 && event_request_lpos->start_position != NULL
645 && ltt_time_compare(lpos_start_time,
646 event_request_ltime->start_time)<0) {
647 /* Add lpos to list_in, remove them from list_out */
648 for(iter=lpos;iter!=NULL;iter=g_slist_next(iter)) {
649 /* Add to list_in */
650 EventsRequest *event_request_lpos =
651 (EventsRequest*)iter->data;
652
653 list_in = g_slist_append(list_in, event_request_lpos);
654 /* Remove from list_out */
655 list_out = g_slist_remove(list_out, event_request_lpos);
501e4e70 656 }
501e4e70 657 } else {
658 /* 1.1.4 (lpos.start time >= ltime) */
659 /* Add ltime to list_in, remove them from list_out */
660
2d262115 661 for(iter=ltime;iter!=NULL;iter=g_slist_next(iter)) {
501e4e70 662 /* Add to list_in */
501e4e70 663 EventsRequest *event_request_ltime =
2d262115 664 (EventsRequest*)iter->data;
501e4e70 665
6ea08962 666 list_in = g_slist_append(list_in, event_request_ltime);
501e4e70 667 /* Remove from list_out */
6ea08962 668 list_out = g_slist_remove(list_out, event_request_ltime);
501e4e70 669 }
670 }
671 }
2d262115 672 g_slist_free(lpos);
673 g_slist_free(ltime);
501e4e70 674 }
a43d67ba 675
501e4e70 676 /* 1.2 Seek */
677 {
2d262115 678 tfc = lttv_traceset_context_get_current_tfc(tsc);
679 g_assert(g_slist_length(list_in)>0);
680 EventsRequest *events_request = g_slist_nth_data(list_in, 0);
6ea08962 681 guint seek_count;
501e4e70 682
683 /* 1.2.1 If first request in list_in is a time request */
684 if(events_request->start_position == NULL) {
2d262115 685 /* - If first req in list_in start time != current time */
6ea08962 686 if(tfc == NULL || ltt_time_compare(events_request->start_time,
2d262115 687 tfc->timestamp) != 0)
688 /* - Seek to that time */
6ea08962 689 g_debug("SEEK TIME : %lu, %lu", events_request->start_time.tv_sec,
690 events_request->start_time.tv_nsec);
691 //lttv_process_traceset_seek_time(tsc, events_request->start_time);
692 lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
693 events_request->start_time);
694
695 /* Process the traceset with only state hooks */
696 seek_count =
697 lttv_process_traceset_middle(tsc,
698 events_request->start_time,
699 G_MAXUINT, NULL);
700
701
501e4e70 702 } else {
6ea08962 703 LttTime pos_time;
501e4e70 704 /* Else, the first request in list_in is a position request */
2d262115 705 /* If first req in list_in pos != current pos */
706 g_assert(events_request->start_position != NULL);
a5bbfdd4 707 g_debug("SEEK POS time : %lu, %lu",
708 lttv_traceset_context_position_get_time(events_request->start_position).tv_sec,
709 lttv_traceset_context_position_get_time(events_request->start_position).tv_nsec);
710
711 g_debug("SEEK POS context time : %lu, %lu",
712 lttv_traceset_context_get_current_tfc(tsc)->timestamp.tv_sec,
713 lttv_traceset_context_get_current_tfc(tsc)->timestamp.tv_nsec);
2d262115 714 if(lttv_traceset_context_ctx_pos_compare(tsc,
715 events_request->start_position) != 0) {
716 /* 1.2.2.1 Seek to that position */
6ea08962 717 g_debug("SEEK POSITION");
718 //lttv_process_traceset_seek_position(tsc, events_request->start_position);
719 pos_time = lttv_traceset_context_position_get_time(events_request->start_position);
7d4479eb 720
6ea08962 721 lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
722 pos_time);
723
724 /* Process the traceset with only state hooks */
725 seek_count =
726 lttv_process_traceset_middle(tsc,
727 ltt_time_infinite,
728 G_MAXUINT,
729 events_request->start_position);
730
731
2d262115 732 }
501e4e70 733 }
734 }
a43d67ba 735
2d262115 736 /* 1.3 Add hooks and call before request for all list_in members */
501e4e70 737 {
2d262115 738 GSList *iter = NULL;
739
740 for(iter=list_in;iter!=NULL;iter=g_slist_next(iter)) {
741 EventsRequest *events_request = (EventsRequest*)iter->data;
742 /* 1.3.1 If !servicing */
743 if(events_request->servicing == FALSE) {
744 /* - begin request hooks called
745 * - servicing = TRUE
746 */
6ea08962 747 lttv_hooks_call(events_request->before_request, (gpointer)tsc);
2d262115 748 events_request->servicing = TRUE;
749 }
750 /* 1.3.2 call before chunk
751 * 1.3.3 events hooks added
752 */
753 lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
754 events_request->before_chunk_trace,
755 events_request->before_chunk_tracefile,
501e4e70 756 events_request->event,
757 events_request->event_by_id);
758 }
759 }
760 } else {
761 /* 2. Else, list_in is not empty, we continue a read */
553d1e7b 762
6ea08962 763 {
764 /* 2.0 For each req of list_in */
765 GSList *iter = list_in;
501e4e70 766
6ea08962 767 while(iter != NULL) {
2d262115 768
6ea08962 769 EventsRequest *events_request = (EventsRequest *)iter->data;
770
771 /* - Call before chunk
772 * - events hooks added
2d262115 773 */
774 lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
6ea08962 775 events_request->before_chunk_trace,
776 events_request->before_chunk_tracefile,
777 events_request->event,
778 events_request->event_by_id);
779
780 iter = g_slist_next(iter);
781 }
782 }
783
784 {
6ea08962 785 tfc = lttv_traceset_context_get_current_tfc(tsc);
786
787 /* 2.1 For each req of list_out */
553d1e7b 788 GSList *iter = list_out;
789
790 while(iter != NULL) {
6ea08962 791
553d1e7b 792 gboolean remove = FALSE;
793 gboolean free_data = FALSE;
794 EventsRequest *events_request = (EventsRequest *)iter->data;
795
6ea08962 796 /* if req.start time == current context time
797 * or req.start position == current position*/
798 if( ltt_time_compare(events_request->start_time,
799 tfc->timestamp) == 0
800 ||
801 (events_request->start_position != NULL
802 &&
803 lttv_traceset_context_ctx_pos_compare(tsc,
804 events_request->start_position) == 0)
805 ) {
806 /* - Add to list_in, remove from list_out */
807 list_in = g_slist_append(list_in, events_request);
553d1e7b 808 remove = TRUE;
809 free_data = FALSE;
6ea08962 810
811 /* - If !servicing */
812 if(events_request->servicing == FALSE) {
813 /* - begin request hooks called
814 * - servicing = TRUE
815 */
816 lttv_hooks_call(events_request->before_request, (gpointer)tsc);
817 events_request->servicing = TRUE;
818 }
819 /* call before chunk
820 * events hooks added
821 */
822 lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
823 events_request->before_chunk_trace,
824 events_request->before_chunk_tracefile,
825 events_request->event,
826 events_request->event_by_id);
827 }
553d1e7b 828
829 /* Go to next */
830 if(remove)
831 {
832 GSList *remove_iter = iter;
833
834 iter = g_slist_next(iter);
835 if(free_data) g_free(remove_iter->data);
836 list_out = g_slist_remove_link(list_out, remove_iter);
837 } else { // not remove
838 iter = g_slist_next(iter);
839 }
501e4e70 840 }
841 }
842 }
843
501e4e70 844 /* 3. Find end criterions */
a43d67ba 845 {
501e4e70 846 /* 3.1 End time */
2d262115 847 GSList *iter;
501e4e70 848
849 /* 3.1.1 Find lowest end time in list_in */
2d262115 850 g_assert(g_slist_length(list_in)>0);
851 end_time = ((EventsRequest*)g_slist_nth_data(list_in,0))->end_time;
501e4e70 852
2d262115 853 for(iter=g_slist_nth(list_in,1);iter!=NULL;iter=g_slist_next(iter)) {
854 EventsRequest *events_request = (EventsRequest*)iter->data;
855
501e4e70 856 if(ltt_time_compare(events_request->end_time,
857 end_time) < 0)
858 end_time = events_request->end_time;
859 }
860
861 /* 3.1.2 Find lowest start time in list_out */
2d262115 862 for(iter=list_out;iter!=NULL;iter=g_slist_next(iter)) {
863 EventsRequest *events_request = (EventsRequest*)iter->data;
864
501e4e70 865 if(ltt_time_compare(events_request->start_time,
866 end_time) < 0)
867 end_time = events_request->start_time;
868 }
a43d67ba 869 }
501e4e70 870
8f2872f4 871 {
501e4e70 872 /* 3.2 Number of events */
873
874 /* 3.2.1 Find lowest number of events in list_in */
2d262115 875 GSList *iter;
876
877 end_nb_events = ((EventsRequest*)g_slist_nth_data(list_in,0))->num_events;
8f2872f4 878
2d262115 879 for(iter=g_slist_nth(list_in,1);iter!=NULL;iter=g_slist_next(iter)) {
880 EventsRequest *events_request = (EventsRequest*)iter->data;
501e4e70 881
501e4e70 882 if(events_request->num_events < end_nb_events)
883 end_nb_events = events_request->num_events;
8f2872f4 884 }
2d262115 885
886 /* 3.2.2 Use min(CHUNK_NUM_EVENTS, min num events in list_in) as
887 * num_events */
888
889 end_nb_events = MIN(CHUNK_NUM_EVENTS, end_nb_events);
501e4e70 890 }
891
892 {
893 /* 3.3 End position */
894
895 /* 3.3.1 Find lowest end position in list_in */
2d262115 896 GSList *iter;
501e4e70 897
2d262115 898 end_position =((EventsRequest*)g_slist_nth_data(list_in,0))->end_position;
501e4e70 899
2d262115 900 for(iter=g_slist_nth(list_in,1);iter!=NULL;iter=g_slist_next(iter)) {
901 EventsRequest *events_request = (EventsRequest*)iter->data;
501e4e70 902
2d262115 903 if(events_request->end_position != NULL && end_position != NULL &&
904 lttv_traceset_context_pos_pos_compare(events_request->end_position,
501e4e70 905 end_position) <0)
906 end_position = events_request->end_position;
907 }
908 }
909
910 {
911 /* 3.3.2 Find lowest start position in list_out */
2d262115 912 GSList *iter;
501e4e70 913
2d262115 914 for(iter=list_out;iter!=NULL;iter=g_slist_next(iter)) {
915 EventsRequest *events_request = (EventsRequest*)iter->data;
501e4e70 916
2d262115 917 if(events_request->end_position != NULL && end_position != NULL &&
918 lttv_traceset_context_pos_pos_compare(events_request->end_position,
501e4e70 919 end_position) <0)
920 end_position = events_request->end_position;
921 }
922 }
923
2d262115 924 {
925 /* 4. Call process traceset middle */
6ea08962 926 g_critical("Calling process traceset middle with %p, %lu sec %lu nsec, %lu nb ev, %p end pos", tsc, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position);
2d262115 927 count = lttv_process_traceset_middle(tsc, end_time, end_nb_events, end_position);
6ea08962 928
929 tfc = lttv_traceset_context_get_current_tfc(tsc);
930 g_critical("Context time after middle : %lu, %lu", tfc->timestamp.tv_sec,
931 tfc->timestamp.tv_nsec);
932
2d262115 933 }
934 {
935 /* 5. After process traceset middle */
936 tfc = lttv_traceset_context_get_current_tfc(tsc);
937
938 /* - if current context time > traceset.end time */
939 if(tfc == NULL || ltt_time_compare(tfc->timestamp,
940 tsc->time_span.end_time) > 0) {
941 /* - For each req in list_in */
942 GSList *iter = list_in;
943
944 while(iter != NULL) {
945
946 gboolean remove = FALSE;
947 gboolean free_data = FALSE;
948 EventsRequest *events_request = (EventsRequest *)iter->data;
949
950 /* - Remove events hooks for req
951 * - Call end chunk for req
952 */
953 lttv_process_traceset_end(tsc, events_request->after_chunk_traceset,
954 events_request->after_chunk_trace,
955 events_request->after_chunk_tracefile,
956 events_request->event,
957 events_request->event_by_id);
958 /* - Call end request for req */
6ea08962 959 lttv_hooks_call(events_request->after_request, (gpointer)tsc);
2d262115 960
961 /* - remove req from list_in */
962 /* Destroy the request */
963 remove = TRUE;
964 free_data = TRUE;
965
966 /* Go to next */
967 if(remove)
968 {
969 GSList *remove_iter = iter;
970
971 iter = g_slist_next(iter);
972 if(free_data) g_free(remove_iter->data);
973 list_in = g_slist_remove_link(list_in, remove_iter);
974 } else { // not remove
975 iter = g_slist_next(iter);
976 }
977 }
978 }
2d262115 979 {
980 /* 5.1 For each req in list_in */
981 GSList *iter = list_in;
982
983 while(iter != NULL) {
984
985 gboolean remove = FALSE;
986 gboolean free_data = FALSE;
987 EventsRequest *events_request = (EventsRequest *)iter->data;
988
989 /* - Remove events hooks for req
990 * - Call end chunk for req
991 */
992 lttv_process_traceset_end(tsc, events_request->after_chunk_traceset,
993 events_request->after_chunk_trace,
994 events_request->after_chunk_tracefile,
995 events_request->event,
996 events_request->event_by_id);
501e4e70 997
2d262115 998 /* - req.num -= count */
999 g_assert(events_request->num_events >= count);
1000 events_request->num_events -= count;
1001
1002 g_assert(tfc != NULL);
1003 /* - if req.num == 0
1004 * or
6ea08962 1005 * current context time >= req.end time
2d262115 1006 * or
1007 * req.end pos == current pos
1008 * or
1009 * req.stop_flag == TRUE
1010 */
1011 if( events_request->num_events == 0
1012 ||
1013 events_request->stop_flag == TRUE
1014 ||
1015 ltt_time_compare(tfc->timestamp,
6ea08962 1016 events_request->end_time) >= 0
2d262115 1017 ||
a5bbfdd4 1018 (events_request->end_position != NULL
2d262115 1019 &&
1020 lttv_traceset_context_ctx_pos_compare(tsc,
a5bbfdd4 1021 events_request->end_position) != 0)
2d262115 1022
1023 ) {
6ea08962 1024 g_assert(events_request->servicing == TRUE);
2d262115 1025 /* - Call end request for req
1026 * - remove req from list_in */
6ea08962 1027 lttv_hooks_call(events_request->after_request, (gpointer)tsc);
2d262115 1028 /* - remove req from list_in */
1029 /* Destroy the request */
1030 remove = TRUE;
1031 free_data = TRUE;
1032 }
1033
1034 /* Go to next */
1035 if(remove)
1036 {
1037 GSList *remove_iter = iter;
1038
1039 iter = g_slist_next(iter);
1040 if(free_data) g_free(remove_iter->data);
1041 list_in = g_slist_remove_link(list_in, remove_iter);
1042 } else { // not remove
1043 iter = g_slist_next(iter);
1044 }
1045 }
1046 }
1047 }
6ea08962 1048
7d4479eb 1049 if(gtk_events_pending()) break;
501e4e70 1050 }
1051
2d262115 1052 /* B. When interrupted between chunks */
501e4e70 1053
501e4e70 1054 {
1055 GSList *iter = list_in;
1056
2d262115 1057 /* 1. for each request in list_in */
501e4e70 1058 while(iter != NULL) {
1059
1060 gboolean remove = FALSE;
1061 gboolean free_data = FALSE;
2d262115 1062 EventsRequest *events_request = (EventsRequest *)iter->data;
501e4e70 1063
1064 /* 1.1. Use current postition as start position */
a1a2b649 1065 if(events_request->start_position != NULL)
1066 lttv_traceset_context_position_destroy(events_request->start_position);
1067 events_request->start_position = ltt_traceset_context_position_new();
501e4e70 1068 lttv_traceset_context_position_save(tsc, events_request->start_position);
1069
1070 /* 1.2. Remove start time */
2d262115 1071 events_request->start_time.tv_sec = G_MAXUINT;
1072 events_request->start_time.tv_nsec = G_MAXUINT;
501e4e70 1073
2d262115 1074 /* 1.3. Move from list_in to list_out */
501e4e70 1075 remove = TRUE;
1076 free_data = FALSE;
1077 list_out = g_slist_append(list_out, events_request);
1078
501e4e70 1079 /* Go to next */
1080 if(remove)
8f2872f4 1081 {
501e4e70 1082 GSList *remove_iter = iter;
1083
1084 iter = g_slist_next(iter);
1085 if(free_data) g_free(remove_iter->data);
1086 list_in = g_slist_remove_link(list_in, remove_iter);
1087 } else { // not remove
1088 iter = g_slist_next(iter);
8f2872f4 1089 }
1090 }
a43d67ba 1091
501e4e70 1092
1093 }
1094
a0577796 1095#if 0
abe346a3 1096 //set the cursor back to normal
a8c0f09d 1097 gdk_window_set_cursor(win, NULL);
a0577796 1098#endif //0
501e4e70 1099
2d262115 1100 g_assert(g_slist_length(list_in) == 0);
6ea08962 1101
2d262115 1102 if( g_slist_length(list_out) == 0 ) {
501e4e70 1103 /* Put tab's request pending flag back to normal */
2d262115 1104 tab->events_request_pending = FALSE;
6ea08962 1105 g_critical("remove the idle fct");
501e4e70 1106 return FALSE; /* Remove the idle function */
1107 }
6ea08962 1108 g_critical("leave the idle fct");
501e4e70 1109 return TRUE; /* Leave the idle function */
202f6c8f 1110}
1111
6ea08962 1112#undef list_out
501e4e70 1113
abe346a3 1114
1115/* add_trace_into_traceset_selector, each instance of a viewer has an associated
1116 * selector (filter), when a trace is added into traceset, the selector should
1117 * reflect the change. The function is used to update the selector
1118 */
1119
49bf71b5 1120void add_trace_into_traceset_selector(GtkMultiVPaned * paned, LttTrace * t)
1121{
ed3b99b6 1122 int j, k, m, nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
49bf71b5 1123 LttvTracesetSelector * s;
1124 LttvTraceSelector * trace;
1125 LttvTracefileSelector * tracefile;
ed3b99b6 1126 LttvEventtypeSelector * eventtype;
49bf71b5 1127 LttTracefile * tf;
1128 GtkWidget * w;
ed3b99b6 1129 LttFacility * fac;
1130 LttEventType * et;
49bf71b5 1131
1132 w = gtk_multi_vpaned_get_first_widget(paned);
1133 while(w){
1134 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
49bf71b5 1135
abe346a3 1136 if(s){
1137 trace = lttv_trace_selector_new(t);
1138 lttv_traceset_selector_trace_add(s, trace);
1139
1140 nb_facility = ltt_trace_facility_number(t);
1141 for(k=0;k<nb_facility;k++){
1142 fac = ltt_trace_facility_get(t,k);
1143 nb_event = (int) ltt_facility_eventtype_number(fac);
1144 for(m=0;m<nb_event;m++){
1145 et = ltt_facility_eventtype_get(fac,m);
1146 eventtype = lttv_eventtype_selector_new(et);
1147 lttv_trace_selector_eventtype_add(trace, eventtype);
1148 }
1149 }
1150
1151 nb_control = ltt_trace_control_tracefile_number(t);
1152 nb_per_cpu = ltt_trace_per_cpu_tracefile_number(t);
1153 nb_tracefile = nb_control + nb_per_cpu;
1154
1155 for(j = 0 ; j < nb_tracefile ; j++) {
1156 if(j < nb_control)
1157 tf = ltt_trace_control_tracefile_get(t, j);
1158 else
1159 tf = ltt_trace_per_cpu_tracefile_get(t, j - nb_control);
1160 tracefile = lttv_tracefile_selector_new(tf);
1161 lttv_trace_selector_tracefile_add(trace, tracefile);
1162 lttv_eventtype_selector_copy(trace, tracefile);
1163 }
1164 }else g_warning("Module does not support filtering\n");
49bf71b5 1165
1166 w = gtk_multi_vpaned_get_next_widget(paned);
1167 }
1168}
1169
abe346a3 1170
4266dc7f 1171static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v)
1172{
1173 LttvTraceset *traceset = tab->traceset_info->traceset;
1174 guint i;
1175
a1a2b649 1176 //Verify if trace is already present.
1177 for(i=0; i<lttv_traceset_number(traceset); i++)
1178 {
1179 LttvTrace * trace = lttv_traceset_get(traceset, i);
1180 if(trace == trace_v)
1181 return;
1182 }
1183
4266dc7f 1184 //Keep a reference to the traces so they are not freed.
1185 for(i=0; i<lttv_traceset_number(traceset); i++)
1186 {
1187 LttvTrace * trace = lttv_traceset_get(traceset, i);
1188 lttv_trace_ref(trace);
1189 }
1190
1191 //remove state update hooks
1192 lttv_state_remove_event_hooks(
1193 (LttvTracesetState*)tab->traceset_info->traceset_context);
1194
1195 lttv_context_fini(LTTV_TRACESET_CONTEXT(
1196 tab->traceset_info->traceset_context));
1197 g_object_unref(tab->traceset_info->traceset_context);
1198
1199 lttv_traceset_add(traceset, trace_v);
a1a2b649 1200 lttv_trace_ref(trace_v); /* local ref */
4266dc7f 1201
1202 /* Create new context */
1203 tab->traceset_info->traceset_context =
1204 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1205 lttv_context_init(
1206 LTTV_TRACESET_CONTEXT(tab->traceset_info->
1207 traceset_context),
1208 traceset);
6ea08962 1209
1210 /* Set the tab's time window and current time if currently 0, 0 */
1211 if(tab->time_window.start_time.tv_sec == 0 &&
1212 tab->time_window.start_time.tv_nsec == 0)
1213 tab->time_window.start_time =
1214 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1215 time_span.start_time;
1216 if(tab->time_window.time_width.tv_sec == 0 &&
1217 tab->time_window.time_width.tv_nsec == 0) {
1218 LttTime tmp_time;
1219
1220 if(DEFAULT_TIME_WIDTH_S <
1221 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1222 time_span.end_time.tv_sec)
1223 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
1224 else
1225 tmp_time.tv_sec =
1226 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1227 time_span.end_time.tv_sec;
1228 tmp_time.tv_nsec = 0;
1229 tab->time_window.time_width = tmp_time ;
1230 }
1231 if(tab->current_time.tv_sec == 0 && tab->current_time.tv_nsec == 0) {
1232 tab->current_time.tv_sec =
1233 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1234 time_span.start_time.tv_sec;
1235 tab->current_time.tv_nsec =
1236 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
1237 time_span.start_time.tv_nsec;
1238 }
1239
1240
4266dc7f 1241 //add state update hooks
1242 lttv_state_add_event_hooks(
1243 (LttvTracesetState*)tab->traceset_info->traceset_context);
1244 //Remove local reference to the traces.
1245 for(i=0; i<lttv_traceset_number(traceset); i++)
1246 {
1247 LttvTrace * trace = lttv_traceset_get(traceset, i);
1248 lttv_trace_unref(trace);
1249 }
1250
1251 add_trace_into_traceset_selector(tab->multi_vpaned, lttv_trace(trace_v));
1252}
1253
abe346a3 1254/* add_trace adds a trace into the current traceset. It first displays a
1255 * directory selection dialogue to let user choose a trace, then recreates
1256 * tracset_context, and redraws all the viewer of the current tab
1257 */
1258
561eba2a 1259void add_trace(GtkWidget * widget, gpointer user_data)
1260{
2176f952 1261 LttTrace *trace;
1262 LttvTrace * trace_v;
1263 LttvTraceset * traceset;
94dcfb9e 1264 const char * dir;
a1a2b649 1265 char abs_path[PATH_MAX];
2176f952 1266 gint id;
a43d67ba 1267 gint i;
bca3b81f 1268 MainWindow * mw_data = get_window_data_struct(widget);
6ced96ef 1269 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1270
1271 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1272 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1273 Tab *tab;
1274
1275 if(!page) {
1276 tab = create_new_tab(widget, NULL);
1277 } else {
1278 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1279 }
4266dc7f 1280
68b48a45 1281 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
1282 gtk_dir_selection_hide_fileop_buttons(file_selector);
4266dc7f 1283
3658a338 1284 if(remember_trace_dir[0] != '\0')
1285 gtk_dir_selection_set_filename(file_selector, remember_trace_dir);
2176f952 1286
68b48a45 1287 id = gtk_dialog_run(GTK_DIALOG(file_selector));
2176f952 1288 switch(id){
1289 case GTK_RESPONSE_ACCEPT:
1290 case GTK_RESPONSE_OK:
68b48a45 1291 dir = gtk_dir_selection_get_dir (file_selector);
a1a2b649 1292 strncpy(remember_trace_dir, dir, PATH_MAX);
a43d67ba 1293 if(!dir || strlen(dir) == 0){
1294 gtk_widget_destroy((GtkWidget*)file_selector);
1295 break;
284675e3 1296 }
a1a2b649 1297 get_absolute_pathname(dir, abs_path);
1298 trace_v = lttvwindowtraces_get_trace_by_name(abs_path);
1299 if(trace_v == NULL) {
1300 trace = ltt_trace_open(abs_path);
2a74fbf4 1301 if(trace == NULL) {
1302 g_warning("cannot open trace %s", abs_path);
1303 } else {
1304 trace_v = lttv_trace_new(trace);
1305 lttvwindowtraces_add_trace(trace_v);
1306 lttvwindow_add_trace(tab, trace_v);
1307 }
1308 } else {
1309 lttvwindow_add_trace(tab, trace_v);
a1a2b649 1310 }
c2619a30 1311
49bf71b5 1312 gtk_widget_destroy((GtkWidget*)file_selector);
1313
1314 //update current tab
a43d67ba 1315 //update_traceset(mw_data);
21e8c385 1316
a43d67ba 1317 /* Call the updatetraceset hooks */
1318
4266dc7f 1319 traceset = tab->traceset_info->traceset;
1320 SetTraceset(tab, traceset);
a43d67ba 1321 // in expose now call_pending_read_hooks(mw_data);
1322
4266dc7f 1323 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
49bf71b5 1324 break;
2176f952 1325 case GTK_RESPONSE_REJECT:
1326 case GTK_RESPONSE_CANCEL:
1327 default:
68b48a45 1328 gtk_widget_destroy((GtkWidget*)file_selector);
2176f952 1329 break;
1330 }
49bf71b5 1331}
1332
abe346a3 1333
1334/* remove_trace_into_traceset_selector, each instance of a viewer has an associated
1335 * selector (filter), when a trace is remove from traceset, the selector should
1336 * reflect the change. The function is used to update the selector
1337 */
1338
49bf71b5 1339void remove_trace_from_traceset_selector(GtkMultiVPaned * paned, unsigned i)
1340{
1341 LttvTracesetSelector * s;
1342 LttvTraceSelector * t;
1343 GtkWidget * w;
1344
1345 w = gtk_multi_vpaned_get_first_widget(paned);
1346 while(w){
1347 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
abe346a3 1348 if(s){
1349 t = lttv_traceset_selector_trace_get(s,i);
1350 lttv_traceset_selector_trace_remove(s, i);
1351 lttv_trace_selector_destroy(t);
1352 }g_warning("Module dose not support filtering\n");
49bf71b5 1353 w = gtk_multi_vpaned_get_next_widget(paned);
1354 }
561eba2a 1355}
1356
abe346a3 1357
1358/* remove_trace removes a trace from the current traceset if all viewers in
1359 * the current tab are not interested in the trace. It first displays a
1360 * dialogue, which shows all traces in the current traceset, to let user choose
1361 * a trace, then it checks if all viewers unselect the trace, if it is true,
1362 * it will remove the trace, recreate the traceset_contex,
1363 * and redraws all the viewer of the current tab. If there is on trace in the
1364 * current traceset, it will delete all viewers of the current tab
1365 */
1366
561eba2a 1367void remove_trace(GtkWidget * widget, gpointer user_data)
1368{
2176f952 1369 LttTrace *trace;
1370 LttvTrace * trace_v;
1371 LttvTraceset * traceset;
a43d67ba 1372 gint i, j, nb_trace;
2176f952 1373 char ** name, *remove_trace_name;
bca3b81f 1374 MainWindow * mw_data = get_window_data_struct(widget);
49bf71b5 1375 LttvTracesetSelector * s;
1376 LttvTraceSelector * t;
1377 GtkWidget * w;
1378 gboolean selected;
6ced96ef 1379 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1380
1381 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1382 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1383 Tab *tab;
1384
1385 if(!page) {
1386 return;
1387 } else {
1388 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1389 }
1390
4266dc7f 1391 nb_trace =lttv_traceset_number(tab->traceset_info->traceset);
2176f952 1392 name = g_new(char*,nb_trace);
1393 for(i = 0; i < nb_trace; i++){
4266dc7f 1394 trace_v = lttv_traceset_get(tab->traceset_info->traceset, i);
2176f952 1395 trace = lttv_trace(trace_v);
a5dcde2f 1396 name[i] = ltt_trace_name(trace);
2176f952 1397 }
1398
1399 remove_trace_name = get_remove_trace(name, nb_trace);
1400
1401 if(remove_trace_name){
1402 for(i=0; i<nb_trace; i++){
1403 if(strcmp(remove_trace_name,name[i]) == 0){
6ced96ef 1404 //unselect the trace from the current viewer
1405 w = gtk_multi_vpaned_get_widget(tab->multi_vpaned);
1406 if(w){
1407 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1408 if(s){
1409 t = lttv_traceset_selector_trace_get(s,i);
1410 lttv_trace_selector_set_selected(t, FALSE);
1411 }
1412
1413 //check if other viewers select the trace
1414 w = gtk_multi_vpaned_get_first_widget(tab->multi_vpaned);
1415 while(w){
1416 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1417 if(s){
1418 t = lttv_traceset_selector_trace_get(s,i);
1419 selected = lttv_trace_selector_get_selected(t);
1420 if(selected)break;
1421 }
1422 w = gtk_multi_vpaned_get_next_widget(tab->multi_vpaned);
1423 }
1424 }else selected = FALSE;
49bf71b5 1425
6ced96ef 1426 //if no viewer selects the trace, remove it
1427 if(!selected){
1428 remove_trace_from_traceset_selector(tab->multi_vpaned, i);
49bf71b5 1429
6ced96ef 1430 traceset = tab->traceset_info->traceset;
1431 //Keep a reference to the traces so they are not freed.
1432 for(j=0; j<lttv_traceset_number(traceset); j++)
1433 {
1434 LttvTrace * trace = lttv_traceset_get(traceset, j);
1435 lttv_trace_ref(trace);
1436 }
a43d67ba 1437
6ced96ef 1438 //remove state update hooks
1439 lttv_state_remove_event_hooks(
1440 (LttvTracesetState*)tab->traceset_info->traceset_context);
1441 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context));
1442 g_object_unref(tab->traceset_info->traceset_context);
a43d67ba 1443
a43d67ba 1444
6ced96ef 1445 trace_v = lttv_traceset_get(traceset, i);
a43d67ba 1446
a1a2b649 1447 if(lttv_trace_get_ref_number(trace_v) <= 2) {
1448 /* ref 2 : traceset, local */
1449 lttvwindowtraces_remove_trace(trace_v);
6ced96ef 1450 ltt_trace_close(lttv_trace(trace_v));
a1a2b649 1451 }
6ced96ef 1452
1453 lttv_traceset_remove(traceset, i);
1454 lttv_trace_unref(trace_v); // Remove local reference
c2619a30 1455
6ced96ef 1456 if(!lttv_trace_get_ref_number(trace_v))
1457 lttv_trace_destroy(trace_v);
1458
1459 tab->traceset_info->traceset_context =
1460 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
1461 lttv_context_init(
1462 LTTV_TRACESET_CONTEXT(tab->
1463 traceset_info->traceset_context),traceset);
1464 //add state update hooks
1465 lttv_state_add_event_hooks(
1466 (LttvTracesetState*)tab->traceset_info->traceset_context);
1467
1468 //Remove local reference to the traces.
1469 for(j=0; j<lttv_traceset_number(traceset); j++)
1470 {
1471 LttvTrace * trace = lttv_traceset_get(traceset, j);
1472 lttv_trace_unref(trace);
1473 }
a43d67ba 1474
a43d67ba 1475
6ced96ef 1476 //update current tab
1477 //update_traceset(mw_data);
313bd6fc 1478 //if(nb_trace > 1){
6ced96ef 1479
313bd6fc 1480 SetTraceset(tab, (gpointer)traceset);
6ced96ef 1481 // in expose now call_pending_read_hooks(mw_data);
1482
1483 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
313bd6fc 1484 //}else{
1485 // if(tab){
1486 // while(tab->multi_vpaned->num_children){
1487 // gtk_multi_vpaned_widget_delete(tab->multi_vpaned);
1488 // }
1489 // }
1490 //}
6ced96ef 1491 }
1492 break;
2176f952 1493 }
1494 }
1495 }
1496
1497 g_free(name);
561eba2a 1498}
1499
abe346a3 1500
9878c8a4 1501/* Redraw all the viewers in the current tab */
1502void redraw(GtkWidget *widget, gpointer user_data)
1503{
1504 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1505 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1506 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1507 Tab *tab;
1508 if(!page) {
1509 return;
1510 } else {
1511 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1512 }
1513
1514 LttvHooks * tmp;
1515 LttvAttributeValue value;
1516
1517 g_assert(lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value));
1518
1519 tmp = (LttvHooks*)*(value.v_pointer);
c07e9b26 1520 if(tmp != NULL)
1521 lttv_hooks_call(tmp,NULL);
9878c8a4 1522}
1523
1524
1525void continue_processing(GtkWidget *widget, gpointer user_data)
1526{
1527 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1528 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1529 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1530 Tab *tab;
1531 if(!page) {
1532 return;
1533 } else {
1534 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1535 }
1536
1537 LttvHooks * tmp;
1538 LttvAttributeValue value;
1539
1540 g_assert(lttv_iattribute_find_by_path(tab->attributes,
1541 "hooks/continue", LTTV_POINTER, &value));
1542
1543 tmp = (LttvHooks*)*(value.v_pointer);
c07e9b26 1544 if(tmp != NULL)
1545 lttv_hooks_call(tmp,NULL);
9878c8a4 1546}
1547
1548/* Stop the processing for the calling main window's current tab.
1549 * It removes every processing requests that are in its list. It does not call
1550 * the end request hooks, because the request is not finished.
1551 */
1552
1553void stop_processing(GtkWidget *widget, gpointer user_data)
1554{
1555 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1556 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1557 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1558 Tab *tab;
1559 if(!page) {
1560 return;
1561 } else {
1562 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1563 }
a0577796 1564 GSList *iter = tab->events_requests;
9878c8a4 1565
1566 while(iter != NULL) {
1567 GSList *remove_iter = iter;
1568 iter = g_slist_next(iter);
1569
1570 g_free(remove_iter->data);
a0577796 1571 tab->events_requests =
1572 g_slist_remove_link(tab->events_requests, remove_iter);
9878c8a4 1573 }
a0577796 1574 tab->events_request_pending = FALSE;
1575 g_idle_remove_by_data(tab);
1576 g_assert(g_slist_length(tab->events_requests) == 0);
9878c8a4 1577}
1578
1579
abe346a3 1580/* save will save the traceset to a file
a43d67ba 1581 * Not implemented yet FIXME
abe346a3 1582 */
1583
561eba2a 1584void save(GtkWidget * widget, gpointer user_data)
1585{
1586 g_printf("Save\n");
1587}
1588
1589void save_as(GtkWidget * widget, gpointer user_data)
1590{
1591 g_printf("Save as\n");
1592}
1593
abe346a3 1594
1595/* zoom will change the time_window of all the viewers of the
1596 * current tab, and redisplay them. The main functionality is to
1597 * determine the new time_window of the current tab
1598 */
1599
1f1ae829 1600void zoom(GtkWidget * widget, double size)
1601{
1602 TimeInterval *time_span;
a43d67ba 1603 TimeWindow new_time_window;
1604 LttTime current_time, time_delta, time_s, time_e, time_tmp;
1f1ae829 1605 MainWindow * mw_data = get_window_data_struct(widget);
4266dc7f 1606 LttvTracesetContext *tsc;
6ced96ef 1607 GtkWidget * notebook = lookup_widget(widget, "MNotebook");
1608
1609 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1610 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1611 Tab *tab;
1612
1613 if(!page) {
1614 return;
1615 } else {
1616 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1617 }
1f1ae829 1618
fda16332 1619 if(size == 1) return;
1620
4266dc7f 1621 tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
501e4e70 1622 time_span = &tsc->time_span;
1623 new_time_window = tab->time_window;
1624 current_time = tab->current_time;
1f1ae829 1625
501e4e70 1626 time_delta = ltt_time_sub(time_span->end_time,time_span->start_time);
1f1ae829 1627 if(size == 0){
501e4e70 1628 new_time_window.start_time = time_span->start_time;
a43d67ba 1629 new_time_window.time_width = time_delta;
1f1ae829 1630 }else{
a43d67ba 1631 new_time_window.time_width = ltt_time_div(new_time_window.time_width, size);
1632 if(ltt_time_compare(new_time_window.time_width,time_delta) > 0)
1633 { /* Case where zoom out is bigger than trace length */
501e4e70 1634 new_time_window.start_time = time_span->start_time;
a43d67ba 1635 new_time_window.time_width = time_delta;
a8c0f09d 1636 }
a43d67ba 1637 else
1638 {
1639 /* Center the image on the current time */
a43d67ba 1640 new_time_window.start_time =
1641 ltt_time_sub(current_time, ltt_time_div(new_time_window.time_width, 2.0));
1642 /* If on borders, don't fall off */
501e4e70 1643 if(ltt_time_compare(new_time_window.start_time, time_span->start_time) <0)
a43d67ba 1644 {
501e4e70 1645 new_time_window.start_time = time_span->start_time;
a43d67ba 1646 }
1647 else
1648 {
1649 if(ltt_time_compare(
1650 ltt_time_add(new_time_window.start_time, new_time_window.time_width),
501e4e70 1651 time_span->end_time) > 0)
a43d67ba 1652 {
1653 new_time_window.start_time =
501e4e70 1654 ltt_time_sub(time_span->end_time, new_time_window.time_width);
a43d67ba 1655 }
1656 }
1657
1f1ae829 1658 }
a43d67ba 1659
1660
1661
1662 //time_tmp = ltt_time_div(new_time_window.time_width, 2);
1663 //if(ltt_time_compare(current_time, time_tmp) < 0){
1664 // time_s = time_span->startTime;
1665 //} else {
1666 // time_s = ltt_time_sub(current_time,time_tmp);
1667 //}
1668 //time_e = ltt_time_add(current_time,time_tmp);
1669 //if(ltt_time_compare(time_span->startTime, time_s) > 0){
1670 // time_s = time_span->startTime;
1671 //}else if(ltt_time_compare(time_span->endTime, time_e) < 0){
1672 // time_e = time_span->endTime;
1673 // time_s = ltt_time_sub(time_e,new_time_window.time_width);
1674 //}
1675 //new_time_window.start_time = time_s;
1f1ae829 1676 }
a43d67ba 1677
1678 //lttvwindow_report_time_window(mw_data, &new_time_window);
1679 //call_pending_read_hooks(mw_data);
1680
4266dc7f 1681 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
501e4e70 1682 set_time_window(tab, &new_time_window);
a43d67ba 1683 // in expose now call_pending_read_hooks(mw_data);
501e4e70 1684 gtk_multi_vpaned_set_adjust(tab->multi_vpaned, &new_time_window, FALSE);
1f1ae829 1685}
1686
561eba2a 1687void zoom_in(GtkWidget * widget, gpointer user_data)
1688{
1f1ae829 1689 zoom(widget, 2);
561eba2a 1690}
1691
1692void zoom_out(GtkWidget * widget, gpointer user_data)
1693{
1f1ae829 1694 zoom(widget, 0.5);
561eba2a 1695}
1696
1697void zoom_extended(GtkWidget * widget, gpointer user_data)
1698{
1f1ae829 1699 zoom(widget, 0);
561eba2a 1700}
1701
1702void go_to_time(GtkWidget * widget, gpointer user_data)
1703{
1704 g_printf("Go to time\n");
1705}
1706
1707void show_time_frame(GtkWidget * widget, gpointer user_data)
1708{
1709 g_printf("Show time frame\n");
1710}
1711
1712
1713/* callback function */
1714
1715void
1716on_empty_traceset_activate (GtkMenuItem *menuitem,
1717 gpointer user_data)
1718{
68b48a45 1719 create_new_window((GtkWidget*)menuitem, user_data, FALSE);
561eba2a 1720}
1721
1722
1723void
1724on_clone_traceset_activate (GtkMenuItem *menuitem,
1725 gpointer user_data)
1726{
68b48a45 1727 create_new_window((GtkWidget*)menuitem, user_data, TRUE);
561eba2a 1728}
1729
abe346a3 1730
1731/* create_new_tab calls create_tab to construct a new tab in the main window
1732 */
1733
6ced96ef 1734Tab *create_new_tab(GtkWidget* widget, gpointer user_data){
a1a2b649 1735 gchar label[PATH_MAX];
2901f314 1736 MainWindow * mw_data = get_window_data_struct(widget);
4266dc7f 1737
2901f314 1738 GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
561eba2a 1739 if(notebook == NULL){
1740 g_printf("Notebook does not exist\n");
6ced96ef 1741 return NULL;
1742 }
1743 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1744 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1745 Tab *copy_tab;
1746
1747 if(!page) {
1748 copy_tab = NULL;
1749 } else {
1750 copy_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
561eba2a 1751 }
4266dc7f 1752
6b1d3120 1753 strcpy(label,"Page");
eb38aea5 1754 if(get_label(mw_data, label,"Get the name of the tab","Please input tab's name"))
6ced96ef 1755 return (create_tab (mw_data, copy_tab, notebook, label));
561eba2a 1756}
1757
2901f314 1758void
1759on_tab_activate (GtkMenuItem *menuitem,
1760 gpointer user_data)
1761{
1762 create_new_tab((GtkWidget*)menuitem, user_data);
1763}
1764
561eba2a 1765
1766void
1767on_open_activate (GtkMenuItem *menuitem,
1768 gpointer user_data)
1769{
1770 open_traceset((GtkWidget*)menuitem, user_data);
1771}
1772
1773
1774void
1775on_close_activate (GtkMenuItem *menuitem,
1776 gpointer user_data)
1777{
bca3b81f 1778 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 1779 main_window_destructor(mw_data);
561eba2a 1780}
1781
1782
4266dc7f 1783/* remove the current tab from the main window
abe346a3 1784 */
1785
561eba2a 1786void
27a559b9 1787on_close_tab_activate (GtkWidget *widget,
561eba2a 1788 gpointer user_data)
1789{
4266dc7f 1790 gint page_num;
2061e03d 1791 GtkWidget * notebook;
4266dc7f 1792 GtkWidget * page;
27a559b9 1793 MainWindow * mw_data = get_window_data_struct(widget);
1794 notebook = lookup_widget(widget, "MNotebook");
2061e03d 1795 if(notebook == NULL){
1796 g_printf("Notebook does not exist\n");
1797 return;
1798 }
4266dc7f 1799
1800 page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
2061e03d 1801
4266dc7f 1802 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
2061e03d 1803
561eba2a 1804}
1805
27a559b9 1806void
1807on_close_tab_X_clicked (GtkWidget *widget,
1808 gpointer user_data)
1809{
1810 gint page_num;
1811 GtkWidget *notebook = lookup_widget(widget, "MNotebook");
1812 if(notebook == NULL){
1813 g_printf("Notebook does not exist\n");
1814 return;
1815 }
1816
1817 if((page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), widget)) != -1)
1818 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
1819
1820}
1821
561eba2a 1822
1823void
1824on_add_trace_activate (GtkMenuItem *menuitem,
1825 gpointer user_data)
1826{
1827 add_trace((GtkWidget*)menuitem, user_data);
1828}
1829
1830
1831void
1832on_remove_trace_activate (GtkMenuItem *menuitem,
1833 gpointer user_data)
1834{
1835 remove_trace((GtkWidget*)menuitem, user_data);
1836}
1837
1838
1839void
1840on_save_activate (GtkMenuItem *menuitem,
1841 gpointer user_data)
1842{
1843 save((GtkWidget*)menuitem, user_data);
1844}
1845
1846
1847void
1848on_save_as_activate (GtkMenuItem *menuitem,
1849 gpointer user_data)
1850{
1851 save_as((GtkWidget*)menuitem, user_data);
1852}
1853
1854
1855void
1856on_quit_activate (GtkMenuItem *menuitem,
1857 gpointer user_data)
1858{
2061e03d 1859 gtk_main_quit ();
561eba2a 1860}
1861
1862
1863void
1864on_cut_activate (GtkMenuItem *menuitem,
1865 gpointer user_data)
1866{
1867 g_printf("Cut\n");
1868}
1869
1870
1871void
1872on_copy_activate (GtkMenuItem *menuitem,
1873 gpointer user_data)
1874{
1875 g_printf("Copye\n");
1876}
1877
1878
1879void
1880on_paste_activate (GtkMenuItem *menuitem,
1881 gpointer user_data)
1882{
1883 g_printf("Paste\n");
1884}
1885
1886
1887void
1888on_delete_activate (GtkMenuItem *menuitem,
1889 gpointer user_data)
1890{
1891 g_printf("Delete\n");
1892}
1893
1894
1895void
1896on_zoom_in_activate (GtkMenuItem *menuitem,
1897 gpointer user_data)
1898{
1899 zoom_in((GtkWidget*)menuitem, user_data);
1900}
1901
1902
1903void
1904on_zoom_out_activate (GtkMenuItem *menuitem,
1905 gpointer user_data)
1906{
1907 zoom_out((GtkWidget*)menuitem, user_data);
1908}
1909
1910
1911void
1912on_zoom_extended_activate (GtkMenuItem *menuitem,
1913 gpointer user_data)
1914{
1915 zoom_extended((GtkWidget*)menuitem, user_data);
1916}
1917
1918
1919void
1920on_go_to_time_activate (GtkMenuItem *menuitem,
1921 gpointer user_data)
1922{
1923 go_to_time((GtkWidget*)menuitem, user_data);
1924}
1925
1926
1927void
1928on_show_time_frame_activate (GtkMenuItem *menuitem,
1929 gpointer user_data)
1930{
1931 show_time_frame((GtkWidget*)menuitem, user_data);
1932}
1933
1934
1935void
1936on_move_viewer_up_activate (GtkMenuItem *menuitem,
1937 gpointer user_data)
1938{
1939 move_up_viewer((GtkWidget*)menuitem, user_data);
1940}
1941
1942
1943void
1944on_move_viewer_down_activate (GtkMenuItem *menuitem,
1945 gpointer user_data)
1946{
1947 move_down_viewer((GtkWidget*)menuitem, user_data);
1948}
1949
1950
1951void
1952on_remove_viewer_activate (GtkMenuItem *menuitem,
1953 gpointer user_data)
1954{
1955 delete_viewer((GtkWidget*)menuitem, user_data);
1956}
1957
49bf71b5 1958void
1959on_trace_filter_activate (GtkMenuItem *menuitem,
1960 gpointer user_data)
1961{
1962 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
1963 LttvTracesetSelector * s;
4266dc7f 1964 GtkWidget * w;
6ced96ef 1965 GtkWidget * notebook = lookup_widget(GTK_WIDGET(menuitem), "MNotebook");
1966
1967 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
1968 gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
1969 Tab *tab;
1970
1971 if(!page) {
1972 return;
1973 } else {
1974 tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
1975 }
4266dc7f 1976
1977 w = gtk_multi_vpaned_get_widget(tab->multi_vpaned);
49bf71b5 1978
1979 s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
1980 if(!s){
1981 g_printf("There is no viewer yet\n");
1982 return;
1983 }
a8c0f09d 1984 if(get_filter_selection(s, "Configure trace and tracefile filter", "Select traces and tracefiles")){
a43d67ba 1985 //FIXME report filter change
1986 //update_traceset(mw_data);
1987 //call_pending_read_hooks(mw_data);
4266dc7f 1988 //lttvwindow_report_current_time(mw_data,&(tab->current_time));
a8c0f09d 1989 }
49bf71b5 1990}
1991
1992void
1993on_trace_facility_activate (GtkMenuItem *menuitem,
1994 gpointer user_data)
1995{
1996 g_printf("Trace facility selector: %s\n");
1997}
561eba2a 1998
abe346a3 1999
2000/* Dispaly a file selection dialogue to let user select a module, then call
2001 * lttv_module_load(), finally insert tool button and menu entry in the main window
2002 * for the loaded module
2003 */
2004
561eba2a 2005void
2006on_load_module_activate (GtkMenuItem *menuitem,
2007 gpointer user_data)
2008{
36b3c068 2009 char ** dir;
2010 gint id;
a1a2b649 2011 char str[PATH_MAX], *str1;
bca3b81f 2012 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
68b48a45 2013 GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a module");
3658a338 2014 if(remember_plugins_dir[0] != '\0')
2015 gtk_file_selection_set_filename(file_selector, remember_plugins_dir);
68b48a45 2016 gtk_file_selection_hide_fileop_buttons(file_selector);
36b3c068 2017
2018 str[0] = '\0';
68b48a45 2019 id = gtk_dialog_run(GTK_DIALOG(file_selector));
36b3c068 2020 switch(id){
2021 case GTK_RESPONSE_ACCEPT:
2022 case GTK_RESPONSE_OK:
68b48a45 2023 dir = gtk_file_selection_get_selections (file_selector);
a1a2b649 2024 strncpy(str,dir[0],PATH_MAX);
2025 strncpy(remember_plugins_dir,dir[0],PATH_MAX);
3872a20e 2026 str1 = strrchr(str,'/');
2027 if(str1)str1++;
2028 else{
2029 str1 = strrchr(str,'\\');
2030 str1++;
2031 }
08b1c66e 2032 lttv_module_require(str1, NULL);
36b3c068 2033 g_strfreev(dir);
2034 case GTK_RESPONSE_REJECT:
2035 case GTK_RESPONSE_CANCEL:
2036 default:
68b48a45 2037 gtk_widget_destroy((GtkWidget*)file_selector);
36b3c068 2038 break;
2039 }
2040 g_printf("Load module: %s\n", str);
561eba2a 2041}
2042
2043
abe346a3 2044/* Display all loaded modules, let user to select a module to unload
2045 * by calling lttv_module_unload
2046 */
2047
561eba2a 2048void
2049on_unload_module_activate (GtkMenuItem *menuitem,
2050 gpointer user_data)
2051{
36b3c068 2052 int i;
08b1c66e 2053 GPtrArray *name;
2054 char *unload_module_name;
36b3c068 2055 guint nb;
08b1c66e 2056 LttvLibrary *library;
2057 LttvLibraryInfo library_info;
bca3b81f 2058 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
36b3c068 2059
08b1c66e 2060 name = g_ptr_array_new();
2061 nb = lttv_library_number();
2062
36b3c068 2063 for(i=0;i<nb;i++){
08b1c66e 2064 library = lttv_library_get(i);
2065 lttv_library_info(library, &library_info);
2066 if(library_info.load_count > 0) g_ptr_array_add(name, library_info.name);
36b3c068 2067 }
2068
08b1c66e 2069 unload_module_name =get_unload_module((char **)(name->pdata), name->len);
36b3c068 2070
2071 if(unload_module_name){
2072 for(i=0;i<nb;i++){
08b1c66e 2073 library = lttv_library_get(i);
2074 lttv_library_info(library, &library_info);
2075 if(strcmp(unload_module_name, library_info.name) == 0){
001d8606 2076 lttv_library_unload(library);
36b3c068 2077 break;
2078 }
2079 }
2080 }
2081
08b1c66e 2082 g_ptr_array_free(name, TRUE);
561eba2a 2083}
2084
2085
abe346a3 2086/* Display a directory dialogue to let user select a path for module searching
2087 */
2088
561eba2a 2089void
2090on_add_module_search_path_activate (GtkMenuItem *menuitem,
2091 gpointer user_data)
2092{
68b48a45 2093 GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select module path");
67b98724 2094 const char * dir;
fc188b78 2095 gint id;
2096
bca3b81f 2097 MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
3658a338 2098 if(remember_plugins_dir[0] != '\0')
2099 gtk_dir_selection_set_filename(file_selector, remember_plugins_dir);
fc188b78 2100
68b48a45 2101 id = gtk_dialog_run(GTK_DIALOG(file_selector));
fc188b78 2102 switch(id){
2103 case GTK_RESPONSE_ACCEPT:
2104 case GTK_RESPONSE_OK:
68b48a45 2105 dir = gtk_dir_selection_get_dir (file_selector);
a1a2b649 2106 strncpy(remember_plugins_dir,dir,PATH_MAX);
2107 strncat(remember_plugins_dir,"/",PATH_MAX);
08b1c66e 2108 lttv_library_path_add(dir);
fc188b78 2109 case GTK_RESPONSE_REJECT:
2110 case GTK_RESPONSE_CANCEL:
2111 default:
68b48a45 2112 gtk_widget_destroy((GtkWidget*)file_selector);
fc188b78 2113 break;
6b1d3120 2114 }
561eba2a 2115}
2116
2117
2118void
2119on_color_activate (GtkMenuItem *menuitem,
2120 gpointer user_data)
2121{
2122 g_printf("Color\n");
2123}
2124
2125
2126void
2127on_filter_activate (GtkMenuItem *menuitem,
2128 gpointer user_data)
2129{
2130 g_printf("Filter\n");
2131}
2132
2133
2134void
2135on_save_configuration_activate (GtkMenuItem *menuitem,
2136 gpointer user_data)
2137{
2138 g_printf("Save configuration\n");
2139}
2140
2141
2142void
2143on_content_activate (GtkMenuItem *menuitem,
2144 gpointer user_data)
2145{
2146 g_printf("Content\n");
2147}
2148
2149
2150void
2151on_about_activate (GtkMenuItem *menuitem,
2152 gpointer user_data)
2153{
2154 g_printf("About...\n");
2155}
2156
2157
2158void
2159on_button_new_clicked (GtkButton *button,
2160 gpointer user_data)
2161{
6f7ad7ae 2162 create_new_window((GtkWidget*)button, user_data, TRUE);
561eba2a 2163}
2164
2901f314 2165void
2166on_button_new_tab_clicked (GtkButton *button,
2167 gpointer user_data)
2168{
2169 create_new_tab((GtkWidget*)button, user_data);
2170}
561eba2a 2171
2172void
2173on_button_open_clicked (GtkButton *button,
2174 gpointer user_data)
2175{
2176 open_traceset((GtkWidget*)button, user_data);
2177}
2178
2179
2180void
2181on_button_add_trace_clicked (GtkButton *button,
2182 gpointer user_data)
2183{
2184 add_trace((GtkWidget*)button, user_data);
2185}
2186
2187
2188void
2189on_button_remove_trace_clicked (GtkButton *button,
2190 gpointer user_data)
2191{
2192 remove_trace((GtkWidget*)button, user_data);
2193}
2194
9878c8a4 2195void
2196on_button_redraw_clicked (GtkButton *button,
2197 gpointer user_data)
2198{
2199 redraw((GtkWidget*)button, user_data);
2200}
2201
2202void
2203on_button_continue_processing_clicked (GtkButton *button,
2204 gpointer user_data)
2205{
2206 continue_processing((GtkWidget*)button, user_data);
2207}
2208
2209void
2210on_button_stop_processing_clicked (GtkButton *button,
2211 gpointer user_data)
2212{
2213 stop_processing((GtkWidget*)button, user_data);
2214}
2215
2216
561eba2a 2217
2218void
2219on_button_save_clicked (GtkButton *button,
2220 gpointer user_data)
2221{
2222 save((GtkWidget*)button, user_data);
2223}
2224
2225
2226void
2227on_button_save_as_clicked (GtkButton *button,
2228 gpointer user_data)
2229{
2230 save_as((GtkWidget*)button, user_data);
2231}
2232
2233
2234void
2235on_button_zoom_in_clicked (GtkButton *button,
2236 gpointer user_data)
2237{
2238 zoom_in((GtkWidget*)button, user_data);
2239}
2240
2241
2242void
2243on_button_zoom_out_clicked (GtkButton *button,
2244 gpointer user_data)
2245{
2246 zoom_out((GtkWidget*)button, user_data);
2247}
2248
2249
2250void
2251on_button_zoom_extended_clicked (GtkButton *button,
2252 gpointer user_data)
2253{
2254 zoom_extended((GtkWidget*)button, user_data);
2255}
2256
2257
2258void
2259on_button_go_to_time_clicked (GtkButton *button,
2260 gpointer user_data)
2261{
2262 go_to_time((GtkWidget*)button, user_data);
2263}
2264
2265
2266void
2267on_button_show_time_frame_clicked (GtkButton *button,
2268 gpointer user_data)
2269{
2270 show_time_frame((GtkWidget*)button, user_data);
2271}
2272
2273
2274void
2275on_button_move_up_clicked (GtkButton *button,
2276 gpointer user_data)
2277{
2278 move_up_viewer((GtkWidget*)button, user_data);
2279}
2280
2281
2282void
2283on_button_move_down_clicked (GtkButton *button,
2284 gpointer user_data)
2285{
2286 move_down_viewer((GtkWidget*)button, user_data);
2287}
2288
2289
2290void
2291on_button_delete_viewer_clicked (GtkButton *button,
2292 gpointer user_data)
2293{
2294 delete_viewer((GtkWidget*)button, user_data);
2295}
2296
2297void
2d262115 2298on_MWindow_destroy (GtkWidget *widget,
561eba2a 2299 gpointer user_data)
2300{
2d262115 2301 MainWindow *main_window = get_window_data_struct(widget);
ef68c3ac 2302 LttvIAttribute *attributes = main_window->attributes;
2303 LttvAttributeValue value;
e4d09234 2304
ef68c3ac 2305 //This is unnecessary, since widgets will be destroyed
2306 //by the main window widget anyway.
2307 //remove_all_menu_toolbar_constructors(main_window, NULL);
2308
2309 g_assert(lttv_iattribute_find_by_path(attributes,
2310 "viewers/menu", LTTV_POINTER, &value));
2311 lttv_menus_destroy((LttvMenus*)*(value.v_pointer));
2312
501e4e70 2313 g_assert(lttv_iattribute_find_by_path(attributes,
ef68c3ac 2314 "viewers/toolbar", LTTV_POINTER, &value));
2315 lttv_toolbars_destroy((LttvToolbars*)*(value.v_pointer));
2d262115 2316
ef68c3ac 2317 g_object_unref(main_window->attributes);
2318 g_main_window_list = g_slist_remove(g_main_window_list, main_window);
561eba2a 2319
ef68c3ac 2320 g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
2d262115 2321 if(g_slist_length(g_main_window_list) == 0)
7a859036 2322 gtk_main_quit ();
561eba2a 2323}
2324
58eecf4a 2325gboolean
2326on_MWindow_configure (GtkWidget *widget,
2327 GdkEventConfigure *event,
2328 gpointer user_data)
2329{
2330 MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
2331 float width = event->width;
58eecf4a 2332 TimeWindow time_win;
2333 double ratio;
2334 TimeInterval *time_span;
2335 LttTime time;
bd24a9af 2336
2337 // MD : removed time width modification upon resizing of the main window.
2338 // The viewers will redraw themselves completely, without time interval
2339 // modification.
2340/* while(tab){
58eecf4a 2341 if(mw_data->window_width){
2342 time_span = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->Time_Span ;
2343 time_win = tab->time_window;
2344 ratio = width / mw_data->window_width;
2345 tab->time_window.time_width = ltt_time_mul(time_win.time_width,ratio);
2346 time = ltt_time_sub(time_span->endTime, time_win.start_time);
2347 if(ltt_time_compare(time, tab->time_window.time_width) < 0){
2348 tab->time_window.time_width = time;
2349 }
2350 }
2351 tab = tab->next;
2352 }
2353
2354 mw_data->window_width = (int)width;
bd24a9af 2355 */
58eecf4a 2356 return FALSE;
2357}
561eba2a 2358
abe346a3 2359/* Set current tab
2360 */
2361
561eba2a 2362void
2363on_MNotebook_switch_page (GtkNotebook *notebook,
2364 GtkNotebookPage *page,
2365 guint page_num,
2366 gpointer user_data)
2367{
47cd8a09 2368
561eba2a 2369}
2370
abe346a3 2371
2372/* callback function to check or uncheck the check box (filter)
2373 */
2374
49bf71b5 2375void checkbox_changed(GtkTreeView *treeview,
2376 GtkTreePath *arg1,
2377 GtkTreeViewColumn *arg2,
2378 gpointer user_data)
2379{
2380 GtkTreeStore * store = (GtkTreeStore *)gtk_tree_view_get_model (treeview);
2381 GtkTreeIter iter;
2382 gboolean value;
2383
2384 if (gtk_tree_model_get_iter ((GtkTreeModel *)store, &iter, arg1)){
2385 gtk_tree_model_get ((GtkTreeModel *)store, &iter, CHECKBOX_COLUMN, &value, -1);
2386 value = value? FALSE : TRUE;
2387 gtk_tree_store_set (GTK_TREE_STORE (store), &iter, CHECKBOX_COLUMN, value, -1);
2388 }
2389
2390}
2391
abe346a3 2392
2393/* According to user's selection, update selector(filter)
2394 */
2395
49bf71b5 2396void update_filter(LttvTracesetSelector *s, GtkTreeStore *store )
2397{
ed3b99b6 2398 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
2399 int i, j, k, nb_eventtype;
49bf71b5 2400 LttvTraceSelector * trace;
2401 LttvTracefileSelector * tracefile;
ed3b99b6 2402 LttvEventtypeSelector * eventtype;
2403 gboolean value, value1, value2;
49bf71b5 2404
2405 if(gtk_tree_model_get_iter_first((GtkTreeModel*)store, &iter)){
2406 i = 0;
2407 do{
ed3b99b6 2408 trace = lttv_traceset_selector_trace_get(s, i);
2409 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
49bf71b5 2410 gtk_tree_model_get ((GtkTreeModel*)store, &iter, CHECKBOX_COLUMN, &value,-1);
2411 if(value){
2412 j = 0;
2413 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter, &iter)){
2414 do{
ed3b99b6 2415 if(j<1){//eventtype selector for trace
2416 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value2,-1);
2417 if(value2){
2418 k=0;
2419 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter1, &child_iter)){
2420 do{
2421 eventtype = lttv_trace_selector_eventtype_get(trace,k);
2422 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
2423 lttv_eventtype_selector_set_selected(eventtype,value2);
2424 k++;
2425 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter1));
2426 }
2427 }
2428 }else{ //tracefile selector
2429 tracefile = lttv_trace_selector_tracefile_get(trace, j - 1);
2430 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter, CHECKBOX_COLUMN, &value1,-1);
2431 lttv_tracefile_selector_set_selected(tracefile,value1);
2432 if(value1){
2433 gtk_tree_model_iter_children((GtkTreeModel*)store, &child_iter1, &child_iter); //eventtype selector
2434 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter1, CHECKBOX_COLUMN, &value2,-1);
2435 if(value2){
2436 k = 0;
2437 if(gtk_tree_model_iter_children ((GtkTreeModel*)store, &child_iter2, &child_iter1)){
2438 do{//eventtype selector for tracefile
2439 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
2440 gtk_tree_model_get ((GtkTreeModel*)store, &child_iter2, CHECKBOX_COLUMN, &value2,-1);
2441 lttv_eventtype_selector_set_selected(eventtype,value2);
2442 k++;
2443 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter2));
2444 }
2445 }
2446 }
2447 }
49bf71b5 2448 j++;
2449 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &child_iter));
2450 }
2451 }
2452 lttv_trace_selector_set_selected(trace,value);
2453 i++;
2454 }while(gtk_tree_model_iter_next((GtkTreeModel*)store, &iter));
2455 }
2456}
2457
abe346a3 2458
2459/* Display a dialogue showing all eventtypes and traces, let user to select the interested
2460 * eventtypes, tracefiles and traces (filter)
2461 */
2462
a8c0f09d 2463gboolean get_filter_selection(LttvTracesetSelector *s,char *title, char * column_title)
49bf71b5 2464{
2465 GtkWidget * dialogue;
2466 GtkTreeStore * store;
2467 GtkWidget * tree;
2468 GtkWidget * scroll_win;
2469 GtkCellRenderer * renderer;
2470 GtkTreeViewColumn * column;
ed3b99b6 2471 GtkTreeIter iter, child_iter, child_iter1, child_iter2;
2472 int i, j, k, id, nb_trace, nb_tracefile, nb_eventtype;
49bf71b5 2473 LttvTraceSelector * trace;
2474 LttvTracefileSelector * tracefile;
ed3b99b6 2475 LttvEventtypeSelector * eventtype;
49bf71b5 2476 char * name;
2477 gboolean checked;
2478
2479 dialogue = gtk_dialog_new_with_buttons(title,
2480 NULL,
2481 GTK_DIALOG_MODAL,
2482 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
2483 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
2484 NULL);
ed3b99b6 2485 gtk_window_set_default_size((GtkWindow*)dialogue, 300, 500);
49bf71b5 2486
2487 store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING);
2488 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
2489 g_object_unref (G_OBJECT (store));
2490 g_signal_connect (G_OBJECT (tree), "row-activated",
2491 G_CALLBACK (checkbox_changed),
2492 NULL);
2493
2494
2495 renderer = gtk_cell_renderer_toggle_new ();
2496 gtk_cell_renderer_toggle_set_radio((GtkCellRendererToggle *)renderer, FALSE);
2497
2498 g_object_set (G_OBJECT (renderer),"activatable", TRUE, NULL);
2499
2500 column = gtk_tree_view_column_new_with_attributes ("Checkbox",
2501 renderer,
2502 "active", CHECKBOX_COLUMN,
2503 NULL);
2504 gtk_tree_view_column_set_alignment (column, 0.5);
2505 gtk_tree_view_column_set_fixed_width (column, 20);
2506 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
2507
2508 renderer = gtk_cell_renderer_text_new ();
2509 column = gtk_tree_view_column_new_with_attributes (column_title,
2510 renderer,
2511 "text", NAME_COLUMN,
2512 NULL);
2513 gtk_tree_view_column_set_alignment (column, 0.0);
2514 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
2515 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (tree), FALSE);
2516
2517 scroll_win = gtk_scrolled_window_new (NULL, NULL);
2518 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
2519 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
2520 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
2521
2522 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
2523
2524 gtk_widget_show(scroll_win);
2525 gtk_widget_show(tree);
2526
ed3b99b6 2527 nb_trace = lttv_traceset_selector_trace_number(s);
49bf71b5 2528 for(i=0;i<nb_trace;i++){
ed3b99b6 2529 trace = lttv_traceset_selector_trace_get(s, i);
49bf71b5 2530 name = lttv_trace_selector_get_name(trace);
2531 gtk_tree_store_append (store, &iter, NULL);
2532 checked = lttv_trace_selector_get_selected(trace);
2533 gtk_tree_store_set (store, &iter,
2534 CHECKBOX_COLUMN,checked,
2535 NAME_COLUMN,name,
2536 -1);
ed3b99b6 2537
2538 gtk_tree_store_append (store, &child_iter, &iter);
2539 gtk_tree_store_set (store, &child_iter,
2540 CHECKBOX_COLUMN, checked,
2541 NAME_COLUMN,"eventtype",
2542 -1);
2543
2544 nb_eventtype = lttv_trace_selector_eventtype_number(trace);
2545 for(j=0;j<nb_eventtype;j++){
2546 eventtype = lttv_trace_selector_eventtype_get(trace,j);
2547 name = lttv_eventtype_selector_get_name(eventtype);
2548 checked = lttv_eventtype_selector_get_selected(eventtype);
2549 gtk_tree_store_append (store, &child_iter1, &child_iter);
2550 gtk_tree_store_set (store, &child_iter1,
2551 CHECKBOX_COLUMN, checked,
2552 NAME_COLUMN,name,
2553 -1);
2554 }
2555
2556 nb_tracefile = lttv_trace_selector_tracefile_number(trace);
49bf71b5 2557 for(j=0;j<nb_tracefile;j++){
ed3b99b6 2558 tracefile = lttv_trace_selector_tracefile_get(trace, j);
49bf71b5 2559 name = lttv_tracefile_selector_get_name(tracefile);
2560 gtk_tree_store_append (store, &child_iter, &iter);
2561 checked = lttv_tracefile_selector_get_selected(tracefile);
2562 gtk_tree_store_set (store, &child_iter,
2563 CHECKBOX_COLUMN, checked,
2564 NAME_COLUMN,name,
2565 -1);
ed3b99b6 2566
2567 gtk_tree_store_append (store, &child_iter1, &child_iter);
2568 gtk_tree_store_set (store, &child_iter1,
2569 CHECKBOX_COLUMN, checked,
2570 NAME_COLUMN,"eventtype",
2571 -1);
2572
2573 for(k=0;k<nb_eventtype;k++){
2574 eventtype = lttv_tracefile_selector_eventtype_get(tracefile,k);
2575 name = lttv_eventtype_selector_get_name(eventtype);
2576 checked = lttv_eventtype_selector_get_selected(eventtype);
2577 gtk_tree_store_append (store, &child_iter2, &child_iter1);
2578 gtk_tree_store_set (store, &child_iter2,
2579 CHECKBOX_COLUMN, checked,
2580 NAME_COLUMN,name,
2581 -1);
2582 }
49bf71b5 2583 }
2584 }
2585
2586 id = gtk_dialog_run(GTK_DIALOG(dialogue));
2587 switch(id){
2588 case GTK_RESPONSE_ACCEPT:
2589 case GTK_RESPONSE_OK:
2590 update_filter(s, store);
a8c0f09d 2591 gtk_widget_destroy(dialogue);
2592 return TRUE;
49bf71b5 2593 case GTK_RESPONSE_REJECT:
2594 case GTK_RESPONSE_CANCEL:
2595 default:
2596 gtk_widget_destroy(dialogue);
2597 break;
2598 }
a8c0f09d 2599 return FALSE;
49bf71b5 2600}
2601
abe346a3 2602
2603/* Select a trace which will be removed from traceset
2604 */
2605
2176f952 2606char * get_remove_trace(char ** all_trace_name, int nb_trace)
2607{
2608 return get_selection(all_trace_name, nb_trace,
2609 "Select a trace", "Trace pathname");
2610}
abe346a3 2611
2612
2613/* Select a module which will be unloaded
2614 */
2615
36b3c068 2616char * get_unload_module(char ** loaded_module_name, int nb_module)
2176f952 2617{
2618 return get_selection(loaded_module_name, nb_module,
2619 "Select an unload module", "Module pathname");
2620}
2621
abe346a3 2622
2623/* Display a dialogue which shows all selectable items, let user to
2624 * select one of them
2625 */
2626
2176f952 2627char * get_selection(char ** loaded_module_name, int nb_module,
2628 char *title, char * column_title)
36b3c068 2629{
2630 GtkWidget * dialogue;
2631 GtkWidget * scroll_win;
2632 GtkWidget * tree;
2633 GtkListStore * store;
2634 GtkTreeViewColumn * column;
2635 GtkCellRenderer * renderer;
2636 GtkTreeSelection * select;
2637 GtkTreeIter iter;
2638 gint id, i;
2639 char * unload_module_name = NULL;
2640
2176f952 2641 dialogue = gtk_dialog_new_with_buttons(title,
36b3c068 2642 NULL,
2643 GTK_DIALOG_MODAL,
2644 GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
2645 GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT,
2646 NULL);
2647 gtk_window_set_default_size((GtkWindow*)dialogue, 500, 200);
2648
2649 scroll_win = gtk_scrolled_window_new (NULL, NULL);
2650 gtk_widget_show ( scroll_win);
2651 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
2652 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2653
2654 store = gtk_list_store_new (N_COLUMNS,G_TYPE_STRING);
2655 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL (store));
2656 gtk_widget_show ( tree);
2657 g_object_unref (G_OBJECT (store));
2658
2659 renderer = gtk_cell_renderer_text_new ();
2176f952 2660 column = gtk_tree_view_column_new_with_attributes (column_title,
36b3c068 2661 renderer,
2662 "text", MODULE_COLUMN,
2663 NULL);
2664 gtk_tree_view_column_set_alignment (column, 0.5);
2665 gtk_tree_view_column_set_fixed_width (column, 150);
2666 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
2667
2668 select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
2669 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
2670
2671 gtk_container_add (GTK_CONTAINER (scroll_win), tree);
2672
2673 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogue)->vbox), scroll_win,TRUE, TRUE,0);
2674
2675 for(i=0;i<nb_module;i++){
2676 gtk_list_store_append (store, &iter);
2677 gtk_list_store_set (store, &iter, MODULE_COLUMN,loaded_module_name[i],-1);
2678 }
2679
2680 id = gtk_dialog_run(GTK_DIALOG(dialogue));
2681 switch(id){
2682 case GTK_RESPONSE_ACCEPT:
2683 case GTK_RESPONSE_OK:
2684 if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
2685 gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
2686 }
2687 case GTK_RESPONSE_REJECT:
2688 case GTK_RESPONSE_CANCEL:
2689 default:
2690 gtk_widget_destroy(dialogue);
2691 break;
2692 }
2693
2694 return unload_module_name;
2695}
5723fa24 2696
abe346a3 2697
ef68c3ac 2698/* Insert all menu entry and tool buttons into this main window
001d8606 2699 * for modules.
2700 *
abe346a3 2701 */
2702
6c9d86dd 2703void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
5723fa24 2704{
2705 int i;
2706 GdkPixbuf *pixbuf;
42fcbb71 2707 lttvwindow_viewer_constructor constructor;
001d8606 2708 LttvMenus * global_menu, * instance_menu;
2709 LttvToolbars * global_toolbar, * instance_toolbar;
6c9d86dd 2710 LttvMenuClosure *menu_item;
2711 LttvToolbarClosure *toolbar_item;
5723fa24 2712 LttvAttributeValue value;
001d8606 2713 LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
501e4e70 2714 LttvIAttribute *attributes = mw->attributes;
001d8606 2715 GtkWidget * tool_menu_title_menu, *new_widget, *pixmap;
2716
2717 g_assert(lttv_iattribute_find_by_path(global_attributes,
2718 "viewers/menu", LTTV_POINTER, &value));
2719 if(*(value.v_pointer) == NULL)
501e4e70 2720 *(value.v_pointer) = lttv_menus_new();
001d8606 2721 global_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 2722
2723 g_assert(lttv_iattribute_find_by_path(attributes,
2724 "viewers/menu", LTTV_POINTER, &value));
001d8606 2725 if(*(value.v_pointer) == NULL)
501e4e70 2726 *(value.v_pointer) = lttv_menus_new();
001d8606 2727 instance_menu = (LttvMenus*)*(value.v_pointer);
5723fa24 2728
001d8606 2729
2730
2731 g_assert(lttv_iattribute_find_by_path(global_attributes,
2732 "viewers/toolbar", LTTV_POINTER, &value));
2733 if(*(value.v_pointer) == NULL)
501e4e70 2734 *(value.v_pointer) = lttv_toolbars_new();
001d8606 2735 global_toolbar = (LttvToolbars*)*(value.v_pointer);
2736
2737 g_assert(lttv_iattribute_find_by_path(attributes,
2738 "viewers/toolbar", LTTV_POINTER, &value));
2739 if(*(value.v_pointer) == NULL)
501e4e70 2740 *(value.v_pointer) = lttv_toolbars_new();
001d8606 2741 instance_toolbar = (LttvToolbars*)*(value.v_pointer);
2742
2743 /* Add missing menu entries to window instance */
2744 for(i=0;i<global_menu->len;i++) {
6c9d86dd 2745 menu_item = &g_array_index(global_menu, LttvMenuClosure, i);
2746
2747 //add menu_item to window instance;
2748 constructor = menu_item->con;
2749 tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
2750 new_widget =
501e4e70 2751 gtk_menu_item_new_with_mnemonic (menu_item->menu_text);
6c9d86dd 2752 gtk_container_add (GTK_CONTAINER (tool_menu_title_menu),
2753 new_widget);
2754 g_signal_connect ((gpointer) new_widget, "activate",
2755 G_CALLBACK (insert_viewer_wrap),
2756 constructor);
2757 gtk_widget_show (new_widget);
2758 lttv_menus_add(instance_menu, menu_item->con,
2759 menu_item->menu_path,
2760 menu_item->menu_text,
2761 new_widget);
001d8606 2762
001d8606 2763 }
2764
2765 /* Add missing toolbar entries to window instance */
2766 for(i=0;i<global_toolbar->len;i++) {
6c9d86dd 2767 toolbar_item = &g_array_index(global_toolbar, LttvToolbarClosure, i);
2768
2769 //add toolbar_item to window instance;
2770 constructor = toolbar_item->con;
2771 tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1");
2772 pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)toolbar_item->pixmap);
2773 pixmap = gtk_image_new_from_pixbuf(pixbuf);
2774 new_widget =
2775 gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
2776 GTK_TOOLBAR_CHILD_BUTTON,
2777 NULL,
2778 "",
2779 toolbar_item->tooltip, NULL,
2780 pixmap, NULL, NULL);
2781 gtk_label_set_use_underline(
2782 GTK_LABEL (((GtkToolbarChild*) (
2783 g_list_last (GTK_TOOLBAR
2784 (tool_menu_title_menu)->children)->data))->label),
2785 TRUE);
2786 gtk_container_set_border_width (GTK_CONTAINER (new_widget), 1);
2787 g_signal_connect ((gpointer) new_widget,
2788 "clicked",
2789 G_CALLBACK (insert_viewer_wrap),
2790 constructor);
2791 gtk_widget_show (new_widget);
001d8606 2792
6c9d86dd 2793 lttv_toolbars_add(instance_toolbar, toolbar_item->con,
2794 toolbar_item->tooltip,
2795 toolbar_item->pixmap,
2796 new_widget);
001d8606 2797
5723fa24 2798 }
6c9d86dd 2799
5723fa24 2800}
2801
abe346a3 2802
2803/* Create a main window
2804 */
2805
08b1c66e 2806void construct_main_window(MainWindow * parent)
5723fa24 2807{
2a2fa4f0 2808 g_debug("construct_main_window()");
68b48a45 2809 GtkWidget * new_window; /* New generated main window */
bca3b81f 2810 MainWindow * new_m_window;/* New main window structure */
5723fa24 2811 GtkNotebook * notebook;
f7afe191 2812 LttvIAttribute *attributes =
2813 LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
2814 LttvAttributeValue value;
6ced96ef 2815 Tab *new_tab;
2061e03d 2816
bca3b81f 2817 new_m_window = g_new(MainWindow, 1);
5723fa24 2818
2819 // Add the object's information to the module's array
68b48a45 2820 g_main_window_list = g_slist_append(g_main_window_list, new_m_window);
5723fa24 2821
f7afe191 2822
68b48a45 2823 new_window = create_MWindow();
2824 gtk_widget_show (new_window);
5723fa24 2825
bca3b81f 2826 new_m_window->mwindow = new_window;
a43d67ba 2827 new_m_window->attributes = attributes;
5723fa24 2828
001d8606 2829 g_assert(lttv_iattribute_find_by_path(attributes,
2830 "viewers/menu", LTTV_POINTER, &value));
501e4e70 2831 *(value.v_pointer) = lttv_menus_new();
001d8606 2832
501e4e70 2833 g_assert(lttv_iattribute_find_by_path(attributes,
001d8606 2834 "viewers/toolbar", LTTV_POINTER, &value));
501e4e70 2835 *(value.v_pointer) = lttv_toolbars_new();
2061e03d 2836
6c9d86dd 2837 add_all_menu_toolbar_constructors(new_m_window, NULL);
5723fa24 2838
2d262115 2839 g_object_set_data_full(G_OBJECT(new_window),
2840 "main_window_data",
2841 (gpointer)new_m_window,
2842 (GDestroyNotify)g_free);
5723fa24 2843 //create a default tab
bca3b81f 2844 notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
5723fa24 2845 if(notebook == NULL){
2846 g_printf("Notebook does not exist\n");
2847 return;
2848 }
27a559b9 2849 gtk_notebook_popup_enable (GTK_NOTEBOOK(notebook));
5723fa24 2850 //for now there is no name field in LttvTraceset structure
2851 //Use "Traceset" as the label for the default tab
6ced96ef 2852 if(parent) {
2853 GtkWidget * parent_notebook = lookup_widget(parent->mwindow, "MNotebook");
2854 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(parent_notebook),
2855 gtk_notebook_get_current_page(GTK_NOTEBOOK(parent_notebook)));
2856 Tab *parent_tab;
2857
2858 if(!page) {
2859 parent_tab = NULL;
2860 } else {
2861 parent_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info");
2862 }
2863 new_tab = create_tab(new_m_window, parent_tab, notebook, "Traceset");
2864 } else {
2865 new_tab = create_tab(new_m_window, NULL, notebook, "Traceset");
4266dc7f 2866 if(g_init_trace != NULL){
6ced96ef 2867 lttvwindow_add_trace(new_tab,
4266dc7f 2868 g_init_trace);
2869 }
2870 }
5723fa24 2871
ef68c3ac 2872 g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
5723fa24 2873}
2874
abe346a3 2875
2876/* Free the memory occupied by a tab structure
2877 * destroy the tab
2878 */
2879
bca3b81f 2880void tab_destructor(Tab * tab_instance)
f7afe191 2881{
716e4367 2882 int i, nb, ref_count;
2883 LttvTrace * trace;
2884
bca3b81f 2885 if(tab_instance->attributes)
501e4e70 2886 g_object_unref(tab_instance->attributes);
2887
2888 if(tab_instance->interrupted_state)
2889 g_object_unref(tab_instance->interrupted_state);
2890
2061e03d 2891
716e4367 2892 if(tab_instance->traceset_info->traceset_context != NULL){
784705cc 2893 //remove state update hooks
2894 lttv_state_remove_event_hooks(
2895 (LttvTracesetState*)tab_instance->traceset_info->
2896 traceset_context);
716e4367 2897 lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
2898 traceset_context));
2899 g_object_unref(tab_instance->traceset_info->traceset_context);
2900 }
2901 if(tab_instance->traceset_info->traceset != NULL) {
2902 nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
2903 for(i = 0 ; i < nb ; i++) {
2904 trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
2905 ref_count = lttv_trace_get_ref_number(trace);
49bf71b5 2906 if(ref_count <= 1){
a1a2b649 2907 ltt_trace_close(lttv_trace(trace));
49bf71b5 2908 }
716e4367 2909 }
2910 }
a43d67ba 2911 lttv_traceset_destroy(tab_instance->traceset_info->traceset);
501e4e70 2912 /* Remove the idle events requests processing function of the tab */
2913 g_idle_remove_by_data(tab_instance);
2914
2915 g_slist_free(tab_instance->events_requests);
716e4367 2916 g_free(tab_instance->traceset_info);
68b48a45 2917 g_free(tab_instance);
f7afe191 2918}
2919
abe346a3 2920
2921/* Create a tab and insert it into the current main window
2922 */
2923
6ced96ef 2924Tab* create_tab(MainWindow * mw, Tab *copy_tab,
716e4367 2925 GtkNotebook * notebook, char * label)
5723fa24 2926{
2927 GList * list;
6ced96ef 2928 Tab * tab;
68b48a45 2929 LttTime tmp_time;
a43d67ba 2930
abe346a3 2931 //create a new tab data structure
6ced96ef 2932 tab = g_new(Tab,1);
716e4367 2933
abe346a3 2934 //construct and initialize the traceset_info
6ced96ef 2935 tab->traceset_info = g_new(TracesetInfo,1);
a43d67ba 2936
4266dc7f 2937 if(copy_tab) {
6ced96ef 2938 tab->traceset_info->traceset =
4266dc7f 2939 lttv_traceset_copy(copy_tab->traceset_info->traceset);
2940 } else {
6ced96ef 2941 tab->traceset_info->traceset = lttv_traceset_new();
716e4367 2942 }
20fde85f 2943
2944//FIXME : this is g_debug level
2945 lttv_attribute_write_xml(
6ced96ef 2946 lttv_traceset_attribute(tab->traceset_info->traceset),
20fde85f 2947 stdout,
2948 0, 4);
2949 fflush(stdout);
2950
2951
716e4367 2952 //FIXME copy not implemented in lower level
6ced96ef 2953 tab->traceset_info->traceset_context =
716e4367 2954 g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
6ced96ef 2955 g_assert(tab->traceset_info->traceset_context != NULL);
716e4367 2956 lttv_context_init(
6ced96ef 2957 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context),
2958 tab->traceset_info->traceset);
784705cc 2959 //add state update hooks
2960 lttv_state_add_event_hooks(
6ced96ef 2961 (LttvTracesetState*)tab->traceset_info->traceset_context);
784705cc 2962
abe346a3 2963 //determine the current_time and time_window of the tab
6ced96ef 2964 if(copy_tab != NULL){
2965 tab->time_window = copy_tab->time_window;
2966 tab->current_time = copy_tab->current_time;
5723fa24 2967 }else{
6ced96ef 2968 tab->time_window.start_time =
2969 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
2970 time_span.start_time;
f7afe191 2971 if(DEFAULT_TIME_WIDTH_S <
6ced96ef 2972 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
2973 time_span.end_time.tv_sec)
68b48a45 2974 tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
f7afe191 2975 else
68b48a45 2976 tmp_time.tv_sec =
6ced96ef 2977 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
2978 time_span.end_time.tv_sec;
68b48a45 2979 tmp_time.tv_nsec = 0;
6ced96ef 2980 tab->time_window.time_width = tmp_time ;
2981 tab->current_time.tv_sec =
2982 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
2983 time_span.start_time.tv_sec;
2984 tab->current_time.tv_nsec =
2985 LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
2986 time_span.start_time.tv_nsec;
5723fa24 2987 }
6ced96ef 2988 tab->attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
2989 tab->interrupted_state = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
2990 tab->multi_vpaned = (GtkMultiVPaned*)gtk_multi_vpaned_new();
2991 gtk_widget_show((GtkWidget*)tab->multi_vpaned);
2992 tab->mw = mw;
27a559b9 2993
3c031040 2994 /*{
2995 // Display a label with a X
27a559b9 2996 GtkWidget *w_hbox = gtk_hbox_new(FALSE, 4);
2997 GtkWidget *w_label = gtk_label_new (label);
2998 GtkWidget *pixmap = create_pixmap(GTK_WIDGET(notebook), "close.png");
2999 GtkWidget *w_button = gtk_button_new ();
3000 gtk_container_add(GTK_CONTAINER(w_button), pixmap);
3001 //GtkWidget *w_button = gtk_button_new_with_label("x");
3002
3003 gtk_button_set_relief(GTK_BUTTON(w_button), GTK_RELIEF_NONE);
3004
3005 gtk_box_pack_start(GTK_BOX(w_hbox), w_label, TRUE, TRUE, 0);
3006 gtk_box_pack_end(GTK_BOX(w_hbox), w_button, FALSE,
3007 FALSE, 0);
a43d67ba 3008
27a559b9 3009 g_signal_connect_swapped (w_button, "clicked",
3010 G_CALLBACK (on_close_tab_X_clicked),
3011 tab->multi_vpaned);
5723fa24 3012
3c031040 3013 gtk_widget_set_state(w_button, GTK_STATE_ACTIVE);
3014
27a559b9 3015 gtk_widget_show (w_label);
3016 gtk_widget_show (pixmap);
3017 gtk_widget_show (w_button);
3018 gtk_widget_show (w_hbox);
3019
3020 tab->label = w_hbox;
3c031040 3021 }*/
3022
3023
3024 tab->label = gtk_label_new (label);
3025 gtk_widget_show (tab->label);
3026
3027
501e4e70 3028 /* Start with empty events requests list */
6ced96ef 3029 tab->events_requests = NULL;
3030 tab->events_request_pending = FALSE;
a43d67ba 3031
f7afe191 3032 g_object_set_data_full(
6ced96ef 3033 G_OBJECT(tab->multi_vpaned),
f7afe191 3034 "Tab_Info",
6ced96ef 3035 tab,
3036 (GDestroyNotify)tab_destructor);
540edb40 3037
784705cc 3038 //insert tab into notebook
6ced96ef 3039 gtk_notebook_append_page(notebook,
3040 (GtkWidget*)tab->multi_vpaned,
3041 tab->label);
5723fa24 3042 list = gtk_container_get_children(GTK_CONTAINER(notebook));
3043 gtk_notebook_set_current_page(notebook,g_list_length(list)-1);
a43d67ba 3044 // always show : not if(g_list_length(list)>1)
3045 gtk_notebook_set_show_tabs(notebook, TRUE);
3046
6ced96ef 3047 return tab;
a43d67ba 3048}
3049
501e4e70 3050/*
3051 * execute_events_requests
3052 *
3053 * Idle function that executes the pending requests for a tab.
3054 *
3055 * @return return value : TRUE : keep the idle function, FALSE : remove it.
3056 */
3057gboolean execute_events_requests(Tab *tab)
a43d67ba 3058{
501e4e70 3059 return ( lttvwindow_process_pending_requests(tab) );
a43d67ba 3060}
3061
This page took 0.1846 seconds and 4 git commands to generate.