amend ab3889ff: portaudio backend uses a vector for connections
[ardour.git] / libs / canvas / widget.cc
index 17d0d29e59ff78e843ee0408ea2abd9903d5dcd6..0f49554a42448738e1db828e350eb77e71b40182 100644 (file)
@@ -24,7 +24,6 @@
 #include "canvas/canvas.h"
 #include "canvas/widget.h"
 #include "canvas/debug.h"
-#include "canvas/utils.h"
 
 using namespace std;
 using namespace ArdourCanvas;
@@ -34,6 +33,9 @@ Widget::Widget (Canvas* c, CairoWidget& w)
        , _widget (w)
 {
        Event.connect (sigc::mem_fun (*this, &Widget::event_proxy));
+       w.set_canvas_widget ();
+       w.QueueDraw.connect (sigc::mem_fun(*this, &Widget::queue_draw));
+       w.QueueResize.connect (sigc::mem_fun(*this, &Widget::queue_resize));
 }
 
 Widget::Widget (Item* parent, CairoWidget& w)
@@ -41,6 +43,9 @@ Widget::Widget (Item* parent, CairoWidget& w)
        , _widget (w)
 {
        Event.connect (sigc::mem_fun (*this, &Widget::event_proxy));
+       w.set_canvas_widget ();
+       w.QueueDraw.connect (sigc::mem_fun(*this, &Widget::queue_draw));
+       w.QueueResize.connect (sigc::mem_fun(*this, &Widget::queue_resize));
 }
 
 bool
@@ -50,48 +55,77 @@ Widget::event_proxy (GdkEvent* ev)
        return _widget.event (ev);
 }
 
+bool
+Widget::queue_draw ()
+{
+       begin_visual_change ();
+       end_visual_change ();
+       return true;
+}
+
+bool
+Widget::queue_resize ()
+{
+       begin_change ();
+       end_change ();
+       return true;
+}
+
 void
 Widget::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
 {
-       // std::cerr << "Render widget\n";
+       //std::cerr << "Render widget " << name << " @ " << position() << endl;
 
        if (!_bounding_box) {
                std::cerr << "no bbox\n";
                return;
        }
 
-       Rect self = item_to_window (_bounding_box.get());
-       boost::optional<Rect> r = self.intersection (area);
+       Rect self = item_to_window (_bounding_box);
+       Rect r = self.intersection (area);
 
        if (!r) {
                std::cerr << "no intersection\n";
                return;
        }
 
-       Rect draw = r.get ();
+       Rect draw = r;
        cairo_rectangle_t crect;
        crect.x = draw.x0;
        crect.y = draw.y0;
        crect.height = draw.height();
        crect.width = draw.width();
 
-       // std::cerr << "will draw " << draw << "\n";
+       Duple p = position_offset();
+
        context->save ();
-       context->translate (-draw.x0, -draw.y0);
+       context->translate (p.x, p.y);
        //context->rectangle (draw.x0, draw.y0, draw.width(), draw.height());
-       // context->clip ();
+       //context->clip ();
 
-       _widget.render (context->cobj(), &crect);
+       _widget.render (context, &crect);
 
        context->restore ();
 }
 
+void
+Widget::size_allocate (Rect const & r)
+{
+       Item::size_allocate (r);
+       Gtk::Allocation alloc;
+       alloc.set_x (0);
+       alloc.set_y (0);
+       alloc.set_width (r.width());
+       alloc.set_height (r.height());
+       _widget.size_allocate (alloc);
+}
+
 void
 Widget::compute_bounding_box () const
 {
        std::cerr << "cbbox for widget\n";
 
-       GtkRequisition req;
+       GtkRequisition req = { 0, 0 };
        Gtk::Allocation alloc;
 
        _widget.size_request (req);
@@ -110,4 +144,3 @@ Widget::compute_bounding_box () const
 
        _bounding_box_dirty = false;
 }
-