| #include <stdio.h> |
| #include <emscripten.h> |
| #include <string.h> |
| #include <emscripten/html5.h> |
| #include <emscripten/threading.h> |
| #include <pthread.h> |
| #include <assert.h> |
| #include <unistd.h> |
| |
| // #define TEST_SYNC_BLOCKING_LOOP |
| |
| void *mainRuntimeThreadId = 0; |
| void *registeringThreadId = 0; |
| |
| EM_BOOL mouse_callback(int eventType, const EmscriptenMouseEvent *e, void *userData) |
| { |
| static int once; |
| |
| void *threadId = pthread_self(); |
| if (!once) printf("pthread_self()=%p, registeringThreadId=%p, mainRuntimeThreadId=%p, emscripten_main_browser_thread_id()=%p\n", threadId, registeringThreadId, mainRuntimeThreadId, emscripten_main_browser_thread_id()); |
| printf("eventType: %d, mouseEvent: %p, userData: %p, screen: (%ld,%ld), client: (%ld,%ld),%s%s%s%s button: %hu, buttons: %hu, movement: (%ld,%ld), canvas: (%ld,%ld)\n", |
| eventType, e, userData, |
| e->screenX, e->screenY, e->clientX, e->clientY, |
| e->ctrlKey ? " CTRL" : "", e->shiftKey ? " SHIFT" : "", e->altKey ? " ALT" : "", e->metaKey ? " META" : "", |
| e->button, e->buttons, e->movementX, e->movementY, e->canvasX, e->canvasY); |
| assert(threadId && threadId == registeringThreadId); |
| assert(userData == (void*)0x42); |
| assert(e); |
| assert(eventType == EMSCRIPTEN_EVENT_MOUSEMOVE); |
| |
| if (once) return 0; |
| once = 1; |
| |
| #ifdef REPORT_RESULT |
| REPORT_RESULT(1); |
| #endif |
| return 0; |
| } |
| |
| void *threadMain(void *arg) |
| { |
| registeringThreadId = pthread_self(); |
| |
| EMSCRIPTEN_RESULT ret = emscripten_set_mousemove_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, (void*)0x42, 1, mouse_callback); |
| assert(ret == EMSCRIPTEN_RESULT_SUCCESS); |
| |
| printf("Please move the mouse cursor.\n"); |
| |
| #ifdef TEST_SYNC_BLOCKING_LOOP |
| for(;;) |
| { |
| usleep(1000); |
| emscripten_current_thread_process_queued_calls(); |
| } |
| #else |
| EM_ASM(Module['noExitRuntime'] = true); |
| #endif |
| return 0; |
| } |
| |
| int main() |
| { |
| mainRuntimeThreadId = pthread_self(); |
| |
| pthread_t thread; |
| int rc = pthread_create(&thread, NULL, threadMain, 0); |
| assert(rc == 0); |
| |
| EM_ASM(Module['noExitRuntime'] = true); |
| } |