Не совсем как в майнкрафте — шрифт, например, нормальный (ttf) и символы перекодируются на лету в utf-8 (кажется так в тех патчах сделано), а вот с вводом всё довольно печально: в разных кодировках одной и той же кнопке соответствуют разные кейкоды.
Там предлагается «расширять» набор кейкодов чтобы можно было управлять персонажем при любой раскладке. Для линукса предлагался такой патч:
#ifdef XK_CYRILLIC
KeyMap.push_back(SKeyMap(XK_Cyrillic_shorti, KEY_KEY_Q));
KeyMap.push_back(SKeyMap(XK_Cyrillic_SHORTI, KEY_KEY_Q));
KeyMap.push_back(SKeyMap(XK_Cyrillic_tse, KEY_KEY_W));
KeyMap.push_back(SKeyMap(XK_Cyrillic_TSE, KEY_KEY_W));
KeyMap.push_back(SKeyMap(XK_Cyrillic_u, KEY_KEY_E));
KeyMap.push_back(SKeyMap(XK_Cyrillic_U, KEY_KEY_E));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ka, KEY_KEY_R));
KeyMap.push_back(SKeyMap(XK_Cyrillic_KA, KEY_KEY_R));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ie, KEY_KEY_T));
KeyMap.push_back(SKeyMap(XK_Cyrillic_IE, KEY_KEY_T));
KeyMap.push_back(SKeyMap(XK_Cyrillic_en, KEY_KEY_Y));
KeyMap.push_back(SKeyMap(XK_Cyrillic_EN, KEY_KEY_Y));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ghe, KEY_KEY_U));
KeyMap.push_back(SKeyMap(XK_Cyrillic_GHE, KEY_KEY_U));
KeyMap.push_back(SKeyMap(XK_Cyrillic_sha, KEY_KEY_I));
KeyMap.push_back(SKeyMap(XK_Cyrillic_SHA, KEY_KEY_I));
KeyMap.push_back(SKeyMap(XK_Cyrillic_shcha, KEY_KEY_O));
KeyMap.push_back(SKeyMap(XK_Cyrillic_SHCHA, KEY_KEY_O));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ze, KEY_KEY_P));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ZE, KEY_KEY_P));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ha, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_HA, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_hardsign, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_HARDSIGN, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ef, KEY_KEY_A));
KeyMap.push_back(SKeyMap(XK_Cyrillic_EF, KEY_KEY_A));
KeyMap.push_back(SKeyMap(XK_Cyrillic_yeru, KEY_KEY_S));
KeyMap.push_back(SKeyMap(XK_Cyrillic_YERU, KEY_KEY_S));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ve, KEY_KEY_D));
KeyMap.push_back(SKeyMap(XK_Cyrillic_VE, KEY_KEY_D));
KeyMap.push_back(SKeyMap(XK_Cyrillic_a, KEY_KEY_F));
KeyMap.push_back(SKeyMap(XK_Cyrillic_A, KEY_KEY_F));
KeyMap.push_back(SKeyMap(XK_Cyrillic_pe, KEY_KEY_G));
KeyMap.push_back(SKeyMap(XK_Cyrillic_PE, KEY_KEY_G));
KeyMap.push_back(SKeyMap(XK_Cyrillic_er, KEY_KEY_H));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ER, KEY_KEY_H));
KeyMap.push_back(SKeyMap(XK_Cyrillic_o, KEY_KEY_J));
KeyMap.push_back(SKeyMap(XK_Cyrillic_O, KEY_KEY_J));
KeyMap.push_back(SKeyMap(XK_Cyrillic_el, KEY_KEY_K));
KeyMap.push_back(SKeyMap(XK_Cyrillic_EL, KEY_KEY_K));
KeyMap.push_back(SKeyMap(XK_Cyrillic_de, KEY_KEY_L));
KeyMap.push_back(SKeyMap(XK_Cyrillic_DE, KEY_KEY_L));
KeyMap.push_back(SKeyMap(XK_Cyrillic_zhe, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ZHE, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_e, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_E, 0));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ya, KEY_KEY_Z));
KeyMap.push_back(SKeyMap(XK_Cyrillic_YA, KEY_KEY_Z));
KeyMap.push_back(SKeyMap(XK_Cyrillic_che, KEY_KEY_X));
KeyMap.push_back(SKeyMap(XK_Cyrillic_CHE, KEY_KEY_X));
KeyMap.push_back(SKeyMap(XK_Cyrillic_es, KEY_KEY_C));
KeyMap.push_back(SKeyMap(XK_Cyrillic_ES, KEY_KEY_C));
KeyMap.push_back(SKeyMap(XK_Cyrillic_em, KEY_KEY_V));
KeyMap.push_back(SKeyMap(XK_Cyrillic_EM, KEY_KEY_V));
KeyMap.push_back(SKeyMap(XK_Cyrillic_i, KEY_KEY_B));
KeyMap.push_back(SKeyMap(XK_Cyrillic_I, KEY_KEY_B));
KeyMap.push_back(SKeyMap(XK_Cyrillic_te, KEY_KEY_N));
KeyMap.push_back(SKeyMap(XK_Cyrillic_TE, KEY_KEY_N));
KeyMap.push_back(SKeyMap(XK_Cyrillic_softsign, KEY_KEY_M));
KeyMap.push_back(SKeyMap(XK_Cyrillic_SOFTSIGN, KEY_KEY_M));
#endif // #ifdef XK_CYRILLIC