diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java index 9b947c34..42daaea9 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -301,6 +301,11 @@ public final class TerminalEmulator { * @param mouseButton one of the MOUSE_* constants of this class. */ public void sendMouseEvent(int mouseButton, int column, int row, boolean pressed) { + if (column < 1) column = 1; + if (column > mColumns) column = mColumns; + if (row < 1) row = 1; + if (row > mRows) row = mRows; + if (mouseButton == MOUSE_LEFT_BUTTON_MOVED && !isDecsetInternalBitSet(DECSET_BIT_MOUSE_TRACKING_BUTTON_EVENT)) { // Do not send tracking. } else if (isDecsetInternalBitSet(DECSET_BIT_MOUSE_PROTOCOL_SGR)) { @@ -308,7 +313,7 @@ public final class TerminalEmulator { } else { mouseButton = pressed ? mouseButton : 3; // 3 for release of all buttons. // Clip to screen, and clip to the limits of 8-bit data. - boolean out_of_bounds = column < 1 || row < 1 || column > mColumns || row > mRows || column > 255 - 32 || row > 255 - 32; + boolean out_of_bounds = column > 255 - 32 || row > 255 - 32; if (!out_of_bounds) { byte[] data = {'\033', '[', 'M', (byte) (32 + mouseButton), (byte) (32 + column), (byte) (32 + row)}; mSession.write(data, 0, data.length); diff --git a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java index 67249dda..8c114979 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java @@ -55,6 +55,14 @@ public class TerminalTest extends TerminalTestCase { assertEquals("\033[<0;3;4M", mOutput.getOutputAndClear()); mTerminal.sendMouseEvent(TerminalEmulator.MOUSE_LEFT_BUTTON, 3, 4, false); assertEquals("\033[<0;3;4m", mOutput.getOutputAndClear()); + + // When the client says that a click is outside (which could happen when pixels are outside + // the terminal area, see https://github.com/termux/termux-app/issues/501) the terminal + // sends a click at the edge. + mTerminal.sendMouseEvent(TerminalEmulator.MOUSE_LEFT_BUTTON, 0, 0, true); + assertEquals("\033[<0;1;1M", mOutput.getOutputAndClear()); + mTerminal.sendMouseEvent(TerminalEmulator.MOUSE_LEFT_BUTTON, 11, 11, false); + assertEquals("\033[<0;10;10m", mOutput.getOutputAndClear()); } public void testNormalization() throws UnsupportedEncodingException {