From 106621efcc47778044260dea66a7bfdc1351a7d4 Mon Sep 17 00:00:00 2001 From: mxb Date: Mon, 15 Apr 2019 13:51:44 +0200 Subject: [PATCH] Fix issue with electron before-input-event --- app/ux/WebView.js | 46 ++++++++++++++++-------------- package-lock.json | 7 +---- package.json | 1 - resources/js/rambox-service-api.js | 16 +++++++++++ 4 files changed, 41 insertions(+), 29 deletions(-) diff --git a/app/ux/WebView.js b/app/ux/WebView.js index 7dd69885..a77a38a2 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -453,28 +453,7 @@ Ext.define('Rambox.ux.WebView',{ webview.executeJavaScript(js_inject); }); - const keycode = require('keycodes'); - webview.getWebContents().on('before-input-event', (event, input) => { - if (input.type !== 'keyDown' || input.key === 'z' || input.key === 'a' ) return; // event used by default - - // because keyCode property is not passed - // Create a fake KeyboardEvent from the data provided - var emulatedKeyboardEvent = new KeyboardEvent('keydown', { - code: input.code, - key: input.key, - shiftKey: input.shift, - altKey: input.alt, - ctrlKey: input.control, - metaKey: input.meta, - repeat: input.isAutoRepeat, - keyCode: keycode(input.key) //get real key code - }); - emulatedKeyboardEvent.getKey = function() { - return this.keyCode || this.charCode // fake function, normally used by Ext.js, simply returning keyCode - } - document.keyMapping.handleTargetEvent(emulatedKeyboardEvent) // we directly trigger handleTargetEvent. That's a private method normally. We can't fire the event directly with document.dispatch, unfortunately - }); webview.addEventListener('ipc-message', function(event) { var channel = event.channel; @@ -488,8 +467,31 @@ Ext.define('Rambox.ux.WebView',{ case 'rambox.showWindowAndActivateTab': showWindowAndActivateTab(event); break; + case 'keydown': + handleKeydown(event.args[0]) + break; } - + /** + * Handles 'keydown' messages. + * Allow to handle shortcuts. + */ + function handleKeydown(event) { + var emulatedKeyboardEvent = new KeyboardEvent('keydown', { + code: event.code, + key: event.key, + shiftKey: event.shiftKey, + altKey: event.altKey, + ctrlKey: event.ctrlKey, + metaKey: event.metaKey, + repeat: event.repeat, + keyCode: event.keyCode, + charCode: event.charCode + }); + emulatedKeyboardEvent.getKey = function() { + return this.keyCode || this.charCode // fake function, normally used by Ext.js, simply returning keyCode + } + document.keyMapping.handleTargetEvent(emulatedKeyboardEvent) // we directly trigger handleTargetEvent. That's a private method normally. We can't fire the event directly with document.dispatch, unfortunately + } /** * Handles 'rambox.clearUnreadCount' messages. * Clears the unread count. diff --git a/package-lock.json b/package-lock.json index 4cb65394..6a1b5f39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1866,7 +1866,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -3087,11 +3087,6 @@ "verror": "1.10.0" } }, - "keycodes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/keycodes/-/keycodes-1.0.0.tgz", - "integrity": "sha512-ukEttiO9Sjb/dj29GQw3/mVXyI3575QTtvetCJfBrVjytESKefRHCt7GUmruvFwWIUqvMD9p5uk7Y3y//4B+hw==" - }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", diff --git a/package.json b/package.json index 91880dea..8a2d0fcc 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,6 @@ "electron-log": "^2.2.17", "electron-store": "^2.0.0", "electron-updater": "^3.1.2", - "keycodes": "^1.0.0", "mime": "^2.3.1", "request": "^2.88.0", "request-promise": "^4.2.2", diff --git a/resources/js/rambox-service-api.js b/resources/js/rambox-service-api.js index 15e3d0ec..36d24be8 100644 --- a/resources/js/rambox-service-api.js +++ b/resources/js/rambox-service-api.js @@ -55,3 +55,19 @@ window.rambox.contextMenuBuilder = new ContextMenuBuilder(); window.rambox.contextMenuListener = new ContextMenuListener(function(event, info) { window.rambox.contextMenuBuilder.showPopupMenu(info); }); + +document.addEventListener("keydown", (event) => { + if (event.type !== 'keydown' || event.key === 'z' || event.key === 'a' ) return; // event used by default + var msg = { + code: event.code, + key: event.key, + shiftKey: event.shiftKey, + altKey: event.altKey, + ctrlKey: event.ctrlKey, + metaKey: event.metaKey, + repeat: event.repeat, + keyCode: event.keyCode, + charCode: event.charCode + }; + ipcRenderer.sendToHost('keydown', msg) +}); \ No newline at end of file