XTestFakeKeyEvent и unicode (проблемы с Qt) - PullRequest
0 голосов
/ 26 мая 2018

Моя программа должна симулировать нажатие клавиши для вставки символа Юникод.Я использую рабочий стол на основе 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.Есть ли какое-то решение для этого?

...