99#include " config.h"
1010
1111#include < emscripten.h>
12- #include < emscripten/html5.h>
1312#include " include/osd.h"
1413#include " common/smbas.h"
1514#include " lib/maapi.h"
@@ -41,26 +40,12 @@ MAEvent *getKeyPressedEvent(int keycode, int nativeKey) {
4140}
4241
4342EM_BOOL mouse_callback (int eventType, const EmscriptenMouseEvent *e, void *userData) {
44- // printf("%s, screen: (%ld,%ld), client: (%ld,%ld),%s%s%s%s button: %hu, buttons: %hu, movement: (%ld,%ld), target: (%ld, %ld)\n",
45- // emscripten_event_type_to_string(eventType), e->screenX, e->screenY, e->clientX, e->clientY,
46- // e->ctrlKey ? " CTRL" : "", e->shiftKey ? " SHIFT" : "", e->altKey ? " ALT" : "", e->metaKey ? " META" : "",
47- // e->button, e->buttons, e->movementX, e->movementY, e->targetX, e->targetY);
43+ runtime->handleMouse (eventType, e);
44+ return 0 ;
45+ }
4846
49- switch (eventType) {
50- case EMSCRIPTEN_EVENT_DBLCLICK:
51- case EMSCRIPTEN_EVENT_CLICK:
52- //
53- break ;
54- case EMSCRIPTEN_EVENT_MOUSEDOWN:
55- runtime->pushEvent (getMotionEvent (EVENT_TYPE_POINTER_PRESSED, e));
56- break ;
57- case EMSCRIPTEN_EVENT_MOUSEMOVE:
58- runtime->pushEvent (getMotionEvent (EVENT_TYPE_POINTER_DRAGGED, e));
59- break ;
60- case EMSCRIPTEN_EVENT_MOUSEUP:
61- runtime->pushEvent (getMotionEvent (EVENT_TYPE_POINTER_RELEASED, e));
62- break ;
63- }
47+ EM_BOOL key_callback (int eventType, const EmscriptenKeyboardEvent *e, void *userData) {
48+ runtime->handleKeyboard (eventType, e);
6449 return 0 ;
6550}
6651
@@ -69,11 +54,10 @@ Runtime::Runtime() :
6954 logEntered ();
7055 runtime = this ;
7156
72- emscripten_set_click_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, 0 , 1 , mouse_callback);
73- emscripten_set_mousedown_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, 0 , 1 , mouse_callback);
74- emscripten_set_mouseup_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, 0 , 1 , mouse_callback);
75- emscripten_set_dblclick_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, 0 , 1 , mouse_callback);
76- emscripten_set_mousemove_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, 0 , 1 , mouse_callback);
57+ emscripten_set_mousedown_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this , true , mouse_callback);
58+ emscripten_set_mouseup_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this , true , mouse_callback);
59+ emscripten_set_mousemove_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this , true , mouse_callback);
60+ emscripten_set_keydown_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this , true , key_callback);
7761
7862 MAExtent screenSize = maGetScrSize ();
7963 _output = new AnsiWidget (EXTENT_X (screenSize), EXTENT_Y (screenSize));
@@ -87,11 +71,12 @@ Runtime::Runtime() :
8771
8872Runtime::~Runtime () {
8973 logEntered ();
74+ emscripten_html5_remove_all_event_listeners ();
9075 delete _output;
9176 delete _eventQueue;
92- runtime = NULL ;
93- _output = NULL ;
94- _eventQueue = NULL ;
77+ runtime = nullptr ;
78+ _output = nullptr ;
79+ _eventQueue = nullptr ;
9580}
9681
9782void Runtime::alert (const char *title, const char *message) {
@@ -126,15 +111,40 @@ char *Runtime::loadResource(const char *fileName) {
126111 return buffer;
127112}
128113
129- void Runtime::optionsBox (StringList *items) {
114+ void Runtime::handleKeyboard (int eventType, const EmscriptenKeyboardEvent *e) {
115+ trace (" eventType: %d [%s %s %s] [%d %d %d] %s%s%s%s " ,
116+ eventType,
117+ e->key , e->code , e->charValue ,
118+ e->charCode , e->keyCode , e->which ,
119+ e->ctrlKey ? " CTRL" : " " , e->shiftKey ? " SHIFT" : " " , e->altKey ? " ALT" : " " , e->metaKey ? " META" : " " );
130120
131121}
132122
123+ void Runtime::handleMouse (int eventType, const EmscriptenMouseEvent *e) {
124+ switch (eventType) {
125+ case EMSCRIPTEN_EVENT_MOUSEDOWN:
126+ if (e->button == 2 ) {
127+ _menuX = e->clientX ;
128+ _menuY = e->clientY ;
129+ showMenu ();
130+ } else {
131+ pushEvent (getMotionEvent (EVENT_TYPE_POINTER_PRESSED, e));
132+ }
133+ break ;
134+ case EMSCRIPTEN_EVENT_MOUSEMOVE:
135+ pushEvent (getMotionEvent (EVENT_TYPE_POINTER_DRAGGED, e));
136+ break ;
137+ case EMSCRIPTEN_EVENT_MOUSEUP:
138+ pushEvent (getMotionEvent (EVENT_TYPE_POINTER_RELEASED, e));
139+ break ;
140+ }
141+ }
142+
133143void Runtime::pause (int timeout) {
134144 if (timeout == -1 ) {
135145 if (hasEvent ()) {
136146 MAEvent *event = popEvent ();
137- processEvent (*event);
147+ handleEvent (*event);
138148 delete event;
139149 }
140150 } else {
@@ -144,7 +154,7 @@ void Runtime::pause(int timeout) {
144154 break ;
145155 } else if (hasEvent ()) {
146156 MAEvent *event = popEvent ();
147- processEvent (*event);
157+ handleEvent (*event);
148158 delete event;
149159 }
150160 emscripten_sleep (WAIT_INTERVAL);
@@ -157,17 +167,6 @@ void Runtime::pause(int timeout) {
157167
158168}
159169
160- void Runtime::processEvent (MAEvent &event) {
161- switch (event.type ) {
162- case EVENT_TYPE_KEY_PRESSED:
163- // handleKeyEvent(event);
164- break ;
165- default :
166- handleEvent (event);
167- break ;
168- }
169- }
170-
171170MAEvent Runtime::processEvents (int waitFlag) {
172171 switch (waitFlag) {
173172 case 1 :
@@ -188,7 +187,7 @@ MAEvent Runtime::processEvents(int waitFlag) {
188187 MAEvent event;
189188 if (hasEvent ()) {
190189 MAEvent *nextEvent = popEvent ();
191- processEvent (*nextEvent);
190+ handleEvent (*nextEvent);
192191 event = *nextEvent;
193192 delete nextEvent;
194193 } else {
@@ -237,6 +236,10 @@ int maGetEvent(MAEvent *event) {
237236 return result;
238237}
239238
239+ void maPushEvent (MAEvent *maEvent) {
240+ runtime->pushEvent (maEvent);
241+ }
242+
240243void maWait (int timeout) {
241244 runtime->pause (timeout);
242245}
0 commit comments