X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Ftterminal%2FECMA48.java;h=0918e9b6630f8636ef8a21bfb7270e2411c3ffb5;hb=b5f2a6dbf2f2b925007a85f68665103ec3514f84;hp=7b41594be4eff9ab073437f9fb64f2302b18f259;hpb=7c870d89433346ccb5505f8f9ba62d3fc18fe996;p=nikiroo-utils.git diff --git a/src/jexer/tterminal/ECMA48.java b/src/jexer/tterminal/ECMA48.java index 7b41594..0918e9b 100644 --- a/src/jexer/tterminal/ECMA48.java +++ b/src/jexer/tterminal/ECMA48.java @@ -522,7 +522,8 @@ public class ECMA48 implements Runnable { */ private enum MouseEncoding { X10, - UTF8 + UTF8, + SGR } /** @@ -1110,7 +1111,7 @@ public class ECMA48 implements Runnable { mouseProtocol, mouseEncoding, mouse); */ - if (mouseEncoding != MouseEncoding.UTF8) { + if (mouseEncoding == MouseEncoding.X10) { // We will support X10 but only for (160,94) and smaller. if ((mouse.getX() >= 160) || (mouse.getY() >= 94)) { return; @@ -1163,27 +1164,83 @@ public class ECMA48 implements Runnable { // Now encode the event StringBuilder sb = new StringBuilder(6); - sb.append((char) 0x1B); - sb.append('['); - sb.append('M'); - if (mouse.getType() == TMouseEvent.Type.MOUSE_UP) { - sb.append((char) (0x03 + 32)); - } else if (mouse.isMouse1()) { - sb.append((char) (0x00 + 32)); - } else if (mouse.isMouse2()) { - sb.append((char) (0x01 + 32)); - } else if (mouse.isMouse3()) { - sb.append((char) (0x02 + 32)); - } else if (mouse.isMouseWheelUp()) { - sb.append((char) (0x04 + 64)); - } else if (mouse.isMouseWheelDown()) { - sb.append((char) (0x05 + 64)); + if (mouseEncoding == MouseEncoding.SGR) { + sb.append((char) 0x1B); + sb.append("[<"); + + if (mouse.isMouse1()) { + if (mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) { + sb.append("32;"); + } else { + sb.append("0;"); + } + } else if (mouse.isMouse2()) { + if (mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) { + sb.append("33;"); + } else { + sb.append("1;"); + } + } else if (mouse.isMouse3()) { + if (mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) { + sb.append("34;"); + } else { + sb.append("2;"); + } + } else if (mouse.isMouseWheelUp()) { + sb.append("64;"); + } else if (mouse.isMouseWheelDown()) { + sb.append("65;"); + } else { + // This is motion with no buttons down. + sb.append("35;"); + } + + sb.append(String.format("%d;%d", mouse.getX() + 1, + mouse.getY() + 1)); + + if (mouse.getType() == TMouseEvent.Type.MOUSE_UP) { + sb.append("m"); + } else { + sb.append("M"); + } + } else { - sb.append((char) (0x03 + 32)); - } + // X10 and UTF8 encodings + sb.append((char) 0x1B); + sb.append('['); + sb.append('M'); + if (mouse.getType() == TMouseEvent.Type.MOUSE_UP) { + sb.append((char) (0x03 + 32)); + } else if (mouse.isMouse1()) { + if (mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) { + sb.append((char) (0x00 + 32 + 32)); + } else { + sb.append((char) (0x00 + 32)); + } + } else if (mouse.isMouse2()) { + if (mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) { + sb.append((char) (0x01 + 32 + 32)); + } else { + sb.append((char) (0x01 + 32)); + } + } else if (mouse.isMouse3()) { + if (mouse.getType() == TMouseEvent.Type.MOUSE_MOTION) { + sb.append((char) (0x02 + 32 + 32)); + } else { + sb.append((char) (0x02 + 32)); + } + } else if (mouse.isMouseWheelUp()) { + sb.append((char) (0x04 + 64)); + } else if (mouse.isMouseWheelDown()) { + sb.append((char) (0x05 + 64)); + } else { + // This is motion with no buttons down. + sb.append((char) (0x03 + 32)); + } - sb.append((char) (mouse.getX() + 33)); - sb.append((char) (mouse.getY() + 33)); + sb.append((char) (mouse.getX() + 33)); + sb.append((char) (mouse.getY() + 33)); + } // System.err.printf("Would write: \'%s\'\n", sb.toString()); writeRemote(sb.toString()); @@ -2441,6 +2498,19 @@ public class ECMA48 implements Runnable { } break; + case 1006: + if ((type == DeviceType.XTERM) + && (decPrivateModeFlag == true) + ) { + // Mouse: SGR coordinates + if (value == true) { + mouseEncoding = MouseEncoding.SGR; + } else { + mouseEncoding = MouseEncoding.X10; + } + } + break; + default: break;