aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/linux
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2012-11-21 21:33:24 -0800
committerSven Gothel <[email protected]>2012-11-21 21:33:24 -0800
commitd0737cc4a34a41ad9bdac7de379250cacbf55a1d (patch)
tree4eab32d5cb34e1c45c6cf6f3192dfe5821d12bd9 /plugins/linux
parentf9c8ac4bce9998b58d405af70d93ae028891497d (diff)
parented3c33ad8fb52c0266222fdfd57d543a7b2f96b6 (diff)
Merge pull request #1 from Conzar/grab
Grab
Diffstat (limited to 'plugins/linux')
-rw-r--r--plugins/linux/build.xml1
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java37
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java61
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java4
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxMouse.java4
-rw-r--r--plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c24
6 files changed, 86 insertions, 45 deletions
diff --git a/plugins/linux/build.xml b/plugins/linux/build.xml
index ad912f4..0187a01 100644
--- a/plugins/linux/build.xml
+++ b/plugins/linux/build.xml
@@ -56,6 +56,7 @@
<javah destdir="src/native">
<classpath>
<pathelement location="classes"/>
+ <pathelement location="../../coreAPI/classes"/>
</classpath>
<class name="net.java.games.input.LinuxEventDevice"/>
<class name="net.java.games.input.LinuxJoystickDevice"/>
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
index fc829c9..1a1a85c 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
@@ -480,6 +480,43 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen
}
}
+ /**
+ * Attempt to find devices using uinput used for forwarding events.
+ * TODO try to work this out!
+ */
+ /*
+ private final void enumerateUInputControllers(List controllers) {
+ final File dev = new File("/dev/uinput");
+ File[] event_device_files = listFilesPrivileged(dev, new FilenameFilter() {
+ public final boolean accept(File dir, String name) {
+ return name.startsWith("event");
+ }
+ });
+ if (event_device_files == null)
+ return;
+ for (int i = 0; i < event_device_files.length; i++) {
+ File event_file = event_device_files[i];
+ try {
+ String path = getAbsolutePathPrivileged(event_file);
+ LinuxEventDevice device = new LinuxEventDevice(path);
+ try {
+ Controller controller = createControllerFromDevice(device);
+ if (controller != null) {
+ controllers.add(controller);
+ devices.add(device);
+ } else
+ device.close();
+ } catch (IOException e) {
+ logln("Failed to create Controller: " + e.getMessage());
+ device.close();
+ }
+ } catch (IOException e) {
+ logln("Failed to open device (" + event_file + "): " + e.getMessage());
+ }
+ }
+ }
+ */
+
private final class ShutdownHook extends Thread {
public final void run() {
for (int i = 0; i < devices.size(); i++) {
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java
index a28c4c7..1517147 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java
@@ -94,28 +94,6 @@ final class LinuxEventDevice implements LinuxDevice {
}
private final Controller.Type guessType() throws IOException {
- Controller.Type type_from_usages = guessTypeFromUsages();
- if (type_from_usages == Controller.Type.UNKNOWN)
- return guessTypeFromComponents();
- else
- return type_from_usages;
- }
-
- private final Controller.Type guessTypeFromUsages() throws IOException {
- byte[] usage_bits = getDeviceUsageBits();
- if (isBitSet(usage_bits, NativeDefinitions.USAGE_MOUSE))
- return Controller.Type.MOUSE;
- else if (isBitSet(usage_bits, NativeDefinitions.USAGE_KEYBOARD))
- return Controller.Type.KEYBOARD;
- else if (isBitSet(usage_bits, NativeDefinitions.USAGE_GAMEPAD))
- return Controller.Type.GAMEPAD;
- else if (isBitSet(usage_bits, NativeDefinitions.USAGE_JOYSTICK))
- return Controller.Type.STICK;
- else
- return Controller.Type.UNKNOWN;
- }
-
- private final Controller.Type guessTypeFromComponents() throws IOException {
List components = getComponents();
if (components.size() == 0)
return Controller.Type.UNKNOWN;
@@ -342,15 +320,6 @@ final class LinuxEventDevice implements LinuxDevice {
}
private final static native void nGetBits(long fd, int ev_type, byte[] evtype_bits) throws IOException;
- private final byte[] getDeviceUsageBits() throws IOException {
- byte[] bits = new byte[NativeDefinitions.USAGE_MAX/8 + 1];
- if (getVersion() >= 0x010001) {
- nGetDeviceUsageBits(fd, bits);
- }
- return bits;
- }
- private final static native void nGetDeviceUsageBits(long fd, byte[] type_bits) throws IOException;
-
public final synchronized void pollKeyStates() throws IOException {
nGetKeyStates(fd, key_states);
}
@@ -391,6 +360,36 @@ final class LinuxEventDevice implements LinuxDevice {
throw new IOException("Device is closed");
}
+ private final static native int nGrab(long fd, int grab) throws IOException;
+
+ /**
+ * Grabs the device so that no other programs can read from the device.
+ */
+ public synchronized final boolean grab(){
+ try{
+ if(nGrab(fd,1) == 0){
+ return false;
+ }
+ }catch(IOException e){
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Release the event so other programs can get events.
+ */
+ public synchronized final boolean ungrab(){
+ try{
+ if(nGrab(fd,0) == 0){
+ return false;
+ }
+ }catch(IOException e){
+ return false;
+ }
+ return true;
+ }
+
+
protected void finalize() throws IOException {
close();
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java b/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
index 96b2d08..3795541 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
@@ -65,4 +65,8 @@ final class LinuxKeyboard extends Keyboard {
public final void pollDevice() throws IOException {
device.pollKeyStates();
}
+
+ public boolean grab(){ return device.grab(); }
+
+ public boolean ungrab(){ return device.ungrab();}
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxMouse.java b/plugins/linux/src/java/net/java/games/input/LinuxMouse.java
index 17b5895..4c3d208 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxMouse.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxMouse.java
@@ -65,4 +65,8 @@ final class LinuxMouse extends Mouse {
protected final boolean getNextDeviceEvent(Event event) throws IOException {
return LinuxControllers.getNextDeviceEvent(event, device);
}
+
+ public boolean grab(){ return device.grab(); }
+
+ public boolean ungrab(){ return device.ungrab();}
}
diff --git a/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c b/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
index 90eff09..702f268 100644
--- a/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
+++ b/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
@@ -112,20 +112,6 @@ JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nGetNumEffects
return num_effects;
}
-JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetDeviceUsageBits(JNIEnv *env, jclass unused, jlong fd_address, jbyteArray usages_array) {
-#if EV_VERSION >= 0x010001
- int fd = (int)fd_address;
- jsize len = (*env)->GetArrayLength(env, usages_array);
- jbyte *usages = (*env)->GetByteArrayElements(env, usages_array, NULL);
- if (usages == NULL)
- return;
- int res = ioctl(fd, EVIOCGUSAGE(len), usages);
- (*env)->ReleaseByteArrayElements(env, usages_array, usages, 0);
- if (res == -1)
- throwIOException(env, "Failed to get device usages (%d)\n", errno);
-#endif
-}
-
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetBits(JNIEnv *env, jclass unused, jlong fd_address, jint evtype, jbyteArray bits_array) {
int fd = (int)fd_address;
jsize len = (*env)->GetArrayLength(env, bits_array);
@@ -255,3 +241,13 @@ JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nEraseEffect(J
if (ioctl(fd, EVIOCRMFF, &ff_id_int) == -1)
throwIOException(env, "Failed to erase effect (%d)\n", errno);
}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nGrab(JNIEnv *env, jclass unused, jlong fd_address, jint do_grab) {
+ int fd = (int)fd_address;
+ int grab = (int)do_grab;
+ if (ioctl(fd,EVIOCGRAB,grab) == -1){
+ throwIOException(env, "Failed to grab device (%d)\n", errno);
+ return -1;
+ }
+ return 1;
+}