mirror of
https://github.com/atom/atom.git
synced 2026-01-24 14:28:14 -05:00
Merge pull request #15183 from atom/jr-is-there-anything-a-middle-click-CANT-do
Fix regression re: closing tabs via middle mouse click on Linux
This commit is contained in:
@@ -2687,18 +2687,42 @@ describe('TextEditorComponent', () => {
|
||||
expect(component.getScrollLeft()).toBe(maxScrollLeft)
|
||||
})
|
||||
|
||||
it('positions the cursor on clicking the middle mouse button on Linux', async () => {
|
||||
// The browser synthesizes the paste as a textInput event on mouseup
|
||||
// so it is not possible to test it here.
|
||||
it('pastes the previously selected text when clicking the middle mouse button on Linux', async () => {
|
||||
spyOn(electron.ipcRenderer, 'send').andCallFake(function (eventName, selectedText) {
|
||||
if (eventName === 'write-text-to-selection-clipboard') {
|
||||
clipboard.writeText(selectedText, 'selection')
|
||||
}
|
||||
})
|
||||
|
||||
const {component, editor} = buildComponent({platform: 'linux'})
|
||||
|
||||
// Middle mouse pasting.
|
||||
editor.setSelectedBufferRange([[1, 6], [1, 10]])
|
||||
await conditionPromise(() => TextEditor.clipboard.read() === 'sort')
|
||||
component.didMouseDownOnContent({
|
||||
button: 1,
|
||||
clientX: clientLeftForCharacter(component, 10, 0),
|
||||
clientY: clientTopForLine(component, 10)
|
||||
})
|
||||
expect(editor.getSelectedBufferRange()).toEqual([[10, 0], [10, 0]])
|
||||
expect(TextEditor.clipboard.read()).toBe('sort')
|
||||
expect(editor.lineTextForBufferRow(10)).toBe('sort')
|
||||
editor.undo()
|
||||
|
||||
// Ensure left clicks don't interfere.
|
||||
editor.setSelectedBufferRange([[1, 2], [1, 5]])
|
||||
await conditionPromise(() => TextEditor.clipboard.read() === 'var')
|
||||
component.didMouseDownOnContent({
|
||||
button: 0,
|
||||
detail: 1,
|
||||
clientX: clientLeftForCharacter(component, 10, 0),
|
||||
clientY: clientTopForLine(component, 10)
|
||||
})
|
||||
component.didMouseDownOnContent({
|
||||
button: 1,
|
||||
clientX: clientLeftForCharacter(component, 10, 0),
|
||||
clientY: clientTopForLine(component, 10)
|
||||
})
|
||||
expect(editor.lineTextForBufferRow(10)).toBe('var')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -2992,6 +3016,17 @@ describe('TextEditorComponent', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('paste event', () => {
|
||||
it("prevents the browser's default processing for the event on Linux", () => {
|
||||
const {component} = buildComponent({platform: 'linux'})
|
||||
const event = { preventDefault: () => {} }
|
||||
spyOn(event, 'preventDefault')
|
||||
|
||||
component.didPaste(event)
|
||||
expect(event.preventDefault).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
|
||||
describe('keyboard input', () => {
|
||||
it('handles inserted accented characters via the press-and-hold menu on macOS correctly', () => {
|
||||
const {editor, component, element} = buildComponent({text: ''})
|
||||
|
||||
@@ -5,6 +5,7 @@ const {Point, Range} = require('text-buffer')
|
||||
const LineTopIndex = require('line-top-index')
|
||||
const TextEditor = require('./text-editor')
|
||||
const {isPairedCharacter} = require('./text-utils')
|
||||
const clipboard = require('./safe-clipboard')
|
||||
const electron = require('electron')
|
||||
const $ = etch.dom
|
||||
|
||||
@@ -69,6 +70,7 @@ class TextEditorComponent {
|
||||
this.updateSync = this.updateSync.bind(this)
|
||||
this.didBlurHiddenInput = this.didBlurHiddenInput.bind(this)
|
||||
this.didFocusHiddenInput = this.didFocusHiddenInput.bind(this)
|
||||
this.didPaste = this.didPaste.bind(this)
|
||||
this.didTextInput = this.didTextInput.bind(this)
|
||||
this.didKeydown = this.didKeydown.bind(this)
|
||||
this.didKeyup = this.didKeyup.bind(this)
|
||||
@@ -641,6 +643,7 @@ class TextEditorComponent {
|
||||
didBlurHiddenInput: this.didBlurHiddenInput,
|
||||
didFocusHiddenInput: this.didFocusHiddenInput,
|
||||
didTextInput: this.didTextInput,
|
||||
didPaste: this.didPaste,
|
||||
didKeydown: this.didKeydown,
|
||||
didKeyup: this.didKeyup,
|
||||
didKeypress: this.didKeypress,
|
||||
@@ -1549,6 +1552,16 @@ class TextEditorComponent {
|
||||
}
|
||||
}
|
||||
|
||||
didPaste (event) {
|
||||
// On Linux, Chromium translates a middle-button mouse click into a
|
||||
// mousedown event *and* a paste event. Since Atom supports the middle mouse
|
||||
// click as a way of closing a tab, we only want the mousedown event, not
|
||||
// the paste event. And since we don't use the `paste` event for any
|
||||
// behavior in Atom, we can no-op the event to eliminate this issue.
|
||||
// See https://github.com/atom/atom/pull/15183#issue-248432413.
|
||||
if (this.getPlatform() === 'linux') event.preventDefault()
|
||||
}
|
||||
|
||||
didTextInput (event) {
|
||||
if (!this.isInputEnabled()) return
|
||||
|
||||
@@ -1654,8 +1667,10 @@ class TextEditorComponent {
|
||||
// textInput event with the contents of the selection clipboard will be
|
||||
// dispatched by the browser automatically on mouseup.
|
||||
if (platform === 'linux' && button === 1) {
|
||||
const selection = clipboard.readText('selection')
|
||||
const screenPosition = this.screenPositionForMouseEvent(event)
|
||||
model.setCursorScreenPosition(screenPosition, {autoscroll: false})
|
||||
model.insertText(selection)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -3356,8 +3371,8 @@ class CursorsAndInputComponent {
|
||||
renderHiddenInput () {
|
||||
const {
|
||||
lineHeight, hiddenInputPosition, didBlurHiddenInput, didFocusHiddenInput,
|
||||
didTextInput, didKeydown, didKeyup, didKeypress, didCompositionStart,
|
||||
didCompositionUpdate, didCompositionEnd
|
||||
didPaste, didTextInput, didKeydown, didKeyup, didKeypress,
|
||||
didCompositionStart, didCompositionUpdate, didCompositionEnd
|
||||
} = this.props
|
||||
|
||||
let top, left
|
||||
@@ -3376,6 +3391,7 @@ class CursorsAndInputComponent {
|
||||
on: {
|
||||
blur: didBlurHiddenInput,
|
||||
focus: didFocusHiddenInput,
|
||||
paste: didPaste,
|
||||
textInput: didTextInput,
|
||||
keydown: didKeydown,
|
||||
keyup: didKeyup,
|
||||
|
||||
Reference in New Issue
Block a user