Strange behaviour of key-event handler.



Sorry about this. I'm having a problem receiving key-press and key-release
events from a drawing_area in a program I'm writing. I hope this isn't a
FAQ (I *have* read the FAQ, but see no mention of it). I also read the
source of gtktext (because it handles key-events) but got no joy there either
apart from the general impression that I'm "doing roughly the right thing".

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

In 'main()' I create a drawing_area, connect signals to it and set the mask
as follows:

	drawing_area = gtk_drawing_area_new ();
	gtk_widget_show (drawing_area);
	
	gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
				(GtkSignalFunc) expose_event, NULL);
	gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event",
				(GtkSignalFunc) configure_event, NULL);
	gtk_signal_connect (GTK_OBJECT (drawing_area), "key_press_event",
				(GtkSignalFunc) keyevent_callback, NULL);
	gtk_signal_connect (GTK_OBJECT (drawing_area), "key_release_event",
				(GtkSignalFunc) keyevent_callback, NULL);
		
	/* Unmask the signals */
	gtk_widget_set_events (drawing_area, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_EXPOSURE_MASK);

	/* Catch focus */
	GTK_WIDGET_SET_FLAGS(drawing_area, GTK_CAN_FOCUS);
	gtk_window_set_focus (GTK_WINDOW(window), drawing_area);


I have earlier defined a signal-processing routine 'keyevent_callback' as
follows:


static void
keyevent_callback(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
	long		r;
	SpriteObj	*sp = NULL;

	printf("State: 0x%X Keyval: 0x%X, Type = 0x%X\n",
			event->state,
			event->keyval,
			event->type
	);
	
	if (event->type == GDK_KEY_RELEASE) {
		gtk_grab_remove (widget);
		return;
	}

	gtk_grab_add (widget);
	
	switch (event->keyval) {
	case GDK_Left:
		if (event->type == GDK_KEY_PRESS) {
			etc etc


The symptoms are that the key-press events are seen, but the key-release events
*usually* are not seen (!). As you can see, I print out on stdout whenever a
key-event of either sort is seen. Occasionally I do get to see a key-release
event but they are very rare.

Better yet, once I press one of the GDK_Left/Down/Up/etc navigation keys, I
never again see an event when one of the ordinary alphanumeric keys is pressed!
I *do* continue to see events for the navigation keys though (keyval has values
of the form 0xFF??).

I am using GTK+ 1.2.3 from an RPM packaged by Ryan Weaver of 'Falsehope Custom
RPMs' (in case that's any clue).

Please tell me what I've done wrong here!
Many thanks in advance for any help.



--

Steve                                       | Steve's law of House Rewiring:
S.Hosgood@swansea.ac.uk                     | "No matter how many power sockets
Phone: +44 1792 297292 + ask for Steve      |  you fit in a room, you will run
Fax:   +44 1792 295811                      |  out within the first week of use
--------------------------------------------+  even if you took Steve's law of
http://iiit.swan.ac.uk/~iisteve/steve.html  |  House Rewiring into account"




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