I don't know anything about goocanvasmm, but I
know a lot about gtkmm and glibmm. As far as I can see your
on_key_press_event() should be called, provided that m_canvas
has the keyboard focus. If a child of m_canvas has the keyboard
focus, on_key_press_event() should be called if the child does
not handle the signal. If the child handles the signal, and
returns true from its signal handler, there's no hope
for you.
You can read about event signals in the gtkmm tutorial, https://developer.gnome.org/gtkmm-tutorial/stable/chapter-keyboardevents.html.en and https://developer.gnome.org/gtkmm-tutorial/stable/sec-xeventsignals.html.en
If on_key_press_event()
is not called there's another possibility. Instead of
overriding the default signal handler, connect another signal
handler. (It won't do any difference if one of m_canvas's
children handles the signal.)
bool on_canvas_key_press_event(GdkEventKey*
event)
{ ....... }
MyCanvas()
{
signal_key_press_event().connect(sigc::mem_fun(*this,
&MyCanvas::on_canvas_key_press_event),
false);
}
Note false in connect().
I recommend that you replace
Gtk::Main by Gtk::Application, unless you use a very old
version of gtkmm. Gtk::Main has been deprecated since 2012.
/Kjell
Is it possible to receive key press events in canvas? The following signal handler is not called inside goocanvas. It compiles fine but it is not called if a key is pressed. Exmaple: Glib::RefPtr<Goocanvas::Item> root; class MyCanvas: public Goocanvas::Canvas { double scale = 1; bool on_key_press_event( GdkEventKey* event ) override { std::cout << "on_key_press_event" << std::endl; return true; } }; int main(int argc, char* argv[]) { Gtk::Main app(&argc, &argv); Goocanvas::init("example", "0.1", argc, argv); Gtk::Window win; MyCanvas m_canvas; m_canvas.set_size_request(640, 480); m_canvas.set_bounds(0, 0, 800, 800); root = m_canvas.get_root_item(); //-------------------------------- Glib::RefPtr<Goocanvas::Ellipse> outer = Goocanvas::Ellipse::create( 100,100,20,20); outer->property_line_width() = 5; outer->property_stroke_color() = "red"; outer->property_fill_color()="blue"; root->add_child( outer ); win.add( m_canvas); win.show_all_children(); Gtk::Main::run(win); return 0; }