load module uninitialized variable bugfix
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index 1ea288a5dd14ad2568c4bf20d43a45c3fdaf648d..6795b02e21429ee56ffdd6801e22d315dee7dc09 100644 (file)
@@ -22,6 +22,9 @@
 
 #include <limits.h> // for PATH_MAX
 #include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
 
 #include <gtk/gtk.h>
 
@@ -47,6 +50,7 @@
 
 
 #define DEFAULT_TIME_WIDTH_S   1
+#define CLIP_BUF 256 // size of clipboard buffer
 
 extern LttvTrace *g_init_trace ;
 
@@ -149,6 +153,217 @@ LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
   return s;
 }
 
+/* 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;
+}
+
+
 static gboolean viewer_grab_focus(GtkWidget *widget, GdkEventButton *event,
                                   gpointer data)
 {
@@ -160,6 +375,7 @@ static gboolean viewer_grab_focus(GtkWidget *widget, GdkEventButton *event,
   return 0;
 }
 
+
 static void connect_focus_recursive(GtkWidget *widget,
                                     GtkWidget *viewer)
 {
@@ -167,6 +383,10 @@ static void connect_focus_recursive(GtkWidget *widget,
     gtk_container_forall(GTK_CONTAINER(widget),
                          (GtkCallback)connect_focus_recursive,
                          viewer);
+
+  }
+  if(GTK_IS_TREE_VIEW(widget)) {
+    gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(widget), TRUE);
   }
   gtk_widget_add_events(widget, GDK_BUTTON_PRESS_MASK);
   g_signal_connect (G_OBJECT(widget),
@@ -183,10 +403,7 @@ static void connect_focus_recursive(GtkWidget *widget,
 void
 insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
 {
-  guint val = 20;
-
   insert_viewer((GtkWidget*)menuitem, (lttvwindow_viewer_constructor)user_data);
-  //  selected_hook(&val);
 }
 
 
@@ -212,7 +429,7 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
   viewer_container = tab->viewer_container;
 
   s = construct_traceset_selector(tab->traceset_info->traceset);
-  viewer = (GtkWidget*)constructor(tab, s, "Traceset_Selector");
+  viewer = (GtkWidget*)constructor(tab);
   if(viewer)
   {
     //gtk_multivpaned_widget_add(GTK_MULTIVPANED(multivpaned), viewer); 
@@ -251,8 +468,7 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset)
   /* 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
-     || ltt_time_compare(  ltt_time_add(tab->time_window.start_time,
-                                        tab->time_window.time_width),
+     || ltt_time_compare(tab->time_window.end_time,
                            time_span.end_time) > 0) {
     new_time_window.start_time = time_span.start_time;
     
@@ -266,6 +482,9 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset)
       tmp_time.tv_sec = time_span.end_time.tv_sec;
     tmp_time.tv_nsec = 0;
     new_time_window.time_width = tmp_time ;
+    new_time_window.time_width_double = ltt_time_to_double(tmp_time);
+    new_time_window.end_time = ltt_time_add(new_time_window.start_time,
+                                            new_time_window.time_width) ;
   }
   time_change_manager(tab, new_time_window);
   current_time_change_manager(tab, new_current_time);
@@ -441,13 +660,13 @@ MainWindow * get_window_data_struct(GtkWidget * widget)
 
   mw = lookup_widget(widget, "MWindow");
   if(mw == NULL){
-    g_printf("Main window does not exist\n");
+    g_info("Main window does not exist\n");
     return NULL;
   }
   
   mw_data = (MainWindow *) g_object_get_data(G_OBJECT(mw),"main_window_data");
   if(mw_data == NULL){
-    g_printf("Main window data does not exist\n");
+    g_warning("Main window data does not exist\n");
     return NULL;
   }
   return mw_data;
@@ -462,10 +681,10 @@ void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
   MainWindow * parent = get_window_data_struct(widget);
 
   if(clone){
-    g_printf("Clone : use the same traceset\n");
+    g_info("Clone : use the same traceset\n");
     construct_main_window(parent);
   }else{
-    g_printf("Empty : traceset is set to NULL\n");
+    g_info("Empty : traceset is set to NULL\n");
     construct_main_window(NULL);
   }
 }
@@ -480,7 +699,7 @@ GtkWidget *viewer_container_focus(GtkWidget *container)
   GtkWidget *widget;
 
   widget = (GtkWidget*)g_object_get_data(G_OBJECT(container),
-                    "focused_viewer");
+                                         "focused_viewer");
 
   if(widget == NULL) {
     g_debug("no widget focused");
@@ -488,6 +707,9 @@ GtkWidget *viewer_container_focus(GtkWidget *container)
 
     if(children != NULL)
       widget = GTK_WIDGET(children->data);
+      g_object_set_data(G_OBJECT(container),
+                        "focused_viewer",
+                        widget);
   }
   
   return widget;
@@ -501,7 +723,8 @@ gint viewer_container_position(GtkWidget *container, GtkWidget *child)
   if(child == NULL) return -1;
 
   gint pos;
-  GValue value = { 0, };
+  GValue value;
+  memset(&value, 0, sizeof(GValue));
   g_value_init(&value, G_TYPE_INT);
   gtk_container_child_get_property(GTK_CONTAINER(container),
                                    child,
@@ -636,7 +859,7 @@ void open_traceset(GtkWidget * widget, gpointer user_data)
     case GTK_RESPONSE_OK:
       dir = gtk_file_selection_get_selections (file_selector);
       traceset = lttv_traceset_load(dir[0]);
-      g_printf("Open a trace set %s\n", dir[0]); 
+      g_info("Open a trace set %s\n", dir[0]); 
       //Not finished yet
       g_strfreev(dir);
     case GTK_RESPONSE_REJECT:
@@ -656,6 +879,8 @@ static void events_request_free(EventsRequest *events_request)
        lttv_traceset_context_position_destroy(events_request->start_position);
   if(events_request->end_position != NULL)
        lttv_traceset_context_position_destroy(events_request->end_position);
+  if(events_request->hooks != NULL)
+    g_array_free(events_request->hooks, TRUE);
   if(events_request->before_chunk_traceset != NULL)
        lttv_hooks_destroy(events_request->before_chunk_traceset);
   if(events_request->before_chunk_trace != NULL)
@@ -709,9 +934,6 @@ static void events_request_free(EventsRequest *events_request)
 
 gboolean lttvwindow_process_pending_requests(Tab *tab)
 {
-  unsigned max_nb_events;
-  GdkWindow * win;
-  GdkCursor * new;
   GtkWidget* widget;
   LttvTracesetContext *tsc;
   LttvTracefileContext *tfc;
@@ -825,7 +1047,6 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           ltime = g_slist_append(ltime, g_slist_nth_data(list_out, 0));
         for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
           /* Find all time requests with the lowest start time in list_out */
-          guint index_ltime = g_array_index(ltime, guint, 0);
           EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
           EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
 
@@ -1000,11 +1221,27 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* 1.3.2 call before chunk
            * 1.3.3 events hooks added
            */
-          lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
-                                           events_request->before_chunk_trace,
-                                           events_request->before_chunk_tracefile,
-                                           events_request->event,
-                                           events_request->event_by_id);
+          if(events_request->trace == -1)
+            lttv_process_traceset_begin(tsc,
+                events_request->before_chunk_traceset,
+                events_request->before_chunk_trace,
+                events_request->before_chunk_tracefile,
+                events_request->event,
+                events_request->event_by_id);
+          else {
+            guint nb_trace = lttv_traceset_number(tsc->ts);
+            g_assert((guint)events_request->trace < nb_trace &&
+                      events_request->trace > -1);
+            LttvTraceContext *tc = tsc->traces[events_request->trace];
+
+            lttv_hooks_call(events_request->before_chunk_traceset, tsc);
+
+            lttv_trace_context_add_hooks(tc,
+                                         events_request->before_chunk_trace,
+                                         events_request->before_chunk_tracefile,
+                                         events_request->event,
+                                         events_request->event_by_id);
+          }
         }
       }
     } else {
@@ -1021,11 +1258,27 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* - Call before chunk
            * - events hooks added
            */
-          lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
+          if(events_request->trace == -1)
+            lttv_process_traceset_begin(tsc,
+                events_request->before_chunk_traceset,
+                events_request->before_chunk_trace,
+                events_request->before_chunk_tracefile,
+                events_request->event,
+                events_request->event_by_id);
+          else {
+            guint nb_trace = lttv_traceset_number(tsc->ts);
+            g_assert((guint)events_request->trace < nb_trace &&
+                      events_request->trace > -1);
+            LttvTraceContext *tc = tsc->traces[events_request->trace];
+
+            lttv_hooks_call(events_request->before_chunk_traceset, tsc);
+
+            lttv_trace_context_add_hooks(tc,
                                          events_request->before_chunk_trace,
                                          events_request->before_chunk_tracefile,
                                          events_request->event,
                                          events_request->event_by_id);
+          }
 
           iter = g_slist_next(iter);
         }
@@ -1069,11 +1322,29 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
             /* call before chunk
              * events hooks added
              */
-            lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
-                                             events_request->before_chunk_trace,
-                                             events_request->before_chunk_tracefile,
-                                             events_request->event,
-                                             events_request->event_by_id);
+            if(events_request->trace == -1)
+              lttv_process_traceset_begin(tsc,
+                  events_request->before_chunk_traceset,
+                  events_request->before_chunk_trace,
+                  events_request->before_chunk_tracefile,
+                  events_request->event,
+                  events_request->event_by_id);
+            else {
+              guint nb_trace = lttv_traceset_number(tsc->ts);
+              g_assert((guint)events_request->trace < nb_trace &&
+                        events_request->trace > -1);
+              LttvTraceContext *tc = tsc->traces[events_request->trace];
+
+              lttv_hooks_call(events_request->before_chunk_traceset, tsc);
+
+              lttv_trace_context_add_hooks(tc,
+                                           events_request->before_chunk_trace,
+                                           events_request->before_chunk_tracefile,
+                                           events_request->event,
+                                           events_request->event_by_id);
+          }
+
+
           }
 
           /* Go to next */
@@ -1173,7 +1444,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
     {
       /* 4. Call process traceset middle */
-      g_debug("Calling process traceset middle with %p, %lu sec %lu nsec, %lu nb ev, %p end pos", tsc, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position);
+      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);
 
       tfc = lttv_traceset_context_get_current_tfc(tsc);
@@ -1203,11 +1474,31 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* - Remove events hooks for req
            * - Call end chunk for req
            */
-          lttv_process_traceset_end(tsc, events_request->after_chunk_traceset,
+
+          if(events_request->trace == -1) 
+               lttv_process_traceset_end(tsc,
+                                         events_request->after_chunk_traceset,
                                          events_request->after_chunk_trace,
                                          events_request->after_chunk_tracefile,
                                          events_request->event,
                                          events_request->event_by_id);
+
+          else {
+            guint nb_trace = lttv_traceset_number(tsc->ts);
+            g_assert(events_request->trace < nb_trace &&
+                      events_request->trace > -1);
+            LttvTraceContext *tc = tsc->traces[events_request->trace];
+
+            lttv_trace_context_remove_hooks(tc,
+                                         events_request->after_chunk_trace,
+                                         events_request->after_chunk_tracefile,
+                                         events_request->event,
+                                         events_request->event_by_id);
+            lttv_hooks_call(events_request->after_chunk_traceset, tsc);
+
+
+          }
+
           /* - Call end request for req */
           lttv_hooks_call(events_request->after_request, (gpointer)tsc);
           
@@ -1242,12 +1533,29 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* - Remove events hooks for req
            * - Call end chunk for req
            */
-          lttv_process_traceset_end(tsc, events_request->after_chunk_traceset,
+          if(events_request->trace == -1) 
+               lttv_process_traceset_end(tsc,
+                                         events_request->after_chunk_traceset,
+                                         events_request->after_chunk_trace,
+                                         events_request->after_chunk_tracefile,
+                                         events_request->event,
+                                         events_request->event_by_id);
+
+          else {
+            guint nb_trace = lttv_traceset_number(tsc->ts);
+            g_assert(events_request->trace < nb_trace &&
+                      events_request->trace > -1);
+            LttvTraceContext *tc = tsc->traces[events_request->trace];
+
+            lttv_trace_context_remove_hooks(tc,
                                          events_request->after_chunk_trace,
                                          events_request->after_chunk_tracefile,
                                          events_request->event,
                                          events_request->event_by_id);
 
+            lttv_hooks_call(events_request->after_chunk_traceset, tsc);
+          }
+
           /* - req.num -= count */
           g_assert(events_request->num_events >= count);
           events_request->num_events -= count;
@@ -1515,7 +1823,6 @@ void add_trace(GtkWidget * widget, gpointer user_data)
   const char * dir;
   char abs_path[PATH_MAX];
   gint id;
-  gint i;
   MainWindow * mw_data = get_window_data_struct(widget);
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
@@ -1927,12 +2234,12 @@ void stop_processing(GtkWidget *widget, gpointer user_data)
 
 void save(GtkWidget * widget, gpointer user_data)
 {
-  g_printf("Save\n");
+  g_info("Save\n");
 }
 
 void save_as(GtkWidget * widget, gpointer user_data)
 {
-  g_printf("Save as\n");
+  g_info("Save as\n");
 }
 
 
@@ -1945,7 +2252,7 @@ void zoom(GtkWidget * widget, double size)
 {
   TimeInterval time_span;
   TimeWindow new_time_window;
-  LttTime    current_time, time_delta, time_s, time_e, time_tmp;
+  LttTime    current_time, time_delta;
   MainWindow * mw_data = get_window_data_struct(widget);
   LttvTracesetContext *tsc;
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
@@ -1971,131 +2278,56 @@ void zoom(GtkWidget * widget, double size)
   if(size == 0){
     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{
     new_time_window.time_width = ltt_time_div(new_time_window.time_width, size);
+    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_div(new_time_window.time_width, 2.0));
+        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)
       {
         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(
-           ltt_time_add(new_time_window.start_time, new_time_window.time_width),
-           time_span.end_time) > 0)
+        if(ltt_time_compare(new_time_window.end_time,
+                            time_span.end_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) ;
         }
       }
       
     }
-
-    //time_tmp = ltt_time_div(new_time_window.time_width, 2);
-    //if(ltt_time_compare(current_time, time_tmp) < 0){
-    //  time_s = time_span->startTime;
-    //} else {
-    //  time_s = ltt_time_sub(current_time,time_tmp);
-    //}
-    //time_e = ltt_time_add(current_time,time_tmp);
-    //if(ltt_time_compare(time_span->startTime, time_s) > 0){
-    //  time_s = time_span->startTime;
-    //}else if(ltt_time_compare(time_span->endTime, time_e) < 0){
-    //  time_e = time_span->endTime;
-    //  time_s = ltt_time_sub(time_e,new_time_window.time_width);
-    //}
-    //new_time_window.start_time = time_s;    
   }
 
-  //lttvwindow_report_time_window(mw_data, &new_time_window);
-  //call_pending_read_hooks(mw_data);
-
-  //lttvwindow_report_current_time(mw_data,&(tab->current_time));
-  //set_time_window(tab, &new_time_window);
-  // in expose now call_pending_read_hooks(mw_data);
-  //gtk_multi_vpaned_set_adjust(tab->multi_vpaned, &new_time_window, FALSE);
-  //
-  //
-
- LttTime rel_time =
-       ltt_time_sub(new_time_window.start_time, time_span.start_time); 
- if(   ltt_time_to_double(new_time_window.time_width)
-                             * NANOSECONDS_PER_SECOND
-                             / SCROLL_STEP_PER_PAGE/* step increment */
-       +
-       ltt_time_to_double(rel_time) * NANOSECONDS_PER_SECOND /* page size */
-                    == 
-       ltt_time_to_double(rel_time) * NANOSECONDS_PER_SECOND /* page size */
-       ) {
-    g_warning("Can not zoom that far due to scrollbar precision");
- } else if(
-     ltt_time_compare(
-       ltt_time_from_double( 
-            ltt_time_to_double(new_time_window.time_width)
-                                 /SCROLL_STEP_PER_PAGE ),
-       ltt_time_zero)
-     == 0 ) {
-    g_warning("Can not zoom that far due to time nanosecond precision");
+ 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);
-#if 0
-    /* Set scrollbar */
-    GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
-        
-    g_object_set(G_OBJECT(adjustment),
-                 //"value",
-                 //ltt_time_to_double(new_time_window.start_time) 
-                 //  * NANOSECONDS_PER_SECOND, /* value */
-                 "lower",
-                   0.0, /* lower */
-                 "upper",
-                 ltt_time_to_double(
-                   ltt_time_sub(time_span.end_time, time_span.start_time))
-                   * NANOSECONDS_PER_SECOND, /* upper */
-                 "step_increment",
-                 ltt_time_to_double(new_time_window.time_width)
-                               / SCROLL_STEP_PER_PAGE
-                               * NANOSECONDS_PER_SECOND, /* step increment */
-                 "page_increment",
-                 ltt_time_to_double(new_time_window.time_width) 
-                   * NANOSECONDS_PER_SECOND, /* page increment */
-                 "page_size",
-                 ltt_time_to_double(new_time_window.time_width) 
-                   * NANOSECONDS_PER_SECOND, /* page size */
-                 NULL);
-    gtk_adjustment_changed(adjustment);
-    //gtk_range_set_adjustment(GTK_RANGE(tab->scrollbar), adjustment);
-    //gtk_adjustment_value_changed(adjustment);
-    g_object_set(G_OBJECT(adjustment),
-                 "value",
-                 ltt_time_to_double(
-                   ltt_time_sub(new_time_window.start_time, time_span.start_time))
-                   * NANOSECONDS_PER_SECOND, /* value */
-                 NULL);
-    gtk_adjustment_value_changed(adjustment);
-   
-
-    //g_object_set(G_OBJECT(adjustment),
-    //             "value",
-    //             ltt_time_to_double(time_window->start_time) 
-    //               * NANOSECONDS_PER_SECOND, /* value */
-    //               NULL);
-    /* Note : the set value will call set_time_window if scrollbar value changed
-     */
-    //gtk_adjustment_set_value(adjustment,
-    //                         ltt_time_to_double(new_time_window.start_time)
-    //                         * NANOSECONDS_PER_SECOND);
-#endif //0
   }
 }
 
@@ -2116,12 +2348,12 @@ void zoom_extended(GtkWidget * widget, gpointer user_data)
 
 void go_to_time(GtkWidget * widget, gpointer user_data)
 {
-  g_printf("Go to time\n");  
+  g_info("Go to time\n");  
 }
 
 void show_time_frame(GtkWidget * widget, gpointer user_data)
 {
-  g_printf("Show time frame\n");  
+  g_info("Show time frame\n");  
 }
 
 
@@ -2152,7 +2384,7 @@ Tab *create_new_tab(GtkWidget* widget, gpointer user_data){
 
   GtkNotebook * notebook = (GtkNotebook *)lookup_widget(widget, "MNotebook");
   if(notebook == NULL){
-    g_printf("Notebook does not exist\n");
+    g_info("Notebook does not exist\n");
     return NULL;
   }
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
@@ -2208,7 +2440,7 @@ on_close_tab_activate                  (GtkWidget       *widget,
   MainWindow * mw_data = get_window_data_struct(widget);
   notebook = lookup_widget(widget, "MNotebook");
   if(notebook == NULL){
-    g_printf("Notebook does not exist\n");
+    g_info("Notebook does not exist\n");
     return;
   }
 
@@ -2225,7 +2457,7 @@ on_close_tab_X_clicked                 (GtkWidget       *widget,
   gint page_num;
   GtkWidget *notebook = lookup_widget(widget, "MNotebook");
   if(notebook == NULL){
-    g_printf("Notebook does not exist\n");
+    g_info("Notebook does not exist\n");
     return;
   }
  
@@ -2279,7 +2511,7 @@ void
 on_cut_activate                        (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Cut\n");
+  g_info("Cut\n");
 }
 
 
@@ -2287,7 +2519,7 @@ void
 on_copy_activate                       (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Copye\n");
+  g_info("Copye\n");
 }
 
 
@@ -2295,7 +2527,7 @@ void
 on_paste_activate                      (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Paste\n");
+  g_info("Paste\n");
 }
 
 
@@ -2303,7 +2535,7 @@ void
 on_delete_activate                     (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Delete\n");
+  g_info("Delete\n");
 }
 
 
@@ -2394,7 +2626,7 @@ on_trace_filter_activate              (GtkMenuItem     *menuitem,
   
   s = g_object_get_data(G_OBJECT(w), "Traceset_Selector");
   if(!s){
-    g_printf("There is no viewer yet\n");      
+    g_info("There is no viewer yet\n");      
     return;
   }
   if(get_filter_selection(s, "Configure trace and tracefile filter", "Select traces and tracefiles")){
@@ -2410,7 +2642,7 @@ void
 on_trace_facility_activate              (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Trace facility selector: %s\n");  
+  g_info("Trace facility selector: %s\n");  
 }
 
 
@@ -2503,8 +2735,8 @@ on_load_library_activate                (GtkMenuItem     *menuitem,
         lttv_module_require(str1, &error);
 #endif //0   
         lttv_library_load(str1, &error);
-        if(error != NULL) g_warning(error->message);
-        else g_printf("Load library: %s\n", str);
+        if(error != NULL) g_warning("%s", error->message);
+        else g_info("Load library: %s\n", str);
         g_strfreev(dir);
       case GTK_RESPONSE_REJECT:
       case GTK_RESPONSE_CANCEL:
@@ -2530,40 +2762,39 @@ on_unload_library_activate              (GtkMenuItem     *menuitem,
 {
   MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
 
-  LttvLibrary *library;
-  {
-    GPtrArray *name;
-    guint nb,i;
-    gchar *lib_name;
-    name = g_ptr_array_new();
-    nb = lttv_library_number();
-    LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
-    /* ask for the library name */
+  LttvLibrary *library = NULL;
 
+  GPtrArray *name;
+  guint nb,i;
+  gchar *lib_name;
+  name = g_ptr_array_new();
+  nb = lttv_library_number();
+  LttvLibraryInfo *lib_info = g_new(LttvLibraryInfo,nb);
+  /* ask for the library name */
+
+  for(i=0;i<nb;i++){
+    LttvLibrary *iter_lib = lttv_library_get(i);
+    lttv_library_info(iter_lib, &lib_info[i]);
+    
+    gchar *path = lib_info[i].name;
+    g_ptr_array_add(name, path);
+  }
+  lib_name = get_selection((char **)(name->pdata), name->len,
+                           "Select a library", "Libraries");
+  if(lib_name != NULL) {
     for(i=0;i<nb;i++){
-      LttvLibrary *iter_lib = lttv_library_get(i);
-      lttv_library_info(iter_lib, &lib_info[i]);
-      
-      gchar *path = lib_info[i].name;
-      g_ptr_array_add(name, lib_info[i].name);
-    }
-    lib_name = get_selection((char **)(name->pdata), name->len,
-                             "Select a library", "Libraries");
-    if(lib_name != NULL) {
-      for(i=0;i<nb;i++){
-        if(strcmp(lib_name, lib_info[i].name) == 0) {
-          library = lttv_library_get(i);
-          break;
-        }
+      if(strcmp(lib_name, lib_info[i].name) == 0) {
+        library = lttv_library_get(i);
+        break;
       }
     }
-    g_ptr_array_free(name, TRUE);
-    g_free(lib_info);
-
-    if(lib_name == NULL) return;
   }
-  
-  lttv_library_unload(library);
+  g_ptr_array_free(name, TRUE);
+  g_free(lib_info);
+
+  if(lib_name == NULL) return;
+
+  if(library != NULL) lttv_library_unload(library);
 }
 
 
@@ -2578,7 +2809,7 @@ on_load_module_activate                (GtkMenuItem     *menuitem,
   GError *error = NULL;
   MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
 
-  LttvLibrary *library;
+  LttvLibrary *library = NULL;
   {
     GPtrArray *name;
     guint nb,i;
@@ -2618,9 +2849,9 @@ on_load_module_activate                (GtkMenuItem     *menuitem,
     GPtrArray *name;
     guint nb,i;
     gchar *module_name;
+    nb = lttv_library_module_number(library);
     LttvModuleInfo *module_info = g_new(LttvModuleInfo,nb);
     name = g_ptr_array_new();
-    nb = lttv_library_module_number(library);
     /* ask for the module name */
 
     for(i=0;i<nb;i++){
@@ -2649,8 +2880,8 @@ on_load_module_activate                (GtkMenuItem     *menuitem,
   }
   
   lttv_module_require(module_name_out, &error);
-  if(error != NULL) g_warning(error->message);
-  else g_printf("Load module: %s\n", module_name_out);
+  if(error != NULL) g_warning("%s", error->message);
+  else g_info("Load module: %s", module_name_out);
 
 
 #if 0
@@ -2697,7 +2928,7 @@ on_load_module_activate                (GtkMenuItem     *menuitem,
 #endif //0   
         lttv_library_load(str1, &error);
         if(error != NULL) g_warning(error->message);
-        else g_printf("Load library: %s\n", str);
+        else g_info("Load library: %s\n", str);
         g_strfreev(dir);
       case GTK_RESPONSE_REJECT:
       case GTK_RESPONSE_CANCEL:
@@ -2758,7 +2989,7 @@ on_unload_module_activate              (GtkMenuItem     *menuitem,
     if(lib_name == NULL) return;
   }
 
-  LttvModule *module;
+  LttvModule *module = NULL;
   {
     /* Ask for the module to load : list modules in the selected lib */
     GPtrArray *name;
@@ -2795,7 +3026,7 @@ on_unload_module_activate              (GtkMenuItem     *menuitem,
   
   LttvModuleInfo module_info;
   lttv_module_info(module, &module_info);
-  g_printf("Release module: %s\n", module_info.name);
+  g_info("Release module: %s\n", module_info.name);
  
   lttv_module_release(module);
 }
@@ -2870,7 +3101,7 @@ void
 on_color_activate                      (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Color\n");
+  g_info("Color\n");
 }
 
 
@@ -2878,7 +3109,7 @@ void
 on_filter_activate                     (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Filter\n");
+  g_info("Filter\n");
 }
 
 
@@ -2886,7 +3117,7 @@ void
 on_save_configuration_activate         (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Save configuration\n");
+  g_info("Save configuration\n");
 }
 
 
@@ -2894,7 +3125,7 @@ void
 on_content_activate                    (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  g_printf("Content\n");
+  g_info("Content\n");
 }
 
 
@@ -2945,23 +3176,26 @@ on_about_activate                      (GtkMenuItem     *menuitem,
   GtkWidget *label2 = gtk_label_new("");
   gtk_misc_set_padding(GTK_MISC(label2), 10, 20);
   gtk_label_set_markup(GTK_LABEL(label2), "\
-Project author: Karim Yaghmour\n\
-\n\
 Contributors :\n\
 \n\
 Michel Dagenais (New trace format, lttv main)\n\
 Mathieu Desnoyers (Directory structure, build with automake/conf,\n\
-                   lttv gui, control flow view, gui green threads\n\
-                   with interruptible foreground and background computation,\n\
-                   detailed event list)\n\
-Benoit Des Ligneris (Cluster adaptation)\n\
+                   lttv gui, control flow view, gui cooperative trace reading\n\
+                   scheduler with interruptible foreground and background\n\
+                   computation, detailed event list)\n\
+Benoit Des Ligneris, Ã‰ric 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)");
+Tom Zanussi (RelayFS)\n\
+\n\
+Strongly 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, Copyright (C) 2004  Karim Yaghmour\n\
+Linux Trace Toolkit Viewer, Copyright (C) 2004  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.");
@@ -3147,7 +3381,7 @@ on_MWindow_destroy                     (GtkWidget       *widget,
   g_object_unref(main_window->attributes);
   g_main_window_list = g_slist_remove(g_main_window_list, main_window);
 
-  g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
+  g_info("There are now : %d windows\n",g_slist_length(g_main_window_list));
   if(g_slist_length(g_main_window_list) == 0)
     gtk_main_quit ();
 }
@@ -3158,11 +3392,6 @@ on_MWindow_configure                   (GtkWidget         *widget,
                                         gpointer           user_data)
 {
   MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
-  float width = event->width;
-  TimeWindow time_win;
-  double ratio;
-  TimeInterval *time_span;
-  LttTime time;
        
        // MD : removed time width modification upon resizing of the main window.
        // The viewers will redraw themselves completely, without time interval
@@ -3210,8 +3439,7 @@ void time_change_manager               (Tab *tab,
   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 = ltt_time_add(new_time_window.start_time,
-                                  new_time_window.time_width);
+  LttTime end_time = new_time_window.end_time;
 
   /* Set scrollbar */
   GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
@@ -3232,18 +3460,15 @@ void time_change_manager               (Tab *tab,
                "lower",
                  0.0, /* lower */
                "upper",
-               ltt_time_to_double(upper) 
-                 * NANOSECONDS_PER_SECOND, /* upper */
+               ltt_time_to_double(upper), /* upper */
                "step_increment",
-               ltt_time_to_double(new_time_window.time_width)
-                             / SCROLL_STEP_PER_PAGE
-                             * NANOSECONDS_PER_SECOND, /* step increment */
+               new_time_window.time_width_double
+                             / SCROLL_STEP_PER_PAGE, /* step increment */
                "page_increment",
-               ltt_time_to_double(new_time_window.time_width) 
-                 * NANOSECONDS_PER_SECOND, /* page increment */
+               new_time_window.time_width_double, 
+                                                     /* page increment */
                "page_size",
-               ltt_time_to_double(new_time_window.time_width) 
-                 * NANOSECONDS_PER_SECOND, /* page size */
+               new_time_window.time_width_double, /* page size */
                NULL);
   gtk_adjustment_changed(adjustment);
 
@@ -3251,13 +3476,12 @@ void time_change_manager               (Tab *tab,
  //              "value",
  //              ltt_time_to_double(
  //               ltt_time_sub(start_time, time_span.start_time))
- //                  * NANOSECONDS_PER_SECOND, /* value */
+ //                 , /* value */
  //              NULL);
   //gtk_adjustment_value_changed(adjustment);
   gtk_range_set_value(GTK_RANGE(tab->scrollbar),
                ltt_time_to_double(
-                ltt_time_sub(start_time, time_span.start_time))
-                   * NANOSECONDS_PER_SECOND /* value */);
+                ltt_time_sub(start_time, time_span.start_time)) /* value */);
 
   /* set the time bar. */
   /* start seconds */
@@ -3269,17 +3493,23 @@ void time_change_manager               (Tab *tab,
 
   /* start nanoseconds */
   if(start_time.tv_sec == time_span.start_time.tv_sec) {
-    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 */
+    /* 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);
@@ -3295,9 +3525,17 @@ void time_change_manager               (Tab *tab,
 
   /* end nanoseconds */
   if(end_time.tv_sec == time_span.start_time.tv_sec) {
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4),
-                              (double)time_span.start_time.tv_nsec+1,
-                              (double)NANOSECONDS_PER_SECOND-1);
+    /* 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.. */
@@ -3335,34 +3573,42 @@ on_MEntry1_value_changed               (GtkSpinButton *spinbutton,
 
   TimeWindow new_time_window = tab->time_window;
  
-  LttTime end_time = ltt_time_add(new_time_window.start_time,
-                                  new_time_window.time_width);
+  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_nsec < time_span.start_time.tv_nsec)
-      new_time_window.start_time.tv_nsec = time_span.start_time.tv_nsec;
+    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;
   }
 
-  /* check if end time selected is below or equal */
   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(time_span.end_time,
-                                  ltt_time_add(new_time_window.start_time,
-                                               new_time_window.time_width)
-                                 );
+    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);
 
@@ -3380,24 +3626,25 @@ on_MEntry2_value_changed               (GtkSpinButton *spinbutton,
 
   TimeWindow new_time_window = tab->time_window;
  
-  LttTime end_time = ltt_time_add(new_time_window.start_time,
-                                  new_time_window.time_width);
+  LttTime end_time = new_time_window.end_time;
 
   new_time_window.start_time.tv_nsec = value;
 
-  /* check if end time selected is below or equal */
   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(time_span.end_time,
-                                  ltt_time_add(new_time_window.start_time,
-                                               new_time_window.time_width)
-                                 );
+    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);
 
@@ -3415,34 +3662,44 @@ on_MEntry3_value_changed               (GtkSpinButton *spinbutton,
 
   TimeWindow new_time_window = tab->time_window;
  
-  LttTime end_time = ltt_time_add(new_time_window.start_time,
-                                  new_time_window.time_width);
+  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_nsec < time_span.start_time.tv_nsec)
-      end_time.tv_nsec = time_span.start_time.tv_nsec+1;
+    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;
   }
 
-  /* check if end time selected is below or equal */
   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(time_span.start_time,
-                                        ltt_time_sub(end_time,
-                                                     new_time_window.time_width)
-                                             );
+    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);
 
 }
@@ -3459,23 +3716,25 @@ on_MEntry4_value_changed               (GtkSpinButton *spinbutton,
 
   TimeWindow new_time_window = tab->time_window;
  
-  LttTime end_time = ltt_time_add(new_time_window.start_time,
-                                  new_time_window.time_width);
+  LttTime end_time = new_time_window.end_time;
+
   end_time.tv_nsec = value;
 
-  /* check if end time selected is below or equal */
   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(time_span.start_time,
-                                        ltt_time_sub(end_time,
-                                                     new_time_window.time_width)
-                                             );
+    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);
 
@@ -3499,22 +3758,31 @@ void current_time_change_manager       (Tab *tab,
                             (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) {
-    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 */
+    /* 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);
 
@@ -3537,8 +3805,15 @@ on_MEntry5_value_changed               (GtkSpinButton *spinbutton,
 
   /* current nanoseconds */
   if(new_current_time.tv_sec == time_span.start_time.tv_sec) {
-    if(new_current_time.tv_nsec < time_span.start_time.tv_nsec)
-      new_current_time.tv_nsec = time_span.start_time.tv_nsec;
+    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)
@@ -3575,7 +3850,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
     LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
   TimeInterval time_span = tsc->time_span;
 
-  time = ltt_time_add(ltt_time_from_double(value/NANOSECONDS_PER_SECOND),
+  time = ltt_time_add(ltt_time_from_double(value),
                       time_span.start_time);
 
   new_time_window.start_time = time;
@@ -3583,7 +3858,13 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
   page_size = adjust->page_size;
 
   new_time_window.time_width = 
-    ltt_time_from_double(page_size/NANOSECONDS_PER_SECOND);
+    ltt_time_from_double(page_size);
+
+  new_time_window.time_width_double =
+              page_size;
+
+  new_time_window.end_time = ltt_time_add(new_time_window.start_time, 
+                                          new_time_window.time_width);
 
 
   time_change_manager(tab, new_time_window);
@@ -3598,7 +3879,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
   //time = ltt_time_sub(time_span->end_time, time_span->start_time);
   //time = ltt_time_mul(time, (float)ratio);
   //time = ltt_time_add(time_span->start_time, time);
-  time = ltt_time_add(ltt_time_from_double(value/NANOSECONDS_PER_SECOND),
+  time = ltt_time_add(ltt_time_from_double(value),
                       time_span.start_time);
 
   time_window.start_time = time;
@@ -3606,7 +3887,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
   page_size = adjust->page_size;
 
   time_window.time_width = 
-    ltt_time_from_double(page_size/NANOSECONDS_PER_SECOND);
+    ltt_time_from_double(page_size);
   //time = ltt_time_sub(time_span.end_time, time);
   //if(ltt_time_compare(time,time_window.time_width) < 0){
   //  time_window.time_width = time;
@@ -3939,10 +4220,11 @@ char * get_selection(char ** loaded_module_name, int nb_module,
   }
 
   id = gtk_dialog_run(GTK_DIALOG(dialogue));
+  GtkTreeModel **store_model = (GtkTreeModel**)&store;  /* for strict aliasing */
   switch(id){
     case GTK_RESPONSE_ACCEPT:
     case GTK_RESPONSE_OK:
-      if (gtk_tree_selection_get_selected (select, (GtkTreeModel**)&store, &iter)){
+      if (gtk_tree_selection_get_selected (select, store_model, &iter)){
          gtk_tree_model_get ((GtkTreeModel*)store, &iter, MODULE_COLUMN, &unload_module_name, -1);
       }
     case GTK_RESPONSE_REJECT:
@@ -3963,7 +4245,7 @@ char * get_selection(char ** loaded_module_name, int nb_module,
 
 void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
 {
-  int i;
+  guint i;
   GdkPixbuf *pixbuf;
   lttvwindow_viewer_constructor constructor;
   LttvMenus * global_menu, * instance_menu;
@@ -4103,7 +4385,7 @@ void construct_main_window(MainWindow * parent)
   //create a default tab
   notebook = (GtkNotebook *)lookup_widget(new_m_window->mwindow, "MNotebook");
   if(notebook == NULL){
-    g_printf("Notebook does not exist\n");
+    g_info("Notebook does not exist\n");
     return;
   }
   //gtk_notebook_popup_enable (GTK_NOTEBOOK(notebook));
@@ -4131,9 +4413,53 @@ void construct_main_window(MainWindow * parent)
     }
     LttvTraceset *traceset = new_tab->traceset_info->traceset;
     SetTraceset(new_tab, traceset);
+
+    /* Insert default viewers */
+    {
+      LttvAttributeType type;
+      LttvAttributeName name;
+      LttvAttributeValue value;
+      LttvAttribute *attribute;
+      
+      LttvIAttribute *attributes_global = 
+         LTTV_IATTRIBUTE(lttv_global_attributes());
+
+      g_assert(attribute = 
+        LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
+                                  LTTV_IATTRIBUTE(attributes_global),
+                                  LTTV_VIEWER_CONSTRUCTORS)));
+
+      name = g_quark_from_string("guievents");
+      type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
+                                         name, &value);
+      if(type == LTTV_POINTER) {
+        lttvwindow_viewer_constructor viewer_constructor = 
+                  (lttvwindow_viewer_constructor)*value.v_pointer;
+        insert_viewer(new_window, viewer_constructor);
+      }
+
+      name = g_quark_from_string("guicontrolflow");
+      type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
+                                         name, &value);
+      if(type == LTTV_POINTER) {
+        lttvwindow_viewer_constructor viewer_constructor = 
+                  (lttvwindow_viewer_constructor)*value.v_pointer;
+        insert_viewer(new_window, viewer_constructor);
+      }
+
+      name = g_quark_from_string("guistatistics");
+      type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
+                                         name, &value);
+      if(type == LTTV_POINTER) {
+        lttvwindow_viewer_constructor viewer_constructor = 
+                  (lttvwindow_viewer_constructor)*value.v_pointer;
+        insert_viewer(new_window, viewer_constructor);
+      }
+
+    }
   }
 
-  g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
+  g_info("There are now : %d windows\n",g_slist_length(g_main_window_list));
 }
 
 
@@ -4141,44 +4467,46 @@ void construct_main_window(MainWindow * parent)
  * destroy the tab
  */
 
-void tab_destructor(Tab * tab_instance)
+void tab_destructor(Tab * tab)
 {
   int i, nb, ref_count;
   LttvTrace * trace;
 
-  if(tab_instance->attributes)
-    g_object_unref(tab_instance->attributes);
+  gtk_object_destroy(GTK_OBJECT(tab->tooltips));
+  
+  if(tab->attributes)
+    g_object_unref(tab->attributes);
 
-  if(tab_instance->interrupted_state)
-    g_object_unref(tab_instance->interrupted_state);
+  if(tab->interrupted_state)
+    g_object_unref(tab->interrupted_state);
 
 
-  if(tab_instance->traceset_info->traceset_context != NULL){
+  if(tab->traceset_info->traceset_context != NULL){
     //remove state update hooks
     lttv_state_remove_event_hooks(
-         (LttvTracesetState*)tab_instance->traceset_info->
+         (LttvTracesetState*)tab->traceset_info->
                               traceset_context);
-    lttv_context_fini(LTTV_TRACESET_CONTEXT(tab_instance->traceset_info->
+    lttv_context_fini(LTTV_TRACESET_CONTEXT(tab->traceset_info->
                                            traceset_context));
-    g_object_unref(tab_instance->traceset_info->traceset_context);
+    g_object_unref(tab->traceset_info->traceset_context);
   }
-  if(tab_instance->traceset_info->traceset != NULL) {
-    nb = lttv_traceset_number(tab_instance->traceset_info->traceset);
+  if(tab->traceset_info->traceset != NULL) {
+    nb = lttv_traceset_number(tab->traceset_info->traceset);
     for(i = 0 ; i < nb ; i++) {
-      trace = lttv_traceset_get(tab_instance->traceset_info->traceset, i);
+      trace = lttv_traceset_get(tab->traceset_info->traceset, i);
       ref_count = lttv_trace_get_ref_number(trace);
       if(ref_count <= 1){
              ltt_trace_close(lttv_trace(trace));
       }
     }
   }  
-  lttv_traceset_destroy(tab_instance->traceset_info->traceset);
+  lttv_traceset_destroy(tab->traceset_info->traceset);
   /* Remove the idle events requests processing function of the tab */
-  g_idle_remove_by_data(tab_instance);
+  g_idle_remove_by_data(tab);
 
-  g_slist_free(tab_instance->events_requests);
-  g_free(tab_instance->traceset_info);
-  g_free(tab_instance);
+  g_slist_free(tab->events_requests);
+  g_free(tab->traceset_info);
+  g_free(tab);
 }
 
 
@@ -4190,7 +4518,6 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab,
 {
   GList * list;
   Tab * tab;
-  LttTime tmp_time;
   
   //create a new tab data structure
   tab = g_new(Tab,1);
@@ -4272,21 +4599,44 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab,
   {
     tab->MTimebar = gtk_hbox_new(FALSE, 2);
     gtk_widget_show(tab->MTimebar);
-
-    tab->MText1 = gtk_label_new("Time Frame  start: ");
-    gtk_widget_show(tab->MText1);
+    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->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");
@@ -4320,7 +4670,10 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab,
     
     GtkWidget *temp_widget;
     
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText1, FALSE, FALSE, 0);
+    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);
@@ -4328,7 +4681,8 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab,
     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->MText3b, 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);
@@ -4339,8 +4693,47 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab,
     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->MText5b, 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);
   }
 
   gtk_box_pack_end(GTK_BOX(tab->vbox),
This page took 0.049102 seconds and 4 git commands to generate.