2626#define EVENT_TYPE_RESIZE 103
2727
2828Runtime *runtime;
29+ String clipboard;
2930
3031MAEvent *getMotionEvent (int type, const EmscriptenMouseEvent *event) {
3132 MAEvent *result = new MAEvent ();
@@ -111,6 +112,10 @@ void Runtime::browseFile(const char *url) {
111112 }, url);
112113}
113114
115+ char *Runtime::getClipboardText () {
116+ return strdup (clipboard.c_str ());
117+ }
118+
114119char *Runtime::loadResource (const char *fileName) {
115120 logEntered ();
116121 char *buffer = System::loadResource (fileName);
@@ -131,25 +136,42 @@ void Runtime::handleKeyboard(int eventType, const EmscriptenKeyboardEvent *e) {
131136 case DOM_VK_CAPS_LOCK:
132137 // ignore press without modifier key
133138 break ;
139+
134140 default :
135141 for (int i = 0 ; i < KEYMAP_LEN; i++) {
136142 if (keyCode == KEYMAP[i][0 ]) {
137143 keyCode = KEYMAP[i][1 ];
138144 break ;
139145 }
140146 }
147+
141148 if (e->ctrlKey && e->altKey ) {
142149 pushEvent (getKeyPressedEvent (SB_KEY_CTRL_ALT (keyCode)));
143150 } else if (e->ctrlKey && e->shiftKey ) {
144151 pushEvent (getKeyPressedEvent (SB_KEY_SHIFT_CTRL (keyCode)));
145152 } else if (e->altKey && e->shiftKey ) {
146153 pushEvent (getKeyPressedEvent (SB_KEY_ALT_SHIFT (keyCode)));
147154 } else if (e->ctrlKey ) {
155+ if (keyCode >= ' A' && keyCode <= ' Z' ) {
156+ keyCode += (' a' - ' A' );
157+ }
148158 pushEvent (getKeyPressedEvent (SB_KEY_CTRL (keyCode)));
149159 } else if (e->altKey ) {
150160 pushEvent (getKeyPressedEvent (SB_KEY_ALT (keyCode)));
151161 } else if (e->shiftKey ) {
152- pushEvent (getKeyPressedEvent (SB_KEY_SHIFT (keyCode)));
162+ bool shifted = false ;
163+ for (int i = 0 ; i < SHIFT_KEYMAP_LEN; i++) {
164+ if (keyCode == SHIFT_KEYMAP[i][0 ]) {
165+ keyCode = SHIFT_KEYMAP[i][1 ];
166+ shifted = true ;
167+ break ;
168+ }
169+ }
170+ if (shifted) {
171+ pushEvent (getKeyPressedEvent (keyCode));
172+ } else {
173+ pushEvent (getKeyPressedEvent (SB_KEY_SHIFT (keyCode)));
174+ }
153175 } else {
154176 pushEvent (getKeyPressedEvent (keyCode));
155177 }
@@ -256,6 +278,10 @@ void Runtime::runShell() {
256278 }
257279}
258280
281+ void Runtime::setClipboardText (const char *text) {
282+ clipboard = text;
283+ }
284+
259285void Runtime::showCursor (CursorType cursorType) {
260286 static CursorType _cursorType;
261287 if (_cursorType != cursorType) {
@@ -366,11 +392,16 @@ void System::editSource(strlib::String loadPath, bool restoreOnExit) {
366392 case SB_KEY_F (11 ):
367393 case SB_KEY_F (12 ):
368394 case SB_KEY_MENU:
369- case SB_KEY_ESCAPE:
370395 case SB_KEY_BREAK:
371396 // unhandled keys
372397 redraw = false ;
373398 break ;
399+ case SB_KEY_ESCAPE:
400+ widget = editWidget;
401+ helpWidget->hide ();
402+ helpWidget->cancelMode ();
403+ editWidget->setFocus (true );
404+ break ;
374405 case SB_KEY_F (1 ):
375406 widget = helpWidget;
376407 helpWidget->createKeywordIndex ();
@@ -379,22 +410,20 @@ void System::editSource(strlib::String loadPath, bool restoreOnExit) {
379410 showStatus = false ;
380411 break ;
381412 case SB_KEY_F (9 ):
413+ case SB_KEY_CTRL (' r' ):
382414 _state = kRunState ;
383- if (editWidget->isDirty ()) {
384- saveFile (editWidget, loadPath);
385- }
386415 break ;
387416 case SB_KEY_CTRL (' s' ):
388417 saveFile (editWidget, loadPath);
389418 break ;
390419 case SB_KEY_CTRL (' c' ):
391420 case SB_KEY_CTRL (' x' ):
392421 text = widget->copy (event.key == (int )SB_KEY_CTRL (' x' ));
393- if (text) {
394- setClipboardText (text);
395- free (text);
396- }
397- break ;
422+ if (text) {
423+ setClipboardText (text);
424+ free (text);
425+ }
426+ break ;
398427 case SB_KEY_CTRL (' v' ):
399428 text = getClipboardText ();
400429 widget->paste (text);
0 commit comments