X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fgtkmm2ext%2Fgtkmm2ext%2Fcairo_widget.h;h=b6b4ccd83e0c7e2626928e3d755ea42110146c8c;hb=ee541036b40327854b445c631c318d79d5c93b07;hp=596b695da609a1323aca2238a66cd908c0eaea38;hpb=15471ca7dd23cd84185e493efb6da4b9958cda0f;p=ardour.git diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h index 596b695da6..b6b4ccd83e 100644 --- a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h +++ b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h @@ -20,6 +20,7 @@ #ifndef __gtk2_ardour_cairo_widget_h__ #define __gtk2_ardour_cairo_widget_h__ +#include #include #include "gtkmm2ext/visibility.h" @@ -38,11 +39,11 @@ public: Gtkmm2ext::ActiveState active_state() const { return _active_state; } Gtkmm2ext::VisualState visual_state() const { return _visual_state; } - - /* derived widgets can override these two to catch + + /* derived widgets can override these two to catch changes in active & visual state */ - + virtual void set_active_state (Gtkmm2ext::ActiveState); virtual void set_visual_state (Gtkmm2ext::VisualState); @@ -67,17 +68,64 @@ public: static void provide_background_for_cairo_widget (Gtk::Widget& w, const Gdk::Color& bg); + virtual void render (cairo_t *, cairo_rectangle_t*) = 0; + + static void set_flat_buttons (bool yn); + static bool flat_buttons() { return _flat_buttons; } + + static void set_widget_prelight (bool yn); + static bool widget_prelight() { return _widget_prelight; } + + static void set_source_rgb_a( cairo_t* cr, Gdk::Color, float a=1.0 ); + + /* set_focus_handler() will cause all button-press events on any + CairoWidget to invoke this slot/functor/function/method/callback. + + We do this because in general, CairoWidgets do not grab + keyboard focus, but a button press on them should + clear focus from any active text entry. + + This is global to all CairoWidgets and derived types. + + However, derived types can override the behaviour by defining their + own on_button_press_event() handler which returns true under all + conditions (which will block this handler from being called). If + they wish to invoke any existing focus handler from their own + button press handler, they can just use: focus_handler(); + */ + static void set_focus_handler (sigc::slot); + protected: /** Render the widget to the given Cairo context */ - virtual void render (cairo_t *) = 0; virtual bool on_expose_event (GdkEventExpose *); void on_size_allocate (Gtk::Allocation &); void on_state_changed (Gtk::StateType); + void on_style_changed (const Glib::RefPtr&); + bool on_button_press_event (GdkEventButton*); Gdk::Color get_parent_bg (); + /* this is an additional virtual "on_..." method. Glibmm does not + provide a direct signal for name changes, so this acts as a proxy. + */ + + virtual void on_name_changed () {}; + Gtkmm2ext::ActiveState _active_state; Gtkmm2ext::VisualState _visual_state; bool _need_bg; + + static bool _flat_buttons; + static bool _widget_prelight; + bool _grabbed; + + static sigc::slot focus_handler; + + private: + Cairo::RefPtr image_surface; + Glib::SignalProxyProperty _name_proxy; + sigc::connection _parent_style_change; + Widget * _current_parent; + }; #endif