Browse Source

Fix issue with electron before-input-event

pull/2206/head
mxb 6 years ago
parent
commit
106621efcc
  1. 46
      app/ux/WebView.js
  2. 7
      package-lock.json
  3. 1
      package.json
  4. 16
      resources/js/rambox-service-api.js

46
app/ux/WebView.js

@ -453,28 +453,7 @@ Ext.define('Rambox.ux.WebView',{
webview.executeJavaScript(js_inject); 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) { webview.addEventListener('ipc-message', function(event) {
var channel = event.channel; var channel = event.channel;
@ -488,8 +467,31 @@ Ext.define('Rambox.ux.WebView',{
case 'rambox.showWindowAndActivateTab': case 'rambox.showWindowAndActivateTab':
showWindowAndActivateTab(event); showWindowAndActivateTab(event);
break; 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. * Handles 'rambox.clearUnreadCount' messages.
* Clears the unread count. * Clears the unread count.

7
package-lock.json generated

@ -1866,7 +1866,7 @@
}, },
"minimist": { "minimist": {
"version": "1.2.0", "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=", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true "dev": true
}, },
@ -3087,11 +3087,6 @@
"verror": "1.10.0" "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": { "klaw": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",

1
package.json

@ -189,7 +189,6 @@
"electron-log": "^2.2.17", "electron-log": "^2.2.17",
"electron-store": "^2.0.0", "electron-store": "^2.0.0",
"electron-updater": "^3.1.2", "electron-updater": "^3.1.2",
"keycodes": "^1.0.0",
"mime": "^2.3.1", "mime": "^2.3.1",
"request": "^2.88.0", "request": "^2.88.0",
"request-promise": "^4.2.2", "request-promise": "^4.2.2",

16
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.contextMenuListener = new ContextMenuListener(function(event, info) {
window.rambox.contextMenuBuilder.showPopupMenu(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)
});
Loading…
Cancel
Save