I am using the HTML5 C Api in the Emscripten project to listen to DOM events ( A big thanks to Jukka ! ) :
I subscribed to keyboard and mouse events in the following way :
#include <emscripten.h>
#include <emscripten/html5.h>
#include <stdio.h>
EM_BOOL key_callback(int eventType, const EmscriptenKeyboardEvent *e, void *userData)
{
printf("You pressed key %lu\n", e->which);
return 1;
}
EM_BOOL click_callback(int eventType, const EmscriptenMouseEvent *e, void *userData)
{
printf("You just clicked\n");
return 1;
}
int main()
{
emscripten_set_keypress_callback(0, 0, 1, key_callback);
emscripten_set_click_callback( "#document" , 0, 1, click_callback);
EM_ASM(Module['noExitRuntime'] = true);
return 0;
}
I included the a.out.js in my HTML and the callbacks for keyboard gets called without any issues. But I see some issues when a mouse event is triggered. Sample Log ( 1st line for keyboard input and 2nd for mouse )
You pressed key 116
Uncaught TypeError: Cannot read property 'getBoundingClientRect' of undefined
And this is where the exception happens in code :
(a.out.js)
fillMouseEventData:function (eventStruct, e) {
var rect = Module['canvas'].getBoundingClientRect();
HEAPF64[((eventStruct)>>3)]=JSEvents.tick();
The Module['canvas'] object is not defined.
I think this Module['canvas'] is applicable only when we are listening to events on a canvas generated from C/C++.
But in my case, I want to listen to the entire document. I do specify that in the C API ( in the above C code ):
emscripten_set_click_callback("#document", 0, 1, click_callback);
Also, it is being set properly when the event is regitered in JS glue function and that's why it work as expected for Keyboard input:
(a.out.js)
target: JSEvents.findEventTarget(target),
allowsDeferredCalls: JSEvents.isInternetExplorer() ? false : true, // MSIE doesn't allow fullscreen and pointerlock requests from key handlers, others do.
eventTypeString: eventTypeString,
callbackfunc: callbackfunc,
handlerFunc: handlerFunc,
It is just that in the case of Mouse events , there is an access to a non-existent Module['canvas'] object in my context.
3 questions :
Is this a bug ?
How do I get around this ?
Am I missing out something here ?
-Nagappan