Re: detect ctrl+c in key_press_event handler



Hi Yann,

I cannot think of anything else.

If all Russian keyboards are like the one tried, then just change the documentation in Russian to Ctrl+Cyrillic_es instead of Ctrl+C used on keyboards that have a key marked 'C'. After all it works.

Ken




--- On Sun, 7/2/10, Yann Leboulanger <asterix lagaule org> wrote:

From: Yann Leboulanger <asterix lagaule org>
Subject: Re: detect ctrl+c in key_press_event handler
To: gtk-list gnome org
Date: Sunday, 7 February, 2010, 5:36 AM

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 gnome org
http://mail.gnome.org/mailman/listinfo/gtk-list


New Email names for you!
Get the Email name you've always wanted on the new @ymail and @rocketmail.
Hurry before someone else does!

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