Yann Leboulanger wrote: > 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? > No idea about that? -- Yann _______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list