Внедрить Keysym (не код ключа) в сервер X11

Мне нужно знать, как внедрить KeySym в X-сервер, используя xcb, xtest или xlib. Я могу вводить коды клавиш, также получать сопоставление клавиатуры, искать там keysym и нажимать соответствующий код клавиши, но я не могу вводить KeySym (например, XKB_KEY_Arabic_0), если он не сопоставлен с текущей раскладкой.

Есть ли способ сделать это?

Я подумал о том, чтобы найти пустой код клавиши и переназначить его на нужный ключевой символ. Проблема: Мой код не находит пустой ключ. Это мой код:

uint32_t find_empty_key_for_remapping()
{
    int keycode_low;
    int keycode_high;
    KeySym * keysyms = 0;
    int empty_key = 0;
    int num_keysym;
    XDisplayKeycodes(display_, &keycode_low, &keycode_high);
    keysyms = XGetKeyboardMapping(display_, keycode_low, keycode_high - keycode_low, &num_keysym);
    for (int i = keycode_low; i <= keycode_high && !empty_key; ++i)
    {
        bool key_is_empty = true;
        for (int j = 0; j < num_keysym; ++j)
        {
            int symindex = ((i - keycode_low) * num_keysym) + j;
            if (keysyms[symindex] != 0)
            {
                key_is_empty = false;
            }
        }
        if (key_is_empty)
        {
            return i;
        }
    }
    return 0;
}

Любая помощь будет оценена!


person Nidhoegger    schedule 02.03.2016    source источник
comment
Вы можете использовать XChangeKeyboardMapping и добавить дополнительные коды клавиш. Вам нужно будет делать это каждый раз, когда меняется отображение.   -  person n. 1.8e9-where's-my-share m.    schedule 03.03.2016
comment
Могу ли я действительно добавить новые коды клавиш? Я думал, вы можете просто переназначить существующие?   -  person Nidhoegger    schedule 03.03.2016
comment
Хм, не понимаю, почему бы и нет. Нужно экспериментировать.   -  person n. 1.8e9-where's-my-share m.    schedule 04.03.2016
comment
Поскольку код ключа — uint8_t, а их существует 256 (0–255), я не думаю, что создание кода ключа 256 будет успешным. Сначала я попытался найти неустановленный код клавиши, но я не понимаю сопоставление в X, когда установлено несколько раскладок клавиатуры (тогда один код клавиши имеет до 15 полей, все они доступны через раскладку + модификатор)   -  person Nidhoegger    schedule 04.03.2016
comment
Извините за ошибку, вы не можете добавлять коды клавиш.   -  person n. 1.8e9-where's-my-share m.    schedule 04.03.2016


Ответы (1)


Внедрение символов клавиш выполняется с помощью xdotool. Чтобы вставить XKB_KEY_Arabic_0, используйте

xdotool key Arabic_0

который не зависит от раскладки клавиатуры.

person Juergen    schedule 27.07.2020
comment
Это делается с помощью xdotool только в том случае, если вы не хотите включать его в свою собственную программу. Как написано в вопросе, следует использовать C-библиотеки X11. Так что это не ответ на этот вопрос. - person Nidhoegger; 29.07.2020