now default viewers on main tab
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index 7a7d19c96484766437ad90ff4675c91340284ed9..273207da007bda0ed98840e7c71bf34cc4179a58 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,17 +153,248 @@ 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)
 {
-  GtkWidget *viewer_container = GTK_WIDGET(data);
+  GtkWidget *viewer = GTK_WIDGET(data);
+  GtkWidget *viewer_container = gtk_widget_get_parent(viewer);
 
   g_debug("FOCUS GRABBED");
-  g_object_set_data(G_OBJECT(viewer_container), "focused_viewer", widget);
+  g_object_set_data(G_OBJECT(viewer_container), "focused_viewer", viewer);
+  return 0;
 }
 
 
+static void connect_focus_recursive(GtkWidget *widget,
+                                    GtkWidget *viewer)
+{
+  if(GTK_IS_CONTAINER(widget)) {
+    gtk_container_forall(GTK_CONTAINER(widget),
+                         (GtkCallback)connect_focus_recursive,
+                         viewer);
+
+  }
+  if(GTK_IS_TREE_VIEW(widget)) {
+    gtk_tree_view_set_headers_clickable(widget, TRUE);
+  }
+  gtk_widget_add_events(widget, GDK_BUTTON_PRESS_MASK);
+  g_signal_connect (G_OBJECT(widget),
+                    "button-press-event",
+                    G_CALLBACK (viewer_grab_focus),
+                    (gpointer)viewer);
+}
+
 /* insert_viewer function constructs an instance of a viewer first,
  * then inserts the widget of the instance into the container of the
  * main window
@@ -197,7 +432,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); 
@@ -208,22 +443,11 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
                      TRUE,
                      0);
 
-    g_signal_connect (G_OBJECT(viewer),
-                      "button-press-event",
-                      G_CALLBACK (viewer_grab_focus),
-                      (gpointer)viewer_container);
-    
-    // We unref here, because it is now referenced by the viewer_container!
-    // not for a box ... g_object_unref(G_OBJECT(viewer));
-
-    // The viewer will show itself when it receives a show notify
-    // So we call the show notify hooks here. It will
-    // typically add hooks for reading, we call process trace, and the
-    // end of reading hook will call gtk_widget_show and unregister the
-    // hooks.
-    // Note that show notify gets the time_requested through the call_data.
-    //show_viewer(mw_data);
-    // in expose now call_pending_read_hooks(mw_data);
+    /* We want to connect the viewer_grab_focus to EVERY
+     * child of this widget. The little trick is to get each child
+     * of each GTK_CONTAINER, even subchildren.
+     */
+    connect_focus_recursive(viewer, viewer);
   }
 }
 
@@ -466,14 +690,29 @@ void create_new_window(GtkWidget* widget, gpointer user_data, gboolean clone)
   }
 }
 
+/* Get the currently focused viewer.
+ * If no viewer is focused, use the first one.
+ *
+ * If no viewer available, return NULL.
+ */
 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");
+    GList *children = gtk_container_get_children(GTK_CONTAINER(container));
 
-  if(widget == NULL) g_debug("no widget focused");
+    if(children != NULL)
+      widget = GTK_WIDGET(children->data);
+      g_object_set_data(G_OBJECT(container),
+                        "focused_viewer",
+                        widget);
+  }
+  
   return widget;
 
 
@@ -1984,102 +2223,12 @@ void zoom(GtkWidget * widget, double size)
       }
       
     }
-
-    //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
   }
 }
 
@@ -3253,17 +3402,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);
@@ -3279,9 +3434,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.. */
@@ -3326,8 +3489,15 @@ on_MEntry1_value_changed               (GtkSpinButton *spinbutton,
 
   /* 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)
@@ -3405,8 +3575,15 @@ on_MEntry3_value_changed               (GtkSpinButton *spinbutton,
 
   /* 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)
@@ -3483,22 +3660,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);
 
@@ -3521,8 +3707,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)
@@ -4115,6 +4308,50 @@ 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));
@@ -4125,44 +4362,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);
+  g_object_unref(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);
 }
 
 
@@ -4256,21 +4495,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");
@@ -4304,7 +4566,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);
@@ -4312,7 +4577,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);
@@ -4323,8 +4589,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.031468 seconds and 4 git commands to generate.