/*
 * This file is part of lanterna (http://code.google.com/p/lanterna/).
 *
 * lanterna is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Copyright (C) 2010-2020 Martin Berglund
 */
package com.googlecode.lanterna.input;

import com.googlecode.lanterna.TerminalPosition;

import java.util.List;

Pattern used to detect Xterm-protocol mouse events coming in on the standard input channel Created by martin on 19/07/15.
Author:Martin, Andreas
/** * Pattern used to detect Xterm-protocol mouse events coming in on the standard input channel * Created by martin on 19/07/15. * * @author Martin, Andreas */
public class MouseCharacterPattern implements CharacterPattern { private static final char[] PATTERN = { KeyDecodingProfile.ESC_CODE, '[', 'M' }; @Override public Matching match(List<Character> seq) { int size = seq.size(); if (size > 6) { return null; // nope } // check first 3 chars: for (int i = 0; i < 3; i++) { if ( i >= size ) { return Matching.NOT_YET; // maybe later } if ( seq.get(i) != PATTERN[i] ) { return null; // nope } } if (size < 6) { return Matching.NOT_YET; // maybe later } MouseActionType actionType = null; int button = (seq.get(3) & 0x3) + 1; if(button == 4) { //If last two bits are both set, it means button click release button = 0; } int actionCode = (seq.get(3) & 0x60) >> 5; switch(actionCode) { case(1): if(button > 0) { actionType = MouseActionType.CLICK_DOWN; } else { actionType = MouseActionType.CLICK_RELEASE; } break; case(2): case(0): if(button == 0) { actionType = MouseActionType.MOVE; } else { actionType = MouseActionType.DRAG; } break; case(3): if(button == 1) { actionType = MouseActionType.SCROLL_UP; button = 4; } else { actionType = MouseActionType.SCROLL_DOWN; button = 5; } break; } TerminalPosition pos = new TerminalPosition( seq.get(4) - 33, seq.get(5) - 33 ); MouseAction ma = new MouseAction(actionType, button, pos ); return new Matching( ma ); // yep } }