Files
moonlight-embedded/src/com/limelight/input/MouseHandler.java
2013-12-15 14:13:32 -05:00

172 lines
3.7 KiB
Java

package com.limelight.input;
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.SwingUtilities;
import com.limelight.gui.StreamFrame;
import com.limelight.nvstream.NvConnection;
import com.limelight.nvstream.input.MouseButtonPacket;
public class MouseHandler implements MouseListener, MouseMotionListener {
private NvConnection conn;
private Robot robot;
private Dimension size;
private StreamFrame parent;
private int lastX = 0;
private int lastY = 0;
private boolean captureMouse = true;
private final double mouseThresh = 0.45;
public MouseHandler(NvConnection conn, StreamFrame parent) {
this.conn = conn;
this.parent = parent;
try {
this.robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
size = new Dimension();
}
public void free() {
captureMouse = false;
}
public void capture() {
moveMouse((int)parent.getLocationOnScreen().getX() + (size.width/2),
(int)parent.getLocationOnScreen().getY() + (size.height/2));
captureMouse = true;
}
@Override
public void mouseClicked(MouseEvent e) {
if (captureMouse) {
parent.hideCursor();
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
if (captureMouse) {
checkBoundaries(e);
}
}
@Override
public void mousePressed(MouseEvent e) {
if (captureMouse) {
byte mouseButton = 0x0;
if (SwingUtilities.isLeftMouseButton(e)) {
mouseButton = MouseButtonPacket.BUTTON_1;
}
if (SwingUtilities.isMiddleMouseButton(e)) {
mouseButton = MouseButtonPacket.BUTTON_2;
}
if (SwingUtilities.isRightMouseButton(e)) {
mouseButton = MouseButtonPacket.BUTTON_3;
}
if (mouseButton > 0) {
conn.sendMouseButtonDown(mouseButton);
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (captureMouse) {
byte mouseButton = 0x0;
if (SwingUtilities.isLeftMouseButton(e)) {
mouseButton = MouseButtonPacket.BUTTON_1;
}
if (SwingUtilities.isMiddleMouseButton(e)) {
mouseButton = MouseButtonPacket.BUTTON_2;
}
if (SwingUtilities.isRightMouseButton(e)) {
mouseButton = MouseButtonPacket.BUTTON_3;
}
if (mouseButton > 0) {
conn.sendMouseButtonUp(mouseButton);
}
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (captureMouse) {
mouseMoved(e);
}
}
@Override
public void mouseMoved(MouseEvent e) {
if (captureMouse) {
Point mouse = e.getLocationOnScreen();
int x = (int)mouse.getX();
int y = (int)mouse.getY();
conn.sendMouseMove((short)(x - lastX), (short)(y - lastY));
lastX = x;
lastY = y;
checkBoundaries(e);
}
}
private void checkBoundaries(MouseEvent e) {
parent.getSize(size);
int leftEdge = (int) parent.getLocationOnScreen().getX();
int rightEdge = leftEdge + size.width;
int upperEdge = (int) parent.getLocationOnScreen().getY();
int lowerEdge = upperEdge + size.height;
Point mouse = e.getLocationOnScreen();
double xThresh = (size.width * mouseThresh);
double yThresh = (size.height * mouseThresh);
int newX = (int)mouse.getX();
int newY = (int)mouse.getY();
boolean shouldMoveMouse = false;
if (mouse.getX() < leftEdge + xThresh || mouse.getX() > rightEdge - xThresh) {
newX = (leftEdge + rightEdge) / 2;
shouldMoveMouse = true;
}
if (mouse.getY() < upperEdge + yThresh || mouse.getY() > lowerEdge - yThresh) {
newY = (upperEdge + lowerEdge) / 2;
shouldMoveMouse = true;
}
if (shouldMoveMouse) {
moveMouse(newX, newY);
}
}
private void moveMouse(int x, int y) {
robot.mouseMove(x, y);
lastX = x;
lastY = y;
}
}