Ken Resander wrote: > Odd, you seem to be getting 0 for both the Ctrl key and letter-C key. > > If the keyboard works and you can use it for other applications, then keypresscallback > really should return non-zero character code values. > > I don't know pygtk, but if there are other keyboard input calls like sscanf in C, then experiment with these and see what you get. > > If you know C/C++ and GCC you could try the following to inspect the keyvals: > > // main.cpp > #include <gtk/gtk.h> > #include <gdk/gdkkeysyms.h> > > static gboolean keypresscallback ( GtkWidget * w, > GdkEventKey *event, > char * data ) > { > printf ( " key PRESS val=%x state=%x\n" , event->keyval , event->state ) ; > return false; > } > > int main ( int argc , char * argv[] ) > { > gtk_init(&argc, &argv); > > GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL); > gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); > gtk_window_set_default_size(GTK_WINDOW(window), 300 , 200); > gtk_window_set_title(GTK_WINDOW(window), "Test Window"); > > gtk_widget_add_events (window, GDK_KEY_PRESS_MASK ); > g_signal_connect ( window, "key-press-event", > G_CALLBACK (keypresscallback), NULL ) ; > gtk_widget_show_all(window); > > gtk_main(); > } > > Also, could you use another standard western-european keyboard to see if it behaves differently? I cannot test myself, I don't have a russian keyboard, but I asked someone to test, and here is the result: with latin layout, ctrl+C returns: key PRESS val=ffe3 state=0 <-- Ctrl key PRESS val=63 state=4 <-- Ctrl+C and in russian layout: key PRESS val=ffe3 state=2000 key PRESS val=6d3 state=2004 0x6d3 is GDK_Cyrillic_es I did some tests with a russian user, and here are some results: print gtk.accelerator_parse("<Control>C") shows: (99, <flags GDK_CONTROL_MASK of type GdkModifierType>) with both layouts. Bur when we pass that to gtk.AccelGroup().connect_group(), it works so GTK is able to understand that 0x6d3 is the same as 0x63. If only I knew how GTK does!!? Any idea? Some GTK developper to answer this question? If we put that in the key_pressed handler: print gtk.gdk.keymap_get_default().translate_keyboard_state(event.hardware_keycode, event.state, event.group) it prints: latin layout: (99, 0, 0, <flags GDK_SHIFT_MASK | GDK_LOCK_MASK | GDK_MOD5_MASK of type GdkModifierType>) russian layout: (1747, 1, 0, <flags GDK_SHIFT_MASK | GDK_LOCK_MASK | GDK_MOD5_MASK of type GdkModifierType>) we found that this works: def key_press_event_handler(widget, event): keymap = gtk.gdk.keymap_get_default() # Get keycode for the pressed key keycode, group, level = keymap.get_entries_for_keyval(event.keyval)[0] # Get keycode for the C key keycodec, group, level = keymap.get_entries_for_keyval(gtk.keysyms.c)[0] if keycode == keycodec: print 'CTRL+C !!' This works, but I don't think it's a very nice solution. If I understand correctly in this case we compare which plastic key is pressed, and which plasic key raises a C, and we compare both. It will work with letters because I don't think there is a keyboard with 2 keys that will raise a C, but that won't work with numbers I think. Do you have a better idea? -- Yann _______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list