fix time bar mini bug
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index d7da3f4c199b1457eb926c333131a86176883a59..e8028fd2f9bb1019e7552d25aba97b8252f44c59 100644 (file)
@@ -149,16 +149,31 @@ LttvTracesetSelector * construct_traceset_selector(LttvTraceset * traceset)
   return s;
 }
 
-
 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);
+  }
+  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
@@ -208,22 +223,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 +470,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");
+  if(widget == NULL) {
+    g_debug("no widget focused");
+    GList *children = gtk_container_get_children(GTK_CONTAINER(container));
+
+    if(children != NULL)
+      widget = GTK_WIDGET(children->data);
+      g_object_set_data(G_OBJECT(container),
+                        "focused_viewer",
+                        widget);
+  }
+  
   return widget;
 
 
@@ -3253,17 +3272,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 +3304,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 +3359,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 +3445,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)
@@ -3477,33 +3524,41 @@ void current_time_change_manager       (Tab *tab,
   LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
   TimeInterval time_span = tsc->time_span;
 
-  tab->current_time = new_current_time;
-
   /* current seconds */
   gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry5),
                             (double)time_span.start_time.tv_sec,
                             (double)time_span.end_time.tv_sec);
+  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry5),
+                            (double)new_current_time.tv_sec);
+
 
   /* start nanoseconds */
   if(new_current_time.tv_sec == time_span.start_time.tv_sec) {
-    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);
 
-  lttvwindow_report_current_time(tab, tab->current_time);
+  set_current_time(tab, &new_current_time);
 
   tab->current_time_manager_lock = FALSE;
 }
@@ -3522,8 +3577,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)
This page took 0.024964 seconds and 4 git commands to generate.