summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/fg/js/frontend.js24
-rw-r--r--ext/mixed/js/display.js21
2 files changed, 39 insertions, 6 deletions
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);