23 #include "../../SDL_internal.h" 25 #if SDL_VIDEO_DRIVER_EMSCRIPTEN 27 #include <emscripten/html5.h> 29 #include "../../events/SDL_events_c.h" 30 #include "../../events/SDL_keyboard_c.h" 31 #include "../../events/SDL_touch_c.h" 38 #define FULLSCREEN_MASK ( SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN ) 45 static const SDL_Scancode emscripten_scancode_table[] = {
274 Emscripten_ConvertUTF32toUTF8(
Uint32 codepoint,
char *
text)
276 if (codepoint <= 0x7F) {
277 text[0] = (char) codepoint;
279 }
else if (codepoint <= 0x7FF) {
280 text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F);
281 text[1] = 0x80 | (char) (codepoint & 0x3F);
283 }
else if (codepoint <= 0xFFFF) {
284 text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F);
285 text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
286 text[2] = 0x80 | (char) (codepoint & 0x3F);
288 }
else if (codepoint <= 0x10FFFF) {
289 text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F);
290 text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F);
291 text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
292 text[3] = 0x80 | (char) (codepoint & 0x3F);
301 Emscripten_HandleMouseMove(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
304 int mx = mouseEvent->canvasX, my = mouseEvent->canvasY;
305 EmscriptenPointerlockChangeEvent pointerlock_status;
308 emscripten_get_pointerlock_status(&pointerlock_status);
310 if (pointerlock_status.isActive) {
311 mx = mouseEvent->movementX;
312 my = mouseEvent->movementY;
316 double client_w, client_h;
317 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
327 Emscripten_HandleMouseButton(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
331 switch (mouseEvent->button) {
349 Emscripten_HandleMouseFocus(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
357 Emscripten_HandleWheel(
int eventType,
const EmscriptenWheelEvent *wheelEvent,
void *userData)
365 Emscripten_HandleFocus(
int eventType,
const EmscriptenFocusEvent *wheelEvent,
void *userData)
373 Emscripten_HandleTouch(
int eventType,
const EmscriptenTouchEvent *touchEvent,
void *userData)
383 for (i = 0; i < touchEvent->numTouches; i++) {
387 if (!touchEvent->touches[i].isChanged)
390 id = touchEvent->touches[
i].identifier;
391 x = touchEvent->touches[
i].canvasX / (float)window_data->
windowed_width;
392 y = touchEvent->touches[i].canvasY / (
float)window_data->
windowed_height;
394 if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
396 }
else if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
408 Emscripten_HandleKey(
int eventType,
const EmscriptenKeyboardEvent *keyEvent,
void *userData)
413 if (keyEvent->keyCode <
SDL_arraysize(emscripten_scancode_table)) {
414 scancode = emscripten_scancode_table[keyEvent->keyCode];
418 if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) {
443 || keyEvent->keyCode == 8 || keyEvent->keyCode == 9 ;
447 Emscripten_HandleKeyPress(
int eventType,
const EmscriptenKeyboardEvent *keyEvent,
void *userData)
450 if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) {
457 Emscripten_HandleFullscreenChange(
int eventType,
const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent,
void *userData)
460 if(
SDL_strcmp(fullscreenChangeEvent->id,
"SDLFullscreenElement") != 0)
464 if(fullscreenChangeEvent->isFullscreen)
479 emscripten_set_canvas_size(fullscreenChangeEvent->screenWidth, fullscreenChangeEvent->screenHeight);
487 double factor =
SDL_min(fullscreenChangeEvent->screenWidth / w, fullscreenChangeEvent->screenHeight / h);
488 emscripten_set_element_css_size(
NULL, w * factor, h * factor);
495 var canvas = Module[
'canvas'];
496 if(canvas.parentNode.id ==
"SDLFullscreenElement") {
497 var canvasContainer = canvas.parentNode;
498 canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
499 canvasContainer.parentNode.removeChild(canvasContainer);
507 emscripten_set_element_css_size(
NULL, unscaled_w, unscaled_h);
519 Emscripten_HandleResize(
int eventType,
const EmscriptenUiEvent *uiEvent,
void *userData)
528 emscripten_set_canvas_size(uiEvent->windowInnerWidth * window_data->
pixel_ratio, uiEvent->windowInnerHeight * window_data->
pixel_ratio);
541 emscripten_get_element_css_size(
NULL, &w, &h);
548 emscripten_set_element_css_size(
NULL, w, h);
559 Emscripten_HandleVisibilityChange(
int eventType,
const EmscriptenVisibilityChangeEvent *visEvent,
void *userData)
570 emscripten_set_mousemove_callback(
"#canvas", data, 0, Emscripten_HandleMouseMove);
572 emscripten_set_mousedown_callback(
"#canvas", data, 0, Emscripten_HandleMouseButton);
573 emscripten_set_mouseup_callback(
"#canvas", data, 0, Emscripten_HandleMouseButton);
575 emscripten_set_mouseenter_callback(
"#canvas", data, 0, Emscripten_HandleMouseFocus);
576 emscripten_set_mouseleave_callback(
"#canvas", data, 0, Emscripten_HandleMouseFocus);
578 emscripten_set_wheel_callback(
"#canvas", data, 0, Emscripten_HandleWheel);
580 emscripten_set_focus_callback(
"#canvas", data, 0, Emscripten_HandleFocus);
581 emscripten_set_blur_callback(
"#canvas", data, 0, Emscripten_HandleFocus);
583 emscripten_set_touchstart_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
584 emscripten_set_touchend_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
585 emscripten_set_touchmove_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
586 emscripten_set_touchcancel_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
590 if (!keyElement) keyElement =
"#window";
592 emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
593 emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
594 emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
596 emscripten_set_fullscreenchange_callback(
"#document", data, 0, Emscripten_HandleFullscreenChange);
598 emscripten_set_resize_callback(
"#window", data, 0, Emscripten_HandleResize);
600 emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
607 emscripten_set_mousemove_callback(
"#canvas",
NULL, 0,
NULL);
609 emscripten_set_mousedown_callback(
"#canvas",
NULL, 0,
NULL);
610 emscripten_set_mouseup_callback(
"#canvas",
NULL, 0,
NULL);
612 emscripten_set_mouseenter_callback(
"#canvas",
NULL, 0,
NULL);
613 emscripten_set_mouseleave_callback(
"#canvas",
NULL, 0,
NULL);
615 emscripten_set_wheel_callback(
"#canvas",
NULL, 0,
NULL);
617 emscripten_set_focus_callback(
"#canvas",
NULL, 0,
NULL);
618 emscripten_set_blur_callback(
"#canvas",
NULL, 0,
NULL);
620 emscripten_set_touchstart_callback(
"#canvas",
NULL, 0,
NULL);
621 emscripten_set_touchend_callback(
"#canvas",
NULL, 0,
NULL);
622 emscripten_set_touchmove_callback(
"#canvas",
NULL, 0,
NULL);
623 emscripten_set_touchcancel_callback(
"#canvas",
NULL, 0,
NULL);
630 emscripten_set_keydown_callback(target,
NULL, 0,
NULL);
631 emscripten_set_keyup_callback(target,
NULL, 0,
NULL);
633 emscripten_set_keypress_callback(target,
NULL, 0,
NULL);
635 emscripten_set_fullscreenchange_callback(
"#document",
NULL, 0,
NULL);
637 emscripten_set_resize_callback(
"#window",
NULL, 0,
NULL);
639 emscripten_set_visibilitychange_callback(
NULL, 0,
NULL);
uint32_t Uint32
An unsigned 32-bit integer type.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
GLint GLint GLint GLint GLint x
void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure)
#define SDL_GetEventState(type)
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
int SDL_SendKeyboardText(const char *text)
#define SDL_BUTTON_MIDDLE
int SDL_AddTouch(SDL_TouchID touchID, const char *name)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
static char text[MAX_TEXT_LENGTH]
int requested_fullscreen_mode
GLint GLint GLint GLint GLint GLint y
#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT
override the binding element for keyboard inputs for Emscripten builds
#define SDL_arraysize(array)
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, int x, int y, SDL_MouseWheelDirection direction)
GLubyte GLubyte GLubyte GLubyte w
void Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
SDL_Scancode
The SDL keyboard scancode representation.
GLfloat GLfloat GLfloat GLfloat h