time bar fixes
[lttv.git] / ltt / branches / poly / lttv / modules / gui / detailedevents / events.c
index 5e27c17a3315cb397f9af2180b6a63cfdf901768..c714031b35a79575ce3ac66e8be91e2f616f5b3d 100644 (file)
@@ -78,6 +78,8 @@ typedef struct _EventFields{
 #define RESERVE_SMALL_SIZE_SQUARE    RESERVE_SMALL_SIZE*RESERVE_SMALL_SIZE
 #define RESERVE_SMALL_SIZE_CUBE      RESERVE_SMALL_SIZE*RESERVE_SMALL_SIZE_SQUARE
 
+static const LttTime ltt_time_backward = { 1 , 0 };
+
 typedef enum _ScrollDirection{
   SCROLL_STEP_UP,
   SCROLL_STEP_DOWN,
@@ -231,7 +233,7 @@ h_gui_events(Tab * tab, LttvTracesetSelector * s, char* key)
 EventViewerData *
 gui_events(Tab *tab, LttvTracesetSelector * s,char* key )
 {
-  LttTime start;
+  LttTime end;
   GtkTreeViewColumn *column;
   GtkCellRenderer *renderer;
   EventViewerData* event_viewer_data = g_new(EventViewerData,1) ;
@@ -423,10 +425,10 @@ gui_events(Tab *tab, LttvTracesetSelector * s,char* key )
   LttvTracesetContext * tsc =
         lttvwindow_get_traceset_context(event_viewer_data->tab);
   TimeInterval time_span = tsc->time_span;
-  start = ltt_time_sub(time_span.end_time, time_span.start_time);
+  end = ltt_time_sub(time_span.end_time, time_span.start_time);
 
   event_viewer_data->vadjust_c->upper =
-              ltt_time_to_double(start) * NANOSECONDS_PER_SECOND;
+              ltt_time_to_double(end) * NANOSECONDS_PER_SECOND;
 
   event_viewer_data->append = TRUE;
 
@@ -676,7 +678,7 @@ void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data)
     if(ltt_time.tv_sec != current_time.tv_sec ||
        ltt_time.tv_nsec != current_time.tv_nsec){
       event_viewer_data->current_time_updated = TRUE;
-      lttvwindow_report_current_time(tab,&ltt_time);
+      lttvwindow_report_current_time(tab,ltt_time);
     }
   }else{
     g_warning("Can not get iter\n");
@@ -712,8 +714,6 @@ void v_scroll_cb (GtkAdjustment *adjustment, gpointer data)
       //             NULL, FALSE);
       gtk_tree_path_free(tree_path);
     }
-  
 }
 
 gint get_cell_height(GtkTreeView *TreeView)
@@ -897,15 +897,21 @@ static void get_data_wrapped(double time_value, guint list_height,
 
     switch(direction){
       case SCROLL_STEP_UP:
-        g_debug("direction STEP_UP");
+        if(direction == SCROLL_STEP_UP) g_debug("direction STEP_UP");
       case SCROLL_PAGE_UP:
-        g_debug("direction PAGE_UP");
+        if(direction == SCROLL_PAGE_UP) g_debug("direction PAGE_UP");
   if(direction == SCROLL_PAGE_UP){
     backward = list_height>event_viewer_data->start_event_index ? TRUE : FALSE;
   }else{
     backward = event_viewer_data->start_event_index == 0 ? TRUE : FALSE;
   }
   if(backward){
+    first = event_viewer_data->event_fields_queue->head;
+    if(!first)break;
+    event_fields = (EventFields*)first->data;
+    LttTime backward_start = event_fields->time;
+
+    maxNum = RESERVE_SMALL_SIZE_CUBE;
     event_viewer_data->append = FALSE;
     do{
       if(direction == SCROLL_PAGE_UP){
@@ -913,18 +919,16 @@ static void get_data_wrapped(double time_value, guint list_height,
       }else{
         minNum = 1;
       }
-
       first = event_viewer_data->event_fields_queue->head;
       if(!first)break;
       event_fields = (EventFields*)first->data;
       end = event_fields->time;
-      if(end.tv_nsec != 0)
-        end.tv_nsec--;
-      else {
-        g_assert(end.tv_sec != 0);
-        end.tv_sec--;
-        end.tv_nsec = NANOSECONDS_PER_SECOND-1;
-      }
+
+      backward_start = LTT_TIME_MAX(ltt_time_sub(backward_start,
+                                                   ltt_time_backward),
+                              tsc->time_span.start_time);
+
+      /*
       ltt_event_position_get(event_fields->ep, &block_num, &event_num, &tf);
       if(size !=0){
         if(event_num > minNum){
@@ -959,12 +963,14 @@ static void get_data_wrapped(double time_value, guint list_height,
         }       
         maxNum = RESERVE_SMALL_SIZE_CUBE;
       }
+      */
 
       event_viewer_data->current_event_index = event_viewer_data->start_event_index;
-      get_events(event_viewer_data, start, end, maxNum, &size);
+      get_events(event_viewer_data, backward_start, end, maxNum, &size);
       event_viewer_data->start_event_index = event_viewer_data->current_event_index;
 
-      if(size < minNum && (start.tv_sec !=0 || start.tv_nsec !=0))
+      if(size < minNum 
+          && (ltt_time_compare(backward_start, tsc->time_span.start_time)>0))
         need_backward_again = TRUE;
       else need_backward_again = FALSE;
       if(size == 0){
@@ -1511,7 +1517,7 @@ gboolean update_current_time(void * hook_data, void * call_data)
   sprintf(str_path,"%d\0",count);
   path = gtk_tree_path_new_from_string (str_path);
   gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
-  g_signal_stop_emission_by_name(G_OBJECT(event_viewer_data->tree_v), "cursor-changed");
+  //g_signal_stop_emission_by_name(G_OBJECT(event_viewer_data->tree_v), "cursor-changed");
   gtk_tree_path_free(path);  
 
   return FALSE;
@@ -1524,13 +1530,14 @@ gboolean traceset_changed(void * hook_data, void * call_data)
         lttvwindow_get_traceset_context(event_viewer_data->tab);
   TimeInterval time_span = tsc->time_span;
   
-  LttTime start;
+  LttTime end;
   remove_all_items_from_queue(event_viewer_data->event_fields_queue);
   gtk_list_store_clear(event_viewer_data->store_m);
   event_viewer_data->append = TRUE;
 
-  start = ltt_time_sub(time_span.end_time, time_span.start_time);
-  event_viewer_data->vadjust_c->upper = ltt_time_to_double(start) * NANOSECONDS_PER_SECOND;
+  end = ltt_time_sub(time_span.end_time, time_span.start_time);
+  event_viewer_data->vadjust_c->upper = ltt_time_to_double(end) * NANOSECONDS_PER_SECOND;
+  g_signal_emit_by_name(event_viewer_data->vadjust_c, "value-changed");
   //  event_viewer_data->vadjust_c->value = 0;
 
   return FALSE;
@@ -1689,9 +1696,26 @@ void get_events(EventViewerData* event_viewer_data, LttTime start,
                               NULL,
                               event_viewer_data->event_hooks,
                               NULL);
+  if(event_viewer_data->append == TRUE) {
+    /* append data */
+    lttv_process_traceset_middle(tsc, end, max_num_events, NULL);
+  } else{
+    guint count;
+    LttvTracefileContext *tfc;
+    /* prepend data */
+    do {
+      /* clear the temp list */
+      while(g_queue_pop_head(event_viewer_data->event_fields_queue_tmp));
+      /* read max_num events max */
+      count = lttv_process_traceset_middle(tsc, end, max_num_events, NULL);
+      /* loop if reached the max number of events to read, but not
+       * if end of trace or end time reached.*/
+      tfc = lttv_traceset_context_get_current_tfc(tsc);
+    } while(max_num_events == count 
+             && (tfc != NULL && ltt_time_compare(tfc->timestamp, end) < 0));
 
-  lttv_process_traceset_middle(tsc, end, max_num_events, NULL);
-
+  }
+  
   //remove_context_hooks(event_viewer_data,tsc);
   lttv_process_traceset_end(tsc,
                             NULL,
This page took 0.026523 seconds and 4 git commands to generate.