Re: how to get key press event in goocanvasmm

Kjell Ahlstedt via gtkmm-list <[email protected]>
Newsgroups gmane.comp.gnome.gtkmm
Message-ID <[email protected]>
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
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.