2424#define EVENT_TYPE_RESTART 101
2525#define EVENT_TYPE_SHOW_MENU 102
2626#define EVENT_TYPE_RESIZE 103
27+ #define EVENT_TYPE_BACK 104
28+ #define EVENT_TYPE_PGUP 105
29+ #define EVENT_TYPE_PGDN 106
30+ #define EVENT_TYPE_UP 107
31+ #define EVENT_TYPE_DN 108
2732
2833Runtime *runtime;
2934String clipboard;
3035
3136MAEvent *getMotionEvent (int type, const EmscriptenMouseEvent *event) {
3237 MAEvent *result = new MAEvent ();
3338 result->type = type;
34- result->point .x = event->clientX ;
35- result->point .y = event->clientY ;
39+ if (event) {
40+ result->point .x = event->clientX ;
41+ result->point .y = event->clientY ;
42+ }
3643 return result;
3744}
3845
@@ -45,13 +52,11 @@ MAEvent *getKeyPressedEvent(int keycode, int nativeKey = 0) {
4552}
4653
4754EM_BOOL mouse_callback (int eventType, const EmscriptenMouseEvent *e, void *userData) {
48- runtime->handleMouse (eventType, e);
49- return 0 ;
55+ return runtime->handleMouse (eventType, e);
5056}
5157
5258EM_BOOL key_callback (int eventType, const EmscriptenKeyboardEvent *e, void *userData) {
53- runtime->handleKeyboard (eventType, e);
54- return 0 ;
59+ return runtime->handleKeyboard (eventType, e);
5560}
5661
5762EM_BOOL resize_callback (int eventType, const EmscriptenUiEvent *e, void *userData) {
@@ -127,14 +132,23 @@ char *Runtime::loadResource(const char *fileName) {
127132 return buffer;
128133}
129134
130- void Runtime::handleKeyboard (int eventType, const EmscriptenKeyboardEvent *e) {
135+ bool Runtime::handleKeyboard (int eventType, const EmscriptenKeyboardEvent *e) {
131136 int keyCode = e->keyCode ;
137+ bool result = true ;
132138 switch (e->keyCode ) {
133139 case DOM_VK_SHIFT:
134140 case DOM_VK_CONTROL:
135141 case DOM_VK_ALT:
136142 case DOM_VK_CAPS_LOCK:
137143 // ignore press without modifier key
144+ result = false ;
145+ break ;
146+
147+ case DOM_VK_F5:
148+ case DOM_VK_F11:
149+ case DOM_VK_F12:
150+ // ignore standard browser keystrokes
151+ result = false ;
138152 break ;
139153
140154 default :
@@ -155,9 +169,38 @@ void Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
155169 if (keyCode >= ' A' && keyCode <= ' Z' ) {
156170 keyCode += (' a' - ' A' );
157171 }
158- pushEvent (getKeyPressedEvent (SB_KEY_CTRL (keyCode)));
172+ switch (keyCode) {
173+ case ' b' :
174+ pushEvent (getMotionEvent (EVENT_TYPE_BACK, nullptr ));
175+ break ;
176+ case ' m' :
177+ pushEvent (getMotionEvent (EVENT_TYPE_SHOW_MENU, nullptr ));
178+ break ;
179+ case SB_KEY_PGUP:
180+ pushEvent (getMotionEvent (EVENT_TYPE_PGUP, nullptr ));
181+ break ;
182+ case SB_KEY_PGDN:
183+ pushEvent (getMotionEvent (EVENT_TYPE_PGDN, nullptr ));
184+ break ;
185+ case SB_KEY_UP:
186+ pushEvent (getMotionEvent (EVENT_TYPE_UP, nullptr ));
187+ break ;
188+ case SB_KEY_DN:
189+ pushEvent (getMotionEvent (EVENT_TYPE_PGDN, nullptr ));
190+ break ;
191+ default :
192+ pushEvent (getKeyPressedEvent (SB_KEY_CTRL (keyCode)));
193+ }
159194 } else if (e->altKey ) {
160- pushEvent (getKeyPressedEvent (SB_KEY_ALT (keyCode)));
195+ switch (keyCode) {
196+ case ' D' :
197+ // browser keystroke
198+ result = false ;
199+ break ;
200+ default :
201+ pushEvent (getKeyPressedEvent (SB_KEY_ALT (keyCode)));
202+ break ;
203+ }
161204 } else if (e->shiftKey ) {
162205 bool shifted = false ;
163206 for (int i = 0 ; i < SHIFT_KEYMAP_LEN; i++) {
@@ -177,9 +220,11 @@ void Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
177220 }
178221 break ;
179222 }
223+ return result;
180224}
181225
182- void Runtime::handleMouse (int eventType, const EmscriptenMouseEvent *e) {
226+ bool Runtime::handleMouse (int eventType, const EmscriptenMouseEvent *e) {
227+ bool result = true ;
183228 switch (eventType) {
184229 case EMSCRIPTEN_EVENT_MOUSEDOWN:
185230 if (e->button == 2 ) {
@@ -194,7 +239,11 @@ void Runtime::handleMouse(int eventType, const EmscriptenMouseEvent *e) {
194239 case EMSCRIPTEN_EVENT_MOUSEUP:
195240 pushEvent (getMotionEvent (EVENT_TYPE_POINTER_RELEASED, e));
196241 break ;
242+ default :
243+ result = false ;
244+ break ;
197245 }
246+ return result;
198247}
199248
200249void Runtime::pause (int timeout) {
@@ -265,6 +314,21 @@ void Runtime::processEvent(MAEvent &event) {
265314 case EVENT_TYPE_RESIZE:
266315 resize ();
267316 break ;
317+ case EVENT_TYPE_BACK:
318+ setBack ();
319+ break ;
320+ case EVENT_TYPE_PGUP:
321+ _output->scroll (true , true );
322+ break ;
323+ case EVENT_TYPE_PGDN:
324+ _output->scroll (false , true );
325+ break ;
326+ case EVENT_TYPE_UP:
327+ _output->scroll (true , false );
328+ break ;
329+ case EVENT_TYPE_DN:
330+ _output->scroll (false , false );
331+ break ;
268332 default :
269333 handleEvent (event);
270334 break ;
@@ -279,6 +343,9 @@ void Runtime::runShell() {
279343}
280344
281345void Runtime::setClipboardText (const char *text) {
346+ EM_ASM_ ({
347+ navigator.clipboard .writeText (UTF8ToString ($0 ));
348+ }, text);
282349 clipboard = text;
283350}
284351
0 commit comments