gui control flow working with text, need hooking after trace state processing of...
[lttv.git] / ltt / branches / poly / lttv / modules / guiControlFlow / Drawing.c
index c92d4607cf07666d649b682929bebd11239fcef4..2235c1215f694c4e627da1181b78bd2b18667f96 100644 (file)
@@ -14,7 +14,6 @@
 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
 #define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
 
-
 /*****************************************************************************
  *                              Drawing functions                            *
  *****************************************************************************/
@@ -43,6 +42,8 @@ static GdkColor CF_Colors [] =
 
 /* Function responsible for updating the exposed area.
  * It must call processTrace() to ask for this update.
+ * Note : this function cannot clear the background, because it may
+ * erase drawing already present (SAFETY).
  */
 void drawing_data_request(Drawing_t *Drawing,
                        GdkPixmap **Pixmap,
@@ -83,14 +84,7 @@ void drawing_data_request(Drawing_t *Drawing,
        LttvTracesetContext * tsc =
                                get_traceset_context(control_flow_data->Parent_Window);
        
-  gdk_draw_rectangle (*Pixmap,
-                     Drawing->Drawing_Area_V->style->white_gc,
-                     TRUE,
-                     x, y,
-                     width,    // do not overlap
-                     height);
-
-  //send_test_process(
+    //send_test_process(
        //guicontrolflow_get_process_list(Drawing->Control_Flow_Data),
        //Drawing);
   //send_test_drawing(
@@ -109,59 +103,101 @@ void drawing_data_request(Drawing_t *Drawing,
        g_critical("req : end : %u, %u", event_request.time_end.tv_sec, 
                                                                                                                                                        event_request.time_end.tv_nsec);
        
-       LttvHooks *event = lttv_hooks_new();
+       //LttvHooks *event = lttv_hooks_new();
+       LttvHooks *after_event = lttv_hooks_new();
        state_add_event_hooks_api(control_flow_data->Parent_Window);
-       lttv_hooks_add(event, draw_event_hook, &event_request);
+       //lttv_hooks_add(event, draw_event_hook, &event_request);
+       lttv_hooks_add(after_event, draw_after_hook, &event_request);
 
        lttv_process_traceset_seek_time(tsc, start);
        lttv_traceset_context_add_hooks(tsc,
                        NULL, NULL, NULL, NULL, NULL, NULL,
-                       NULL, NULL, NULL, event, NULL);
+                       NULL, NULL, NULL, NULL, after_event);
        lttv_process_traceset(tsc, end, G_MAXULONG);
        lttv_traceset_context_remove_hooks(tsc, NULL, NULL, NULL, NULL, NULL, NULL,
-                       NULL, NULL, NULL, event, NULL);
+                       NULL, NULL, NULL, NULL,after_event);
 
        state_remove_event_hooks_api(control_flow_data->Parent_Window);
-       lttv_hooks_destroy(event);
+       //lttv_hooks_destroy(event);
+       lttv_hooks_destroy(after_event);
 }
                      
 /* Callbacks */
 
 
 /* Create a new backing pixmap of the appropriate size */
+/* As the scaling will always change, it's of no use to copy old
+ * pixmap.
+ */
 static gboolean
 configure_event( GtkWidget *widget, GdkEventConfigure *event, 
                gpointer user_data)
 {
   Drawing_t *Drawing = (Drawing_t*)user_data;
 
+
+       /* First, get the new time interval of the main window */
+       /* we assume (see documentation) that the main window
+        * has updated the time interval before this configure gets
+        * executed.
+        */
+       get_time_window(Drawing->Control_Flow_Data->Parent_Window,
+                               &Drawing->Control_Flow_Data->Time_Window);
+       
   /* New Pixmap, size of the configure event */
-  GdkPixmap *Pixmap = gdk_pixmap_new(widget->window,
-                         widget->allocation.width,
-                         widget->allocation.height,
-                         -1);
+  //GdkPixmap *Pixmap = gdk_pixmap_new(widget->window,
+       //                widget->allocation.width + SAFETY,
+       //                widget->allocation.height + SAFETY,
+       //                -1);
        
   g_critical("drawing configure event");
-
+       g_critical("New draw size : %i by %i",widget->allocation.width, widget->allocation.height);
+       
+               
+       if (Drawing->Pixmap)
+    gdk_pixmap_unref(Drawing->Pixmap);
+       
   /* If no old Pixmap present */
-  if(Drawing->Pixmap == NULL)
+  //if(Drawing->Pixmap == NULL)
   {
        Drawing->Pixmap = gdk_pixmap_new(
                widget->window,
-               widget->allocation.width,
-               widget->allocation.height,
+               widget->allocation.width + SAFETY,
+               widget->allocation.height + SAFETY,
                //ProcessList_get_height
                // (GuiControlFlow_get_Process_List(Drawing->Control_Flow_Data)),
                -1);
-       Drawing->width = widget->allocation.width;
-       Drawing->height = widget->allocation.height;
-g_critical("init data");
-       /* Initial data request */
-       drawing_data_request(Drawing, &Drawing->Pixmap, 0, 0,
+               Drawing->width = widget->allocation.width;
+               Drawing->height = widget->allocation.height;
+               
+
+               // Clear the image
+         gdk_draw_rectangle (Drawing->Pixmap,
+                     widget->style->white_gc,
+                     TRUE,
+                     0, 0,
+                     widget->allocation.width+SAFETY,
+                     widget->allocation.height+SAFETY);
+
+               //g_info("init data request");
+
+
+               /* Initial data request */
+               // Do not need to ask for data of 1 pixel : not synchronized with
+               // main window time at this moment.
+               drawing_data_request(Drawing, &Drawing->Pixmap, 0, 0,
                        widget->allocation.width,
-                       widget->allocation.height);
+                               widget->allocation.height);
+                                     
+         Drawing->width = widget->allocation.width;
+               Drawing->height = widget->allocation.height;
+
+       return TRUE;
+
+
 
   }
+#ifdef NOTUSE
 //  /* Draw empty background */ 
 //  gdk_draw_rectangle (Pixmap,
 //                   widget->style->black_gc,
@@ -170,50 +206,54 @@ g_critical("init data");
 //                   widget->allocation.width,
 //                   widget->allocation.height);
   
-  /* Copy old data to new pixmap */
-  gdk_draw_drawable (Pixmap,
-                 widget->style->white_gc,
-                 Drawing->Pixmap,
-                 0, 0,
-                 0, 0,
-                 -1, -1);
-
+       /* Copy old data to new pixmap */
+       gdk_draw_drawable (Pixmap,
+         widget->style->white_gc,
+         Drawing->Pixmap,
+         0, 0,
+         0, 0,
+         -1, -1);
+               
   if (Drawing->Pixmap)
     gdk_pixmap_unref(Drawing->Pixmap);
 
   Drawing->Pixmap = Pixmap;
+               
+       // Clear the bottom part of the image (SAFETY)
+  gdk_draw_rectangle (Pixmap,
+                     widget->style->white_gc,
+                     TRUE,
+                     0, Drawing->height+SAFETY,
+                     Drawing->width+SAFETY,    // do not overlap
+                     (widget->allocation.height) - Drawing->height);
 
-   /* Request data for missing space */
-g_critical("missing data");
-   drawing_data_request(Drawing, &Pixmap, Drawing->width, 0,
-                       widget->allocation.width - Drawing->width,
-                       widget->allocation.height);
-   drawing_data_request(Drawing, &Pixmap, 0, Drawing->height,
-                  Drawing->width,
-                  widget->allocation.height - Drawing->height);
-                                             
-//   gdk_draw_rectangle (Pixmap,
-//                   widget->style->white_gc,
-//                   TRUE,
-//                   Drawing->width, 0,
-//                   widget->allocation.width -
-//                                     Drawing->width,
-//                   widget->allocation.height);
+       // Clear the right part of the image (SAFETY)
+  gdk_draw_rectangle (Pixmap,
+                     widget->style->white_gc,
+                     TRUE,
+                     Drawing->width+SAFETY, 0,
+                     (widget->allocation.width) - Drawing->width,      // do not overlap
+                     Drawing->height+SAFETY);
 
-//    gdk_draw_rectangle (Pixmap,
-//                   widget->style->white_gc,
-//                   TRUE,
-//                   0, Drawing->height,
-//                   Drawing->width,   // do not overlap
-//                   widget->allocation.height -
-//                                     Drawing->height);
-  
-  
+       /* Clear the backgound for data request, but not SAFETY */
+       gdk_draw_rectangle (Pixmap,
+                                       Drawing->Drawing_Area_V->style->white_gc,
+                     TRUE,
+                     Drawing->width + SAFETY, 0,
+                     widget->allocation.width - Drawing->width,        // do not overlap
+                     widget->allocation.height+SAFETY);
+
+  /* Request data for missing space */
+       g_info("missing data request");
+  drawing_data_request(Drawing, &Pixmap, Drawing->width, 0,
+               widget->allocation.width - Drawing->width,
+                       widget->allocation.height);
+                                     
   Drawing->width = widget->allocation.width;
   Drawing->height = widget->allocation.height;
 
   return TRUE;
+#endif //NOTUSE
 }
 
 
@@ -241,6 +281,9 @@ Drawing_t *drawing_construct(ControlFlowData *Control_Flow_Data)
        Drawing->Drawing_Area_V = gtk_drawing_area_new ();
        Drawing->Control_Flow_Data = Control_Flow_Data;
 
+       Drawing->pango_layout =
+               gtk_widget_create_pango_layout(Drawing->Drawing_Area_V, NULL);
+       
        //gtk_widget_set_size_request(Drawing->Drawing_Area_V->window, 50, 50);
        g_object_set_data_full(
                        G_OBJECT(Drawing->Drawing_Area_V),
@@ -290,6 +333,7 @@ void drawing_destroy(Drawing_t *Drawing)
        // Do not unref here, Drawing_t destroyed by it's widget.
        //g_object_unref( G_OBJECT(Drawing->Drawing_Area_V));
                
+       g_free(Drawing->pango_layout);
        g_free(Drawing);
 }
 
@@ -398,12 +442,12 @@ void drawing_insert_square(Drawing_t *Drawing,
                                guint y,
                                guint height)
 {
-       GdkRectangle update_rect;
+       //GdkRectangle update_rect;
 
        /* Allocate a new pixmap with new height */
        GdkPixmap *Pixmap = gdk_pixmap_new(Drawing->Drawing_Area_V->window,
-                         Drawing->width,
-                         Drawing->height + height,
+                         Drawing->width + SAFETY,
+                         Drawing->height + height + SAFETY,
                          -1);
        
        /* Copy the high region */
@@ -412,17 +456,17 @@ void drawing_insert_square(Drawing_t *Drawing,
                Drawing->Pixmap,
                0, 0,
                0, 0,
-               Drawing->width, y);
+               Drawing->width + SAFETY, y);
 
 
 
 
        /* add an empty square */
        gdk_draw_rectangle (Pixmap,
-               Drawing->Drawing_Area_V->style->black_gc,
+               Drawing->Drawing_Area_V->style->white_gc,
                TRUE,
                0, y,
-               Drawing->width, // do not overlap
+               Drawing->width + SAFETY,        // do not overlap
                height);
 
 
@@ -433,7 +477,7 @@ void drawing_insert_square(Drawing_t *Drawing,
                Drawing->Pixmap,
                0, y,
                0, y + height,
-               Drawing->width, Drawing->height - y);
+               Drawing->width+SAFETY, Drawing->height - y + SAFETY);
 
 
 
@@ -446,11 +490,11 @@ void drawing_insert_square(Drawing_t *Drawing,
        Drawing->height+=height;
 
        /* Rectangle to update, from new Drawing dimensions */
-       update_rect.x = 0 ;
-       update_rect.y = y ;
-       update_rect.width = Drawing->width;
-       update_rect.height = Drawing->height - y ;
-       gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect);
+       //update_rect.x = 0 ;
+       //update_rect.y = y ;
+       //update_rect.width = Drawing->width;
+       //update_rect.height = Drawing->height - y ;
+       //gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect);
 }
 
 
@@ -459,13 +503,13 @@ void drawing_remove_square(Drawing_t *Drawing,
                                guint y,
                                guint height)
 {
-       GdkRectangle update_rect;
+       //GdkRectangle update_rect;
        
        /* Allocate a new pixmap with new height */
        GdkPixmap *Pixmap = gdk_pixmap_new(
                        Drawing->Drawing_Area_V->window,
-                       Drawing->width,
-                       Drawing->height - height,
+                       Drawing->width + SAFETY,
+                       Drawing->height - height + SAFETY,
                        -1);
        
        /* Copy the high region */
@@ -474,7 +518,7 @@ void drawing_remove_square(Drawing_t *Drawing,
                Drawing->Pixmap,
                0, 0,
                0, 0,
-               Drawing->width, y);
+               Drawing->width + SAFETY, y);
 
 
 
@@ -484,7 +528,7 @@ void drawing_remove_square(Drawing_t *Drawing,
                Drawing->Pixmap,
                0, y + height,
                0, y,
-               Drawing->width, Drawing->height - y - height);
+               Drawing->width, Drawing->height - y - height + SAFETY);
 
 
        if (Drawing->Pixmap)
@@ -495,11 +539,11 @@ void drawing_remove_square(Drawing_t *Drawing,
        Drawing->height-=height;
        
        /* Rectangle to update, from new Drawing dimensions */
-       update_rect.x = 0 ;
-       update_rect.y = y ;
-       update_rect.width = Drawing->width;
-       update_rect.height = Drawing->height - y ;
-       gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect);
+       //update_rect.x = 0 ;
+       //update_rect.y = y ;
+       //update_rect.width = Drawing->width;
+       //update_rect.height = Drawing->height - y ;
+       //gtk_widget_draw( Drawing->Drawing_Area_V, &update_rect);
 }
 
 
This page took 0.029358 seconds and 4 git commands to generate.