Как сопоставить X11 KeySym с символом Unicode?


person x-x    schedule 23.01.2012    source источник


Ответы (4)


Попробуйте этот модуль node.js для создания таблицы C: https://github.com/substack/node-keysym< /а> . Он основан на этом наборе данных: https://github.com/substack/node-keysym/blob/master/data/keysyms.txt

person Andrey Sidorov    schedule 23.01.2012
comment
Спасибо за ссылки! Код в основном такой же, как и в вопросе - он даже использует тот же набор данных. - person x-x; 26.01.2012
comment
Для всех, кому это может быть интересно, я написал автономную реализацию XKeysymToUnicode() под лицензией MIT. Он использует определение, найденное в заголовочном файле keysymdef.h X11. Вы можете найти его здесь: bitbucket.org/janvrany/stx-libview/commits/ - person J.V.; 29.05.2017

Есть ли в X11/Xlib простая функция, которая сопоставляет KeySym с его эквивалентом в Unicode?

Окончательный ответ: нет

Потому что Unicode был изобретен спустя годы после Xlib, и никто никогда не возвращался, чтобы добавить такую ​​вещь? Большая часть Xlib API не зависит от кодового набора, поскольку он был написан в те дни, когда каждая локаль использовала свой набор символов (ISO 8859-*, Big5, JIS и т. д.), поэтому вы получаете символьный буфер, соответствующий текущей локали. В последующие годы было несколько специфичных для UTF-8 дополнений, но в основном с тех пор мы пытались оставить Xlib в покое, вместо этого продвигая новый дизайн API в сторону xcb.

person x-x    schedule 26.01.2012

Это может кому-нибудь помочь... адаптировано из исходного кода xmodmap и онлайн-документа (http://tronche.com/gui/x/xlib/utilities/keyboard/XKeycodeToKeysym.html)

KeySym ks = XKeycodeToKeysym(dpy, keycode+min_keycode, modifier);
const char *s;
if (ks != NoSymbol)
    s = XKeysymToString (ks);
else {
    printf("Keycode has no symbol. Ignored.\n");
    return NULL;
}

printf ("0x%04x (%s)\n", (unsigned int)ks, s);
printf ("wide char:%lc\n", (wchar_t)ks);

Keysym уже является значением UTF. Проблема будет заключаться в том, чтобы установить комбинации клавиш... '', например.

person olivervbk    schedule 17.09.2013

Принятый ответ неверен, также предлагаемый исходный код не является стандартным и надежным способом. Поскольку раскладки клавиатуры выходят за рамки первоначальной области X11, дополнения реализованы в xkb, который представляет собой расширение клавиатуры X, добавленное примерно в 1996 году и присутствующее долгое время.

XKB_EXPORT uint32_t
xkb_keysym_to_utf32(xkb_keysym_t keysym)

XKB_EXPORT int
xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size)

нужные вам функции. Версия utf-8 использует внутреннюю версию utf-32, но вы используете ту, которая вам нужна.

person Aozi    schedule 06.12.2020