From 44d5fbb21f482fdfb73eb607eb4871bfc510bd11 Mon Sep 17 00:00:00 2001 From: Joren Van Onder Date: Thu, 28 May 2015 11:20:45 +0200 Subject: [PATCH] [IMP] barcode_events: implement better keyrepeat blocking Before this, users were only able to press a key when all other keys were released to prevent a key from repeating. This works but when typing you usually press the next key before releasing the current one. This allows users to do exactly that while still blocking keys from repeating. --- .../static/src/js/framework/barcode_events.js | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/addons/web/static/src/js/framework/barcode_events.js b/addons/web/static/src/js/framework/barcode_events.js index 6aa5327a768..5956eee08ee 100644 --- a/addons/web/static/src/js/framework/barcode_events.js +++ b/addons/web/static/src/js/framework/barcode_events.js @@ -6,7 +6,7 @@ odoo.define('web.BarcodeEvents', function(require) { return core.Class.extend(mixins.PropertiesMixin, { timeout: null, - key_released: true, + key_pressed: {}, buffered_key_events: [], init: function(parent) { @@ -73,20 +73,23 @@ odoo.define('web.BarcodeEvents', function(require) { return $(element).is('input,textarea,[contenteditable="true"]'); }, + // The keydown and keyup handlers are here to disallow key + // repeat. When preventDefault() is called on a keydown event + // the keypress that normally follows is cancelled. + keydown_handler: function(e){ + if (this.key_pressed[e.which]) { + e.preventDefault(); + } else { + this.key_pressed[e.which] = true; + } + }, + keyup_handler: function(e){ - this.key_released = true; + this.key_pressed[e.which] = false; }, handler: function(e){ if (! e.dispatched_by_barcode_reader) { - if (! this.key_released) { // don't allow key repeat - e.preventDefault(); - e.stopImmediatePropagation(); - return; - } - - this.key_released = false; - // We only stop events targeting body (meaning nothing is // focused). We do not stop events targeting other elements // because we have no way of redispatching 'genuine' key events @@ -106,13 +109,15 @@ odoo.define('web.BarcodeEvents', function(require) { }, start: function(){ - document.body.addEventListener('keypress', this.handler.bind(this), true); + document.body.addEventListener('keydown', this.keydown_handler.bind(this), true); document.body.addEventListener('keyup', this.keyup_handler.bind(this), true); + document.body.addEventListener('keypress', this.handler.bind(this), true); }, stop: function(){ - document.body.removeEventListener('keypress', this.handler.bind(this), true); + document.body.removeEventListener('keydown', this.keydown_handler.bind(this), true); document.body.removeEventListener('keyup', this.keyup_handler.bind(this), true); + document.body.removeEventListener('keypress', this.handler.bind(this), true); }, }); });