@@ -196,6 +196,26 @@ static bool Emscripten_SetRelativeMouseMode(bool enabled)
196
196
return false;
197
197
}
198
198
199
+ static SDL_MouseButtonFlags Emscripten_GetGlobalMouseState (float * x , float * y )
200
+ {
201
+ * x = MAIN_THREAD_EM_ASM_DOUBLE ({
202
+ return Module ['SDL3' ]['mouse_x' ];
203
+ });
204
+ * y = MAIN_THREAD_EM_ASM_DOUBLE ({
205
+ return Module ['SDL3' ]['mouse_y' ];
206
+ });
207
+ SDL_MouseButtonFlags flags = 0 ;
208
+ for (int i = 0 ; i < 5 ; ++ i ) {
209
+ const bool button_down = MAIN_THREAD_EM_ASM_INT ({
210
+ return Module ['SDL3' ]['mouse_buttons' ][$0 ];
211
+ }, i );
212
+ if (button_down ) {
213
+ flags |= 1 << i ;
214
+ }
215
+ }
216
+ return flags ;
217
+ }
218
+
199
219
void Emscripten_InitMouse (void )
200
220
{
201
221
SDL_Mouse * mouse = SDL_GetMouse ();
@@ -206,6 +226,46 @@ void Emscripten_InitMouse(void)
206
226
mouse -> CreateSystemCursor = Emscripten_CreateSystemCursor ;
207
227
mouse -> SetRelativeMouseMode = Emscripten_SetRelativeMouseMode ;
208
228
229
+ // Add event listeners to track mouse events on the document
230
+ MAIN_THREAD_EM_ASM ({
231
+ if (!Module ['SDL3' ]) {
232
+ Module ['SDL3' ] = {};
233
+ }
234
+ var SDL3 = Module ['SDL3' ];
235
+ SDL3 ['mouse_x' ] = 0 ;
236
+ SDL3 ['mouse_y' ] = 0 ;
237
+ /*
238
+ Based on https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
239
+ Possible value for button in the event object is [0, 5)
240
+ NOTE: Some browsers do not allow handling the forwards and backwards buttons
241
+ */
242
+ SDL3 ['mouse_buttons' ] = [];
243
+ for (var i = 0 ; i < 5 ; ++ i ) {
244
+ SDL3 ['mouse_buttons' ][i ] = false;
245
+ }
246
+ document .addEventListener ('mousemove' , function (e ) {
247
+ // Reacquire from object in case it changed for some reason
248
+ var SDL3 = Module ['SDL3' ];
249
+ SDL3 ['mouse_x' ] = e .clientX ;
250
+ SDL3 ['mouse_y' ] = e .clientY ;
251
+ });
252
+ document .addEventListener ('mousedown' , function (e ) {
253
+ // Reacquire from object in case it changed for some reason
254
+ var SDL3 = Module ['SDL3' ];
255
+ if (0 <= e .button && e .button < SDL3 ['mouse_buttons' ].length ) {
256
+ SDL3 ['mouse_buttons' ][e .button ] = true;
257
+ }
258
+ });
259
+ document .addEventListener ('mouseup' , function (e ) {
260
+ // Reacquire from object in case it changed for some reason
261
+ var SDL3 = Module ['SDL3' ];
262
+ if (0 <= e .button && e .button < SDL3 ['mouse_buttons' ].length ) {
263
+ SDL3 ['mouse_buttons' ][e .button ] = false;
264
+ }
265
+ });
266
+ });
267
+ mouse -> GetGlobalMouseState = Emscripten_GetGlobalMouseState ;
268
+
209
269
SDL_SetDefaultCursor (Emscripten_CreateDefaultCursor ());
210
270
}
211
271
0 commit comments