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);
};
-
#if 0
static void on_top_notify(GObject *gobject,
GParamSpec *arg1,
new_time_window.time_width) ;
}
-
-
-#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);
-
- 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
-
/* Finally, call the update hooks of the viewers */
- LttvHooks * tmp;
- LttvAttributeValue value;
- gint retval = 0;
-
- retval= lttv_iattribute_find_by_path(tab->attributes,
- "hooks/updatetraceset", LTTV_POINTER, &value);
- g_assert(retval);
-
- 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);
* @param tab viewer's tab
*/
-void update_traceset(Tab *tab)
+int update_traceset(Tab *tab, LttvTraceset *traceset)
{
LttvAttributeValue value;
LttvHooks * tmp;
gboolean retval;
retval= lttv_iattribute_find_by_path(tab->attributes,
- "hooks/updatetraceset", LTTV_POINTER, &value);
+ "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
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
}
}
-
+#endif
/* lttvwindow_process_pending_requests
*
* Process requests for parts of the trace from viewers.
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) {
events_request->start_time);
/* Process the traceset with only state hooks */
+#ifdef DEBUG
seek_count =
+#endif //DEBUG
lttv_process_traceset_middle(tsc,
events_request->start_time,
G_MAXUINT, NULL);
pos_time);
/* Process the traceset with only state hooks */
+#ifdef DEBUG
seek_count =
+#endif
lttv_process_traceset_middle(tsc,
ltt_time_infinite,
G_MAXUINT,
}
#undef list_out
+/**
+ Manage the periodic update of a live trace
+*/
+static gboolean
+live_trace_update_handler(Tab *tab)
+{
+ 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);
+}
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);
+ }
+
}
/* add_trace adds a trace into the current traceset. It first displays a
}
/* File open dialog management */
+ GtkWidget *extra_live_button;
GtkFileChooser * file_chooser =
GTK_FILE_CHOOSER(
gtk_file_chooser_dialog_new ("Select a trace",
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL));
+ /* 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);
+
gtk_file_chooser_set_show_hidden (file_chooser, TRUE);
if(remember_trace_dir[0] != '\0')
gtk_file_chooser_set_filename(file_chooser, remember_trace_dir);
case GTK_RESPONSE_ACCEPT:
case GTK_RESPONSE_OK:
dir = gtk_file_chooser_get_filename (file_chooser);
+
strncpy(remember_trace_dir, dir, PATH_MAX);
strncat(remember_trace_dir, "/", PATH_MAX);
if(!dir || strlen(dir) == 0){
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(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (extra_live_button))) {
+ trace = ltt_trace_open_live(abs_path);
+ } else {
+ trace = ltt_trace_open(abs_path);
+ }
+
if(trace == NULL) {
g_warning("cannot open trace %s", abs_path);
on_open_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
+#ifdef UNFINISHED_FEATURE
open_traceset((GtkWidget*)menuitem, user_data);
+#endif
}
on_button_open_clicked (GtkButton *button,
gpointer user_data)
{
+#ifdef UNFINISHED_FEATURE
open_traceset((GtkWidget*)button, user_data);
+#endif
}
set_current_position(tab, pos);
}
-
static void on_timebar_starttime_changed(Timebar *timebar,
gpointer user_data)
{
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
"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");
"Tab_Plugin",
ptab,
(GDestroyNotify)tab_destructor);
- new_tab = ptab->tab;
}
/* Insert default viewers */
}
-__EXPORT void create_main_window_with_trace_list(GSList *traces)
+__EXPORT void create_main_window_with_trace_list(GSList *traces, gboolean is_live)
{
GSList *iter = NULL;
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(is_live) {
+ trace = ltt_trace_open_live(abs_path);
+ } else {
+ trace = ltt_trace_open(abs_path);
+ }
if(trace == NULL) {
g_warning("cannot open trace %s", abs_path);