@@ -260,6 +260,35 @@ static SDL_Scancode Emscripten_MapScanCode(const char *code)
260
260
return SDL_SCANCODE_UNKNOWN ;
261
261
}
262
262
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
+
263
292
static EM_BOOL Emscripten_HandlePointerLockChange (int eventType , const EmscriptenPointerlockChangeEvent * changeEvent , void * userData )
264
293
{
265
294
SDL_WindowData * window_data = (SDL_WindowData * )userData ;
@@ -268,6 +297,19 @@ static EM_BOOL Emscripten_HandlePointerLockChange(int eventType, const Emscripte
268
297
return 0 ;
269
298
}
270
299
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
+
271
313
static EM_BOOL Emscripten_HandleMouseMove (int eventType , const EmscriptenMouseEvent * mouseEvent , void * userData )
272
314
{
273
315
SDL_WindowData * window_data = userData ;
@@ -355,6 +397,19 @@ static EM_BOOL Emscripten_HandleMouseButton(int eventType, const EmscriptenMouse
355
397
return prevent_default ;
356
398
}
357
399
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
+
358
413
static EM_BOOL Emscripten_HandleMouseFocus (int eventType , const EmscriptenMouseEvent * mouseEvent , void * userData )
359
414
{
360
415
SDL_WindowData * window_data = userData ;
@@ -410,9 +465,11 @@ static EM_BOOL Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent
410
465
return SDL_EventEnabled (SDL_EVENT_MOUSE_WHEEL );
411
466
}
412
467
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 )
414
469
{
415
- SDL_WindowData * window_data = userData ;
470
+ SDL_VideoDevice * device = userData ;
471
+ SDL_Window * window = Emscripten_GetFocusedWindow (device );
472
+
416
473
SDL_EventType sdl_event_type ;
417
474
418
475
/* If the user switches away while keys are pressed (such as
@@ -422,7 +479,7 @@ static EM_BOOL Emscripten_HandleFocus(int eventType, const EmscriptenFocusEvent
422
479
}
423
480
424
481
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 );
426
483
return SDL_EventEnabled (sdl_event_type );
427
484
}
428
485
@@ -610,6 +667,16 @@ static EM_BOOL Emscripten_HandleFullscreenChange(int eventType, const Emscripten
610
667
return 0 ;
611
668
}
612
669
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
+
613
680
static EM_BOOL Emscripten_HandleResize (int eventType , const EmscriptenUiEvent * uiEvent , void * userData )
614
681
{
615
682
SDL_WindowData * window_data = userData ;
@@ -653,6 +720,19 @@ static EM_BOOL Emscripten_HandleResize(int eventType, const EmscriptenUiEvent *u
653
720
return 0 ;
654
721
}
655
722
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
+
656
736
EM_BOOL
657
737
Emscripten_HandleCanvasResize (int eventType , const void * reserved , void * userData )
658
738
{
@@ -1020,6 +1100,34 @@ static const char *Emscripten_GetKeyboardTargetElement(const char *target)
1020
1100
return target ;
1021
1101
}
1022
1102
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
+
1023
1131
void Emscripten_RegisterEventHandlers (SDL_WindowData * data )
1024
1132
{
1025
1133
const char * keyElement ;
@@ -1028,36 +1136,26 @@ void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
1028
1136
emscripten_set_mousemove_callback (data -> canvas_id , data , 0 , Emscripten_HandleMouseMove );
1029
1137
1030
1138
emscripten_set_mousedown_callback (data -> canvas_id , data , 0 , Emscripten_HandleMouseButton );
1031
- emscripten_set_mouseup_callback (EMSCRIPTEN_EVENT_TARGET_DOCUMENT , data , 0 , Emscripten_HandleMouseButton );
1032
1139
1033
1140
emscripten_set_mouseenter_callback (data -> canvas_id , data , 0 , Emscripten_HandleMouseFocus );
1034
1141
emscripten_set_mouseleave_callback (data -> canvas_id , data , 0 , Emscripten_HandleMouseFocus );
1035
1142
1036
1143
emscripten_set_wheel_callback (data -> canvas_id , data , 0 , Emscripten_HandleWheel );
1037
1144
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
-
1041
1145
emscripten_set_orientationchange_callback (data , 0 , Emscripten_HandleOrientationChange );
1042
1146
1043
1147
emscripten_set_touchstart_callback (data -> canvas_id , data , 0 , Emscripten_HandleTouch );
1044
1148
emscripten_set_touchend_callback (data -> canvas_id , data , 0 , Emscripten_HandleTouch );
1045
1149
emscripten_set_touchmove_callback (data -> canvas_id , data , 0 , Emscripten_HandleTouch );
1046
1150
emscripten_set_touchcancel_callback (data -> canvas_id , data , 0 , Emscripten_HandleTouch );
1047
1151
1048
- emscripten_set_pointerlockchange_callback (EMSCRIPTEN_EVENT_TARGET_DOCUMENT , data , 0 , Emscripten_HandlePointerLockChange );
1049
-
1050
1152
keyElement = Emscripten_GetKeyboardTargetElement (data -> keyboard_element );
1051
1153
if (keyElement ) {
1052
1154
emscripten_set_keydown_callback (keyElement , data , 0 , Emscripten_HandleKey );
1053
1155
emscripten_set_keyup_callback (keyElement , data , 0 , Emscripten_HandleKey );
1054
1156
emscripten_set_keypress_callback (keyElement , data , 0 , Emscripten_HandleKeyPress );
1055
1157
}
1056
1158
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
-
1061
1159
emscripten_set_visibilitychange_callback (data , 0 , Emscripten_HandleVisibilityChange );
1062
1160
1063
1161
emscripten_set_beforeunload_callback (data , Emscripten_HandleBeforeUnload );
@@ -1085,36 +1183,26 @@ void Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
1085
1183
emscripten_set_mousemove_callback (data -> canvas_id , NULL , 0 , NULL );
1086
1184
1087
1185
emscripten_set_mousedown_callback (data -> canvas_id , NULL , 0 , NULL );
1088
- emscripten_set_mouseup_callback (EMSCRIPTEN_EVENT_TARGET_DOCUMENT , NULL , 0 , NULL );
1089
1186
1090
1187
emscripten_set_mouseenter_callback (data -> canvas_id , NULL , 0 , NULL );
1091
1188
emscripten_set_mouseleave_callback (data -> canvas_id , NULL , 0 , NULL );
1092
1189
1093
1190
emscripten_set_wheel_callback (data -> canvas_id , NULL , 0 , NULL );
1094
1191
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
-
1098
1192
emscripten_set_orientationchange_callback (NULL , 0 , NULL );
1099
1193
1100
1194
emscripten_set_touchstart_callback (data -> canvas_id , NULL , 0 , NULL );
1101
1195
emscripten_set_touchend_callback (data -> canvas_id , NULL , 0 , NULL );
1102
1196
emscripten_set_touchmove_callback (data -> canvas_id , NULL , 0 , NULL );
1103
1197
emscripten_set_touchcancel_callback (data -> canvas_id , NULL , 0 , NULL );
1104
1198
1105
- emscripten_set_pointerlockchange_callback (EMSCRIPTEN_EVENT_TARGET_DOCUMENT , NULL , 0 , NULL );
1106
-
1107
1199
keyElement = Emscripten_GetKeyboardTargetElement (data -> keyboard_element );
1108
1200
if (keyElement ) {
1109
1201
emscripten_set_keydown_callback (keyElement , NULL , 0 , NULL );
1110
1202
emscripten_set_keyup_callback (keyElement , NULL , 0 , NULL );
1111
1203
emscripten_set_keypress_callback (keyElement , NULL , 0 , NULL );
1112
1204
}
1113
1205
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
-
1118
1206
emscripten_set_visibilitychange_callback (NULL , 0 , NULL );
1119
1207
1120
1208
emscripten_set_beforeunload_callback (NULL , NULL );
0 commit comments