src/video/emscripten/SDL_emscriptenevents.c
author Ryan C. Gordon <icculus@icculus.org>
Thu, 20 Apr 2017 13:00:54 -0400
changeset 10976 1da5502cf8ea
parent 10895 fd63ed9b0746
child 11002 ba0ce5b958d2
permissions -rw-r--r--
emscripten: keep track of pointer lock losses and maybe regrab pointer later.

If an Emscripten app is in relative mouse mode and the user presses Escape
(or whatever is appropriate), then the pointer lock is broken by the browser.

This keeps track of those losses, and next time the user presses a mouse
button down on the canvas, if the app is still meant to be in relative mouse
mode, we will attempt to regrab the pointer.

This makes it much more seamless for things like first-person shooters, and
the app doesn't need any manual intervention.
icculus@9278
     1
/*
icculus@9278
     2
  Simple DirectMedia Layer
slouken@10737
     3
  Copyright (C) 1997-2017 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*/
admin@10337
   220
    /* 174 */   SDL_SCANCODE_VOLUMEDOWN, /*IE, Chrome*/
admin@10337
   221
    /* 175 */   SDL_SCANCODE_VOLUMEUP, /*IE, Chrome*/
admin@10337
   222
    /* 176 */   SDL_SCANCODE_AUDIONEXT, /*IE, Chrome*/
admin@10337
   223
    /* 177 */   SDL_SCANCODE_AUDIOPREV, /*IE, Chrome*/
icculus@9278
   224
    /* 178 */   SDL_SCANCODE_UNKNOWN,
admin@10337
   225
    /* 179 */   SDL_SCANCODE_AUDIOPLAY, /*IE, Chrome*/
icculus@9278
   226
    /* 180 */   SDL_SCANCODE_UNKNOWN,
admin@10337
   227
    /* 181 */   SDL_SCANCODE_AUDIOMUTE, /*FX*/
admin@10337
   228
    /* 182 */   SDL_SCANCODE_VOLUMEDOWN, /*FX*/
admin@10337
   229
    /* 183 */   SDL_SCANCODE_VOLUMEUP, /*FX*/
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
icculus@10976
   300
static EM_BOOL
icculus@10976
   301
Emscripten_HandlePointerLockChange(int eventType, const EmscriptenPointerlockChangeEvent *changeEvent, void *userData)
icculus@10976
   302
{
icculus@10976
   303
    SDL_WindowData *window_data = (SDL_WindowData *) userData;
icculus@10976
   304
    /* keep track of lock losses, so we can regrab if/when appropriate. */
icculus@10976
   305
    window_data->has_pointer_lock = changeEvent->isActive;
icculus@10976
   306
    return 0;
icculus@10976
   307
}
icculus@10976
   308
icculus@10976
   309
philipp@9352
   310
EM_BOOL
icculus@9278
   311
Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
icculus@9278
   312
{
icculus@9278
   313
    SDL_WindowData *window_data = userData;
icculus@10976
   314
    const int isPointerLocked = window_data->has_pointer_lock;
boris@10325
   315
    int mx, my;
boris@10325
   316
    static double residualx = 0, residualy = 0;
icculus@9278
   317
boris@10325
   318
    /* rescale (in case canvas is being scaled)*/
boris@10325
   319
    double client_w, client_h, xscale, yscale;
boris@10325
   320
    emscripten_get_element_css_size(NULL, &client_w, &client_h);
boris@10326
   321
    xscale = window_data->window->w / client_w;
boris@10326
   322
    yscale = window_data->window->h / client_h;
boris@10325
   323
telpe@10324
   324
    if (isPointerLocked) {
boris@10325
   325
        residualx += mouseEvent->movementX * xscale;
boris@10325
   326
        residualy += mouseEvent->movementY * yscale;
boris@10325
   327
        /* Let slow sub-pixel motion accumulate. Don't lose it. */
boris@10325
   328
        mx = residualx;
boris@10325
   329
        residualx -= mx;
boris@10325
   330
        my = residualy;
boris@10325
   331
        residualy -= my;
boris@10325
   332
    } else {
boris@10325
   333
        mx = mouseEvent->canvasX * xscale;
boris@10325
   334
        my = mouseEvent->canvasY * yscale;
icculus@9278
   335
    }
icculus@9278
   336
telpe@10324
   337
    SDL_SendMouseMotion(window_data->window, 0, isPointerLocked, mx, my);
icculus@9278
   338
    return 0;
icculus@9278
   339
}
icculus@9278
   340
philipp@9352
   341
EM_BOOL
icculus@9278
   342
Emscripten_HandleMouseButton(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
icculus@9278
   343
{
icculus@9278
   344
    SDL_WindowData *window_data = userData;
philipp@10629
   345
    Uint8 sdl_button;
philipp@10629
   346
    Uint8 sdl_button_state;
philipp@10629
   347
    SDL_EventType sdl_event_type;
philipp@10629
   348
icculus@9278
   349
    switch (mouseEvent->button) {
icculus@9278
   350
        case 0:
icculus@9278
   351
            sdl_button = SDL_BUTTON_LEFT;
icculus@9278
   352
            break;
icculus@9278
   353
        case 1:
icculus@9278
   354
            sdl_button = SDL_BUTTON_MIDDLE;
icculus@9278
   355
            break;
icculus@9278
   356
        case 2:
icculus@9278
   357
            sdl_button = SDL_BUTTON_RIGHT;
icculus@9278
   358
            break;
icculus@9278
   359
        default:
icculus@9278
   360
            return 0;
icculus@9278
   361
    }
slouken@10338
   362
philipp@10629
   363
    if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) {
icculus@10976
   364
        if (SDL_GetMouse()->relative_mode && !window_data->has_pointer_lock) {
icculus@10976
   365
            emscripten_request_pointerlock(NULL, 0);  /* try to regrab lost pointer lock. */
icculus@10976
   366
        }
philipp@10629
   367
        sdl_button_state = SDL_PRESSED;
philipp@10629
   368
        sdl_event_type = SDL_MOUSEBUTTONDOWN;
philipp@10629
   369
    } else {
philipp@10629
   370
        sdl_button_state = SDL_RELEASED;
philipp@10629
   371
        sdl_event_type = SDL_MOUSEBUTTONUP;
philipp@10629
   372
    }
philipp@10629
   373
    SDL_SendMouseButton(window_data->window, 0, sdl_button_state, sdl_button);
slouken@10338
   374
    return SDL_GetEventState(sdl_event_type) == SDL_ENABLE;
icculus@9278
   375
}
icculus@9278
   376
philipp@9352
   377
EM_BOOL
icculus@9278
   378
Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
icculus@9278
   379
{
icculus@9278
   380
    SDL_WindowData *window_data = userData;
admin@10318
   381
admin@10320
   382
    int mx = mouseEvent->canvasX, my = mouseEvent->canvasY;
icculus@10976
   383
    const int isPointerLocked = window_data->has_pointer_lock;
admin@10320
   384
telpe@10324
   385
    if (!isPointerLocked) {
admin@10320
   386
        /* rescale (in case canvas is being scaled)*/
admin@10320
   387
        double client_w, client_h;
admin@10320
   388
        emscripten_get_element_css_size(NULL, &client_w, &client_h);
admin@10320
   389
boris@10326
   390
        mx = mx * (window_data->window->w / client_w);
boris@10326
   391
        my = my * (window_data->window->h / client_h);
telpe@10324
   392
        SDL_SendMouseMotion(window_data->window, 0, isPointerLocked, mx, my);
admin@10320
   393
    }
admin@10320
   394
admin@10318
   395
    SDL_SetMouseFocus(eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? window_data->window : NULL);
slouken@10338
   396
    return SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE;
icculus@9278
   397
}
icculus@9278
   398
philipp@9352
   399
EM_BOOL
icculus@9278
   400
Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData)
icculus@9278
   401
{
icculus@9278
   402
    SDL_WindowData *window_data = userData;
icculus@9278
   403
    SDL_SendMouseWheel(window_data->window, 0, wheelEvent->deltaX, -wheelEvent->deltaY, SDL_MOUSEWHEEL_NORMAL);
slouken@10338
   404
    return SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE;
icculus@9278
   405
}
icculus@9278
   406
philipp@9352
   407
EM_BOOL
icculus@9278
   408
Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent *wheelEvent, void *userData)
icculus@9278
   409
{
icculus@9278
   410
    SDL_WindowData *window_data = userData;
boris@10328
   411
    /* If the user switches away while keys are pressed (such as
boris@10328
   412
     * via Alt+Tab), key release events won't be received. */
boris@10328
   413
    if (eventType == EMSCRIPTEN_EVENT_BLUR) {
boris@10328
   414
        SDL_ResetKeyboard();
boris@10328
   415
    }
slouken@10338
   416
slouken@10338
   417
icculus@9278
   418
    SDL_SendWindowEvent(window_data->window, eventType == EMSCRIPTEN_EVENT_FOCUS ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
slouken@10338
   419
    return SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE;
icculus@9278
   420
}
icculus@9278
   421
philipp@9352
   422
EM_BOOL
icculus@9278
   423
Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData)
icculus@9278
   424
{
philipp@9591
   425
    SDL_WindowData *window_data = userData;
icculus@9278
   426
    int i;
admin@10316
   427
    double client_w, client_h;
slouken@10338
   428
    int preventDefault = 0;
icculus@9278
   429
philipp@9725
   430
    SDL_TouchID deviceId = 1;
slouken@9679
   431
    if (SDL_AddTouch(deviceId, "") < 0) {
slouken@9679
   432
         return 0;
icculus@9278
   433
    }
icculus@9278
   434
admin@10316
   435
    emscripten_get_element_css_size(NULL, &client_w, &client_h);
admin@10316
   436
icculus@9278
   437
    for (i = 0; i < touchEvent->numTouches; i++) {
philipp@9591
   438
        SDL_FingerID id;
philipp@9591
   439
        float x, y;
icculus@9278
   440
icculus@9278
   441
        if (!touchEvent->touches[i].isChanged)
icculus@9278
   442
            continue;
icculus@9278
   443
icculus@9278
   444
        id = touchEvent->touches[i].identifier;
admin@10316
   445
        x = touchEvent->touches[i].canvasX / client_w;
admin@10316
   446
        y = touchEvent->touches[i].canvasY / client_h;
icculus@9278
   447
icculus@10284
   448
        if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
icculus@10284
   449
            if (!window_data->finger_touching) {
icculus@10284
   450
                window_data->finger_touching = SDL_TRUE;
icculus@10284
   451
                window_data->first_finger = id;
icculus@10284
   452
                SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y);
icculus@10284
   453
                SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);
icculus@10284
   454
            }
icculus@10284
   455
            SDL_SendTouch(deviceId, id, SDL_TRUE, x, y, 1.0f);
slouken@10338
   456
slouken@10338
   457
            if (!preventDefault && SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) {
slouken@10338
   458
                preventDefault = 1;
slouken@10338
   459
            }
icculus@10284
   460
        } else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
icculus@10284
   461
            if ((window_data->finger_touching) && (window_data->first_finger == id)) {
icculus@10284
   462
                SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y);
icculus@10284
   463
            }
icculus@9278
   464
            SDL_SendTouchMotion(deviceId, id, x, y, 1.0f);
slouken@10338
   465
slouken@10338
   466
            if (!preventDefault && SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {
slouken@10338
   467
                preventDefault = 1;
slouken@10338
   468
            }
icculus@9278
   469
        } else {
icculus@10284
   470
            if ((window_data->finger_touching) && (window_data->first_finger == id)) {
icculus@10284
   471
                SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
icculus@10284
   472
                window_data->finger_touching = SDL_FALSE;
icculus@10284
   473
            }
icculus@9278
   474
            SDL_SendTouch(deviceId, id, SDL_FALSE, x, y, 1.0f);
slouken@10338
   475
slouken@10338
   476
            if (!preventDefault && SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
slouken@10338
   477
                preventDefault = 1;
slouken@10338
   478
            }
icculus@9278
   479
        }
icculus@9278
   480
    }
icculus@9278
   481
slouken@10338
   482
    return preventDefault;
icculus@9278
   483
}
icculus@9278
   484
philipp@9352
   485
EM_BOOL
icculus@9278
   486
Emscripten_HandleKey(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
icculus@9278
   487
{
icculus@9278
   488
    Uint32 scancode;
icculus@9278
   489
icculus@9278
   490
    /* .keyCode is deprecated, but still the most reliable way to get keys */
icculus@9278
   491
    if (keyEvent->keyCode < SDL_arraysize(emscripten_scancode_table)) {
icculus@9278
   492
        scancode = emscripten_scancode_table[keyEvent->keyCode];
icculus@9278
   493
icculus@9278
   494
        if (scancode != SDL_SCANCODE_UNKNOWN) {
icculus@9278
   495
icculus@9278
   496
            if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) {
icculus@9278
   497
                switch (scancode) {
icculus@9278
   498
                    case SDL_SCANCODE_LSHIFT:
icculus@9278
   499
                        scancode = SDL_SCANCODE_RSHIFT;
icculus@9278
   500
                        break;
icculus@9278
   501
                    case SDL_SCANCODE_LCTRL:
icculus@9278
   502
                        scancode = SDL_SCANCODE_RCTRL;
icculus@9278
   503
                        break;
icculus@9278
   504
                    case SDL_SCANCODE_LALT:
icculus@9278
   505
                        scancode = SDL_SCANCODE_RALT;
icculus@9278
   506
                        break;
icculus@9278
   507
                    case SDL_SCANCODE_LGUI:
icculus@9278
   508
                        scancode = SDL_SCANCODE_RGUI;
icculus@9278
   509
                        break;
icculus@9278
   510
                }
icculus@9278
   511
            }
slouken@10338
   512
            SDL_SendKeyboardKey(eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_PRESSED : SDL_RELEASED, scancode);
icculus@9278
   513
        }
icculus@9278
   514
    }
icculus@9278
   515
slouken@10338
   516
    SDL_bool prevent_default = SDL_GetEventState(eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_KEYDOWN : SDL_KEYUP) == SDL_ENABLE;
slouken@10338
   517
slouken@10338
   518
    /* if TEXTINPUT events are enabled we can't prevent keydown or we won't get keypress
slouken@10338
   519
     * we need to ALWAYS prevent backspace and tab otherwise chrome takes action and does bad navigation UX
icculus@9278
   520
     */
slouken@10338
   521
    if (eventType == EMSCRIPTEN_EVENT_KEYDOWN && SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE && keyEvent->keyCode != 8 /* backspace */ && keyEvent->keyCode != 9 /* tab */)
slouken@10338
   522
        prevent_default = SDL_FALSE;
slouken@10338
   523
slouken@10338
   524
    return prevent_default;
icculus@9278
   525
}
icculus@9278
   526
philipp@9352
   527
EM_BOOL
icculus@9278
   528
Emscripten_HandleKeyPress(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData)
icculus@9278
   529
{
icculus@9278
   530
    char text[5];
philipp@9378
   531
    if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) {
philipp@9378
   532
        SDL_SendKeyboardText(text);
philipp@9378
   533
    }
slouken@10338
   534
    return SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE;
icculus@9278
   535
}
icculus@9278
   536
philipp@9352
   537
EM_BOOL
icculus@9278
   538
Emscripten_HandleFullscreenChange(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData)
icculus@9278
   539
{
icculus@9278
   540
    SDL_WindowData *window_data = userData;
icculus@9278
   541
    if(fullscreenChangeEvent->isFullscreen)
icculus@9278
   542
    {
icculus@9278
   543
        window_data->window->flags |= window_data->requested_fullscreen_mode;
icculus@9278
   544
icculus@9278
   545
        window_data->requested_fullscreen_mode = 0;
icculus@9278
   546
slouken@10317
   547
        if(!window_data->requested_fullscreen_mode)
slouken@10317
   548
            window_data->window->flags |= SDL_WINDOW_FULLSCREEN; /*we didn't reqest fullscreen*/
icculus@9278
   549
    }
icculus@9278
   550
    else
icculus@9278
   551
    {
icculus@9278
   552
        window_data->window->flags &= ~FULLSCREEN_MASK;
icculus@9278
   553
    }
icculus@9278
   554
icculus@9278
   555
    return 0;
icculus@9278
   556
}
icculus@9278
   557
philipp@9352
   558
EM_BOOL
icculus@9278
   559
Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
icculus@9278
   560
{
icculus@9278
   561
    SDL_WindowData *window_data = userData;
csongor@10541
   562
csongor@10541
   563
    /* update pixel ratio */
admin@10895
   564
    if (window_data->window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
admin@10895
   565
        window_data->pixel_ratio = emscripten_get_device_pixel_ratio();
admin@10895
   566
    }
csongor@10541
   567
slouken@10317
   568
    if(!(window_data->window->flags & FULLSCREEN_MASK))
icculus@9278
   569
    {
icculus@9278
   570
        /* this will only work if the canvas size is set through css */
icculus@9278
   571
        if(window_data->window->flags & SDL_WINDOW_RESIZABLE)
icculus@9278
   572
        {
icculus@9278
   573
            double w = window_data->window->w;
icculus@9278
   574
            double h = window_data->window->h;
icculus@9278
   575
icculus@9278
   576
            if(window_data->external_size) {
icculus@9278
   577
                emscripten_get_element_css_size(NULL, &w, &h);
icculus@9278
   578
            }
icculus@9278
   579
icculus@9278
   580
            emscripten_set_canvas_size(w * window_data->pixel_ratio, h * window_data->pixel_ratio);
icculus@9278
   581
icculus@9278
   582
            /* set_canvas_size unsets this */
icculus@9278
   583
            if (!window_data->external_size && window_data->pixel_ratio != 1.0f) {
icculus@9278
   584
                emscripten_set_element_css_size(NULL, w, h);
icculus@9278
   585
            }
icculus@9278
   586
icculus@9278
   587
            SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, w, h);
icculus@9278
   588
        }
icculus@9278
   589
    }
icculus@9278
   590
icculus@9278
   591
    return 0;
icculus@9278
   592
}
icculus@9278
   593
philipp@9352
   594
EM_BOOL
slouken@10317
   595
Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
slouken@10317
   596
{
slouken@10317
   597
    /*this is used during fullscreen changes*/
slouken@10317
   598
    SDL_WindowData *window_data = userData;
slouken@10317
   599
slouken@10317
   600
    if(window_data->fullscreen_resize)
slouken@10317
   601
    {
slouken@10317
   602
        double css_w, css_h;
slouken@10317
   603
        emscripten_get_element_css_size(NULL, &css_w, &css_h);
slouken@10317
   604
        SDL_SendWindowEvent(window_data->window, SDL_WINDOWEVENT_RESIZED, css_w, css_h);
slouken@10317
   605
    }
slouken@10317
   606
slouken@10317
   607
    return 0;
slouken@10317
   608
}
slouken@10317
   609
slouken@10317
   610
EM_BOOL
icculus@9278
   611
Emscripten_HandleVisibilityChange(int eventType, const EmscriptenVisibilityChangeEvent *visEvent, void *userData)
icculus@9278
   612
{
icculus@9278
   613
    SDL_WindowData *window_data = userData;
icculus@9278
   614
    SDL_SendWindowEvent(window_data->window, visEvent->hidden ? SDL_WINDOWEVENT_HIDDEN : SDL_WINDOWEVENT_SHOWN, 0, 0);
icculus@9278
   615
    return 0;
icculus@9278
   616
}
icculus@9278
   617
icculus@9278
   618
void
icculus@9278
   619
Emscripten_RegisterEventHandlers(SDL_WindowData *data)
icculus@9278
   620
{
icculus@9278
   621
    /* There is only one window and that window is the canvas */
icculus@9278
   622
    emscripten_set_mousemove_callback("#canvas", data, 0, Emscripten_HandleMouseMove);
icculus@9278
   623
icculus@9278
   624
    emscripten_set_mousedown_callback("#canvas", data, 0, Emscripten_HandleMouseButton);
admin@10319
   625
    emscripten_set_mouseup_callback("#document", data, 0, Emscripten_HandleMouseButton);
icculus@9278
   626
icculus@9278
   627
    emscripten_set_mouseenter_callback("#canvas", data, 0, Emscripten_HandleMouseFocus);
icculus@9278
   628
    emscripten_set_mouseleave_callback("#canvas", data, 0, Emscripten_HandleMouseFocus);
icculus@9278
   629
icculus@9278
   630
    emscripten_set_wheel_callback("#canvas", data, 0, Emscripten_HandleWheel);
icculus@9278
   631
boris@10327
   632
    emscripten_set_focus_callback("#window", data, 0, Emscripten_HandleFocus);
boris@10327
   633
    emscripten_set_blur_callback("#window", data, 0, Emscripten_HandleFocus);
icculus@9278
   634
icculus@9278
   635
    emscripten_set_touchstart_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   636
    emscripten_set_touchend_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   637
    emscripten_set_touchmove_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   638
    emscripten_set_touchcancel_callback("#canvas", data, 0, Emscripten_HandleTouch);
icculus@9278
   639
icculus@10976
   640
    emscripten_set_pointerlockchange_callback(NULL, data, 0, Emscripten_HandlePointerLockChange);
icculus@10976
   641
icculus@9278
   642
    /* Keyboard events are awkward */
icculus@9278
   643
    const char *keyElement = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT);
icculus@9278
   644
    if (!keyElement) keyElement = "#window";
icculus@9278
   645
icculus@9278
   646
    emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
icculus@9278
   647
    emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
icculus@9278
   648
    emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
icculus@9278
   649
icculus@9278
   650
    emscripten_set_fullscreenchange_callback("#document", data, 0, Emscripten_HandleFullscreenChange);
icculus@9278
   651
icculus@9278
   652
    emscripten_set_resize_callback("#window", data, 0, Emscripten_HandleResize);
icculus@9278
   653
icculus@9278
   654
    emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
icculus@9278
   655
}
icculus@9278
   656
icculus@9278
   657
void
icculus@9278
   658
Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
icculus@9278
   659
{
icculus@9278
   660
    /* only works due to having one window */
icculus@9278
   661
    emscripten_set_mousemove_callback("#canvas", NULL, 0, NULL);
icculus@9278
   662
icculus@9278
   663
    emscripten_set_mousedown_callback("#canvas", NULL, 0, NULL);
admin@10319
   664
    emscripten_set_mouseup_callback("#document", NULL, 0, NULL);
icculus@9278
   665
icculus@9278
   666
    emscripten_set_mouseenter_callback("#canvas", NULL, 0, NULL);
icculus@9278
   667
    emscripten_set_mouseleave_callback("#canvas", NULL, 0, NULL);
icculus@9278
   668
icculus@9278
   669
    emscripten_set_wheel_callback("#canvas", NULL, 0, NULL);
icculus@9278
   670
boris@10327
   671
    emscripten_set_focus_callback("#window", NULL, 0, NULL);
boris@10327
   672
    emscripten_set_blur_callback("#window", NULL, 0, NULL);
icculus@9278
   673
icculus@9278
   674
    emscripten_set_touchstart_callback("#canvas", NULL, 0, NULL);
icculus@9278
   675
    emscripten_set_touchend_callback("#canvas", NULL, 0, NULL);
icculus@9278
   676
    emscripten_set_touchmove_callback("#canvas", NULL, 0, NULL);
icculus@9278
   677
    emscripten_set_touchcancel_callback("#canvas", NULL, 0, NULL);
icculus@9278
   678
philipp@9377
   679
    const char *target = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT);
philipp@9377
   680
    if (!target) {
philipp@9377
   681
        target = "#window";
philipp@9377
   682
    }
icculus@9278
   683
philipp@9377
   684
    emscripten_set_keydown_callback(target, NULL, 0, NULL);
philipp@9377
   685
    emscripten_set_keyup_callback(target, NULL, 0, NULL);
philipp@9377
   686
philipp@9377
   687
    emscripten_set_keypress_callback(target, NULL, 0, NULL);
icculus@9278
   688
icculus@9278
   689
    emscripten_set_fullscreenchange_callback("#document", NULL, 0, NULL);
icculus@9278
   690
icculus@9278
   691
    emscripten_set_resize_callback("#window", NULL, 0, NULL);
icculus@9278
   692
icculus@9278
   693
    emscripten_set_visibilitychange_callback(NULL, 0, NULL);
icculus@9278
   694
}
icculus@9278
   695
icculus@9278
   696
#endif /* SDL_VIDEO_DRIVER_EMSCRIPTEN */
icculus@9278
   697
icculus@9278
   698
/* vi: set ts=4 sw=4 expandtab: */