@@ -19,6 +19,7 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
1919#include " prefix.h"
2020
2121#include " em-dc.h"
22+ #include " em-javascript.h"
2223#include " em-view.h"
2324#include " em-async.h"
2425#include " em-event.h"
@@ -99,15 +100,39 @@ bool MCEmscriptenHandleMousePress(MCStack *p_stack, uint32_t p_time, uint32_t p_
99100 if (MCnoui) return false ;
100101
101102 MCScreenDC *t_dc = static_cast <MCScreenDC *>(MCscreen);
103+ t_dc->update_mouse_press_state (p_state, p_button);
102104
103- t_dc->handle_mouse_press (p_stack, p_time, p_modifiers, p_state, p_button);
105+ MCEventQueuePostMousePress (p_stack, p_time, p_modifiers, p_state, p_button);
106+
107+ return true ;
108+ }
109+
110+ static inline MCPoint MCEmscriptenWindowToGlobalLoc (MCStack *p_stack, const MCPoint &p_loc)
111+ {
112+ MCRectangle t_window_rect = p_stack->view_getrect ();
113+ return MCPointOffset (p_loc, t_window_rect.x , t_window_rect.y );
114+ }
115+
116+ MC_DLLEXPORT_DEF
117+ bool MCEmscriptenHandleMousePosition (MCStack *p_stack, uint32_t p_time, uint32_t p_modifiers, int32_t p_x, int32_t p_y)
118+ {
119+ if (MCnoui) return false ;
120+
121+ MCScreenDC *t_dc = static_cast <MCScreenDC *>(MCscreen);
122+
123+ MCPoint t_position = MCPointMake (p_x, p_y);
124+ if (p_stack)
125+ t_position = MCEmscriptenWindowToGlobalLoc (p_stack, t_position);
126+ if (t_dc->update_mouse_position (t_position))
127+ MCEventQueuePostMousePosition (p_stack, p_time, p_modifiers, p_x, p_y);
104128
105129 return true ;
106130}
107131
108132MCScreenDC::MCScreenDC ()
109133 : m_main_window(nil), m_mouse_button_state(0 )
110134{
135+ m_mouse_position = MCPointMake (-1 ,-1 );
111136}
112137
113138MCScreenDC::~MCScreenDC ()
@@ -118,6 +143,7 @@ Boolean
118143MCScreenDC::open ()
119144{
120145 return
146+ MCEmscriptenJSInitialize () &&
121147 MCEmscriptenEventInitialize () &&
122148 MCEmscriptenViewInitialize () &&
123149 MCEmscriptenLibUrlInitialize () &&
@@ -132,6 +158,7 @@ MCScreenDC::close(Boolean force)
132158 MCEmscriptenViewFinalize ();
133159 MCEmscriptenEventFinalize ();
134160 MCEmscriptenLibUrlFinalize ();
161+ MCEmscriptenJSFinalize ();
135162
136163 return true ;
137164}
@@ -412,7 +439,7 @@ MCScreenDC::popupaskdialog(uint32_t p_type, MCStringRef p_title, MCStringRef p_m
412439
413440
414441void
415- MCScreenDC::handle_mouse_press (MCStack *p_stack, uint32_t p_time, uint32_t p_modifiers, MCMousePressState p_state, int32_t p_button)
442+ MCScreenDC::update_mouse_press_state ( MCMousePressState p_state, int32_t p_button)
416443{
417444 // track mouse button pressed state
418445 /* NOTE - assumes there are no more than 32 mouse buttons */
@@ -423,8 +450,17 @@ MCScreenDC::handle_mouse_press(MCStack *p_stack, uint32_t p_time, uint32_t p_mod
423450 else if (p_state == kMCMousePressStateUp )
424451 m_mouse_button_state &= ~(1UL << p_button);
425452 }
453+ }
454+
455+ bool
456+ MCScreenDC::update_mouse_position (const MCPoint &p_position)
457+ {
458+ if (MCPointIsEqual (m_mouse_position, p_position))
459+ return false ;
426460
427- MCEventQueuePostMousePress (p_stack, p_time, p_modifiers, p_state, p_button);
461+ m_mouse_position = p_position;
462+
463+ return true ;
428464}
429465
430466Boolean
@@ -442,6 +478,6 @@ MCScreenDC::platform_querymouse(int16_t& r_x, int16_t& r_y)
442478{
443479 // There is no asynchronous mouse position in Emscripten; just whatever the
444480 // browser has told us about.
445- r_x = MCmousex ;
446- r_y = MCmousey ;
481+ r_x = m_mouse_position. x ;
482+ r_y = m_mouse_position. y ;
447483}
0 commit comments