Re: GTK drawing area cannot get keyboard events



On Sat, Sep 08, 2007 at 02:21:11PM -0700, Tom Trebisky wrote:

I have spent a couple of half-days trying to get keyboard events from a
GTK drawing area with no luck,
      gtk_widget_add_events ( GTK_WIDGET(da), GDK_FOCUS_CHANGE );

On Sat, Sep 08, 2007 at 11:51:38PM +0200, David Ne?as (Yeti) wrote:

And this is the bug.  GDK_FOCUS_CHANGE is not an event mask
(i.e. GdkEventMask value), it's an event type (i.e.
GdkEventType valye).  It should be GDK_FOCUS_CHANGE_MASK.

Thank you Yeti, for your help.  Perhaps apart from commenting on
the problem and code that follows, you might direct me to the best
resources on understanding GTK in its current form.  In an attempt to
get up to date with GTK, I am busy reading various documents at

        http://library.gnome.org/devel/gtk/unstable/index.html

but perhaps you have better suggestions.

In fact, perhaps there is a better approach than using a GTK Drawing Area
to do what I do.   I really just need a canvas within which to tile
a bunch of JPG images (that comprise a topographic map).  Here is
what I am doing:

1) I use GdkPixbufLoader to read files and put the images into pixbufs.
2) The pixbufs are then tiled into pixmaps.
3) A selected pixmap gets copied into the drawing area on an expose event.

All this works really well, but now I am frustrated adding new functionality
to the application.

--------------------------------

All that aside, here is where I am with regard to getting keyboard
events from a drawing area in my application; I get:

GLib-GObject-WARNING **: gsignal.c:1669: signal `focus_event'
    is invalid for instance `0x684110'

The relevant code now looks like:

        mw = gtk_window_new ( GTK_WINDOW_TOPLEVEL );

        g_signal_connect ( mw, "delete_event",
                        G_CALLBACK(destroy_handler), NULL );

        da = gtk_drawing_area_new ();

        g_signal_connect ( da, "expose_event",
                        G_CALLBACK(expose_handler), NULL );
        g_signal_connect ( da, "configure_event",
                        G_CALLBACK(configure_handler), NULL );

        g_signal_connect ( da, "button_release_event",
                        G_CALLBACK(mouse_handler), NULL );
        gtk_widget_add_events ( GTK_WIDGET(da), GDK_BUTTON_RELEASE_MASK );
        gtk_widget_add_events ( GTK_WIDGET(da), GDK_BUTTON_PRESS_MASK );

        /* Now, try to work the magic to get keyboard events */
        GTK_WIDGET_SET_FLAGS ( da, GTK_CAN_FOCUS );
        gtk_widget_add_events ( GTK_WIDGET(da), GDK_FOCUS_CHANGE_MASK );
        g_signal_connect ( da, "focus_event",
            G_CALLBACK(focus_handler), NULL );

        gtk_widget_add_events ( GTK_WIDGET(da), GDK_KEY_PRESS_MASK );
        g_signal_connect ( da, "key_press_event",
            G _CALLBACK(keyboard_handler), NULL );



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]