Генерация комбинированных виртуальных нажатий клавиш для получения символов типа â, ó, ć и более сложных - PullRequest
0 голосов
/ 18 октября 2019

Я реализую виртуальную клавиатуру с использованием QML.

До сих пор я буквально отображал символ для печати для различных карт клавиш (без смещения, со смещением, с помощью Alt Gr и т. Д.).

Так что мне нужно записать все символы для разных раскладок где-то в коде.

Специально для раскладок и языков, где два или более нажатия клавиш генерируют более сложный символ, такой как нажатие ` с последующим a , чтобы получить а, становится очень неприятным.

Так что я думаю, что это неоптимальный подход, и есть гораздо более умное решение для , просто предоставьтеотсканируйте коды (как указано в 'showkey -s' в Linux) и используйте системные языковые настройки для печати правильного символа, скажем, QQuick LineEdit.

Что будет лучшим / правильнымспособ передачи кодов сканирования в систему для генерации «реальных» ключевых событий и как я могу «получить» их в своем коде.

Система - Linux. Бэкэнд C ++ будет в порядке. Угадайте, что сам по себе QML не сможет ... Может быть, для этого будет разумно сгенерировать собственное устройство ввода с клавиатуры?

Или я могу ввести коды сканирования в существующее устройство клавиатуры для имитации нажатий?

1 Ответ

0 голосов
/ 21 октября 2019

Следующий код, полученный из

Как сгенерировать ввод с клавиатуры с помощью libevdev в C

с использованием libevdev, похоже, указывает на правуюнаправление.

Позволяет отправлять коды сканирования на вновь созданное клавиатурное устройство (требуется root).

#include <stdio.h>
#include <libevdev/libevdev.h>
#include <libevdev/libevdev-uinput.h>
#include <unistd.h>

int main()
{
    int err;
    struct libevdev *dev;
    struct libevdev_uinput *uidev;

    dev = libevdev_new();
    libevdev_set_name(dev, "fake keyboard device");

    libevdev_enable_event_type(dev, EV_KEY);
    for(uint key = 1; key < 255; ++key) {
        libevdev_enable_event_code(dev, EV_KEY, key, nullptr);
    }

    err = libevdev_uinput_create_from_device(dev,
        LIBEVDEV_UINPUT_OPEN_MANAGED,
        &uidev);

    if (err != 0) {
        return err;
    }

    sleep(1);

    libevdev_uinput_write_event(uidev, EV_KEY, KEY_LEFTSHIFT, 1);

    libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 1);
    //libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
    libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 0);
    //libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);

    libevdev_uinput_write_event(uidev, EV_KEY, KEY_B, 1);
    //libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
    libevdev_uinput_write_event(uidev, EV_KEY, KEY_B, 0);
    //libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);


    libevdev_uinput_write_event(uidev, EV_KEY, KEY_LEFTSHIFT, 0);

    libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);

    sleep(1);

    libevdev_uinput_destroy(uidev);
    printf("\nComplete\n");
}
...