Remove warning generated by newer gcc (4.6)
[lttv.git] / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index 5ce1f9251bb6f34b9d02c3805ffc3fad1b5e24d1..c06130b642bd6bca0d0a2d9d04802199043ade28 100644 (file)
 #include <lttv/iattribute.h>
 #include <lttv/stats.h>
 #include <lttv/filter.h>
+#include <lttv/sync/sync_chain_lttv.h>
 #include <lttvwindow/mainwindow.h>
 #include <lttvwindow/mainwindow-private.h>
 #include <lttvwindow/menu.h>
+#include <lttvwindow/timebar.h>
 #include <lttvwindow/toolbar.h>
 #include <lttvwindow/lttvwindow.h>
 #include <lttvwindow/lttvwindowtraces.h>
@@ -73,12 +75,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 +102,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 +172,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 +188,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,13 +218,66 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
 
 int SetTraceset(Tab * tab, LttvTraceset *traceset)
 {
+  guint i;
+  TimeInterval time_span;
+  TimeWindow new_time_window;
+  LttTime new_current_time;
   LttvTracesetContext *tsc =
-        LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
 
-  sync_traceset(tsc);
-  TimeInterval time_span = tsc->time_span;
-  TimeWindow new_time_window = tab->time_window;
-  LttTime new_current_time = tab->current_time;
+  // 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; i<lttv_traceset_number(traceset); i++)
+    {
+      LttvTrace *trace = lttv_traceset_get(traceset, i);
+      lttv_trace_unref(trace);
+    }
+
+    tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+  }
+
+  time_span = tsc->time_span;
+  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 */
@@ -498,71 +304,8 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset)
                                             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);
@@ -603,20 +346,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;
   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 
@@ -760,7 +531,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),
@@ -794,7 +564,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),
@@ -835,7 +604,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),
@@ -860,7 +628,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
@@ -897,7 +666,7 @@ void open_traceset(GtkWidget * widget, gpointer user_data)
   }
 
 }
-
+#endif
 /* lttvwindow_process_pending_requests
  *
  * Process requests for parts of the trace from viewers.
@@ -929,7 +698,6 @@ void open_traceset(GtkWidget * widget, gpointer user_data)
 
 gboolean lttvwindow_process_pending_requests(Tab *tab)
 {
-  GtkWidget* widget;
   LttvTracesetContext *tsc;
   LttvTracefileContext *tfc;
   GSList *list_in = NULL;
@@ -1141,7 +909,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
         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) {
@@ -1156,7 +926,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
                                                   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);
@@ -1200,7 +972,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
                                                   pos_time);
 
             /* Process the traceset with only state hooks */
+#ifdef DEBUG
             seek_count =
+#endif
                lttv_process_traceset_middle(tsc,
                                             ltt_time_infinite,
                                             G_MAXUINT,
@@ -1705,7 +1479,49 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 }
 
 #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)
 {
@@ -1760,6 +1576,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);
+  }
+
 }
 
 /* add_trace adds a trace into the current traceset. It first displays a 
@@ -1791,31 +1617,47 @@ 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));
-  
+  /* File open dialog management */
+  GtkWidget *extra_live_button; 
+  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));
+
+  /* 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_selection_set_filename(file_selector, remember_trace_dir);
-  
-  id = gtk_dialog_run(GTK_DIALOG(file_selector));
+         gtk_file_chooser_set_filename(file_chooser, remember_trace_dir);
+
+  id = gtk_dialog_run(GTK_DIALOG(file_chooser));
+
   switch(id){
     case GTK_RESPONSE_ACCEPT:
     case GTK_RESPONSE_OK:
-      dir = gtk_file_selection_get_filename (file_selector);
+      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){
-       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(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);
 
@@ -1839,7 +1681,6 @@ void add_trace(GtkWidget * widget, gpointer user_data)
         lttvwindow_add_trace(tab, trace_v);
       }
 
-      gtk_widget_destroy((GtkWidget*)file_selector);
       
       //update current tab
       //update_traceset(mw_data);
@@ -1855,9 +1696,10 @@ void add_trace(GtkWidget * widget, gpointer user_data)
     case GTK_RESPONSE_REJECT:
     case GTK_RESPONSE_CANCEL:
     default:
-      gtk_widget_destroy((GtkWidget*)file_selector);
-      break;
+           break;
   }
+  gtk_widget_destroy((GtkWidget*)file_chooser);
+
 }
 
 /* remove_trace removes a trace from the current traceset if all viewers in 
@@ -1899,7 +1741,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);
@@ -2217,7 +2059,6 @@ 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;
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
@@ -2398,7 +2239,9 @@ void
 on_open_activate                       (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
+#ifdef UNFINISHED_FEATURE
   open_traceset((GtkWidget*)menuitem, user_data);
+#endif
 }
 
 
@@ -2420,8 +2263,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");
@@ -2908,7 +2749,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;
@@ -3038,7 +2878,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 */
@@ -3192,7 +3031,9 @@ void
 on_button_open_clicked                 (GtkButton       *button,
                                         gpointer         user_data)
 {
+#ifdef UNFINISHED_FEATURE
   open_traceset((GtkWidget*)button, user_data);
+#endif
 }
 
 
@@ -3349,8 +3190,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.
@@ -3398,7 +3237,6 @@ void time_change_manager               (Tab *tab,
   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);
   
@@ -3445,432 +3283,23 @@ 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;
-}
+  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);
 
 
-/* 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);
-  }
-
-  /* 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);
-
-  new_time_window.end_time = end_time;
-  
-  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) ;
-      }
-    }
-    
-  }
+  /* call viewer hooks for new time window */
+  set_time_window(tab, &new_time_window);
 
-  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);
-  }
+  tab->time_manager_lock = FALSE;
 }
 
-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);
-  }
-}
 
 
 
@@ -3882,42 +3311,7 @@ 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);
 
@@ -3929,7 +3323,6 @@ void current_position_change_manager(Tab *tab,
 {
   LttvTracesetContext *tsc =
     LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
   int retval;
 
   retval= lttv_process_traceset_seek_position(tsc, pos);
@@ -3943,51 +3336,87 @@ void current_position_change_manager(Tab *tab,
   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;
+       LttvTracesetContext * tsc =
+               LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+       TimeInterval time_span = tsc->time_span;
+
+       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;
+       LttvTracesetContext * tsc = 
+               LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+       TimeInterval time_span = tsc->time_span;
+
+       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)
@@ -4292,8 +3721,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 
@@ -4354,7 +3782,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");
@@ -4364,7 +3791,6 @@ MainWindow *construct_main_window(MainWindow * parent)
            "Tab_Plugin",
            ptab,
           (GDestroyNotify)tab_destructor);
-    new_tab = ptab->tab;
   }
 
   /* Insert default viewers */
@@ -4426,8 +3852,6 @@ void tab_destructor(LttvPluginTab * ptab)
   LttvTrace * trace;
   Tab *tab = ptab->tab;
 
-  gtk_object_destroy(GTK_OBJECT(tab->tooltips));
-  
   if(tab->attributes)
     g_object_unref(tab->attributes);
 
@@ -4571,180 +3995,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,
@@ -4797,8 +4049,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);
 
 
@@ -4812,30 +4066,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);
@@ -4883,7 +4121,7 @@ gboolean execute_events_requests(Tab *tab)
 }
 
 
-__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;
 
@@ -4915,7 +4153,11 @@ __EXPORT void create_main_window_with_trace_list(GSList *traces)
     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);
 
This page took 0.042755 seconds and 4 git commands to generate.