XTestFakeKeyEvent和unicode(Qt的问题)

时间:2018-05-26 06:37:14

标签: qt unicode x11 utf-16 vala

我的程序需要做的是模拟按键以插入unicode字符。我使用基于gnome的桌面,它可以在任何地方使用,在我测试的所有gtk应用程序中,google chrome。但它在电报和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有关。有没有解决这个问题?

0 个答案:

没有答案