Моя программа должна симулировать нажатие клавиши для вставки символа Юникод.Я использую рабочий стол на основе gnome, и он работает везде, во всех протестированных приложениях gtk, в Google Chrome.Но это не работает правильно в telegram и qtransmission (только приложения Qt, которые я тестировал).Большинство символов ниже 0xD7FF работают хорошо, даже скомпонованы, но я не нашел ничего большего, чем 0xD7FF, который работает.Так что смайлики в основном не работают.Хотя возможно вставить эти символы с помощью функции копирования и вставки.
Мне жаль, что мой код написан на языке Vala, но он не так сильно отличается от C. Итак, вот он:
void Insert (unichar symbol) {
unowned X.Display display = Gdk.X11.get_default_xdisplay ();
int max = 0, min = 0;
display.keycodes (ref min, ref max);
int keysyms_per_symcode = 0;
var keysyms = display.get_keyboard_mapping ((uchar) min, max - min, ref keysyms_per_symcode);
int keycode = min;
unichar[] symbols = new unichar[4];
ulong size = symbol.fully_decompose(true, symbols);
for (ulong i = 0; i < size; ++i) {
unichar c = symbols[i];
string code = "U%04x".printf(c);
ulong new_keysyms[] = {X.string_to_keysym (code)};
message ("code %s ; keycode %d ; keysym %lu", code, keycode, new_keysyms[0]);
XChangeKeyboardMapping (display, keycode, 1, new_keysyms, 1);
XTest.fake_key_event (display, keycode, true, 0);
XTest.fake_key_event (display, keycode, false, 100);
display.flush ();
}
ulong original[] = {0};
XChangeKeyboardMapping (display, keycode, 1, original, 1);
display.flush ();
}
Я думаю, это может быть связано с UTF-16.Есть ли какое-то решение для этого?