@@ -197,7 +197,11 @@ var LibraryJSEvents = {
197
197
JSEvents . registerOrRemoveHandler ( eventHandler ) ;
198
198
} ,
199
199
200
- fillMouseEventData: function ( eventStruct , e ) {
200
+ // Copies mouse event data from the given JS mouse event 'e' to the specified Emscripten mouse event structure in the HEAP.
201
+ // eventStruct: the structure to populate.
202
+ // e: The JS mouse event to read data from.
203
+ // target: Specifies a target DOM element that will be used as the reference to populate targetX and targetY parameters.
204
+ fillMouseEventData: function ( eventStruct , e , target ) {
201
205
{ { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . timestamp , 'JSEvents.tick()' , 'double' ) } } } ;
202
206
{ { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . screenX , 'e.screenX' , 'i32' ) } } } ;
203
207
{ { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . screenY , 'e.screenY' , 'i32' ) } } } ;
@@ -220,6 +224,14 @@ var LibraryJSEvents = {
220
224
{ { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . canvasX , '0' , 'i32' ) } } } ;
221
225
{ { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . canvasY , '0' , 'i32' ) } } } ;
222
226
}
227
+ if ( target ) {
228
+ var rect = ( target === window ) ? { left : 0 , top : 0 } : target . getBoundingClientRect ( ) ;
229
+ { { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . targetX , 'e.clientX - rect.left' , 'i32' ) } } } ;
230
+ { { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . targetY , 'e.clientY - rect.top' , 'i32' ) } } } ;
231
+ } else { // No specific target passed, return 0.
232
+ { { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . targetX , '0' , 'i32' ) } } } ;
233
+ { { { makeSetValue ( 'eventStruct' , C_STRUCTS . EmscriptenMouseEvent . targetY , '0' , 'i32' ) } } } ;
234
+ }
223
235
JSEvents . previousScreenX = e . screenX ;
224
236
JSEvents . previousScreenY = e . screenY ;
225
237
} ,
@@ -228,17 +240,18 @@ var LibraryJSEvents = {
228
240
if ( ! JSEvents . mouseEvent ) {
229
241
JSEvents . mouseEvent = _malloc ( { { { C_STRUCTS . EmscriptenMouseEvent . __size__ } } } ) ;
230
242
}
243
+ target = JSEvents . findEventTarget ( target ) ;
231
244
var handlerFunc = function ( event ) {
232
245
var e = event || window . event ;
233
- JSEvents . fillMouseEventData ( JSEvents . mouseEvent , e ) ;
246
+ JSEvents . fillMouseEventData ( JSEvents . mouseEvent , e , target ) ;
234
247
var shouldCancel = Runtime . dynCall ( 'iiii' , callbackfunc , [ eventTypeId , JSEvents . mouseEvent , userData ] ) ;
235
248
if ( shouldCancel ) {
236
249
e . preventDefault ( ) ;
237
250
}
238
251
} ;
239
252
240
253
var eventHandler = {
241
- target : JSEvents . findEventTarget ( target ) ,
254
+ target : target ,
242
255
allowsDeferredCalls : eventTypeString != 'mousemove' , // Mouse move events do not allow fullscreen/pointer lock requests to be handled in them!
243
256
eventTypeString : eventTypeString ,
244
257
callbackfunc : callbackfunc ,
@@ -254,10 +267,11 @@ var LibraryJSEvents = {
254
267
if ( ! JSEvents . wheelEvent ) {
255
268
JSEvents . wheelEvent = _malloc ( { { { C_STRUCTS . EmscriptenWheelEvent . __size__ } } } ) ;
256
269
}
270
+ target = JSEvents . findEventTarget ( target ) ;
257
271
// The DOM Level 3 events spec event 'wheel'
258
272
var wheelHandlerFunc = function ( event ) {
259
273
var e = event || window . event ;
260
- JSEvents . fillMouseEventData ( JSEvents . wheelEvent , e ) ;
274
+ JSEvents . fillMouseEventData ( JSEvents . wheelEvent , e , target ) ;
261
275
{ { { makeSetValue ( 'JSEvents.wheelEvent' , C_STRUCTS . EmscriptenWheelEvent . deltaX , 'e["deltaX"]' , 'double' ) } } } ;
262
276
{ { { makeSetValue ( 'JSEvents.wheelEvent' , C_STRUCTS . EmscriptenWheelEvent . deltaY , 'e["deltaY"]' , 'double' ) } } } ;
263
277
{ { { makeSetValue ( 'JSEvents.wheelEvent' , C_STRUCTS . EmscriptenWheelEvent . deltaZ , 'e["deltaZ"]' , 'double' ) } } } ;
@@ -270,7 +284,7 @@ var LibraryJSEvents = {
270
284
// The 'mousewheel' event as implemented in Safari 6.0.5
271
285
var mouseWheelHandlerFunc = function ( event ) {
272
286
var e = event || window . event ;
273
- JSEvents . fillMouseEventData ( JSEvents . wheelEvent , e ) ;
287
+ JSEvents . fillMouseEventData ( JSEvents . wheelEvent , e , target ) ;
274
288
{ { { makeSetValue ( 'JSEvents.wheelEvent' , C_STRUCTS . EmscriptenWheelEvent . deltaX , 'e["wheelDeltaX"]' , 'double' ) } } } ;
275
289
{ { { makeSetValue ( 'JSEvents.wheelEvent' , C_STRUCTS . EmscriptenWheelEvent . deltaY , '-e["wheelDeltaY"] /* Invert to unify direction with the DOM Level 3 wheel event. */' , 'double' ) } } } ;
276
290
{ { { makeSetValue ( 'JSEvents.wheelEvent' , C_STRUCTS . EmscriptenWheelEvent . deltaZ , '0 /* Not available */' , 'double' ) } } } ;
@@ -282,7 +296,7 @@ var LibraryJSEvents = {
282
296
} ;
283
297
284
298
var eventHandler = {
285
- target : JSEvents . findEventTarget ( target ) ,
299
+ target : target ,
286
300
allowsDeferredCalls : true ,
287
301
eventTypeString : eventTypeString ,
288
302
callbackfunc : callbackfunc ,
@@ -699,6 +713,8 @@ var LibraryJSEvents = {
699
713
JSEvents . touchEvent = _malloc ( { { { C_STRUCTS . EmscriptenTouchEvent . __size__ } } } ) ;
700
714
}
701
715
716
+ target = JSEvents . findEventTarget ( target ) ;
717
+
702
718
var handlerFunc = function ( event ) {
703
719
var e = event || window . event ;
704
720
@@ -723,7 +739,8 @@ var LibraryJSEvents = {
723
739
{ { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchEvent . altKey , 'e.altKey' , 'i32' ) } } } ;
724
740
{ { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchEvent . metaKey , 'e.metaKey' , 'i32' ) } } } ;
725
741
ptr += { { { C_STRUCTS . EmscriptenTouchEvent . touches } } } ; // Advance to the start of the touch array.
726
- var rect = Module [ 'canvas' ] . getBoundingClientRect ( ) ;
742
+ var canvasRect = Module [ 'canvas' ] ? Module [ 'canvas' ] . getBoundingClientRect ( ) : undefined ;
743
+ var targetRect = ( target === window ) ? { left : 0 , top : 0 } : target . getBoundingClientRect ( ) ;
727
744
var numTouches = 0 ;
728
745
for ( var i in touches ) {
729
746
var t = touches [ i ] ;
@@ -736,8 +753,16 @@ var LibraryJSEvents = {
736
753
{ { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . pageY , 't.pageY' , 'i32' ) } } } ;
737
754
{ { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . isChanged , 't.changed' , 'i32' ) } } } ;
738
755
{ { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . onTarget , 't.onTarget' , 'i32' ) } } } ;
739
- { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . canvasX , 't.clientX - rect.left' , 'i32' ) } } } ;
740
- { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . canvasY , 't.clientY - rect.top' , 'i32' ) } } } ;
756
+ if ( canvasRect ) {
757
+ { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . canvasX , 't.clientX - canvasRect.left' , 'i32' ) } } } ;
758
+ { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . canvasY , 't.clientY - canvasRect.top' , 'i32' ) } } } ;
759
+ } else {
760
+ { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . canvasX , '0' , 'i32' ) } } } ;
761
+ { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . canvasY , '0' , 'i32' ) } } } ;
762
+ }
763
+ { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . targetX , 't.clientX - targetRect.left' , 'i32' ) } } } ;
764
+ { { { makeSetValue ( 'ptr' , C_STRUCTS . EmscriptenTouchPoint . targetY , 't.clientY - targetRect.top' , 'i32' ) } } } ;
765
+
741
766
ptr += { { { C_STRUCTS . EmscriptenTouchPoint . __size__ } } } ;
742
767
743
768
if ( ++ numTouches >= 32 ) {
@@ -753,7 +778,7 @@ var LibraryJSEvents = {
753
778
} ;
754
779
755
780
var eventHandler = {
756
- target : JSEvents . findEventTarget ( target ) ,
781
+ target : target ,
757
782
allowsDeferredCalls : false , // XXX Currently disabled, see bug https://bugzilla.mozilla.org/show_bug.cgi?id=966493
758
783
// Once the above bug is resolved, enable the following condition if possible:
759
784
// allowsDeferredCalls: eventTypeString == 'touchstart',
0 commit comments