From de70a69641c58445bd33b52939f6fe80e8945977 Mon Sep 17 00:00:00 2001 From: Dietmar Schabus Date: Sat, 25 Mar 2017 12:12:17 +0100 Subject: [PATCH 1/2] fixing middle mouse button clipboard paste on linux (atom:atom#8648) --- src/text-editor-component.coffee | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/text-editor-component.coffee b/src/text-editor-component.coffee index 5dfbced62..89e8f0783 100644 --- a/src/text-editor-component.coffee +++ b/src/text-editor-component.coffee @@ -525,9 +525,17 @@ class TextEditorComponent @presenter.invalidateBlockDecorationDimensions(arguments...) onMouseDown: (event) => - unless event.button is 0 or (event.button is 1 and process.platform is 'linux') - # Only handle mouse down events for left mouse button on all platforms - # and middle mouse button on Linux since it pastes the selection clipboard + # Handle middle mouse button on linux platform only (paste clipboard) + if event.button is 1 and process.platform is 'linux' + if selection = require('./safe-clipboard').readText('selection') + screenPosition = @screenPositionForMouseEvent(event) + @editor.setCursorScreenPosition(screenPosition, autoscroll: false) + @editor.insertText(selection) + return + + # Handle mouse down events for left mouse button only + # (except middle mouse button on linux platform, see above) + unless event.button is 0 return return if event.target?.classList.contains('horizontal-scrollbar') @@ -674,7 +682,6 @@ class TextEditorComponent stopDragging() @editor.finalizeSelections() @editor.mergeIntersectingSelections() - pasteSelectionClipboard(event) stopDragging = -> dragging = false @@ -714,11 +721,6 @@ class TextEditorComponent scaleScrollDelta = (scrollDelta) -> Math.pow(scrollDelta / 2, 3) / 280 - pasteSelectionClipboard = (event) => - if event?.which is 2 and process.platform is 'linux' - if selection = require('./safe-clipboard').readText('selection') - @editor.insertText(selection) - window.addEventListener('mousemove', onMouseMove) window.addEventListener('mouseup', onMouseUp) disposables = new CompositeDisposable From 2c6b7973f941cd80d46ab1fce5ec2d9b9a21e893 Mon Sep 17 00:00:00 2001 From: Dietmar Schabus Date: Sun, 26 Mar 2017 19:44:43 +0200 Subject: [PATCH 2/2] adding spec pinpointing atom:atom#8648 which now passes --- spec/text-editor-component-spec.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/spec/text-editor-component-spec.js b/spec/text-editor-component-spec.js index b26e64e34..35d2af832 100644 --- a/spec/text-editor-component-spec.js +++ b/spec/text-editor-component-spec.js @@ -5019,6 +5019,35 @@ describe('TextEditorComponent', function () { expect(atom.clipboard.read()).toBe('sort') expect(editor.lineTextForBufferRow(10)).toBe('sort') }) + + it('pastes the previously selected text at the clicked location, left clicks do not interfere', async function () { + let clipboardWrittenTo = false + spyOn(require('electron').ipcRenderer, 'send').andCallFake(function (eventName, selectedText) { + if (eventName === 'write-text-to-selection-clipboard') { + require('../src/safe-clipboard').writeText(selectedText, 'selection') + clipboardWrittenTo = true + } + }) + atom.clipboard.write('') + component.trackSelectionClipboard() + editor.setSelectedBufferRange([[1, 6], [1, 10]]) + advanceClock(0) + + componentNode.querySelector('.scroll-view').dispatchEvent(buildMouseEvent('mousedown', clientCoordinatesForScreenPosition([10, 0]), { + button: 0 + })) + componentNode.querySelector('.scroll-view').dispatchEvent(buildMouseEvent('mouseup', clientCoordinatesForScreenPosition([10, 0]), { + which: 1 + })) + componentNode.querySelector('.scroll-view').dispatchEvent(buildMouseEvent('mousedown', clientCoordinatesForScreenPosition([10, 0]), { + button: 1 + })) + componentNode.querySelector('.scroll-view').dispatchEvent(buildMouseEvent('mouseup', clientCoordinatesForScreenPosition([10, 0]), { + which: 2 + })) + expect(atom.clipboard.read()).toBe('sort') + expect(editor.lineTextForBufferRow(10)).toBe('sort') + }) }) function buildMouseEvent (type, ...propertiesObjects) {