diff options
author | Robin Gareus <robin@gareus.org> | 2016-12-19 13:36:42 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-12-19 13:36:42 +0100 |
commit | 004431426dd3b868f8b6fda814e03b7d5da06680 (patch) | |
tree | 921fe5fb975a02f096bbb55421f9c947e5442ed9 /libs | |
parent | 218d3761544a84eb55e13de32ebc402ff66c7933 (diff) |
Towards packing CairoWidgets on ArdourCanvas.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/canvas/canvas/widget.h | 2 | ||||
-rw-r--r-- | libs/canvas/widget.cc | 22 | ||||
-rw-r--r-- | libs/gtkmm2ext/cairo_widget.cc | 77 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/cairo_widget.h | 13 |
4 files changed, 111 insertions, 3 deletions
diff --git a/libs/canvas/canvas/widget.h b/libs/canvas/canvas/widget.h index 127862037c..c1f6dc1f36 100644 --- a/libs/canvas/canvas/widget.h +++ b/libs/canvas/canvas/widget.h @@ -44,6 +44,8 @@ public: private: CairoWidget& _widget; bool event_proxy (GdkEvent*); + bool queue_draw (); + bool queue_resize (); }; } diff --git a/libs/canvas/widget.cc b/libs/canvas/widget.cc index 25541c1660..7293badb7c 100644 --- a/libs/canvas/widget.cc +++ b/libs/canvas/widget.cc @@ -34,6 +34,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 +44,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,6 +56,22 @@ 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 { diff --git a/libs/gtkmm2ext/cairo_widget.cc b/libs/gtkmm2ext/cairo_widget.cc index 8349a685fa..229ffe8d31 100644 --- a/libs/gtkmm2ext/cairo_widget.cc +++ b/libs/gtkmm2ext/cairo_widget.cc @@ -48,15 +48,57 @@ CairoWidget::CairoWidget () , _grabbed (false) , _name_proxy (this, X_("name")) , _current_parent (0) + , _canvas_widget (false) { _name_proxy.connect (sigc::mem_fun (*this, &CairoWidget::on_name_changed)); } CairoWidget::~CairoWidget () { + if (_canvas_widget) { + gtk_widget_set_realized (GTK_WIDGET(gobj()), false); + } if (_parent_style_change) _parent_style_change.disconnect(); } +void +CairoWidget::set_canvas_widget () +{ + assert (!_canvas_widget); + ensure_style (); + gtk_widget_set_realized (GTK_WIDGET(gobj()), true); + _canvas_widget = true; +} + +int +CairoWidget::get_width () const +{ + if (_canvas_widget) { + return _allocation.get_width (); + } + return Gtk::EventBox::get_width (); +} + +int +CairoWidget::get_height () const +{ + if (_canvas_widget) { + return _allocation.get_height (); + } + return Gtk::EventBox::get_height (); +} + +void +CairoWidget::size_allocate (Gtk::Allocation& alloc) +{ + if (_canvas_widget) { + memcpy (&_allocation, &alloc, sizeof(Gtk::Allocation)); + return; + } + Gtk::EventBox::size_allocate (alloc); +} + + bool CairoWidget::on_button_press_event (GdkEventButton*) { @@ -241,17 +283,43 @@ CairoWidget::set_dirty (cairo_rectangle_t *area) if (!area) { queue_draw (); } else { + // TODO emit QueueDrawArea -> ArdourCanvas::Widget + if (QueueDraw ()) { + return; + } queue_draw_area (area->x, area->y, area->width, area->height); } } +void +CairoWidget::queue_draw () +{ + if (QueueDraw ()) { + return; + } + Gtk::EventBox::queue_draw (); +} + +void +CairoWidget::queue_resize () +{ + if (QueueResize ()) { + return; + } + Gtk::EventBox::queue_resize (); +} + /** Handle a size allocation. * @param alloc GTK allocation. */ void CairoWidget::on_size_allocate (Gtk::Allocation& alloc) { - Gtk::EventBox::on_size_allocate (alloc); + if (!_canvas_widget) { + Gtk::EventBox::on_size_allocate (alloc); + } else { + memcpy (&_allocation, &alloc, sizeof(Gtk::Allocation)); + } #ifdef OPTIONAL_CAIRO_IMAGE_SURFACE if (getenv("ARDOUR_IMAGE_SURFACE")) { @@ -263,6 +331,9 @@ CairoWidget::on_size_allocate (Gtk::Allocation& alloc) } #endif + if (_canvas_widget) { + return; + } set_dirty (); } @@ -340,7 +411,7 @@ CairoWidget::set_active (bool yn) void CairoWidget::on_style_changed (const Glib::RefPtr<Gtk::Style>&) { - queue_draw(); + set_dirty (); } void @@ -356,7 +427,7 @@ CairoWidget::on_state_changed (Gtk::StateType) set_visual_state (Gtkmm2ext::VisualState (visual_state() & ~Gtkmm2ext::Insensitive)); } - queue_draw (); + set_dirty (); } void diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h index 2588adcdcc..03afc48818 100644 --- a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h +++ b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h @@ -35,6 +35,15 @@ public: CairoWidget (); virtual ~CairoWidget (); + void set_canvas_widget (); + + /* swizzle Gtk::Widget methods for Canvas::Widget */ + void queue_draw (); + void queue_resize (); + int get_width () const; + int get_height () const; + void size_allocate (Gtk::Allocation&); + void set_dirty (cairo_rectangle_t *area = 0); Gtkmm2ext::ActiveState active_state() const { return _active_state; } @@ -65,6 +74,8 @@ public: void set_draw_background (bool yn); sigc::signal<void> StateChanged; + sigc::signal<bool> QueueDraw; + sigc::signal<bool> QueueResize; static void provide_background_for_cairo_widget (Gtk::Widget& w, const Gdk::Color& bg); @@ -125,6 +136,8 @@ protected: Glib::SignalProxyProperty _name_proxy; sigc::connection _parent_style_change; Widget * _current_parent; + bool _canvas_widget; + Gdk::Rectangle _allocation; }; |