src/video/emscripten/SDL_emscriptenevents.c
author Ryan C. Gordon <icculus@icculus.org>
Fri, 12 Aug 2016 19:59:00 -0400
changeset 10284 c09f06c4e8c8
parent 9998 f67cf37e9cd4
child 10316 76bcc22dc5e4
permissions -rw-r--r--
emscripten: send fake mouse events for touches, like other targets do.

(This really should be handled at the higher level and not in the individual
targets, but this fixes the immediate bug.)
icculus@9278
     1
/*
icculus@9278
     2
  Simple DirectMedia Layer
slouken@9998
     3
  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
icculus@9278
     4
icculus@9278
     5
  This software is provided 'as-is', without any express or implied
icculus@9278
     6
  warranty.  In no event will the authors be held liable for any damages
icculus@9278
     7
  arising from the use of this software.
icculus@9278
     8
icculus@9278
     9
  Permission is granted to anyone to use this software for any purpose,
icculus@9278
    10
  including commercial applications, and to alter it and redistribute it
icculus@9278
    11
  freely, subject to the following restrictions:
icculus@9278
    12
icculus@9278
    13
  1. The origin of this software must not be misrepresented; you must not
icculus@9278
    14
     claim that you wrote the original software. If you use this software
icculus@9278
    15
     in a product, an acknowledgment in the product documentation would be
icculus@9278
    16
     appreciated but is not required.
icculus@9278
    17
  2. Altered source versions must be plainly marked as such, and must not be
icculus@9278
    18
     misrepresented as being the original software.
icculus@9278
    19
  3. This notice may not be removed or altered from any source distribution.
icculus@9278
    20
*/
icculus@9278
    21
icculus@9278
    22
icculus@9278
    23
#include "../../SDL_internal.h"
icculus@9278
    24
icculus@9278
    25
#if SDL_VIDEO_DRIVER_EMSCRIPTEN
icculus@9278
    26
icculus@9278
    27
#include <emscripten/html5.h>
icculus@9278
    28
icculus@9278
    29
#include "../../events/SDL_events_c.h"
icculus@9278
    30
#include "../../events/SDL_keyboard_c.h"
icculus@9278
    31
#include "../../events/SDL_touch_c.h"
icculus@9278
    32
icculus@9278
    33
#include "SDL_emscriptenevents.h"
icculus@9278
    34
#include "SDL_emscriptenvideo.h"
icculus@9278
    35
icculus@9278
    36
#include "SDL_hints.h"
icculus@9278
    37
icculus@9278
    38
#define FULLSCREEN_MASK ( SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN )
icculus@9278
    39
icculus@9278
    40
/*
philipp@9601
    41
.keyCode to scancode
philipp@9601
    42
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
philipp@9601
    43
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
icculus@9278
    44
*/
icculus@9278
    45
static const SDL_Scancode emscripten_scancode_table[] = {
icculus@9278
    46
    /*  0 */    SDL_SCANCODE_UNKNOWN,
icculus@9278
    47
    /*  1 */    SDL_SCANCODE_UNKNOWN,
icculus@9278
    48
    /*  2 */    SDL_SCANCODE_UNKNOWN,
icculus@9278
    49
    /*  3 */    SDL_SCANCODE_CANCEL,
icculus@9278
    50
    /*  4 */    SDL_SCANCODE_UNKNOWN,
icculus@9278
    51
    /*  5 */    SDL_SCANCODE_UNKNOWN,
icculus@9278
    52
    /*  6 */    SDL_SCANCODE_HELP,
icculus@9278
    53
    /*  7 */    SDL_SCANCODE_UNKNOWN,
icculus@9278
    54
    /*  8 */    SDL_SCANCODE_BACKSPACE,
icculus@9278
    55
    /*  9 */    SDL_SCANCODE_TAB,
icculus@9278
    56
    /*  10 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    57
    /*  11 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    58
    /*  12 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    59
    /*  13 */   SDL_SCANCODE_RETURN,
icculus@9278
    60
    /*  14 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    61
    /*  15 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    62
    /*  16 */   SDL_SCANCODE_LSHIFT,
icculus@9278
    63
    /*  17 */   SDL_SCANCODE_LCTRL,
icculus@9278
    64
    /*  18 */   SDL_SCANCODE_LALT,
icculus@9278
    65
    /*  19 */   SDL_SCANCODE_PAUSE,
icculus@9278
    66
    /*  20 */   SDL_SCANCODE_CAPSLOCK,
icculus@9278
    67
    /*  21 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    68
    /*  22 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    69
    /*  23 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    70
    /*  24 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    71
    /*  25 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    72
    /*  26 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    73
    /*  27 */   SDL_SCANCODE_ESCAPE,
icculus@9278
    74
    /*  28 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    75
    /*  29 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    76
    /*  30 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    77
    /*  31 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    78
    /*  32 */   SDL_SCANCODE_SPACE,
icculus@9278
    79
    /*  33 */   SDL_SCANCODE_PAGEUP,
icculus@9278
    80
    /*  34 */   SDL_SCANCODE_PAGEDOWN,
icculus@9278
    81
    /*  35 */   SDL_SCANCODE_END,
icculus@9278
    82
    /*  36 */   SDL_SCANCODE_HOME,
icculus@9278
    83
    /*  37 */   SDL_SCANCODE_LEFT,
icculus@9278
    84
    /*  38 */   SDL_SCANCODE_UP,
icculus@9278
    85
    /*  39 */   SDL_SCANCODE_RIGHT,
icculus@9278
    86
    /*  40 */   SDL_SCANCODE_DOWN,
icculus@9278
    87
    /*  41 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    88
    /*  42 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    89
    /*  43 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    90
    /*  44 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    91
    /*  45 */   SDL_SCANCODE_INSERT,
icculus@9278
    92
    /*  46 */   SDL_SCANCODE_DELETE,
icculus@9278
    93
    /*  47 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
    94
    /*  48 */   SDL_SCANCODE_0,
icculus@9278
    95
    /*  49 */   SDL_SCANCODE_1,
icculus@9278
    96
    /*  50 */   SDL_SCANCODE_2,
icculus@9278
    97
    /*  51 */   SDL_SCANCODE_3,
icculus@9278
    98
    /*  52 */   SDL_SCANCODE_4,
icculus@9278
    99
    /*  53 */   SDL_SCANCODE_5,
icculus@9278
   100
    /*  54 */   SDL_SCANCODE_6,
icculus@9278
   101
    /*  55 */   SDL_SCANCODE_7,
icculus@9278
   102
    /*  56 */   SDL_SCANCODE_8,
icculus@9278
   103
    /*  57 */   SDL_SCANCODE_9,
icculus@9278
   104
    /*  58 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   105
    /*  59 */   SDL_SCANCODE_SEMICOLON,
icculus@9278
   106
    /*  60 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   107
    /*  61 */   SDL_SCANCODE_EQUALS,
icculus@9278
   108
    /*  62 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   109
    /*  63 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   110
    /*  64 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   111
    /*  65 */   SDL_SCANCODE_A,
icculus@9278
   112
    /*  66 */   SDL_SCANCODE_B,
icculus@9278
   113
    /*  67 */   SDL_SCANCODE_C,
icculus@9278
   114
    /*  68 */   SDL_SCANCODE_D,
icculus@9278
   115
    /*  69 */   SDL_SCANCODE_E,
icculus@9278
   116
    /*  70 */   SDL_SCANCODE_F,
icculus@9278
   117
    /*  71 */   SDL_SCANCODE_G,
icculus@9278
   118
    /*  72 */   SDL_SCANCODE_H,
icculus@9278
   119
    /*  73 */   SDL_SCANCODE_I,
icculus@9278
   120
    /*  74 */   SDL_SCANCODE_J,
icculus@9278
   121
    /*  75 */   SDL_SCANCODE_K,
icculus@9278
   122
    /*  76 */   SDL_SCANCODE_L,
icculus@9278
   123
    /*  77 */   SDL_SCANCODE_M,
icculus@9278
   124
    /*  78 */   SDL_SCANCODE_N,
icculus@9278
   125
    /*  79 */   SDL_SCANCODE_O,
icculus@9278
   126
    /*  80 */   SDL_SCANCODE_P,
icculus@9278
   127
    /*  81 */   SDL_SCANCODE_Q,
icculus@9278
   128
    /*  82 */   SDL_SCANCODE_R,
icculus@9278
   129
    /*  83 */   SDL_SCANCODE_S,
icculus@9278
   130
    /*  84 */   SDL_SCANCODE_T,
icculus@9278
   131
    /*  85 */   SDL_SCANCODE_U,
icculus@9278
   132
    /*  86 */   SDL_SCANCODE_V,
icculus@9278
   133
    /*  87 */   SDL_SCANCODE_W,
icculus@9278
   134
    /*  88 */   SDL_SCANCODE_X,
icculus@9278
   135
    /*  89 */   SDL_SCANCODE_Y,
icculus@9278
   136
    /*  90 */   SDL_SCANCODE_Z,
icculus@9278
   137
    /*  91 */   SDL_SCANCODE_LGUI,
icculus@9278
   138
    /*  92 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   139
    /*  93 */   SDL_SCANCODE_APPLICATION,
icculus@9278
   140
    /*  94 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   141
    /*  95 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   142
    /*  96 */   SDL_SCANCODE_KP_0,
icculus@9278
   143
    /*  97 */   SDL_SCANCODE_KP_1,
icculus@9278
   144
    /*  98 */   SDL_SCANCODE_KP_2,
icculus@9278
   145
    /*  99 */   SDL_SCANCODE_KP_3,
icculus@9278
   146
    /* 100 */   SDL_SCANCODE_KP_4,
icculus@9278
   147
    /* 101 */   SDL_SCANCODE_KP_5,
icculus@9278
   148
    /* 102 */   SDL_SCANCODE_KP_6,
icculus@9278
   149
    /* 103 */   SDL_SCANCODE_KP_7,
icculus@9278
   150
    /* 104 */   SDL_SCANCODE_KP_8,
icculus@9278
   151
    /* 105 */   SDL_SCANCODE_KP_9,
icculus@9278
   152
    /* 106 */   SDL_SCANCODE_KP_MULTIPLY,
icculus@9278
   153
    /* 107 */   SDL_SCANCODE_KP_PLUS,
icculus@9278
   154
    /* 108 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   155
    /* 109 */   SDL_SCANCODE_KP_MINUS,
icculus@9278
   156
    /* 110 */   SDL_SCANCODE_KP_PERIOD,
icculus@9278
   157
    /* 111 */   SDL_SCANCODE_KP_DIVIDE,
icculus@9278
   158
    /* 112 */   SDL_SCANCODE_F1,
icculus@9278
   159
    /* 113 */   SDL_SCANCODE_F2,
icculus@9278
   160
    /* 114 */   SDL_SCANCODE_F3,
icculus@9278
   161
    /* 115 */   SDL_SCANCODE_F4,
icculus@9278
   162
    /* 116 */   SDL_SCANCODE_F5,
icculus@9278
   163
    /* 117 */   SDL_SCANCODE_F6,
icculus@9278
   164
    /* 118 */   SDL_SCANCODE_F7,
icculus@9278
   165
    /* 119 */   SDL_SCANCODE_F8,
icculus@9278
   166
    /* 120 */   SDL_SCANCODE_F9,
icculus@9278
   167
    /* 121 */   SDL_SCANCODE_F10,
icculus@9278
   168
    /* 122 */   SDL_SCANCODE_F11,
icculus@9278
   169
    /* 123 */   SDL_SCANCODE_F12,
icculus@9278
   170
    /* 124 */   SDL_SCANCODE_F13,
icculus@9278
   171
    /* 125 */   SDL_SCANCODE_F14,
icculus@9278
   172
    /* 126 */   SDL_SCANCODE_F15,
icculus@9278
   173
    /* 127 */   SDL_SCANCODE_F16,
icculus@9278
   174
    /* 128 */   SDL_SCANCODE_F17,
icculus@9278
   175
    /* 129 */   SDL_SCANCODE_F18,
icculus@9278
   176
    /* 130 */   SDL_SCANCODE_F19,
icculus@9278
   177
    /* 131 */   SDL_SCANCODE_F20,
icculus@9278
   178
    /* 132 */   SDL_SCANCODE_F21,
icculus@9278
   179
    /* 133 */   SDL_SCANCODE_F22,
icculus@9278
   180
    /* 134 */   SDL_SCANCODE_F23,
icculus@9278
   181
    /* 135 */   SDL_SCANCODE_F24,
icculus@9278
   182
    /* 136 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   183
    /* 137 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   184
    /* 138 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   185
    /* 139 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   186
    /* 140 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   187
    /* 141 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   188
    /* 142 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   189
    /* 143 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   190
    /* 144 */   SDL_SCANCODE_NUMLOCKCLEAR,
icculus@9278
   191
    /* 145 */   SDL_SCANCODE_SCROLLLOCK,
icculus@9278
   192
    /* 146 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   193
    /* 147 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   194
    /* 148 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   195
    /* 149 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   196
    /* 150 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   197
    /* 151 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   198
    /* 152 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   199
    /* 153 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   200
    /* 154 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   201
    /* 155 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   202
    /* 156 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   203
    /* 157 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   204
    /* 158 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   205
    /* 159 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   206
    /* 160 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   207
    /* 161 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   208
    /* 162 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   209
    /* 163 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   210
    /* 164 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   211
    /* 165 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   212
    /* 166 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   213
    /* 167 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   214
    /* 168 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   215
    /* 169 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   216
    /* 170 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   217
    /* 171 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   218
    /* 172 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   219
    /* 173 */   SDL_SCANCODE_MINUS, /*FX*/
icculus@9278
   220
    /* 174 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   221
    /* 175 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   222
    /* 176 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   223
    /* 177 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   224
    /* 178 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   225
    /* 179 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   226
    /* 180 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   227
    /* 181 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   228
    /* 182 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   229
    /* 183 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   230
    /* 184 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   231
    /* 185 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   232
    /* 186 */   SDL_SCANCODE_SEMICOLON, /*IE, Chrome, D3E legacy*/
icculus@9278
   233
    /* 187 */   SDL_SCANCODE_EQUALS, /*IE, Chrome, D3E legacy*/
icculus@9278
   234
    /* 188 */   SDL_SCANCODE_COMMA,
icculus@9278
   235
    /* 189 */   SDL_SCANCODE_MINUS, /*IE, Chrome, D3E legacy*/
icculus@9278
   236
    /* 190 */   SDL_SCANCODE_PERIOD,
icculus@9278
   237
    /* 191 */   SDL_SCANCODE_SLASH,
icculus@9278
   238
    /* 192 */   SDL_SCANCODE_GRAVE, /*FX, D3E legacy (SDL_SCANCODE_APOSTROPHE in IE/Chrome)*/
icculus@9278
   239
    /* 193 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   240
    /* 194 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   241
    /* 195 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   242
    /* 196 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   243
    /* 197 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   244
    /* 198 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   245
    /* 199 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   246
    /* 200 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   247
    /* 201 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   248
    /* 202 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   249
    /* 203 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   250
    /* 204 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   251
    /* 205 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   252
    /* 206 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   253
    /* 207 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   254
    /* 208 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   255
    /* 209 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   256
    /* 210 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   257
    /* 211 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   258
    /* 212 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   259
    /* 213 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   260
    /* 214 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   261
    /* 215 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   262
    /* 216 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   263
    /* 217 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   264
    /* 218 */   SDL_SCANCODE_UNKNOWN,
icculus@9278
   265
    /* 219 */   SDL_SCANCODE_LEFTBRACKET,
icculus@9278
   266
    /* 220 */   SDL_SCANCODE_BACKSLASH,
icculus@9278
   267
    /* 221 */   SDL_SCANCODE_RIGHTBRACKET,
icculus@9278
   268
    /* 222 */   SDL_SCANCODE_APOSTROPHE, /*FX, D3E legacy*/
icculus@9278
   269
};
icculus@9278
   270
icculus@9278
   271
icculus@9278
   272
/* "borrowed" from SDL_windowsevents.c */
icculus@9278
   273
int
icculus@9278
   274
Emscripten_ConvertUTF32toUTF8(Uint32 codepoint, char * text)
icculus@9278
   275
{
icculus@9278
   276
    if (codepoint <= 0x7F) {
icculus@9278
   277
        text[0] = (char) codepoint;
icculus@9278
   278
        text[1] = '\0';
icculus@9278
   279
    } else if (codepoint <= 0x7FF) {
icculus@9278
   280
        text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F);
icculus@9278
   281
        text[1] = 0x80 | (char) (codepoint & 0x3F);
icculus@9278
   282
        text[2] = '\0';
icculus@9278
   283
    } else if (codepoint <= 0xFFFF) {
icculus@9278
   284
        text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F);
icculus@9278
   285
        text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
icculus@9278
   286
        text[2] = 0x80 | (char) (codepoint & 0x3F);
icculus@9278
   287
        text[3] = '\0';
icculus@9278
   288
    } else if (codepoint <= 0x10FFFF) {
icculus@9278
   289
        text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F);
icculus@9278
   290
        text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F);
icculus@9278
   291
        text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
icculus@9278
   292
        text[3] = 0x80 | (char) (codepoint & 0x3F);
icculus@9278
   293
        text[4] = '\0';
icculus@9278
   294
    } else {
icculus@9278
   295
        return SDL_FALSE;
icculus@9278
   296
    }
icculus@9278
   297
    return SDL_TRUE;
icculus@9278
   298
}
icculus@9278
   299
philipp@9352
   300
EM_BOOL
icculus@9278
   301
Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
icculus@9278
   302
{
icculus@9278
   303
    SDL_WindowData *window_data = userData;
icculus@9278
   304
    int mx = mouseEvent->canvasX, my = mouseEvent->canvasY;
icculus@9278
   305
    EmscriptenPointerlockChangeEvent pointerlock_status;
icculus@9278
   306
icculus@9278
   307
    /* check for pointer lock */
icculus@9278
   308
    emscripten_get_pointerlock_status(&pointerlock_status);
icculus@9278
   309
icculus@9278
   310
    if (pointerlock_status.isActive) {
icculus@9278
   311
        mx = mouseEvent->movementX;
icculus@9278
   312
        my = mouseEvent->movementY;
icculus@9278
   313
    }
icculus@9278
   314
icculus@9278
   315
    /* rescale (in case canvas is being scaled)*/
icculus@9278
   316
    double client_w, client_h;
icculus@9278
   317
    emscripten_get_element_css_size(NULL, &client_w, &client_h);
icculus@9278
   318
icculus@9278
   319
    mx = mx * (window_data->window->w / (client_w * window_data->pixel_ratio));
icculus@9278
   320
    my = my * (window_data->window->h / (client_h * window_data->pixel_ratio));
icculus@9278
   321
icculus@9278
   322
    SDL_SendMouseMotion(window_data->window, 0, pointerlock_status.isActive, mx, my);
icculus@9278
   323
    return 0;
icculus@9278
   324
}
icculus@9278
   325
philipp@9352
   326
EM_BOOL
icculus@9278
   327
Emscripten_HandleMouseButton(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
icculus@9278
   328
{
icculus@9278
   329
    SDL_WindowData *window_data = userData;
icculus@9278
   330
    uint32_t sdl_button;
icculus@9278
   331
    switch (mouseEvent->button) {
icculus@9278
   332
        case 0:
icculus@9278
   333
            sdl_button = SDL_BUTTON_LEFT;
icculus@9278
   334
            break;
icculus@9278
   335
        case 1:
icculus@9278
   336
            sdl_button = SDL_BUTTON_MIDDLE;
icculus@9278
   337
            break;
icculus@9278
   338
        case 2:
icculus@9278
   339
            sdl_button = SDL_BUTTON_RIGHT;
icculus@9278
   340
            break;
icculus@9278
   341
        default:
icculus@9278
   342
            return 0;
icculus@9278
   343
    }
icculus@9278
   344
    SDL_SendMouseButton(window_data->window, 0, eventType == EMSCRIPTEN_EVENT_MOUSEDOWN ? SDL_PRESSED : SDL_RELEASED, sdl_button);
icculus@9278
   345
    return 1;
icculus@9278
   346
}
icculus@9278
   347
philipp@9352
   348
EM_BOOL
icculus@9278
   349
Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
icculus@9278
   350
{
icculus@9278
   351
    SDL_WindowData *window_data = userData;
icculus@9278
   352
    SDL_SendWindowEvent(window_data->window, eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? SDL_WINDOWEVENT_ENTER : SDL_WINDOWEVENT_LEAVE, 0, 0);
icculus@9278
   353
    return 1;
icculus@9278
   354
}
icculus@9278
   355
philipp@9352
   356
EM_BOOL
icculus@9278
   357
Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData)
icculus@9278
   358
{
icculus@9278
   359
    SDL_WindowData *window_data = userData;
icculus@9278
   360
    SDL_SendMouseWheel(window_data->window, 0, wheelEvent->deltaX, -wheelEvent->deltaY, SDL_MOUSEWHEEL_NORMAL);
icculus@9278
   361
    return 1;
icculus@9278
   362
}
icculus@9278
   363
philipp@9352
   364
EM_BOOL
icculus@9278
   365
Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent *wheelEvent, void *userData)
icculus@9278
   366
{
icculus@9278
   367
    SDL_WindowData *window_data = userData;
icculus@9278
   368
    SDL_SendWindowEvent(window_data->window, eventType == EMSCRIPTEN_EVENT_FOCUS ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
icculus@9278
   369
    return 1;
icculus@9278
   370
}
icculus@9278
   371
philipp@9352
   372
EM_BOOL
icculus@9278
   373
Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData)
icculus@9278
   374
{
philipp@9591
   375
    SDL_WindowData *window_data = userData;
icculus@9278
   376
    int i;
icculus@9278
   377
philipp@9725
   378
    SDL_TouchID deviceId = 1;
slouken@9679
   379
    if (SDL_AddTouch(deviceId, "") < 0) {
slouken@9679
   380
         return 0;
icculus@9278
   381
    }
icculus@9278
   382
icculus@9278
   383
    for (i = 0; i < touchEvent->numTouches; i++) {
philipp@9591
   384
        SDL_FingerID id;
philipp@9591
   385
        float x, y;
icculus@9278
   386
icculus@9278
   387
        if (!touchEvent->touches[i].isChanged)
icculus@9278
   388
            continue;
icculus@9278
   389
icculus@9278
   390
        id = touchEvent->touches[i].identifier;
philipp@9591
   391
        x = touchEvent->touches[i].canvasX / (float)window_data->windowed_width;
philipp@9591
   392
        y = touchEvent->touches[i].canvasY / (float)window_data->windowed_height;
icculus@9278
   393
icculus@10284
   394
        if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
icculus@10284
   395
            if (!window_data->finger_touching) {
icculus@10284
   396
                window_data->finger_touching = SDL_TRUE;
icculus@10284
   397
                window_data->first_finger = id;
icculus@10284
   398
                SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y);
icculus@10284
   399
                SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);
icculus@10284
   400
            }
icculus@10284
   401
            SDL_SendTouch(deviceId, id, SDL_TRUE, x, y, 1.0f);
icculus@10284
   402
        } else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
icculus@10284
   403
            if ((window_data->finger_touching) && (window_data->first_finger == id)) {
icculus@10284
   404
                SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y);
icculus@10284
   405
            }
icculus@9278
   406
            SDL_SendTouchMotion(deviceId, id, x, y, 1.0f);
icculus@9278
   407
        } else {
icculus@10284
   408
            if ((window_data->finger_touching) && (window_data->first_finger == id)) {
icculus@10284
   409
                SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
icculus@10284
   410
                window_data->finger_touching = SDL_FALSE;
icculus@10284
   411
            }
icculus@9278
   412
            SDL_SendTouch(deviceId, id, SDL_FALSE, x, y, 1.0f);
icculus@9278
   413
        }
icculus@9278
   414
    }
icculus@9278
   415
icculus@9278
   416
icculus@9278
   417
    return 1;
icculus@9278
   418
}
icculus@9278
   419
philipp@9352
   420
EM_BOOL
icculus@9278
   421
Emscripten_HandleKey(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
icculus@9278
   422
{
icculus@9278
   423
    Uint32 scancode;
icculus@9278
   424
icculus@9278
   425
    /* .keyCode is deprecated, but still the most reliable way to get keys */
icculus@9278
   426
    if (keyEvent->keyCode < SDL_arraysize(emscripten_scancode_table)) {
icculus@9278
   427
        scancode = emscripten_scancode_table[keyEvent->keyCode];
icculus@9278
   428
icculus@9278
   429
        if (scancode != SDL_SCANCODE_UNKNOWN) {
icculus@9278
   430
icculus@9278
   431
            if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) {
icculus@9278
   432
                switch (scancode) {
icculus@9278
   433
                    case SDL_SCANCODE_LSHIFT:
icculus@9278
   434
                        scancode = SDL_SCANCODE_RSHIFT;
icculus@9278
   435
                        break;
icculus@9278
   436
                    case SDL_SCANCODE_LCTRL:
icculus@9278
   437
                        scancode = SDL_SCANCODE_RCTRL;
icculus@9278
   438
                        break;
icculus@9278
   439
                    case SDL_SCANCODE_LALT:
icculus@9278
   440
                        scancode = SDL_SCANCODE_RALT;
icculus@9278
   441
                        break;
icculus@9278
   442
                    case SDL_SCANCODE_LGUI:
icculus@9278
   443
                        scancode = SDL_SCANCODE_RGUI;
icculus@9278
   444
                        break;
icculus@9278
   445
                }
icculus@9278
   446
            }
icculus@9278
   447
            SDL_SendKeyboardKey(eventType == EMSCRIPTEN_EVENT_KEYDOWN ?
icculus@9278
   448
                                SDL_PRESSED : SDL_RELEASED, scancode);
icculus@9278
   449
        }
icculus@9278
   450
    }
icculus@9278
   451
icculus@9278
   452
    /* if we prevent keydown, we won't get keypress
icculus@9278
   453
     * also we need to ALWAYS prevent backspace and tab otherwise chrome takes action and does bad navigation UX
icculus@9278
   454
     */
icculus@9278
   455
    return SDL_GetEventState(SDL_TEXTINPUT) != SDL_ENABLE || eventType != EMSCRIPTEN_EVENT_KEYDOWN
icculus@9278
   456
            || keyEvent->keyCode == 8 /* backspace */ || keyEvent->keyCode == 9 /* tab */;
icculus@9278
   457
}
icculus@9278
   458
philipp@9352
   459
EM_BOOL
icculus@9278
   460
Emscripten_HandleKeyPress(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
icculus@9278
   461
{
icculus@9278
   462
    char text[5];
philipp@9378
   463
    if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) {
philipp@9378
   464
        SDL_SendKeyboardText(text);
philipp@9378
   465
    }
icculus@9278
   466
    return 1;
icculus@9278
   467
}
icculus@9278
   468
philipp@9352
   469
EM_BOOL
icculus@9278
   470
Emscripten_HandleFullscreenChange(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData)
icculus@9278
   471
{
icculus@9278
   472
    /*make sure this is actually our element going fullscreen*/
icculus@9278
   473
    if(SDL_strcmp(fullscreenChangeEvent->id, "SDLFullscreenElement") != 0)
icculus@9278
   474
        return 0;
icculus@9278
   475
icculus@9278
   476
    SDL_WindowData *window_data = userData;
icculus@9278
   477
    if(fullscreenChangeEvent->isFullscreen)
icculus@9278
   478
    {
icculus@9278
   479
        SDL_bool is_desktop_fullscreen;
icculus@9278
   480
        window_data->window->flags |= window_data->requested_fullscreen_mode;
icculus@9278
   481
icculus@9278
   482
        if(!window_data->requested_fullscreen_mode)
icculus@9278
   483
            window_data->window->flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; /*we didn't reqest fullscreen*/
icculus@9278
   484
icculus@9278
   485
        window_data->requested_fullscreen_mode = 0;
icculus@9278
   486
icculus@9278
   487
        is_desktop_fullscreen = (window_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP;
icculus@9278
   488
icculus@9278
   489
        /*update size*/
icculus@9278
   490
        if(window_data->window->flags & SDL_WINDOW_RESIZABLE || is_desktop_fullscreen)
icculus@9278
   491
        {
icculus@9278
   492
            emscripten_set_canvas_size(fullscreenChangeEvent->screenWidth, fullscreenChangeEvent->screenHeight);
icculus@9278
   493
            SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, fullscreenChangeEvent->screenWidth, fullscreenChangeEvent->screenHeight);
icculus@9278
   494
        }
icculus@9278
   495
        else
icculus@9278
   496
        {
icculus@9278
   497
            /*preserve ratio*/
icculus@9278
   498
            double w = window_data->window->w;
icculus@9278
   499
            double h = window_data->window->h;
icculus@9278
   500
            double factor = SDL_min(fullscreenChangeEvent->screenWidth / w, fullscreenChangeEvent->screenHeight / h);
icculus@9278
   501
            emscripten_set_element_css_size(NULL, w * factor, h * factor);
icculus@9278
   502
        }
icculus@9278
   503
    }
icculus@9278
   504
    else
icculus@9278
   505
    {
icculus@9278
   506
        EM_ASM({
icculus@9278
   507
            //un-reparent canvas (similar to Module.requestFullscreen)
icculus@9278
   508
            var canvas = Module['canvas'];
icculus@9278
   509
            if(canvas.parentNode.id == "SDLFullscreenElement") {
icculus@9278
   510
                var canvasContainer = canvas.parentNode;
icculus@9278
   511
                canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
icculus@9278
   512
                canvasContainer.parentNode.removeChild(canvasContainer);
icculus@9278
   513
            }
icculus@9278
   514
        });
icculus@9278
   515
        double unscaled_w = window_data->windowed_width / window_data->pixel_ratio;
icculus@9278
   516
        double unscaled_h = window_data->windowed_height / window_data->pixel_ratio;
icculus@9278
   517
        emscripten_set_canvas_size(window_data->windowed_width, window_data->windowed_height);
icculus@9278
   518
icculus@9278
   519
        if (!window_data->external_size && window_data->pixel_ratio != 1.0f) {
icculus@9278
   520
            emscripten_set_element_css_size(NULL, unscaled_w, unscaled_h);
icculus@9278
   521
        }
icculus@9278
   522
icculus@9278
   523
        SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, unscaled_w, unscaled_h);
icculus@9278
   524
icculus@9278
   525
        window_data->window->flags &= ~FULLSCREEN_MASK;
icculus@9278
   526
    }
icculus@9278
   527
icculus@9278
   528
    return 0;
icculus@9278
   529
}
icculus@9278
   530
philipp@9352
   531
EM_BOOL
icculus@9278
   532
Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
icculus@9278
   533
{
icculus@9278
   534
    SDL_WindowData *window_data = userData;
icculus@9278
   535
    if(window_data->window->flags & FULLSCREEN_MASK)
icculus@9278
   536
    {
icculus@9278
   537
        SDL_bool is_desktop_fullscreen = (window_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP;
icculus@9278
   538
icculus@9278
   539
        if(window_data->window->flags & SDL_WINDOW_RESIZABLE || is_desktop_fullscreen)
icculus@9278
   540
        {
icculus@9278
   541
            emscripten_set_canvas_size(uiEvent->windowInnerWidth * window_data->pixel_ratio, uiEvent->windowInnerHeight * window_data->pixel_ratio);
icculus@9278
   542
            SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, uiEvent->windowInnerWidth, uiEvent->windowInnerHeight);
icculus@9278
   543
        }
icculus@9278
   544
    }
icculus@9278
   545
    else
icculus@9278
   546
    {
icculus@9278
   547
        /* this will only work if the canvas size is set through css */
icculus@9278
   548
        if(window_data->window->flags & SDL_WINDOW_RESIZABLE)
icculus@9278
   549
        {
icculus@9278
   550
            double w = window_data->window->w;
icculus@9278
   551
            double h = window_data->window->h;
icculus@9278
   552
icculus@9278
   553
            if(window_data->external_size) {
icculus@9278
   554
                emscripten_get_element_css_size(NULL, &w, &h);
icculus@9278
   555
            }
icculus@9278
   556
icculus@9278
   557
            emscripten_set_canvas_size(w * window_data->pixel_ratio, h * window_data->pixel_ratio);
icculus@9278
   558
icculus@9278
   559
            /* set_canvas_size unsets this */
icculus@9278
   560
            if (!window_data->external_size && window_data->pixel_ratio != 1.0f) {
icculus@9278
   561
                emscripten_set_element_css_size(NULL, w, h);
icculus@9278
   562
            }
icculus@9278
   563
icculus@9278
   564
            SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, w, h);
icculus@9278
   565
        }
icculus@9278
   566
    }
icculus@9278
   567
icculus@9278
   568
    return 0;
icculus@9278
   569
}
icculus@9278
   570
philipp@9352
   571
EM_BOOL
icculus@9278
   572
Emscripten_HandleVisibilityChange(int eventType, const EmscriptenVisibilityChangeEvent *visEvent, void *userData)
icculus@9278
   573
{
icculus@9278
   574
    SDL_WindowData *window_data = userData;
icculus@9278
   575
    SDL_SendWindowEvent(window_data->window, visEvent->hidden ? SDL_WINDOWEVENT_HIDDEN : SDL_WINDOWEVENT_SHOWN, 0, 0);
icculus@9278
   576
    return 0;
icculus@9278
   577
}
icculus@9278
   578
icculus@9278
   579
void
icculus@9278
   580
Emscripten_RegisterEventHandlers(SDL_WindowData *data)
icculus@9278
   581
{
icculus@9278
   582
    /* There is only one window and that window is the canvas */
icculus@9278
   583
    emscripten_set_mousemove_callback("#canvas", data, 0, Emscripten_HandleMouseMove);
icculus@9278
   584
icculus@9278
   585
    emscripten_set_mousedown_callback("#canvas", data, 0, Emscripten_HandleMouseButton);
icculus@9278
   586
    emscripten_set_mouseup_callback("#canvas", data, 0, Emscripten_HandleMouseButton);
icculus@9278
   587
icculus@9278
   588
    emscripten_set_mouseenter_callback("#canvas", data, 0, Emscripten_HandleMouseFocus);
icculus@9278
   589
    emscripten_set_mouseleave_callback("#canvas", data, 0, Emscripten_HandleMouseFocus);
icculus@9278
   590
icculus@9278
   591
    emscripten_set_wheel_callback("#canvas", data, 0, Emscripten_HandleWheel);
icculus@9278
   592
icculus@9278
   593
    emscripten_set_focus_callback("#canvas", data, 0, Emscripten_HandleFocus);
icculus@9278
   594
    emscripten_set_blur_callback("#canvas", data, 0, Emscripten_HandleFocus);
icculus@9278
   595
icculus@9278
   596
    emscripten_set_touchstart_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   597
    emscripten_set_touchend_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   598
    emscripten_set_touchmove_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   599
    emscripten_set_touchcancel_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   600
icculus@9278
   601
    /* Keyboard events are awkward */
icculus@9278
   602
    const char *keyElement = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT);
icculus@9278
   603
    if (!keyElement) keyElement = "#window";
icculus@9278
   604
icculus@9278
   605
    emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
icculus@9278
   606
    emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
icculus@9278
   607
    emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
icculus@9278
   608
icculus@9278
   609
    emscripten_set_fullscreenchange_callback("#document", data, 0, Emscripten_HandleFullscreenChange);
icculus@9278
   610
icculus@9278
   611
    emscripten_set_resize_callback("#window", data, 0, Emscripten_HandleResize);
icculus@9278
   612
icculus@9278
   613
    emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
icculus@9278
   614
}
icculus@9278
   615
icculus@9278
   616
void
icculus@9278
   617
Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
icculus@9278
   618
{
icculus@9278
   619
    /* only works due to having one window */
icculus@9278
   620
    emscripten_set_mousemove_callback("#canvas", NULL, 0, NULL);
icculus@9278
   621
icculus@9278
   622
    emscripten_set_mousedown_callback("#canvas", NULL, 0, NULL);
icculus@9278
   623
    emscripten_set_mouseup_callback("#canvas", NULL, 0, NULL);
icculus@9278
   624
icculus@9278
   625
    emscripten_set_mouseenter_callback("#canvas", NULL, 0, NULL);
icculus@9278
   626
    emscripten_set_mouseleave_callback("#canvas", NULL, 0, NULL);
icculus@9278
   627
icculus@9278
   628
    emscripten_set_wheel_callback("#canvas", NULL, 0, NULL);
icculus@9278
   629
icculus@9278
   630
    emscripten_set_focus_callback("#canvas", NULL, 0, NULL);
icculus@9278
   631
    emscripten_set_blur_callback("#canvas", NULL, 0, NULL);
icculus@9278
   632
icculus@9278
   633
    emscripten_set_touchstart_callback("#canvas", NULL, 0, NULL);
icculus@9278
   634
    emscripten_set_touchend_callback("#canvas", NULL, 0, NULL);
icculus@9278
   635
    emscripten_set_touchmove_callback("#canvas", NULL, 0, NULL);
icculus@9278
   636
    emscripten_set_touchcancel_callback("#canvas", NULL, 0, NULL);
icculus@9278
   637
philipp@9377
   638
    const char *target = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT);
philipp@9377
   639
    if (!target) {
philipp@9377
   640
        target = "#window";
philipp@9377
   641
    }
icculus@9278
   642
philipp@9377
   643
    emscripten_set_keydown_callback(target, NULL, 0, NULL);
philipp@9377
   644
    emscripten_set_keyup_callback(target, NULL, 0, NULL);
philipp@9377
   645
philipp@9377
   646
    emscripten_set_keypress_callback(target, NULL, 0, NULL);
icculus@9278
   647
icculus@9278
   648
    emscripten_set_fullscreenchange_callback("#document", NULL, 0, NULL);
icculus@9278
   649
icculus@9278
   650
    emscripten_set_resize_callback("#window", NULL, 0, NULL);
icculus@9278
   651
icculus@9278
   652
    emscripten_set_visibilitychange_callback(NULL, 0, NULL);
icculus@9278
   653
}
icculus@9278
   654
icculus@9278
   655
#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */
icculus@9278
   656
icculus@9278
   657
/* vi: set ts=4 sw=4 expandtab: */