Skip to content

Commit d6d2c95

Browse files
Temdog007slouken
authored andcommitted
Move global event handlers to SDL_VideoInit
Moved the event handlers from SDL_CreateWindow to SDL_VideoInit emscripten_set_mouseup_callback emscripten_set_focus_callback emscripten_set_blur_callback emscripten_set_pointerlockchange_callback emscripten_set_fullscreenchange_callback emscripten_set_resize_callback
1 parent 0593990 commit d6d2c95

File tree

3 files changed

+116
-23
lines changed

3 files changed

+116
-23
lines changed

src/video/emscripten/SDL_emscriptenevents.c

+111-23
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,35 @@ static SDL_Scancode Emscripten_MapScanCode(const char *code)
260260
return SDL_SCANCODE_UNKNOWN;
261261
}
262262

263+
static SDL_Window *Emscripten_GetFocusedWindow(SDL_VideoDevice *device)
264+
{
265+
SDL_Window *window;
266+
for (window = device->windows; window; window = window->next) {
267+
SDL_WindowData *wdata = window->internal;
268+
269+
const int focused = MAIN_THREAD_EM_ASM_INT({
270+
var id = UTF8ToString($0);
271+
try
272+
{
273+
var canvas = document.querySelector(id);
274+
if (canvas) {
275+
return canvas === document.activeElement;
276+
}
277+
}
278+
catch (e)
279+
{
280+
// querySelector throws if not a valid selector
281+
}
282+
return false;
283+
}, wdata->canvas_id);
284+
285+
if (focused) {
286+
break;
287+
}
288+
}
289+
return window;
290+
}
291+
263292
static EM_BOOL Emscripten_HandlePointerLockChange(int eventType, const EmscriptenPointerlockChangeEvent *changeEvent, void *userData)
264293
{
265294
SDL_WindowData *window_data = (SDL_WindowData *)userData;
@@ -268,6 +297,19 @@ static EM_BOOL Emscripten_HandlePointerLockChange(int eventType, const Emscripte
268297
return 0;
269298
}
270299

300+
static EM_BOOL Emscripten_HandlePointerLockChangeGlobal(int eventType, const EmscriptenPointerlockChangeEvent *changeEvent, void *userData)
301+
{
302+
SDL_VideoDevice *device = userData;
303+
bool prevent_default = false;
304+
SDL_Window *window;
305+
306+
for (window = device->windows; window; window = window->next) {
307+
prevent_default |= Emscripten_HandlePointerLockChange(eventType, changeEvent, window->internal);
308+
}
309+
310+
return prevent_default;
311+
}
312+
271313
static EM_BOOL Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
272314
{
273315
SDL_WindowData *window_data = userData;
@@ -355,6 +397,19 @@ static EM_BOOL Emscripten_HandleMouseButton(int eventType, const EmscriptenMouse
355397
return prevent_default;
356398
}
357399

400+
static EM_BOOL Emscripten_HandleMouseButtonGlobal(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
401+
{
402+
SDL_VideoDevice *device = userData;
403+
bool prevent_default = false;
404+
SDL_Window *window;
405+
406+
for (window = device->windows; window; window = window->next) {
407+
prevent_default |= Emscripten_HandleMouseButton(eventType, mouseEvent, window->internal);
408+
}
409+
410+
return prevent_default;
411+
}
412+
358413
static EM_BOOL Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
359414
{
360415
SDL_WindowData *window_data = userData;
@@ -410,9 +465,11 @@ static EM_BOOL Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent
410465
return SDL_EventEnabled(SDL_EVENT_MOUSE_WHEEL);
411466
}
412467

413-
static EM_BOOL Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent *wheelEvent, void *userData)
468+
static EM_BOOL Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent *focusEvent, void *userData)
414469
{
415-
SDL_WindowData *window_data = userData;
470+
SDL_VideoDevice *device = userData;
471+
SDL_Window *window = Emscripten_GetFocusedWindow(device);
472+
416473
SDL_EventType sdl_event_type;
417474

418475
/* If the user switches away while keys are pressed (such as
@@ -422,7 +479,7 @@ static EM_BOOL Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent
422479
}
423480

424481
sdl_event_type = (eventType == EMSCRIPTEN_EVENT_FOCUS) ? SDL_EVENT_WINDOW_FOCUS_GAINED : SDL_EVENT_WINDOW_FOCUS_LOST;
425-
SDL_SetKeyboardFocus(sdl_event_type == SDL_EVENT_WINDOW_FOCUS_GAINED ? window_data->window : NULL);
482+
SDL_SetKeyboardFocus(sdl_event_type == SDL_EVENT_WINDOW_FOCUS_GAINED ? window : NULL);
426483
return SDL_EventEnabled(sdl_event_type);
427484
}
428485

@@ -610,6 +667,16 @@ static EM_BOOL Emscripten_HandleFullscreenChange(int eventType, const Emscripten
610667
return 0;
611668
}
612669

670+
static EM_BOOL Emscripten_HandleFullscreenChangeGlobal(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData)
671+
{
672+
SDL_VideoDevice *device = userData;
673+
SDL_Window *window = Emscripten_GetFocusedWindow(device);
674+
if (window) {
675+
return Emscripten_HandleFullscreenChange(eventType, fullscreenChangeEvent, window->internal);
676+
}
677+
return EM_FALSE;
678+
}
679+
613680
static EM_BOOL Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
614681
{
615682
SDL_WindowData *window_data = userData;
@@ -653,6 +720,19 @@ static EM_BOOL Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *u
653720
return 0;
654721
}
655722

723+
static EM_BOOL Emscripten_HandleResizeGlobal(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
724+
{
725+
SDL_VideoDevice *device = userData;
726+
bool prevent_default = false;
727+
SDL_Window *window;
728+
729+
for (window = device->windows; window; window = window->next) {
730+
prevent_default |= Emscripten_HandleResize(eventType, uiEvent, window->internal);
731+
}
732+
733+
return prevent_default;
734+
}
735+
656736
EM_BOOL
657737
Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
658738
{
@@ -1020,6 +1100,34 @@ static const char *Emscripten_GetKeyboardTargetElement(const char *target)
10201100
return target;
10211101
}
10221102

1103+
void Emscripten_RegisterGlobalEventHandlers(SDL_VideoDevice *device)
1104+
{
1105+
emscripten_set_mouseup_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, device, 0, Emscripten_HandleMouseButtonGlobal);
1106+
1107+
emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, device, 0, Emscripten_HandleFocus);
1108+
emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, device, 0, Emscripten_HandleFocus);
1109+
1110+
emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, device, 0, Emscripten_HandlePointerLockChangeGlobal);
1111+
1112+
emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, device, 0, Emscripten_HandleFullscreenChangeGlobal);
1113+
1114+
emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, device, 0, Emscripten_HandleResizeGlobal);
1115+
}
1116+
1117+
void Emscripten_UnregisterGlobalEventHandlers(SDL_VideoDevice *device)
1118+
{
1119+
emscripten_set_mouseup_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);
1120+
1121+
emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL);
1122+
emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL);
1123+
1124+
emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);
1125+
1126+
emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);
1127+
1128+
emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL);
1129+
}
1130+
10231131
void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
10241132
{
10251133
const char *keyElement;
@@ -1028,36 +1136,26 @@ void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
10281136
emscripten_set_mousemove_callback(data->canvas_id, data, 0, Emscripten_HandleMouseMove);
10291137

10301138
emscripten_set_mousedown_callback(data->canvas_id, data, 0, Emscripten_HandleMouseButton);
1031-
emscripten_set_mouseup_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, data, 0, Emscripten_HandleMouseButton);
10321139

10331140
emscripten_set_mouseenter_callback(data->canvas_id, data, 0, Emscripten_HandleMouseFocus);
10341141
emscripten_set_mouseleave_callback(data->canvas_id, data, 0, Emscripten_HandleMouseFocus);
10351142

10361143
emscripten_set_wheel_callback(data->canvas_id, data, 0, Emscripten_HandleWheel);
10371144

1038-
emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, data, 0, Emscripten_HandleFocus);
1039-
emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, data, 0, Emscripten_HandleFocus);
1040-
10411145
emscripten_set_orientationchange_callback(data, 0, Emscripten_HandleOrientationChange);
10421146

10431147
emscripten_set_touchstart_callback(data->canvas_id, data, 0, Emscripten_HandleTouch);
10441148
emscripten_set_touchend_callback(data->canvas_id, data, 0, Emscripten_HandleTouch);
10451149
emscripten_set_touchmove_callback(data->canvas_id, data, 0, Emscripten_HandleTouch);
10461150
emscripten_set_touchcancel_callback(data->canvas_id, data, 0, Emscripten_HandleTouch);
10471151

1048-
emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, data, 0, Emscripten_HandlePointerLockChange);
1049-
10501152
keyElement = Emscripten_GetKeyboardTargetElement(data->keyboard_element);
10511153
if (keyElement) {
10521154
emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
10531155
emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
10541156
emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
10551157
}
10561158

1057-
emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, data, 0, Emscripten_HandleFullscreenChange);
1058-
1059-
emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, data, 0, Emscripten_HandleResize);
1060-
10611159
emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
10621160

10631161
emscripten_set_beforeunload_callback(data, Emscripten_HandleBeforeUnload);
@@ -1085,36 +1183,26 @@ void Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
10851183
emscripten_set_mousemove_callback(data->canvas_id, NULL, 0, NULL);
10861184

10871185
emscripten_set_mousedown_callback(data->canvas_id, NULL, 0, NULL);
1088-
emscripten_set_mouseup_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);
10891186

10901187
emscripten_set_mouseenter_callback(data->canvas_id, NULL, 0, NULL);
10911188
emscripten_set_mouseleave_callback(data->canvas_id, NULL, 0, NULL);
10921189

10931190
emscripten_set_wheel_callback(data->canvas_id, NULL, 0, NULL);
10941191

1095-
emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL);
1096-
emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL);
1097-
10981192
emscripten_set_orientationchange_callback(NULL, 0, NULL);
10991193

11001194
emscripten_set_touchstart_callback(data->canvas_id, NULL, 0, NULL);
11011195
emscripten_set_touchend_callback(data->canvas_id, NULL, 0, NULL);
11021196
emscripten_set_touchmove_callback(data->canvas_id, NULL, 0, NULL);
11031197
emscripten_set_touchcancel_callback(data->canvas_id, NULL, 0, NULL);
11041198

1105-
emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);
1106-
11071199
keyElement = Emscripten_GetKeyboardTargetElement(data->keyboard_element);
11081200
if (keyElement) {
11091201
emscripten_set_keydown_callback(keyElement, NULL, 0, NULL);
11101202
emscripten_set_keyup_callback(keyElement, NULL, 0, NULL);
11111203
emscripten_set_keypress_callback(keyElement, NULL, 0, NULL);
11121204
}
11131205

1114-
emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);
1115-
1116-
emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL);
1117-
11181206
emscripten_set_visibilitychange_callback(NULL, 0, NULL);
11191207

11201208
emscripten_set_beforeunload_callback(NULL, NULL);

src/video/emscripten/SDL_emscriptenevents.h

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
#include "SDL_emscriptenvideo.h"
2626

27+
extern void Emscripten_RegisterGlobalEventHandlers(SDL_VideoDevice *device);
28+
extern void Emscripten_UnregisterGlobalEventHandlers(SDL_VideoDevice *device);
2729
extern void Emscripten_RegisterEventHandlers(SDL_WindowData *data);
2830
extern void Emscripten_UnregisterEventHandlers(SDL_WindowData *data);
2931
extern EM_BOOL Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData);

src/video/emscripten/SDL_emscriptenvideo.c

+3
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ bool Emscripten_VideoInit(SDL_VideoDevice *_this)
390390
SDL_AddKeyboard(SDL_DEFAULT_KEYBOARD_ID, NULL, false);
391391
SDL_AddMouse(SDL_DEFAULT_MOUSE_ID, NULL, false);
392392

393+
Emscripten_RegisterGlobalEventHandlers(_this);
394+
393395
// We're done!
394396
return true;
395397
}
@@ -402,6 +404,7 @@ static bool Emscripten_SetDisplayMode(SDL_VideoDevice *_this, SDL_VideoDisplay *
402404

403405
static void Emscripten_VideoQuit(SDL_VideoDevice *_this)
404406
{
407+
Emscripten_UnregisterGlobalEventHandlers(_this);
405408
Emscripten_QuitMouse();
406409
Emscripten_UnlistenSystemTheme();
407410
pumpevents_has_run = false;

0 commit comments

Comments
 (0)