LINUX.ORG.RU

Xlib, XIM, etc, ввод текста


0

0

Дайте пожалуйста внятное описание этого процесса. 
С этими XIM-ами и XIC-иками уже голова пухнет.

Вообще Xserverr возвращает какие то странные коды для русских букв.
Что то в районе 1700..., причём, судя по всему, их взаимное насположение очень похоже на KOI8R, 
т.е. они идут А, Б, Ц, Д, .... 
В правильном юникоде русские буквы в районе 1100 находятся (правда относительное расположение я не смотрел, но уверен, что по алфавиту).
Локаль стоит ru_RU.UTF8 (впрочем пробовал другие, результат один).
Собственно что за чудная кодировка, в которой шлёт коды XServer и как его заставить слать юникод?

Вообще хочу, чтобы он сам обрабатывал все свои раскладки и прочий бред, и просто слал мне юникод (UCS-4 например).
Без всяких премудростей. Это можно как то сделать?
Можно даже без поддержки японских ракладок :) Хотя лучше с ними.

Вот примерный код, которым пытаюсь принимать сообщения.
Он всегда даёт 1700 с копейками. 1100 никак не получается :)

        case KeyPress:
            {
                if (m_ic == 0) {
                    m_ic = XCreateIC(im,
                            XNInputStyle, XIMPreeditNothing + XIMStatusNothing,
                            XNClientWindow, m_window,
                            0);
                    if (m_ic == NULL) {
                        LOG_ERROR << "XCreateIC() failed";
                        abort();
                    }
                }

                if (XFilterEvent(&event, m_window) == True)
                    break;

                wchar_t buffer[64];
                KeySym key;

                XwcLookupString(m_ic, &event.xkey, buffer, sizeof(buffer), &key, &st
                LOG_INFO << PARAM(key) <<
                    PARAM((unsigned int)buffer[0]) <<
                    PARAM((unsigned int)buffer[1]) <<
                    PARAM((unsigned int)buffer[2]) <<
                    PARAM((unsigned int)buffer[3]) <<
                    PARAM((unsigned int)buffer[4]) <<
                    PARAM((unsigned int)buffer[5]) <<
                    PARAM((unsigned int)buffer[6]) <<
                    PARAM((unsigned int)buffer[6]);
                if (status != XLookupKeySym && status != XLookupBoth) {
                    LOG_INFO << "Status not ok";
                    break;
                }


                onKeyDown(key);

...

в начале
//    setlocale(LC_ALL, "");
    im = XOpenIM(display, 0, 0, 0);
    if (im == 0) {
        LOG_ERROR << "Couldn't open input method";
        return 1;
    }

Примерно так. Вроде ничего не фэйлится.
Вообще где можно доки по этому XIM-у нормальные найти?
В нете только маны ищутся.

Вообще если есть какой нибудь исходник, где на чистом Xlib-е 
корректно обрабатывается русский ввод (а если там ещё и рисуется через
libfreetype, то вообще сказка), буду ОЧЕНЬ благодарен.
Блин, с горя щас буду в Qt копаться :)
anonymous

В евенте есть код _клавиши_ и состояние переключятелей, а не символа. Перевести одно в другое непросто, хотя бы потому что в многих, если не в большинстве наречий одному символу может соответствовать более одново нажатия на кнопку. Для latin1 работает которое описано в `ls /usr/X11/man/man3|grep Keysym`. Если ограничиться латиницей кириллицей, смотри man XKeycodeToKeysym. Пример юсажа:

printf ("%c\n", XKeycodeToKeysym (dpy, ((XKeyPressedEvent *) &ev)->keycode, index));

index меняеш сам в зависимости от переключялки кнопок и всяких шифтоф, например от 0 до 3 если русская и латинская раскладки, и получаеш символы разново регистра в разных раскладках.

через инпут метод пример ниже.

Для остальново кури например http://www.msu.edu/~huntharo/xwin/docs/xwindows/XWINSYS.pdf (полтора мех, 711 страниц, с картинкам :) )

С фритайпом, вообще всё несложно, есть туториал http://freetype.sourceforge.net/freetype2/documentation.html

bugmaker ★★★★☆
()

XNextEvent (dpy, &ev);
switch (ev.type) {
            case KeyPress: {
                    XIM xim = XOpenIM (dpy, NULL, NULL, NULL);
                    XIC xic = XCreateIC (xim,
                        XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
                        XNClientWindow, w,
                        XNFocusWindow, w,
                    NULL);
                    char c [16];
                    Status stat;
                    
                    Xutf8LookupString (xic, (XKeyPressedEvent *) &ev, c, 16, NULL, &stat);
                    printf ("pressed (%d) '%s'\n", stat, c);
                    XDestroyIC (xic);
                    XCloseIM (xim);
                }

Распечятает уникожий символ, введённый одним нажатием кнопки. 
Если локаль неуникожая, запускай пример в uxterm чтобы увидеть символ.

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

> С фритайпом, вообще всё несложно, есть туториал http://freetype.sourceforge.net/freetype2/documentation.html

С ним то конечно несложно. Просто он хочет символы в UCS-4 (да и я хочу).

В общем я почти разобрался, оказывается я страшно тупил, сервер мне отдавал UTF-8, а я от него хотел UCS-4. Вообще я думал, что здесь XwcLookupString поможет, вроде wchar_t. Ещё оказывается setlocale(LC_ALL, ""); оказывает магическое действие на программу. В общем разберусь. Ну здесь в принципе попроще конечно. iconv и все все все.

За ссылку спасибо, почитаю.

// автор темы

Legioner ★★★★★
()

Так, теперь он мне отдаёт UCS-4 :) кажется проблема решена.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.