ardour-button-ize zoom buttons; move MIDI panic button to transport bar
[ardour.git] / gtk2_ardour / cairo_widget.cc
index 11fcfdffd6997ce9e5bdecee06ac4d76e20d40fd..5f83cb80d5023275942a3311a7e4c2d5d90af101 100644 (file)
 CairoWidget::CairoWidget ()
        : _width (1)
        , _height (1)
-       , _state (CairoWidget::State (0))
-       , _dirty (true)
-       , _pixmap (0)
-         
+       , _active_state (Gtkmm2ext::ActiveState (0))
+       , _visual_state (Gtkmm2ext::VisualState (0))
 {
 
 }
 
 CairoWidget::~CairoWidget ()
 {
-       if (_pixmap) {
-               g_object_unref (_pixmap);
-       }
 }
 
 bool
-CairoWidget::on_expose_event (GdkEventExpose *event)
+CairoWidget::on_expose_event (GdkEventExpose *ev)
 {
-       Gdk::Rectangle const exposure (
-               event->area.x, event->area.y, event->area.width, event->area.height
-               );
-
-       Gdk::Rectangle r = exposure;
-       Gdk::Rectangle content (0, 0, _width, _height);
-       bool intersects;
-       r.intersect (content, intersects);
-
-       if (intersects) {
-
-               GdkDrawable* drawable = get_window()->gobj ();
-
-               if (_dirty) {
-
-                       if (_pixmap) {
-                               g_object_unref (_pixmap);
-                       }
-
-                       _pixmap = gdk_pixmap_new (drawable, _width, _height, -1);
-
-                       cairo_t* cr = gdk_cairo_create (_pixmap);
-                       render (cr);
-                       cairo_destroy (cr);
-
-                       _dirty = false;
-               }
-
-               gdk_draw_drawable (
-                       drawable,
-                       get_style()->get_fg_gc (Gtk::STATE_NORMAL)->gobj(),
-                       _pixmap,
-                       r.get_x(),
-                       r.get_y(),
-                       r.get_x(),
-                       r.get_y(),
-                       r.get_width(),
-                       r.get_height()
-                       );
-       }
+       cairo_t* cr = gdk_cairo_create (get_window ()->gobj());
+       cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+       cairo_clip (cr);
+       render (cr);
+       cairo_destroy (cr);
 
        return true;
 }
@@ -92,9 +52,7 @@ CairoWidget::on_expose_event (GdkEventExpose *event)
 void
 CairoWidget::set_dirty ()
 {
-       ENSURE_GUI_THREAD (*this, &CairoWidget::set_dirty)
-
-       _dirty = true;
+       ENSURE_GUI_THREAD (*this, &CairoWidget::set_dirty);
        queue_draw ();
 }
 
@@ -131,17 +89,35 @@ CairoWidget::get_parent_bg ()
 }
 
 void
-CairoWidget::set_state (CairoWidget::State s, bool yn)
+CairoWidget::set_active_state (Gtkmm2ext::ActiveState s)
 {
-       if (yn) {
-               if (!(_state & s)) {
-                       _state = CairoWidget::State (_state|s);
-                       StateChanged ();
-               }
+       if (_active_state != s) {
+               _active_state = s;
+               StateChanged ();
+       }
+}
+
+void
+CairoWidget::set_visual_state (Gtkmm2ext::VisualState s)
+{
+       if (_visual_state != s) {
+               _visual_state = s;
+               StateChanged ();
+       }
+}
+
+void
+CairoWidget::on_state_changed (Gtk::StateType)
+{
+       /* this will catch GTK-level state changes from calls like
+          ::set_sensitive() 
+       */
+
+       if (get_state() == Gtk::STATE_INSENSITIVE) {
+               set_visual_state (Gtkmm2ext::VisualState (visual_state() | Gtkmm2ext::Insensitive));
        } else {
-               if (_state & s) {
-                       _state = CairoWidget::State (_state & ~s);
-                       StateChanged ();
-               }
+               set_visual_state (Gtkmm2ext::VisualState (visual_state() & ~Gtkmm2ext::Insensitive));
        }
+
+       queue_draw ();
 }