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
On 2020-02-14 18:51, Klaus Rudolph wrote:
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;
}
_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list