100 строки
3.3 KiB
C
100 строки
3.3 KiB
C
/*
|
|
* Copyright 2013 The Emscripten Authors. All rights reserved.
|
|
* Emscripten is available under two separate licenses, the MIT license and the
|
|
* University of Illinois/NCSA Open Source License. Both these licenses can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <GL/glut.h>
|
|
#include <EGL/egl.h>
|
|
#include <emscripten.h>
|
|
|
|
#define MULTILINE(...) #__VA_ARGS__
|
|
|
|
int touch_started_button = -1;
|
|
int touch_started_x = -1;
|
|
int touch_started_y = -1;
|
|
|
|
int touch_ended_button = -1;
|
|
int touch_ended_x = -1;
|
|
int touch_ended_y = -1;
|
|
|
|
int result = 0;
|
|
|
|
void mouseCB(int button, int state, int x, int y)
|
|
{
|
|
if(button == GLUT_LEFT_BUTTON)
|
|
{
|
|
if(state == GLUT_DOWN)
|
|
{
|
|
printf("GLUT_DOWN: button: %d, x: %d, y: %d\n", button, x, y);
|
|
touch_started_button = button;
|
|
touch_started_x = x;
|
|
touch_started_y = y;
|
|
}
|
|
else if(state == GLUT_UP)
|
|
{
|
|
printf("GLUT_UP: button: %d, x: %d, y: %d\n", button, x, y);
|
|
touch_ended_button = button;
|
|
touch_ended_x = x;
|
|
touch_ended_y = y;
|
|
}
|
|
}
|
|
}
|
|
|
|
#define abs(x) ((x) < 0 ? -(x) : (x))
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
emscripten_run_script(MULTILINE(
|
|
Module.injectEvent = function(eventType, wantedX, wantedY) {
|
|
// Desktop browsers do not have the event types for touch events,
|
|
// so we fake them by creating a plain-vanilla UIEvent and then
|
|
// filling in the fields that we look for with appropriate values.
|
|
var rect = Module["canvas"].getBoundingClientRect();
|
|
out('rect corner: ' + rect.left + ',' + rect.top);
|
|
out('wanted: ' + wantedX + ',' + wantedY);
|
|
var x = wantedX + rect.left;
|
|
var y = wantedY + rect.top;
|
|
var touch = {
|
|
identifier: 0,
|
|
clientX: x,
|
|
clientY: y,
|
|
screenX: x,
|
|
screenY: y,
|
|
pageX: x,
|
|
pageY: y,
|
|
target: Module['canvas']
|
|
};
|
|
var touches = [ touch ];
|
|
touches.item = function(i) { return this[i]; };
|
|
|
|
var event = document.createEvent('UIEvent');
|
|
event.target = Module['canvas'];
|
|
event.button = 0;
|
|
event.changedTouches = touches;
|
|
event.initUIEvent(eventType, true, true, window, 1);
|
|
Module['canvas'].dispatchEvent(event);
|
|
}
|
|
));
|
|
|
|
// Fake a touch device so that glut sets up the appropriate event handlers.
|
|
emscripten_run_script("document.documentElement['ontouchstart'] = 1");
|
|
glutInit(&argc, argv);
|
|
|
|
glutMouseFunc(&mouseCB);
|
|
|
|
emscripten_run_script("Module.injectEvent('touchstart', 101, 112)");
|
|
emscripten_run_script("Module.injectEvent('touchend', 201, 212)");
|
|
result = touch_started_button == 0 && abs(touch_started_x - 101) <= 1 && abs(touch_started_y - 112) <= 1 &&
|
|
touch_ended_button == 0 && abs(touch_ended_x - 201) <= 1 && abs(touch_ended_y - 212) <= 1;
|
|
printf("touchstarted: button:%d x:%d y:%d\n", touch_started_button, touch_started_x, touch_started_y);
|
|
printf("touchended: button:%d x:%d y:%d\n", touch_ended_button, touch_ended_x, touch_ended_y);
|
|
#ifdef REPORT_RESULT
|
|
REPORT_RESULT(result);
|
|
#endif
|
|
return 0;
|
|
}
|