basic drawing of elementary objects and lines working
[lttv.git] / ltt / branches / poly / lttv / modules / guiControlFlow / Drawing.c
index 0210b7136160d3fbfaf297d81e80172b57d677b5..8224030669a0f2a69cd8394bdc39a68576d0f85e 100644 (file)
@@ -36,36 +36,204 @@ struct _Drawing_t {
 
 };
 
+void test_draw(Drawing_t *Drawing)
+{
+       GdkRectangle update_rect;
+//     GdkColor color = { 0, 65535, 65535, 65535 };
 
-Drawing_t *Drawing_construct(void)
+//     gdk_colormap_alloc_color(gdk_rgb_get_cmap(), &color, 0, 1);
+       
+//     GdkGC *gc = 
+//             Drawing->Drawing_Area_V->
+//             style->fg_gc[GTK_WIDGET_STATE (Drawing->Drawing_Area_V)];
+//     gdk_gc_set_foreground(gc, &color);
+       update_rect.x = 50;
+       update_rect.y = 50;
+       update_rect.width = 1000;
+       update_rect.height = 1000;
+       gdk_draw_rectangle (Drawing->Pixmap,
+                     Drawing->Drawing_Area_V->style->black_gc,
+                     TRUE,
+                     50, 50,
+                     1000,
+                     1000);
+
+
+       //Drawing_draw_line(Drawing, 10, 10, 50, 10,
+       //              Drawing->Drawing_Area_V->style->black_gc);
+       gtk_widget_draw (Drawing->Drawing_Area_V, &update_rect);
+       
+//     Drawing_Refresh( Drawing, 0, 0, 30, 30);
+}
+
+void Drawing_Data_Request(Drawing_t *Drawing,
+                       GdkPixmap *Pixmap,
+                       gint x, gint y,
+                       gint width,
+                       gint height)
+{
+  gdk_draw_rectangle (Pixmap,
+                     Drawing->Drawing_Area_V->style->white_gc,
+                     TRUE,
+                     x, y,
+                     width,    // do not overlap
+                     height);
+
+  Drawing_draw_line(Drawing, Pixmap, 10, 10, 50, 10,
+                       Drawing->Drawing_Area_V->style->black_gc);
+
+}
+                     
+/* Callbacks */
+
+
+/* Create a new backing pixmap of the appropriate size */
+static gboolean
+configure_event( GtkWidget *widget, GdkEventConfigure *event, 
+               gpointer user_data)
 {
+  Drawing_t *Drawing = (Drawing_t*)user_data;
 
+  GdkPixmap *Pixmap = gdk_pixmap_new(widget->window,
+                         widget->allocation.width,
+                         widget->allocation.height,
+                         -1);
+       
+  if(Drawing->Pixmap == NULL)
+  {
+       Drawing->Pixmap = gdk_pixmap_new(widget->window,
+                               widget->allocation.width,
+                               widget->allocation.height,
+                               -1);
+       Drawing->width = widget->allocation.width;
+       Drawing->height = widget->allocation.height;
+
+       /* Initial data request */
+       Drawing_Data_Request(Drawing, Drawing->Pixmap, 0, 0,
+                       widget->allocation.width,
+                       widget->allocation.height);
+
+  }
+//  /* Draw empty background */ 
+//  gdk_draw_rectangle (Pixmap,
+//                   widget->style->black_gc,
+//                   TRUE,
+//                   0, 0,
+//                   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);
+
+   /* Request data for missing space */
+   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);
+
+//    gdk_draw_rectangle (Pixmap,
+//                   widget->style->white_gc,
+//                   TRUE,
+//                   0, Drawing->height,
+//                   Drawing->width,   // do not overlap
+//                   widget->allocation.height -
+//                                     Drawing->height);
+
+  
+  g_critical("drawing configure event");
+
+  
+  if (Drawing->Pixmap)
+    gdk_pixmap_unref(Drawing->Pixmap);
+
+  Drawing->Pixmap = Pixmap;
+  Drawing->width = widget->allocation.width;
+  Drawing->height = widget->allocation.height;
+
+  return TRUE;
+}
+
+
+/* Redraw the screen from the backing pixmap */
+static gboolean
+expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
+{
+  Drawing_t *Drawing = (Drawing_t*)user_data;
+  g_critical("drawing expose event");
+
+  gdk_draw_pixmap(widget->window,
+                 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
+                 Drawing->Pixmap,
+                 event->area.x, event->area.y,
+                 event->area.x, event->area.y,
+                 event->area.width, event->area.height);
+
+  return FALSE;
+}
+
+Drawing_t *Drawing_construct(void)
+{
        Drawing_t *Drawing = g_new(Drawing_t, 1);
                
        Drawing->Drawing_Area_V = gtk_drawing_area_new ();
-
+       
+       //gtk_widget_set_size_request(Drawing->Drawing_Area_V->window, 50, 50);
        g_object_set_data_full(
                        G_OBJECT(Drawing->Drawing_Area_V),
                        "Link_Drawing_Data",
                        Drawing,
                        (GDestroyNotify)Drawing_destroy);
 
-       gtk_widget_modify_bg(   Drawing->Drawing_Area_V,
-                               GTK_STATE_NORMAL,
-                               &CF_Colors[BLACK]);
-       
-       gdk_window_get_geometry(Drawing->Drawing_Area_V->window,
-                       NULL, NULL,
-                       &(Drawing->width),
-                       &(Drawing->height),
-                       &(Drawing->depth));
-       
-       Drawing->Pixmap = gdk_pixmap_new(
-                       Drawing->Drawing_Area_V->window,
-                       Drawing->width,
-                       Drawing->height,
-                       Drawing->depth);
-                       
+       //gtk_widget_modify_bg( Drawing->Drawing_Area_V,
+       //                      GTK_STATE_NORMAL,
+       //                      &CF_Colors[BLACK]);
+       
+       //gdk_window_get_geometry(Drawing->Drawing_Area_V->window,
+       //              NULL, NULL,
+       //              &(Drawing->width),
+       //              &(Drawing->height),
+       //              -1);
+       
+       //Drawing->Pixmap = gdk_pixmap_new(
+       //              Drawing->Drawing_Area_V->window,
+       //              Drawing->width,
+       //              Drawing->height,
+       //              Drawing->depth);
+       
+       Drawing->Pixmap = NULL;
+
+//     Drawing->Pixmap = gdk_pixmap_new(Drawing->Drawing_Area_V->window,
+//                       Drawing->Drawing_Area_V->allocation.width,
+//                       Drawing->Drawing_Area_V->allocation.height,
+//                       -1);
+
+
+       g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V),
+                               "configure_event",
+                               G_CALLBACK (configure_event),
+                               (gpointer)Drawing);
+       
+       g_signal_connect (G_OBJECT(Drawing->Drawing_Area_V),
+                               "expose_event",
+                               G_CALLBACK (expose_event),
+                               (gpointer)Drawing);
+
        return Drawing;
 }
 
@@ -132,6 +300,33 @@ void convert_time_to_pixels(
        
 }
 
+void Drawing_Refresh ( Drawing_t *Drawing,
+                       guint x, guint y,
+                       guint width, guint height)
+{
+       gdk_draw_drawable(
+               Drawing->Drawing_Area_V->window,
+               Drawing->Drawing_Area_V->
+                style->fg_gc[GTK_WIDGET_STATE (Drawing->Drawing_Area_V)],
+               GDK_DRAWABLE(Drawing->Pixmap),
+               x, y,
+               x, y,
+               width, height);
+}
+
+
+void Drawing_draw_line(        Drawing_t *Drawing,
+                       GdkPixmap *Pixmap,
+                       guint x1, guint y1,
+                       guint x2, guint y2,
+                       GdkGC *GC)
+{
+       gdk_draw_line (Pixmap,
+                       GC,
+                       x1, y1, x2, y2);
+}
+
+
 
 
 void Drawing_Resize(Drawing_t *Drawing, guint h, guint w)
@@ -145,3 +340,5 @@ void Drawing_Resize(Drawing_t *Drawing, guint h, guint w)
        
        
 }
+
+
This page took 0.026206 seconds and 4 git commands to generate.