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

Reply via email to