diff --git a/src/components/App.tsx b/src/components/App.tsx index ed34cf85..c8c505ba 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1603,6 +1603,10 @@ class App extends React.Component { (event.button === POINTER_BUTTON.MAIN && isHoldingSpace)) ) { isPanning = true; + + let nextPastePrevented = false; + const isLinux = /Linux/.test(window.navigator.platform); + document.documentElement.style.cursor = CURSOR_TYPE.GRABBING; let { clientX: lastX, clientY: lastY } = event; const onPointerMove = withBatchedUpdates((event: PointerEvent) => { @@ -1611,6 +1615,40 @@ class App extends React.Component { lastX = event.clientX; lastY = event.clientY; + /* + * Prevent paste event if we move while middle clicking on Linux. + * See issue #1383. + */ + if ( + isLinux && + !nextPastePrevented && + (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1) + ) { + nextPastePrevented = true; + + /* Prevent the next paste event */ + const preventNextPaste = (event: ClipboardEvent) => { + document.body.removeEventListener(EVENT.PASTE, preventNextPaste); + event.stopPropagation(); + }; + + /* + * Reenable next paste in case of disabled middle click paste for + * any reason: + * - rigth click paste + * - empty clipboard + */ + const enableNextPaste = () => { + setTimeout(() => { + document.body.removeEventListener(EVENT.PASTE, preventNextPaste); + window.removeEventListener(EVENT.POINTER_UP, enableNextPaste); + }, 100); + }; + + document.body.addEventListener(EVENT.PASTE, preventNextPaste); + window.addEventListener(EVENT.POINTER_UP, enableNextPaste); + } + this.setState({ scrollX: normalizeScroll( this.state.scrollX - deltaX / this.state.zoom,