=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keyboard.js' --- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keyboard.js 2015-09-23 22:44:57 +0000 +++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keyboard.js 2015-09-24 14:04:00 +0000 @@ -22,9 +22,6 @@ ** window.Clipboard since that is undefined on any browser (it must have been ** copied from some samples on the web which had a typo because I can find no ** evidence it is a real thing). -** 009 SBI 20150922 Rewrite to implement separate implementations for ChUI and GUI. GUI key -** processing is intended to be compatible with WinKeyboardReader, though -** it may not yet be 100% correct. */ "use strict"; @@ -421,8 +418,9 @@ // normal map var mappedCode = p2j.keymap.xlate[key]; - - if (ctrl && !ctrlTyped(key)) + //needs char code from keyCode to determine how ctrl modifier can be applied to this key stroke. + var charCode = p2j.keymap.mapKey(evt); + if (ctrl && !ctrlTyped(charCode)) { if (key !== keys.CTRL) { @@ -432,7 +430,7 @@ } else { - code = mappedCode == null ? key : mappedCode; + code = mappedCode === undefined ? key : mappedCode; code = code | 1 << 11; } @@ -454,15 +452,13 @@ return; } - if (mappedCode != null) + if (mappedCode) { code = mappedCode; - // normal VK_TAB is generated naturally in keyTyped() but SHIFT + - // TAB must be handled here if (code === Progress4GLKeys.VK_TAB) { - code = shift ? Progress4GLKeys.VK_BACK_TAB : -1; + code = shift ? Progress4GLKeys.VK_BACK_TAB : Progress4GLKeys.VK_TAB; } else if (code === Progress4GLKeys.VK_ENTER) { @@ -562,33 +558,14 @@ // provided by the TYPED event, except the following: if (ctrl) { - if (ch === 50) // '2' - { - // CTRL-@ - code = 0; - } - else if (ch === 54) // '6' - { - // CTRL-^ - code = 30; - } - else if (ch === 45) // '-' - { - // CTRL-_ - code = 31; - } - else if (ch === 0) // - { - // CTRL-DEL is processed by keyPressed - return; - } + code = p2j.keymap.processCtrl(evt, ch); } // normal processing: the preprocessed character is returned directly if (code === -1) { // ALT/ENTER/DELETE are processed in keyPressed() and not here - if (ch !== keys.ALT && ch !== keys.ENTER) + if (ch !== keys.ALT && ch !== keys.ENTER && ch > 0) { code = ch; @@ -697,7 +674,8 @@ */ function ctrlTyped(key) { - return (key >= 97 && key <= 122) || (key >= 65 && key <= 90); + return (key >= 97 && key <= 122) || (key >= 65 && key <= 90) || key === 50 || + key === 54 || key === 45 || key === 173 || key === 109 || key >= 92 && key <= 95; }; }; === modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keymap.js' --- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keymap.js 2015-09-23 22:44:57 +0000 +++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keymap.js 2015-09-24 13:24:56 +0000 @@ -15,7 +15,6 @@ ** can be used for both ChUI and GUI web clients. ** 004 SBI 20150731 Applied "use strict" directive, fixed undeclared variables. ** 005 GES 20150701 Added a clarifying comment. -** 006 SBI 20150922 Rewrite to create separate ChUI and GUI implementations. */ "use strict"; @@ -764,6 +763,210 @@ p2j.keymap = (function() { + + /** + * Process CTRL key. + * + * @param {KeyboardEvent} evt + * The event object. + * @param {Number} code + * The char code. + * @param {Boolean} isChui + * The CHUI mode. + * + * @return {Number} + * The mapped key code. + */ + function processCtrlModifier(evt, code, isChui) + { + var ctrlCode = -1; + + if (evt.ctrlKey) + { + if (code === 50) //'2' + { + ctrlCode = 0; + } + else if (code === 54) //'6' + { + ctrlCode = 30; + } + else if (code === 45) //'-' + { + ctrlCode = 31; + } + else if (code === 92) //'\' + { + ctrlCode = 28; + } + else if (code === 93) //']' + { + ctrlCode = 29; + } + else + { + if (code >= 32 && code < 127) + { + // clear bit 7 (e.g. this takes CTRL-C which is 0x43/decimal 67 and yields 0x03) + ctrlCode = code & 0xffbf; + + // VK_ESCAPE is NOT DELIVERED, 4GL doesn't ever return this + if (isChui && ctrlCode === keys.ESCAPE) + { + ctrlCode = -1; + } + } + } + } + + return ctrlCode; + }; + + /** + * Map scan code to ASCII printable, + * + * @param {KeyboardEvent} evt + * The event object. + * + * @return {Number} + * The mapped key code. + */ + function mapKey(evt) + { + var key = evt.keyCode; + + if (p2j.isFirefox) + { + switch (key) + { + case 59: + key = 186; //; : + break; + case 107: + key = 187; //= + + break; + case 109: + key = 189; //- _ + break; + } + } + + if (evt.shiftKey) + { + switch (key) + { + case 48: + return 41; //) + case 49: + return 33; //! + case 50: + return 64; //@ + case 51: + return 35; //# + case 52: + return 36; //$ + case 53: + return 37; //% + case 54: + return 94; //^ + case 55: + return 38; //& + case 56: + return 42; //* + case 57: + return 40; //( + case 188: + return 60; //< + case 190: + return 62; //> + case 191: + return 63; //? + case 192: + return 126; //~ + case 219: + return 123; //{ + case 220: + return 124; //| + case 221: + return 125; //} + case 222: + return 34; //" + case 186: + return 58; //: + case 187: + return 43; //+ + case 173: + case 189: + return 95; //_ + } + } + else + { + // 0...9 + if (key >= 48 && key <= 57) + { + return key; + } + + switch (key) + { + case 188: + return 44; //, + case 190: + return 46; //. + case 191: + return 47; /// + case 192: + return 96; //` + case 219: + return 91; //[ + case 220: + return 92; //\ + case 221: + return 93; //] + case 222: + return 34; //' + case 186: + return 59; //; + case 187: + return 61; //= + case 173: + case 189: + return 45; //- + // numpad + case 96: + case 97: + case 98: + case 99: + case 100: + case 101: + case 102: + case 103: + case 104: + case 105: + return key - 48; //0...9 + case 106: + return 42; //* + case 107: + return 43; //+ + case 109: + return 45; //- + case 110: + return 46; //. + case 111: + return 47; /// + } + } + + // A...Z + if (key >= 65 && key <= 90) + { + return key; + } + + return -1; + }; + /** * Creates browser keys to Progress CHUI keys mapping. * @@ -828,149 +1031,6 @@ this.mapKey = mapKey; - /** - * Map scan code to ASCII printable, - * - * @param {KeyboardEvent} evt - * The event object. - * - * @return {Number} - * The mapped key code. - */ - function mapKey(evt) - { - var key = evt.keyCode; - - if (p2j.isFirefox) - { - switch (key) - { - case 59: - key = 186; //; : - break; - case 107: - key = 187; //= + - break; - case 109: - key = 189; //- _ - break; - } - } - - if (evt.shiftKey) - { - switch (key) - { - case 48: - return 41; //) - case 49: - return 33; //! - case 50: - return 64; //@ - case 51: - return 35; //# - case 52: - return 36; //$ - case 53: - return 37; //% - case 54: - return 94; //^ - case 55: - return 38; //& - case 56: - return 42; //* - case 57: - return 40; //( - case 188: - return 60; //< - case 190: - return 62; //> - case 191: - return 63; //? - case 192: - return 126; //~ - case 219: - return 123; //{ - case 220: - return 124; //| - case 221: - return 125; //} - case 222: - return 34; //" - case 186: - return 58; //: - case 187: - return 43; //+ - case 189: - return 95; //_ - } - } - else - { - // 0...9 - if (key >= 48 && key <= 57) - { - return key; - } - - switch (key) - { - case 188: - return 44; //, - case 190: - return 46; //. - case 191: - return 47; /// - case 192: - return 96; //` - case 219: - return 91; //[ - case 220: - return 92; //\ - case 221: - return 93; //] - case 222: - return 34; //' - case 186: - return 59; //; - case 187: - return 61; //= - case 189: - return 45; //- - // numpad - case 96: - case 97: - case 98: - case 99: - case 100: - case 101: - case 102: - case 103: - case 104: - case 105: - return key - 48; //0...9 - case 106: - return 42; //* - case 107: - return 43; //+ - case 109: - return 45; //- - case 110: - return 46; //. - case 111: - return 47; /// - } - } - - // A...Z - if (key >= 65 && key <= 90) - { - return key; - } - - return -1; - }; - this.processCtrl = processCtrl; /** @@ -987,47 +1047,7 @@ */ function processCtrl(evt, code) { - var ctrlCode = -1; - - if (evt.ctrlKey) - { - if (code === 50) //'2' - { - ctrlCode = 0; - } - else if (code === 54) //'6' - { - ctrlCode = 30; - } - else if (code === 45) //'-' - { - ctrlCode = 31; - } - else if (code === 92) //'\' - { - ctrlCode = 28; - } - else if (code === 93) //']' - { - ctrlCode = 29; - } - else - { - if (code >= 32 && code < 127) - { - // clear bit 7 (e.g. this takes CTRL-C which is 0x43/decimal 67 and yields 0x03) - ctrlCode = code & 0xffbf; - - // VK_ESCAPE is NOT DELIVERED, 4GL doesn't ever return this - if (ctrlCode === keys.ESCAPE) - { - ctrlCode = -1; - } - } - } - } - - return ctrlCode; + return processCtrlModifier(evt, code, true); }; } @@ -1342,6 +1362,28 @@ (113 <= code && code <= 116) || (code == 121) || (123 == code) || (code == 124) || code == 128 || (137 <= code && code <= 140); } + + this.mapKey = mapKey; + + this.processCtrl = processCtrl; + + /** + * Process CTRL key. + * + * @param {KeyboardEvent} evt + * The event object. + * + * @param {Number} code + * The char code. + * + * @return {Number} + * The mapped key code. + */ + function processCtrl(evt, code) + { + return processCtrlModifier(evt, code, false); + }; + } /**