OSC: Catch new strips, gone strips and redo banks and observers. Add more select...
[ardour.git] / libs / gtkmm2ext / cairo_widget.cc
index aa8f883a7d979b808958155f02edc30c60998388..fe93f1eb7cc384dc72f9f72c95332b1f3ab288bc 100644 (file)
@@ -30,15 +30,14 @@ static const char* has_cairo_widget_background_info = "has_cairo_widget_backgrou
 bool CairoWidget::_flat_buttons = false;
 bool CairoWidget::_widget_prelight = true;
 
-static void noop() { }
-sigc::slot<void> CairoWidget::focus_handler (sigc::ptr_fun (noop));
+sigc::slot<void,Gtk::Widget*> CairoWidget::focus_handler;
 
 void CairoWidget::set_source_rgb_a( cairo_t* cr, Gdk::Color col, float a)  //ToDo:  this one and the Canvas version should be in a shared file (?)
 {
        float r = col.get_red_p ();
        float g = col.get_green_p ();
        float b = col.get_blue_p ();
-       
+
        cairo_set_source_rgba(cr, r, g, b, a);
 }
 
@@ -61,7 +60,7 @@ CairoWidget::~CairoWidget ()
 bool
 CairoWidget::on_button_press_event (GdkEventButton*)
 {
-       focus_handler();
+       focus_handler (this);
        return false;
 }
 
@@ -139,9 +138,9 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
                cairo_context->paint ();
        }
 #endif
-       
+
        Gtk::Widget* child = get_child ();
-       
+
        if (child) {
                propagate_expose (*child, ev);
        }
@@ -183,15 +182,21 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
 #endif
 
        cr->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
-       cr->clip_preserve ();
 
-       /* paint expose area the color of the parent window bg
-       */
-       
-       Gdk::Color bg (get_parent_bg());
-       
-       cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
-       cr->fill ();
+       if (_need_bg) {
+               cr->clip_preserve ();
+
+               /* paint expose area the color of the parent window bg
+                */
+
+               Gdk::Color bg (get_parent_bg());
+
+               cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
+               cr->fill ();
+       } else {
+               std::cerr << get_name() << " skipped bg fill\n";
+               cr->clip ();
+       }
 
        cairo_rectangle_t expose_area;
        expose_area.x = ev->area.x;
@@ -219,7 +224,7 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
 #ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
        }
 #endif
-       
+
        return true;
 }
 
@@ -230,10 +235,14 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
  */
 
 void
-CairoWidget::set_dirty ()
+CairoWidget::set_dirty (cairo_rectangle_t *area)
 {
        ENSURE_GUI_THREAD (*this, &CairoWidget::set_dirty);
-       queue_draw ();
+       if (!area) {
+               queue_draw ();
+       } else {
+               queue_draw_area (area->x, area->y, area->width, area->height);
+       }
 }
 
 /** Handle a size allocation.
@@ -384,7 +393,7 @@ CairoWidget::set_widget_prelight (bool yn)
 }
 
 void
-CairoWidget::set_focus_handler (sigc::slot<void> s)
+CairoWidget::set_focus_handler (sigc::slot<void,Gtk::Widget*> s)
 {
        focus_handler = s;
 }