13
0

add a focus handling callback so that all button press events on CairoWidgets will cause a focus reset.

This commit is contained in:
Paul Davis 2014-09-16 12:42:39 -04:00
parent 261aa3258f
commit 9be64f2648
2 changed files with 37 additions and 0 deletions

View File

@ -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<void> 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<void> s)
{
focus_handler = s;
}

View File

@ -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<void>);
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<Gtk::Style>&);
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<void> focus_handler;
private:
Glib::SignalProxyProperty _name_proxy;
sigc::connection _parent_style_change;
Widget * _current_parent;
};
#endif