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;
}
void
CairoWidget::set_dirty ()
{
- ENSURE_GUI_THREAD (*this, &CairoWidget::set_dirty)
-
- _dirty = true;
+ ENSURE_GUI_THREAD (*this, &CairoWidget::set_dirty);
queue_draw ();
}
}
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 ();
}