X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Fmodules%2Fgui%2Flttvwindow%2Flttvwindow%2Fcallbacks.c;h=018947aaf9778e05825c3052fa87a8207fe4c2fe;hb=7c3c01d14690eee4d3c262f300a888680ae7a053;hp=0b5756e9a2d318ba609e9d5f889737deb7eb47e2;hpb=f61f4dca50e13aa52b1ca3941c8f420848f4353f;p=lttv.git diff --git a/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c b/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c index 0b5756e9..018947aa 100644 --- a/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c +++ b/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c @@ -31,22 +31,30 @@ #include "callbacks.h" #include "interface.h" #include "support.h" -#include -#include -#include +#include #include #include #include +#include +#include +#ifdef BABEL_CLEANUP #include +#include +#endif /* BABEL_CLEANUP */ #include #include #include #include +#include #include #include #include #include +#include +#include +#include + static LttTime lttvwindow_default_time_width = { 1, 0 }; #define CLIP_BUF 256 // size of clipboard buffer @@ -73,12 +81,21 @@ char * get_selection(MainWindow *mw, void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, GtkNotebook * notebook, char * label); +int update_traceset(Tab *tab, LttvTraceset *traceset); + static void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor); LttvPluginTab *create_new_tab(GtkWidget* widget, gpointer user_data); static gboolean lttvwindow_process_pending_requests(Tab *tab); +static void on_timebar_starttime_changed(Timebar *timebar, + gpointer user_data); +static void on_timebar_endtime_changed(Timebar *timebar, + gpointer user_data); +static void on_timebar_currenttime_changed(Timebar *timebar, + gpointer user_data); + enum { CHECKBOX_COLUMN, NAME_COLUMN, @@ -91,262 +108,6 @@ enum N_COLUMNS }; -/* Pasting routines */ - -static void MEventBox1a_receive(GtkClipboard *clipboard, - const gchar *text, - gpointer data) -{ - if(text == NULL) return; - Tab *tab = (Tab *)data; - gchar buffer[CLIP_BUF]; - gchar *ptr = buffer, *ptr_ssec, *ptr_snsec, *ptr_esec, *ptr_ensec; - - strncpy(buffer, text, CLIP_BUF); - - /* start */ - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_ssec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - ptr++; - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_snsec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - - /* end */ - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_esec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - ptr++; - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_ensec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry1), - (double)strtoul(ptr_ssec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry2), - (double)strtoul(ptr_snsec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry3), - (double)strtoul(ptr_esec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4), - (double)strtoul(ptr_ensec, NULL, 10)); -} - -static gboolean on_MEventBox1a_paste(GtkWidget *widget, GdkEventButton *event, - gpointer data) -{ - Tab *tab = (Tab*)data; - - GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(), - GDK_SELECTION_PRIMARY); - gtk_clipboard_request_text(clip, - (GtkClipboardTextReceivedFunc)MEventBox1a_receive, - (gpointer)tab); - return 0; -} - - -/* Start */ -static void MEventBox1b_receive(GtkClipboard *clipboard, - const gchar *text, - gpointer data) -{ - if(text == NULL) return; - Tab *tab = (Tab *)data; - gchar buffer[CLIP_BUF]; - gchar *ptr = buffer, *ptr_sec, *ptr_nsec; - - strncpy(buffer, text, CLIP_BUF); - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_sec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - ptr++; - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_nsec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry1), - (double)strtoul(ptr_sec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry2), - (double)strtoul(ptr_nsec, NULL, 10)); -} - -/* Start */ -static gboolean on_MEventBox1b_paste(GtkWidget *widget, GdkEventButton *event, - gpointer data) -{ - Tab *tab = (Tab*)data; - - GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(), - GDK_SELECTION_PRIMARY); - gtk_clipboard_request_text(clip, - (GtkClipboardTextReceivedFunc)MEventBox1b_receive, - (gpointer)tab); - return 0; -} - -/* End */ -static void MEventBox3b_receive(GtkClipboard *clipboard, - const gchar *text, - gpointer data) -{ - if(text == NULL) return; - Tab *tab = (Tab *)data; - gchar buffer[CLIP_BUF]; - gchar *ptr = buffer, *ptr_sec, *ptr_nsec; - - strncpy(buffer, text, CLIP_BUF); - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_sec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - ptr++; - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_nsec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry3), - (double)strtoul(ptr_sec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4), - (double)strtoul(ptr_nsec, NULL, 10)); -} - -/* End */ -static gboolean on_MEventBox3b_paste(GtkWidget *widget, GdkEventButton *event, - gpointer data) -{ - Tab *tab = (Tab*)data; - - GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(), - GDK_SELECTION_PRIMARY); - gtk_clipboard_request_text(clip, - (GtkClipboardTextReceivedFunc)MEventBox3b_receive, - (gpointer)tab); - return 0; -} - -/* Current */ -static void MEventBox5b_receive(GtkClipboard *clipboard, - const gchar *text, - gpointer data) -{ - if(text == NULL) return; - Tab *tab = (Tab *)data; - gchar buffer[CLIP_BUF]; - gchar *ptr = buffer, *ptr_sec, *ptr_nsec; - - strncpy(buffer, text, CLIP_BUF); - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_sec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - ptr++; - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_nsec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry5), - (double)strtoul(ptr_sec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry6), - (double)strtoul(ptr_nsec, NULL, 10)); -} - -/* Current */ -static gboolean on_MEventBox5b_paste(GtkWidget *widget, GdkEventButton *event, - gpointer data) -{ - Tab *tab = (Tab*)data; - - GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(), - GDK_SELECTION_PRIMARY); - gtk_clipboard_request_text(clip, - (GtkClipboardTextReceivedFunc)MEventBox5b_receive, - (gpointer)tab); - return 0; -} - -/* Interval */ -static void MEventBox8_receive(GtkClipboard *clipboard, - const gchar *text, - gpointer data) -{ - if(text == NULL) return; - Tab *tab = (Tab *)data; - gchar buffer[CLIP_BUF]; - gchar *ptr = buffer, *ptr_sec, *ptr_nsec; - - strncpy(buffer, text, CLIP_BUF); - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_sec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - ptr++; - - while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* remove leading junk */ - ptr_nsec = ptr; - while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; - /* read all the first number */ - *ptr = '\0'; - - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry7), - (double)strtoul(ptr_sec, NULL, 10)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry8), - (double)strtoul(ptr_nsec, NULL, 10)); -} - -/* Interval */ -static gboolean on_MEventBox8_paste(GtkWidget *widget, GdkEventButton *event, - gpointer data) -{ - Tab *tab = (Tab*)data; - - GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(), - GDK_SELECTION_PRIMARY); - gtk_clipboard_request_text(clip, - (GtkClipboardTextReceivedFunc)MEventBox8_receive, - (gpointer)tab); - return 0; -} #if 0 static void on_top_notify(GObject *gobject, @@ -417,10 +178,8 @@ insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data) void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor) { GtkWidget * viewer_container; - MainWindow * mw_data = get_window_data_struct(widget); GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget * viewer; - TimeInterval * time_interval; GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); LttvPluginTab *ptab; @@ -435,7 +194,7 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor) viewer_container = tab->viewer_container; - viewer = (GtkWidget*)constructor(ptab); + viewer = (GtkWidget*)constructor(&ptab->parent); if(viewer) { //gtk_multivpaned_widget_add(GTK_MULTIVPANED(multivpaned), viewer); @@ -465,12 +224,70 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor) int SetTraceset(Tab * tab, LttvTraceset *traceset) { - LttvTracesetContext *tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - TimeWindow new_time_window = tab->time_window; - LttTime new_current_time = tab->current_time; + + TimeInterval time_span; + TimeWindow new_time_window; + LttTime new_current_time; +#ifdef BABEL_CLEANUP + // Perform time synchronization on the traces + if (syncTraceset(tsc)) + { + /* There is some time-dependant information that was calculated during + * context initialization. Destroy the old contexts and initialize new + * ones. + * Modified from lttvwindow_add_trace() + */ + // Keep a reference to the traces so they are not freed + for(i = 0; i < lttv_traceset_number(traceset); i++) + { + LttvTrace *trace = lttv_traceset_get(traceset, i); + lttv_trace_ref(trace); + } + + // Remove state update hooks + lttv_state_remove_event_hooks( + (LttvTracesetState*)tab->traceset_info->traceset_context); + + lttv_context_fini(LTTV_TRACESET_CONTEXT( + tab->traceset_info->traceset_context)); + g_object_unref(tab->traceset_info->traceset_context); + + for(i = 0; i < lttv_traceset_number(traceset); i++) + { + LttvTrace *trace = lttv_traceset_get(traceset, i); + lttvwindowtraces_remove_trace(trace); + lttvwindowtraces_add_trace(trace); + } + + // Create new context + tab->traceset_info->traceset_context = + g_object_new(LTTV_TRACESET_STATS_TYPE, NULL); + lttv_context_init(LTTV_TRACESET_CONTEXT(tab->traceset_info-> + traceset_context), traceset); + + // Add state update hooks + lttv_state_add_event_hooks( + (LttvTracesetState*)tab->traceset_info->traceset_context); + + // Remove local reference to the traces + for(i=0; itraceset_info->traceset_context); + } +#endif /*BABEL_CLEANUP*/ + + time_span = lttv_traceset_get_time_span_real(traceset); + + tab->traceset_info->traceset = traceset; + + new_time_window = tab->time_window; + new_current_time = tab->current_time; + /* Set the tab's time window and current time if * out of bounds */ if(ltt_time_compare(tab->time_window.start_time, time_span.start_time) < 0 @@ -495,75 +312,54 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset) new_time_window.end_time = ltt_time_add(new_time_window.start_time, new_time_window.time_width) ; } + lttv_state_add_event_hooks(traceset); - - -#if 0 - /* Set scrollbar */ - GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar)); - LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time); + //TODO ybrosseau 2012-08-03 Temporarly compute checkpoints right at the adding + // of the traceset + //Compute the traceset state checkpoint + { + + EventsRequest *events_request = g_new(EventsRequest, 1); + + LttvHooks *hook_adder = lttv_hooks_new(); + lttv_hooks_add(hook_adder, lttv_state_save_hook_add_event_hooks, NULL, + LTTV_PRIO_DEFAULT); + LttvHooks *hook_remover = lttv_hooks_new(); + lttv_hooks_add(hook_remover, lttv_state_save_hook_remove_event_hooks, + NULL, LTTV_PRIO_DEFAULT); - g_object_set(G_OBJECT(adjustment), - "lower", - 0.0, /* lower */ - "upper", - ltt_time_to_double(upper) - * NANOSECONDS_PER_SECOND, /* upper */ - "step_increment", - ltt_time_to_double(tab->time_window.time_width) - / SCROLL_STEP_PER_PAGE - * NANOSECONDS_PER_SECOND, /* step increment */ - "page_increment", - ltt_time_to_double(tab->time_window.time_width) - * NANOSECONDS_PER_SECOND, /* page increment */ - "page_size", - ltt_time_to_double(tab->time_window.time_width) - * NANOSECONDS_PER_SECOND, /* page size */ - NULL); - gtk_adjustment_changed(adjustment); - - g_object_set(G_OBJECT(adjustment), - "value", - ltt_time_to_double( - ltt_time_sub(tab->time_window.start_time, time_span.start_time)) - * NANOSECONDS_PER_SECOND, /* value */ - NULL); - gtk_adjustment_value_changed(adjustment); - - /* set the time bar. The value callbacks will change their nsec themself */ - /* start seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry1), - (double)time_span.start_time.tv_sec, - (double)time_span.end_time.tv_sec); - - /* end seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry3), - (double)time_span.start_time.tv_sec, - (double)time_span.end_time.tv_sec); - - /* current seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry5), - (double)time_span.start_time.tv_sec, - (double)time_span.end_time.tv_sec); -#endif //0 + // Fill the events request + events_request->owner = NULL; + events_request->viewer_data = NULL; + events_request->servicing = FALSE; + events_request->start_time = ltt_time_zero; + events_request->start_position = NULL; + events_request->stop_flag = FALSE; + events_request->end_time = ltt_time_infinite; + events_request->num_events = G_MAXUINT; + events_request->end_position = NULL; + events_request->trace = 1; //fixed /* FIXME */ + events_request->before_chunk_traceset = NULL; + events_request->before_chunk_trace = NULL; + events_request->before_chunk_tracefile = NULL; + events_request->event = NULL; + events_request->after_chunk_tracefile = NULL; + events_request->after_chunk_trace = NULL; + events_request->after_chunk_traceset = NULL; + events_request->before_request = hook_adder; + events_request->after_request = hook_remover; + + lttvwindow_events_request(tab, events_request); + } /* Finally, call the update hooks of the viewers */ - LttvHooks * tmp; - LttvAttributeValue value; - gint retval = 0; - - - g_assert( lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatetraceset", LTTV_POINTER, &value)); - - tmp = (LttvHooks*)*(value.v_pointer); - if(tmp == NULL) retval = 1; - else lttv_hooks_call(tmp,traceset); + gint retval = update_traceset(tab, traceset); time_change_manager(tab, new_time_window); current_time_change_manager(tab, new_current_time); return retval; + } /** @@ -599,17 +395,48 @@ int SetFilter(Tab * tab, gpointer filter) * @param tab viewer's tab */ -void update_traceset(Tab *tab) +int update_traceset(Tab *tab, LttvTraceset *traceset) { LttvAttributeValue value; LttvHooks * tmp; - g_assert(lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatetraceset", LTTV_POINTER, &value)); + gboolean retval; + + retval= lttv_iattribute_find_by_path(tab->attributes, + "hooks/updatetraceset", + LTTV_POINTER, + &value); + g_assert(retval); tmp = (LttvHooks*)*(value.v_pointer); - if(tmp == NULL) return; - lttv_hooks_call(tmp, NULL); + if(tmp == NULL) { + retval = 1; + } else { + lttv_hooks_call(tmp, traceset); + } + return retval; } +/** + Call hooks register to get update on traceset time span changes +*/ +int notify_time_span_changed(Tab *tab) +{ + LttvAttributeValue value; + LttvHooks * tmp; + gboolean retval; + + retval= lttv_iattribute_find_by_path(tab->attributes, + "hooks/updatetimespan", + LTTV_POINTER, + &value); + g_assert(retval); + tmp = (LttvHooks*)*(value.v_pointer); + if(tmp == NULL) { + retval = 1; + } else { + lttv_hooks_call(tmp, NULL); + } + return retval; +} /* get_label function is used to get user input, it displays an input * box, which allows user to input a string @@ -753,7 +580,6 @@ gint viewer_container_position(GtkWidget *container, GtkWidget *child) void move_down_viewer(GtkWidget * widget, gpointer user_data) { - MainWindow * mw = get_window_data_struct(widget); GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), @@ -787,7 +613,6 @@ void move_down_viewer(GtkWidget * widget, gpointer user_data) void move_up_viewer(GtkWidget * widget, gpointer user_data) { - MainWindow * mw = get_window_data_struct(widget); GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), @@ -828,7 +653,6 @@ void move_up_viewer(GtkWidget * widget, gpointer user_data) void delete_viewer(GtkWidget * widget, gpointer user_data) { - MainWindow * mw = get_window_data_struct(widget); GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), @@ -853,7 +677,8 @@ void delete_viewer(GtkWidget * widget, gpointer user_data) g_object_set_data(G_OBJECT(tab->viewer_container), "focused_viewer", NULL); } - +#if UNFINISHED_FEATURE +/* TODO ybrosseau 2012-03-15: Function is half implemented. Should be removed */ /* open_traceset will open a traceset saved in a file * Right now, it is not finished yet, (not working) * FIXME @@ -890,7 +715,7 @@ void open_traceset(GtkWidget * widget, gpointer user_data) } } - +#endif /* lttvwindow_process_pending_requests * * Process requests for parts of the trace from viewers. @@ -922,14 +747,14 @@ void open_traceset(GtkWidget * widget, gpointer user_data) gboolean lttvwindow_process_pending_requests(Tab *tab) { - GtkWidget* widget; - LttvTracesetContext *tsc; - LttvTracefileContext *tfc; + + LttvTraceset *ts; + GSList *list_in = NULL; LttTime end_time; guint end_nb_events; guint count; - LttvTracesetContextPosition *end_position; + LttvTracesetPosition *end_position; if(lttvwindow_preempt_count > 0) return TRUE; @@ -941,7 +766,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* There is no events requests pending : we should never have been called! */ g_assert(g_slist_length(list_out) != 0); - tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); + ts = tab->traceset_info->traceset; //set the cursor to be X shape, indicating that the computer is busy in doing its job #if 0 @@ -958,7 +783,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* Preliminary check for no trace in traceset */ /* Unregister the routine if empty, empty list_out too */ - if(lttv_traceset_number(tsc->ts) == 0) { + if(lttv_traceset_number(ts) == 0) { /* - For each req in list_out */ GSList *iter = list_out; @@ -971,13 +796,13 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* - Call end request for req */ if(events_request->servicing == TRUE) - lttv_hooks_call(events_request->after_request, (gpointer)tsc); + lttv_hooks_call(events_request->after_request, (gpointer)ts); /* - remove req from list_out */ /* Destroy the request */ remove = TRUE; free_data = TRUE; - + //TODO ybrosseau: This if is always true /* Go to next */ if(remove) { @@ -997,9 +822,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) guint iter_trace=0; for(iter_trace=0; - iter_tracets); + iter_tracets, iter_trace); + LttvTrace *trace_v = lttv_traceset_get(ts, iter_trace); if(lttvwindowtraces_lock(trace_v) != 0) { g_critical("Foreground processing : Unable to get trace lock"); @@ -1009,9 +834,10 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) } /* 0.2 Seek tracefiles positions to context position */ +#ifdef BABEL_CLEANUP //g_assert(lttv_process_traceset_seek_position(tsc, sync_position) == 0); lttv_process_traceset_synchronize_tracefiles(tsc); - +#endif /* Events processing algorithm implementation */ /* Warning : the gtk_events_pending takes a LOT of cpu time. So what we do @@ -1068,7 +894,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) if(event_request_lpos->start_position != NULL && event_request_list_out->start_position != NULL) { - comp = lttv_traceset_context_pos_pos_compare + //TODO ybrosseau: this compare is in fact an equal, so the behavior might not be right. + comp = lttv_traceset_position_time_compare (event_request_lpos->start_position, event_request_list_out->start_position); } else { @@ -1091,7 +918,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) if(event_request_lpos != NULL && event_request_lpos->start_position != NULL) { - lpos_start_time = lttv_traceset_context_position_get_time( + lpos_start_time = lttv_traceset_position_get_time( event_request_lpos->start_position); } @@ -1131,26 +958,30 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* 1.2 Seek */ { - tfc = lttv_traceset_context_get_current_tfc(tsc); + g_assert(g_slist_length(list_in)>0); EventsRequest *events_request = g_slist_nth_data(list_in, 0); +#ifdef DEBUG guint seek_count; +#endif /* 1.2.1 If first request in list_in is a time request */ if(events_request->start_position == NULL) { /* - If first req in list_in start time != current time */ - if(tfc == NULL || ltt_time_compare(events_request->start_time, - tfc->timestamp) != 0) + //TODO ybrosseau: if commented out, since it was only affecting the g_debug + //if(tfc == NULL || ltt_time_compare(events_request->start_time, + // tfc->timestamp) != 0) /* - Seek to that time */ g_debug("SEEK TIME : %lu, %lu", events_request->start_time.tv_sec, events_request->start_time.tv_nsec); - //lttv_process_traceset_seek_time(tsc, events_request->start_time); - lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc), + lttv_state_traceset_seek_time_closest(ts, events_request->start_time); /* Process the traceset with only state hooks */ +#ifdef DEBUG seek_count = - lttv_process_traceset_middle(tsc, +#endif //DEBUG + lttv_process_traceset_middle(ts, events_request->start_time, G_MAXUINT, NULL); #ifdef DEBUG @@ -1160,46 +991,51 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) } else { LttTime pos_time; - LttvTracefileContext *tfc = - lttv_traceset_context_get_current_tfc(tsc); + //LttvTracefileContext *tfc = + // lttv_traceset_context_get_current_tfc(tsc); /* Else, the first request in list_in is a position request */ /* If first req in list_in pos != current pos */ g_assert(events_request->start_position != NULL); g_debug("SEEK POS time : %lu, %lu", - lttv_traceset_context_position_get_time( + lttv_traceset_position_get_time( events_request->start_position).tv_sec, - lttv_traceset_context_position_get_time( + lttv_traceset_position_get_time( events_request->start_position).tv_nsec); - if(tfc) { - g_debug("SEEK POS context time : %lu, %lu", - tfc->timestamp.tv_sec, - tfc->timestamp.tv_nsec); + /*if(tfc) {*/ if(0) { + /* g_debug("SEEK POS context time : %lu, %lu", + tfc->timestamp.tv_sec, + tfc->timestamp.tv_nsec); */ } else { g_debug("SEEK POS context time : %lu, %lu", ltt_time_infinite.tv_sec, ltt_time_infinite.tv_nsec); } g_assert(events_request->start_position != NULL); - if(lttv_traceset_context_ctx_pos_compare(tsc, - events_request->start_position) != 0) { + //TODO ybrosseau: for now, always seek + if(/*lttv_traceset_context_ctx_pos_compare(tsc, + events_request->start_position) != 0*/1) { /* 1.2.2.1 Seek to that position */ g_debug("SEEK POSITION"); //lttv_process_traceset_seek_position(tsc, events_request->start_position); - pos_time = lttv_traceset_context_position_get_time( + pos_time = lttv_traceset_position_get_time( events_request->start_position); - lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc), + lttv_state_traceset_seek_time_closest(ts, pos_time); + //lttv_traceset_seek_to_position( events_request->start_position); /* Process the traceset with only state hooks */ +#ifdef DEBUG seek_count = - lttv_process_traceset_middle(tsc, +#endif + lttv_process_traceset_middle(ts, ltt_time_infinite, G_MAXUINT, events_request->start_position); - g_assert(lttv_traceset_context_ctx_pos_compare(tsc, - events_request->start_position) == 0); + + //g_assert(lttv_traceset_context_ctx_pos_compare(tsc, + // events_request->start_position) == 0); } @@ -1209,7 +1045,6 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* 1.3 Add hooks and call before request for all list_in members */ { GSList *iter = NULL; - for(iter=list_in;iter!=NULL;iter=g_slist_next(iter)) { EventsRequest *events_request = (EventsRequest*)iter->data; /* 1.3.1 If !servicing */ @@ -1217,32 +1052,31 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* - begin request hooks called * - servicing = TRUE */ - lttv_hooks_call(events_request->before_request, (gpointer)tsc); + lttv_hooks_call(events_request->before_request, (gpointer)ts); events_request->servicing = TRUE; } /* 1.3.2 call before chunk * 1.3.3 events hooks added */ - if(events_request->trace == -1) - lttv_process_traceset_begin(tsc, + //TODO ybrosseau 2012-07-10: || TRUE added since we only support + // traceset wide requests + if(events_request->trace == -1 || TRUE) { + + lttv_process_traceset_begin(ts, events_request->before_chunk_traceset, events_request->before_chunk_trace, - events_request->before_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); - else { - guint nb_trace = lttv_traceset_number(tsc->ts); + events_request->event + ); + } else { + guint nb_trace = lttv_traceset_number(ts); g_assert((guint)events_request->trace < nb_trace && events_request->trace > -1); - LttvTraceContext *tc = tsc->traces[events_request->trace]; + LttvTrace *trace = lttv_traceset_get(ts, events_request->trace); - lttv_hooks_call(events_request->before_chunk_traceset, tsc); + lttv_hooks_call(events_request->before_chunk_traceset, ts); - lttv_trace_context_add_hooks(tc, - events_request->before_chunk_trace, - events_request->before_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); + lttv_trace_add_hooks(trace, events_request->before_chunk_trace, + events_request->event); } } } @@ -1260,26 +1094,26 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* - Call before chunk * - events hooks added */ - if(events_request->trace == -1) - lttv_process_traceset_begin(tsc, + //TODO ybrosseau 2012-07-10: || TRUE added since we only support + // traceset wide requests + if(events_request->trace == -1 || TRUE) + lttv_process_traceset_begin(ts, events_request->before_chunk_traceset, events_request->before_chunk_trace, - events_request->before_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); + events_request->event + ); else { - guint nb_trace = lttv_traceset_number(tsc->ts); + guint nb_trace = lttv_traceset_number(ts); g_assert((guint)events_request->trace < nb_trace && events_request->trace > -1); - LttvTraceContext *tc = tsc->traces[events_request->trace]; + LttvTrace *trace = lttv_traceset_get(ts, events_request->trace); - lttv_hooks_call(events_request->before_chunk_traceset, tsc); + lttv_hooks_call(events_request->before_chunk_traceset, ts); - lttv_trace_context_add_hooks(tc, + lttv_trace_add_hooks(trace, events_request->before_chunk_trace, - events_request->before_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); + events_request->event + ); } iter = g_slist_next(iter); @@ -1287,7 +1121,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) } { - tfc = lttv_traceset_context_get_current_tfc(tsc); + /* 2.1 For each req of list_out */ GSList *iter = list_out; @@ -1300,7 +1134,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* if req.start time == current context time * or req.start position == current position*/ - if( ltt_time_compare(events_request->start_time, + /* if( ltt_time_compare(events_request->start_time, tfc->timestamp) == 0 || (events_request->start_position != NULL @@ -1308,6 +1142,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) lttv_traceset_context_ctx_pos_compare(tsc, events_request->start_position) == 0) ) { + */ + if(lttv_traceset_position_compare_current(ts, events_request->start_position) == 0) { + /* - Add to list_in, remove from list_out */ list_in = g_slist_append(list_in, events_request); remove = TRUE; @@ -1318,32 +1155,33 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* - begin request hooks called * - servicing = TRUE */ - lttv_hooks_call(events_request->before_request, (gpointer)tsc); + lttv_hooks_call(events_request->before_request, (gpointer)ts); events_request->servicing = TRUE; } /* call before chunk * events hooks added */ - if(events_request->trace == -1) - lttv_process_traceset_begin(tsc, + //TODO ybrosseau 2012-07-10: || TRUE added since we only support + // traceset wide requests + if(events_request->trace == -1 || TRUE) + lttv_process_traceset_begin(ts, events_request->before_chunk_traceset, events_request->before_chunk_trace, - events_request->before_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); + events_request->event + ); else { - guint nb_trace = lttv_traceset_number(tsc->ts); + guint nb_trace = lttv_traceset_number(ts); g_assert((guint)events_request->trace < nb_trace && events_request->trace > -1); - LttvTraceContext *tc = tsc->traces[events_request->trace]; + LttvTrace* trace = lttv_traceset_get(ts,events_request->trace); - lttv_hooks_call(events_request->before_chunk_traceset, tsc); + lttv_hooks_call(events_request->before_chunk_traceset, ts); - lttv_trace_context_add_hooks(tc, - events_request->before_chunk_trace, - events_request->before_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); + lttv_trace_add_hooks(trace, + events_request->before_chunk_trace, + + events_request->event); + } @@ -1424,7 +1262,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) EventsRequest *events_request = (EventsRequest*)iter->data; if(events_request->end_position != NULL && end_position != NULL && - lttv_traceset_context_pos_pos_compare(events_request->end_position, + lttv_traceset_position_time_compare(events_request->end_position, end_position) <0) end_position = events_request->end_position; } @@ -1438,7 +1276,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) EventsRequest *events_request = (EventsRequest*)iter->data; if(events_request->end_position != NULL && end_position != NULL && - lttv_traceset_context_pos_pos_compare(events_request->end_position, + lttv_traceset_position_time_compare(events_request->end_position, end_position) <0) end_position = events_request->end_position; } @@ -1446,24 +1284,25 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) { /* 4. Call process traceset middle */ - g_debug("Calling process traceset middle with %p, %lu sec %lu nsec, %u nb ev, %p end pos", tsc, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position); - count = lttv_process_traceset_middle(tsc, end_time, end_nb_events, end_position); + g_debug("Calling process traceset middle with %p, %lu sec %lu nsec, %u nb ev, %p end pos", ts, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position); + count = lttv_process_traceset_middle(ts, end_time, end_nb_events, end_position); +#ifdef BABEL_CLEANUP tfc = lttv_traceset_context_get_current_tfc(tsc); if(tfc != NULL) g_debug("Context time after middle : %lu, %lu", tfc->timestamp.tv_sec, tfc->timestamp.tv_nsec); else g_debug("End of trace reached after middle."); - +#endif } + { /* 5. After process traceset middle */ - tfc = lttv_traceset_context_get_current_tfc(tsc); - /* - if current context time > traceset.end time */ - if(tfc == NULL || ltt_time_compare(tfc->timestamp, - tsc->time_span.end_time) > 0) { + LttTime curTime = lttv_traceset_get_current_time(ts); + /* - if the iterator is not valid anymore (got to the end) */ + if(bt_ctf_iter_read_event(ts->iter) == NULL) { /* - For each req in list_in */ GSList *iter = list_in; @@ -1476,33 +1315,33 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* - Remove events hooks for req * - Call end chunk for req */ - - if(events_request->trace == -1) - lttv_process_traceset_end(tsc, + //TODO ybrosseau 2012-07-10: || TRUE added since we only support + // traceset wide requests + if(events_request->trace == -1 || TRUE) + lttv_process_traceset_end(ts, events_request->after_chunk_traceset, events_request->after_chunk_trace, - events_request->after_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); + + events_request->event); else { - guint nb_trace = lttv_traceset_number(tsc->ts); + guint nb_trace = lttv_traceset_number(ts); g_assert(events_request->trace < nb_trace && events_request->trace > -1); - LttvTraceContext *tc = tsc->traces[events_request->trace]; + LttvTrace *trace = lttv_traceset_get(ts,events_request->trace); - lttv_trace_context_remove_hooks(tc, + lttv_trace_remove_hooks(trace, events_request->after_chunk_trace, - events_request->after_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); - lttv_hooks_call(events_request->after_chunk_traceset, tsc); + + events_request->event); + + lttv_hooks_call(events_request->after_chunk_traceset, ts); } /* - Call end request for req */ - lttv_hooks_call(events_request->after_request, (gpointer)tsc); + lttv_hooks_call(events_request->after_request, (gpointer)ts); /* - remove req from list_in */ /* Destroy the request */ @@ -1535,34 +1374,33 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* - Remove events hooks for req * - Call end chunk for req */ - if(events_request->trace == -1) - lttv_process_traceset_end(tsc, + //TODO ybrosseau 2012-07-10: || TRUE added since we only support + // traceset wide requests + if(events_request->trace == -1 || TRUE) { + lttv_process_traceset_end(ts, events_request->after_chunk_traceset, events_request->after_chunk_trace, - events_request->after_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); - - else { - guint nb_trace = lttv_traceset_number(tsc->ts); + events_request->event); + } else { + guint nb_trace = lttv_traceset_number(ts); g_assert(events_request->trace < nb_trace && events_request->trace > -1); - LttvTraceContext *tc = tsc->traces[events_request->trace]; + LttvTrace *trace = lttv_traceset_get(ts, events_request->trace); - lttv_trace_context_remove_hooks(tc, + lttv_trace_remove_hooks(trace, events_request->after_chunk_trace, - events_request->after_chunk_tracefile, - events_request->event, - events_request->event_by_id_channel); - lttv_hooks_call(events_request->after_chunk_traceset, tsc); + events_request->event); + + + lttv_hooks_call(events_request->after_chunk_traceset, ts); } /* - req.num -= count */ g_assert(events_request->num_events >= count); events_request->num_events -= count; - g_assert(tfc != NULL); + //g_assert(tfc != NULL); /* - if req.num == 0 * or * current context time >= req.end time @@ -1575,19 +1413,19 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) || events_request->stop_flag == TRUE || - ltt_time_compare(tfc->timestamp, + ltt_time_compare(lttv_traceset_get_current_time(ts), events_request->end_time) >= 0 || (events_request->end_position != NULL && - lttv_traceset_context_ctx_pos_compare(tsc, + lttv_traceset_position_compare_current(ts, events_request->end_position) == 0) ) { g_assert(events_request->servicing == TRUE); /* - Call end request for req * - remove req from list_in */ - lttv_hooks_call(events_request->after_request, (gpointer)tsc); + lttv_hooks_call(events_request->after_request, (gpointer)ts); /* - remove req from list_in */ /* Destroy the request */ remove = TRUE; @@ -1627,9 +1465,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* 1.1. Use current postition as start position */ if(events_request->start_position != NULL) - lttv_traceset_context_position_destroy(events_request->start_position); - events_request->start_position = lttv_traceset_context_position_new(tsc); - lttv_traceset_context_position_save(tsc, events_request->start_position); + lttv_traceset_destroy_position(events_request->start_position); + events_request->start_position = lttv_traceset_create_current_position(ts); + /* 1.2. Remove start time */ events_request->start_time = ltt_time_infinite; @@ -1656,15 +1494,17 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) } /* C Unlock Traces */ { +#ifdef BABEL_CLEANUP lttv_process_traceset_get_sync_data(tsc); +#endif //lttv_traceset_context_position_save(tsc, sync_position); guint iter_trace; for(iter_trace=0; - iter_tracets); + iter_tracets, iter_trace); + LttvTrace *trace_v = lttv_traceset_get(ts, iter_trace); lttvwindowtraces_unlock(trace_v); } @@ -1695,13 +1535,59 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) NULL); return FALSE; */ + + } #undef list_out +/** + Manage the periodic update of a live trace +*/ +static gboolean +live_trace_update_handler(Tab *tab) +{ +#ifdef BABEL_CLEANUP + unsigned int updated_count; + LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); + TimeInterval initial_time_span = tsc->time_span; + TimeInterval updated_time_span; + + updated_count = lttv_process_traceset_update(tsc); + + /* TODO ybrosseau 2011-01-12: Add trace resynchronization */ + /* Get the changed period bounds */ + updated_time_span = tsc->time_span; + + if(ltt_time_compare(updated_time_span.start_time, + initial_time_span.start_time) != 0) { + /* The initial time should not change on a live update */ + g_assert(FALSE); + } + + /* Notify viewers (only on updates) */ + if(ltt_time_compare(updated_time_span.end_time, + initial_time_span.end_time) != 0) { + + notify_time_span_changed(tab); + /* TODO ybrosseau 2011-01-12: Change the timebar to register + to the time_span hook */ + timebar_set_minmax_time(TIMEBAR(tab->MTimebar), + &updated_time_span.start_time, + &updated_time_span.end_time ); + + /* To update the min max */ + time_change_manager(tab, tab->time_window); + } + + /* Timer will be recalled as long as there is files to update */ + return (updated_count > 0); +#endif /* BABEL_CLEANUP */ +} static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v) { +#ifdef BABEL_CLEANUP LttvTraceset *traceset = tab->traceset_info->traceset; guint i; guint num_traces = lttv_traceset_number(traceset); @@ -1753,6 +1639,16 @@ static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v) //FIXME //add_trace_into_traceset_selector(GTK_MULTIVPANED(tab->multivpaned), lttv_trace(trace_v)); + + + if (lttv_trace(trace_v)->is_live) { + /* Add timer for live update */ + /* TODO ybrosseau 2011-01-12: Parametrize the hardcoded 1 seconds */ + g_timeout_add_seconds (1, + (GSourceFunc) live_trace_update_handler, + tab); + } +#endif /* BABEL_CLEANUP */ } /* add_trace adds a trace into the current traceset. It first displays a @@ -1762,10 +1658,9 @@ static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v) void add_trace(GtkWidget * widget, gpointer user_data) { - LttTrace *trace; - LttvTrace * trace_v; - LttvTraceset * traceset; - const char * dir; + + LttvTraceset * traceset = NULL; + const char * path; char abs_path[PATH_MAX]; gint id; MainWindow * mw_data = get_window_data_struct(widget); @@ -1784,73 +1679,88 @@ void add_trace(GtkWidget * widget, gpointer user_data) tab = ptab->tab; } - //GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace"); - GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a trace"); - gtk_widget_hide( (file_selector)->file_list->parent) ; - gtk_file_selection_hide_fileop_buttons(file_selector); - gtk_window_set_transient_for(GTK_WINDOW(file_selector), - GTK_WINDOW(mw_data->mwindow)); - + /* Create a new traceset*/ + traceset = tab->traceset_info->traceset; + if(traceset == NULL) { + traceset = lttv_traceset_new(); + } + /* File open dialog management */ +#ifdef BABEL_CLEANUP + GtkWidget *extra_live_button; +#endif //babel_cleanup + GtkFileChooser * file_chooser = + GTK_FILE_CHOOSER( + gtk_file_chooser_dialog_new ("Select a trace", + GTK_WINDOW(mw_data->mwindow), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL)); +#ifdef BABEL_CLEANUP + /* Button to indicate the opening of a live trace */ + extra_live_button = gtk_check_button_new_with_mnemonic ("Trace is live (currently being writen)"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (extra_live_button), FALSE); + gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (file_chooser), extra_live_button); +#endif //babel_cleanup + gtk_file_chooser_set_show_hidden (file_chooser, TRUE); if(remember_trace_dir[0] != '\0') - gtk_file_selection_set_filename(file_selector, remember_trace_dir); - - id = gtk_dialog_run(GTK_DIALOG(file_selector)); - switch(id){ - case GTK_RESPONSE_ACCEPT: - case GTK_RESPONSE_OK: - dir = gtk_file_selection_get_filename (file_selector); - strncpy(remember_trace_dir, dir, PATH_MAX); - strncat(remember_trace_dir, "/", PATH_MAX); - if(!dir || strlen(dir) == 0){ - gtk_widget_destroy((GtkWidget*)file_selector); - break; - } - get_absolute_pathname(dir, abs_path); - trace_v = lttvwindowtraces_get_trace_by_name(abs_path); - if(trace_v == NULL) { - trace = ltt_trace_open(abs_path); - if(trace == NULL) { - g_warning("cannot open trace %s", abs_path); - - GtkWidget *dialogue = - gtk_message_dialog_new( - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - "Cannot open trace : maybe you should enter in the trace " - "directory to select it ?"); - gtk_dialog_run(GTK_DIALOG(dialogue)); - gtk_widget_destroy(dialogue); + gtk_file_chooser_set_filename(file_chooser, remember_trace_dir); - } else { - trace_v = lttv_trace_new(trace); - lttvwindowtraces_add_trace(trace_v); - lttvwindow_add_trace(tab, trace_v); - } - } else { - lttvwindow_add_trace(tab, trace_v); - } - - gtk_widget_destroy((GtkWidget*)file_selector); - - //update current tab - //update_traceset(mw_data); + gboolean closeFileChooserDialog = TRUE; - /* Call the updatetraceset hooks */ + do + { + id = gtk_dialog_run(GTK_DIALOG(file_chooser)); + switch(id){ + case GTK_RESPONSE_ACCEPT: + case GTK_RESPONSE_OK: + path = gtk_file_chooser_get_filename (file_chooser); + + strncpy(remember_trace_dir, path, PATH_MAX); + strncat(remember_trace_dir, "/", PATH_MAX); + if(!path || strlen(path) == 0){ + break; + } + get_absolute_pathname(path, abs_path); + + if(lttv_traceset_add_path(traceset,abs_path) != 0 ){ /*failure*/ - traceset = tab->traceset_info->traceset; - SetTraceset(tab, traceset); - // in expose now call_pending_read_hooks(mw_data); + g_warning("cannot open trace %s", abs_path); + strncpy(remember_trace_dir, "\0", PATH_MAX); + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "Cannot open trace : maybe you should enter in the directory " + "to select it ?"); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); + closeFileChooserDialog = FALSE; + } + else{ + closeFileChooserDialog = TRUE; + SetTraceset(tab, traceset); + } + break; + //update current tab + //update_traceset(mw_data); + + // in expose now call_pending_read_hooks(mw_data); + + //lttvwindow_report_current_time(mw_data,&(tab->current_time)); - //lttvwindow_report_current_time(mw_data,&(tab->current_time)); - break; - case GTK_RESPONSE_REJECT: - case GTK_RESPONSE_CANCEL: - default: - gtk_widget_destroy((GtkWidget*)file_selector); - break; - } + case GTK_RESPONSE_REJECT: + case GTK_RESPONSE_CANCEL: + default: + closeFileChooserDialog = TRUE; + break; + } + }while(!closeFileChooserDialog); + + gtk_widget_destroy((GtkWidget*)file_chooser); + } /* remove_trace removes a trace from the current traceset if all viewers in @@ -1867,6 +1777,7 @@ void add_trace(GtkWidget * widget, gpointer user_data) void remove_trace(GtkWidget *widget, gpointer user_data) { +#ifdef BABEL_CLEANUP LttTrace *trace; LttvTrace * trace_v; LttvTraceset * traceset; @@ -1892,7 +1803,7 @@ void remove_trace(GtkWidget *widget, gpointer user_data) for(i = 0; i < nb_trace; i++){ trace_v = lttv_traceset_get(tab->traceset_info->traceset, i); trace = lttv_trace(trace_v); - name[i] = g_quark_to_string(ltt_trace_name(trace)); + name[i] = (char *) g_quark_to_string(ltt_trace_name(trace)); } remove_trace_name = get_remove_trace(mw_data, name, nb_trace); @@ -1955,6 +1866,7 @@ void remove_trace(GtkWidget *widget, gpointer user_data) SetTraceset(tab, (gpointer)traceset); } g_free(name); +#endif /* BABEL_CLEANUP */ } #if 0 @@ -2100,6 +2012,8 @@ void redraw(GtkWidget *widget, gpointer user_data) GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); Tab *tab; + gboolean retval; + if(!page) { return; } else { @@ -2111,7 +2025,8 @@ void redraw(GtkWidget *widget, gpointer user_data) LttvHooks * tmp; LttvAttributeValue value; - g_assert(lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value); + g_assert(retval); tmp = (LttvHooks*)*(value.v_pointer); if(tmp != NULL) @@ -2125,6 +2040,8 @@ void continue_processing(GtkWidget *widget, gpointer user_data) GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); Tab *tab; + gboolean retval; + if(!page) { return; } else { @@ -2136,8 +2053,9 @@ void continue_processing(GtkWidget *widget, gpointer user_data) LttvHooks * tmp; LttvAttributeValue value; - g_assert(lttv_iattribute_find_by_path(tab->attributes, - "hooks/continue", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(tab->attributes, "hooks/continue", + LTTV_POINTER, &value); + g_assert(retval); tmp = (LttvHooks*)*(value.v_pointer); if(tmp != NULL) @@ -2201,11 +2119,11 @@ void save_as(GtkWidget * widget, gpointer user_data) void zoom(GtkWidget * widget, double size) { + TimeInterval time_span; TimeWindow new_time_window; LttTime current_time, time_delta; - MainWindow * mw_data = get_window_data_struct(widget); - LttvTracesetContext *tsc; + LttvTraceset *ts; GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), @@ -2222,8 +2140,8 @@ void zoom(GtkWidget * widget, double size) if(size == 1) return; - tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - time_span = tsc->time_span; + ts = lttvwindow_get_traceset(tab); + time_span = lttv_traceset_get_time_span_real(ts); new_time_window = tab->time_window; current_time = tab->current_time; @@ -2348,7 +2266,7 @@ LttvPluginTab *create_new_tab(GtkWidget* widget, gpointer user_data) gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); Tab *copy_tab; - if(!page) { + if(!page || TRUE ) { copy_tab = NULL; } else { LttvPluginTab *ptab; @@ -2385,7 +2303,9 @@ void on_open_activate (GtkMenuItem *menuitem, gpointer user_data) { +#ifdef UNFINISHED_FEATURE open_traceset((GtkWidget*)menuitem, user_data); +#endif } @@ -2407,8 +2327,6 @@ on_close_tab_activate (GtkWidget *widget, { gint page_num; GtkWidget * notebook; - GtkWidget * page; - MainWindow * mw_data = get_window_data_struct(widget); notebook = lookup_widget(widget, "MNotebook"); if(notebook == NULL){ g_info("Notebook does not exist\n"); @@ -2895,7 +2813,6 @@ void on_unload_module_activate (GtkMenuItem *menuitem, gpointer user_data) { - GError *error = NULL; MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem); LttvLibrary *library = NULL; @@ -3025,7 +2942,6 @@ on_remove_library_search_path_activate (GtkMenuItem *menuitem, { GPtrArray *name; guint nb,i; - gchar *lib_name; name = g_ptr_array_new(); nb = lttv_library_path_number(); /* ask for the library name */ @@ -3065,99 +2981,52 @@ void on_content_activate (GtkMenuItem *menuitem, gpointer user_data) { + char* filename = NULL, + *path; + GdkScreen *screen; + const char* relativePath = "doc/user/user_guide/html/index.html"; + filename = g_build_filename (g_get_current_dir(), relativePath, NULL); + path = g_strdup_printf ("ghelp://%s", filename); + + screen = gdk_screen_get_default(); + gtk_show_uri (screen, path, gtk_get_current_event_time(), NULL); + + g_free(filename); + g_free(path); g_info("Content\n"); } -static void -on_about_close_activate (GtkButton *button, - gpointer user_data) -{ - GtkWidget *about_widget = GTK_WIDGET(user_data); - - gtk_widget_destroy(about_widget); -} - void on_about_activate (GtkMenuItem *menuitem, gpointer user_data) { MainWindow *main_window = get_window_data_struct(GTK_WIDGET(menuitem)); - GtkWidget *window_widget = main_window->mwindow; - GtkWidget *about_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); - GtkWindow *about_window = GTK_WINDOW(about_widget); - gint window_width, window_height; - - gtk_window_set_title(about_window, "About Linux Trace Toolkit"); - - gtk_window_set_resizable(about_window, FALSE); - gtk_window_set_transient_for(about_window, GTK_WINDOW(window_widget)); - gtk_window_set_destroy_with_parent(about_window, TRUE); - gtk_window_set_modal(about_window, FALSE); - - /* Put the about window at the center of the screen */ - gtk_window_get_size(about_window, &window_width, &window_height); - gtk_window_move (about_window, - (gdk_screen_width() - window_width)/2, - (gdk_screen_height() - window_height)/2); - - GtkWidget *vbox = gtk_vbox_new(FALSE, 1); - - gtk_container_add(GTK_CONTAINER(about_widget), vbox); - - /* Text to show */ - GtkWidget *label1 = gtk_label_new(""); - gtk_misc_set_padding(GTK_MISC(label1), 10, 20); - gtk_label_set_markup(GTK_LABEL(label1), "\ -Linux Trace Toolkit " VERSION ""); - gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_CENTER); - - GtkWidget *label2 = gtk_label_new(""); - gtk_misc_set_padding(GTK_MISC(label2), 10, 20); - gtk_label_set_markup(GTK_LABEL(label2), "\ -Contributors :\n\ -\n\ -Michel Dagenais (New trace format, lttv main)\n\ -Mathieu Desnoyers (Kernel Tracer, Directory structure, build with automake/conf,\n\ - lttv gui, control flow view, gui cooperative trace reading\n\ - scheduler with interruptible foreground and background\n\ - computation, detailed event list (rewrite), trace reading\n\ - library (rewrite))\n\ -Benoit Des Ligneris, Eric Clement (Cluster adaptation, work in progress)\n\ -Xang-Xiu Yang (new trace reading library and converter, lttv gui, \n\ - detailed event list and statistics view)\n\ -Tom Zanussi (RelayFS)\n\ -\n\ -Inspired from the original Linux Trace Toolkit Visualizer made by\n\ -Karim Yaghmour"); - - GtkWidget *label3 = gtk_label_new(""); - gtk_label_set_markup(GTK_LABEL(label3), "\ -Linux Trace Toolkit Viewer, Copyright (C) 2004, 2005, 2006\n\ - Michel Dagenais\n\ - Mathieu Desnoyers\n\ - Xang-Xiu Yang\n\ -Linux Trace Toolkit comes with ABSOLUTELY NO WARRANTY.\n\ -This is free software, and you are welcome to redistribute it\n\ -under certain conditions. See COPYING for details."); - gtk_misc_set_padding(GTK_MISC(label3), 10, 20); - - gtk_box_pack_start_defaults(GTK_BOX(vbox), label1); - gtk_box_pack_start_defaults(GTK_BOX(vbox), label2); - gtk_box_pack_start_defaults(GTK_BOX(vbox), label3); - - GtkWidget *hbox = gtk_hbox_new(TRUE, 0); - gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - GtkWidget *close_button = gtk_button_new_with_mnemonic("_Close"); - gtk_box_pack_end(GTK_BOX(hbox), close_button, FALSE, FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(close_button), 20); - - g_signal_connect(G_OBJECT(close_button), "clicked", - G_CALLBACK(on_about_close_activate), - (gpointer)about_widget); + gchar * authors[] = { "Yannick Brosseau", + "Francis Deslauriers", + "Mathieu Desnoyer", + "Michel Dagenais", + "Benoit Des Ligneris", + "Eric Clement", + "Xang-Xiu Yang", + "Tom Zanussi", + NULL }; + + static const gchar *comments = "Trace visualiser for LTTng 2.x data\ +\nInspired from the original Linux Trace Toolkit Visualizer made by Karim Yaghmour"; - gtk_widget_show_all(about_widget); + static const gchar *copyright = "Copyright \xc2\xa9 2004-2013"; + + gtk_show_about_dialog(main_window->mwindow, + "authors", authors, + "comments", comments, + "version", VERSION, + "program-name", "LTTV", + "license", "GPLv2, see COPYING file for details", + "website", "http://lttng.org/lttv/", + "copyright", copyright, + NULL); } @@ -3165,7 +3034,19 @@ void on_button_new_clicked (GtkButton *button, gpointer user_data) { +#ifdef BABEL_CLEANUP create_new_window((GtkWidget*)button, user_data, TRUE); +#else + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(button)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "Opening multiple windows is disabled."); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); +#endif } void @@ -3179,7 +3060,9 @@ void on_button_open_clicked (GtkButton *button, gpointer user_data) { +#ifdef UNFINISHED_FEATURE open_traceset((GtkWidget*)button, user_data); +#endif } @@ -3307,17 +3190,20 @@ on_MWindow_destroy (GtkWidget *widget, MainWindow *main_window = get_window_data_struct(widget); LttvIAttribute *attributes = main_window->attributes; LttvAttributeValue value; + gboolean retval; //This is unnecessary, since widgets will be destroyed //by the main window widget anyway. //remove_all_menu_toolbar_constructors(main_window, NULL); - g_assert(lttv_iattribute_find_by_path(attributes, - "viewers/menu", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(attributes, "viewers/menu", + LTTV_POINTER, &value); + g_assert(retval); lttv_menus_destroy((LttvMenus*)*(value.v_pointer)); - g_assert(lttv_iattribute_find_by_path(attributes, - "viewers/toolbar", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar", + LTTV_POINTER, &value); + g_assert(retval); lttv_toolbars_destroy((LttvToolbars*)*(value.v_pointer)); g_object_unref(main_window->attributes); @@ -3333,8 +3219,6 @@ on_MWindow_configure (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { - MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget); - // MD : removed time width modification upon resizing of the main window. // The viewers will redraw themselves completely, without time interval // modification. @@ -3372,23 +3256,27 @@ on_MNotebook_switch_page (GtkNotebook *notebook, void time_change_manager (Tab *tab, TimeWindow new_time_window) -{ +{ + /* Only one source of time change */ if(tab->time_manager_lock == TRUE) return; tab->time_manager_lock = TRUE; + TimeInterval time_span; + + LttvTraceset *ts = tab->traceset_info->traceset; + + time_span = lttv_traceset_get_time_span_real(ts); - LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; LttTime start_time = new_time_window.start_time; LttTime end_time = new_time_window.end_time; - LttTime time_width = new_time_window.time_width; g_assert(ltt_time_compare(start_time, end_time) < 0); /* Set scrollbar */ GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar)); - LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time); + LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time); + #if 0 gtk_range_set_increments(GTK_RANGE(tab->scrollbar), ltt_time_to_double(new_time_window.time_width) @@ -3429,432 +3317,25 @@ void time_change_manager (Tab *tab, ltt_time_sub(start_time, time_span.start_time)) /* value */); /* set the time bar. */ - /* start seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry1), - (double)time_span.start_time.tv_sec, - (double)time_span.end_time.tv_sec); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry1), - (double)start_time.tv_sec); - - /* start nanoseconds */ - if(start_time.tv_sec == time_span.start_time.tv_sec) { - /* can be both beginning and end at the same time. */ - if(start_time.tv_sec == time_span.end_time.tv_sec) { - /* If we are at the end, max nsec to end.. -1 (not zero length) */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2), - (double)time_span.start_time.tv_nsec, - (double)time_span.end_time.tv_nsec-1); - } else { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2), - (double)time_span.start_time.tv_nsec, - (double)NANOSECONDS_PER_SECOND-1); - } - } else if(start_time.tv_sec == time_span.end_time.tv_sec) { - /* If we are at the end, max nsec to end.. -1 (not zero length) */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2), - 0.0, - (double)time_span.end_time.tv_nsec-1); - } else /* anywhere else */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2), - 0.0, - (double)NANOSECONDS_PER_SECOND-1); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry2), - (double)start_time.tv_nsec); - - /* end seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry3), - (double)time_span.start_time.tv_sec, - (double)time_span.end_time.tv_sec); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry3), - (double)end_time.tv_sec); - - /* end nanoseconds */ - if(end_time.tv_sec == time_span.start_time.tv_sec) { - /* can be both beginning and end at the same time. */ - if(end_time.tv_sec == time_span.end_time.tv_sec) { - /* If we are at the end, max nsec to end.. */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4), - (double)time_span.start_time.tv_nsec+1, - (double)time_span.end_time.tv_nsec); - } else { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4), - (double)time_span.start_time.tv_nsec+1, - (double)NANOSECONDS_PER_SECOND-1); - } - } - else if(end_time.tv_sec == time_span.end_time.tv_sec) { - /* If we are at the end, max nsec to end.. */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4), - 0.0, - (double)time_span.end_time.tv_nsec); - } - else /* anywhere else */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4), - 0.0, - (double)NANOSECONDS_PER_SECOND-1); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4), - (double)end_time.tv_nsec); - - /* width seconds */ - if(time_width.tv_nsec == 0) { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7), - (double)1, - (double)upper.tv_sec); - } else { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7), - (double)0, - (double)upper.tv_sec); - } - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry7), - (double)time_width.tv_sec); - - /* width nanoseconds */ - if(time_width.tv_sec == upper.tv_sec) { - if(time_width.tv_sec == 0) { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), - (double)1, - (double)upper.tv_nsec); - } else { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), - (double)0, - (double)upper.tv_nsec); - } - } - else if(time_width.tv_sec == 0) { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), - 1.0, - (double)upper.tv_nsec); - } - else /* anywhere else */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), - 0.0, - (double)NANOSECONDS_PER_SECOND-1); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry8), - (double)time_width.tv_nsec); - - /* call viewer hooks for new time window */ - set_time_window(tab, &new_time_window); - - tab->time_manager_lock = FALSE; -} - - -/* value changed for frame start s - * - * Check time span : if ns is out of range, clip it the nearest good value. - */ -void -on_MEntry1_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) -{ - Tab *tab =(Tab *)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - - TimeWindow new_time_window = tab->time_window; - - LttTime end_time = new_time_window.end_time; - - new_time_window.start_time.tv_sec = value; - /* start nanoseconds */ - if(new_time_window.start_time.tv_sec == time_span.start_time.tv_sec) { - if(new_time_window.start_time.tv_sec == time_span.end_time.tv_sec) { - if(new_time_window.start_time.tv_nsec > time_span.end_time.tv_nsec) - new_time_window.start_time.tv_nsec = time_span.end_time.tv_nsec-1; - if(new_time_window.start_time.tv_nsec < time_span.start_time.tv_nsec) - new_time_window.start_time.tv_nsec = time_span.start_time.tv_nsec; - } else { - if(new_time_window.start_time.tv_nsec < time_span.start_time.tv_nsec) - new_time_window.start_time.tv_nsec = time_span.start_time.tv_nsec; - } - } - else if(new_time_window.start_time.tv_sec == time_span.end_time.tv_sec) { - if(new_time_window.start_time.tv_nsec > time_span.end_time.tv_nsec) - new_time_window.start_time.tv_nsec = time_span.end_time.tv_nsec-1; - } - if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) { - /* Then, we must push back end time : keep the same time width - * if possible, else end traceset time */ - end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time, - new_time_window.time_width), - time_span.end_time); - } + timebar_set_minmax_time(TIMEBAR(tab->MTimebar), + &time_span.start_time, + &time_span.end_time ); + timebar_set_start_time(TIMEBAR(tab->MTimebar),&start_time); + timebar_set_end_time(TIMEBAR(tab->MTimebar),&end_time); - /* Fix the time width to fit start time and end time */ - new_time_window.time_width = ltt_time_sub(end_time, - new_time_window.start_time); - new_time_window.time_width_double = - ltt_time_to_double(new_time_window.time_width); - new_time_window.end_time = end_time; - - time_change_manager(tab, new_time_window); - -} - -void -on_MEntry2_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) -{ - Tab *tab =(Tab *)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - TimeWindow new_time_window = tab->time_window; - - LttTime end_time = new_time_window.end_time; - - new_time_window.start_time.tv_nsec = value; - - if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) { - /* Then, we must push back end time : keep the same time width - * if possible, else end traceset time */ - end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time, - new_time_window.time_width), - time_span.end_time); - } - - /* Fix the time width to fit start time and end time */ - new_time_window.time_width = ltt_time_sub(end_time, - new_time_window.start_time); - new_time_window.time_width_double = - ltt_time_to_double(new_time_window.time_width); - - new_time_window.end_time = end_time; - - time_change_manager(tab, new_time_window); - -} - -void -on_MEntry3_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) -{ - Tab *tab =(Tab *)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - - TimeWindow new_time_window = tab->time_window; - - LttTime end_time = new_time_window.end_time; - - end_time.tv_sec = value; - - /* end nanoseconds */ - if(end_time.tv_sec == time_span.start_time.tv_sec) { - if(end_time.tv_sec == time_span.end_time.tv_sec) { - if(end_time.tv_nsec > time_span.end_time.tv_nsec) - end_time.tv_nsec = time_span.end_time.tv_nsec; - if(end_time.tv_nsec < time_span.start_time.tv_nsec) - end_time.tv_nsec = time_span.start_time.tv_nsec+1; - } else { - if(end_time.tv_nsec < time_span.start_time.tv_nsec) - end_time.tv_nsec = time_span.start_time.tv_nsec+1; - } - } - else if(end_time.tv_sec == time_span.end_time.tv_sec) { - if(end_time.tv_nsec > time_span.end_time.tv_nsec) - end_time.tv_nsec = time_span.end_time.tv_nsec; - } - - if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) { - /* Then, we must push front start time : keep the same time width - * if possible, else end traceset time */ - new_time_window.start_time = LTT_TIME_MAX( - ltt_time_sub(end_time, - new_time_window.time_width), - time_span.start_time); - } - - /* Fix the time width to fit start time and end time */ - new_time_window.time_width = ltt_time_sub(end_time, - new_time_window.start_time); - new_time_window.time_width_double = - ltt_time_to_double(new_time_window.time_width); + /* call viewer hooks for new time window */ + set_time_window(tab, &new_time_window); - new_time_window.end_time = end_time; + tab->time_manager_lock = FALSE; - time_change_manager(tab, new_time_window); } -void -on_MEntry4_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) -{ - Tab *tab =(Tab *)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - TimeWindow new_time_window = tab->time_window; - - LttTime end_time = new_time_window.end_time; - - end_time.tv_nsec = value; - - if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) { - /* Then, we must push front start time : keep the same time width - * if possible, else end traceset time */ - new_time_window.start_time = LTT_TIME_MAX( - ltt_time_sub(end_time, - new_time_window.time_width), - time_span.start_time); - } - - /* Fix the time width to fit start time and end time */ - new_time_window.time_width = ltt_time_sub(end_time, - new_time_window.start_time); - new_time_window.time_width_double = - ltt_time_to_double(new_time_window.time_width); - new_time_window.end_time = end_time; - - time_change_manager(tab, new_time_window); - -} - -/* value changed for time frame interval s - * - * Check time span : if ns is out of range, clip it the nearest good value. - */ -void -on_MEntry7_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) -{ - Tab *tab =(Tab *)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - LttTime current_time, time_delta; - TimeWindow new_time_window = tab->time_window; - current_time = tab->current_time; - - time_delta = ltt_time_sub(time_span.end_time,time_span.start_time); - new_time_window.time_width.tv_sec = value; - new_time_window.time_width_double = - ltt_time_to_double(new_time_window.time_width); - if(ltt_time_compare(new_time_window.time_width,time_delta) > 0) - { /* Case where zoom out is bigger than trace length */ - new_time_window.start_time = time_span.start_time; - new_time_window.time_width = time_delta; - new_time_window.time_width_double = ltt_time_to_double(time_delta); - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - } - else - { - /* Center the image on the current time */ - new_time_window.start_time = - ltt_time_sub(current_time, - ltt_time_from_double(new_time_window.time_width_double/2.0)); - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - /* If on borders, don't fall off */ - if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0 - || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0) - { - new_time_window.start_time = time_span.start_time; - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - } - else - { - if(ltt_time_compare(new_time_window.end_time, - time_span.end_time) > 0 - || ltt_time_compare(new_time_window.end_time, - time_span.start_time) < 0) - { - new_time_window.start_time = - ltt_time_sub(time_span.end_time, new_time_window.time_width); - - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - } - } - - } - - if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) { - g_warning("Zoom more than 1 ns impossible"); - } else { - time_change_manager(tab, new_time_window); - } -} - -void -on_MEntry8_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) -{ - Tab *tab =(Tab *)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - LttTime current_time, time_delta; - TimeWindow new_time_window = tab->time_window; - current_time = tab->current_time; - - time_delta = ltt_time_sub(time_span.end_time,time_span.start_time); - new_time_window.time_width.tv_nsec = value; - new_time_window.time_width_double = - ltt_time_to_double(new_time_window.time_width); - if(ltt_time_compare(new_time_window.time_width,time_delta) > 0) - { /* Case where zoom out is bigger than trace length */ - new_time_window.start_time = time_span.start_time; - new_time_window.time_width = time_delta; - new_time_window.time_width_double = ltt_time_to_double(time_delta); - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - } - else - { - /* Center the image on the current time */ - new_time_window.start_time = - ltt_time_sub(current_time, - ltt_time_from_double(new_time_window.time_width_double/2.0)); - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - /* If on borders, don't fall off */ - if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0 - || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0) - { - new_time_window.start_time = time_span.start_time; - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - } - else - { - if(ltt_time_compare(new_time_window.end_time, - time_span.end_time) > 0 - || ltt_time_compare(new_time_window.end_time, - time_span.start_time) < 0) - { - new_time_window.start_time = - ltt_time_sub(time_span.end_time, new_time_window.time_width); - - new_time_window.end_time = ltt_time_add(new_time_window.start_time, - new_time_window.time_width) ; - } - } - - } - - if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) { - g_warning("Zoom more than 1 ns impossible"); - } else { - time_change_manager(tab, new_time_window); - } -} @@ -3866,110 +3347,106 @@ void current_time_change_manager (Tab *tab, tab->current_time_manager_lock = TRUE; - LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - - /* current seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry5), - (double)time_span.start_time.tv_sec, - (double)time_span.end_time.tv_sec); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry5), - (double)new_current_time.tv_sec); - - - /* start nanoseconds */ - if(new_current_time.tv_sec == time_span.start_time.tv_sec) { - /* can be both beginning and end at the same time. */ - if(new_current_time.tv_sec == time_span.end_time.tv_sec) { - /* If we are at the end, max nsec to end.. */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6), - (double)time_span.start_time.tv_nsec, - (double)time_span.end_time.tv_nsec); - } else { - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6), - (double)time_span.start_time.tv_nsec, - (double)NANOSECONDS_PER_SECOND-1); - } - } else if(new_current_time.tv_sec == time_span.end_time.tv_sec) { - /* If we are at the end, max nsec to end.. */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6), - 0.0, - (double)time_span.end_time.tv_nsec); - } else /* anywhere else */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6), - 0.0, - (double)NANOSECONDS_PER_SECOND-1); - - gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry6), - (double)new_current_time.tv_nsec); + timebar_set_current_time(TIMEBAR(tab->MTimebar), &new_current_time); set_current_time(tab, &new_current_time); tab->current_time_manager_lock = FALSE; } -void current_position_change_manager(Tab *tab, - LttvTracesetContextPosition *pos) +void current_position_change_manager(Tab *tab, LttvTracesetPosition *pos) { - LttvTracesetContext *tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; + lttv_traceset_seek_to_position( pos); - g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0); - LttTime new_time = lttv_traceset_context_position_get_time(pos); + LttTime new_time = lttv_traceset_position_get_time(pos); /* Put the context in a state coherent position */ - lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc, ltt_time_zero); - + + lttv_state_traceset_seek_time_closest(tab->traceset_info->traceset, ltt_time_zero); + current_time_change_manager(tab, new_time); set_current_position(tab, pos); } - -void -on_MEntry5_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) +static void on_timebar_starttime_changed(Timebar *timebar, + gpointer user_data) { - Tab *tab = (Tab*)user_data; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - LttTime new_current_time = tab->current_time; - new_current_time.tv_sec = value; - - /* current nanoseconds */ - if(new_current_time.tv_sec == time_span.start_time.tv_sec) { - if(new_current_time.tv_sec == time_span.end_time.tv_sec) { - if(new_current_time.tv_nsec > time_span.end_time.tv_nsec) - new_current_time.tv_nsec = time_span.end_time.tv_nsec; - if(new_current_time.tv_nsec < time_span.start_time.tv_nsec) - new_current_time.tv_nsec = time_span.start_time.tv_nsec; - } else { - if(new_current_time.tv_nsec < time_span.start_time.tv_nsec) - new_current_time.tv_nsec = time_span.start_time.tv_nsec; - } - } - else if(new_current_time.tv_sec == time_span.end_time.tv_sec) { - if(new_current_time.tv_nsec > time_span.end_time.tv_nsec) - new_current_time.tv_nsec = time_span.end_time.tv_nsec; - } + Tab *tab = (Tab *)user_data; + LttvTraceset * ts =tab->traceset_info->traceset; + TimeInterval time_span = lttv_traceset_get_time_span_real(ts); + + TimeWindow new_time_window = tab->time_window; + new_time_window.start_time = timebar_get_start_time(timebar); + + LttTime end_time = new_time_window.end_time; + + /* TODO ybrosseau 2010-12-02: This if should have been checked + by the timebar already */ + if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) { + /* Then, we must push back end time : keep the same time width + * if possible, else end traceset time */ + end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time, + new_time_window.time_width), + time_span.end_time); + } + + /* Fix the time width to fit start time and end time */ + new_time_window.time_width = ltt_time_sub(end_time, + new_time_window.start_time); + + new_time_window.time_width_double = + ltt_time_to_double(new_time_window.time_width); + + new_time_window.end_time = end_time; + + /* Notify the time_manager */ + time_change_manager(tab, new_time_window); - current_time_change_manager(tab, new_current_time); } -void -on_MEntry6_value_changed (GtkSpinButton *spinbutton, - gpointer user_data) +static void on_timebar_endtime_changed(Timebar *timebar, + gpointer user_data) { - Tab *tab = (Tab*)user_data; - gint value = gtk_spin_button_get_value_as_int(spinbutton); - LttTime new_current_time = tab->current_time; - new_current_time.tv_nsec = value; + Tab *tab = (Tab *)user_data; + LttvTraceset * ts =tab->traceset_info->traceset; + TimeInterval time_span = lttv_traceset_get_time_span_real(ts); + + TimeWindow new_time_window = tab->time_window; + + LttTime end_time = timebar_get_end_time(timebar); + + /* TODO ybrosseau 2010-12-02: This if should have been + checked by the timebar already */ + if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) { + /* Then, we must push front start time : keep the same time + width if possible, else end traceset time */ + new_time_window.start_time = LTT_TIME_MAX( + ltt_time_sub(end_time, + new_time_window.time_width), + time_span.start_time); + } + + /* Fix the time width to fit start time and end time */ + new_time_window.time_width = ltt_time_sub(end_time, + new_time_window.start_time); + + new_time_window.time_width_double = + ltt_time_to_double(new_time_window.time_width); + + new_time_window.end_time = end_time; - current_time_change_manager(tab, new_current_time); + /* Notify the time_manager */ + time_change_manager(tab, new_time_window); +} +static void on_timebar_currenttime_changed(Timebar *timebar, + gpointer user_data) +{ + Tab *tab = (Tab *)user_data; + + LttTime new_current_time = timebar_get_current_time(timebar); + + current_time_change_manager(tab, new_current_time); } - void scroll_value_changed_cb(GtkWidget *scrollbar, gpointer user_data) @@ -3981,9 +3458,9 @@ void scroll_value_changed_cb(GtkWidget *scrollbar, gdouble value = gtk_adjustment_get_value(adjust); // gdouble upper, lower, ratio, page_size; gdouble page_size; - LttvTracesetContext * tsc = - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - TimeInterval time_span = tsc->time_span; + + LttvTraceset * ts = tab->traceset_info->traceset; + TimeInterval time_span = lttv_traceset_get_time_span_real(ts); time = ltt_time_add(ltt_time_from_double(value), time_span.start_time); @@ -4003,6 +3480,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar, time_change_manager(tab, new_time_window); + #if 0 //time_window = tab->time_window; @@ -4031,6 +3509,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar, /* call viewer hooks for new time window */ set_time_window(tab, &time_window); #endif //0 + } @@ -4170,29 +3649,32 @@ void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data) LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); LttvIAttribute *attributes = mw->attributes; GtkWidget * tool_menu_title_menu, *new_widget, *pixmap; + gboolean retval; - g_assert(lttv_iattribute_find_by_path(global_attributes, - "viewers/menu", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(global_attributes, "viewers/menu", + LTTV_POINTER, &value); + g_assert(retval); if(*(value.v_pointer) == NULL) *(value.v_pointer) = lttv_menus_new(); global_menu = (LttvMenus*)*(value.v_pointer); - g_assert(lttv_iattribute_find_by_path(attributes, - "viewers/menu", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(attributes, "viewers/menu", + LTTV_POINTER, &value); + g_assert(retval); if(*(value.v_pointer) == NULL) *(value.v_pointer) = lttv_menus_new(); instance_menu = (LttvMenus*)*(value.v_pointer); - - - g_assert(lttv_iattribute_find_by_path(global_attributes, - "viewers/toolbar", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(global_attributes, "viewers/toolbar", + LTTV_POINTER, &value); + g_assert(retval); if(*(value.v_pointer) == NULL) *(value.v_pointer) = lttv_toolbars_new(); global_toolbar = (LttvToolbars*)*(value.v_pointer); - g_assert(lttv_iattribute_find_by_path(attributes, - "viewers/toolbar", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar", + LTTV_POINTER, &value); + g_assert(retval); if(*(value.v_pointer) == NULL) *(value.v_pointer) = lttv_toolbars_new(); instance_toolbar = (LttvToolbars*)*(value.v_pointer); @@ -4262,6 +3744,8 @@ void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data) MainWindow *construct_main_window(MainWindow * parent) { + gboolean retval; + g_debug("construct_main_window()"); GtkWidget * new_window; /* New generated main window */ MainWindow * new_m_window;/* New main window structure */ @@ -4269,8 +3753,7 @@ MainWindow *construct_main_window(MainWindow * parent) LttvIAttribute *attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL)); LttvAttributeValue value; - Tab *new_tab; - + new_m_window = g_new(MainWindow, 1); // Add the object's information to the module's array @@ -4282,12 +3765,14 @@ MainWindow *construct_main_window(MainWindow * parent) new_m_window->mwindow = new_window; new_m_window->attributes = attributes; - g_assert(lttv_iattribute_find_by_path(attributes, - "viewers/menu", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(attributes, "viewers/menu", + LTTV_POINTER, &value); + g_assert(retval); *(value.v_pointer) = lttv_menus_new(); - g_assert(lttv_iattribute_find_by_path(attributes, - "viewers/toolbar", LTTV_POINTER, &value)); + retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar", + LTTV_POINTER, &value); + g_assert(retval); *(value.v_pointer) = lttv_toolbars_new(); add_all_menu_toolbar_constructors(new_m_window, NULL); @@ -4329,7 +3814,6 @@ MainWindow *construct_main_window(MainWindow * parent) "Tab_Plugin", ptab, (GDestroyNotify)tab_destructor); - new_tab = ptab->tab; } else { LttvPluginTab *ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL); init_tab(ptab->tab, new_m_window, NULL, notebook, "Traceset"); @@ -4339,7 +3823,6 @@ MainWindow *construct_main_window(MainWindow * parent) "Tab_Plugin", ptab, (GDestroyNotify)tab_destructor); - new_tab = ptab->tab; } /* Insert default viewers */ @@ -4397,12 +3880,11 @@ MainWindow *construct_main_window(MainWindow * parent) void tab_destructor(LttvPluginTab * ptab) { +#ifdef BABEL_CLEANUP int i, nb, ref_count; LttvTrace * trace; Tab *tab = ptab->tab; - gtk_object_destroy(GTK_OBJECT(tab->tooltips)); - if(tab->attributes) g_object_unref(tab->attributes); @@ -4437,6 +3919,7 @@ void tab_destructor(LttvPluginTab * ptab) g_free(tab->traceset_info); //g_free(tab); g_object_unref(ptab); +#endif /* BABEL_CLEANUP */ } @@ -4446,6 +3929,7 @@ void tab_destructor(LttvPluginTab * ptab) void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, GtkNotebook * notebook, char * label) { + GList * list; //Tab * tab; //LttvFilter *filter = NULL; @@ -4463,9 +3947,13 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, /* Copy the previous tab's filter */ /* We can clone the filter, as we copy the trace set also */ /* The filter must always be in sync with the trace set */ + +#ifdef BABEL_CLEANUP tab->filter = lttv_filter_clone(copy_tab->filter); +#endif /* BABEL_CLEANUP */ } else { tab->traceset_info->traceset = lttv_traceset_new(); + tab->filter = NULL; } #ifdef DEBUG @@ -4475,21 +3963,18 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, 0, 4); fflush(stdout); #endif //DEBUG - +// tab->time_manager_lock = FALSE; tab->current_time_manager_lock = FALSE; - +#ifdef BABEL_CLEANUP //FIXME copy not implemented in lower level tab->traceset_info->traceset_context = g_object_new(LTTV_TRACESET_STATS_TYPE, NULL); - g_assert(tab->traceset_info->traceset_context != NULL); - lttv_context_init( - LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context), - tab->traceset_info->traceset); //add state update hooks +#endif //BABEL_CLEANUP lttv_state_add_event_hooks( - (LttvTracesetState*)tab->traceset_info->traceset_context); - + tab->traceset_info->traceset); + //determine the current_time and time_window of the tab #if 0 if(copy_tab != NULL){ @@ -4546,180 +4031,8 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, // } /* Create the timebar */ - { - tab->MTimebar = gtk_hbox_new(FALSE, 2); - gtk_widget_show(tab->MTimebar); - tab->tooltips = gtk_tooltips_new(); - - tab->MEventBox1a = gtk_event_box_new(); - gtk_widget_show(tab->MEventBox1a); - gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox1a, - "Paste Start and End Times Here", ""); - tab->MText1a = gtk_label_new("Time Frame "); - gtk_widget_show(tab->MText1a); - gtk_container_add(GTK_CONTAINER(tab->MEventBox1a), tab->MText1a); - tab->MEventBox1b = gtk_event_box_new(); - gtk_widget_show(tab->MEventBox1b); - gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox1b, - "Paste Start Time Here", ""); - tab->MText1b = gtk_label_new("start: "); - gtk_widget_show(tab->MText1b); - gtk_container_add(GTK_CONTAINER(tab->MEventBox1b), tab->MText1b); - tab->MText2 = gtk_label_new("s"); - gtk_widget_show(tab->MText2); - tab->MText3a = gtk_label_new("ns"); - gtk_widget_show(tab->MText3a); - - tab->MEventBox3b = gtk_event_box_new(); - gtk_widget_show(tab->MEventBox3b); - gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox3b, - "Paste End Time Here", ""); - tab->MText3b = gtk_label_new("end:"); - gtk_widget_show(tab->MText3b); - gtk_container_add(GTK_CONTAINER(tab->MEventBox3b), tab->MText3b); - tab->MText4 = gtk_label_new("s"); - gtk_widget_show(tab->MText4); - tab->MText5a = gtk_label_new("ns"); - gtk_widget_show(tab->MText5a); - - tab->MEventBox8 = gtk_event_box_new(); - gtk_widget_show(tab->MEventBox8); - gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox8, - "Paste Time Interval here", ""); - tab->MText8 = gtk_label_new("Time Interval:"); - gtk_widget_show(tab->MText8); - gtk_container_add(GTK_CONTAINER(tab->MEventBox8), tab->MText8); - tab->MText9 = gtk_label_new("s"); - gtk_widget_show(tab->MText9); - tab->MText10 = gtk_label_new("ns"); - gtk_widget_show(tab->MText10); - - tab->MEventBox5b = gtk_event_box_new(); - gtk_widget_show(tab->MEventBox5b); - gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox5b, - "Paste Current Time Here", ""); - tab->MText5b = gtk_label_new("Current Time:"); - gtk_widget_show(tab->MText5b); - gtk_container_add(GTK_CONTAINER(tab->MEventBox5b), tab->MText5b); - tab->MText6 = gtk_label_new("s"); - gtk_widget_show(tab->MText6); - tab->MText7 = gtk_label_new("ns"); - gtk_widget_show(tab->MText7); - - tab->MEntry1 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry1),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry1),TRUE); - gtk_widget_show(tab->MEntry1); - tab->MEntry2 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry2),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry2),TRUE); - gtk_widget_show(tab->MEntry2); - tab->MEntry3 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry3),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry3),TRUE); - gtk_widget_show(tab->MEntry3); - tab->MEntry4 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry4),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry4),TRUE); - gtk_widget_show(tab->MEntry4); - tab->MEntry5 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry5),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry5),TRUE); - gtk_widget_show(tab->MEntry5); - tab->MEntry6 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry6),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry6),TRUE); - gtk_widget_show(tab->MEntry6); - tab->MEntry7 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry7),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry7),TRUE); - gtk_widget_show(tab->MEntry7); - tab->MEntry8 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry8),0); - gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry8),TRUE); - gtk_widget_show(tab->MEntry8); - - GtkWidget *temp_widget; - - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox1a, FALSE, - FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox1b, FALSE, - FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry1, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText2, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry2, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText3a, FALSE, FALSE, 0); - temp_widget = gtk_vseparator_new(); - gtk_widget_show(temp_widget); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox3b, FALSE, - FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry3, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText4, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry4, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText5a, FALSE, FALSE, 0); - temp_widget = gtk_vseparator_new(); - gtk_widget_show(temp_widget); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox8, FALSE, - FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry7, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText9, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry8, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText10, FALSE, FALSE, 0); - - temp_widget = gtk_vseparator_new(); - gtk_widget_show(temp_widget); - gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText7, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEntry6, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText6, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEntry5, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEventBox5b, FALSE, - FALSE, 0); - gtk_box_pack_end (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0); - - - //GtkWidget *test = gtk_button_new_with_label("drop"); - //gtk_button_set_relief(GTK_BUTTON(test), GTK_RELIEF_NONE); - //gtk_widget_show(test); - //gtk_box_pack_end(GTK_BOX (tab->MTimebar), test, FALSE, FALSE, 0); - //gtk_widget_add_events(tab->MText1, GDK_ALL_EVENTS_MASK);//GDK_BUTTON_PRESS_MASK); - /*GtkWidget *event_box = gtk_event_box_new(); - gtk_widget_show(event_box); - gtk_tooltips_set_tip(tooltips, event_box, - "Paste Current Time Here", ""); - gtk_box_pack_end(GTK_BOX (tab->MTimebar), event_box, FALSE, FALSE, 0); - GtkWidget *test = gtk_label_new("drop"); - gtk_container_add(GTK_CONTAINER(event_box), test); - gtk_widget_show(test); - g_signal_connect (G_OBJECT(event_box), - "button-press-event", - G_CALLBACK (on_MText1_paste), - (gpointer)tab); -*/ - - g_signal_connect (G_OBJECT(tab->MEventBox1a), - "button-press-event", - G_CALLBACK (on_MEventBox1a_paste), - (gpointer)tab); - - g_signal_connect (G_OBJECT(tab->MEventBox1b), - "button-press-event", - G_CALLBACK (on_MEventBox1b_paste), - (gpointer)tab); - g_signal_connect (G_OBJECT(tab->MEventBox3b), - "button-press-event", - G_CALLBACK (on_MEventBox3b_paste), - (gpointer)tab); - g_signal_connect (G_OBJECT(tab->MEventBox5b), - "button-press-event", - G_CALLBACK (on_MEventBox5b_paste), - (gpointer)tab); - g_signal_connect (G_OBJECT(tab->MEventBox8), - "button-press-event", - G_CALLBACK (on_MEventBox8_paste), - (gpointer)tab); - } + + tab->MTimebar = timebar_new(); gtk_box_pack_end(GTK_BOX(tab->vbox), tab->scrollbar, @@ -4772,8 +4085,10 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, gtk_widget_show(tab->label); gtk_widget_show(tab->scrollbar); + gtk_widget_show(tab->MTimebar); gtk_widget_show(tab->viewer_container); gtk_widget_show(tab->vbox); + //gtk_widget_show(tab->multivpaned); @@ -4787,30 +4102,14 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, g_signal_connect(G_OBJECT(tab->scrollbar), "value-changed", G_CALLBACK(scroll_value_changed_cb), tab); - g_signal_connect ((gpointer) tab->MEntry1, "value-changed", - G_CALLBACK (on_MEntry1_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry2, "value-changed", - G_CALLBACK (on_MEntry2_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry3, "value-changed", - G_CALLBACK (on_MEntry3_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry4, "value-changed", - G_CALLBACK (on_MEntry4_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry5, "value-changed", - G_CALLBACK (on_MEntry5_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry6, "value-changed", - G_CALLBACK (on_MEntry6_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry7, "value-changed", - G_CALLBACK (on_MEntry7_value_changed), - tab); - g_signal_connect ((gpointer) tab->MEntry8, "value-changed", - G_CALLBACK (on_MEntry8_value_changed), - tab); + + /* Timebar signal handler */ + g_signal_connect(G_OBJECT(tab->MTimebar), "start-time-changed", + G_CALLBACK(on_timebar_starttime_changed), tab); + g_signal_connect(G_OBJECT(tab->MTimebar), "end-time-changed", + G_CALLBACK(on_timebar_endtime_changed), tab); + g_signal_connect(G_OBJECT(tab->MTimebar), "current-time-changed", + G_CALLBACK(on_timebar_currenttime_changed), tab); //g_signal_connect(G_OBJECT(tab->scrollbar), "changed", // G_CALLBACK(scroll_value_changed_cb), tab); @@ -4840,7 +4139,7 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, lttvwindow_report_time_window(tab, time_window); lttvwindow_report_current_time(tab, ltt_time_zero); } - + LttvTraceset *traceset = tab->traceset_info->traceset; SetTraceset(tab, traceset); } @@ -4860,6 +4159,7 @@ gboolean execute_events_requests(Tab *tab) __EXPORT void create_main_window_with_trace_list(GSList *traces) { + GSList *iter = NULL; /* Create window */ @@ -4879,20 +4179,19 @@ __EXPORT void create_main_window_with_trace_list(GSList *traces) ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); tab = ptab->tab; } - + + LttvTraceset * traceset = lttv_traceset_new(); for(iter=traces; iter!=NULL; iter=g_slist_next(iter)) { gchar *path = (gchar*)iter->data; /* Add trace */ gchar abs_path[PATH_MAX]; - LttvTrace *trace_v; - LttTrace *trace; + get_absolute_pathname(path, abs_path); - trace_v = lttvwindowtraces_get_trace_by_name(abs_path); - if(trace_v == NULL) { - trace = ltt_trace_open(abs_path); - if(trace == NULL) { - g_warning("cannot open trace %s", abs_path); + + if(lttv_traceset_add_path(traceset,abs_path) != 0 ){ /*failure*/ + + g_warning("cannot open trace %s", abs_path); GtkWidget *dialogue = gtk_message_dialog_new( @@ -4904,19 +4203,10 @@ __EXPORT void create_main_window_with_trace_list(GSList *traces) "to select it ?"); gtk_dialog_run(GTK_DIALOG(dialogue)); gtk_widget_destroy(dialogue); - } else { - trace_v = lttv_trace_new(trace); - lttvwindowtraces_add_trace(trace_v); - lttvwindow_add_trace(tab, trace_v); - } - } else { - lttvwindow_add_trace(tab, trace_v); } - } - - LttvTraceset *traceset; - - traceset = tab->traceset_info->traceset; - SetTraceset(tab, traceset); + else{ + SetTraceset(tab, traceset); + } + } }