Thanks for your reply Alon, I managed to get the mouse callback to trigger 
by doing some debugging. This is my code as of now:

helloworld.cpp:

#include <stdio.h>
#include <iostream>
#include <emscripten.h>
#include <html5.h>
using namespace std;

extern "C" {
EM_BOOL mouse_callback(int eventType, const EmscriptenMouseEvent *e, void* 
userData)
{
cout << "mouse_callback+" << endl;
return 0;
}
}

void handleMouseEvent()
{
emscripten_sleep_with_yield(100);
}

int main() {
    cout << "HelloWorld" << endl;

    //emscripten_set_mousemove_callback("#canvas",0,1, mouse_callback);
    emscripten_set_mousedown_callback("#canvas", 0, 1, mouse_callback);

    emscripten_set_main_loop(handleMouseEvent, 0, 0);
    return 0;
}

My build commands:
emcc helloworld.cpp --proxy-to-worker -s EMTERPRETIFY=1 -s 
EMTERPRETIFY_ASYNC=1 -s NO_EXIT_RUNTIME=1 -s 
EXPORTED_FUNCTIONS="['_mouse_callback', '_main']" -o helloworld.html

Unfortunately, when I click on the canvas, I see the following abort in the 
console:

Uncaught abort(-12) at Error
    at jsStackTrace (http://localhost:8000/helloworld.js:1166:13)
    at stackTrace (http://localhost:8000/helloworld.js:1183:22)
    at abort (http://localhost:8000/helloworld.js:24467:44)
    at _strlen (http://localhost:8000/helloworld.js:20487:26)
    at emterpret (http://localhost:8000/helloworld.js:11969:11)
    at emterpret (http://localhost:8000/helloworld.js:11520:4)
    at emterpret (http://localhost:8000/helloworld.js:11520:4)
    at Array._mouse_callback (http://localhost:8000/helloworld.js:16841:2)
    at dynCall_iiii (http://localhost:8000/helloworld.js:20532:41)
    at Object.Runtime.dynCall (http://localhost:8000/helloworld.js:280:39)
This error happened during an emterpreter-async save or load of the stack. 
Was there non-emterpreted code on the stack during save (which is 
unallowed)? You may want to adjust EMTERPRETIFY_BLACKLIST, 
EMTERPRETIFY_WHITELIST.
This is what the stack looked like when we tried to save it: 1,Error
    at Object.EmterpreterAsync.handle 
(http://localhost:8000/helloworld.js:8152:40)
    at _emscripten_sleep_with_yield 
(http://localhost:8000/helloworld.js:8177:24)
    at emterpret (http://localhost:8000/helloworld.js:12550:6)
    at Array.__Z16handleMouseEventv 
(http://localhost:8000/helloworld.js:20629:2)
    at dynCall_v (http://localhost:8000/helloworld.js:20670:31)
    at Object.Runtime.dynCall (http://localhost:8000/helloworld.js:284:39)
    at http://localhost:8000/helloworld.js:6409:21
    at Object.Browser.mainLoop.runIter 
(http://localhost:8000/helloworld.js:6471:13)
    at Browser_mainLoop_runner (http://localhost:8000/helloworld.js:6405:26)
    at http://localhost:8000/helloworld.js:23845:7
abort @ helloworld.js:24473_strlen @ helloworld.js:20487emterpret @ 
helloworld.js:11969emterpret @ helloworld.js:11520emterpret @ 
helloworld.js:11520_mouse_callback @ helloworld.js:16841dynCall_iiii @ 
helloworld.js:20532Runtime.dynCall @ helloworld.js:280handlerFunc @ 
helloworld.js:7301jsEventHandler @ helloworld.js:7204(anonymous function) @ 
helloworld.js:23955fireEvent @ helloworld.js:23954onmessage @ 
helloworld.js:24230

I took a look at the _strlen code and saw the following:

function _strlen(ptr) {
 ptr = ptr | 0;
 var curr = 0;
 curr = ptr;
 asyncState ? abort(-12) | 0 : 0;
 while (HEAP8[curr >> 0] | 0) {
  curr = curr + 1 | 0;
 }
 return curr - ptr | 0;
}

I find it strange that _strlen will abort when the program is in an async 
state. From what I understand, all the functions would already have been 
emterpreted when I use -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1. Is my 
understanding correct or do I have to manually add _strlen to the whitelist 
as well? I am using emsdk 1.34.1.

On Thursday, August 27, 2015 at 11:11:27 AM UTC+8, Alon Zakai wrote:
>
> Not sure where the problem is (I didn't implement that API myself, not 
> very familiar with the code) but you might take a look at 
> tests/test_html5_mouse.c for example, which tests that API, and is known to 
> work.
>
> On Wed, Aug 26, 2015 at 5:41 PM, awt <[email protected] <javascript:>> 
> wrote:
>
>> Thanks for your reply Alon, are there other APIs that I can use to 
>> capture mouse and keyboard events in Emscripten 
>> besides emscripten_set_click_callback? Or do you think the issue lies with 
>> my mouse_callback itself?
>>
>> On Thursday, August 27, 2015 at 6:01:35 AM UTC+8, Alon Zakai wrote:
>>>
>>> The mouse_callback doesn't seem to work without --proxy-to-worker 
>>> either, so proxying isn't the issue either. I'm not sure offhand what is 
>>> wrong there, but it should be easier to debug without proxying.
>>>
>>> On Wed, Aug 26, 2015 at 2:59 PM, Alon Zakai <[email protected]> wrote:
>>>
>>>> Yes, the JS running in the HTML needs a Module object, so that we can 
>>>> find the canvas element to render to, text area to show stdout to, and so 
>>>> forth. If you emit an html file instead of js, that will be emitted for 
>>>> you. Otherwise, you need to create it in the HTML.
>>>>
>>>> It's definitely an error that we fail in this way, though. I fixed this 
>>>> on incoming, we'll show a warning now, and provide some basic Module 
>>>> functionality if one is not defined (writing to console.log for stdout, 
>>>> etc.)
>>>>
>>>>
>>>> On Tue, Aug 25, 2015 at 11:59 PM, awt <[email protected]> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I was trying to generate a javascript output for a simple hello world 
>>>>> program and insert it into my own html file. These are my build commands:
>>>>>
>>>>> emcc helloworld.cpp --proxy-to-worker -o helloworld.js
>>>>>
>>>>> This is my helloworld.html file:
>>>>>
>>>>> <html>
>>>>> <header></header>
>>>>> <body>
>>>>> <script src="helloworld.js"></script>
>>>>> </body>
>>>>> </html>
>>>>>
>>>>> This is my cpp file:
>>>>>
>>>>> #include <stdio.h>
>>>>> #include <iostream>
>>>>>
>>>>> using namespace std;
>>>>> int main() {
>>>>>     cout << "HelloWorld" << endl;
>>>>>     return 0;
>>>>> }
>>>>>
>>>>> I get the following error: 
>>>>> Uncaught ReferenceError: Module is not defined
>>>>>
>>>>> at the following line of code in helloworld.js:
>>>>>
>>>>> ['mousedown', 'mouseup', 'mousemove', 'DOMMouseScroll', 'mousewheel', 
>>>>> 'mouseout'].forEach(function(event) {
>>>>>   Module.canvas.addEventListener(event, function(event) {
>>>>>     worker.postMessage({ target: 'canvas', event: cloneObject(event) 
>>>>> });
>>>>>     event.preventDefault();
>>>>>   }, true);
>>>>>
>>>>> Do I need to manually declare the Module object in helloworld.html? Or 
>>>>> should I just include helloworld.worker.js in helloworld.html directly?
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "emscripten-discuss" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to [email protected].
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "emscripten-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to