diff options
Diffstat (limited to 'ext/mixed')
-rw-r--r-- | ext/mixed/js/text-scanner.js | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/ext/mixed/js/text-scanner.js b/ext/mixed/js/text-scanner.js index 6eafc82c..a789c84c 100644 --- a/ext/mixed/js/text-scanner.js +++ b/ext/mixed/js/text-scanner.js @@ -95,9 +95,10 @@ class TextScanner extends EventDispatcher { setOptions({inputs, deepContentScan, selectText, delay, touchInputEnabled, scanLength, sentenceExtent, layoutAwareScan}) { if (Array.isArray(inputs)) { - this._inputs = inputs.map(({include, exclude}) => ({ + this._inputs = inputs.map(({include, exclude, types}) => ({ include: this._getInputArray(include), - exclude: this._getInputArray(exclude) + exclude: this._getInputArray(exclude), + types: this._getInputTypeSet(types) })); } if (typeof deepContentScan === 'boolean') { @@ -241,10 +242,7 @@ class TextScanner extends EventDispatcher { return; } - const modifiers = DocumentUtil.getActiveModifiersAndButtons(e); - this.trigger('activeModifiersChanged', {modifiers}); - - const inputInfo = this._getMatchingInputGroup(modifiers); + const inputInfo = this._getMatchingInputGroupFromEvent(e, 'mouse'); if (inputInfo === null) { return; } const {index, empty} = inputInfo; @@ -313,7 +311,7 @@ class TextScanner extends EventDispatcher { this._primaryTouchIdentifier = primaryTouch.identifier; - this._searchAtFromTouchStart(primaryTouch.clientX, primaryTouch.clientY); + this._searchAtFromTouchStart(e, primaryTouch.clientX, primaryTouch.clientY); } _onTouchEnd(e) { @@ -345,7 +343,11 @@ class TextScanner extends EventDispatcher { return; } - this._searchAt(primaryTouch.clientX, primaryTouch.clientY, {cause: 'touchMove', index: -1, empty: false}); + const inputInfo = this._getMatchingInputGroupFromEvent(e, 'touch'); + if (inputInfo === null) { return; } + + const {index, empty} = inputInfo; + this._searchAt(primaryTouch.clientX, primaryTouch.clientY, {cause: 'touchMove', index, empty}); e.preventDefault(); // Disable scroll } @@ -496,12 +498,16 @@ class TextScanner extends EventDispatcher { await this._searchAt(x, y, {cause: 'mouse', index: inputIndex, empty: inputEmpty}); } - async _searchAtFromTouchStart(x, y) { + async _searchAtFromTouchStart(e, x, y) { if (this._pendingLookup) { return; } + const inputInfo = this._getMatchingInputGroupFromEvent(e, 'touch'); + if (inputInfo === null) { return; } + + const {index, empty} = inputInfo; const textSourceCurrentPrevious = this._textSourceCurrent !== null ? this._textSourceCurrent.clone() : null; - await this._searchAt(x, y, {cause: 'touchStart', index: -1, empty: false}); + await this._searchAt(x, y, {cause: 'touchStart', index, empty}); if ( this._textSourceCurrent !== null && @@ -513,11 +519,18 @@ class TextScanner extends EventDispatcher { } } - _getMatchingInputGroup(modifiers) { + _getMatchingInputGroupFromEvent(event, type) { + const modifiers = DocumentUtil.getActiveModifiersAndButtons(event); + this.trigger('activeModifiersChanged', {modifiers}); + return this._getMatchingInputGroup(modifiers, type); + } + + _getMatchingInputGroup(modifiers, type) { let fallback = null; for (let i = 0, ii = this._inputs.length; i < ii; ++i) { const input = this._inputs[i]; - const {include, exclude} = input; + const {include, exclude, types} = input; + if (!types.has(type)) { continue; } if (this._setHasAll(modifiers, include) && (exclude.length === 0 || !this._setHasAll(modifiers, exclude))) { if (include.length > 0) { return {index: i, empty: false, input}; @@ -545,4 +558,12 @@ class TextScanner extends EventDispatcher { [] ); } + + _getInputTypeSet({mouse, touch, pen}) { + const set = new Set(); + if (mouse) { set.add('mouse'); } + if (touch) { set.add('touch'); } + if (pen) { set.add('pen'); } + return set; + } } |