diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 802221be..84d6af28 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -80,10 +80,7 @@ class Frontend { onMouseMove(e) { this.popupTimerClear(); - if ( - this.pendingLookup || - (e.buttons & 0x1) !== 0x0 // Left mouse button - ) { + if (this.pendingLookup || Frontend.isMouseButton('primary', e)) { return; } @@ -91,7 +88,7 @@ class Frontend { const scanningModifier = scanningOptions.modifier; if (!( Frontend.isScanningModifierPressed(scanningModifier, e) || - (scanningOptions.middleMouse && (e.buttons & 0x4) !== 0x0) // Middle mouse button + (scanningOptions.middleMouse && Frontend.isMouseButton('auxiliary', e)) )) { return; } @@ -498,6 +495,23 @@ class Frontend { default: return false; } } + + static isMouseButton(button, mouseEvent) { + if (['mouseup', 'mousedown', 'click'].includes(mouseEvent.type)) { + switch (button) { + case 'primary': return mouseEvent.button === 0; + case 'secondary': return mouseEvent.button === 2; + case 'auxiliary': return mouseEvent.button === 1; + default: return false; + } + } + switch (button) { + case 'primary': return (mouseEvent.buttons & 0x1) !== 0x0; + case 'secondary': return (mouseEvent.buttons & 0x2) !== 0x0; + case 'auxiliary': return (mouseEvent.buttons & 0x4) !== 0x0; + default: return false; + } + } } Frontend.windowMessageHandlers = { diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index bdc5e962..81072957 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -35,6 +35,7 @@ class Display { this.persistentEventListeners = []; this.interactive = false; this.eventListenersActive = false; + this.clickScanPrevent = false; this.windowScroll = new WindowScroll(); @@ -81,6 +82,22 @@ class Display { } } + onGlossaryMousedown(e) { + if (Frontend.isMouseButton('primary', e)) { + this.clickScanPrevent = false; + } + } + + onGlossaryMouseMove(e) { + this.clickScanPrevent = true; + } + + onGlossaryMouseup(e) { + if (!this.clickScanPrevent && Frontend.isMouseButton('primary', e)) { + this.onTermLookup(e); + } + } + async onTermLookup(e) { try { e.preventDefault(); @@ -252,7 +269,9 @@ class Display { this.addEventListeners('.kanji-link', 'click', this.onKanjiLookup.bind(this)); this.addEventListeners('.source-term', 'click', this.onSourceTermView.bind(this)); if (this.options.scanning.enablePopupSearch) { - this.addEventListeners('.glossary-item', 'click', this.onTermLookup.bind(this)); + this.addEventListeners('.glossary-item', 'mouseup', this.onGlossaryMouseup.bind(this)); + this.addEventListeners('.glossary-item', 'mousedown', this.onGlossaryMousedown.bind(this)); + this.addEventListeners('.glossary-item', 'mousemove', this.onGlossaryMouseMove.bind(this)); } } else { Display.clearEventListeners(this.eventListeners);