Ввод с клавиатуры не работает с 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.