SDL_emscriptenevents.c
Go to the documentation of this file.
/*
Simple DirectMedia Layer
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_EMSCRIPTEN
#include <emscripten/html5.h>
#include "../../events/SDL_events_c.h"
#include "../../events/SDL_keyboard_c.h"
#include "../../events/SDL_touch_c.h"
#include "SDL_emscriptenevents.h"
#include "SDL_emscriptenvideo.h"
#include "SDL_hints.h"
#define FULLSCREEN_MASK ( SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN )
/*
.keyCode to scancode
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
*/
static const SDL_Scancode emscripten_scancode_table[] = {
/* 0 */ SDL_SCANCODE_UNKNOWN,
/* 1 */ SDL_SCANCODE_UNKNOWN,
/* 2 */ SDL_SCANCODE_UNKNOWN,
/* 3 */ SDL_SCANCODE_CANCEL,
/* 4 */ SDL_SCANCODE_UNKNOWN,
/* 5 */ SDL_SCANCODE_UNKNOWN,
/* 6 */ SDL_SCANCODE_HELP,
/* 7 */ SDL_SCANCODE_UNKNOWN,
/* 8 */ SDL_SCANCODE_BACKSPACE,
/* 9 */ SDL_SCANCODE_TAB,
/* 10 */ SDL_SCANCODE_UNKNOWN,
/* 11 */ SDL_SCANCODE_UNKNOWN,
/* 12 */ SDL_SCANCODE_UNKNOWN,
/* 13 */ SDL_SCANCODE_RETURN,
/* 14 */ SDL_SCANCODE_UNKNOWN,
/* 15 */ SDL_SCANCODE_UNKNOWN,
/* 16 */ SDL_SCANCODE_LSHIFT,
/* 17 */ SDL_SCANCODE_LCTRL,
/* 18 */ SDL_SCANCODE_LALT,
/* 19 */ SDL_SCANCODE_PAUSE,
/* 20 */ SDL_SCANCODE_CAPSLOCK,
/* 21 */ SDL_SCANCODE_UNKNOWN,
/* 22 */ SDL_SCANCODE_UNKNOWN,
/* 23 */ SDL_SCANCODE_UNKNOWN,
/* 24 */ SDL_SCANCODE_UNKNOWN,
/* 25 */ SDL_SCANCODE_UNKNOWN,
/* 26 */ SDL_SCANCODE_UNKNOWN,
/* 27 */ SDL_SCANCODE_ESCAPE,
/* 28 */ SDL_SCANCODE_UNKNOWN,
/* 29 */ SDL_SCANCODE_UNKNOWN,
/* 30 */ SDL_SCANCODE_UNKNOWN,
/* 31 */ SDL_SCANCODE_UNKNOWN,
/* 32 */ SDL_SCANCODE_SPACE,
/* 33 */ SDL_SCANCODE_PAGEUP,
/* 34 */ SDL_SCANCODE_PAGEDOWN,
/* 35 */ SDL_SCANCODE_END,
/* 36 */ SDL_SCANCODE_HOME,
/* 37 */ SDL_SCANCODE_LEFT,
/* 38 */ SDL_SCANCODE_UP,
/* 39 */ SDL_SCANCODE_RIGHT,
/* 40 */ SDL_SCANCODE_DOWN,
/* 41 */ SDL_SCANCODE_UNKNOWN,
/* 42 */ SDL_SCANCODE_UNKNOWN,
/* 43 */ SDL_SCANCODE_UNKNOWN,
/* 44 */ SDL_SCANCODE_UNKNOWN,
/* 45 */ SDL_SCANCODE_INSERT,
/* 46 */ SDL_SCANCODE_DELETE,
/* 47 */ SDL_SCANCODE_UNKNOWN,
/* 48 */ SDL_SCANCODE_0,
/* 49 */ SDL_SCANCODE_1,
/* 50 */ SDL_SCANCODE_2,
/* 51 */ SDL_SCANCODE_3,
/* 52 */ SDL_SCANCODE_4,
/* 53 */ SDL_SCANCODE_5,
/* 54 */ SDL_SCANCODE_6,
/* 55 */ SDL_SCANCODE_7,
/* 56 */ SDL_SCANCODE_8,
/* 57 */ SDL_SCANCODE_9,
/* 58 */ SDL_SCANCODE_UNKNOWN,
/* 59 */ SDL_SCANCODE_SEMICOLON,
/* 60 */ SDL_SCANCODE_UNKNOWN,
/* 61 */ SDL_SCANCODE_EQUALS,
/* 62 */ SDL_SCANCODE_UNKNOWN,
/* 63 */ SDL_SCANCODE_UNKNOWN,
/* 64 */ SDL_SCANCODE_UNKNOWN,
/* 65 */ SDL_SCANCODE_A,
/* 66 */ SDL_SCANCODE_B,
/* 67 */ SDL_SCANCODE_C,
/* 68 */ SDL_SCANCODE_D,
/* 69 */ SDL_SCANCODE_E,
/* 70 */ SDL_SCANCODE_F,
/* 71 */ SDL_SCANCODE_G,
/* 72 */ SDL_SCANCODE_H,
/* 73 */ SDL_SCANCODE_I,
/* 74 */ SDL_SCANCODE_J,
/* 75 */ SDL_SCANCODE_K,
/* 76 */ SDL_SCANCODE_L,
/* 77 */ SDL_SCANCODE_M,
/* 78 */ SDL_SCANCODE_N,
/* 79 */ SDL_SCANCODE_O,
/* 80 */ SDL_SCANCODE_P,
/* 81 */ SDL_SCANCODE_Q,
/* 82 */ SDL_SCANCODE_R,
/* 83 */ SDL_SCANCODE_S,
/* 84 */ SDL_SCANCODE_T,
/* 85 */ SDL_SCANCODE_U,
/* 86 */ SDL_SCANCODE_V,
/* 87 */ SDL_SCANCODE_W,
/* 88 */ SDL_SCANCODE_X,
/* 89 */ SDL_SCANCODE_Y,
/* 90 */ SDL_SCANCODE_Z,
/* 91 */ SDL_SCANCODE_LGUI,
/* 92 */ SDL_SCANCODE_UNKNOWN,
/* 93 */ SDL_SCANCODE_APPLICATION,
/* 94 */ SDL_SCANCODE_UNKNOWN,
/* 95 */ SDL_SCANCODE_UNKNOWN,
/* 96 */ SDL_SCANCODE_KP_0,
/* 97 */ SDL_SCANCODE_KP_1,
/* 98 */ SDL_SCANCODE_KP_2,
/* 99 */ SDL_SCANCODE_KP_3,
/* 100 */ SDL_SCANCODE_KP_4,
/* 101 */ SDL_SCANCODE_KP_5,
/* 102 */ SDL_SCANCODE_KP_6,
/* 103 */ SDL_SCANCODE_KP_7,
/* 104 */ SDL_SCANCODE_KP_8,
/* 105 */ SDL_SCANCODE_KP_9,
/* 106 */ SDL_SCANCODE_KP_MULTIPLY,
/* 107 */ SDL_SCANCODE_KP_PLUS,
/* 108 */ SDL_SCANCODE_UNKNOWN,
/* 109 */ SDL_SCANCODE_KP_MINUS,
/* 110 */ SDL_SCANCODE_KP_PERIOD,
/* 111 */ SDL_SCANCODE_KP_DIVIDE,
/* 112 */ SDL_SCANCODE_F1,
/* 113 */ SDL_SCANCODE_F2,
/* 114 */ SDL_SCANCODE_F3,
/* 115 */ SDL_SCANCODE_F4,
/* 116 */ SDL_SCANCODE_F5,
/* 117 */ SDL_SCANCODE_F6,
/* 118 */ SDL_SCANCODE_F7,
/* 119 */ SDL_SCANCODE_F8,
/* 120 */ SDL_SCANCODE_F9,
/* 121 */ SDL_SCANCODE_F10,
/* 122 */ SDL_SCANCODE_F11,
/* 123 */ SDL_SCANCODE_F12,
/* 124 */ SDL_SCANCODE_F13,
/* 125 */ SDL_SCANCODE_F14,
/* 126 */ SDL_SCANCODE_F15,
/* 127 */ SDL_SCANCODE_F16,
/* 128 */ SDL_SCANCODE_F17,
/* 129 */ SDL_SCANCODE_F18,
/* 130 */ SDL_SCANCODE_F19,
/* 131 */ SDL_SCANCODE_F20,
/* 132 */ SDL_SCANCODE_F21,
/* 133 */ SDL_SCANCODE_F22,
/* 134 */ SDL_SCANCODE_F23,
/* 135 */ SDL_SCANCODE_F24,
/* 136 */ SDL_SCANCODE_UNKNOWN,
/* 137 */ SDL_SCANCODE_UNKNOWN,
/* 138 */ SDL_SCANCODE_UNKNOWN,
/* 139 */ SDL_SCANCODE_UNKNOWN,
/* 140 */ SDL_SCANCODE_UNKNOWN,
/* 141 */ SDL_SCANCODE_UNKNOWN,
/* 142 */ SDL_SCANCODE_UNKNOWN,
/* 143 */ SDL_SCANCODE_UNKNOWN,
/* 144 */ SDL_SCANCODE_NUMLOCKCLEAR,
/* 145 */ SDL_SCANCODE_SCROLLLOCK,
/* 146 */ SDL_SCANCODE_UNKNOWN,
/* 147 */ SDL_SCANCODE_UNKNOWN,
/* 148 */ SDL_SCANCODE_UNKNOWN,
/* 149 */ SDL_SCANCODE_UNKNOWN,
/* 150 */ SDL_SCANCODE_UNKNOWN,
/* 151 */ SDL_SCANCODE_UNKNOWN,
/* 152 */ SDL_SCANCODE_UNKNOWN,
/* 153 */ SDL_SCANCODE_UNKNOWN,
/* 154 */ SDL_SCANCODE_UNKNOWN,
/* 155 */ SDL_SCANCODE_UNKNOWN,
/* 156 */ SDL_SCANCODE_UNKNOWN,
/* 157 */ SDL_SCANCODE_UNKNOWN,
/* 158 */ SDL_SCANCODE_UNKNOWN,
/* 159 */ SDL_SCANCODE_UNKNOWN,
/* 160 */ SDL_SCANCODE_UNKNOWN,
/* 161 */ SDL_SCANCODE_UNKNOWN,
/* 162 */ SDL_SCANCODE_UNKNOWN,
/* 163 */ SDL_SCANCODE_UNKNOWN,
/* 164 */ SDL_SCANCODE_UNKNOWN,
/* 165 */ SDL_SCANCODE_UNKNOWN,
/* 166 */ SDL_SCANCODE_UNKNOWN,
/* 167 */ SDL_SCANCODE_UNKNOWN,
/* 168 */ SDL_SCANCODE_UNKNOWN,
/* 169 */ SDL_SCANCODE_UNKNOWN,
/* 170 */ SDL_SCANCODE_UNKNOWN,
/* 171 */ SDL_SCANCODE_UNKNOWN,
/* 172 */ SDL_SCANCODE_UNKNOWN,
/* 173 */ SDL_SCANCODE_MINUS, /*FX*/
/* 174 */ SDL_SCANCODE_VOLUMEDOWN, /*IE, Chrome*/
/* 175 */ SDL_SCANCODE_VOLUMEUP, /*IE, Chrome*/
/* 176 */ SDL_SCANCODE_AUDIONEXT, /*IE, Chrome*/
/* 177 */ SDL_SCANCODE_AUDIOPREV, /*IE, Chrome*/
/* 178 */ SDL_SCANCODE_UNKNOWN,
/* 179 */ SDL_SCANCODE_AUDIOPLAY, /*IE, Chrome*/
/* 180 */ SDL_SCANCODE_UNKNOWN,
/* 181 */ SDL_SCANCODE_AUDIOMUTE, /*FX*/
/* 182 */ SDL_SCANCODE_VOLUMEDOWN, /*FX*/
/* 183 */ SDL_SCANCODE_VOLUMEUP, /*FX*/
/* 184 */ SDL_SCANCODE_UNKNOWN,
/* 185 */ SDL_SCANCODE_UNKNOWN,
/* 186 */ SDL_SCANCODE_SEMICOLON, /*IE, Chrome, D3E legacy*/
/* 187 */ SDL_SCANCODE_EQUALS, /*IE, Chrome, D3E legacy*/
/* 188 */ SDL_SCANCODE_COMMA,
/* 189 */ SDL_SCANCODE_MINUS, /*IE, Chrome, D3E legacy*/
/* 190 */ SDL_SCANCODE_PERIOD,
/* 191 */ SDL_SCANCODE_SLASH,
/* 192 */ SDL_SCANCODE_GRAVE, /*FX, D3E legacy (SDL_SCANCODE_APOSTROPHE in IE/Chrome)*/
/* 193 */ SDL_SCANCODE_UNKNOWN,
/* 194 */ SDL_SCANCODE_UNKNOWN,
/* 195 */ SDL_SCANCODE_UNKNOWN,
/* 196 */ SDL_SCANCODE_UNKNOWN,
/* 197 */ SDL_SCANCODE_UNKNOWN,
/* 198 */ SDL_SCANCODE_UNKNOWN,
/* 199 */ SDL_SCANCODE_UNKNOWN,
/* 200 */ SDL_SCANCODE_UNKNOWN,
/* 201 */ SDL_SCANCODE_UNKNOWN,
/* 202 */ SDL_SCANCODE_UNKNOWN,
/* 203 */ SDL_SCANCODE_UNKNOWN,
/* 204 */ SDL_SCANCODE_UNKNOWN,
/* 205 */ SDL_SCANCODE_UNKNOWN,
/* 206 */ SDL_SCANCODE_UNKNOWN,
/* 207 */ SDL_SCANCODE_UNKNOWN,
/* 208 */ SDL_SCANCODE_UNKNOWN,
/* 209 */ SDL_SCANCODE_UNKNOWN,
/* 210 */ SDL_SCANCODE_UNKNOWN,
/* 211 */ SDL_SCANCODE_UNKNOWN,
/* 212 */ SDL_SCANCODE_UNKNOWN,
/* 213 */ SDL_SCANCODE_UNKNOWN,
/* 214 */ SDL_SCANCODE_UNKNOWN,
/* 215 */ SDL_SCANCODE_UNKNOWN,
/* 216 */ SDL_SCANCODE_UNKNOWN,
/* 217 */ SDL_SCANCODE_UNKNOWN,
/* 218 */ SDL_SCANCODE_UNKNOWN,
/* 219 */ SDL_SCANCODE_LEFTBRACKET,
/* 220 */ SDL_SCANCODE_BACKSLASH,
/* 221 */ SDL_SCANCODE_RIGHTBRACKET,
/* 222 */ SDL_SCANCODE_APOSTROPHE, /*FX, D3E legacy*/
};
/* "borrowed" from SDL_windowsevents.c */
static int
Emscripten_ConvertUTF32toUTF8(Uint32 codepoint, char * text)
{
if (codepoint <= 0x7F) {
text[0] = (char) codepoint;
text[1] = '\0';
} else if (codepoint <= 0x7FF) {
text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F);
text[1] = 0x80 | (char) (codepoint & 0x3F);
text[2] = '\0';
} else if (codepoint <= 0xFFFF) {
text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F);
text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
text[2] = 0x80 | (char) (codepoint & 0x3F);
text[3] = '\0';
} else if (codepoint <= 0x10FFFF) {
text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F);
text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F);
text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
text[3] = 0x80 | (char) (codepoint & 0x3F);
text[4] = '\0';
} else {
return SDL_FALSE;
}
return SDL_TRUE;
}
static EM_BOOL
Emscripten_HandlePointerLockChange(int eventType, const EmscriptenPointerlockChangeEvent *changeEvent, void *userData)
{
SDL_WindowData *window_data = (SDL_WindowData *) userData;
/* keep track of lock losses, so we can regrab if/when appropriate. */
window_data->has_pointer_lock = changeEvent->isActive;
return 0;
}
static EM_BOOL
Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
{
SDL_WindowData *window_data = userData;
const int isPointerLocked = window_data->has_pointer_lock;
int mx, my;
static double residualx = 0, residualy = 0;
/* rescale (in case canvas is being scaled)*/
double client_w, client_h, xscale, yscale;
emscripten_get_element_css_size(NULL, &client_w, &client_h);
xscale = window_data->window->w / client_w;
yscale = window_data->window->h / client_h;
if (isPointerLocked) {
residualx += mouseEvent->movementX * xscale;
residualy += mouseEvent->movementY * yscale;
/* Let slow sub-pixel motion accumulate. Don't lose it. */
mx = residualx;
residualx -= mx;
my = residualy;
residualy -= my;
} else {
mx = mouseEvent->canvasX * xscale;
my = mouseEvent->canvasY * yscale;
}
SDL_SendMouseMotion(window_data->window, 0, isPointerLocked, mx, my);
return 0;
}
static EM_BOOL
Emscripten_HandleMouseButton(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
{
SDL_WindowData *window_data = userData;
Uint8 sdl_button;
Uint8 sdl_button_state;
SDL_EventType sdl_event_type;
switch (mouseEvent->button) {
case 0:
sdl_button = SDL_BUTTON_LEFT;
break;
case 1:
sdl_button = SDL_BUTTON_MIDDLE;
break;
case 2:
sdl_button = SDL_BUTTON_RIGHT;
break;
default:
return 0;
}
if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) {
if (SDL_GetMouse()->relative_mode && !window_data->has_pointer_lock) {
emscripten_request_pointerlock(NULL, 0); /* try to regrab lost pointer lock. */
}
sdl_button_state = SDL_PRESSED;
sdl_event_type = SDL_MOUSEBUTTONDOWN;
} else {
sdl_button_state = SDL_RELEASED;
sdl_event_type = SDL_MOUSEBUTTONUP;
}
SDL_SendMouseButton(window_data->window, 0, sdl_button_state, sdl_button);
return SDL_GetEventState(sdl_event_type) == SDL_ENABLE;
}
static EM_BOOL
Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
{
SDL_WindowData *window_data = userData;
int mx = mouseEvent->canvasX, my = mouseEvent->canvasY;
const int isPointerLocked = window_data->has_pointer_lock;
if (!isPointerLocked) {
/* rescale (in case canvas is being scaled)*/
double client_w, client_h;
emscripten_get_element_css_size(NULL, &client_w, &client_h);
mx = mx * (window_data->window->w / client_w);
my = my * (window_data->window->h / client_h);
SDL_SendMouseMotion(window_data->window, 0, isPointerLocked, mx, my);
}
SDL_SetMouseFocus(eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? window_data->window : NULL);
return SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE;
}
static EM_BOOL
Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData)
{
SDL_WindowData *window_data = userData;
SDL_SendMouseWheel(window_data->window, 0, (float)wheelEvent->deltaX, (float)-wheelEvent->deltaY, SDL_MOUSEWHEEL_NORMAL);
return SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE;
}
static EM_BOOL
Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent *wheelEvent, void *userData)
{
SDL_WindowData *window_data = userData;
/* If the user switches away while keys are pressed (such as
* via Alt+Tab), key release events won't be received. */
if (eventType == EMSCRIPTEN_EVENT_BLUR) {
SDL_ResetKeyboard();
}
SDL_SendWindowEvent(window_data->window, eventType == EMSCRIPTEN_EVENT_FOCUS ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
return SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE;
}
static EM_BOOL
Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData)
{
SDL_WindowData *window_data = userData;
int i;
double client_w, client_h;
int preventDefault = 0;
SDL_TouchID deviceId = 1;
if (SDL_AddTouch(deviceId, "") < 0) {
return 0;
}
emscripten_get_element_css_size(NULL, &client_w, &client_h);
for (i = 0; i < touchEvent->numTouches; i++) {
SDL_FingerID id;
float x, y;
int mx, my;
if (!touchEvent->touches[i].isChanged)
continue;
id = touchEvent->touches[i].identifier;
x = touchEvent->touches[i].canvasX / client_w;
y = touchEvent->touches[i].canvasY / client_h;
mx = x * window_data->window->w;
my = y * window_data->window->h;
if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
if (!window_data->finger_touching) {
window_data->finger_touching = SDL_TRUE;
window_data->first_finger = id;
SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, mx, my);
SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);
}
SDL_SendTouch(deviceId, id, SDL_TRUE, x, y, 1.0f);
if (!preventDefault && SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) {
preventDefault = 1;
}
} else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
if ((window_data->finger_touching) && (window_data->first_finger == id)) {
SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, mx, my);
}
SDL_SendTouchMotion(deviceId, id, x, y, 1.0f);
if (!preventDefault && SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {
preventDefault = 1;
}
} else {
if ((window_data->finger_touching) && (window_data->first_finger == id)) {
SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
window_data->finger_touching = SDL_FALSE;
}
SDL_SendTouch(deviceId, id, SDL_FALSE, x, y, 1.0f);
if (!preventDefault && SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
preventDefault = 1;
}
}
}
return preventDefault;
}
static EM_BOOL
Emscripten_HandleKey(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
{
Uint32 scancode;
SDL_bool prevent_default;
SDL_bool is_nav_key;
/* .keyCode is deprecated, but still the most reliable way to get keys */
if (keyEvent->keyCode < SDL_arraysize(emscripten_scancode_table)) {
scancode = emscripten_scancode_table[keyEvent->keyCode];
if (scancode != SDL_SCANCODE_UNKNOWN) {
if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) {
switch (scancode) {
case SDL_SCANCODE_LSHIFT:
scancode = SDL_SCANCODE_RSHIFT;
break;
case SDL_SCANCODE_LCTRL:
scancode = SDL_SCANCODE_RCTRL;
break;
case SDL_SCANCODE_LALT:
scancode = SDL_SCANCODE_RALT;
break;
case SDL_SCANCODE_LGUI:
scancode = SDL_SCANCODE_RGUI;
break;
}
}
SDL_SendKeyboardKey(eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_PRESSED : SDL_RELEASED, scancode);
}
}
prevent_default = SDL_GetEventState(eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_KEYDOWN : SDL_KEYUP) == SDL_ENABLE;
/* if TEXTINPUT events are enabled we can't prevent keydown or we won't get keypress
* we need to ALWAYS prevent backspace and tab otherwise chrome takes action and does bad navigation UX
*/
is_nav_key = keyEvent->keyCode == 8 /* backspace */ ||
keyEvent->keyCode == 9 /* tab */ ||
keyEvent->keyCode == 37 /* left */ ||
keyEvent->keyCode == 38 /* up */ ||
keyEvent->keyCode == 39 /* right */ ||
keyEvent->keyCode == 40 /* down */;
if (eventType == EMSCRIPTEN_EVENT_KEYDOWN && SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE && !is_nav_key)
prevent_default = SDL_FALSE;
return prevent_default;
}
static EM_BOOL
Emscripten_HandleKeyPress(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
{
char text[5];
if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) {
SDL_SendKeyboardText(text);
}
return SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE;
}
static EM_BOOL
Emscripten_HandleFullscreenChange(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData)
{
SDL_WindowData *window_data = userData;
if(fullscreenChangeEvent->isFullscreen)
{
window_data->window->flags |= window_data->requested_fullscreen_mode;
window_data->requested_fullscreen_mode = 0;
if(!window_data->requested_fullscreen_mode)
window_data->window->flags |= SDL_WINDOW_FULLSCREEN; /*we didn't reqest fullscreen*/
}
else
{
window_data->window->flags &= ~FULLSCREEN_MASK;
}
return 0;
}
static EM_BOOL
Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
{
SDL_WindowData *window_data = userData;
/* update pixel ratio */
if (window_data->window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
window_data->pixel_ratio = emscripten_get_device_pixel_ratio();
}
if(!(window_data->window->flags & FULLSCREEN_MASK))
{
/* this will only work if the canvas size is set through css */
if(window_data->window->flags & SDL_WINDOW_RESIZABLE)
{
double w = window_data->window->w;
double h = window_data->window->h;
if(window_data->external_size) {
emscripten_get_element_css_size(NULL, &w, &h);
}
emscripten_set_canvas_size(w * window_data->pixel_ratio, h * window_data->pixel_ratio);
/* set_canvas_size unsets this */
if (!window_data->external_size && window_data->pixel_ratio != 1.0f) {
emscripten_set_element_css_size(NULL, w, h);
}
SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, w, h);
}
}
return 0;
}
EM_BOOL
Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
{
/*this is used during fullscreen changes*/
SDL_WindowData *window_data = userData;
if(window_data->fullscreen_resize)
{
double css_w, css_h;
emscripten_get_element_css_size(NULL, &css_w, &css_h);
SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, css_w, css_h);
}
return 0;
}
static EM_BOOL
Emscripten_HandleVisibilityChange(int eventType, const EmscriptenVisibilityChangeEvent *visEvent, void *userData)
{
SDL_WindowData *window_data = userData;
SDL_SendWindowEvent(window_data->window, visEvent->hidden ? SDL_WINDOWEVENT_HIDDEN : SDL_WINDOWEVENT_SHOWN, 0, 0);
return 0;
}
void
Emscripten_RegisterEventHandlers(SDL_WindowData *data)
{
const char *keyElement;
/* There is only one window and that window is the canvas */
emscripten_set_mousemove_callback("#canvas", data, 0, Emscripten_HandleMouseMove);
emscripten_set_mousedown_callback("#canvas", data, 0, Emscripten_HandleMouseButton);
emscripten_set_mouseup_callback("#document", data, 0, Emscripten_HandleMouseButton);
emscripten_set_mouseenter_callback("#canvas", data, 0, Emscripten_HandleMouseFocus);
emscripten_set_mouseleave_callback("#canvas", data, 0, Emscripten_HandleMouseFocus);
emscripten_set_wheel_callback("#canvas", data, 0, Emscripten_HandleWheel);
emscripten_set_focus_callback("#window", data, 0, Emscripten_HandleFocus);
emscripten_set_blur_callback("#window", data, 0, Emscripten_HandleFocus);
emscripten_set_touchstart_callback("#canvas", data, 0, Emscripten_HandleTouch);
emscripten_set_touchend_callback("#canvas", data, 0, Emscripten_HandleTouch);
emscripten_set_touchmove_callback("#canvas", data, 0, Emscripten_HandleTouch);
emscripten_set_touchcancel_callback("#canvas", data, 0, Emscripten_HandleTouch);
emscripten_set_pointerlockchange_callback("#document", data, 0, Emscripten_HandlePointerLockChange);
/* Keyboard events are awkward */
keyElement = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT);
if (!keyElement) keyElement = "#window";
emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
emscripten_set_fullscreenchange_callback("#document", data, 0, Emscripten_HandleFullscreenChange);
emscripten_set_resize_callback("#window", data, 0, Emscripten_HandleResize);
emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
}
void
Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
{
const char *target;
/* only works due to having one window */
emscripten_set_mousemove_callback("#canvas", NULL, 0, NULL);
emscripten_set_mousedown_callback("#canvas", NULL, 0, NULL);
emscripten_set_mouseup_callback("#document", NULL, 0, NULL);
emscripten_set_mouseenter_callback("#canvas", NULL, 0, NULL);
emscripten_set_mouseleave_callback("#canvas", NULL, 0, NULL);
emscripten_set_wheel_callback("#canvas", NULL, 0, NULL);
emscripten_set_focus_callback("#window", NULL, 0, NULL);
emscripten_set_blur_callback("#window", NULL, 0, NULL);
emscripten_set_touchstart_callback("#canvas", NULL, 0, NULL);
emscripten_set_touchend_callback("#canvas", NULL, 0, NULL);
emscripten_set_touchmove_callback("#canvas", NULL, 0, NULL);
emscripten_set_touchcancel_callback("#canvas", NULL, 0, NULL);
emscripten_set_pointerlockchange_callback("#document", NULL, 0, NULL);
target = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT);
if (!target) {
target = "#window";
}
emscripten_set_keydown_callback(target, NULL, 0, NULL);
emscripten_set_keyup_callback(target, NULL, 0, NULL);
emscripten_set_keypress_callback(target, NULL, 0, NULL);
emscripten_set_fullscreenchange_callback("#document", NULL, 0, NULL);
emscripten_set_resize_callback("#window", NULL, 0, NULL);
emscripten_set_visibilitychange_callback(NULL, 0, NULL);
}
#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */
/* vi: set ts=4 sw=4 expandtab: */
SDL_SCANCODE_AUDIONEXT
Definition: SDL_scancode.h:351
SDL_SCANCODE_O
Definition: SDL_scancode.h:68
SDL_SCANCODE_F17
Definition: SDL_scancode.h:219
SDL_SCANCODE_RETURN
Definition: SDL_scancode.h:92
id
GLuint id
Definition: SDL_opengl_glext.h:528
SDL_SCANCODE_F13
Definition: SDL_scancode.h:215
SDL_SCANCODE_F10
Definition: SDL_scancode.h:162
SDL_SCANCODE_K
Definition: SDL_scancode.h:64
SDL_SCANCODE_5
Definition: SDL_scancode.h:85
SDL_GetMouse
SDL_Mouse * SDL_GetMouse(void)
Definition: SDL_mouse.c:112
SDL_KEYDOWN
Definition: SDL_events.h:93
SDL_SCANCODE_KP_PERIOD
Definition: SDL_scancode.h:198
SDL_SCANCODE_3
Definition: SDL_scancode.h:83
SDL_WindowData::pixel_ratio
float pixel_ratio
Definition: SDL_emscriptenvideo.h:43
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_SCANCODE_BACKSLASH
Definition: SDL_scancode.h:102
SDL_SCANCODE_HELP
Definition: SDL_scancode.h:228
SDL_SCANCODE_SLASH
Definition: SDL_scancode.h:149
SDL_MOUSEBUTTONUP
Definition: SDL_events.h:104
SDL_SCANCODE_U
Definition: SDL_scancode.h:74
SDL_SCANCODE_6
Definition: SDL_scancode.h:86
SDL_emscriptenvideo.h
SDL_SCANCODE_PERIOD
Definition: SDL_scancode.h:148
SDL_SCANCODE_LEFT
Definition: SDL_scancode.h:177
SDL_Window::w
int w
Definition: SDL_sysvideo.h:80
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
Emscripten_HandleCanvasResize
EM_BOOL Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
SDL_SCANCODE_VOLUMEDOWN
Definition: SDL_scancode.h:240
SDL_FingerID
Sint64 SDL_FingerID
Definition: SDL_touch.h:42
SDL_SCANCODE_F7
Definition: SDL_scancode.h:159
SDL_SCANCODE_F15
Definition: SDL_scancode.h:217
SDL_SCANCODE_N
Definition: SDL_scancode.h:67
SDL_WindowData::has_pointer_lock
SDL_bool has_pointer_lock
Definition: SDL_emscriptenvideo.h:53
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_SCANCODE_KP_8
Definition: SDL_scancode.h:195
h
GLfloat GLfloat GLfloat GLfloat h
Definition: SDL_opengl_glext.h:1946
SDL_SCANCODE_UP
Definition: SDL_scancode.h:179
SDL_SCANCODE_SCROLLLOCK
Definition: SDL_scancode.h:167
SDL_MOUSEWHEEL_NORMAL
Definition: SDL_mouse.h:68
SDL_BUTTON_RIGHT
#define SDL_BUTTON_RIGHT
Definition: SDL_mouse.h:284
SDL_SCANCODE_4
Definition: SDL_scancode.h:84
SDL_MOUSEBUTTONDOWN
Definition: SDL_events.h:103
SDL_SCANCODE_EQUALS
Definition: SDL_scancode.h:99
SDL_SCANCODE_RIGHT
Definition: SDL_scancode.h:176
SDL_GetHint
#define SDL_GetHint
Definition: SDL_dynapi_overrides.h:191
SDL_SendTouch
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
Definition: SDL_touch.c:222
SDL_SCANCODE_SEMICOLON
Definition: SDL_scancode.h:128
SDL_SCANCODE_7
Definition: SDL_scancode.h:87
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_SCANCODE_PAGEDOWN
Definition: SDL_scancode.h:175
SDL_SCANCODE_F3
Definition: SDL_scancode.h:155
f
GLfloat f
Definition: SDL_opengl_glext.h:1870
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_SendWindowEvent
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
Definition: SDL_windowevents.c:88
SDL_WindowData::window
SDL_Window * window
Definition: SDL_cocoawindow.h:114
SDL_emscriptenevents.h
SDL_SetMouseFocus
void SDL_SetMouseFocus(SDL_Window *window)
Definition: SDL_mouse.c:151
SDL_SCANCODE_Z
Definition: SDL_scancode.h:79
SDL_SCANCODE_KP_5
Definition: SDL_scancode.h:192
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_TOUCH_MOUSEID
#define SDL_TOUCH_MOUSEID
Definition: SDL_touch.h:53
SDL_MOUSEWHEEL
Definition: SDL_events.h:105
SDL_SCANCODE_CANCEL
Definition: SDL_scancode.h:270
SDL_WindowData::first_finger
SDL_FingerID first_finger
Definition: SDL_emscriptenvideo.h:51
SDL_SCANCODE_TAB
Definition: SDL_scancode.h:95
SDL_SCANCODE_GRAVE
Definition: SDL_scancode.h:130
Emscripten_RegisterEventHandlers
void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
SDL_SCANCODE_F9
Definition: SDL_scancode.h:161
SDL_SCANCODE_CAPSLOCK
Definition: SDL_scancode.h:151
SDL_SCANCODE_I
Definition: SDL_scancode.h:62
SDL_SCANCODE_VOLUMEUP
Definition: SDL_scancode.h:239
SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
SDL_SCANCODE_F18
Definition: SDL_scancode.h:220
SDL_SCANCODE_F16
Definition: SDL_scancode.h:218
SDL_SCANCODE_KP_6
Definition: SDL_scancode.h:193
SDL_SCANCODE_F5
Definition: SDL_scancode.h:157
SDL_SCANCODE_LALT
Definition: SDL_scancode.h:330
SDL_SendKeyboardKey
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
Definition: SDL_keyboard.c:679
SDL_SCANCODE_W
Definition: SDL_scancode.h:76
SDL_SendTouchMotion
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure)
Definition: SDL_touch.c:284
SDL_WindowData
Definition: SDL_androidwindow.h:35
SDL_SCANCODE_9
Definition: SDL_scancode.h:89
SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
SDL_SCANCODE_V
Definition: SDL_scancode.h:75
SDL_SCANCODE_KP_1
Definition: SDL_scancode.h:188
SDL_SCANCODE_P
Definition: SDL_scancode.h:69
SDL_SCANCODE_F21
Definition: SDL_scancode.h:223
SDL_FINGERDOWN
Definition: SDL_events.h:125
SDL_SCANCODE_F24
Definition: SDL_scancode.h:226
SDL_SCANCODE_H
Definition: SDL_scancode.h:61
SDL_SCANCODE_A
Definition: SDL_scancode.h:54
SDL_SCANCODE_RIGHTBRACKET
Definition: SDL_scancode.h:101
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
SDL_SCANCODE_F14
Definition: SDL_scancode.h:216
SDL_SCANCODE_ESCAPE
Definition: SDL_scancode.h:93
SDL_SCANCODE_SPACE
Definition: SDL_scancode.h:96
SDL_SendMouseMotion
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
Definition: SDL_mouse.c:237
SDL_SCANCODE_MINUS
Definition: SDL_scancode.h:98
SDL_BUTTON_LEFT
#define SDL_BUTTON_LEFT
Definition: SDL_mouse.h:282
SDL_SCANCODE_PAUSE
Definition: SDL_scancode.h:168
SDL_SCANCODE_KP_MULTIPLY
Definition: SDL_scancode.h:184
SDL_SCANCODE_S
Definition: SDL_scancode.h:72
SDL_SCANCODE_0
Definition: SDL_scancode.h:90
SDL_SCANCODE_R
Definition: SDL_scancode.h:71
SDL_SCANCODE_KP_9
Definition: SDL_scancode.h:196
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_SendKeyboardText
int SDL_SendKeyboardText(const char *text)
Definition: SDL_keyboard.c:789
SDL_WindowData::external_size
SDL_bool external_size
Definition: SDL_emscriptenvideo.h:45
SDL_SCANCODE_F20
Definition: SDL_scancode.h:222
SDL_SCANCODE_E
Definition: SDL_scancode.h:58
SDL_KEYUP
Definition: SDL_events.h:94
SDL_SCANCODE_C
Definition: SDL_scancode.h:56
SDL_SCANCODE_KP_7
Definition: SDL_scancode.h:194
SDL_SCANCODE_T
Definition: SDL_scancode.h:73
SDL_WINDOW_ALLOW_HIGHDPI
Definition: SDL_video.h:113
SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
SDL_SCANCODE_KP_PLUS
Definition: SDL_scancode.h:186
SDL_hints.h
w
GLubyte GLubyte GLubyte GLubyte w
Definition: SDL_opengl_glext.h:731
SDL_EventType
SDL_EventType
The types of events that can be delivered.
Definition: SDL_events.h:55
SDL_WINDOWEVENT
Definition: SDL_events.h:89
SDL_SCANCODE_KP_4
Definition: SDL_scancode.h:191
SDL_SCANCODE_KP_0
Definition: SDL_scancode.h:197
SDL_TouchID
Sint64 SDL_TouchID
Definition: SDL_touch.h:41
SDL_SCANCODE_F11
Definition: SDL_scancode.h:163
SDL_BUTTON_MIDDLE
#define SDL_BUTTON_MIDDLE
Definition: SDL_mouse.h:283
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
SDL_SCANCODE_LCTRL
Definition: SDL_scancode.h:328
SDL_SCANCODE_Y
Definition: SDL_scancode.h:78
SDL_SCANCODE_KP_DIVIDE
Definition: SDL_scancode.h:183
SDL_FINGERMOTION
Definition: SDL_events.h:127
SDL_AddTouch
int SDL_AddTouch(SDL_TouchID touchID, const char *name)
Definition: SDL_touch.c:136
SDL_SCANCODE_LSHIFT
Definition: SDL_scancode.h:329
SDL_SCANCODE_BACKSPACE
Definition: SDL_scancode.h:94
SDL_SCANCODE_LEFTBRACKET
Definition: SDL_scancode.h:100
SDL_Window::h
int h
Definition: SDL_sysvideo.h:80
i
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)
Definition: SDL_x11sym.h:50
SDL_SCANCODE_F
Definition: SDL_scancode.h:59
target
GLenum target
Definition: SDL_opengl_glext.h:1551
NULL
#define NULL
Definition: begin_code.h:164
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_SendMouseWheel
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, float x, float y, SDL_MouseWheelDirection direction)
Definition: SDL_mouse.c:512
SDL_SCANCODE_X
Definition: SDL_scancode.h:77
SDL_WINDOW_RESIZABLE
Definition: SDL_video.h:105
SDL_SCANCODE_UNKNOWN
Definition: SDL_scancode.h:45
SDL_SCANCODE_AUDIOMUTE
Definition: SDL_scancode.h:355
SDL_FINGERUP
Definition: SDL_events.h:126
text
static char text[MAX_TEXT_LENGTH]
Definition: testime.c:47
SDL_WindowData::requested_fullscreen_mode
int requested_fullscreen_mode
Definition: SDL_emscriptenvideo.h:47
SDL_SCANCODE_M
Definition: SDL_scancode.h:66
SDL_SCANCODE_NUMLOCKCLEAR
Definition: SDL_scancode.h:181
SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
SDL_TEXTINPUT
Definition: SDL_events.h:96
SDL_SCANCODE_DELETE
Definition: SDL_scancode.h:173
SDL_SCANCODE_F8
Definition: SDL_scancode.h:160
SDL_SCANCODE_LGUI
Definition: SDL_scancode.h:331
SDL_ResetKeyboard
void SDL_ResetKeyboard(void)
Definition: SDL_keyboard.c:572
SDL_SCANCODE_F23
Definition: SDL_scancode.h:225
SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT
#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT
override the binding element for keyboard inputs for Emscripten builds
Definition: SDL_hints.h:779
SDL_SCANCODE_G
Definition: SDL_scancode.h:60
SDL_SCANCODE_1
Definition: SDL_scancode.h:81
SDL_SCANCODE_RGUI
Definition: SDL_scancode.h:335
SDL_SCANCODE_APPLICATION
Definition: SDL_scancode.h:210
SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:100
SDL_SCANCODE_F2
Definition: SDL_scancode.h:154
SDL_SCANCODE_COMMA
Definition: SDL_scancode.h:147
SDL_SCANCODE_B
Definition: SDL_scancode.h:55
yscale
GLenum GLenum GLuint GLint GLint GLint yscale
Definition: gl2ext.h:2243
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
SDL_SCANCODE_PAGEUP
Definition: SDL_scancode.h:172
SDL_SCANCODE_INSERT
Definition: SDL_scancode.h:169
SDL_SCANCODE_DOWN
Definition: SDL_scancode.h:178
SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
SDL_SCANCODE_F1
Definition: SDL_scancode.h:153
SDL_SCANCODE_F6
Definition: SDL_scancode.h:158
SDL_SCANCODE_J
Definition: SDL_scancode.h:63
SDL_SCANCODE_2
Definition: SDL_scancode.h:82
SDL_SCANCODE_END
Definition: SDL_scancode.h:174
xscale
GLenum GLenum GLuint GLint GLint xscale
Definition: gl2ext.h:2243
SDL_SCANCODE_L
Definition: SDL_scancode.h:65
SDL_SCANCODE_APOSTROPHE
Definition: SDL_scancode.h:129
FULLSCREEN_MASK
#define FULLSCREEN_MASK
Definition: SDL_video.c:147
SDL_PRESSED
#define SDL_PRESSED
Definition: SDL_events.h:50
SDL_SCANCODE_D
Definition: SDL_scancode.h:57
Emscripten_UnregisterEventHandlers
void Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
SDL_SCANCODE_Q
Definition: SDL_scancode.h:70
SDL_SCANCODE_F12
Definition: SDL_scancode.h:164
SDL_Window::flags
Uint32 flags
Definition: SDL_sysvideo.h:83
SDL_RELEASED
#define SDL_RELEASED
Definition: SDL_events.h:49
SDL_SCANCODE_F19
Definition: SDL_scancode.h:221
SDL_SCANCODE_KP_3
Definition: SDL_scancode.h:190
SDL_WindowData::finger_touching
SDL_bool finger_touching
Definition: SDL_emscriptenvideo.h:50
SDL_SCANCODE_F4
Definition: SDL_scancode.h:156
SDL_SendMouseButton
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
Definition: SDL_mouse.c:506
SDL_SCANCODE_AUDIOPLAY
Definition: SDL_scancode.h:354
SDL_SCANCODE_KP_2
Definition: SDL_scancode.h:189
SDL_SCANCODE_F22
Definition: SDL_scancode.h:224
SDL_Scancode
SDL_Scancode
The SDL keyboard scancode representation.
Definition: SDL_scancode.h:43
SDL_WindowData::fullscreen_resize
SDL_bool fullscreen_resize
Definition: SDL_emscriptenvideo.h:48
SDL_SCANCODE_RALT
Definition: SDL_scancode.h:334
SDL_SCANCODE_AUDIOPREV
Definition: SDL_scancode.h:352
SDL_SCANCODE_8
Definition: SDL_scancode.h:88
SDL_SCANCODE_RSHIFT
Definition: SDL_scancode.h:333
SDL_SCANCODE_RCTRL
Definition: SDL_scancode.h:332
SDL_SCANCODE_KP_MINUS
Definition: SDL_scancode.h:185
SDL_SCANCODE_HOME
Definition: SDL_scancode.h:171