viewer_constructor cleanup
[lttv.git] / ltt / branches / poly / lttv / modules / gui / detailedevents / events.c
index ee6e6c52d9739f0697e1ecfd56afb7dfdfc4e79a..f2c2ff51b0158582a9505bf490830e782b008c6f 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,
@@ -106,7 +108,7 @@ typedef struct _EventViewerData {
   unsigned     start_event_index;       // the first event shown in the window
   unsigned     end_event_index;         // the last event shown in the window
   unsigned     size;                    // maxi number of events loaded when instance the viewer
-  gboolean     current_time_updated;
// gboolean     current_time_updated;
 
   //scroll window containing Tree View
   GtkWidget * scroll_win;
@@ -149,9 +151,9 @@ void remove_context_hooks(EventViewerData * event_viewer_data,
         LttvTracesetContext * tsc);
 
 //! Event Viewer's constructor hook
-GtkWidget *h_gui_events(Tab *tab, LttvTracesetSelector * s, char* key);
+GtkWidget *h_gui_events(Tab *tab);
 //! Event Viewer's constructor
-EventViewerData *gui_events(Tab *tab, LttvTracesetSelector *s, char *key);
+EventViewerData *gui_events(Tab *tab);
 //! Event Viewer's destructor
 void gui_events_destructor(EventViewerData *event_viewer_data);
 void gui_events_free(EventViewerData *event_viewer_data);
@@ -173,7 +175,6 @@ static void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gp
 static void tree_v_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data);
 static void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data);
 static void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data);
-static void tree_v_grab_focus(GtkWidget *widget, gpointer data);
 
 
 static void get_data(double time, guint list_height, 
@@ -212,10 +213,9 @@ enum
  * @return The widget created.
  */
 GtkWidget *
-h_gui_events(Tab * tab, LttvTracesetSelector * s, char* key)
+h_gui_events(Tab * tab)
 {
-  EventViewerData* event_viewer_data = gui_events(tab, s, key) ;
-
+  EventViewerData* event_viewer_data = gui_events(tab) ;
   if(event_viewer_data)
     return event_viewer_data->hbox_v;
   else return NULL;
@@ -229,7 +229,7 @@ h_gui_events(Tab * tab, LttvTracesetSelector * s, char* key)
  * @return The Event viewer data created.
  */
 EventViewerData *
-gui_events(Tab *tab, LttvTracesetSelector * s,char* key )
+gui_events(Tab *tab)
 {
   LttTime end;
   GtkTreeViewColumn *column;
@@ -291,10 +291,6 @@ gui_events(Tab *tab, LttvTracesetSelector * s,char* key )
         G_CALLBACK (tree_v_move_cursor_cb),
         event_viewer_data);
 
-  g_signal_connect (G_OBJECT (event_viewer_data->tree_v), "grab-focus",
-        G_CALLBACK (tree_v_grab_focus),
-        event_viewer_data);
-    
   // Use on each column!
   //gtk_tree_view_column_set_sizing(event_viewer_data->tree_v, GTK_TREE_VIEW_COLUMN_FIXED);
   
@@ -436,7 +432,7 @@ gui_events(Tab *tab, LttvTracesetSelector * s,char* key )
   /* Set the Selected Event */
   //  tree_v_set_cursor(event_viewer_data);
 
-  event_viewer_data->current_time_updated = FALSE;
// event_viewer_data->current_time_updated = FALSE;
   event_viewer_data->size  = RESERVE_SMALL_SIZE;
 
   g_object_set_data_full(
@@ -675,8 +671,8 @@ 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);
+   //   event_viewer_data->current_time_updated = TRUE;
+      lttvwindow_report_current_time(tab,ltt_time);
     }
   }else{
     g_warning("Can not get iter\n");
@@ -712,8 +708,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 +891,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 +913,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 +957,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){
@@ -1241,9 +1241,7 @@ gui_events_destructor(EventViewerData *event_viewer_data)
 
   /* May already been done by GTK window closing */
   if(GTK_IS_WIDGET(event_viewer_data->hbox_v)){
-    gui_events_free(event_viewer_data);
     gtk_widget_destroy(event_viewer_data->hbox_v);
-    event_viewer_data = NULL;
   }
   
   /* Destroy the Tree View */
@@ -1425,11 +1423,10 @@ gboolean update_current_time(void * hook_data, void * call_data)
 {
   EventViewerData *event_viewer_data = (EventViewerData*) hook_data;
   const LttTime * current_time = (LttTime*)call_data;
-  guint64 nsec = current_time->tv_sec * NANOSECONDS_PER_SECOND 
-                  + current_time->tv_nsec;
+  guint64 nsec = (guint64)current_time->tv_sec * NANOSECONDS_PER_SECOND 
+                  + (guint64)current_time->tv_nsec;
   GtkTreeIter iter;
   guint64 time;
-  int count = -1;
   GtkTreeModel* model = (GtkTreeModel*)event_viewer_data->store_m;
   GList * list;
   EventFields * data, *data1;
@@ -1442,31 +1439,41 @@ gboolean update_current_time(void * hook_data, void * call_data)
   TimeInterval time_span = tsc->time_span;
 
   if(!event_viewer_data->event_fields_queue->head) return FALSE;
-
+#if 0
   if(event_viewer_data->current_time_updated ){
     event_viewer_data->current_time_updated = FALSE;
     return FALSE;
   }
-
+#endif //0
   //check if the event is shown in the current viewer
+  gint count = 0;
+  gboolean event_shown = FALSE;
   if(gtk_tree_model_get_iter_first(model, &iter)){
-    while(1){
-      gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1);
-      if(time < nsec){
-  if(!gtk_tree_model_iter_next(model, &iter)){
-    count = -1;
-    break;
-  }
-  count++;
-      }else{
-  break;
+    gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1);
+    if(time > nsec){
+      /* Event is before the list */
+    } else {
+      /* Event can be in the list */
+      if(time >= nsec){
+        /* found */
+        event_shown = TRUE;
+      } else {
+        while(gtk_tree_model_iter_next(model, &iter)) {
+          gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1);
+          count++;
+          if(time >= nsec){
+            /* found */
+            event_shown = TRUE;
+            break;
+          }
+        }
       }
     }
-    //    event_selected_hook(event_viewer_data, &count);
   }
 
-  //the event is not shown in the current viewer
-  if(count == -1){
+  if(!event_shown)
+  {
+    //the event is not shown in the current viewer
     count = 0;
     //check if the event is in the buffer
     list = event_viewer_data->event_fields_queue->head;
@@ -1511,7 +1518,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;
@@ -1531,18 +1538,13 @@ gboolean traceset_changed(void * hook_data, void * call_data)
 
   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;
 }
 
 
-void tree_v_grab_focus(GtkWidget *widget, gpointer data){
-  EventViewerData *event_viewer_data = (EventViewerData *)data;
-  Tab * tab = event_viewer_data->tab;
-  lttvwindow_report_focus(tab, event_viewer_data->hbox_v);
-}
-
 void update_raw_data_array(EventViewerData* event_viewer_data, unsigned size)
 {
   EventFields * data;
@@ -1689,9 +1691,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.02642 seconds and 4 git commands to generate.