Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to map a X11 KeySym to a Unicode character?

This is an exact duplicate of this question; however the code linked in the accepted answer is nearly 11 years old, and this comment in the code leads to my duplicate question:

The keysym -> UTF-8 conversion will hopefully one day be provided by Xlib via XmbLookupString() and should ideally not have to be done in X applications. But we are not there yet.

Are we there yet? I'm aware of XwcLookupString, but something like...

wchar_t unicode = XKeySymToWideChar( keysym );

... would be much simpler and logical, and not require updating whenever KeySyms are added or changed.

Is there a simple function in X11/Xlib that will map a KeySym to its Unicode equivalent?

like image 509
x-x Avatar asked Jan 23 '12 10:01

x-x


3 Answers

Try this node.js module to generate C table: https://github.com/substack/node-keysym . It is based on this dataset: https://github.com/substack/node-keysym/blob/master/data/keysyms.txt

like image 100
Andrey Sidorov Avatar answered Nov 10 '22 07:11

Andrey Sidorov


Is there a simple function in X11/Xlib that will map a KeySym to its Unicode equivalent?

The definitive answer is no

Because Unicode was invented years after Xlib and no one ever went back to add such a thing? Most of the Xlib API is codeset independent since it was written in the days when every locale used a different character set (ISO 8859-*, Big5, JIS, etc.), so you get a char buffer appropriate to the current locale. There were a few UTF-8 specific additions in later years, but mostly we've been trying to let Xlib rest in peace since then, pushing new API design towards xcb instead.

like image 34
x-x Avatar answered Nov 10 '22 06:11

x-x


The accepted answer is not correct, also the suggested source code is not a standard and reliable way. As the keyboard layouts are out of the initial X11 scope, the additions are implemented in xkb, which is "X Keyboard Extension", added circa 1996, and has been present for a long time.

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)

are the functions you need. The utf-8 version uses the utf-32 one internally, but you use the one you need.

like image 4
Aozi Avatar answered Nov 10 '22 07:11

Aozi