GdkEventKey --> utf-8 ?




Hi all!

I searched the archives but surprisingly nobody had the
question that I have:

  How can I convert GdkEventKey::keyval into UTF-8 character?

My current solution is:

       boolean key_press_handler (GtkWidget *widget,
				  GdkEventKey *event,
                                           gpointer  data)  {


        char utf8string[10];
        guint32 unichar = gdk_keyval_to_unicode(event->keyval);
        int ll = g_unichar_to_utf8(unichar, utf8string);
        utf8string[ll] = '\0';

         .....


This works on many PCs. But one user wrote me he has problems
with non-ascii characters like äöüÄÖÜ (HTML: ä ö ü
Ä Ö Ü)

He gets aouAOU instead. I inserted some printf-s in the code above and
the result is:


    event->keyval = 111
    unichar = o(0x6f)
    utf8[0] = 0x6f

That is: gdk_keyval_to_unicode() supplies a bad Unicode. But note:
The user can write those characters in an Xterm --> all works.

And he can type those characters in an GtkEntry widget.
gtk_entry_get_text(GtkEntry *entry) returns the correct UTF-8
string.(?)

I asked him to start xev and to type an ö (HTML: ö)

The result is:

KeyPress event, serial 33, synthetic NO, window 0x5e00001,
    root 0xab, subw 0x0, time 1116582, (727,296), root:(728,365),
    state 0x0, keycode 0 (keysym 0xf6, odiaeresis), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 2 bytes: (c3 b6) "�
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5e00001,
    root 0xab, subw 0x0, time 1116685, (727,296), root:(728,365),
    state 0x0, keycode 32 (keysym 0x6f, o), same_screen YES,
    XLookupString gives 1 bytes: (6f) "o"
    XFilterEvent returns: False

I have no idea how the X11 keyboard driver converts keycode 0 correctly (!!!) into keysym 0xf6, odiaeresis.(?)

And I cannot understand why the KeyRelease event for the same (!!!) key supplies:

   keycode 32 (keysym 0x6f, o)

He has an Ubuntu 9.04.
He tested a Debian system: The same behaviour. And in /etc/X11/xorg.conf is no Section "InputDevice" . (???)

Any sugestions ? Is there a better way to get the UTF-8 character ?

I know there is a GdkEventKey::string. But the manual pages says it
is deprecated and shouldn't be used any longer.

--
J.Anders, GERMANY, TU Chemnitz, Fakultaet fuer Informatik


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