Ввод с клавиатуры не работает с WebAssembly и Emscripten

У меня есть немного кода, который визуализирует элемент холста webgl. Когда я вызываю методы регистрации событий, я либо вообще не получаю обратного вызова (когда я задаю имя холста или #canvas, как показано ниже, либо ошибку в chrome, когда я указываю #document или #window, что связано с невозможностью регистрации с нулевым объектом)

emscripten_set_keydown_callback("#canvas", nullptr, true, Platform::keyCallback);
emscripten_set_keyup_callback("#canvas", nullptr, true, Platform::keyCallback);

Мой элемент Canvas в HTML

<canvas id="canvas" oncontextmenu="event.preventDefault()" width="640px" height="480px"></canvas>

и мой метод испытаний для ввода..

EM_BOOL Platform::keyCallback(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
{
    printf("TEST\n");
}

Примечание: printf работает так, как у меня есть другой вывод на консоль.

Заранее спасибо за помощь

1 ответ

Оказывается, проблема была в файле HTML. Мне нужно было добавить "tabindex=-1" на холст. Например:

<canvas id="canvas" oncontextmenu="event.preventDefault()" width="640px" height="480px" tabindex=-1></canvas>

В результате этого изменения теперь кажется, что код работает отлично.

Просто чтобы добавить еще один ответ, поскольку я обнаружил, что 'tabindex=-1' недостаточно и необходимо для фокусировки объекта холста.

Я добился этого, добавив код, похожий на этот:

addOnPostRun(function()
{
     var canvas = document.getElementById('my_canvas');
     if (canvas)
         canvas.focus();
});

на постфиксный код, указанный в '--post-js ./your_postfix_file.js' при сборке с использованием emcc.

Другие вопросы по тегам