diff options
-rw-r--r-- | ext/js/language/text-scanner.js | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 9c4a7267..1ef92115 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -87,6 +87,9 @@ class TextScanner extends EventDispatcher { this._pointerIdTypeMap = new Map(); this._canClearSelection = true; + + this._yomichanIsChangingTextSelectionNow = false; + this._userHasNotSelectedAnythingManually = true; } get canClearSelection() { @@ -141,6 +144,7 @@ class TextScanner extends EventDispatcher { if (value) { this._hookEvents(); + this._userHasNotSelectedAnythingManually = window.getSelection().isCollapsed; } } @@ -259,8 +263,10 @@ class TextScanner extends EventDispatcher { setCurrentTextSource(textSource) { this._textSourceCurrent = textSource; - if (this._selectText) { + if (this._selectText && this._userHasNotSelectedAnythingManually) { + this._yomichanIsChangingTextSelectionNow = true; this._textSourceCurrent.select(); + setTimeout(() => this._yomichanIsChangingTextSelectionNow = false, 0); this._textSourceCurrentSelected = true; } else { this._textSourceCurrentSelected = false; @@ -371,6 +377,11 @@ class TextScanner extends EventDispatcher { this._preventNextClickScan = true; } + _onSelectionChangeCheckUserSelection() { + if (this._yomichanIsChangingTextSelectionNow) { return; } + this._userHasNotSelectedAnythingManually = window.getSelection().isCollapsed; + } + _onSearchClickMouseDown(e) { if (e.button !== 0) { return; } this._resetPreventNextClickScan(); @@ -754,6 +765,8 @@ class TextScanner extends EventDispatcher { eventListenerInfos.push(...this._getMouseClickOnlyEventListeners2(capture)); } + eventListenerInfos.push(this._getSelectionChangeCheckUserSelectionListener()); + for (const args of eventListenerInfos) { this._eventListeners.addEventListener(...args); } @@ -815,6 +828,10 @@ class TextScanner extends EventDispatcher { return entries; } + _getSelectionChangeCheckUserSelectionListener() { + return [document, 'selectionchange', this._onSelectionChangeCheckUserSelection.bind(this)]; + } + _getTouch(touchList, identifier) { for (const touch of touchList) { if (touch.identifier === identifier) { |