diff --git a/libs/gtkmm2ext/cairo_widget.cc b/libs/gtkmm2ext/cairo_widget.cc index 16e7f29b5f..03c23000a2 100644 --- a/libs/gtkmm2ext/cairo_widget.cc +++ b/libs/gtkmm2ext/cairo_widget.cc @@ -26,6 +26,9 @@ static const char* has_cairo_widget_background_info = "has_cairo_widget_backgrou bool CairoWidget::_flat_buttons = false; +static void noop() { } +sigc::slot CairoWidget::focus_handler (sigc::ptr_fun (noop)); + 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 (); @@ -51,6 +54,13 @@ CairoWidget::~CairoWidget () if (_parent_style_change) _parent_style_change.disconnect(); } +bool +CairoWidget::on_button_press_event (GdkEventButton*) +{ + focus_handler(); + return false; +} + bool CairoWidget::on_expose_event (GdkEventExpose *ev) { @@ -220,3 +230,9 @@ CairoWidget::set_flat_buttons (bool yn) { _flat_buttons = yn; } + +void +CairoWidget::set_focus_handler (sigc::slot s) +{ + focus_handler = s; +} diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h index 2e845b94eb..87002101bd 100644 --- a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h +++ b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h @@ -74,12 +74,30 @@ public: 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 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 @@ -95,10 +113,13 @@ protected: static bool _flat_buttons; bool _grabbed; + static sigc::slot focus_handler; + private: Glib::SignalProxyProperty _name_proxy; sigc::connection _parent_style_change; Widget * _current_parent; + }; #endif