Raw mouse input is working

This commit is contained in:
Cameron Gutman
2014-09-02 00:41:33 -07:00
parent 124037ce27
commit 3e017625a9
4 changed files with 136 additions and 81 deletions
@@ -1,6 +1,7 @@
package com.limelight.binding.input.evdev;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import com.limelight.LimeLog;
@@ -17,91 +18,86 @@ public class EvdevHandler {
// but it's important that we get this right to avoid causing
// system-wide input problems.
// Modify permissions to allow us access
if (!EvdevReader.setPermissions(absolutePath, 0666)) {
LimeLog.warning("Unable to chmod "+absolutePath);
// Open the /dev/input/eventX file
int fd = EvdevReader.open(absolutePath);
if (fd == -1) {
LimeLog.warning("Unable to open "+absolutePath);
return;
}
try {
// Open the /dev/input/eventX file
int fd = EvdevReader.open(absolutePath);
if (fd == -1) {
LimeLog.warning("Unable to open "+absolutePath);
// Check if it's a mouse
if (!EvdevReader.isMouse(fd)) {
// We only handle mice
return;
}
// Grab it for ourselves
if (!EvdevReader.grab(fd)) {
LimeLog.warning("Unable to grab "+absolutePath);
return;
}
LimeLog.info("Grabbed device for raw mouse input: "+absolutePath);
ByteBuffer buffer = ByteBuffer.allocate(EvdevEvent.EVDEV_MAX_EVENT_SIZE).order(ByteOrder.nativeOrder());
try {
// Check if it's a mouse
if (!EvdevReader.isMouse(fd)) {
// We only handle mice
return;
}
// Grab it for ourselves
if (!EvdevReader.grab(fd)) {
LimeLog.warning("Unable to grab "+absolutePath);
return;
}
LimeLog.info("Grabbed device for raw mouse input: "+absolutePath);
ByteBuffer buffer = ByteBuffer.allocate(EvdevEvent.EVDEV_MAX_EVENT_SIZE);
try {
while (!isInterrupted() && !shutdown) {
EvdevEvent event = EvdevReader.read(fd, buffer);
if (event == null) {
return;
int deltaX = 0;
int deltaY = 0;
while (!isInterrupted() && !shutdown) {
EvdevEvent event = EvdevReader.read(fd, buffer);
if (event == null) {
return;
}
switch (event.type)
{
case EvdevEvent.EV_SYN:
if (deltaX != 0 || deltaY != 0) {
listener.mouseMove(deltaX, deltaY);
deltaX = deltaY = 0;
}
switch (event.type)
break;
case EvdevEvent.EV_REL:
switch (event.code)
{
case EvdevEvent.EV_SYN:
// Do nothing
case EvdevEvent.REL_X:
deltaX = event.value;
break;
case EvdevEvent.EV_REL:
switch (event.code)
{
case EvdevEvent.REL_X:
listener.mouseMove(event.value, 0);
break;
case EvdevEvent.REL_Y:
listener.mouseMove(0, event.value);
break;
}
case EvdevEvent.REL_Y:
deltaY = event.value;
break;
}
break;
case EvdevEvent.EV_KEY:
switch (event.code)
{
case EvdevEvent.BTN_LEFT:
listener.mouseButtonEvent(EvdevListener.BUTTON_LEFT,
event.value != 0);
break;
case EvdevEvent.BTN_MIDDLE:
listener.mouseButtonEvent(EvdevListener.BUTTON_MIDDLE,
event.value != 0);
break;
case EvdevEvent.BTN_RIGHT:
listener.mouseButtonEvent(EvdevListener.BUTTON_RIGHT,
event.value != 0);
break;
case EvdevEvent.EV_KEY:
switch (event.code)
{
case EvdevEvent.BTN_LEFT:
listener.mouseButtonEvent(EvdevListener.BUTTON_LEFT,
event.value != 0);
break;
case EvdevEvent.BTN_MIDDLE:
listener.mouseButtonEvent(EvdevListener.BUTTON_MIDDLE,
event.value != 0);
break;
case EvdevEvent.BTN_RIGHT:
listener.mouseButtonEvent(EvdevListener.BUTTON_RIGHT,
event.value != 0);
break;
}
}
}
} finally {
// Release our grab
EvdevReader.ungrab(fd);
}
} finally {
// Close the file
EvdevReader.close(fd);
// Release our grab
EvdevReader.ungrab(fd);
}
} finally {
// Set permissions back
EvdevReader.setPermissions(absolutePath, 0066);
// Close the file
EvdevReader.close(fd);
}
}
};