parent
dcc3778bfa
commit
5b8dc9a366
@ -1,23 +1,26 @@ |
|||||||
# Compiled class file |
# Compiled class file |
||||||
*.class |
*.class |
||||||
|
|
||||||
# Log file |
# Log file |
||||||
*.log |
*.log |
||||||
|
|
||||||
# BlueJ files |
# BlueJ files |
||||||
*.ctxt |
*.ctxt |
||||||
|
|
||||||
# Mobile Tools for Java (J2ME) |
# Mobile Tools for Java (J2ME) |
||||||
.mtj.tmp/ |
.mtj.tmp/ |
||||||
|
|
||||||
# Package Files # |
# Package Files # |
||||||
*.jar |
*.jar |
||||||
*.war |
*.war |
||||||
*.nar |
*.nar |
||||||
*.ear |
*.ear |
||||||
*.zip |
*.zip |
||||||
*.tar.gz |
*.tar.gz |
||||||
*.rar |
*.rar |
||||||
|
|
||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml |
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml |
||||||
hs_err_pid* |
hs_err_pid* |
||||||
|
/build/ |
||||||
|
/dist/ |
||||||
|
/nbproject/private/ |
@ -1,2 +1,11 @@ |
|||||||
# jinput2 |
# jinput2 |
||||||
a fork of the jinput project |
This project is a fork of the https://github.com/jinput/jinput project, whoch had no changed since 2018 |
||||||
|
|
||||||
|
# Changes |
||||||
|
The project contains the full Java content necessary to build the jar file. It also distribute the native files. |
||||||
|
|
||||||
|
The other changes are: |
||||||
|
|
||||||
|
|
||||||
|
# License |
||||||
|
Licensed under BSD License, copyright is attributed in each source file committed. |
@ -0,0 +1,146 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<!-- You may freely edit this file. See commented blocks below for --> |
||||||
|
<!-- some examples of how to customize the build. --> |
||||||
|
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||||
|
<!-- By default, only the Clean and Build commands use this build script. --> |
||||||
|
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||||
|
<!-- the Compile on Save feature is turned off for the project. --> |
||||||
|
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||||
|
<!-- in the project's Project Properties dialog box.--> |
||||||
|
<project name="jInput" default="default" basedir="."> |
||||||
|
<description>Builds, tests, and runs the project jInput.</description> |
||||||
|
<import file="nbproject/build-impl.xml"/> |
||||||
|
<!-- =================================================================== --> |
||||||
|
<!-- post NB init --> |
||||||
|
<!-- =================================================================== --> |
||||||
|
|
||||||
|
<target name="-post-init"> |
||||||
|
<!-- general properties definition --> |
||||||
|
<property name="archiveName" value="jinput"/> |
||||||
|
<property name="src.dir" value="${src.core.dir}/.."/> |
||||||
|
<property name="j2seapi" value="http://docs.oracle.com/javase/8/docs/api/"/> |
||||||
|
<!-- To set with your location of Java 8 JDK --> |
||||||
|
<property name="javadocDir" value="${jdk.home}/docs/api"/> |
||||||
|
<property name="javadocEXE" value="${jdk.home}/bin/javadoc.exe"/> |
||||||
|
</target> |
||||||
|
|
||||||
|
<!-- =================================================================== --> |
||||||
|
<!-- Non NB targets --> |
||||||
|
<!-- =================================================================== --> |
||||||
|
|
||||||
|
<target description="fetch version" depends="-init-project" name="version"> |
||||||
|
<loadproperties srcFile="${src.core.dir}/net/java/games/input/jinput.properties"> |
||||||
|
<filterchain> |
||||||
|
<linecontains> |
||||||
|
<contains value="version"/> |
||||||
|
</linecontains> |
||||||
|
</filterchain> |
||||||
|
</loadproperties> |
||||||
|
</target> |
||||||
|
|
||||||
|
<!-- =================================================================== --> |
||||||
|
<!-- zip files --> |
||||||
|
<!-- =================================================================== --> |
||||||
|
|
||||||
|
<!-- zip javadocs --> |
||||||
|
<target depends="version, -post-init" |
||||||
|
description="create javadoc zip files" name="zipjavadoc" if="javadoc.exists"> |
||||||
|
<zip compress="true" defaultexcludes="true" zipfile="${dist.dir}/${archiveName}-docs-${version}.zip"> |
||||||
|
<fileset description="documentation" dir="${dist.javadoc.dir}"> |
||||||
|
<include name="**/*"/> |
||||||
|
</fileset> |
||||||
|
</zip> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target depends="version, -post-init, zipjavadoc" description="create zip files" name="zip"> |
||||||
|
<!-- zip binary files for distribution --> |
||||||
|
<zip compress="true" defaultexcludes="true" |
||||||
|
zipfile="${dist.dir}/${archiveName-LGPL}-bin-${version}.zip"> |
||||||
|
<fileset description="docs" dir="."> |
||||||
|
<include name="README"/> |
||||||
|
<include name="CHANGES"/> |
||||||
|
</fileset> |
||||||
|
<fileset description="binaries" dir="${dist.dir}"> |
||||||
|
<include name="jinput.jar"/> |
||||||
|
</fileset> |
||||||
|
<fileset description="natibve libs" dir="."> |
||||||
|
<include name="natives/*.dll"/> |
||||||
|
<include name="natives/*.so"/> |
||||||
|
<include name="natives/*.jnilib"/> |
||||||
|
</fileset> |
||||||
|
</zip> |
||||||
|
<!-- zip source files for APACHE - LGPL distribution --> |
||||||
|
<zip compress="true" defaultexcludes="yes" zipfile="${dist.dir}/${archiveName-APACHE}-src-${version}.zip"> |
||||||
|
<fileset description="core source directory" dir="${src.dir}/.."> |
||||||
|
<include name="src/**/*.java"/> |
||||||
|
<include name="src/**/*.properties"/> |
||||||
|
<include name="src/manifest.mf"/> |
||||||
|
</fileset> |
||||||
|
<fileset description="binaries" dir="${dist.dir}"> |
||||||
|
<include name="jinput.jar"/> |
||||||
|
</fileset> |
||||||
|
<fileset description="project" dir="${dist.dir}/.."> |
||||||
|
<include name="nbproject/**/*.*"/> |
||||||
|
</fileset> |
||||||
|
<fileset description="misc" dir="."> |
||||||
|
<include name="README"/> |
||||||
|
<include name="CHANGES"/> |
||||||
|
<include name="build.xml"/> |
||||||
|
</fileset> |
||||||
|
</zip> |
||||||
|
<!-- zip test source files --> |
||||||
|
<zip compress="true" defaultexcludes="true" zipfile="${dist.dir}/${archiveName}-tests-${version}.zip"> |
||||||
|
<fileset description="tests directory" dir="${test.src.dir}/.."> |
||||||
|
<include name="test/**/*.*"/> |
||||||
|
</fileset> |
||||||
|
</zip> |
||||||
|
</target> |
||||||
|
|
||||||
|
<!-- =================================================================== --> |
||||||
|
<!-- NB overwrite targets : javadocs --> |
||||||
|
<!-- =================================================================== --> |
||||||
|
|
||||||
|
<target depends="-javadoc-core" name="-javadoc-build" /> |
||||||
|
|
||||||
|
<target depends="init, -init-project, -post-init" name="-javadoc-core"> |
||||||
|
<!-- Javadoc --> |
||||||
|
<javadoc author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" |
||||||
|
docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" |
||||||
|
noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" |
||||||
|
notree="${javadoc.notree}" private="${javadoc.private}" |
||||||
|
source="${javac.source}" splitindex="${javadoc.splitindex}" |
||||||
|
overview="${src.dir}/overview.html" |
||||||
|
use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" |
||||||
|
windowtitle="jinput API" executable="${javadocEXE}" > |
||||||
|
<link href="${j2seapi}" /> |
||||||
|
<!-- the Xdoclint argument avoid to get javadoc errors when the documentation format is not compliant for HTML 4, which was the case before |
||||||
|
Java 8. It would also not be a good idea, because empty tags like br are very useful --> |
||||||
|
<arg line="-Xdoclint:none"/> |
||||||
|
<classpath> |
||||||
|
<path path="${tools.dir}/junit-4.12.jar"/> |
||||||
|
</classpath> |
||||||
|
<fileset dir="${src.dir}"> |
||||||
|
<filename name="**/*.java"/> |
||||||
|
<exclude name="samples/**/*.java"/> |
||||||
|
</fileset> |
||||||
|
</javadoc> |
||||||
|
</target> |
||||||
|
|
||||||
|
<!-- =================================================================== --> |
||||||
|
<!-- NB overwrite targets : jar --> |
||||||
|
<!-- =================================================================== --> |
||||||
|
|
||||||
|
<target depends="init,compile,-pre-jar,-do-jar-without-manifest,-post-jar" description="Build JAR." name="jar"/> |
||||||
|
|
||||||
|
<target name="-do-jar-without-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" > |
||||||
|
<!-- jar construction --> |
||||||
|
<jar description="core APACHE jar binary file" compress="true" |
||||||
|
jarfile="${dist.dir}/jinput.jar" manifest="${src.dir}/manifest.mf" > |
||||||
|
<fileset defaultexcludes="yes" dir="${build.classes.dir}"> |
||||||
|
<include name="net/**/*.class"/> |
||||||
|
<include name="net/**/*.properties"/> |
||||||
|
<exclude name="samples/**/*.*"/> |
||||||
|
</fileset> |
||||||
|
</jar> |
||||||
|
</target> |
||||||
|
</project> |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,2 @@ |
|||||||
|
main.class=samples.TestSample |
||||||
|
run.jvmargs=-Djava.library.path=natives |
@ -0,0 +1,8 @@ |
|||||||
|
build.xml.data.CRC32=4c1e7187 |
||||||
|
build.xml.script.CRC32=8ddf4329 |
||||||
|
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||||
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||||
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||||
|
nbproject/build-impl.xml.data.CRC32=7abf3dc5 |
||||||
|
nbproject/build-impl.xml.script.CRC32=0847958b |
||||||
|
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 |
@ -0,0 +1,84 @@ |
|||||||
|
annotation.processing.enabled=true |
||||||
|
annotation.processing.enabled.in.editor=false |
||||||
|
annotation.processing.processors.list= |
||||||
|
annotation.processing.run.all.processors=true |
||||||
|
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output |
||||||
|
application.title=jInput |
||||||
|
application.vendor=Herve |
||||||
|
build.classes.dir=${build.dir}/classes |
||||||
|
build.classes.excludes=**/*.java,**/*.form |
||||||
|
# This directory is removed when the project is cleaned: |
||||||
|
build.dir=build |
||||||
|
build.generated.dir=${build.dir}/generated |
||||||
|
build.generated.sources.dir=${build.dir}/generated-sources |
||||||
|
# Only compile against the classpath explicitly listed here: |
||||||
|
build.sysclasspath=ignore |
||||||
|
build.test.classes.dir=${build.dir}/test/classes |
||||||
|
build.test.results.dir=${build.dir}/test/results |
||||||
|
# Uncomment to specify the preferred debugger connection transport: |
||||||
|
#debug.transport=dt_socket |
||||||
|
debug.classpath=\ |
||||||
|
${run.classpath} |
||||||
|
debug.test.classpath=\ |
||||||
|
${run.test.classpath} |
||||||
|
# Files in build.classes.dir which should be excluded from distribution jar |
||||||
|
dist.archive.excludes= |
||||||
|
# This directory is removed when the project is cleaned: |
||||||
|
dist.dir=dist |
||||||
|
dist.jar=${dist.dir}/jInput.jar |
||||||
|
dist.javadoc.dir=${dist.dir}/javadoc |
||||||
|
endorsed.classpath= |
||||||
|
excludes= |
||||||
|
includes=** |
||||||
|
jar.compress=false |
||||||
|
javac.classpath= |
||||||
|
# Space-separated list of extra javac options |
||||||
|
javac.compilerargs= |
||||||
|
javac.deprecation=false |
||||||
|
javac.external.vm=true |
||||||
|
javac.processorpath=\ |
||||||
|
${javac.classpath} |
||||||
|
javac.source=1.8 |
||||||
|
javac.target=1.8 |
||||||
|
javac.test.classpath=\ |
||||||
|
${javac.classpath}:\ |
||||||
|
${build.classes.dir}:\ |
||||||
|
${libs.junit_4.classpath}:\ |
||||||
|
${libs.hamcrest.classpath} |
||||||
|
javac.test.processorpath=\ |
||||||
|
${javac.test.classpath} |
||||||
|
javadoc.additionalparam= |
||||||
|
javadoc.author=false |
||||||
|
javadoc.encoding=${source.encoding} |
||||||
|
javadoc.noindex=false |
||||||
|
javadoc.nonavbar=false |
||||||
|
javadoc.notree=false |
||||||
|
javadoc.private=false |
||||||
|
javadoc.splitindex=true |
||||||
|
javadoc.use=true |
||||||
|
javadoc.version=false |
||||||
|
javadoc.windowtitle= |
||||||
|
main.class=net.java.games.input.Version |
||||||
|
meta.inf.dir=${src.dir}/META-INF |
||||||
|
mkdist.disabled=true |
||||||
|
platform.active=default_platform |
||||||
|
run.classpath=\ |
||||||
|
${javac.classpath}:\ |
||||||
|
${build.classes.dir} |
||||||
|
# Space-separated list of JVM arguments used when running the project. |
||||||
|
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. |
||||||
|
# To set system properties for unit tests define test-sys-prop.name=value: |
||||||
|
run.jvmargs= |
||||||
|
run.test.classpath=\ |
||||||
|
${javac.test.classpath}:\ |
||||||
|
${build.test.classes.dir} |
||||||
|
source.encoding=UTF-8 |
||||||
|
src.samples.dir=src\\samples |
||||||
|
test.run.args=-Djava.library.path=D:/Java/jInput/natives |
||||||
|
src.awt.dir=src\\plugins\\awt |
||||||
|
src.core.dir=src\\core |
||||||
|
src.jutils.dir=src\\jutils |
||||||
|
src.linux.dir=src\\plugins\\linux |
||||||
|
src.osx.dir=src\\plugins\\osx |
||||||
|
src.windows.dir=src\\plugins\\windows |
||||||
|
test.src.dir=test |
@ -0,0 +1,21 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||||
|
<type>org.netbeans.modules.java.j2seproject</type> |
||||||
|
<configuration> |
||||||
|
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||||
|
<name>jInput</name> |
||||||
|
<source-roots> |
||||||
|
<root id="src.samples.dir" name="samples"/> |
||||||
|
<root id="src.core.dir" name="core"/> |
||||||
|
<root id="src.jutils.dir" name="jutils"/> |
||||||
|
<root id="src.awt.dir" name="awt"/> |
||||||
|
<root id="src.linux.dir" name="linux"/> |
||||||
|
<root id="src.windows.dir" name="windows"/> |
||||||
|
<root id="src.osx.dir" name="osx"/> |
||||||
|
</source-roots> |
||||||
|
<test-roots> |
||||||
|
<root id="test.src.dir"/> |
||||||
|
</test-roots> |
||||||
|
</data> |
||||||
|
</configuration> |
||||||
|
</project> |
@ -0,0 +1,145 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Skeleton implementation of a named axis. |
||||||
|
*/ |
||||||
|
public abstract class AbstractComponent implements Component { |
||||||
|
|
||||||
|
/** |
||||||
|
* Human-readable name for this Axis |
||||||
|
*/ |
||||||
|
private final String name; |
||||||
|
|
||||||
|
private final Identifier id; |
||||||
|
|
||||||
|
private boolean has_polled; |
||||||
|
private float value; |
||||||
|
private float event_value; |
||||||
|
|
||||||
|
/** |
||||||
|
* Protected constructor |
||||||
|
* @param name A name for the axis |
||||||
|
*/ |
||||||
|
protected AbstractComponent(String name, Identifier id) { |
||||||
|
this.name = name; |
||||||
|
this.id = id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the type or identifier of the axis. |
||||||
|
*/ |
||||||
|
public Identifier getIdentifier() { |
||||||
|
return id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns whether or not the axis is analog, or false if it is digital. |
||||||
|
* @return false by default, can be overridden |
||||||
|
*/ |
||||||
|
public boolean isAnalog() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the suggested dead zone for this axis. Dead zone is the |
||||||
|
* amount polled data can vary before considered a significant change |
||||||
|
* in value. An application can safely ignore changes less than this |
||||||
|
* value in the positive or negative direction. |
||||||
|
* @return 0.0f by default, can be overridden |
||||||
|
*/ |
||||||
|
public float getDeadZone() { |
||||||
|
return 0.0f; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the data from the last time the control has been polled. |
||||||
|
* If this axis is a button, the value returned will be either 0.0f or 1.0f. |
||||||
|
* If this axis is normalised, the value returned will be between -1.0f and |
||||||
|
* 1.0f. |
||||||
|
* @return The data from the last time the control has been polled. |
||||||
|
*/ |
||||||
|
public final float getPollData() { |
||||||
|
if (!has_polled && !isRelative()) { |
||||||
|
has_polled = true; |
||||||
|
try { |
||||||
|
setPollData(poll()); |
||||||
|
} catch (IOException e) { |
||||||
|
ControllerEnvironment.log("Failed to poll component: " + e); |
||||||
|
} |
||||||
|
} |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
final void resetHasPolled() { |
||||||
|
has_polled = false; |
||||||
|
} |
||||||
|
|
||||||
|
final void setPollData(float value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
final float getEventValue() { |
||||||
|
return event_value; |
||||||
|
} |
||||||
|
|
||||||
|
final void setEventValue(float event_value) { |
||||||
|
this.event_value = event_value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a human-readable name for this axis. |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a non-localized string description of this axis. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract float poll() throws IOException; |
||||||
|
|
||||||
|
} // AbstractAxis
|
@ -0,0 +1,233 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* An AbstractController is a skeleton implementation of a controller that |
||||||
|
* contains a fixed number of axes, controllers, and rumblers. |
||||||
|
*/ |
||||||
|
public abstract class AbstractController implements Controller { |
||||||
|
final static int EVENT_QUEUE_DEPTH = 32; |
||||||
|
|
||||||
|
private final static Event event = new Event(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Human-readable name for this Controller |
||||||
|
*/ |
||||||
|
private final String name; |
||||||
|
|
||||||
|
/** |
||||||
|
* Array of components |
||||||
|
*/ |
||||||
|
private final Component[] components; |
||||||
|
|
||||||
|
/** |
||||||
|
* Array of child controllers |
||||||
|
*/ |
||||||
|
private final Controller[] children; |
||||||
|
|
||||||
|
/** |
||||||
|
* Array of rumblers |
||||||
|
*/ |
||||||
|
private final Rumbler[] rumblers; |
||||||
|
|
||||||
|
/** |
||||||
|
* Map from Component.Identifiers to Components |
||||||
|
*/ |
||||||
|
private final Map<Component.Identifier, Component> id_to_components = new HashMap<>(); |
||||||
|
|
||||||
|
private EventQueue event_queue = new EventQueue(EVENT_QUEUE_DEPTH); |
||||||
|
|
||||||
|
/** |
||||||
|
* Protected constructor for a controller containing the specified |
||||||
|
* axes, child controllers, and rumblers |
||||||
|
* @param name name for the controller |
||||||
|
* @param components components for the controller |
||||||
|
* @param children child controllers for the controller |
||||||
|
* @param rumblers rumblers for the controller |
||||||
|
*/ |
||||||
|
protected AbstractController(String name, Component[] components, Controller[] children, Rumbler[] rumblers) { |
||||||
|
this.name = name; |
||||||
|
this.components = components; |
||||||
|
this.children = children; |
||||||
|
this.rumblers = rumblers; |
||||||
|
// process from last to first to let earlier listed Components get higher priority
|
||||||
|
for (int i = components.length - 1; i >= 0; i--) { |
||||||
|
id_to_components.put(components[i].getIdentifier(), components[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the controllers connected to make up this controller, or |
||||||
|
* an empty array if this controller contains no child controllers. |
||||||
|
* The objects in the array are returned in order of assignment priority |
||||||
|
* (primary stick, secondary buttons, etc.). |
||||||
|
*/ |
||||||
|
public final Controller[] getControllers() { |
||||||
|
return children; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the components on this controller, in order of assignment priority. |
||||||
|
* For example, the button controller on a mouse returns an array containing |
||||||
|
* the primary or leftmost mouse button, followed by the secondary or |
||||||
|
* rightmost mouse button (if present), followed by the middle mouse button |
||||||
|
* (if present). |
||||||
|
* The array returned is an empty array if this controller contains no components |
||||||
|
* (such as a logical grouping of child controllers). |
||||||
|
*/ |
||||||
|
public final Component[] getComponents() { |
||||||
|
return components; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a single component based on its identifier, or null |
||||||
|
* if no component with the specified type could be found. |
||||||
|
*/ |
||||||
|
public final Component getComponent(Component.Identifier id) { |
||||||
|
return id_to_components.get(id); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the rumblers for sending feedback to this controller, or an |
||||||
|
* empty array if there are no rumblers on this controller. |
||||||
|
*/ |
||||||
|
public final Rumbler[] getRumblers() { |
||||||
|
return rumblers; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the port type for this Controller. |
||||||
|
* @return PortType.UNKNOWN by default, can be overridden |
||||||
|
*/ |
||||||
|
public PortType getPortType() { |
||||||
|
return PortType.UNKNOWN; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the zero-based port number for this Controller. |
||||||
|
* @return 0 by default, can be overridden |
||||||
|
*/ |
||||||
|
public int getPortNumber() { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a human-readable name for this Controller. |
||||||
|
*/ |
||||||
|
public final String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a non-localized string description of this controller. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns the type of the Controller. |
||||||
|
*/ |
||||||
|
public Type getType() { |
||||||
|
return Type.UNKNOWN; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new EventQueue. Events in old queue are lost. |
||||||
|
*/ |
||||||
|
public final void setEventQueueSize(int size) { |
||||||
|
try { |
||||||
|
setDeviceEventQueueSize(size); |
||||||
|
event_queue = new EventQueue(size); |
||||||
|
} catch (IOException e) { |
||||||
|
ControllerEnvironment.log("Failed to create new event queue of size " + size + ": " + e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Plugins override this method to adjust their internal event queue size |
||||||
|
*/ |
||||||
|
protected void setDeviceEventQueueSize(int size) throws IOException { |
||||||
|
} |
||||||
|
|
||||||
|
public final EventQueue getEventQueue() { |
||||||
|
return event_queue; |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract boolean getNextDeviceEvent(Event event) throws IOException; |
||||||
|
|
||||||
|
protected void pollDevice() throws IOException { |
||||||
|
} |
||||||
|
|
||||||
|
/* poll() is synchronized to protect the static event */ |
||||||
|
public synchronized boolean poll() { |
||||||
|
Component[] components = getComponents(); |
||||||
|
try { |
||||||
|
pollDevice(); |
||||||
|
for (int i = 0; i < components.length; i++) { |
||||||
|
AbstractComponent component = (AbstractComponent)components[i]; |
||||||
|
if (component.isRelative()) { |
||||||
|
component.setPollData(0); |
||||||
|
} else { |
||||||
|
// Let the component poll itself lazily
|
||||||
|
component.resetHasPolled(); |
||||||
|
} |
||||||
|
} |
||||||
|
while (getNextDeviceEvent(event)) { |
||||||
|
AbstractComponent component = (AbstractComponent)event.getComponent(); |
||||||
|
float value = event.getValue(); |
||||||
|
if (component.isRelative()) { |
||||||
|
if (value == 0) |
||||||
|
continue; |
||||||
|
component.setPollData(component.getPollData() + value); |
||||||
|
} else { |
||||||
|
if (value == component.getEventValue()) |
||||||
|
continue; |
||||||
|
component.setEventValue(value); |
||||||
|
} |
||||||
|
if (!event_queue.isFull()) |
||||||
|
event_queue.add(event); |
||||||
|
} |
||||||
|
return true; |
||||||
|
} catch (IOException e) { |
||||||
|
ControllerEnvironment.log("Failed to poll device: " + e.getMessage()); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // class AbstractController
|
@ -0,0 +1,782 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis is a single button, slider, or dial, which has a single range. An |
||||||
|
* axis can hold information for motion (linear or rotational), velocity, |
||||||
|
* force, or acceleration. |
||||||
|
*/ |
||||||
|
public interface Component { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the identifier of the axis. |
||||||
|
*/ |
||||||
|
public abstract Identifier getIdentifier(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns <code>true</code> if data returned from <code>poll</code> |
||||||
|
* is relative to the last call, or <code>false</code> if data |
||||||
|
* is absolute. |
||||||
|
*/ |
||||||
|
public abstract boolean isRelative(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns whether or not the axis is analog, or false if it is digital. |
||||||
|
*/ |
||||||
|
public abstract boolean isAnalog(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the suggested dead zone for this axis. Dead zone is the |
||||||
|
* amount polled data can vary before considered a significant change |
||||||
|
* in value. An application can safely ignore changes less than this |
||||||
|
* value in the positive or negative direction. |
||||||
|
* @see #getPollData |
||||||
|
*/ |
||||||
|
public abstract float getDeadZone(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the data from the last time the control has been polled. |
||||||
|
* If this axis is a button, the value returned will be either 0.0f or 1.0f. |
||||||
|
* If this axis is normalized, the value returned will be between -1.0f and |
||||||
|
* 1.0f. |
||||||
|
* @see Controller#poll |
||||||
|
*/ |
||||||
|
public abstract float getPollData(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a human-readable name for this axis. |
||||||
|
*/ |
||||||
|
public abstract String getName(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Identifiers for different Axes. |
||||||
|
*/ |
||||||
|
public static class Identifier { |
||||||
|
|
||||||
|
/** |
||||||
|
* Name of axis type |
||||||
|
*/ |
||||||
|
private final String name; |
||||||
|
|
||||||
|
/** |
||||||
|
* Protected constructor |
||||||
|
*/ |
||||||
|
protected Identifier(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a non-localized string description of this axis type. |
||||||
|
*/ |
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a non-localized string description of this axis type. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public static class Axis extends Identifier { |
||||||
|
|
||||||
|
/** |
||||||
|
* @param name |
||||||
|
*/ |
||||||
|
protected Axis(String name) { |
||||||
|
super(name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying vertical data. |
||||||
|
*/ |
||||||
|
public static final Axis X = new Axis("x"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying horizontal data. |
||||||
|
*/ |
||||||
|
public static final Axis Y = new Axis("y"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying third dimensional up/down |
||||||
|
* data, or linear data in any direction that is |
||||||
|
* neither horizontal nor vertical. |
||||||
|
*/ |
||||||
|
public static final Axis Z = new Axis("z"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying left-right rotational data. |
||||||
|
*/ |
||||||
|
public static final Axis RX = new Axis("rx"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying forward-back rotational data. |
||||||
|
*/ |
||||||
|
public static final Axis RY = new Axis("ry"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying up-down rotational data |
||||||
|
* (rudder control). |
||||||
|
*/ |
||||||
|
public static final Axis RZ = new Axis("rz"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for a slider or mouse wheel. |
||||||
|
*/ |
||||||
|
public static final Axis SLIDER = new Axis("slider"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for slider or mouse wheel acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis SLIDER_ACCELERATION = new Axis("slider-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for slider force data. |
||||||
|
*/ |
||||||
|
public static final Axis SLIDER_FORCE = new Axis("slider-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for slider or mouse wheel velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis SLIDER_VELOCITY = new Axis("slider-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying vertical acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis X_ACCELERATION = new Axis("x-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying vertical force data. |
||||||
|
*/ |
||||||
|
public static final Axis X_FORCE = new Axis("x-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying vertical velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis X_VELOCITY = new Axis("x-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying horizontal acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis Y_ACCELERATION = new Axis("y-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying horizontal force data. |
||||||
|
*/ |
||||||
|
public static final Axis Y_FORCE = new Axis("y-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying horizontal velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis Y_VELOCITY = new Axis("y-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying third dimensional up/down acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis Z_ACCELERATION = new Axis("z-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying third dimensional up/down force data. |
||||||
|
*/ |
||||||
|
public static final Axis Z_FORCE = new Axis("z-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying third dimensional up/down velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis Z_VELOCITY = new Axis("z-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying left-right angular acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis RX_ACCELERATION = new Axis("rx-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying left-right angular force (torque) data. |
||||||
|
*/ |
||||||
|
public static final Axis RX_FORCE = new Axis("rx-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying left-right angular velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis RX_VELOCITY = new Axis("rx-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying forward-back angular acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis RY_ACCELERATION = new Axis("ry-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying forward-back angular force (torque) data. |
||||||
|
*/ |
||||||
|
public static final Axis RY_FORCE = new Axis("ry-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying forward-back angular velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis RY_VELOCITY = new Axis("ry-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying up-down angular acceleration data. |
||||||
|
*/ |
||||||
|
public static final Axis RZ_ACCELERATION = new Axis("rz-acceleration"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying up-down angular force (torque) data. |
||||||
|
*/ |
||||||
|
public static final Axis RZ_FORCE = new Axis("rz-force"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for specifying up-down angular velocity data. |
||||||
|
*/ |
||||||
|
public static final Axis RZ_VELOCITY = new Axis("rz-velocity"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An axis for a point-of-view control. |
||||||
|
*/ |
||||||
|
public static final Axis POV = new Axis("pov"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An unknown axis. |
||||||
|
*/ |
||||||
|
public static final Axis UNKNOWN = new Axis("unknown"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static class Button extends Identifier { |
||||||
|
|
||||||
|
public Button(String name) { |
||||||
|
super(name); |
||||||
|
} |
||||||
|
|
||||||
|
/** First device button |
||||||
|
*/ |
||||||
|
public static final Button _0 = new Button("0"); |
||||||
|
|
||||||
|
/** Second device button |
||||||
|
*/ |
||||||
|
public static final Button _1 = new Button("1"); |
||||||
|
|
||||||
|
/** Thrid device button |
||||||
|
*/ |
||||||
|
public static final Button _2 = new Button("2"); |
||||||
|
|
||||||
|
/** Fourth device button |
||||||
|
*/ |
||||||
|
public static final Button _3 = new Button("3"); |
||||||
|
|
||||||
|
/** Fifth device button |
||||||
|
*/ |
||||||
|
public static final Button _4 = new Button("4"); |
||||||
|
|
||||||
|
/** Sixth device button |
||||||
|
*/ |
||||||
|
public static final Button _5 = new Button("5"); |
||||||
|
|
||||||
|
/** Seventh device button |
||||||
|
*/ |
||||||
|
public static final Button _6 = new Button("6"); |
||||||
|
|
||||||
|
/** Eighth device button |
||||||
|
*/ |
||||||
|
public static final Button _7 = new Button("7"); |
||||||
|
|
||||||
|
/** Ninth device button |
||||||
|
*/ |
||||||
|
public static final Button _8 = new Button("8"); |
||||||
|
|
||||||
|
/** 10th device button |
||||||
|
*/ |
||||||
|
public static final Button _9 = new Button("9"); |
||||||
|
public static final Button _10 = new Button("10"); |
||||||
|
public static final Button _11 = new Button("11"); |
||||||
|
public static final Button _12 = new Button("12"); |
||||||
|
public static final Button _13 = new Button("13"); |
||||||
|
public static final Button _14 = new Button("14"); |
||||||
|
public static final Button _15 = new Button("15"); |
||||||
|
public static final Button _16 = new Button("16"); |
||||||
|
public static final Button _17 = new Button("17"); |
||||||
|
public static final Button _18 = new Button("18"); |
||||||
|
public static final Button _19 = new Button("19"); |
||||||
|
public static final Button _20 = new Button("20"); |
||||||
|
public static final Button _21 = new Button("21"); |
||||||
|
public static final Button _22 = new Button("22"); |
||||||
|
public static final Button _23 = new Button("23"); |
||||||
|
public static final Button _24 = new Button("24"); |
||||||
|
public static final Button _25 = new Button("25"); |
||||||
|
public static final Button _26 = new Button("26"); |
||||||
|
public static final Button _27 = new Button("27"); |
||||||
|
public static final Button _28 = new Button("28"); |
||||||
|
public static final Button _29 = new Button("29"); |
||||||
|
public static final Button _30 = new Button("30"); |
||||||
|
public static final Button _31 = new Button("31"); |
||||||
|
|
||||||
|
/** Joystick trigger button |
||||||
|
*/ |
||||||
|
public static final Button TRIGGER = new Button("Trigger"); |
||||||
|
|
||||||
|
/** Joystick thumb button |
||||||
|
*/ |
||||||
|
public static final Button THUMB = new Button("Thumb"); |
||||||
|
|
||||||
|
/** Second joystick thumb button |
||||||
|
*/ |
||||||
|
public static final Button THUMB2 = new Button("Thumb 2"); |
||||||
|
|
||||||
|
/** Joystick top button |
||||||
|
*/ |
||||||
|
public static final Button TOP = new Button("Top"); |
||||||
|
|
||||||
|
/** Second joystick top button |
||||||
|
*/ |
||||||
|
public static final Button TOP2 = new Button("Top 2"); |
||||||
|
|
||||||
|
/** The joystick button you play with with you little finger (Pinkie on *that* side |
||||||
|
* of the pond :P) |
||||||
|
*/ |
||||||
|
public static final Button PINKIE = new Button("Pinkie"); |
||||||
|
|
||||||
|
/** Joystick button on the base of the device |
||||||
|
*/ |
||||||
|
public static final Button BASE = new Button("Base"); |
||||||
|
|
||||||
|
/** Second joystick button on the base of the device |
||||||
|
*/ |
||||||
|
public static final Button BASE2 = new Button("Base 2"); |
||||||
|
|
||||||
|
/** Thrid joystick button on the base of the device |
||||||
|
*/ |
||||||
|
public static final Button BASE3 = new Button("Base 3"); |
||||||
|
|
||||||
|
/** Fourth joystick button on the base of the device |
||||||
|
*/ |
||||||
|
public static final Button BASE4 = new Button("Base 4"); |
||||||
|
|
||||||
|
/** Fifth joystick button on the base of the device |
||||||
|
*/ |
||||||
|
public static final Button BASE5 = new Button("Base 5"); |
||||||
|
|
||||||
|
/** Sixth joystick button on the base of the device |
||||||
|
*/ |
||||||
|
public static final Button BASE6 = new Button("Base 6"); |
||||||
|
|
||||||
|
/** erm, dunno, but it's in the defines so it might exist. |
||||||
|
*/ |
||||||
|
public static final Button DEAD = new Button("Dead"); |
||||||
|
|
||||||
|
/** 'A' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button A = new Button("A"); |
||||||
|
|
||||||
|
/** 'B' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button B = new Button("B"); |
||||||
|
|
||||||
|
/** 'C' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button C = new Button("C"); |
||||||
|
|
||||||
|
/** 'X' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button X = new Button("X"); |
||||||
|
|
||||||
|
/** 'Y' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button Y = new Button("Y"); |
||||||
|
|
||||||
|
/** 'Z' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button Z = new Button("Z"); |
||||||
|
|
||||||
|
/** Left thumb button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button LEFT_THUMB = new Button("Left Thumb"); |
||||||
|
|
||||||
|
/** Right thumb button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button RIGHT_THUMB = new Button("Right Thumb"); |
||||||
|
|
||||||
|
/** Second left thumb button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button LEFT_THUMB2 = new Button("Left Thumb 2"); |
||||||
|
|
||||||
|
/** Second right thumb button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button RIGHT_THUMB2 = new Button("Right Thumb 2"); |
||||||
|
|
||||||
|
/** 'Select' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button SELECT = new Button("Select"); |
||||||
|
|
||||||
|
/** 'Start' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button START = new Button("Start"); |
||||||
|
|
||||||
|
/** 'Mode' button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button MODE = new Button("Mode"); |
||||||
|
|
||||||
|
/** Another left thumb button on a gamepad (how many thumbs do you have??) |
||||||
|
*/ |
||||||
|
public static final Button LEFT_THUMB3 = new Button("Left Thumb 3"); |
||||||
|
|
||||||
|
/** Another right thumb button on a gamepad |
||||||
|
*/ |
||||||
|
public static final Button RIGHT_THUMB3 = new Button("Right Thumb 3"); |
||||||
|
|
||||||
|
/** Digitiser pen tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_PEN = new Button("Pen"); |
||||||
|
|
||||||
|
/** Digitiser rubber (eraser) tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_RUBBER = new Button("Rubber"); |
||||||
|
|
||||||
|
/** Digitiser brush tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_BRUSH = new Button("Brush"); |
||||||
|
|
||||||
|
/** Digitiser pencil tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_PENCIL = new Button("Pencil"); |
||||||
|
|
||||||
|
/** Digitiser airbrush tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_AIRBRUSH = new Button("Airbrush"); |
||||||
|
|
||||||
|
/** Digitiser finger tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_FINGER = new Button("Finger"); |
||||||
|
|
||||||
|
/** Digitiser mouse tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_MOUSE = new Button("Mouse"); |
||||||
|
|
||||||
|
/** Digitiser lens tool button |
||||||
|
*/ |
||||||
|
public static final Button TOOL_LENS = new Button("Lens"); |
||||||
|
|
||||||
|
/** Digitiser touch button |
||||||
|
*/ |
||||||
|
public static final Button TOUCH = new Button("Touch"); |
||||||
|
|
||||||
|
/** Digitiser stylus button |
||||||
|
*/ |
||||||
|
public static final Button STYLUS = new Button("Stylus"); |
||||||
|
|
||||||
|
/** Second digitiser stylus button |
||||||
|
*/ |
||||||
|
public static final Button STYLUS2 = new Button("Stylus 2"); |
||||||
|
|
||||||
|
/** |
||||||
|
* An unknown button |
||||||
|
*/ |
||||||
|
public static final Button UNKNOWN = new Button("Unknown"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the back mouse button. |
||||||
|
*/ |
||||||
|
public static final Button BACK = new Button("Back"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the extra mouse button. |
||||||
|
*/ |
||||||
|
public static final Button EXTRA = new Button("Extra"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the forward mouse button. |
||||||
|
*/ |
||||||
|
public static final Button FORWARD = new Button("Forward"); |
||||||
|
|
||||||
|
/** |
||||||
|
* The primary or leftmost mouse button. |
||||||
|
*/ |
||||||
|
public static final Button LEFT = new Button("Left"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the middle mouse button, not present if the mouse has fewer than three buttons. |
||||||
|
*/ |
||||||
|
public static final Button MIDDLE = new Button("Middle"); |
||||||
|
|
||||||
|
/** |
||||||
|
* The secondary or rightmost mouse button, not present if the mouse is a single-button mouse. |
||||||
|
*/ |
||||||
|
public static final Button RIGHT = new Button("Right"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the side mouse button. |
||||||
|
*/ |
||||||
|
public static final Button SIDE = new Button("Side"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Extra, unnamed, buttons |
||||||
|
*/ |
||||||
|
public static final Button EXTRA_1 = new Button("Extra 1"); |
||||||
|
public static final Button EXTRA_2 = new Button("Extra 2"); |
||||||
|
public static final Button EXTRA_3 = new Button("Extra 3"); |
||||||
|
public static final Button EXTRA_4 = new Button("Extra 4"); |
||||||
|
public static final Button EXTRA_5 = new Button("Extra 5"); |
||||||
|
public static final Button EXTRA_6 = new Button("Extra 6"); |
||||||
|
public static final Button EXTRA_7 = new Button("Extra 7"); |
||||||
|
public static final Button EXTRA_8 = new Button("Extra 8"); |
||||||
|
public static final Button EXTRA_9 = new Button("Extra 9"); |
||||||
|
public static final Button EXTRA_10 = new Button("Extra 10"); |
||||||
|
public static final Button EXTRA_11 = new Button("Extra 11"); |
||||||
|
public static final Button EXTRA_12 = new Button("Extra 12"); |
||||||
|
public static final Button EXTRA_13 = new Button("Extra 13"); |
||||||
|
public static final Button EXTRA_14 = new Button("Extra 14"); |
||||||
|
public static final Button EXTRA_15 = new Button("Extra 15"); |
||||||
|
public static final Button EXTRA_16 = new Button("Extra 16"); |
||||||
|
public static final Button EXTRA_17 = new Button("Extra 17"); |
||||||
|
public static final Button EXTRA_18 = new Button("Extra 18"); |
||||||
|
public static final Button EXTRA_19 = new Button("Extra 19"); |
||||||
|
public static final Button EXTRA_20 = new Button("Extra 20"); |
||||||
|
public static final Button EXTRA_21 = new Button("Extra 21"); |
||||||
|
public static final Button EXTRA_22 = new Button("Extra 22"); |
||||||
|
public static final Button EXTRA_23 = new Button("Extra 23"); |
||||||
|
public static final Button EXTRA_24 = new Button("Extra 24"); |
||||||
|
public static final Button EXTRA_25 = new Button("Extra 25"); |
||||||
|
public static final Button EXTRA_26 = new Button("Extra 26"); |
||||||
|
public static final Button EXTRA_27 = new Button("Extra 27"); |
||||||
|
public static final Button EXTRA_28 = new Button("Extra 28"); |
||||||
|
public static final Button EXTRA_29 = new Button("Extra 29"); |
||||||
|
public static final Button EXTRA_30 = new Button("Extra 30"); |
||||||
|
public static final Button EXTRA_31 = new Button("Extra 31"); |
||||||
|
public static final Button EXTRA_32 = new Button("Extra 32"); |
||||||
|
public static final Button EXTRA_33 = new Button("Extra 33"); |
||||||
|
public static final Button EXTRA_34 = new Button("Extra 34"); |
||||||
|
public static final Button EXTRA_35 = new Button("Extra 35"); |
||||||
|
public static final Button EXTRA_36 = new Button("Extra 36"); |
||||||
|
public static final Button EXTRA_37 = new Button("Extra 37"); |
||||||
|
public static final Button EXTRA_38 = new Button("Extra 38"); |
||||||
|
public static final Button EXTRA_39 = new Button("Extra 39"); |
||||||
|
public static final Button EXTRA_40 = new Button("Extra 40"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* KeyIDs for standard PC (LATIN-1) keyboards |
||||||
|
*/ |
||||||
|
public static class Key extends Identifier { |
||||||
|
/** |
||||||
|
* Protected constructor |
||||||
|
*/ |
||||||
|
protected Key(String name) { |
||||||
|
super(name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Standard keyboard (LATIN-1) keys |
||||||
|
* UNIX X11 keysym values are listed to the right |
||||||
|
*/ |
||||||
|
public static final Key VOID = new Key("Void"); // MS 0x00 UNIX 0xFFFFFF
|
||||||
|
public static final Key ESCAPE = new Key("Escape"); // MS 0x01 UNIX 0xFF1B
|
||||||
|
public static final Key _1 = new Key("1"); // MS 0x02 UNIX 0x031 EXCLAM 0x021
|
||||||
|
public static final Key _2 = new Key("2"); // MS 0x03 UNIX 0x032 AT 0x040
|
||||||
|
public static final Key _3 = new Key("3"); // MS 0x04 UNIX 0x033 NUMBERSIGN 0x023
|
||||||
|
public static final Key _4 = new Key("4"); // MS 0x05 UNIX 0x034 DOLLAR 0x024
|
||||||
|
public static final Key _5 = new Key("5"); // MS 0x06 UNIX 0x035 PERCENT 0x025
|
||||||
|
public static final Key _6 = new Key("6"); // MS 0x07 UNIX 0x036 CIRCUMFLEX 0x05e
|
||||||
|
public static final Key _7 = new Key("7"); // MS 0x08 UNIX 0x037 AMPERSAND 0x026
|
||||||
|
public static final Key _8 = new Key("8"); // MS 0x09 UNIX 0x038 ASTERISK 0x02a
|
||||||
|
public static final Key _9 = new Key("9"); // MS 0x0A UNIX 0x039 PARENLEFT 0x028
|
||||||
|
public static final Key _0 = new Key("0"); // MS 0x0B UNIX 0x030 PARENRIGHT 0x029
|
||||||
|
public static final Key MINUS = new Key("-"); // MS 0x0C UNIX 0x02d UNDERSCORE 0x05f
|
||||||
|
public static final Key EQUALS = new Key("="); // MS 0x0D UNIX 0x03d PLUS 0x02b
|
||||||
|
public static final Key BACK = new Key("Back"); // MS 0x0E UNIX 0xFF08
|
||||||
|
public static final Key TAB = new Key("Tab"); // MS 0x0F UNIX 0xFF09
|
||||||
|
public static final Key Q = new Key("Q"); // MS 0x10 UNIX 0x071 UPPER 0x051
|
||||||
|
public static final Key W = new Key("W"); // MS 0x11 UNIX 0x077 UPPER 0x057
|
||||||
|
public static final Key E = new Key("E"); // MS 0x12 UNIX 0x065 UPPER 0x045
|
||||||
|
public static final Key R = new Key("R"); // MS 0x13 UNIX 0x072 UPPER 0x052
|
||||||
|
public static final Key T = new Key("T"); // MS 0x14 UNIX 0x074 UPPER 0x054
|
||||||
|
public static final Key Y = new Key("Y"); // MS 0x15 UNIX 0x079 UPPER 0x059
|
||||||
|
public static final Key U = new Key("U"); // MS 0x16 UNIX 0x075 UPPER 0x055
|
||||||
|
public static final Key I = new Key("I"); // MS 0x17 UNIX 0x069 UPPER 0x049
|
||||||
|
public static final Key O = new Key("O"); // MS 0x18 UNIX 0x06F UPPER 0x04F
|
||||||
|
public static final Key P = new Key("P"); // MS 0x19 UNIX 0x070 UPPER 0x050
|
||||||
|
public static final Key LBRACKET = new Key("["); // MS 0x1A UNIX 0x05b BRACE 0x07b
|
||||||
|
public static final Key RBRACKET = new Key("]"); // MS 0x1B UNIX 0x05d BRACE 0x07d
|
||||||
|
public static final Key RETURN = new Key("Return"); // MS 0x1C UNIX 0xFF0D
|
||||||
|
public static final Key LCONTROL = new Key("Left Control"); // MS 0x1D UNIX 0xFFE3
|
||||||
|
public static final Key A = new Key("A"); // MS 0x1E UNIX 0x061 UPPER 0x041
|
||||||
|
public static final Key S = new Key("S"); // MS 0x1F UNIX 0x073 UPPER 0x053
|
||||||
|
public static final Key D = new Key("D"); // MS 0x20 UNIX 0x064 UPPER 0x044
|
||||||
|
public static final Key F = new Key("F"); // MS 0x21 UNIX 0x066 UPPER 0x046
|
||||||
|
public static final Key G = new Key("G"); // MS 0x22 UNIX 0x067 UPPER 0x047
|
||||||
|
public static final Key H = new Key("H"); // MS 0x23 UNIX 0x068 UPPER 0x048
|
||||||
|
public static final Key J = new Key("J"); // MS 0x24 UNIX 0x06A UPPER 0x04A
|
||||||
|
public static final Key K = new Key("K"); // MS 0x25 UNIX 0x06B UPPER 0x04B
|
||||||
|
public static final Key L = new Key("L"); // MS 0x26 UNIX 0x06C UPPER 0x04C
|
||||||
|
public static final Key SEMICOLON = new Key(";"); // MS 0x27 UNIX 0x03b COLON 0x03a
|
||||||
|
public static final Key APOSTROPHE = new Key("'"); // MS 0x28 UNIX 0x027 QUOTEDBL 0x022
|
||||||
|
public static final Key GRAVE = new Key("~"); // MS 0x29 UNIX 0x060 TILDE 0x07e
|
||||||
|
public static final Key LSHIFT = new Key("Left Shift"); // MS 0x2A UNIX 0xFFE1
|
||||||
|
public static final Key BACKSLASH = new Key("\\"); // MS 0x2B UNIX 0x05c BAR 0x07c
|
||||||
|
public static final Key Z = new Key("Z"); // MS 0x2C UNIX 0x07A UPPER 0x05A
|
||||||
|
public static final Key X = new Key("X"); // MS 0x2D UNIX 0x078 UPPER 0x058
|
||||||
|
public static final Key C = new Key("C"); // MS 0x2E UNIX 0x063 UPPER 0x043
|
||||||
|
public static final Key V = new Key("V"); // MS 0x2F UNIX 0x076 UPPER 0x056
|
||||||
|
public static final Key B = new Key("B"); // MS 0x30 UNIX 0x062 UPPER 0x042
|
||||||
|
public static final Key N = new Key("N"); // MS 0x31 UNIX 0x06E UPPER 0x04E
|
||||||
|
public static final Key M = new Key("M"); // MS 0x32 UNIX 0x06D UPPER 0x04D
|
||||||
|
public static final Key COMMA = new Key(","); // MS 0x33 UNIX 0x02c LESS 0x03c
|
||||||
|
public static final Key PERIOD = new Key("."); // MS 0x34 UNIX 0x02e GREATER 0x03e
|
||||||
|
public static final Key SLASH = new Key("/"); // MS 0x35 UNIX 0x02f QUESTION 0x03f
|
||||||
|
public static final Key RSHIFT = new Key("Right Shift"); // MS 0x36 UNIX 0xFFE2
|
||||||
|
public static final Key MULTIPLY = new Key("Multiply"); // MS 0x37 UNIX 0xFFAA
|
||||||
|
public static final Key LALT = new Key("Left Alt"); // MS 0x38 UNIX 0xFFE9
|
||||||
|
public static final Key SPACE = new Key(" "); // MS 0x39 UNIX 0x020
|
||||||
|
public static final Key CAPITAL = new Key("Caps Lock"); // MS 0x3A UNIX 0xFFE5 SHIFTLOCK 0xFFE6
|
||||||
|
public static final Key F1 = new Key("F1"); // MS 0x3B UNIX 0xFFBE
|
||||||
|
public static final Key F2 = new Key("F2"); // MS 0x3C UNIX 0xFFBF
|
||||||
|
public static final Key F3 = new Key("F3"); // MS 0x3D UNIX 0xFFC0
|
||||||
|
public static final Key F4 = new Key("F4"); // MS 0x3E UNIX 0xFFC1
|
||||||
|
public static final Key F5 = new Key("F5"); // MS 0x3F UNIX 0xFFC2
|
||||||
|
public static final Key F6 = new Key("F6"); // MS 0x40 UNIX 0xFFC3
|
||||||
|
public static final Key F7 = new Key("F7"); // MS 0x41 UNIX 0xFFC4
|
||||||
|
public static final Key F8 = new Key("F8"); // MS 0x42 UNIX 0xFFC5
|
||||||
|
public static final Key F9 = new Key("F9"); // MS 0x43 UNIX 0xFFC6
|
||||||
|
public static final Key F10 = new Key("F10"); // MS 0x44 UNIX 0xFFC7
|
||||||
|
public static final Key NUMLOCK = new Key("Num Lock"); // MS 0x45 UNIX 0xFF7F
|
||||||
|
public static final Key SCROLL = new Key("Scroll Lock"); // MS 0x46 UNIX 0xFF14
|
||||||
|
public static final Key NUMPAD7 = new Key("Num 7"); // MS 0x47 UNIX 0xFFB7 HOME 0xFF95
|
||||||
|
public static final Key NUMPAD8 = new Key("Num 8"); // MS 0x48 UNIX 0xFFB8 UP 0xFF97
|
||||||
|
public static final Key NUMPAD9 = new Key("Num 9"); // MS 0x49 UNIX 0xFFB9 PRIOR 0xFF9A
|
||||||
|
public static final Key SUBTRACT = new Key("Num -"); // MS 0x4A UNIX 0xFFAD
|
||||||
|
public static final Key NUMPAD4 = new Key("Num 4"); // MS 0x4B UNIX 0xFFB4 LEFT 0xFF96
|
||||||
|
public static final Key NUMPAD5 = new Key("Num 5"); // MS 0x4C UNIX 0xFFB5
|
||||||
|
public static final Key NUMPAD6 = new Key("Num 6"); // MS 0x4D UNIX 0xFFB6 RIGHT 0xFF98
|
||||||
|
public static final Key ADD = new Key("Num +"); // MS 0x4E UNIX 0xFFAB
|
||||||
|
public static final Key NUMPAD1 = new Key("Num 1"); // MS 0x4F UNIX 0xFFB1 END 0xFF9C
|
||||||
|
public static final Key NUMPAD2 = new Key("Num 2"); // MS 0x50 UNIX 0xFFB2 DOWN 0xFF99
|
||||||
|
public static final Key NUMPAD3 = new Key("Num 3"); // MS 0x51 UNIX 0xFFB3 NEXT 0xFF9B
|
||||||
|
public static final Key NUMPAD0 = new Key("Num 0"); // MS 0x52 UNIX 0xFFB0 INSERT 0xFF9E
|
||||||
|
public static final Key DECIMAL = new Key("Num ."); // MS 0x53 UNIX 0xFFAE DELETE 0xFF9F
|
||||||
|
public static final Key F11 = new Key("F11"); // MS 0x57 UNIX 0xFFC8
|
||||||
|
public static final Key F12 = new Key("F12"); // MS 0x58 UNIX 0xFFC9
|
||||||
|
public static final Key F13 = new Key("F13"); // MS 0x64 UNIX 0xFFCA
|
||||||
|
public static final Key F14 = new Key("F14"); // MS 0x65 UNIX 0xFFCB
|
||||||
|
public static final Key F15 = new Key("F15"); // MS 0x66 UNIX 0xFFCC
|
||||||
|
public static final Key KANA = new Key("Kana"); // MS 0x70 UNIX 0xFF2D
|
||||||
|
public static final Key CONVERT = new Key("Convert"); // MS 0x79 Japanese keyboard
|
||||||
|
public static final Key NOCONVERT = new Key("Noconvert"); // MS 0x7B Japanese keyboard
|
||||||
|
public static final Key YEN = new Key("Yen"); // MS 0x7D UNIX 0x0a5
|
||||||
|
public static final Key NUMPADEQUAL = new Key("Num ="); // MS 0x8D UNIX 0xFFBD
|
||||||
|
public static final Key CIRCUMFLEX = new Key("Circumflex"); // MS 0x90 Japanese keyboard
|
||||||
|
public static final Key AT = new Key("At"); // MS 0x91 UNIX 0x040
|
||||||
|
public static final Key COLON = new Key("Colon"); // MS 0x92 UNIX 0x03a
|
||||||
|
public static final Key UNDERLINE = new Key("Underline"); // MS 0x93 NEC PC98
|
||||||
|
public static final Key KANJI = new Key("Kanji"); // MS 0x94 UNIX 0xFF21
|
||||||
|
public static final Key STOP = new Key("Stop"); // MS 0x95 UNIX 0xFF69
|
||||||
|
public static final Key AX = new Key("Ax"); // MS 0x96 Japan AX
|
||||||
|
public static final Key UNLABELED = new Key("Unlabeled"); // MS 0x97 J3100
|
||||||
|
public static final Key NUMPADENTER = new Key("Num Enter"); // MS 0x9C UNIX 0xFF8D
|
||||||
|
public static final Key RCONTROL = new Key("Right Control"); // MS 0x9D UNIX 0xFFE4
|
||||||
|
public static final Key NUMPADCOMMA = new Key("Num ,"); // MS 0xB3 UNIX 0xFFAC
|
||||||
|
public static final Key DIVIDE = new Key("Num /"); // MS 0xB5 UNIX 0xFFAF
|
||||||
|
public static final Key SYSRQ = new Key("SysRq"); // MS 0xB7 UNIX 0xFF15 PRINT 0xFF61
|
||||||
|
public static final Key RALT = new Key("Right Alt"); // MS 0xB8 UNIX 0xFFEA
|
||||||
|
public static final Key PAUSE = new Key("Pause"); // MS 0xC5 UNIX 0xFF13 BREAK 0xFF6B
|
||||||
|
public static final Key HOME = new Key("Home"); // MS 0xC7 UNIX 0xFF50
|
||||||
|
public static final Key UP = new Key("Up"); // MS 0xC8 UNIX 0xFF52
|
||||||
|
public static final Key PAGEUP = new Key("Pg Up"); // MS 0xC9 UNIX 0xFF55
|
||||||
|
public static final Key LEFT = new Key("Left"); // MS 0xCB UNIX 0xFF51
|
||||||
|
public static final Key RIGHT = new Key("Right"); // MS 0xCD UNIX 0xFF53
|
||||||
|
public static final Key END = new Key("End"); // MS 0xCF UNIX 0xFF57
|
||||||
|
public static final Key DOWN = new Key("Down"); // MS 0xD0 UNIX 0xFF54
|
||||||
|
public static final Key PAGEDOWN = new Key("Pg Down"); // MS 0xD1 UNIX 0xFF56
|
||||||
|
public static final Key INSERT = new Key("Insert"); // MS 0xD2 UNIX 0xFF63
|
||||||
|
public static final Key DELETE = new Key("Delete"); // MS 0xD3 UNIX 0xFFFF
|
||||||
|
public static final Key LWIN = new Key("Left Windows"); // MS 0xDB UNIX META 0xFFE7 SUPER 0xFFEB HYPER 0xFFED
|
||||||
|
public static final Key RWIN = new Key("Right Windows"); // MS 0xDC UNIX META 0xFFE8 SUPER 0xFFEC HYPER 0xFFEE
|
||||||
|
public static final Key APPS = new Key("Apps"); // MS 0xDD UNIX 0xFF67
|
||||||
|
public static final Key POWER = new Key("Power"); // MS 0xDE Sun 0x1005FF76 SHIFT 0x1005FF7D
|
||||||
|
public static final Key SLEEP = new Key("Sleep"); // MS 0xDF No UNIX keysym
|
||||||
|
public static final Key UNKNOWN = new Key("Unknown"); |
||||||
|
} // class StandardKeyboard.KeyID
|
||||||
|
|
||||||
|
} // class Axis.Identifier
|
||||||
|
|
||||||
|
/** |
||||||
|
* POV enum for different positions. |
||||||
|
*/ |
||||||
|
public static class POV { |
||||||
|
/** |
||||||
|
* Standard value for center HAT position |
||||||
|
*/ |
||||||
|
public static final float OFF = 0.0f; |
||||||
|
/** |
||||||
|
* Synonmous with OFF |
||||||
|
*/ |
||||||
|
public static final float CENTER = OFF; |
||||||
|
/** |
||||||
|
* Standard value for up-left HAT position |
||||||
|
*/ |
||||||
|
public static final float UP_LEFT = 0.125f; |
||||||
|
/** |
||||||
|
* Standard value for up HAT position |
||||||
|
*/ |
||||||
|
public static final float UP = 0.25f; |
||||||
|
/** |
||||||
|
* Standard value for up-right HAT position |
||||||
|
*/ |
||||||
|
public static final float UP_RIGHT = 0.375f; |
||||||
|
/** |
||||||
|
* Standard value for right HAT position |
||||||
|
*/ |
||||||
|
public static final float RIGHT = 0.50f; |
||||||
|
/** |
||||||
|
* Standard value for down-right HAT position |
||||||
|
*/ |
||||||
|
public static final float DOWN_RIGHT = 0.625f; |
||||||
|
/** |
||||||
|
* Standard value for down HAT position |
||||||
|
*/ |
||||||
|
public static final float DOWN = 0.75f; |
||||||
|
/** |
||||||
|
* Standard value for down-left HAT position |
||||||
|
*/ |
||||||
|
public static final float DOWN_LEFT = 0.875f; |
||||||
|
/** |
||||||
|
* Standard value for left HAT position |
||||||
|
*/ |
||||||
|
public static final float LEFT = 1.0f; |
||||||
|
} // class Axis.POV
|
||||||
|
} // interface Axis
|
@ -0,0 +1,263 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* A Controller represents a physical device, such as a keyboard, mouse, |
||||||
|
* or joystick, or a logical grouping of related controls, such as a button |
||||||
|
* pad or mouse ball. A controller can be composed of multiple controllers. |
||||||
|
* For example, the ball of a mouse and its buttons are two separate |
||||||
|
* controllers. |
||||||
|
*/ |
||||||
|
public interface Controller { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the controllers connected to make up this controller, or |
||||||
|
* an empty array if this controller contains no child controllers. |
||||||
|
* The objects in the array are returned in order of assignment priority |
||||||
|
* (primary stick, secondary buttons, etc.). |
||||||
|
*/ |
||||||
|
public abstract Controller[] getControllers(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the type of the Controller. |
||||||
|
*/ |
||||||
|
public abstract Type getType(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the components on this controller, in order of assignment priority. |
||||||
|
* For example, the button controller on a mouse returns an array containing |
||||||
|
* the primary or leftmost mouse button, followed by the secondary or |
||||||
|
* rightmost mouse button (if present), followed by the middle mouse button |
||||||
|
* (if present). |
||||||
|
* The array returned is an empty array if this controller contains no components |
||||||
|
* (such as a logical grouping of child controllers). |
||||||
|
*/ |
||||||
|
public abstract Component[] getComponents(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a single axis based on its type, or null |
||||||
|
* if no axis with the specified type could be found. |
||||||
|
*/ |
||||||
|
public abstract Component getComponent(Component.Identifier id); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the rumblers for sending feedback to this controller, or an |
||||||
|
* empty array if there are no rumblers on this controller. |
||||||
|
*/ |
||||||
|
public abstract Rumbler[] getRumblers(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Polls axes for data. Returns false if the controller is no longer valid. |
||||||
|
* Polling reflects the current state of the device when polled. |
||||||
|
*/ |
||||||
|
public abstract boolean poll(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Initialized the controller event queue to a new size. Existing events |
||||||
|
* in the queue are lost. |
||||||
|
*/ |
||||||
|
public abstract void setEventQueueSize(int size); |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the device event queue |
||||||
|
*/ |
||||||
|
public abstract EventQueue getEventQueue(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the port type for this Controller. |
||||||
|
*/ |
||||||
|
public abstract PortType getPortType(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the zero-based port number for this Controller. |
||||||
|
*/ |
||||||
|
public abstract int getPortNumber(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a human-readable name for this Controller. |
||||||
|
*/ |
||||||
|
public abstract String getName(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Types of controller objects. |
||||||
|
*/ |
||||||
|
public static class Type { |
||||||
|
|
||||||
|
/** |
||||||
|
* Name of controller type |
||||||
|
*/ |
||||||
|
private final String name; |
||||||
|
|
||||||
|
/** |
||||||
|
* Protected constructor |
||||||
|
*/ |
||||||
|
protected Type(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a non-localized string description of this controller type. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unkown controller type. |
||||||
|
*/ |
||||||
|
public static final Type UNKNOWN = new Type("Unknown"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Mouse controller. |
||||||
|
*/ |
||||||
|
public static final Type MOUSE = new Type("Mouse"); |
||||||
|
|
||||||
|
/** |
||||||
|
* A keyboard controller |
||||||
|
*/ |
||||||
|
public static final Type KEYBOARD = new Type("Keyboard"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Fingerstick controller; note that this may be sometimes treated as a |
||||||
|
* type of mouse or stick. |
||||||
|
*/ |
||||||
|
public static final Type FINGERSTICK = new Type("Fingerstick"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Gamepad controller. |
||||||
|
*/ |
||||||
|
public static final Type GAMEPAD = new Type("Gamepad"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Headtracker controller. |
||||||
|
*/ |
||||||
|
public static final Type HEADTRACKER = new Type("Headtracker"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Rudder controller. |
||||||
|
*/ |
||||||
|
public static final Type RUDDER = new Type("Rudder"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Stick controller, such as a joystick or flightstick. |
||||||
|
*/ |
||||||
|
public static final Type STICK = new Type("Stick"); |
||||||
|
|
||||||
|
/** |
||||||
|
* A trackball controller; note that this may sometimes be treated as a |
||||||
|
* type of mouse. |
||||||
|
*/ |
||||||
|
public static final Type TRACKBALL = new Type("Trackball"); |
||||||
|
|
||||||
|
/** |
||||||
|
* A trackpad, such as a tablet, touchpad, or glidepad; |
||||||
|
* note that this may sometimes be treated as a type of mouse. |
||||||
|
*/ |
||||||
|
public static final Type TRACKPAD = new Type("Trackpad"); |
||||||
|
|
||||||
|
/** |
||||||
|
* A wheel controller, such as a steering wheel (note |
||||||
|
* that a mouse wheel is considered part of a mouse, not a |
||||||
|
* wheel controller). |
||||||
|
*/ |
||||||
|
public static final Type WHEEL = new Type("Wheel"); |
||||||
|
} // class Controller.Type
|
||||||
|
|
||||||
|
/** |
||||||
|
* Common controller port types. |
||||||
|
*/ |
||||||
|
public static final class PortType { |
||||||
|
|
||||||
|
/** |
||||||
|
* Name of port type |
||||||
|
*/ |
||||||
|
private final String name; |
||||||
|
|
||||||
|
/** |
||||||
|
* Protected constructor |
||||||
|
*/ |
||||||
|
protected PortType(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a non-localized string description of this port type. |
||||||
|
*/ |
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Unknown port type |
||||||
|
*/ |
||||||
|
public static final PortType UNKNOWN = new PortType("Unknown"); |
||||||
|
|
||||||
|
/** |
||||||
|
* USB port |
||||||
|
*/ |
||||||
|
public static final PortType USB = new PortType("USB port"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Standard game port |
||||||
|
*/ |
||||||
|
public static final PortType GAME = new PortType("Game port"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Network port |
||||||
|
*/ |
||||||
|
public static final PortType NETWORK = new PortType("Network port"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Serial port |
||||||
|
*/ |
||||||
|
public static final PortType SERIAL = new PortType("Serial port"); |
||||||
|
|
||||||
|
/** |
||||||
|
* i8042 |
||||||
|
*/ |
||||||
|
public static final PortType I8042 = new PortType("i8042 (PS/2)"); |
||||||
|
|
||||||
|
/** |
||||||
|
* Parallel port |
||||||
|
*/ |
||||||
|
public static final PortType PARALLEL = new PortType("Parallel port"); |
||||||
|
|
||||||
|
} // class Controller.PortType
|
||||||
|
} // interface Controller
|
@ -0,0 +1,161 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.security.AccessController; |
||||||
|
import java.security.PrivilegedAction; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
/** |
||||||
|
* A ControllerEnvironment represents a collection of controllers that are |
||||||
|
* physically or logically linked. By default, this corresponds to the |
||||||
|
* environment for the local machine. |
||||||
|
* <p> |
||||||
|
* In this reference implementation, this class can also be used to register |
||||||
|
* controllers with the default environment as "plug-ins". A plug-in is |
||||||
|
* created by subclassing ControllerEnvironment with a class that has a public |
||||||
|
* no-argument constructor, implements the net.java.games.util.plugins.Plugin |
||||||
|
* interface and has a name ending in "Plugin". |
||||||
|
* (See net.java.games.input.DirectInputEnvironmentPlugin in the DXplugin |
||||||
|
* part of the source tree for an example.) |
||||||
|
* |
||||||
|
* When the DefaultControllerEnvrionment is instanced it uses the plugin library |
||||||
|
* to look for Plugins in both [java.home]/lib/controller and |
||||||
|
* [user.dir]/controller. This allows controller plugins to be installed either |
||||||
|
* globally for the entire Java environment or locally for just one particular |
||||||
|
* Java app. |
||||||
|
* |
||||||
|
* For more information on the organization of plugins within the controller |
||||||
|
* root directories, see net.java.games.util.plugins.Plugins (Note the |
||||||
|
* plural -- "Plugins" not "Plugin" which is just a marker interface.) |
||||||
|
* |
||||||
|
*/ |
||||||
|
public abstract class ControllerEnvironment { |
||||||
|
|
||||||
|
static void log(String msg) { |
||||||
|
Logger.getLogger(ControllerEnvironment.class.getName()).info(msg); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The default controller environment |
||||||
|
*/ |
||||||
|
private static ControllerEnvironment defaultEnvironment = |
||||||
|
new DefaultControllerEnvironment(); |
||||||
|
|
||||||
|
/** |
||||||
|
* List of controller listeners |
||||||
|
*/ |
||||||
|
protected final ArrayList<ControllerListener> controllerListeners = new ArrayList<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Protected constructor for subclassing. |
||||||
|
*/ |
||||||
|
protected ControllerEnvironment() { |
||||||
|
if(System.getProperty("jinput.loglevel") != null) { |
||||||
|
String loggerName = ControllerEnvironment.class.getPackage().getName(); |
||||||
|
Level level = Level.parse(System.getProperty("jinput.loglevel")); |
||||||
|
Logger.getLogger(loggerName).setLevel(level); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a list of all controllers available to this environment, |
||||||
|
* or an empty array if there are no controllers in this environment. |
||||||
|
*/ |
||||||
|
public abstract Controller[] getControllers(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Adds a listener for controller state change events. |
||||||
|
*/ |
||||||
|
public void addControllerListener(ControllerListener l) { |
||||||
|
assert l != null; |
||||||
|
controllerListeners.add(l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the isSupported status of this environment. |
||||||
|
* What makes an environment supported or not is up to the |
||||||
|
* particular plugin, but may include OS or available hardware. |
||||||
|
*/ |
||||||
|
public abstract boolean isSupported(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Removes a listener for controller state change events. |
||||||
|
*/ |
||||||
|
public void removeControllerListener(ControllerListener l) { |
||||||
|
assert l != null; |
||||||
|
controllerListeners.remove(l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates and sends an event to the controller listeners that a controller |
||||||
|
* has been added. |
||||||
|
*/ |
||||||
|
protected void fireControllerAdded(Controller c) { |
||||||
|
ControllerEvent ev = new ControllerEvent(c); |
||||||
|
Iterator<ControllerListener> it = controllerListeners.iterator(); |
||||||
|
while (it.hasNext()) { |
||||||
|
it.next().controllerAdded(ev); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates and sends an event to the controller listeners that a controller |
||||||
|
* has been lost. |
||||||
|
*/ |
||||||
|
protected void fireControllerRemoved(Controller c) { |
||||||
|
ControllerEvent ev = new ControllerEvent(c); |
||||||
|
Iterator<ControllerListener> it = controllerListeners.iterator(); |
||||||
|
while (it.hasNext()) { |
||||||
|
it.next().controllerRemoved(ev); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the default environment for input controllers. |
||||||
|
* This usually corresponds to the environment for the local machine. |
||||||
|
*/ |
||||||
|
public static ControllerEnvironment getDefaultEnvironment() { |
||||||
|
return defaultEnvironment; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* An event that is fired when the state of a controller changes |
||||||
|
*/ |
||||||
|
public class ControllerEvent { |
||||||
|
|
||||||
|
private Controller controller; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a controller event object. |
||||||
|
*/ |
||||||
|
public ControllerEvent(Controller c) { |
||||||
|
controller = c; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the controller for this event. |
||||||
|
*/ |
||||||
|
public Controller getController() { |
||||||
|
return controller; |
||||||
|
} |
||||||
|
} // class ControllerEvent
|
@ -0,0 +1,55 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* A listener for changes in the state of controllers |
||||||
|
*/ |
||||||
|
public interface ControllerListener { |
||||||
|
|
||||||
|
/** |
||||||
|
* Invoked when a controller is lost. |
||||||
|
*/ |
||||||
|
public abstract void controllerRemoved(ControllerEvent ev); |
||||||
|
|
||||||
|
/** |
||||||
|
* Invoked when a controller has been added. |
||||||
|
*/ |
||||||
|
public abstract void controllerAdded(ControllerEvent ev); |
||||||
|
} // interface ControllerListener
|
@ -0,0 +1,214 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import net.java.games.util.plugins.Plugins; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.security.AccessController; |
||||||
|
import java.security.PrivilegedAction; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Collection; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.StringTokenizer; |
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
/** |
||||||
|
* The default controller environment. |
||||||
|
* |
||||||
|
* @version %I% %G% |
||||||
|
* @author Michael Martak |
||||||
|
*/ |
||||||
|
class DefaultControllerEnvironment extends ControllerEnvironment { |
||||||
|
static String libPath; |
||||||
|
private static Logger log = Logger.getLogger(DefaultControllerEnvironment.class.getName()); |
||||||
|
|
||||||
|
/** |
||||||
|
* Static utility method for loading native libraries. |
||||||
|
* It will try to load from either the path given by |
||||||
|
* the net.java.games.input.librarypath property |
||||||
|
* or through System.loadLibrary(). |
||||||
|
* |
||||||
|
*/ |
||||||
|
static void loadLibrary(final String lib_name) { |
||||||
|
AccessController.doPrivileged((PrivilegedAction<String>) () -> { |
||||||
|
String lib_path = System.getProperty("net.java.games.input.librarypath"); |
||||||
|
if (lib_path != null) { |
||||||
|
System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); |
||||||
|
} else { |
||||||
|
System.loadLibrary(lib_name); |
||||||
|
} |
||||||
|
return null; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static String getPrivilegedProperty(final String property) { |
||||||
|
return AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty(property)); |
||||||
|
} |
||||||
|
|
||||||
|
static String getPrivilegedProperty(final String property, final String default_value) { |
||||||
|
return AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty(property, default_value)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* List of all controllers in this environment |
||||||
|
*/ |
||||||
|
private ArrayList<Controller> controllers; |
||||||
|
|
||||||
|
private Collection<String> loadedPluginNames = new ArrayList<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Public no-arg constructor. |
||||||
|
*/ |
||||||
|
public DefaultControllerEnvironment() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a list of all controllers available to this environment, |
||||||
|
* or an empty array if there are no controllers in this environment. |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Controller[] getControllers() { |
||||||
|
if (controllers == null) { |
||||||
|
// Controller list has not been scanned.
|
||||||
|
controllers = new ArrayList<>(); |
||||||
|
AccessController.doPrivileged((PrivilegedAction<Void>) () -> scanControllers()); |
||||||
|
//Check the properties for specified controller classes
|
||||||
|
String pluginClasses = getPrivilegedProperty("jinput.plugins", "") + " " + getPrivilegedProperty("net.java.games.input.plugins", ""); |
||||||
|
if (!getPrivilegedProperty("jinput.useDefaultPlugin", "true").toLowerCase().trim().equals("false") && !getPrivilegedProperty("net.java.games.input.useDefaultPlugin", "true").toLowerCase().trim().equals("false")) { |
||||||
|
String osName = getPrivilegedProperty("os.name", "").trim(); |
||||||
|
if (osName.equals("Linux")) { |
||||||
|
pluginClasses = pluginClasses + " net.java.games.input.LinuxEnvironmentPlugin"; |
||||||
|
} else if (osName.equals("Mac OS X")) { |
||||||
|
pluginClasses = pluginClasses + " net.java.games.input.OSXEnvironmentPlugin"; |
||||||
|
} else if (osName.equals("Windows XP") || osName.equals("Windows Vista") || osName.equals("Windows 7") || osName.equals("Windows 8") || osName.equals("Windows 8.1") || osName.equals("Windows 10")) { |
||||||
|
pluginClasses = pluginClasses + " net.java.games.input.DirectAndRawInputEnvironmentPlugin"; |
||||||
|
} else if (osName.equals("Windows 98") || osName.equals("Windows 2000")) { |
||||||
|
pluginClasses = pluginClasses + " net.java.games.input.DirectInputEnvironmentPlugin"; |
||||||
|
} else if (osName.startsWith("Windows")) { |
||||||
|
log.warning("Found unknown Windows version: " + osName); |
||||||
|
log.warning("Attempting to use default windows plug-in."); |
||||||
|
pluginClasses = pluginClasses + " net.java.games.input.DirectAndRawInputEnvironmentPlugin"; |
||||||
|
} else { |
||||||
|
log.warning("Trying to use default plugin, OS name " + osName + " not recognised"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
StringTokenizer pluginClassTok = new StringTokenizer(pluginClasses, " \t\n\r\f,;:"); |
||||||
|
while (pluginClassTok.hasMoreTokens()) { |
||||||
|
String className = pluginClassTok.nextToken(); |
||||||
|
try { |
||||||
|
if (!loadedPluginNames.contains(className)) { |
||||||
|
log.fine("Loading: " + className); |
||||||
|
Class<?> ceClass = Class.forName(className); |
||||||
|
ControllerEnvironment ce = (ControllerEnvironment) ceClass.getDeclaredConstructor().newInstance(); |
||||||
|
if (ce.isSupported()) { |
||||||
|
addControllers(ce.getControllers()); |
||||||
|
loadedPluginNames.add(ce.getClass().getName()); |
||||||
|
} else { |
||||||
|
log(ceClass.getName() + " is not supported"); |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (Throwable e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
Controller[] ret = new Controller[controllers.size()]; |
||||||
|
Iterator<Controller> it = controllers.iterator(); |
||||||
|
int i = 0; |
||||||
|
while (it.hasNext()) { |
||||||
|
ret[i] = it.next(); |
||||||
|
i++; |
||||||
|
} |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
/* This is jeff's new plugin code using Jeff's Plugin manager */ |
||||||
|
private Void scanControllers() { |
||||||
|
String pluginPathName = getPrivilegedProperty("jinput.controllerPluginPath"); |
||||||
|
if (pluginPathName == null) { |
||||||
|
pluginPathName = "controller"; |
||||||
|
} |
||||||
|
|
||||||
|
scanControllersAt(getPrivilegedProperty("java.home") |
||||||
|
+ File.separator + "lib" + File.separator + pluginPathName); |
||||||
|
scanControllersAt(getPrivilegedProperty("user.dir") |
||||||
|
+ File.separator + pluginPathName); |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private void scanControllersAt(String path) { |
||||||
|
File file = new File(path); |
||||||
|
if (!file.exists()) { |
||||||
|
return; |
||||||
|
} |
||||||
|
try { |
||||||
|
Plugins plugins = new Plugins(file); |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
Class<ControllerEnvironment>[] envClasses = plugins.getExtends(ControllerEnvironment.class); |
||||||
|
for (int i = 0; i < envClasses.length; i++) { |
||||||
|
try { |
||||||
|
ControllerEnvironment.log("ControllerEnvironment " |
||||||
|
+ envClasses[i].getName() |
||||||
|
+ " loaded by " + envClasses[i].getClassLoader()); |
||||||
|
ControllerEnvironment ce = envClasses[i].getDeclaredConstructor().newInstance(); |
||||||
|
if (ce.isSupported()) { |
||||||
|
addControllers(ce.getControllers()); |
||||||
|
loadedPluginNames.add(ce.getClass().getName()); |
||||||
|
} else { |
||||||
|
log(envClasses[i].getName() + " is not supported"); |
||||||
|
} |
||||||
|
} catch (Throwable e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add the array of controllers to our list of controllers. |
||||||
|
*/ |
||||||
|
private void addControllers(Controller[] c) { |
||||||
|
for (int i = 0; i < c.length; i++) { |
||||||
|
controllers.add(c[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isSupported() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
public final class Event { |
||||||
|
private Component component; |
||||||
|
private float value; |
||||||
|
private long nanos; |
||||||
|
|
||||||
|
public final void set(Event other) { |
||||||
|
this.set(other.getComponent(), other.getValue(), other.getNanos()); |
||||||
|
} |
||||||
|
|
||||||
|
public final void set(Component component, float value, long nanos) { |
||||||
|
this.component = component; |
||||||
|
this.value = value; |
||||||
|
this.nanos = nanos; |
||||||
|
} |
||||||
|
|
||||||
|
public final Component getComponent() { |
||||||
|
return component; |
||||||
|
} |
||||||
|
|
||||||
|
public final float getValue() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the time the event happened, in nanoseconds. |
||||||
|
* The time is relative and therefore can only be used |
||||||
|
* to compare with other event times. |
||||||
|
*/ |
||||||
|
public final long getNanos() { |
||||||
|
return nanos; |
||||||
|
} |
||||||
|
|
||||||
|
public final String toString() { |
||||||
|
return "Event: component = " + component + " | value = " + value; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* A FIFO queue for input events. |
||||||
|
*/ |
||||||
|
public final class EventQueue { |
||||||
|
private final Event[] queue; |
||||||
|
|
||||||
|
private int head; |
||||||
|
private int tail; |
||||||
|
|
||||||
|
/** |
||||||
|
* This is an internal method and should not be called by applications using the API |
||||||
|
*/ |
||||||
|
public EventQueue(int size) { |
||||||
|
queue = new Event[size + 1]; |
||||||
|
for (int i = 0; i < queue.length; i++) |
||||||
|
queue[i] = new Event(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This is an internal method and should not be called by applications using the API |
||||||
|
*/ |
||||||
|
final synchronized void add(Event event) { |
||||||
|
queue[tail].set(event); |
||||||
|
tail = increase(tail); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if the queue is full |
||||||
|
* @return true if the queue is full |
||||||
|
*/ |
||||||
|
final synchronized boolean isFull() { |
||||||
|
return increase(tail) == head; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This is an internal method and should not be called by applications using the API |
||||||
|
*/ |
||||||
|
private final int increase(int x) { |
||||||
|
return (x + 1)%queue.length; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Populates the provided event with the details of the event on the head of the queue. |
||||||
|
* |
||||||
|
* @param event The event to populate |
||||||
|
* @return false if there were no events left on the queue, otherwise true. |
||||||
|
*/ |
||||||
|
public final synchronized boolean getNextEvent(Event event) { |
||||||
|
if (head == tail) |
||||||
|
return false; |
||||||
|
event.set(queue[head]); |
||||||
|
head = increase(head); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* A Keyboard is a type of controller consisting of a single controller, |
||||||
|
* they keypad, which contains several axes (the keys). By default, all keys |
||||||
|
* are set to receive polling data. |
||||||
|
*/ |
||||||
|
public abstract class Keyboard extends AbstractController { |
||||||
|
/** |
||||||
|
* Protected constructor. |
||||||
|
* Subclasses should initialize the array of axes to an array of keys. |
||||||
|
* @param name The name of the keyboard |
||||||
|
*/ |
||||||
|
protected Keyboard(String name, Component[] keys, Controller[] children, Rumbler[] rumblers) { |
||||||
|
super(name, keys, children, rumblers); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the type of the Controller. |
||||||
|
*/ |
||||||
|
public Type getType() { |
||||||
|
return Type.KEYBOARD; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isKeyDown(Component.Identifier.Key key_id) { |
||||||
|
Component key = getComponent(key_id); |
||||||
|
if (key == null) |
||||||
|
return false; |
||||||
|
return key.getPollData() != 0; |
||||||
|
} |
||||||
|
} // class Keyboard
|
@ -0,0 +1,183 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/** *************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
**************************************************************************** */ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* A Mouse is a type of controller consisting of two child controllers, |
||||||
|
* a ball and a button pad. This includes devices such as touch pads, |
||||||
|
* trackballs, and fingersticks. |
||||||
|
*/ |
||||||
|
public abstract class Mouse extends AbstractController { |
||||||
|
protected Mouse(String name, Component[] components, Controller[] children, Rumbler[] rumblers) { |
||||||
|
super(name, components, children, rumblers); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the type of the Controller. |
||||||
|
*/ |
||||||
|
public Type getType() { |
||||||
|
return Type.MOUSE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the x-axis for the mouse ball, never null. |
||||||
|
*/ |
||||||
|
public Component getX() { |
||||||
|
return getComponent(Component.Identifier.Axis.X); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the y-axis for the mouse ball, never null. |
||||||
|
*/ |
||||||
|
public Component getY() { |
||||||
|
return getComponent(Component.Identifier.Axis.Y); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the mouse wheel, or null if no mouse wheel is present. |
||||||
|
*/ |
||||||
|
public Component getWheel() { |
||||||
|
return getComponent(Component.Identifier.Axis.Z); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the left or primary mouse button, never null. |
||||||
|
*/ |
||||||
|
public Component getPrimaryButton() { |
||||||
|
Component primaryButton = getComponent(Component.Identifier.Button.LEFT); |
||||||
|
if (primaryButton == null) { |
||||||
|
primaryButton = getComponent(Component.Identifier.Button._1); |
||||||
|
} |
||||||
|
return primaryButton; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the right or secondary mouse button, null if the mouse is |
||||||
|
* a single-button mouse. |
||||||
|
*/ |
||||||
|
public Component getSecondaryButton() { |
||||||
|
Component secondaryButton = getComponent(Component.Identifier.Button.RIGHT); |
||||||
|
if (secondaryButton == null) { |
||||||
|
secondaryButton = getComponent(Component.Identifier.Button._2); |
||||||
|
} |
||||||
|
return secondaryButton; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the middle or tertiary mouse button, null if the mouse has |
||||||
|
* fewer than three buttons. |
||||||
|
*/ |
||||||
|
public Component getTertiaryButton() { |
||||||
|
Component tertiaryButton = getComponent(Component.Identifier.Button.MIDDLE); |
||||||
|
if (tertiaryButton == null) { |
||||||
|
tertiaryButton = getComponent(Component.Identifier.Button._3); |
||||||
|
} |
||||||
|
return tertiaryButton; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the left mouse button. |
||||||
|
*/ |
||||||
|
public Component getLeft() { |
||||||
|
return getComponent(Component.Identifier.Button.LEFT); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the right, null if the mouse is a single-button mouse. |
||||||
|
*/ |
||||||
|
public Component getRight() { |
||||||
|
return getComponent(Component.Identifier.Button.RIGHT); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the middle, null if the mouse has fewer than three buttons. |
||||||
|
*/ |
||||||
|
public Component getMiddle() { |
||||||
|
return getComponent(Component.Identifier.Button.MIDDLE); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the side or 4th mouse button, null if the mouse has |
||||||
|
* fewer than 4 buttons. |
||||||
|
*/ |
||||||
|
public Component getSide() { |
||||||
|
return getComponent(Component.Identifier.Button.SIDE); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the extra or 5th mouse button, null if the mouse has |
||||||
|
* fewer than 5 buttons. |
||||||
|
*/ |
||||||
|
public Component getExtra() { |
||||||
|
return getComponent(Component.Identifier.Button.EXTRA); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the forward mouse button, null if the mouse hasn't |
||||||
|
* got one. |
||||||
|
*/ |
||||||
|
public Component getForward() { |
||||||
|
return getComponent(Component.Identifier.Button.FORWARD); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the back mouse button, null if the mouse hasn't |
||||||
|
* got one. |
||||||
|
*/ |
||||||
|
public Component getBack() { |
||||||
|
return getComponent(Component.Identifier.Button.BACK); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns forth mouse button, null if the mouse hasn't |
||||||
|
* got one. |
||||||
|
*/ |
||||||
|
public Component getButton3() { |
||||||
|
return getComponent(Component.Identifier.Button._3); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns fifth mouse button, null if the mouse hasn't |
||||||
|
* got one. |
||||||
|
*/ |
||||||
|
public Component getButton4() { |
||||||
|
return getComponent(Component.Identifier.Button._4); |
||||||
|
} |
||||||
|
|
||||||
|
} // class Mouse
|
@ -0,0 +1,169 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileFilter; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.util.StringTokenizer; |
||||||
|
import java.util.jar.JarEntry; |
||||||
|
import java.util.jar.JarFile; |
||||||
|
|
||||||
|
/** |
||||||
|
* Loads all plugins. |
||||||
|
* |
||||||
|
* @version %I% %G% |
||||||
|
* @author Michael Martak |
||||||
|
*/ |
||||||
|
class PluginClassLoader extends ClassLoader { |
||||||
|
|
||||||
|
/** |
||||||
|
* Location of directory to look for plugins |
||||||
|
*/ |
||||||
|
private static String pluginDirectory; |
||||||
|
|
||||||
|
/** |
||||||
|
* File filter for JAR files |
||||||
|
*/ |
||||||
|
private static final FileFilter JAR_FILTER = new JarFileFilter(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new class loader for loading plugins |
||||||
|
*/ |
||||||
|
public PluginClassLoader() { |
||||||
|
super(Thread.currentThread().getContextClassLoader()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Overrides findClass to first look in the parent class loader, |
||||||
|
* then try loading the class from the plugin file system. |
||||||
|
*/ |
||||||
|
protected Class<?> findClass(String name) |
||||||
|
throws ClassNotFoundException { |
||||||
|
// Try loading the class from the file system.
|
||||||
|
byte[] b = loadClassData(name); |
||||||
|
return defineClass(name, b, 0, b.length); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load the class data from the file system |
||||||
|
*/ |
||||||
|
private byte[] loadClassData(String name) |
||||||
|
throws ClassNotFoundException { |
||||||
|
if (pluginDirectory == null) { |
||||||
|
pluginDirectory = DefaultControllerEnvironment.libPath + |
||||||
|
File.separator + "controller"; |
||||||
|
} |
||||||
|
try { |
||||||
|
return loadClassFromDirectory(name); |
||||||
|
} catch (Exception e) { |
||||||
|
try { |
||||||
|
return loadClassFromJAR(name); |
||||||
|
} catch (IOException e2) { |
||||||
|
throw new ClassNotFoundException(name, e2); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Load the class data from the file system based on parsing |
||||||
|
* the class name (packages). |
||||||
|
*/ |
||||||
|
private byte[] loadClassFromDirectory(String name) |
||||||
|
throws ClassNotFoundException, IOException { |
||||||
|
// Parse the class name into package directories.
|
||||||
|
// Look for the class in the plugin directory.
|
||||||
|
StringTokenizer tokenizer = new StringTokenizer(name, "."); |
||||||
|
StringBuffer path = new StringBuffer(pluginDirectory); |
||||||
|
while (tokenizer.hasMoreTokens()) { |
||||||
|
path.append(File.separator); |
||||||
|
path.append(tokenizer.nextToken()); |
||||||
|
} |
||||||
|
path.append(".class"); |
||||||
|
File file = new File(path.toString()); |
||||||
|
if (!file.exists()) { |
||||||
|
throw new ClassNotFoundException(name); |
||||||
|
} |
||||||
|
try(FileInputStream fileInputStream = new FileInputStream(file)) { |
||||||
|
assert file.length() <= Integer.MAX_VALUE; |
||||||
|
int length = (int) file.length(); |
||||||
|
byte[] bytes = new byte[length]; |
||||||
|
int length2 = fileInputStream.read(bytes); |
||||||
|
assert length == length2; |
||||||
|
return bytes; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Scans through the plugin directory for JAR files and |
||||||
|
* attempts to load the class data from each JAR file. |
||||||
|
*/ |
||||||
|
private byte[] loadClassFromJAR(String name) |
||||||
|
throws ClassNotFoundException, IOException { |
||||||
|
File dir = new File(pluginDirectory); |
||||||
|
File[] jarFiles = dir.listFiles(JAR_FILTER); |
||||||
|
if (jarFiles == null) { |
||||||
|
throw new ClassNotFoundException("Could not find class " + name); |
||||||
|
} |
||||||
|
for (int i = 0; i < jarFiles.length; i++) { |
||||||
|
JarFile jarfile = new JarFile(jarFiles[i]); |
||||||
|
JarEntry jarentry = jarfile.getJarEntry(name + ".class"); |
||||||
|
if (jarentry != null) { |
||||||
|
try(InputStream jarInputStream = jarfile.getInputStream(jarentry)) { |
||||||
|
assert jarentry.getSize() <= Integer.MAX_VALUE; |
||||||
|
int length = (int) jarentry.getSize(); |
||||||
|
assert length >= 0; |
||||||
|
byte[] bytes = new byte[length]; |
||||||
|
int length2 = jarInputStream.read(bytes); |
||||||
|
assert length == length2; |
||||||
|
return bytes; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
throw new FileNotFoundException(name); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Filters out all non-JAR files, based on whether or not they |
||||||
|
* end in ".JAR" (case-insensitive). |
||||||
|
*/ |
||||||
|
private static class JarFileFilter implements FileFilter { |
||||||
|
public boolean accept(File file) { |
||||||
|
return file.getName().toUpperCase().endsWith(".JAR"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,67 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* A Rumbler is a controller's mechanism for delivering feedback |
||||||
|
* to the user through the device. |
||||||
|
*/ |
||||||
|
public interface Rumbler { |
||||||
|
|
||||||
|
/** |
||||||
|
* Rumble with the specified intensity. |
||||||
|
*/ |
||||||
|
public abstract void rumble(float intensity); |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the string name of the axis the rumbler is attached to |
||||||
|
* |
||||||
|
* @return The axis name |
||||||
|
*/ |
||||||
|
public String getAxisName(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the axis identifier the rumbler is attached to |
||||||
|
* |
||||||
|
* @return The axis identifier |
||||||
|
*/ |
||||||
|
public Component.Identifier getAxisIdentifier(); |
||||||
|
|
||||||
|
|
||||||
|
} // interface Rumbler
|
@ -0,0 +1,101 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2004 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* -Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* -Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of contributors may |
||||||
|
* be used to endorse or promote products derived from this software without |
||||||
|
* specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS |
||||||
|
* LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A |
||||||
|
* RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. |
||||||
|
* IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT |
||||||
|
* OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR |
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, |
||||||
|
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS |
||||||
|
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for use in the |
||||||
|
* design, construction, operation or maintenance of any nuclear facility. |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.net.URL; |
||||||
|
import java.util.PropertyResourceBundle; |
||||||
|
|
||||||
|
/** |
||||||
|
* The version and build number of this implementation. |
||||||
|
* Version numbers for a release are of the form: w.x.y, where: |
||||||
|
* <ul> |
||||||
|
* <li> |
||||||
|
* w - the major version number of the release. This number should |
||||||
|
* start at 1. Typically, a bump in the major version number |
||||||
|
* signifies that the release breaks backwards compatibility |
||||||
|
* with some older release. |
||||||
|
* </li> |
||||||
|
* <li> |
||||||
|
* x - minor version number. This number starts at 0. A bump in |
||||||
|
* the minor version number signifies a release that has significant |
||||||
|
* new functionality. |
||||||
|
* </li> |
||||||
|
* <li> |
||||||
|
* y - minor-minor version number number. This number starts at 0. A |
||||||
|
* bump in the minor-minor version number signifies that new bug |
||||||
|
* fixes have been added to the build. |
||||||
|
* </li> |
||||||
|
* </ul> |
||||||
|
* |
||||||
|
* For example, the following are all valid version strings: |
||||||
|
* <ul> |
||||||
|
* <li>1.1.2</li> |
||||||
|
* <li>1.3.5-SNAPSHOT</li> |
||||||
|
* <li>4.7.1-M2</li> |
||||||
|
* </ul> |
||||||
|
* |
||||||
|
* @version 2.10 |
||||||
|
*/ |
||||||
|
public final class Version { |
||||||
|
|
||||||
|
/** |
||||||
|
* Private constructor - no need for user to create |
||||||
|
* an instance of this class. |
||||||
|
*/ |
||||||
|
private Version() { |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
String version = getVersion(); |
||||||
|
System.out.println("jinput version " + version); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the verison string and build number of |
||||||
|
* this implementation. See the class descritpion |
||||||
|
* for the version string format. |
||||||
|
* |
||||||
|
* @return The version string of this implementation. |
||||||
|
*/ |
||||||
|
public static String getVersion() { |
||||||
|
URL url = Version.class.getResource("jinput.properties"); |
||||||
|
try { |
||||||
|
PropertyResourceBundle prb = new PropertyResourceBundle(url.openStream()); |
||||||
|
String version = prb.getString("version"); |
||||||
|
return version; |
||||||
|
} catch (IOException ex) { |
||||||
|
return "Unversioned"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,2 @@ |
|||||||
|
version=2.10 |
||||||
|
date=13/05/2021 |
@ -0,0 +1,14 @@ |
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
||||||
|
<html> |
||||||
|
<body> |
||||||
|
|
||||||
|
Top level package for JInput. |
||||||
|
|
||||||
|
<h2>Package Specification</h2> |
||||||
|
|
||||||
|
Use -Djinput.useDefaultPlugin=false (or net.java.games.input.useDefaultPlugin=false) to disable automatic loading of the default plugin for the platform.<BR/> |
||||||
|
Use -Djinput.plugins (or net.java.games.input.plugins) and specifiy a list of class name to over ride the plugins system. This will force the classes passed to be loaded first, then plugins will be searched for in the default manner (./controller/*.jar)<BR/> |
||||||
|
Use -Djinput.controllerPluginPath to change the path the plugins mechanism will use to search for plugin Jars. |
||||||
|
Use -Djinput.loglevel to change the logging level using Java util logging level strings. |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,104 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2004 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* -Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* -Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of contributors may |
||||||
|
* be used to endorse or promote products derived from this software without |
||||||
|
* specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS |
||||||
|
* LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A |
||||||
|
* RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. |
||||||
|
* IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT |
||||||
|
* OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR |
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, |
||||||
|
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS |
||||||
|
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for use in the |
||||||
|
* design, construction, operation or maintenance of any nuclear facility. |
||||||
|
*/ |
||||||
|
|
||||||
|
package net.java.games.util; |
||||||
|
|
||||||
|
/** |
||||||
|
* The version and build number of this implementation. |
||||||
|
* Version numbers for a release are of the form: w.x.y[-a]-z, where: |
||||||
|
* <ul> |
||||||
|
* <li> |
||||||
|
* w - the major version number of the release. This number should |
||||||
|
* start at 1. Typically, a bump in the major version number |
||||||
|
* signifies that the release breaks backwards compatibility |
||||||
|
* with some older release. |
||||||
|
* </li> |
||||||
|
* <li> |
||||||
|
* x - minor version number. This number starts at 0. A bump in |
||||||
|
* the minor version number signifies a release that has significant |
||||||
|
* new functionality. |
||||||
|
* </li> |
||||||
|
* <li> |
||||||
|
* y - minor-minor version number number. This number starts at 0. A |
||||||
|
* bump in the minor-minor version number signifies that new bug |
||||||
|
* fixes have been added to the build. |
||||||
|
* </li> |
||||||
|
* <li> |
||||||
|
* a - an optional build designator followed by a digit. Valid build |
||||||
|
* designators are: |
||||||
|
* <ul> |
||||||
|
* <li>alpha</li> |
||||||
|
* <li>beta</li> |
||||||
|
* </ul> |
||||||
|
* </li> |
||||||
|
* <li> |
||||||
|
* z - build number. This is used to specify the build number of the |
||||||
|
* release. This is usually only important to people that use |
||||||
|
* the daily build of a project. The format is the lower-case |
||||||
|
* letter 'b' followed by a two digit number. |
||||||
|
* </li> |
||||||
|
* </ul> |
||||||
|
* |
||||||
|
* For example, the following are all valid version strings: |
||||||
|
* <ul> |
||||||
|
* <li>1.1.2-b02</li> |
||||||
|
* <li>1.3.5-alpha1-b19</li> |
||||||
|
* <li>4.7.1-beta3-b20</li> |
||||||
|
* </ul> |
||||||
|
* |
||||||
|
*/ |
||||||
|
public final class Version { |
||||||
|
|
||||||
|
/** |
||||||
|
* Private constructor - no need for user to create |
||||||
|
* an instance of this class. |
||||||
|
*/ |
||||||
|
private Version() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Version string of this build. |
||||||
|
*/ |
||||||
|
private static final String version = "1.0.0-b01"; |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the verison string and build number of |
||||||
|
* this implementation. See the class descritpion |
||||||
|
* for the version string format. |
||||||
|
* |
||||||
|
* @return The version string of this implementation. |
||||||
|
*/ |
||||||
|
public static String getVersion() { |
||||||
|
return version; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
||||||
|
<html> |
||||||
|
<body> |
||||||
|
|
||||||
|
Utility package for JInput. See https://github.com/jinput/jutils. |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,60 @@ |
|||||||
|
/* |
||||||
|
* Plugin.java |
||||||
|
* |
||||||
|
* Created on April 18, 2003, 11:29 AM |
||||||
|
*/ |
||||||
|
|
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
package net.java.games.util.plugins; |
||||||
|
|
||||||
|
/** This is a marker interface used to mark plugins in a Jar file |
||||||
|
* for retrieval by the Plugins class. In order for a class to be |
||||||
|
* treated as a Plugin the following must be true: |
||||||
|
* |
||||||
|
* (1) The name of the class must end with "Plugin". |
||||||
|
* (ie MedianCutFilterPlugin, DirectInput EnvrionmentPlugin) |
||||||
|
* |
||||||
|
* (2) The class must implement the Plugin interface. It can do |
||||||
|
* so directly, through inheritence of either a superclass |
||||||
|
* that implements this interface, or through the implementation |
||||||
|
* of an interface that extends this interface. |
||||||
|
* |
||||||
|
* |
||||||
|
* @author Jeffrey P. Kesselman |
||||||
|
* |
||||||
|
*/ |
||||||
|
public interface Plugin { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,169 @@ |
|||||||
|
/* |
||||||
|
* PluginLodaer.java |
||||||
|
* |
||||||
|
* Created on April 18, 2003, 11:32 AM |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.util.plugins; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author jeff |
||||||
|
*/ |
||||||
|
import java.io.*; |
||||||
|
import java.net.*; |
||||||
|
|
||||||
|
/** This class is used internally by the Plugin system. |
||||||
|
* End users of the system are unlikely to need to be aware |
||||||
|
* of it. |
||||||
|
* |
||||||
|
* |
||||||
|
* This is the class loader used to keep the namespaces of |
||||||
|
* different plugins isolated from each other and from the |
||||||
|
* main app code. One plugin loader is created per Jar |
||||||
|
* file in the sub-directory tree of the plugin directory. |
||||||
|
* |
||||||
|
* In addition to isolating java classes this loader also isolates |
||||||
|
* DLLs such that plugins with conflicting DLL names may be |
||||||
|
* used by simply placing the plugin and its associated DLL |
||||||
|
* in a sub-folder of its own. |
||||||
|
* |
||||||
|
* This class also currently implements methods for testing |
||||||
|
* classes for inheritance of superclasses or interfaces. |
||||||
|
* This code is genericly useful and should really be moved |
||||||
|
* to a seperate ClassUtils class. |
||||||
|
* @author Jeffrey Kesselman |
||||||
|
*/ |
||||||
|
public class PluginLoader extends URLClassLoader { |
||||||
|
static final boolean DEBUG = false; |
||||||
|
File parentDir; |
||||||
|
boolean localDLLs = true; |
||||||
|
/** Creates a new instance of PluginLodaer |
||||||
|
* If the system property "net.java.games.util.plugins.nolocalnative" is |
||||||
|
* not set then the laoder will look for requried native libs in the |
||||||
|
* same directory as the plugin jar. (Useful for handling name |
||||||
|
* collision between plugins). If it IS set however, then it will |
||||||
|
* fall back to the default way of loading natives. (Necessary for |
||||||
|
* Java Web Start.) |
||||||
|
* @param jf The JarFile to load the Plugins from. |
||||||
|
* @throws MalformedURLException Will throw this exception if jf does not refer to a |
||||||
|
* legitimate Jar file. |
||||||
|
*/ |
||||||
|
public PluginLoader(File jf) throws MalformedURLException { |
||||||
|
super(new URL[] {jf.toURL()}, |
||||||
|
Thread.currentThread().getContextClassLoader()); |
||||||
|
parentDir = jf.getParentFile(); |
||||||
|
if (System.getProperty("net.java.games.util.plugins.nolocalnative") |
||||||
|
!=null){ |
||||||
|
localDLLs = false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** This method is queried by the System.loadLibrary() |
||||||
|
* code to find the actual native name and path to the |
||||||
|
* native library to load. |
||||||
|
* |
||||||
|
* This subclass implementation of this method ensures that |
||||||
|
* the native library will be loaded from, and only from, |
||||||
|
* the parent directory of the Jar file this loader was |
||||||
|
* created to support. This allows different Plugins |
||||||
|
* with supporting DLLs of the same name to co-exist, each |
||||||
|
* in their own subdirectory. |
||||||
|
* |
||||||
|
* Setting the global "localDLLs" by setting the property |
||||||
|
* net.java.games.util.plugins.nolocalnative defeats this behavior. |
||||||
|
* This is necessary for Java Web Start apps which have strong |
||||||
|
* restrictions on where and how native libs can be loaded. |
||||||
|
* |
||||||
|
* @param libname The JNI name of the native library to locate. |
||||||
|
* @return Returns a string describing the actual loation of the |
||||||
|
* native library in the native file system. |
||||||
|
*/ |
||||||
|
protected String findLibrary(String libname){ |
||||||
|
if (localDLLs) { |
||||||
|
String libpath = parentDir.getPath() + File.separator + |
||||||
|
System.mapLibraryName(libname); |
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("Returning libname of: " + libpath); |
||||||
|
} |
||||||
|
return libpath; |
||||||
|
} else { |
||||||
|
return super.findLibrary(libname); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** This function is called as part of scanning the Jar for |
||||||
|
* plugins. It checks to make sure the class passed in is |
||||||
|
* a legitimate plugin, which is to say that it meets |
||||||
|
* the following criteria: |
||||||
|
* |
||||||
|
* (1) Is not itself an interface
|
||||||
|
* (2) Implements the Plugin marker interface either directly |
||||||
|
* or through inheritance. |
||||||
|
* |
||||||
|
* interface, either |
||||||
|
* @param pc The potential plug-in class to vette. |
||||||
|
* @return Returns true if the class meets the criteria for a |
||||||
|
* plugin. Otherwise returns false. |
||||||
|
*/ |
||||||
|
public boolean attemptPluginDefine(Class pc){ |
||||||
|
return ((!pc.isInterface()) && classImplementsPlugin(pc)); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean classImplementsPlugin(Class testClass){ |
||||||
|
if (testClass == null) return false; // end of tree
|
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("testing class "+testClass.getName()); |
||||||
|
} |
||||||
|
Class[] implementedInterfaces = testClass.getInterfaces(); |
||||||
|
for(int i=0;i<implementedInterfaces.length;i++){ |
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("examining interface: "+implementedInterfaces[i]); |
||||||
|
} |
||||||
|
if (implementedInterfaces[i]==Plugin.class) { |
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("returning true from classImplementsPlugin"); |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
for(int i=0;i<implementedInterfaces.length;i++){ |
||||||
|
if (classImplementsPlugin(implementedInterfaces[i])){ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return classImplementsPlugin(testClass.getSuperclass()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,252 @@ |
|||||||
|
/* |
||||||
|
* Plugins.java |
||||||
|
* |
||||||
|
* Created on April 18, 2003, 10:57 AM |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.util.plugins; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author jeff |
||||||
|
*/ |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.util.*; |
||||||
|
import java.util.jar.*; |
||||||
|
|
||||||
|
/** This is the application interface to the Plugin system. |
||||||
|
* One Plugins object should be created for each plug-in |
||||||
|
* directory tree root. |
||||||
|
* |
||||||
|
* On creation the Plugins object will scan its assigned |
||||||
|
* directory tree and examine all Jar files in that tree to |
||||||
|
* see if they qualify as Plug-ins. |
||||||
|
* |
||||||
|
* The Plugin classes may then be retrived from the Plugins object by calling |
||||||
|
* the appropriate get function (see below). |
||||||
|
* |
||||||
|
* If a plugin requires a native code library, that library must be present |
||||||
|
* in the same directory as the plugin Jar file UNLESS the property |
||||||
|
* "net.java.games.util.plugins.nolocalnative" is set. In that case |
||||||
|
* it will fall abck to the VM or environment's default way of finding |
||||||
|
* native libraries. (This is n ecessary for Java Web Start apps.) |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class Plugins { |
||||||
|
static final boolean DEBUG = true; |
||||||
|
List pluginList= new ArrayList(); |
||||||
|
|
||||||
|
/** Creates a new instance of Plugins |
||||||
|
* @param pluginRoot The root od the directory tree to scan for Jars |
||||||
|
* @throws IOException |
||||||
|
* containing plugins. |
||||||
|
*/ |
||||||
|
public Plugins(File pluginRoot) throws IOException { |
||||||
|
scanPlugins(pluginRoot); |
||||||
|
} |
||||||
|
|
||||||
|
private void scanPlugins(File dir) throws IOException { |
||||||
|
File[] files = dir.listFiles(); |
||||||
|
if (files == null) { |
||||||
|
throw new FileNotFoundException("Plugin directory "+dir.getName()+ |
||||||
|
" not found."); |
||||||
|
} |
||||||
|
for(int i=0;i<files.length;i++){ |
||||||
|
File f = files[i]; |
||||||
|
if (f.getName().endsWith(".jar")) { // process JAR file
|
||||||
|
processJar(f); |
||||||
|
} else if (f.isDirectory()) { |
||||||
|
scanPlugins(f); // recurse
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void processJar(File f) { |
||||||
|
try { |
||||||
|
//JarFile jf = new JarFile(f);
|
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("Scanning jar: "+f.getName()); |
||||||
|
} |
||||||
|
PluginLoader loader = new PluginLoader(f); |
||||||
|
JarFile jf = new JarFile(f); |
||||||
|
for (Enumeration en = jf.entries();en.hasMoreElements();){ |
||||||
|
JarEntry je = (JarEntry)en.nextElement(); |
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("Examining file : "+je.getName()); |
||||||
|
} |
||||||
|
if (je.getName().endsWith("Plugin.class")) { |
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("Found candidate class: "+je.getName()); |
||||||
|
} |
||||||
|
String cname = je.getName(); |
||||||
|
cname = cname.substring(0,cname.length()-6); |
||||||
|
cname = cname.replace('/','.'); // required by JDK1.5
|
||||||
|
Class pc = loader.loadClass(cname); |
||||||
|
if (loader.attemptPluginDefine(pc)) { |
||||||
|
if (DEBUG) { |
||||||
|
System.out.println("Adding class to plugins:"+pc.getName()); |
||||||
|
} |
||||||
|
pluginList.add(pc); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** This method returns all the Plugins found in the |
||||||
|
* directory passed in at object creation time or any of its |
||||||
|
* sub-directories. |
||||||
|
* @return An array of Plugin objects |
||||||
|
*/ |
||||||
|
public Class[] get(){ |
||||||
|
Class[] pluginArray = new Class[pluginList.size()]; |
||||||
|
return (Class[])pluginList.toArray(pluginArray); |
||||||
|
} |
||||||
|
|
||||||
|
/** This method returns a sub-list of all the found Plugin |
||||||
|
* classes that implement <B>any</B> of the passed in set of |
||||||
|
* Interfaces (either directly or through inheritance.) |
||||||
|
* @param interfaces A set of interfaces to match against the interfaces |
||||||
|
* implemented by the plugin classes. |
||||||
|
* @return The list of plugin classes that implement at least |
||||||
|
* one member of the passed in set of interfaces. |
||||||
|
*/ |
||||||
|
public Class[] getImplementsAny(Class[] interfaces){ |
||||||
|
List matchList = new ArrayList(pluginList.size()); |
||||||
|
Set interfaceSet = new HashSet(); |
||||||
|
for(int i=0;i<interfaces.length;i++){ |
||||||
|
interfaceSet.add(interfaces[i]); |
||||||
|
} |
||||||
|
for(Iterator i = pluginList.iterator();i.hasNext();){ |
||||||
|
Class pluginClass = (Class)i.next(); |
||||||
|
if (classImplementsAny(pluginClass,interfaceSet)){ |
||||||
|
matchList.add(pluginClass); |
||||||
|
} |
||||||
|
} |
||||||
|
Class[] pluginArray = new Class[matchList.size()]; |
||||||
|
return (Class[])matchList.toArray(pluginArray); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean classImplementsAny(Class testClass,Set interfaces){ |
||||||
|
if (testClass == null) return false; // end of tree
|
||||||
|
Class[] implementedInterfaces = testClass.getInterfaces(); |
||||||
|
for(int i=0;i<implementedInterfaces.length;i++){ |
||||||
|
if (interfaces.contains(implementedInterfaces[i])) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
for(int i=0;i<implementedInterfaces.length;i++){ |
||||||
|
if (classImplementsAny(implementedInterfaces[i],interfaces)){ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return classImplementsAny(testClass.getSuperclass(),interfaces); |
||||||
|
} |
||||||
|
|
||||||
|
/** This method returns a sub-list of all the found Plugin |
||||||
|
* classes that implement <B>all</B> of the passed in set of |
||||||
|
* Interfaces (either directly or through inheritance.) |
||||||
|
* @param interfaces A set of interfaces to match against the interfaces |
||||||
|
* implemented by the plugin classes. |
||||||
|
* @return The list of plugin classes that implement at least |
||||||
|
* one member of the passed in set of interfaces. |
||||||
|
*/ |
||||||
|
public Class[] getImplementsAll(Class[] interfaces){ |
||||||
|
List matchList = new ArrayList(pluginList.size()); |
||||||
|
Set interfaceSet = new HashSet(); |
||||||
|
for(int i=0;i<interfaces.length;i++){ |
||||||
|
interfaceSet.add(interfaces[i]); |
||||||
|
} |
||||||
|
for(Iterator i = pluginList.iterator();i.hasNext();){ |
||||||
|
Class pluginClass = (Class)i.next(); |
||||||
|
if (classImplementsAll(pluginClass,interfaceSet)){ |
||||||
|
matchList.add(pluginClass); |
||||||
|
} |
||||||
|
} |
||||||
|
Class[] pluginArray = new Class[matchList.size()]; |
||||||
|
return (Class[])matchList.toArray(pluginArray); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean classImplementsAll(Class testClass,Set interfaces){ |
||||||
|
if (testClass == null) return false; // end of tree
|
||||||
|
Class[] implementedInterfaces = testClass.getInterfaces(); |
||||||
|
for(int i=0;i<implementedInterfaces.length;i++){ |
||||||
|
if (interfaces.contains(implementedInterfaces[i])) { |
||||||
|
interfaces.remove(implementedInterfaces[i]); |
||||||
|
if (interfaces.size() == 0) { // found them all
|
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
for(int i=0;i<implementedInterfaces.length;i++){ |
||||||
|
if (classImplementsAll(implementedInterfaces[i],interfaces)){ |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return classImplementsAll(testClass.getSuperclass(),interfaces); |
||||||
|
} |
||||||
|
|
||||||
|
/** This method returns a sub-list of all the found Plugin |
||||||
|
* classes that extend the passed in Class |
||||||
|
* (either directly or through inheritance.) |
||||||
|
* @param superclass The class to match. |
||||||
|
* @return The list of plugin classes that extend the passed |
||||||
|
* in class. |
||||||
|
*/ |
||||||
|
public Class[] getExtends(Class superclass){ |
||||||
|
List matchList = new ArrayList(pluginList.size()); |
||||||
|
for(Iterator i = pluginList.iterator();i.hasNext();){ |
||||||
|
Class pluginClass = (Class)i.next(); |
||||||
|
if (classExtends(pluginClass,superclass)){ |
||||||
|
matchList.add(pluginClass); |
||||||
|
} |
||||||
|
} |
||||||
|
Class[] pluginArray = new Class[matchList.size()]; |
||||||
|
return (Class[])matchList.toArray(pluginArray); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean classExtends(Class testClass,Class superclass){ |
||||||
|
if (testClass == null) { // end of hirearchy
|
||||||
|
return false; |
||||||
|
} |
||||||
|
if (testClass == superclass) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return classExtends(testClass.getSuperclass(),superclass); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
||||||
|
<html> |
||||||
|
<body> |
||||||
|
|
||||||
|
Utility package for JInput Plugins. |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,3 @@ |
|||||||
|
Manifest-Version: 1.0 |
||||||
|
Main-Class: net.java.games.input.Version |
||||||
|
Automatic-Module-Name: net.java.games.jinput |
@ -0,0 +1,118 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
static jstring sprintfJavaString(JNIEnv *env, const char *format, va_list ap) { |
||||||
|
#define BUFFER_SIZE 4000 |
||||||
|
char buffer[BUFFER_SIZE]; |
||||||
|
jstring str;
|
||||||
|
#ifdef _MSC_VER |
||||||
|
vsnprintf_s(buffer, BUFFER_SIZE, _TRUNCATE, format, ap); |
||||||
|
#else |
||||||
|
vsnprintf(buffer, BUFFER_SIZE, format, ap); |
||||||
|
#endif |
||||||
|
buffer[BUFFER_SIZE - 1] = '\0'; |
||||||
|
str = (*env)->NewStringUTF(env, buffer); |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
void printfJava(JNIEnv *env, const char *format, ...) { |
||||||
|
jstring str;
|
||||||
|
jclass org_lwjgl_LWJGLUtil_class; |
||||||
|
jmethodID log_method; |
||||||
|
va_list ap; |
||||||
|
va_start(ap, format); |
||||||
|
str = sprintfJavaString(env, format, ap); |
||||||
|
va_end(ap); |
||||||
|
org_lwjgl_LWJGLUtil_class = (*env)->FindClass(env, "net/java/games/input/ControllerEnvironment"); |
||||||
|
if (org_lwjgl_LWJGLUtil_class == NULL) |
||||||
|
return; |
||||||
|
log_method = (*env)->GetStaticMethodID(env, org_lwjgl_LWJGLUtil_class, "log", "(Ljava/lang/String;)V"); |
||||||
|
if (log_method == NULL) |
||||||
|
return; |
||||||
|
(*env)->CallStaticVoidMethod(env, org_lwjgl_LWJGLUtil_class, log_method, str); |
||||||
|
}
|
||||||
|
|
||||||
|
static void throwException(JNIEnv * env, const char *exception_name, const char *format, va_list ap) { |
||||||
|
jstring str; |
||||||
|
jobject exception; |
||||||
|
|
||||||
|
if ((*env)->ExceptionCheck(env) == JNI_TRUE) |
||||||
|
return; // The JVM crashes if we try to throw two exceptions from one native call
|
||||||
|
str = sprintfJavaString(env, format, ap); |
||||||
|
exception = newJObject(env, exception_name, "(Ljava/lang/String;)V", str); |
||||||
|
(*env)->Throw(env, exception); |
||||||
|
} |
||||||
|
|
||||||
|
void throwRuntimeException(JNIEnv * env, const char *format, ...) { |
||||||
|
va_list ap; |
||||||
|
va_start(ap, format); |
||||||
|
throwException(env, "java/lang/RuntimeException", format, ap); |
||||||
|
va_end(ap); |
||||||
|
} |
||||||
|
|
||||||
|
void throwIOException(JNIEnv * env, const char *format, ...) { |
||||||
|
va_list ap; |
||||||
|
va_start(ap, format); |
||||||
|
throwException(env, "java/io/IOException", format, ap); |
||||||
|
va_end(ap); |
||||||
|
} |
||||||
|
|
||||||
|
jobject newJObject(JNIEnv * env, const char *class_name, const char *constructor_signature, ...) { |
||||||
|
va_list ap; |
||||||
|
jclass clazz; |
||||||
|
jmethodID constructor; |
||||||
|
jobject obj; |
||||||
|
|
||||||
|
clazz = (*env)->FindClass(env, class_name); |
||||||
|
if (clazz == NULL) |
||||||
|
return NULL; |
||||||
|
constructor = (*env)->GetMethodID(env, clazz, "<init>", constructor_signature); |
||||||
|
if (constructor == NULL) |
||||||
|
return NULL; |
||||||
|
va_start(ap, constructor_signature); |
||||||
|
obj = (*env)->NewObjectV(env, clazz, constructor, ap); |
||||||
|
va_end(ap); |
||||||
|
return obj; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,53 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <jni.h> |
||||||
|
#ifdef _MSC_VER |
||||||
|
#include <Basetsd.h> |
||||||
|
#else |
||||||
|
#include <inttypes.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
extern void printfJava(JNIEnv *env, const char *format, ...); |
||||||
|
extern void throwRuntimeException(JNIEnv * env, const char *format, ...); |
||||||
|
extern void throwIOException(JNIEnv * env, const char *format, ...); |
||||||
|
extern jobject newJObject(JNIEnv * env, const char *class_name, const char *constructor_signature, ...); |
||||||
|
|
@ -0,0 +1,45 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project basedir="." default="compileNativeJinputLib" name="Linux Plugin"> |
||||||
|
<property name="libname64" value="libjinput-linux64.so"/> |
||||||
|
<property name="libname32" value="libjinput-linux.so"/> |
||||||
|
|
||||||
|
<target name="init"> |
||||||
|
<mkdir dir="target/natives"/> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="createNativeDefinitions.java"> |
||||||
|
<exec dir="src/main/native" executable="gawk" os="Linux" output="../java/net/java/games/input/NativeDefinitions.java"> |
||||||
|
<arg line="-f"/> |
||||||
|
<arg line="getDefinitions"/> |
||||||
|
<arg line="/usr/include/linux/input.h"/> |
||||||
|
</exec> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target depends="init" name="compileNativeJinputLib"> |
||||||
|
<exec executable="uname" outputproperty="hwplatform"> |
||||||
|
<arg value="-m"/> |
||||||
|
</exec> |
||||||
|
<condition property="libname" value="${libname64}" else="${libname32}"> |
||||||
|
<equals arg1="${hwplatform}" arg2="x86_64"/> |
||||||
|
</condition> |
||||||
|
<apply dir="target/natives" executable="cc" os="Linux" dest="target/natives" skipemptyfilesets="true" failonerror="true"> |
||||||
|
<arg line="-O2 -Wall -c -fPIC"/> |
||||||
|
<arg value="-I${java.home}/include"/> |
||||||
|
<arg value="-I${java.home}/include/linux"/> |
||||||
|
<arg value="-I${java.home}/../include"/> |
||||||
|
<arg value="-I${java.home}/../include/linux"/> |
||||||
|
<arg value="-I../../../common/src/native"/> |
||||||
|
<arg value="-I../generated-sources/natives"/> |
||||||
|
<mapper type="glob" from="*.c" to="*.o"/> |
||||||
|
<fileset dir="src/main/native" includes="*.c"/> |
||||||
|
<fileset dir="../common/src/native" includes="*.c"/> |
||||||
|
</apply> |
||||||
|
<apply dir="target/natives" parallel="true" executable="cc" os="Linux" failonerror="true"> |
||||||
|
<arg line="-shared -O2 -Wall -o ${libname}"/> |
||||||
|
<fileset dir="target/natives" includes="*.o"/> |
||||||
|
</apply> |
||||||
|
<apply dir="target/natives" parallel="true" executable="strip" os="Linux" failonerror="true"> |
||||||
|
<fileset file="target/natives/${libname}"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
</project> |
@ -0,0 +1,60 @@ |
|||||||
|
#!/bin/gawk -f |
||||||
|
|
||||||
|
# Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
# |
||||||
|
# Redistribution and use in source and binary forms, with or without |
||||||
|
# modification, are permitted provided that the following conditions are met: |
||||||
|
# |
||||||
|
# Redistributions of source code must retain the above copyright notice, this |
||||||
|
# list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
# form must reproduce the above copyright notice, this list of conditions and |
||||||
|
# the following disclaimer in the documentation and/or other materials provided |
||||||
|
# with the distribution. |
||||||
|
# The name of the author may not be used to endorse or promote products derived |
||||||
|
# from this software without specific prior written permission. |
||||||
|
# |
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
|
||||||
|
NR == 1 { |
||||||
|
FILENAME == ARGV[1]; |
||||||
|
printf("package net.java.games.input;\n\n") |
||||||
|
printf("\n"); |
||||||
|
printf("/**\n * This file is generated from %s please do not edit\n */\n", FILENAME); |
||||||
|
printf("class NativeDefinitions {\n") |
||||||
|
} |
||||||
|
/#define ABS_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define REL_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define BTN_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define KEY_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define BUS_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define EV_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define FF_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
/#define USAGE_/ { |
||||||
|
printf(" public static final int %s = %s;\n", $2, $3) |
||||||
|
} |
||||||
|
END { |
||||||
|
printf("}\n"); |
||||||
|
} |
@ -0,0 +1,243 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <sys/types.h> |
||||||
|
#include <sys/stat.h> |
||||||
|
#include <sys/ioctl.h> |
||||||
|
#include <linux/input.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <errno.h> |
||||||
|
#include "util.h" |
||||||
|
#include "net_java_games_input_LinuxEventDevice.h" |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_LinuxEventDevice_nOpen(JNIEnv *env, jclass unused, jstring path, jboolean rw_flag) { |
||||||
|
const char *path_str = (*env)->GetStringUTFChars(env, path, NULL); |
||||||
|
if (path_str == NULL) |
||||||
|
return -1; |
||||||
|
int flags = rw_flag == JNI_TRUE ? O_RDWR : O_RDONLY; |
||||||
|
flags = flags | O_NONBLOCK; |
||||||
|
int fd = open(path_str, flags); |
||||||
|
if (fd == -1) |
||||||
|
throwIOException(env, "Failed to open device %s (%d)\n", path_str, errno); |
||||||
|
(*env)->ReleaseStringUTFChars(env, path, path_str); |
||||||
|
return fd; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nClose(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
int result = close(fd); |
||||||
|
if (result == -1) |
||||||
|
throwIOException(env, "Failed to close device (%d)\n", errno); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_net_java_games_input_LinuxEventDevice_nGetName(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
#define BUFFER_SIZE 1024 |
||||||
|
int fd = (int)fd_address; |
||||||
|
char device_name[BUFFER_SIZE]; |
||||||
|
|
||||||
|
if (ioctl(fd, EVIOCGNAME(BUFFER_SIZE), device_name) == -1) { |
||||||
|
throwIOException(env, "Failed to get device name (%d)\n", errno); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
jstring jstr = (*env)->NewStringUTF(env, device_name); |
||||||
|
return jstr; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetKeyStates(JNIEnv *env, jclass unused, jlong fd_address, jbyteArray bits_array) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
jsize len = (*env)->GetArrayLength(env, bits_array); |
||||||
|
jbyte *bits = (*env)->GetByteArrayElements(env, bits_array, NULL); |
||||||
|
if (bits == NULL) |
||||||
|
return; |
||||||
|
int res = ioctl(fd, EVIOCGKEY(len), bits); |
||||||
|
(*env)->ReleaseByteArrayElements(env, bits_array, bits, 0); |
||||||
|
if (res == -1) |
||||||
|
throwIOException(env, "Failed to get device key states (%d)\n", errno); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nGetVersion(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
int version; |
||||||
|
if (ioctl(fd, EVIOCGVERSION, &version) == -1) { |
||||||
|
throwIOException(env, "Failed to get device version (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return version; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nGetNumEffects(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
int num_effects; |
||||||
|
if (ioctl(fd, EVIOCGEFFECTS, &num_effects) == -1) { |
||||||
|
throwIOException(env, "Failed to get number of device effects (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return num_effects; |
||||||
|
} |
||||||
|
|
||||||
|
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); |
||||||
|
jbyte *bits = (*env)->GetByteArrayElements(env, bits_array, NULL); |
||||||
|
if (bits == NULL) |
||||||
|
return; |
||||||
|
int res = ioctl(fd, EVIOCGBIT(evtype, len), bits); |
||||||
|
(*env)->ReleaseByteArrayElements(env, bits_array, bits, 0); |
||||||
|
if (res == -1) |
||||||
|
throwIOException(env, "Failed to get device bits (%d)\n", errno); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL Java_net_java_games_input_LinuxEventDevice_nGetInputID(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
jclass input_id_class = (*env)->FindClass(env, "net/java/games/input/LinuxInputID"); |
||||||
|
if (input_id_class == NULL) |
||||||
|
return NULL; |
||||||
|
jmethodID input_id_constructor = (*env)->GetMethodID(env, input_id_class, "<init>", "(IIII)V"); |
||||||
|
if (input_id_constructor == NULL) |
||||||
|
return NULL; |
||||||
|
struct input_id id; |
||||||
|
int result = ioctl(fd, EVIOCGID, &id); |
||||||
|
if (result == -1) { |
||||||
|
throwIOException(env, "Failed to get input id for device (%d)\n", errno); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
return (*env)->NewObject(env, input_id_class, input_id_constructor, (jint)id.bustype, (jint)id.vendor, (jint)id.product, (jint)id.version); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetAbsInfo(JNIEnv *env, jclass unused, jlong fd_address, jint abs_axis, jobject abs_info_return) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
jclass abs_info_class = (*env)->GetObjectClass(env, abs_info_return); |
||||||
|
if (abs_info_class == NULL) |
||||||
|
return; |
||||||
|
jmethodID abs_info_set = (*env)->GetMethodID(env, abs_info_class, "set", "(IIIII)V"); |
||||||
|
if (abs_info_set == NULL) |
||||||
|
return; |
||||||
|
struct input_absinfo abs_info; |
||||||
|
int result = ioctl(fd, EVIOCGABS(abs_axis), &abs_info); |
||||||
|
if (result == -1) { |
||||||
|
throwIOException(env, "Failed to get abs info for axis (%d)\n", errno); |
||||||
|
return; |
||||||
|
} |
||||||
|
(*env)->CallVoidMethod(env, abs_info_return, abs_info_set, (jint)abs_info.value, (jint)abs_info.minimum, (jint)abs_info.maximum, (jint)abs_info.fuzz, (jint)abs_info.flat); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL Java_net_java_games_input_LinuxEventDevice_nGetNextEvent(JNIEnv *env, jclass unused, jlong fd_address, jobject linux_event_return) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
jclass linux_event_class = (*env)->GetObjectClass(env, linux_event_return); |
||||||
|
if (linux_event_class == NULL) |
||||||
|
return JNI_FALSE; |
||||||
|
jmethodID linux_event_set = (*env)->GetMethodID(env, linux_event_class, "set", "(JJIII)V"); |
||||||
|
if (linux_event_set == NULL) |
||||||
|
return JNI_FALSE; |
||||||
|
struct input_event event; |
||||||
|
if (read(fd, &event, sizeof(struct input_event)) == -1) { |
||||||
|
if (errno == EAGAIN) |
||||||
|
return JNI_FALSE; |
||||||
|
throwIOException(env, "Failed to read next device event (%d)\n", errno); |
||||||
|
return JNI_FALSE; |
||||||
|
} |
||||||
|
(*env)->CallVoidMethod(env, linux_event_return, linux_event_set, (jlong)event.time.tv_sec, (jlong)event.time.tv_usec, (jint)event.type, (jint)event.code, (jint)event.value); |
||||||
|
return JNI_TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nUploadRumbleEffect(JNIEnv *env, jclass unused, jlong fd_address, jint id, jint direction, jint trigger_button, jint trigger_interval, jint replay_length, jint replay_delay, jint strong_magnitude, jint weak_magnitude) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
struct ff_effect effect; |
||||||
|
|
||||||
|
effect.type = FF_RUMBLE; |
||||||
|
effect.id = id; |
||||||
|
effect.trigger.button = trigger_button; |
||||||
|
effect.trigger.interval = trigger_interval; |
||||||
|
effect.replay.length = replay_length; |
||||||
|
effect.replay.delay = replay_delay; |
||||||
|
effect.direction = direction; |
||||||
|
effect.u.rumble.strong_magnitude = strong_magnitude; |
||||||
|
effect.u.rumble.weak_magnitude = weak_magnitude; |
||||||
|
|
||||||
|
if (ioctl(fd, EVIOCSFF, &effect) == -1) { |
||||||
|
throwIOException(env, "Failed to upload effect (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return effect.id; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nUploadConstantEffect(JNIEnv *env, jclass unused, jlong fd_address, jint id, jint direction, jint trigger_button, jint trigger_interval, jint replay_length, jint replay_delay, jint constant_level, jint constant_env_attack_length, jint constant_env_attack_level, jint constant_env_fade_length, jint constant_env_fade_level) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
struct ff_effect effect; |
||||||
|
|
||||||
|
effect.type = FF_CONSTANT; |
||||||
|
effect.id = id; |
||||||
|
effect.trigger.button = trigger_button; |
||||||
|
effect.trigger.interval = trigger_interval; |
||||||
|
effect.replay.length = replay_length; |
||||||
|
effect.replay.delay = replay_delay; |
||||||
|
effect.direction = direction; |
||||||
|
effect.u.constant.level = constant_level; |
||||||
|
effect.u.constant.envelope.attack_length = constant_env_attack_length; |
||||||
|
effect.u.constant.envelope.attack_level = constant_env_attack_level; |
||||||
|
effect.u.constant.envelope.fade_length = constant_env_fade_length; |
||||||
|
effect.u.constant.envelope.fade_level = constant_env_fade_level; |
||||||
|
|
||||||
|
if (ioctl(fd, EVIOCSFF, &effect) == -1) { |
||||||
|
throwIOException(env, "Failed to upload effect (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return effect.id; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nWriteEvent(JNIEnv *env, jclass unused, jlong fd_address, jint type, jint code, jint value) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
struct input_event event; |
||||||
|
event.type = type; |
||||||
|
event.code = code; |
||||||
|
event.value = value; |
||||||
|
|
||||||
|
if (write(fd, &event, sizeof(event)) == -1) { |
||||||
|
throwIOException(env, "Failed to write to device (%d)\n", errno); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nEraseEffect(JNIEnv *env, jclass unused, jlong fd_address, jint ff_id) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
int ff_id_int = ff_id; |
||||||
|
|
||||||
|
if (ioctl(fd, EVIOCRMFF, &ff_id_int) == -1) |
||||||
|
throwIOException(env, "Failed to erase effect (%d)\n", errno); |
||||||
|
} |
@ -0,0 +1,158 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <sys/types.h> |
||||||
|
#include <sys/stat.h> |
||||||
|
#include <sys/ioctl.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <errno.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <linux/joystick.h> |
||||||
|
#include "util.h" |
||||||
|
#include "net_java_games_input_LinuxJoystickDevice.h" |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_LinuxJoystickDevice_nOpen(JNIEnv *env, jclass unused, jstring path) { |
||||||
|
const char *path_str = (*env)->GetStringUTFChars(env, path, NULL); |
||||||
|
if (path_str == NULL) |
||||||
|
return -1; |
||||||
|
int fd = open(path_str, O_RDONLY | O_NONBLOCK); |
||||||
|
if (fd == -1) |
||||||
|
throwIOException(env, "Failed to open device %s (%d)\n", path_str, errno); |
||||||
|
(*env)->ReleaseStringUTFChars(env, path, path_str); |
||||||
|
return fd; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_LinuxJoystickDevice_nClose(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
int result = close(fd); |
||||||
|
if (result == -1) |
||||||
|
throwIOException(env, "Failed to close device (%d)\n", errno); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetName(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
#define BUFFER_SIZE 1024 |
||||||
|
int fd = (int)fd_address; |
||||||
|
char device_name[BUFFER_SIZE]; |
||||||
|
|
||||||
|
if (ioctl(fd, JSIOCGNAME(BUFFER_SIZE), device_name) == -1) { |
||||||
|
throwIOException(env, "Failed to get device name (%d)\n", errno); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
jstring jstr = (*env)->NewStringUTF(env, device_name); |
||||||
|
return jstr; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetVersion(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
__u32 version; |
||||||
|
if (ioctl(fd, JSIOCGVERSION, &version) == -1) { |
||||||
|
throwIOException(env, "Failed to get device version (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return version; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNumButtons(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
__u8 num_buttons; |
||||||
|
if (ioctl(fd, JSIOCGBUTTONS, &num_buttons) == -1) { |
||||||
|
throwIOException(env, "Failed to get number of buttons (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return num_buttons; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNumAxes(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
__u8 num_axes; |
||||||
|
if (ioctl(fd, JSIOCGAXES, &num_axes) == -1) { |
||||||
|
throwIOException(env, "Failed to get number of buttons (%d)\n", errno); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
return num_axes; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jbyteArray JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetAxisMap(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
__u8 axis_map[ABS_MAX + 1]; |
||||||
|
if (ioctl(fd, JSIOCGAXMAP, axis_map) == -1) { |
||||||
|
throwIOException(env, "Failed to get axis map (%d)\n", errno); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
jbyteArray axis_map_array = (*env)->NewByteArray(env, (ABS_MAX + 1)); |
||||||
|
if (axis_map_array == NULL) |
||||||
|
return NULL; |
||||||
|
(*env)->SetByteArrayRegion(env, axis_map_array, 0, (ABS_MAX + 1), (jbyte *)axis_map); |
||||||
|
return axis_map_array; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jcharArray JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetButtonMap(JNIEnv *env, jclass unused, jlong fd_address) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
__u16 button_map[KEY_MAX - BTN_MISC + 1]; |
||||||
|
if (ioctl(fd, JSIOCGBTNMAP, button_map) == -1) { |
||||||
|
throwIOException(env, "Failed to get button map (%d)\n", errno); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
jcharArray button_map_array = (*env)->NewCharArray(env, (KEY_MAX - BTN_MISC + 1)); |
||||||
|
if (button_map_array == NULL) |
||||||
|
return NULL; |
||||||
|
(*env)->SetCharArrayRegion(env, button_map_array, 0, (KEY_MAX - BTN_MISC + 1), (jchar *)button_map); |
||||||
|
return button_map_array; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNextEvent(JNIEnv *env, jclass unused, jlong fd_address, jobject event_return) { |
||||||
|
int fd = (int)fd_address; |
||||||
|
jclass event_class = (*env)->GetObjectClass(env, event_return); |
||||||
|
if (event_class == NULL) |
||||||
|
return JNI_FALSE; |
||||||
|
jmethodID event_set = (*env)->GetMethodID(env, event_class, "set", "(JIII)V"); |
||||||
|
if (event_set == NULL) |
||||||
|
return JNI_FALSE; |
||||||
|
struct js_event event; |
||||||
|
if (read(fd, &event, sizeof(event)) == -1) { |
||||||
|
if (errno == EAGAIN) |
||||||
|
return JNI_FALSE; |
||||||
|
throwIOException(env, "Failed to read next device event (%d)\n", errno); |
||||||
|
return JNI_FALSE; |
||||||
|
} |
||||||
|
(*env)->CallVoidMethod(env, event_return, event_set, (jlong)event.time, (jint)event.value, (jint)event.type, (jint)event.number); |
||||||
|
return JNI_TRUE; |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
<?xml version="1.0" ?> |
||||||
|
<project name="OS X Plugin, Native code" basedir="." default="compileNativeJinputLib"> |
||||||
|
<description>OSX JInput Native Plugin</description> |
||||||
|
|
||||||
|
<target name="init"> |
||||||
|
<mkdir dir="target/natives/x86_64"/> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="compile"> |
||||||
|
<apply dir="${dstdir}" executable="${compiler}" os="Mac OS X" skipemptyfilesets="true" failonerror="true" dest="${dstdir}"> |
||||||
|
<arg line="${cflags} -O2 -Wall -c -fPIC -I${sdkroot}/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers -I../../../../common/src/native -I../../generated-sources/natives/"/> |
||||||
|
<mapper type="glob" from="*.c" to="*.o"/> |
||||||
|
<fileset dir="src/main/native" includes="*.c"/> |
||||||
|
<fileset dir="../common/src/native" includes="*.c"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="link"> |
||||||
|
<apply dir="${objdir}" parallel="true" executable="${linker}" os="Mac OS X" failonerror="true" skipemptyfilesets="true"> |
||||||
|
<arg line="${linkerflags} -dynamiclib -o ${libname} -framework JavaVM -framework CoreFoundation -framework IOKit -framework CoreServices"/> |
||||||
|
<fileset dir="${objdir}" includes="*.o"/> |
||||||
|
</apply> |
||||||
|
<apply dir="${objdir}" executable="strip" os="Mac OS X" failonerror="true"> |
||||||
|
<arg line="-S -X"/> |
||||||
|
<fileset dir="." includes="${libname}"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="compileNativeJinputLib" depends="init"> |
||||||
|
<property name="x86_64_sdkroot" location="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"/> |
||||||
|
<property name="x86_64_flags" value="-isysroot ${x86_64_sdkroot} -arch x86_64 -mmacosx-version-min=10.5"/> |
||||||
|
<antcall target="compile"> |
||||||
|
<param name="dstdir" location="target/natives/x86_64"/> |
||||||
|
<param name="compiler" value="gcc"/> |
||||||
|
<param name="sdkroot" location="${x86_64_sdkroot}"/> |
||||||
|
<param name="cflags" value="${x86_64_flags}"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="link"> |
||||||
|
<param name="objdir" location="target/natives/x86_64"/> |
||||||
|
<param name="libname" value="libjinput-osx-x86_64.jnilib"/> |
||||||
|
<param name="linker" value="gcc"/> |
||||||
|
<param name="linkerflags" value="${x86_64_flags}"/> |
||||||
|
</antcall> |
||||||
|
<apply dir="target/natives" parallel="true" executable="lipo" os="Mac OS X" failonerror="true" skipemptyfilesets="true" > |
||||||
|
<arg value="-create"/> |
||||||
|
<srcfile/> |
||||||
|
<arg value="-output"/> |
||||||
|
<arg path="target/natives/libjinput-osx.jnilib"/> |
||||||
|
<fileset file="target/natives/x86_64/libjinput-osx-x86_64.jnilib"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
</project> |
@ -0,0 +1,197 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <CoreServices/CoreServices.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "util.h" |
||||||
|
#include "macosxutil.h" |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
JNIEnv *env; |
||||||
|
jobject map; |
||||||
|
} dict_context_t; |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
JNIEnv *env; |
||||||
|
jobjectArray array; |
||||||
|
jsize index; |
||||||
|
} array_context_t; |
||||||
|
|
||||||
|
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject); |
||||||
|
|
||||||
|
static jstring createStringFromCFString(JNIEnv *env, CFStringRef cfstring) { |
||||||
|
CFIndex unicode_length = CFStringGetLength(cfstring); |
||||||
|
CFIndex utf8_length = CFStringGetMaximumSizeForEncoding(unicode_length, kCFStringEncodingUTF8); |
||||||
|
// Allocate buffer large enough, plus \0 terminator
|
||||||
|
char *buffer = (char *)malloc(utf8_length + 1); |
||||||
|
if (buffer == NULL) |
||||||
|
return NULL; |
||||||
|
Boolean result = CFStringGetCString(cfstring, buffer, utf8_length + 1, kCFStringEncodingUTF8); |
||||||
|
if (!result) { |
||||||
|
free(buffer); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
jstring str = (*env)->NewStringUTF(env, buffer); |
||||||
|
free(buffer); |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
static jobject createDoubleObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) { |
||||||
|
double value; |
||||||
|
Boolean result = CFNumberGetValue(cfnumber, kCFNumberDoubleType, &value); |
||||||
|
if (!result) |
||||||
|
return NULL; |
||||||
|
return newJObject(env, "java/lang/Double", "(D)V", (jdouble)value);
|
||||||
|
} |
||||||
|
|
||||||
|
static jobject createLongObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) { |
||||||
|
SInt64 value; |
||||||
|
Boolean result = CFNumberGetValue(cfnumber, kCFNumberSInt64Type, &value); |
||||||
|
if (!result) |
||||||
|
return NULL; |
||||||
|
return newJObject(env, "java/lang/Long", "(J)V", (jlong)value);
|
||||||
|
} |
||||||
|
|
||||||
|
static jobject createNumberFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) { |
||||||
|
CFNumberType number_type = CFNumberGetType(cfnumber); |
||||||
|
switch (number_type) { |
||||||
|
case kCFNumberSInt8Type: |
||||||
|
case kCFNumberSInt16Type: |
||||||
|
case kCFNumberSInt32Type: |
||||||
|
case kCFNumberSInt64Type: |
||||||
|
case kCFNumberCharType: |
||||||
|
case kCFNumberShortType: |
||||||
|
case kCFNumberIntType: |
||||||
|
case kCFNumberLongType: |
||||||
|
case kCFNumberLongLongType: |
||||||
|
case kCFNumberCFIndexType: |
||||||
|
return createLongObjectFromCFNumber(env, cfnumber); |
||||||
|
case kCFNumberFloat32Type: |
||||||
|
case kCFNumberFloat64Type: |
||||||
|
case kCFNumberFloatType: |
||||||
|
case kCFNumberDoubleType: |
||||||
|
return createDoubleObjectFromCFNumber(env, cfnumber); |
||||||
|
default: |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static void createArrayEntries(const void *value, void *context) { |
||||||
|
array_context_t *array_context = (array_context_t *)context; |
||||||
|
jobject jval = createObjectFromCFObject(array_context->env, value); |
||||||
|
(*array_context->env)->SetObjectArrayElement(array_context->env, array_context->array, array_context->index++, jval); |
||||||
|
(*array_context->env)->DeleteLocalRef(array_context->env, jval); |
||||||
|
} |
||||||
|
|
||||||
|
static jobject createArrayFromCFArray(JNIEnv *env, CFArrayRef cfarray) { |
||||||
|
jclass Object_class = (*env)->FindClass(env, "java/lang/Object"); |
||||||
|
if (Object_class == NULL) |
||||||
|
return NULL; |
||||||
|
CFIndex size = CFArrayGetCount(cfarray); |
||||||
|
CFRange range = {0, size}; |
||||||
|
jobjectArray array = (*env)->NewObjectArray(env, size, Object_class, NULL); |
||||||
|
array_context_t array_context; |
||||||
|
array_context.env = env; |
||||||
|
array_context.array = array; |
||||||
|
array_context.index = 0; |
||||||
|
CFArrayApplyFunction(cfarray, range, createArrayEntries, &array_context); |
||||||
|
return array; |
||||||
|
} |
||||||
|
|
||||||
|
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject) { |
||||||
|
CFTypeID type_id = CFGetTypeID(cfobject); |
||||||
|
if (type_id == CFDictionaryGetTypeID()) { |
||||||
|
return createMapFromCFDictionary(env, cfobject); |
||||||
|
} else if (type_id == CFArrayGetTypeID()) { |
||||||
|
return createArrayFromCFArray(env, cfobject); |
||||||
|
} else if (type_id == CFStringGetTypeID()) { |
||||||
|
return createStringFromCFString(env, cfobject); |
||||||
|
} else if (type_id == CFNumberGetTypeID()) { |
||||||
|
return createNumberFromCFNumber(env, cfobject); |
||||||
|
} else { |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static void createMapKeys(const void *key, const void *value, void *context) { |
||||||
|
dict_context_t *dict_context = (dict_context_t *)context; |
||||||
|
|
||||||
|
jclass Map_class = (*dict_context->env)->GetObjectClass(dict_context->env, dict_context->map); |
||||||
|
if (Map_class == NULL) |
||||||
|
return; |
||||||
|
jmethodID map_put = (*dict_context->env)->GetMethodID(dict_context->env, Map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); |
||||||
|
if (map_put == NULL) |
||||||
|
return; |
||||||
|
jobject jkey = createObjectFromCFObject(dict_context->env, key); |
||||||
|
jobject jvalue = createObjectFromCFObject(dict_context->env, value); |
||||||
|
if (jkey == NULL || jvalue == NULL) |
||||||
|
return; |
||||||
|
(*dict_context->env)->CallObjectMethod(dict_context->env, dict_context->map, map_put, jkey, jvalue); |
||||||
|
(*dict_context->env)->DeleteLocalRef(dict_context->env, jkey); |
||||||
|
(*dict_context->env)->DeleteLocalRef(dict_context->env, jvalue); |
||||||
|
} |
||||||
|
|
||||||
|
jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict) { |
||||||
|
jobject map = newJObject(env, "java/util/HashMap", "()V"); |
||||||
|
if (map == NULL) |
||||||
|
return NULL; |
||||||
|
dict_context_t dict_context; |
||||||
|
dict_context.env = env; |
||||||
|
dict_context.map = map; |
||||||
|
CFDictionaryApplyFunction(dict, createMapKeys, &dict_context); |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return) { |
||||||
|
jclass OSXEvent_class = (*env)->GetObjectClass(env, event_return); |
||||||
|
if (OSXEvent_class == NULL) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
jmethodID OSXEvent_set = (*env)->GetMethodID(env, OSXEvent_class, "set", "(JJIJ)V"); |
||||||
|
if (OSXEvent_set == NULL) { |
||||||
|
return; |
||||||
|
} |
||||||
|
Nanoseconds nanos = AbsoluteToNanoseconds(event->timestamp); |
||||||
|
uint64_t nanos64= *((uint64_t *)&nanos); |
||||||
|
(*env)->CallVoidMethod(env, event_return, OSXEvent_set, (jlong)event->type, (jlong)(intptr_t)event->elementCookie, (jint)event->value, (jlong)nanos64); |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <jni.h> |
||||||
|
#include <CoreFoundation/CoreFoundation.h> |
||||||
|
#include <IOKit/hid/IOHIDLib.h> |
||||||
|
|
||||||
|
extern jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict); |
||||||
|
extern void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return); |
@ -0,0 +1,118 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <IOKit/IOTypes.h> |
||||||
|
#include <IOKit/IOKitLib.h> |
||||||
|
#include <IOKit/IOCFPlugIn.h> |
||||||
|
#include <IOKit/hid/IOHIDLib.h> |
||||||
|
#include <IOKit/hid/IOHIDKeys.h> |
||||||
|
#include <CoreFoundation/CoreFoundation.h> |
||||||
|
#include "net_java_games_input_OSXHIDDevice.h" |
||||||
|
#include "util.h" |
||||||
|
#include "macosxutil.h" |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nReleaseDevice(JNIEnv *env, jclass unused, jlong device_address, jlong interface_address) { |
||||||
|
io_object_t hidDevice = (io_object_t)device_address; |
||||||
|
IOHIDDeviceInterface **device_interface = (IOHIDDeviceInterface **)(intptr_t)interface_address;; |
||||||
|
(*device_interface)->Release(device_interface); |
||||||
|
IOObjectRelease(hidDevice); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDevice_nGetDeviceProperties(JNIEnv *env, jclass unused, jlong device_address) { |
||||||
|
io_object_t hidDevice = (io_object_t)device_address; |
||||||
|
CFMutableDictionaryRef properties; |
||||||
|
|
||||||
|
kern_return_t result = IORegistryEntryCreateCFProperties(hidDevice, |
||||||
|
&properties, |
||||||
|
kCFAllocatorDefault, |
||||||
|
kNilOptions); |
||||||
|
if (result != KERN_SUCCESS) { |
||||||
|
throwIOException(env, "Failed to create properties for device (%ld)", result); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
jobject map = createMapFromCFDictionary(env, properties); |
||||||
|
CFRelease(properties); |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nOpen |
||||||
|
(JNIEnv * env, jclass unused, jlong lpDevice) { |
||||||
|
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice; |
||||||
|
IOReturn ioReturnValue = (*hidDeviceInterface)->open(hidDeviceInterface, 0); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Device open failed: %d", ioReturnValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nClose |
||||||
|
(JNIEnv * env, jclass unused, jlong lpDevice) { |
||||||
|
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice; |
||||||
|
IOReturn ioReturnValue = (*hidDeviceInterface)->close(hidDeviceInterface); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Device close failed: %d", ioReturnValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nGetElementValue |
||||||
|
(JNIEnv * env, jclass unused, jlong lpDevice, jlong hidCookie, jobject event_return) { |
||||||
|
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice; |
||||||
|
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)hidCookie; |
||||||
|
IOHIDEventStruct event; |
||||||
|
|
||||||
|
IOReturn ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Device getElementValue failed: %d", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
copyEvent(env, &event, event_return); |
||||||
|
if (event.longValue != NULL) { |
||||||
|
free(event.longValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDevice_nCreateQueue(JNIEnv *env, jclass unused, jlong device_address) { |
||||||
|
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)device_address; |
||||||
|
IOHIDQueueInterface **queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface); |
||||||
|
|
||||||
|
if (queue == NULL) { |
||||||
|
throwIOException(env, "Could not allocate queue"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return (jlong)(intptr_t)queue; |
||||||
|
} |
@ -0,0 +1,143 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <IOKit/IOTypes.h> |
||||||
|
#include <IOKit/IOKitLib.h> |
||||||
|
#include <IOKit/IOCFPlugIn.h> |
||||||
|
#include <IOKit/hid/IOHIDLib.h> |
||||||
|
#include <IOKit/hid/IOHIDKeys.h> |
||||||
|
#include <CoreFoundation/CoreFoundation.h> |
||||||
|
#include "net_java_games_input_OSXHIDDeviceIterator.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nCreateIterator(JNIEnv *env, jclass unused) { |
||||||
|
io_iterator_t hidObjectIterator; |
||||||
|
// Set up a matching dictionary to search the I/O Registry by class
|
||||||
|
// name for all HID class devices
|
||||||
|
//
|
||||||
|
CFMutableDictionaryRef hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey); |
||||||
|
|
||||||
|
// Now search I/O Registry for matching devices.
|
||||||
|
// IOServiceGetMatchingServices consumes a reference to the dictionary so we don't have to release it
|
||||||
|
IOReturn ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator); |
||||||
|
|
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Failed to create iterator (%ld)\n", ioReturnValue); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
if (hidObjectIterator == IO_OBJECT_NULL) { |
||||||
|
throwIOException(env, "Failed to create iterator\n"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return (jlong)hidObjectIterator; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nReleaseIterator(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
io_iterator_t iterator = (io_iterator_t)address; |
||||||
|
IOObjectRelease(iterator); |
||||||
|
} |
||||||
|
|
||||||
|
static IOHIDDeviceInterface **createHIDDevice(JNIEnv *env, io_object_t hidDevice) { |
||||||
|
// io_name_t className;
|
||||||
|
IOHIDDeviceInterface **hidDeviceInterface; |
||||||
|
IOCFPlugInInterface **plugInInterface; |
||||||
|
SInt32 score; |
||||||
|
|
||||||
|
/* ioReturnValue = IOObjectGetClass(hidDevice, className);
|
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
printfJava(env, "Failed to get IOObject class name."); |
||||||
|
} |
||||||
|
|
||||||
|
printfJava(env, "Found device type [%s]\n", className); |
||||||
|
*/
|
||||||
|
IOReturn ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice, |
||||||
|
kIOHIDDeviceUserClientTypeID, |
||||||
|
kIOCFPlugInInterfaceID, |
||||||
|
&plugInInterface, |
||||||
|
&score); |
||||||
|
|
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Couldn't create plugin for device interface (%ld)\n", ioReturnValue); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
//Call a method of the intermediate plug-in to create the device
|
||||||
|
//interface
|
||||||
|
//
|
||||||
|
HRESULT plugInResult = (*plugInInterface)->QueryInterface(plugInInterface, |
||||||
|
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), |
||||||
|
(LPVOID)&hidDeviceInterface); |
||||||
|
(*plugInInterface)->Release(plugInInterface); |
||||||
|
if (plugInResult != S_OK) { |
||||||
|
throwIOException(env, "Couldn't create HID class device interface (%ld)\n", plugInResult); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
return hidDeviceInterface; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nNext(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
io_iterator_t iterator = (io_iterator_t)address; |
||||||
|
io_object_t hidDevice; |
||||||
|
// io_string_t path;
|
||||||
|
// kern_return_t result;
|
||||||
|
|
||||||
|
hidDevice = IOIteratorNext(iterator); |
||||||
|
if (hidDevice == MACH_PORT_NULL) |
||||||
|
return NULL; |
||||||
|
/* IOResult result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
|
||||||
|
|
||||||
|
if (result != KERN_SUCCESS) { |
||||||
|
IOObjectRelease(hidDevice); |
||||||
|
throwIOException("Failed to get device path (%ld)\n", result); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
*/ |
||||||
|
IOHIDDeviceInterface **device_interface = createHIDDevice(env, hidDevice); |
||||||
|
if (device_interface == NULL) { |
||||||
|
IOObjectRelease(hidDevice); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
jobject device_object = newJObject(env, "net/java/games/input/OSXHIDDevice", "(JJ)V", (jlong)hidDevice, (jlong)(intptr_t)device_interface); |
||||||
|
if (device_object == NULL) { |
||||||
|
(*device_interface)->Release(device_interface); |
||||||
|
IOObjectRelease(hidDevice); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
return device_object; |
||||||
|
} |
@ -0,0 +1,135 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
|
||||||
|
#include <IOKit/IOTypes.h> |
||||||
|
#include <IOKit/IOKitLib.h> |
||||||
|
#include <IOKit/IOCFPlugIn.h> |
||||||
|
#include <IOKit/hid/IOHIDLib.h> |
||||||
|
#include <IOKit/hid/IOHIDKeys.h> |
||||||
|
#include <CoreFoundation/CoreFoundation.h> |
||||||
|
#include "net_java_games_input_OSXHIDQueue.h" |
||||||
|
#include "util.h" |
||||||
|
#include "macosxutil.h" |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nOpen(JNIEnv *env, jclass unused, jlong address, jint queue_depth) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOReturn ioReturnValue = (*queue)->create(queue, 0, queue_depth); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue open failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStart(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOReturn ioReturnValue = (*queue)->start(queue); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue start failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStop(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOReturn ioReturnValue = (*queue)->stop(queue); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue stop failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nClose(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOReturn ioReturnValue = (*queue)->dispose(queue); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue dispose failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nReleaseQueue(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOReturn ioReturnValue = (*queue)->Release(queue); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue Release failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nAddElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address; |
||||||
|
|
||||||
|
IOReturn ioReturnValue = (*queue)->addElement(queue, cookie, 0); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue addElement failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nRemoveElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address; |
||||||
|
|
||||||
|
IOReturn ioReturnValue = (*queue)->removeElement(queue, cookie); |
||||||
|
if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue removeElement failed: %d\n", ioReturnValue); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL Java_net_java_games_input_OSXHIDQueue_nGetNextEvent(JNIEnv *env, jclass unused, jlong address, jobject event_return) { |
||||||
|
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address; |
||||||
|
IOHIDEventStruct event; |
||||||
|
|
||||||
|
AbsoluteTime zeroTime = {0, 0}; |
||||||
|
IOReturn ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0); |
||||||
|
if (ioReturnValue == kIOReturnUnderrun) { |
||||||
|
return JNI_FALSE; |
||||||
|
} else if (ioReturnValue != kIOReturnSuccess) { |
||||||
|
throwIOException(env, "Queue getNextEvent failed: %d\n", ioReturnValue); |
||||||
|
return JNI_FALSE; |
||||||
|
} |
||||||
|
copyEvent(env, &event, event_return); |
||||||
|
if (event.longValue != NULL) { |
||||||
|
free(event.longValue); |
||||||
|
} |
||||||
|
return JNI_TRUE; |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
<?xml version="1.0"?> |
||||||
|
|
||||||
|
<project name="JInput dx8 port, Native code" basedir="." default="compile"> |
||||||
|
<property environment="env"/> |
||||||
|
<property name="sdkhome" location="${env.WindowsSdkDir}"/> |
||||||
|
<property name="generated-natives" location="..\..\..\target\generated-sources\natives"/> |
||||||
|
<property name="compiled-natives" location="..\..\..\target/natives"/> |
||||||
|
<property name="srcdir" location="."/> |
||||||
|
|
||||||
|
<target name="init"> |
||||||
|
<mkdir dir="${compiled-natives}"/> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="compile_dir"> |
||||||
|
<echo message="${compiledir}"/> |
||||||
|
<echo message="sdkhome: ${sdkhome}"/> |
||||||
|
<echo message="target arch: ${os.arch}"/> |
||||||
|
<echo message="sdkversion: ${env.WindowsSDKVersion}"/> |
||||||
|
<apply dir="${compiled-natives}" failonerror="true" executable="cl" dest="${compiled-natives}" skipemptyfilesets="true"> |
||||||
|
<arg line="/Ox /W2 /nologo /c"/> |
||||||
|
<arg value="/I${sdkhome}\include\${env.WindowsSDKVersion}um"/> |
||||||
|
<arg value="/I${java.home}\include"/> |
||||||
|
<arg value="/I${java.home}\include\win32"/> |
||||||
|
<arg value="/I${commonhome}\src\native"/> |
||||||
|
<arg value="/I${generated-natives}"/> |
||||||
|
<arg value="/I${srcdir}"/> |
||||||
|
<fileset dir="${compiledir}" includes="*.c"/> |
||||||
|
<mapper type="glob" from="*.c" to="*.obj"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="link"> |
||||||
|
<apply dir="${compiled-natives}" parallel="true" executable="cl" failonerror="true"> |
||||||
|
<arg line="/LD /nologo"/> |
||||||
|
<srcfile/> |
||||||
|
<arg line="/Fe${dllname} /link"/> |
||||||
|
<arg value="/LIBPATH:${java.home}\lib"/> |
||||||
|
<arg value="/LIBPATH:${sdkhomelib}"/> |
||||||
|
<arg line="/DLL ${libs}"/> |
||||||
|
<fileset dir="${compiled-natives}" includes="winutil.obj,util.obj,net_java_games_input_DummyWindow.obj,${include-pattern}"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="compile" depends="init"> |
||||||
|
<property name="rawlibs" value="Kernel32.lib User32.lib Setupapi.lib"/> |
||||||
|
<property name="dx8libs" value="Kernel32.lib dinput8.lib dxguid.lib User32.lib"/> |
||||||
|
<property name="commonhome" location="../../../../common"/> |
||||||
|
|
||||||
|
<condition property="dx8dllname" value="jinput-dx8.dll" else="jinput-dx8_64.dll"> |
||||||
|
<equals arg1="${os.arch}" arg2="x86"/> |
||||||
|
</condition> |
||||||
|
<condition property="rawdllname" value="jinput-raw.dll" else="jinput-raw_64.dll"> |
||||||
|
<equals arg1="${os.arch}" arg2="x86"/> |
||||||
|
</condition> |
||||||
|
<condition property="sdkhomelib" value="${sdkhome}\lib\${env.WindowsSDKVersion}um\x86" else="${sdkhome}\lib\${env.WindowsSDKVersion}um\x64"> |
||||||
|
<equals arg1="${os.arch}" arg2="x86"/> |
||||||
|
</condition> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="${commonhome}/src/native"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="."/> |
||||||
|
</antcall> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="raw"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="dx8"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="link"> |
||||||
|
<param name="dllname" value="${dx8dllname}"/> |
||||||
|
<param name="libs" value="${dx8libs}"/> |
||||||
|
<param name="include-pattern" value="net_java_games_input_IDirect*.obj"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="link"> |
||||||
|
<param name="dllname" value="${rawdllname}"/> |
||||||
|
<param name="libs" value="${rawlibs}"/> |
||||||
|
<param name="include-pattern" value="net_java_games_input_Raw*.obj"/> |
||||||
|
</antcall> |
||||||
|
</target> |
||||||
|
</project> |
@ -0,0 +1,13 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef DXVERSION_H |
||||||
|
#define DXVERSION_H |
||||||
|
|
||||||
|
#define DIRECTINPUT_VERSION 0x0800 |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,103 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <windows.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "dxversion.h" |
||||||
|
#include <dinput.h> |
||||||
|
#include "net_java_games_input_IDirectInput.h" |
||||||
|
#include "util.h" |
||||||
|
#include "winutil.h" |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
LPDIRECTINPUT8 lpDirectInput; |
||||||
|
JNIEnv *env; |
||||||
|
jobject obj; |
||||||
|
} enum_context_t; |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_IDirectInput_createIDirectInput(JNIEnv *env, jclass unused) { |
||||||
|
LPDIRECTINPUT8 lpDirectInput; |
||||||
|
HRESULT res = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, |
||||||
|
&IID_IDirectInput8, (void *)&lpDirectInput, NULL); |
||||||
|
if (FAILED(res)) { |
||||||
|
throwIOException(env, "Failed to create IDirectInput8 (%d)\n", res); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return (jlong)(INT_PTR)lpDirectInput; |
||||||
|
} |
||||||
|
|
||||||
|
static BOOL CALLBACK enumerateDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID context) { |
||||||
|
enum_context_t *enum_context = (enum_context_t *)context; |
||||||
|
// LPCDIDATAFORMAT lpDataFormat;
|
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice; |
||||||
|
DWORD device_type; |
||||||
|
DWORD device_subtype; |
||||||
|
HRESULT res; |
||||||
|
jclass obj_class; |
||||||
|
jmethodID IDirectInput_addDevice; |
||||||
|
jstring instance_name; |
||||||
|
jstring product_name; |
||||||
|
jbyteArray instance_guid; |
||||||
|
jbyteArray product_guid; |
||||||
|
|
||||||
|
instance_guid = wrapGUID(enum_context->env, &(lpddi->guidInstance)); |
||||||
|
if (instance_guid == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
product_guid = wrapGUID(enum_context->env, &(lpddi->guidProduct)); |
||||||
|
if (product_guid == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
instance_name = (*enum_context->env)->NewStringUTF(enum_context->env, lpddi->tszInstanceName); |
||||||
|
if (instance_name == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
product_name = (*enum_context->env)->NewStringUTF(enum_context->env, lpddi->tszProductName); |
||||||
|
if (product_name == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
|
||||||
|
obj_class = (*enum_context->env)->GetObjectClass(enum_context->env, enum_context->obj); |
||||||
|
if (obj_class == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
|
||||||
|
IDirectInput_addDevice = (*enum_context->env)->GetMethodID(enum_context->env, obj_class, "addDevice", "(J[B[BIILjava/lang/String;Ljava/lang/String;)V"); |
||||||
|
if (IDirectInput_addDevice == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
|
||||||
|
res = IDirectInput8_CreateDevice(enum_context->lpDirectInput, &(lpddi->guidInstance), &lpDevice, NULL); |
||||||
|
if (FAILED(res)) { |
||||||
|
throwIOException(enum_context->env, "Failed to create device (%d)\n", res); |
||||||
|
return DIENUM_STOP; |
||||||
|
} |
||||||
|
|
||||||
|
device_type = GET_DIDEVICE_TYPE(lpddi->dwDevType); |
||||||
|
device_subtype = GET_DIDEVICE_SUBTYPE(lpddi->dwDevType); |
||||||
|
|
||||||
|
(*enum_context->env)->CallVoidMethod(enum_context->env, enum_context->obj, IDirectInput_addDevice, (jlong)(INT_PTR)lpDevice, instance_guid, product_guid, (jint)device_type, (jint)device_subtype, instance_name, product_name); |
||||||
|
if ((*enum_context->env)->ExceptionOccurred(enum_context->env) != NULL) { |
||||||
|
IDirectInputDevice8_Release(lpDevice); |
||||||
|
return DIENUM_STOP; |
||||||
|
} |
||||||
|
|
||||||
|
return DIENUM_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_IDirectInput_nEnumDevices(JNIEnv *env, jobject obj, jlong address) { |
||||||
|
LPDIRECTINPUT8 lpDirectInput = (LPDIRECTINPUT8)(INT_PTR)address; |
||||||
|
HRESULT res; |
||||||
|
|
||||||
|
enum_context_t enum_context; |
||||||
|
enum_context.lpDirectInput = lpDirectInput; |
||||||
|
enum_context.env = env; |
||||||
|
enum_context.obj = obj; |
||||||
|
res = IDirectInput8_EnumDevices(lpDirectInput, DI8DEVCLASS_ALL, enumerateDevicesCallback, &enum_context, DIEDFL_ATTACHEDONLY); |
||||||
|
if (FAILED(res)) { |
||||||
|
throwIOException(env, "Failed to enumerate devices (%d)\n", res); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_IDirectInput_nRelease(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUT8 lpDirectInput = (LPDIRECTINPUT8)(INT_PTR)address; |
||||||
|
IDirectInput8_Release(lpDirectInput); |
||||||
|
} |
@ -0,0 +1,502 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <windows.h> |
||||||
|
#include "dxversion.h" |
||||||
|
#include <jni.h> |
||||||
|
#include <dinput.h> |
||||||
|
#include "net_java_games_input_IDirectInputDevice.h" |
||||||
|
#include "util.h" |
||||||
|
#include "winutil.h" |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
JNIEnv *env; |
||||||
|
jobject device_obj; |
||||||
|
} enum_context_t; |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nSetBufferSize(JNIEnv *env, jclass unused, jlong address, jint size) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
DIPROPDWORD dipropdw; |
||||||
|
HRESULT res; |
||||||
|
|
||||||
|
dipropdw.diph.dwSize = sizeof(DIPROPDWORD); |
||||||
|
dipropdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); |
||||||
|
dipropdw.diph.dwObj = 0; |
||||||
|
dipropdw.diph.dwHow = DIPH_DEVICE; |
||||||
|
dipropdw.dwData = size; |
||||||
|
res = IDirectInputDevice8_SetProperty(lpDevice, DIPROP_BUFFERSIZE, &dipropdw.diph); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
static jint mapGUIDType(const GUID *guid) { |
||||||
|
if (IsEqualGUID(guid, &GUID_XAxis)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_XAxis; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_YAxis)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_YAxis; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_ZAxis)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_ZAxis; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_RxAxis)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_RxAxis; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_RyAxis)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_RyAxis; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_RzAxis)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_RzAxis; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Slider)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Slider; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Button)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Button; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Key)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Key; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_POV)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_POV; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_ConstantForce)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_ConstantForce; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_RampForce)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_RampForce; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Square)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Square; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Sine)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Sine; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Triangle)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Triangle; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_SawtoothUp)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_SawtoothUp; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_SawtoothDown)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_SawtoothDown; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Spring)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Spring; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Damper)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Damper; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Inertia)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Inertia; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_Friction)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Friction; |
||||||
|
} else if (IsEqualGUID(guid, &GUID_CustomForce)) { |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_CustomForce; |
||||||
|
} else |
||||||
|
return net_java_games_input_IDirectInputDevice_GUID_Unknown; |
||||||
|
} |
||||||
|
|
||||||
|
static BOOL CALLBACK enumEffectsCallback(LPCDIEFFECTINFO pdei, LPVOID pvRef) { |
||||||
|
enum_context_t *enum_context = (enum_context_t *)pvRef; |
||||||
|
jmethodID add_method; |
||||||
|
jstring name; |
||||||
|
jbyteArray guid; |
||||||
|
JNIEnv *env = enum_context->env; |
||||||
|
jobject device_obj = enum_context->device_obj; |
||||||
|
jint guid_id; |
||||||
|
jclass obj_class = (*env)->GetObjectClass(env, device_obj); |
||||||
|
|
||||||
|
|
||||||
|
if (obj_class == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
guid = wrapGUID(env, &(pdei->guid)); |
||||||
|
if (guid == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
add_method = (*env)->GetMethodID(env, obj_class, "addEffect", "([BIIIILjava/lang/String;)V"); |
||||||
|
if (add_method == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
name = (*env)->NewStringUTF(env, pdei->tszName); |
||||||
|
if (name == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
guid_id = mapGUIDType(&(pdei->guid)); |
||||||
|
(*env)->CallBooleanMethod(env, device_obj, add_method, guid, guid_id, (jint)pdei->dwEffType, (jint)pdei->dwStaticParams, (jint)pdei->dwDynamicParams, name); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
return DIENUM_STOP; |
||||||
|
} |
||||||
|
return DIENUM_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
static BOOL CALLBACK enumObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { |
||||||
|
enum_context_t *enum_context = (enum_context_t *)pvRef; |
||||||
|
jmethodID add_method; |
||||||
|
jstring name; |
||||||
|
DWORD instance; |
||||||
|
DWORD type; |
||||||
|
jint guid_type; |
||||||
|
jbyteArray guid; |
||||||
|
JNIEnv *env = enum_context->env; |
||||||
|
jobject device_obj = enum_context->device_obj; |
||||||
|
jclass obj_class = (*env)->GetObjectClass(env, device_obj); |
||||||
|
|
||||||
|
if (obj_class == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
guid = wrapGUID(env, &(lpddoi->guidType)); |
||||||
|
if (guid == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
add_method = (*env)->GetMethodID(env, obj_class, "addObject", "([BIIIIILjava/lang/String;)V"); |
||||||
|
if (add_method == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
name = (*env)->NewStringUTF(env, lpddoi->tszName); |
||||||
|
if (name == NULL) |
||||||
|
return DIENUM_STOP; |
||||||
|
instance = DIDFT_GETINSTANCE(lpddoi->dwType); |
||||||
|
type = DIDFT_GETTYPE(lpddoi->dwType); |
||||||
|
guid_type = mapGUIDType(&(lpddoi->guidType)); |
||||||
|
//printfJava(env, "name %s guid_type %d id %d\n", lpddoi->tszName, guid_type, lpddoi->dwType);
|
||||||
|
(*env)->CallBooleanMethod(env, device_obj, add_method, guid, (jint)guid_type, (jint)lpddoi->dwType, (jint)type, (jint)instance, (jint)lpddoi->dwFlags, name); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
return DIENUM_STOP; |
||||||
|
} |
||||||
|
return DIENUM_CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nGetRangeProperty(JNIEnv *env, jclass unused, jlong address, jint object_id, jlongArray range_array_obj) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
DIPROPRANGE range; |
||||||
|
HRESULT res; |
||||||
|
jlong range_array[2]; |
||||||
|
|
||||||
|
range.diph.dwSize = sizeof(DIPROPRANGE); |
||||||
|
range.diph.dwHeaderSize = sizeof(DIPROPHEADER); |
||||||
|
range.diph.dwObj = object_id; |
||||||
|
range.diph.dwHow = DIPH_BYID; |
||||||
|
res = IDirectInputDevice8_GetProperty(lpDevice, DIPROP_RANGE, &(range.diph)); |
||||||
|
range_array[0] = range.lMin; |
||||||
|
range_array[1] = range.lMax; |
||||||
|
(*env)->SetLongArrayRegion(env, range_array_obj, 0, 2, range_array); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nGetDeadzoneProperty(JNIEnv *env, jclass unused, jlong address, jint object_id) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
DIPROPDWORD deadzone; |
||||||
|
HRESULT res; |
||||||
|
|
||||||
|
deadzone.diph.dwSize = sizeof(deadzone); |
||||||
|
deadzone.diph.dwHeaderSize = sizeof(DIPROPHEADER); |
||||||
|
deadzone.diph.dwObj = object_id; |
||||||
|
deadzone.diph.dwHow = DIPH_BYID; |
||||||
|
res = IDirectInputDevice8_GetProperty(lpDevice, DIPROP_DEADZONE, &(deadzone.diph)); |
||||||
|
if (res != DI_OK && res != S_FALSE) |
||||||
|
throwIOException(env, "Failed to get deadzone property (%x)\n", res); |
||||||
|
return deadzone.dwData; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nSetDataFormat(JNIEnv *env, jclass unused, jlong address, jint flags, jobjectArray objects) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
DIDATAFORMAT data_format; |
||||||
|
jsize num_objects = (*env)->GetArrayLength(env, objects); |
||||||
|
/*
|
||||||
|
* Data size must be a multiple of 4, but since sizeof(jint) is |
||||||
|
* 4, we're safe |
||||||
|
*/ |
||||||
|
DWORD data_size = num_objects*sizeof(jint); |
||||||
|
GUID *guids; |
||||||
|
DIOBJECTDATAFORMAT *object_formats; |
||||||
|
int i; |
||||||
|
HRESULT res; |
||||||
|
jclass clazz; |
||||||
|
jmethodID getGUID_method; |
||||||
|
jmethodID getFlags_method; |
||||||
|
jmethodID getType_method; |
||||||
|
jmethodID getInstance_method; |
||||||
|
jobject object; |
||||||
|
jint type; |
||||||
|
jint object_flags; |
||||||
|
jint instance; |
||||||
|
jobject guid_array; |
||||||
|
DWORD composite_type; |
||||||
|
DWORD flags_masked; |
||||||
|
LPDIOBJECTDATAFORMAT object_format; |
||||||
|
|
||||||
|
data_format.dwSize = sizeof(DIDATAFORMAT); |
||||||
|
data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT); |
||||||
|
data_format.dwFlags = flags; |
||||||
|
data_format.dwDataSize = data_size; |
||||||
|
data_format.dwNumObjs = num_objects; |
||||||
|
|
||||||
|
clazz = (*env)->FindClass(env, "net/java/games/input/DIDeviceObject"); |
||||||
|
if (clazz == NULL) |
||||||
|
return -1; |
||||||
|
getGUID_method = (*env)->GetMethodID(env, clazz, "getGUID", "()[B"); |
||||||
|
if (getGUID_method == NULL) |
||||||
|
return -1; |
||||||
|
getFlags_method = (*env)->GetMethodID(env, clazz, "getFlags", "()I"); |
||||||
|
if (getFlags_method == NULL) |
||||||
|
return -1; |
||||||
|
getType_method = (*env)->GetMethodID(env, clazz, "getType", "()I"); |
||||||
|
if (getType_method == NULL) |
||||||
|
return -1; |
||||||
|
getInstance_method = (*env)->GetMethodID(env, clazz, "getInstance", "()I"); |
||||||
|
if (getInstance_method == NULL) |
||||||
|
return -1; |
||||||
|
|
||||||
|
guids = (GUID *)malloc(num_objects*sizeof(GUID)); |
||||||
|
if (guids == NULL) { |
||||||
|
throwIOException(env, "Failed to allocate GUIDs"); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
object_formats = (DIOBJECTDATAFORMAT *)malloc(num_objects*sizeof(DIOBJECTDATAFORMAT)); |
||||||
|
if (object_formats == NULL) { |
||||||
|
free(guids); |
||||||
|
throwIOException(env, "Failed to allocate data format"); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
for (i = 0; i < num_objects; i++) { |
||||||
|
object = (*env)->GetObjectArrayElement(env, objects, i); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
guid_array = (*env)->CallObjectMethod(env, object, getGUID_method); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
unwrapGUID(env, guid_array, guids + i); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
type = (*env)->CallIntMethod(env, object, getType_method); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
object_flags = (*env)->CallIntMethod(env, object, getFlags_method); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
instance = (*env)->CallIntMethod(env, object, getInstance_method); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
(*env)->DeleteLocalRef(env, object); |
||||||
|
composite_type = type | DIDFT_MAKEINSTANCE(instance); |
||||||
|
flags_masked = flags & (DIDOI_ASPECTACCEL | DIDOI_ASPECTFORCE | DIDOI_ASPECTPOSITION | DIDOI_ASPECTVELOCITY);
|
||||||
|
object_format = object_formats + i; |
||||||
|
object_format->pguid = guids + i; |
||||||
|
object_format->dwType = composite_type; |
||||||
|
object_format->dwFlags = flags_masked; |
||||||
|
// dwOfs must be multiple of 4, but sizeof(jint) is 4, so we're safe
|
||||||
|
object_format->dwOfs = i*sizeof(jint); |
||||||
|
} |
||||||
|
data_format.rgodf = object_formats; |
||||||
|
res = IDirectInputDevice8_SetDataFormat(lpDevice, &data_format); |
||||||
|
free(guids); |
||||||
|
free(object_formats); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nAcquire(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
|
||||||
|
HRESULT res = IDirectInputDevice8_Acquire(lpDevice); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nUnacquire(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
|
||||||
|
HRESULT res = IDirectInputDevice8_Unacquire(lpDevice); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nPoll(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
|
||||||
|
HRESULT res = IDirectInputDevice8_Poll(lpDevice); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nGetDeviceState(JNIEnv *env, jclass unused, jlong address, jintArray device_state_array) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
jsize state_length = (*env)->GetArrayLength(env, device_state_array); |
||||||
|
DWORD state_size = state_length*sizeof(jint); |
||||||
|
HRESULT res; |
||||||
|
jint *device_state = (*env)->GetIntArrayElements(env, device_state_array, NULL); |
||||||
|
if (device_state == NULL) |
||||||
|
return -1; |
||||||
|
|
||||||
|
res = IDirectInputDevice8_GetDeviceState(lpDevice, state_size, device_state); |
||||||
|
(*env)->ReleaseIntArrayElements(env, device_state_array, device_state, 0); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nGetDeviceData(JNIEnv *env, jclass unused, jlong address, jint flags, jobject queue, jobject queue_array, jint position, jint remaining) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
DWORD num_events = remaining; |
||||||
|
DIDEVICEOBJECTDATA *data; |
||||||
|
DIDEVICEOBJECTDATA *data_element; |
||||||
|
jmethodID set_method; |
||||||
|
HRESULT res; |
||||||
|
int i; |
||||||
|
jclass data_class; |
||||||
|
jclass queue_class; |
||||||
|
jmethodID position_method; |
||||||
|
|
||||||
|
data_class = (*env)->FindClass(env, "net/java/games/input/DIDeviceObjectData"); |
||||||
|
if (data_class == NULL) |
||||||
|
return -1; |
||||||
|
set_method = (*env)->GetMethodID(env, data_class, "set", "(IIII)V"); |
||||||
|
if (set_method == NULL) |
||||||
|
return -1; |
||||||
|
queue_class = (*env)->GetObjectClass(env, queue); |
||||||
|
if (queue_class == NULL) |
||||||
|
return -1; |
||||||
|
position_method = (*env)->GetMethodID(env, queue_class, "position", "(I)V"); |
||||||
|
if (position_method == NULL) |
||||||
|
return -1; |
||||||
|
|
||||||
|
data = (DIDEVICEOBJECTDATA *)malloc(num_events*sizeof(DIDEVICEOBJECTDATA)); |
||||||
|
if (data == NULL) |
||||||
|
return -1; |
||||||
|
|
||||||
|
res = IDirectInputDevice8_GetDeviceData(lpDevice, sizeof(DIDEVICEOBJECTDATA), data, &num_events, flags); |
||||||
|
if (res == DI_OK || res == DI_BUFFEROVERFLOW) { |
||||||
|
for (i = 0; i < num_events; i++) { |
||||||
|
jobject queue_element = (*env)->GetObjectArrayElement(env, queue_array, position + i); |
||||||
|
if (queue_element == NULL) { |
||||||
|
free(data); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
data_element = data + i; |
||||||
|
(*env)->CallVoidMethod(env, queue_element, set_method, (jint)data_element->dwOfs, (jint)data_element->dwData, (jint)data_element->dwTimeStamp, (jint)data_element->dwSequence); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(data); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
(*env)->CallVoidMethod(env, queue, position_method, position + num_events); |
||||||
|
} |
||||||
|
free(data); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nEnumEffects(JNIEnv *env, jobject device_obj, jlong address, jint flags) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
HRESULT res; |
||||||
|
enum_context_t enum_context; |
||||||
|
|
||||||
|
enum_context.env = env; |
||||||
|
enum_context.device_obj = device_obj; |
||||||
|
res = IDirectInputDevice8_EnumEffects(lpDevice, enumEffectsCallback, &enum_context, flags); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nEnumObjects(JNIEnv *env, jobject device_obj, jlong address, jint flags) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
HRESULT res; |
||||||
|
enum_context_t enum_context; |
||||||
|
|
||||||
|
enum_context.env = env; |
||||||
|
enum_context.device_obj = device_obj; |
||||||
|
res = IDirectInputDevice8_EnumObjects(lpDevice, enumObjectsCallback, &enum_context, flags); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputDevice_nSetCooperativeLevel(JNIEnv *env, jclass unused, jlong address, jlong hwnd_address, jint flags) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
HWND hwnd = (HWND)(INT_PTR)hwnd_address; |
||||||
|
|
||||||
|
HRESULT res = IDirectInputDevice8_SetCooperativeLevel(lpDevice, hwnd, flags); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_IDirectInputDevice_nRelease(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
|
||||||
|
IDirectInputDevice8_Release(lpDevice); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_IDirectInputDevice_nCreatePeriodicEffect(JNIEnv *env, jclass unused, jlong address, jbyteArray effect_guid_array, jint flags, jint duration, jint sample_period, jint gain, jint trigger_button, jint trigger_repeat_interval, jintArray axis_ids_array, jlongArray directions_array, jint envelope_attack_level, jint envelope_attack_time, jint envelope_fade_level, jint envelope_fade_time, jint periodic_magnitude, jint periodic_offset, jint periodic_phase, jint periodic_period, jint start_delay) { |
||||||
|
LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(INT_PTR)address; |
||||||
|
LPDIRECTINPUTEFFECT lpdiEffect; |
||||||
|
DIEFFECT effect; |
||||||
|
GUID effect_guid; |
||||||
|
jint *axis_ids; |
||||||
|
jlong *directions; |
||||||
|
jsize num_axes; |
||||||
|
jsize num_directions; |
||||||
|
LONG *directions_long; |
||||||
|
DWORD *axis_ids_dword; |
||||||
|
HRESULT res; |
||||||
|
DIPERIODIC periodic; |
||||||
|
DIENVELOPE envelope; |
||||||
|
int i; |
||||||
|
|
||||||
|
num_axes = (*env)->GetArrayLength(env, axis_ids_array); |
||||||
|
num_directions = (*env)->GetArrayLength(env, directions_array); |
||||||
|
|
||||||
|
if (num_axes != num_directions) { |
||||||
|
throwIOException(env, "axis_ids.length != directions.length\n"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
unwrapGUID(env, effect_guid_array, &effect_guid); |
||||||
|
if ((*env)->ExceptionOccurred(env)) |
||||||
|
return 0; |
||||||
|
axis_ids = (*env)->GetIntArrayElements(env, axis_ids_array, NULL); |
||||||
|
if (axis_ids == NULL) |
||||||
|
return 0; |
||||||
|
directions = (*env)->GetLongArrayElements(env, directions_array, NULL); |
||||||
|
if (axis_ids == NULL) |
||||||
|
return 0; |
||||||
|
axis_ids_dword = (DWORD *)malloc(sizeof(DWORD)*num_axes); |
||||||
|
if (axis_ids_dword == NULL) { |
||||||
|
throwIOException(env, "Failed to allocate axes array\n"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
directions_long = (LONG *)malloc(sizeof(LONG)*num_directions); |
||||||
|
if (directions_long == NULL) { |
||||||
|
free(axis_ids_dword); |
||||||
|
throwIOException(env, "Failed to allocate directions array\n"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
for (i = 0; i < num_axes; i++) { |
||||||
|
axis_ids_dword[i] = axis_ids[i]; |
||||||
|
} |
||||||
|
for (i = 0; i < num_directions; i++) { |
||||||
|
directions_long[i] = directions[i]; |
||||||
|
} |
||||||
|
|
||||||
|
envelope.dwSize = sizeof(DIENVELOPE); |
||||||
|
envelope.dwAttackLevel = envelope_attack_level; |
||||||
|
envelope.dwAttackTime = envelope_attack_time; |
||||||
|
envelope.dwFadeLevel = envelope_fade_level; |
||||||
|
envelope.dwFadeTime = envelope_fade_time; |
||||||
|
|
||||||
|
periodic.dwMagnitude = periodic_magnitude; |
||||||
|
periodic.lOffset = periodic_offset; |
||||||
|
periodic.dwPhase = periodic_phase; |
||||||
|
periodic.dwPeriod = periodic_period; |
||||||
|
|
||||||
|
effect.dwSize = sizeof(DIEFFECT); |
||||||
|
effect.dwFlags = flags; |
||||||
|
effect.dwDuration = duration; |
||||||
|
effect.dwSamplePeriod = sample_period; |
||||||
|
effect.dwGain = gain; |
||||||
|
effect.dwTriggerButton = trigger_button; |
||||||
|
effect.dwTriggerRepeatInterval = trigger_repeat_interval; |
||||||
|
effect.cAxes = num_axes; |
||||||
|
effect.rgdwAxes = axis_ids_dword; |
||||||
|
effect.rglDirection = directions_long; |
||||||
|
effect.lpEnvelope = &envelope; |
||||||
|
effect.cbTypeSpecificParams = sizeof(periodic); |
||||||
|
effect.lpvTypeSpecificParams = &periodic; |
||||||
|
effect.dwStartDelay = start_delay; |
||||||
|
|
||||||
|
res = IDirectInputDevice8_CreateEffect(lpDevice, &effect_guid, &effect, &lpdiEffect, NULL); |
||||||
|
(*env)->ReleaseIntArrayElements(env, axis_ids_array, axis_ids, 0); |
||||||
|
(*env)->ReleaseLongArrayElements(env, directions_array, directions, 0); |
||||||
|
free(axis_ids_dword); |
||||||
|
free(directions_long); |
||||||
|
if (res != DI_OK) { |
||||||
|
throwIOException(env, "Failed to create effect (0x%x)\n", res); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return (jlong)(INT_PTR)lpdiEffect; |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <windows.h> |
||||||
|
#include "dxversion.h" |
||||||
|
#include <jni.h> |
||||||
|
#include <dinput.h> |
||||||
|
#include "net_java_games_input_IDirectInputEffect.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_IDirectInputEffect_nRelease(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUTEFFECT ppdeff = (LPDIRECTINPUTEFFECT)(INT_PTR)address; |
||||||
|
|
||||||
|
IDirectInputEffect_Release(ppdeff); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputEffect_nSetGain(JNIEnv *env, jclass unused, jlong address, jint gain) { |
||||||
|
LPDIRECTINPUTEFFECT ppdeff = (LPDIRECTINPUTEFFECT)(INT_PTR)address; |
||||||
|
DIEFFECT params; |
||||||
|
|
||||||
|
ZeroMemory(¶ms, sizeof(params)); |
||||||
|
params.dwSize = sizeof(params); |
||||||
|
params.dwGain = gain; |
||||||
|
|
||||||
|
return IDirectInputEffect_SetParameters(ppdeff, ¶ms, DIEP_GAIN); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputEffect_nStart(JNIEnv *env, jclass unused, jlong address, jint iterations, jint flags) { |
||||||
|
LPDIRECTINPUTEFFECT ppdeff = (LPDIRECTINPUTEFFECT)(INT_PTR)address; |
||||||
|
|
||||||
|
return IDirectInputEffect_Start(ppdeff, iterations, flags); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_IDirectInputEffect_nStop(JNIEnv *env, jclass unused, jlong address) { |
||||||
|
LPDIRECTINPUTEFFECT ppdeff = (LPDIRECTINPUTEFFECT)(INT_PTR)address; |
||||||
|
|
||||||
|
return IDirectInputEffect_Stop(ppdeff); |
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <windows.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "net_java_games_input_DummyWindow.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
static const TCHAR* DUMMY_WINDOW_NAME = "JInputControllerWindow"; |
||||||
|
|
||||||
|
static LRESULT CALLBACK DummyWndProc( |
||||||
|
HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { |
||||||
|
return DefWindowProc(hWnd, message, wParam, lParam); |
||||||
|
} |
||||||
|
|
||||||
|
static BOOL RegisterDummyWindow(HINSTANCE hInstance) |
||||||
|
{ |
||||||
|
WNDCLASSEX wcex; |
||||||
|
wcex.cbSize = sizeof(WNDCLASSEX);
|
||||||
|
wcex.style = CS_HREDRAW | CS_VREDRAW; |
||||||
|
wcex.lpfnWndProc = (WNDPROC)DummyWndProc; |
||||||
|
wcex.cbClsExtra = 0; |
||||||
|
wcex.cbWndExtra = 0; |
||||||
|
wcex.hInstance = hInstance; |
||||||
|
wcex.hIcon = NULL; |
||||||
|
wcex.hCursor = NULL; |
||||||
|
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); |
||||||
|
wcex.lpszMenuName = (LPCSTR)NULL; |
||||||
|
wcex.lpszClassName = DUMMY_WINDOW_NAME; |
||||||
|
wcex.hIconSm = NULL; |
||||||
|
return RegisterClassEx(&wcex); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_DummyWindow_createWindow(JNIEnv *env, jclass unused) { |
||||||
|
HINSTANCE hInst = GetModuleHandle(NULL); |
||||||
|
HWND hwndDummy; |
||||||
|
WNDCLASSEX class_info; |
||||||
|
class_info.cbSize = sizeof(WNDCLASSEX); |
||||||
|
class_info.cbClsExtra = 0; |
||||||
|
class_info.cbWndExtra = 0; |
||||||
|
|
||||||
|
if (!GetClassInfoEx(hInst, DUMMY_WINDOW_NAME, &class_info)) { |
||||||
|
// Register the dummy input window
|
||||||
|
if (!RegisterDummyWindow(hInst)) { |
||||||
|
throwIOException(env, "Failed to register window class (%d)\n", GetLastError()); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Create the dummy input window
|
||||||
|
hwndDummy = CreateWindow(DUMMY_WINDOW_NAME, NULL, |
||||||
|
WS_POPUP | WS_ICONIC, |
||||||
|
0, 0, 0, 0, NULL, NULL, hInst, NULL); |
||||||
|
if (hwndDummy == NULL) { |
||||||
|
throwIOException(env, "Failed to create window (%d)\n", GetLastError()); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return (jlong)(intptr_t)hwndDummy; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_DummyWindow_nDestroy(JNIEnv *env, jclass unused, jlong hwnd_address) { |
||||||
|
HWND hwndDummy = (HWND)(INT_PTR)hwnd_address; |
||||||
|
BOOL result = DestroyWindow(hwndDummy); |
||||||
|
if (!result) { |
||||||
|
throwIOException(env, "Failed to destroy window (%d)\n", GetLastError()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "rawwinver.h" |
||||||
|
#include <windows.h> |
||||||
|
#include <winuser.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "net_java_games_input_RawDevice.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_net_java_games_input_RawDevice_nGetName(JNIEnv *env, jclass unused, jlong handle_addr) { |
||||||
|
HANDLE handle = (HANDLE)(INT_PTR)handle_addr; |
||||||
|
UINT res; |
||||||
|
UINT name_length; |
||||||
|
char *name; |
||||||
|
jstring name_str; |
||||||
|
|
||||||
|
res = GetRawInputDeviceInfo(handle, RIDI_DEVICENAME, NULL, &name_length); |
||||||
|
name = (char *)malloc(name_length*sizeof(char)); |
||||||
|
res = GetRawInputDeviceInfo(handle, RIDI_DEVICENAME, name, &name_length); |
||||||
|
if ((UINT)-1 == res) { |
||||||
|
free(name); |
||||||
|
throwIOException(env, "Failed to get device name (%d)\n", GetLastError()); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
name_str = (*env)->NewStringUTF(env, name); |
||||||
|
free(name); |
||||||
|
return name_str; |
||||||
|
} |
||||||
|
|
||||||
|
static jobject createKeyboardInfo(JNIEnv *env, jobject device_obj, RID_DEVICE_INFO_KEYBOARD *device_info) { |
||||||
|
return newJObject(env, "net/java/games/input/RawKeyboardInfo", "(Lnet/java/games/input/RawDevice;IIIIII)V", device_obj, (jint)device_info->dwType, (jint)device_info->dwSubType, (jint)device_info->dwKeyboardMode, (jint)device_info->dwNumberOfFunctionKeys, (jint)device_info->dwNumberOfIndicators, (jint)device_info->dwNumberOfKeysTotal); |
||||||
|
} |
||||||
|
|
||||||
|
static jobject createMouseInfo(JNIEnv *env, jobject device_obj, RID_DEVICE_INFO_MOUSE *device_info) { |
||||||
|
return newJObject(env, "net/java/games/input/RawMouseInfo", "(Lnet/java/games/input/RawDevice;III)V", device_obj, (jint)device_info->dwId, (jint)device_info->dwNumberOfButtons, (jint)device_info->dwSampleRate); |
||||||
|
} |
||||||
|
|
||||||
|
static jobject createHIDInfo(JNIEnv *env, jobject device_obj, RID_DEVICE_INFO_HID *device_info) { |
||||||
|
return newJObject(env, "net/java/games/input/RawHIDInfo", "(Lnet/java/games/input/RawDevice;IIIII)V", device_obj, (jint)device_info->dwVendorId, (jint)device_info->dwProductId, (jint)device_info->dwVersionNumber, (jint)device_info->usUsagePage, (jint)device_info->usUsage); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL Java_net_java_games_input_RawDevice_nGetInfo(JNIEnv *env, jclass unused, jobject device_obj, jlong handle_addr) { |
||||||
|
HANDLE handle = (HANDLE)(INT_PTR)handle_addr; |
||||||
|
RID_DEVICE_INFO device_info; |
||||||
|
UINT size = sizeof(RID_DEVICE_INFO); |
||||||
|
UINT res; |
||||||
|
|
||||||
|
device_info.cbSize = sizeof(RID_DEVICE_INFO); |
||||||
|
res = GetRawInputDeviceInfo(handle, RIDI_DEVICEINFO, &device_info, &size); |
||||||
|
if ((UINT)-1 == res) { |
||||||
|
throwIOException(env, "Failed to get device info (%d)\n", GetLastError()); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
switch (device_info.dwType) { |
||||||
|
case RIM_TYPEHID: |
||||||
|
return createHIDInfo(env, device_obj,&(device_info.hid)); |
||||||
|
case RIM_TYPEKEYBOARD: |
||||||
|
return createKeyboardInfo(env, device_obj, &(device_info.keyboard)); |
||||||
|
case RIM_TYPEMOUSE: |
||||||
|
return createMouseInfo(env, device_obj, &(device_info.mouse)); |
||||||
|
default: |
||||||
|
throwIOException(env, "Unknown device type: %d\n", device_info.dwType); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,166 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "rawwinver.h" |
||||||
|
#include <windows.h> |
||||||
|
#include <setupapi.h> |
||||||
|
#include <devguid.h> |
||||||
|
#include <regstr.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "net_java_games_input_RawInputEnvironmentPlugin.h" |
||||||
|
#include "util.h" |
||||||
|
#include "winutil.h" |
||||||
|
|
||||||
|
JNIEXPORT jbyteArray JNICALL Java_net_java_games_input_RawInputEnvironmentPlugin_getKeyboardClassGUID(JNIEnv *env, jclass unused) { |
||||||
|
return wrapGUID(env, &GUID_DEVCLASS_KEYBOARD); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jbyteArray JNICALL Java_net_java_games_input_RawInputEnvironmentPlugin_getMouseClassGUID(JNIEnv *env, jclass unused) { |
||||||
|
return wrapGUID(env, &GUID_DEVCLASS_MOUSE); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_RawInputEnvironmentPlugin_nEnumSetupAPIDevices(JNIEnv *env, jclass unused, jbyteArray guid_array, jobject device_list) { |
||||||
|
jclass list_class; |
||||||
|
jmethodID add_method; |
||||||
|
HDEVINFO hDevInfo; |
||||||
|
SP_DEVINFO_DATA DeviceInfoData; |
||||||
|
int i; |
||||||
|
GUID setup_class_guid; |
||||||
|
jstring device_name; |
||||||
|
jstring device_instance_id; |
||||||
|
jobject setup_api_device; |
||||||
|
|
||||||
|
list_class = (*env)->GetObjectClass(env, device_list); |
||||||
|
if (list_class == NULL) |
||||||
|
return; |
||||||
|
add_method = (*env)->GetMethodID(env, list_class, "add", "(Ljava/lang/Object;)Z"); |
||||||
|
if (add_method == NULL) |
||||||
|
return; |
||||||
|
unwrapGUID(env, guid_array, &setup_class_guid); |
||||||
|
if ((*env)->ExceptionOccurred(env)) |
||||||
|
return; |
||||||
|
|
||||||
|
hDevInfo = SetupDiGetClassDevs(&setup_class_guid, |
||||||
|
NULL,
|
||||||
|
NULL, |
||||||
|
DIGCF_PRESENT); |
||||||
|
|
||||||
|
if (hDevInfo == INVALID_HANDLE_VALUE) { |
||||||
|
throwIOException(env, "Failed to create device enumerator (%d)\n", GetLastError()); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); |
||||||
|
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) { |
||||||
|
DWORD DataT; |
||||||
|
LPTSTR buffer = NULL; |
||||||
|
DWORD buffersize = 0; |
||||||
|
|
||||||
|
|
||||||
|
while (!SetupDiGetDeviceRegistryProperty( |
||||||
|
hDevInfo, |
||||||
|
&DeviceInfoData, |
||||||
|
SPDRP_DEVICEDESC, |
||||||
|
&DataT, |
||||||
|
(PBYTE)buffer, |
||||||
|
buffersize, |
||||||
|
&buffersize)) { |
||||||
|
if (buffer != NULL) |
||||||
|
free(buffer); |
||||||
|
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { |
||||||
|
buffer = malloc(buffersize); |
||||||
|
} else { |
||||||
|
throwIOException(env, "Failed to get device description (%x)\n", GetLastError()); |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
device_name = (*env)->NewStringUTF(env, buffer); |
||||||
|
if (device_name == NULL) { |
||||||
|
free(buffer); |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
while (!SetupDiGetDeviceInstanceId( |
||||||
|
hDevInfo, |
||||||
|
&DeviceInfoData, |
||||||
|
buffer, |
||||||
|
buffersize, |
||||||
|
&buffersize)) |
||||||
|
{ |
||||||
|
if (buffer != NULL) |
||||||
|
free(buffer); |
||||||
|
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { |
||||||
|
buffer = malloc(buffersize); |
||||||
|
} else { |
||||||
|
throwIOException(env, "Failed to get device instance id (%x)\n", GetLastError()); |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
device_instance_id = (*env)->NewStringUTF(env, buffer); |
||||||
|
if (buffer != NULL) |
||||||
|
free(buffer); |
||||||
|
if (device_instance_id == NULL) { |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
return; |
||||||
|
} |
||||||
|
setup_api_device = newJObject(env, "net/java/games/input/SetupAPIDevice", "(Ljava/lang/String;Ljava/lang/String;)V", device_instance_id, device_name); |
||||||
|
if (setup_api_device == NULL) { |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
return; |
||||||
|
} |
||||||
|
(*env)->CallBooleanMethod(env, device_list, add_method, setup_api_device); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
SetupDiDestroyDeviceInfoList(hDevInfo); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_RawInputEnvironmentPlugin_enumerateDevices(JNIEnv *env, jclass unused, jobject queue, jobject device_list) { |
||||||
|
UINT num_devices; |
||||||
|
UINT res; |
||||||
|
RAWINPUTDEVICELIST *devices; |
||||||
|
RAWINPUTDEVICELIST *device; |
||||||
|
jobject device_object; |
||||||
|
jclass list_class; |
||||||
|
jmethodID add_method; |
||||||
|
int i; |
||||||
|
|
||||||
|
list_class = (*env)->GetObjectClass(env, device_list); |
||||||
|
if (list_class == NULL) |
||||||
|
return; |
||||||
|
add_method = (*env)->GetMethodID(env, list_class, "add", "(Ljava/lang/Object;)Z"); |
||||||
|
if (add_method == NULL) |
||||||
|
return; |
||||||
|
|
||||||
|
res = GetRawInputDeviceList(NULL, &num_devices, sizeof(RAWINPUTDEVICELIST)); |
||||||
|
if ((UINT)-1 == res) { |
||||||
|
throwIOException(env, "Failed to get number of devices (%d)\n", GetLastError()); |
||||||
|
return; |
||||||
|
} |
||||||
|
devices = (RAWINPUTDEVICELIST *)malloc(num_devices*sizeof(RAWINPUTDEVICELIST)); |
||||||
|
GetRawInputDeviceList(devices, &num_devices, sizeof(RAWINPUTDEVICELIST)); |
||||||
|
for (i = 0; i < num_devices; i++) { |
||||||
|
device = devices + i; |
||||||
|
device_object = newJObject(env, "net/java/games/input/RawDevice", "(Lnet/java/games/input/RawInputEventQueue;JI)V", queue, (jlong)(INT_PTR)device->hDevice, (jint)device->dwType); |
||||||
|
if (device_object == NULL) { |
||||||
|
free(devices); |
||||||
|
return; |
||||||
|
} |
||||||
|
(*env)->CallBooleanMethod(env, device_list, add_method, device_object); |
||||||
|
(*env)->DeleteLocalRef(env, device_object); |
||||||
|
} |
||||||
|
free(devices); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,171 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "rawwinver.h" |
||||||
|
#include <windows.h> |
||||||
|
#include <jni.h> |
||||||
|
#include "net_java_games_input_RawInputEventQueue.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
static void handleMouseEvent(JNIEnv *env, jobject self, jmethodID add_method, LONG time, RAWINPUT *data) { |
||||||
|
(*env)->CallVoidMethod(env, self, add_method, |
||||||
|
(jlong)(INT_PTR)data->header.hDevice, |
||||||
|
(jlong)time, |
||||||
|
(jint)data->data.mouse.usFlags, |
||||||
|
(jint)data->data.mouse.usButtonFlags, |
||||||
|
/*
|
||||||
|
* The Raw Input spec says that the usButtonData |
||||||
|
* is a signed value, if RI_MOUSE_WHEEL |
||||||
|
* is set in usFlags. However, usButtonData |
||||||
|
* is an unsigned value, for unknown reasons, |
||||||
|
* and since its only known use is the wheel |
||||||
|
* delta, we'll convert it to a signed value here |
||||||
|
*/ |
||||||
|
(jint)(SHORT)data->data.mouse.usButtonData, |
||||||
|
(jlong)data->data.mouse.ulRawButtons, |
||||||
|
(jlong)data->data.mouse.lLastX, |
||||||
|
(jlong)data->data.mouse.lLastY, |
||||||
|
(jlong)data->data.mouse.ulExtraInformation |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
static void handleKeyboardEvent(JNIEnv *env, jobject self, jmethodID add_method, LONG time, RAWINPUT *data) { |
||||||
|
(*env)->CallVoidMethod(env, self, add_method, |
||||||
|
(jlong)(INT_PTR)data->header.hDevice, |
||||||
|
(jlong)time, |
||||||
|
(jint)data->data.keyboard.MakeCode, |
||||||
|
(jint)data->data.keyboard.Flags, |
||||||
|
(jint)data->data.keyboard.VKey, |
||||||
|
(jint)data->data.keyboard.Message, |
||||||
|
(jlong)data->data.keyboard.ExtraInformation |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_RawInputEventQueue_nRegisterDevices(JNIEnv *env, jclass unused, jint flags, jlong hwnd_addr, jobjectArray device_infos) { |
||||||
|
BOOL res; |
||||||
|
jclass device_info_class; |
||||||
|
jmethodID getUsage_method; |
||||||
|
jmethodID getUsagePage_method; |
||||||
|
RAWINPUTDEVICE *devices; |
||||||
|
RAWINPUTDEVICE *device; |
||||||
|
jsize num_devices = (*env)->GetArrayLength(env, device_infos); |
||||||
|
USHORT usage; |
||||||
|
USHORT usage_page; |
||||||
|
int i; |
||||||
|
HWND hwnd = (HWND)(INT_PTR)hwnd_addr; |
||||||
|
|
||||||
|
/* res = GetRegisteredRawInputDevices(NULL, &num_devices, sizeof(RAWINPUTDEVICE));
|
||||||
|
if (num_devices > 0) { |
||||||
|
devices = (RAWINPUTDEVICE *)malloc(num_devices*sizeof(RAWINPUTDEVICE)); |
||||||
|
res = GetRegisteredRawInputDevices(devices, &num_devices, sizeof(RAWINPUTDEVICE)); |
||||||
|
if (res == -1) { |
||||||
|
throwIOException(env, "Failed to get registered raw devices (%d)\n", GetLastError()); |
||||||
|
return; |
||||||
|
} |
||||||
|
for (i = 0; i < num_devices; i++) { |
||||||
|
printfJava(env, "from windows: registered: %d %d %p (of %d)\n", devices[i].usUsagePage, devices[i].usUsage, devices[i].hwndTarget, num_devices); |
||||||
|
} |
||||||
|
free(devices); |
||||||
|
}*/ |
||||||
|
device_info_class = (*env)->FindClass(env, "net/java/games/input/RawDeviceInfo"); |
||||||
|
if (device_info_class == NULL) |
||||||
|
return; |
||||||
|
getUsage_method = (*env)->GetMethodID(env, device_info_class, "getUsage", "()I"); |
||||||
|
if (getUsage_method == NULL) |
||||||
|
return; |
||||||
|
getUsagePage_method = (*env)->GetMethodID(env, device_info_class, "getUsagePage", "()I"); |
||||||
|
if (getUsagePage_method == NULL) |
||||||
|
return; |
||||||
|
devices = (RAWINPUTDEVICE *)malloc(num_devices*sizeof(RAWINPUTDEVICE)); |
||||||
|
if (devices == NULL) { |
||||||
|
throwIOException(env, "Failed to allocate device structs\n"); |
||||||
|
return; |
||||||
|
} |
||||||
|
for (i = 0; i < num_devices; i++) { |
||||||
|
jobject device_obj = (*env)->GetObjectArrayElement(env, device_infos, i); |
||||||
|
if (device_obj == NULL) { |
||||||
|
free(devices); |
||||||
|
return; |
||||||
|
} |
||||||
|
usage = (*env)->CallIntMethod(env, device_obj, getUsage_method); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(devices); |
||||||
|
return; |
||||||
|
} |
||||||
|
usage_page = (*env)->CallIntMethod(env, device_obj, getUsagePage_method); |
||||||
|
if ((*env)->ExceptionOccurred(env)) { |
||||||
|
free(devices); |
||||||
|
return; |
||||||
|
} |
||||||
|
device = devices + i; |
||||||
|
device->usUsagePage = usage_page; |
||||||
|
device->usUsage = usage; |
||||||
|
device->dwFlags = flags; |
||||||
|
device->hwndTarget = hwnd; |
||||||
|
} |
||||||
|
res = RegisterRawInputDevices(devices, num_devices, sizeof(RAWINPUTDEVICE)); |
||||||
|
free(devices); |
||||||
|
if (!res) |
||||||
|
throwIOException(env, "Failed to register raw devices (%d)\n", GetLastError()); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_RawInputEventQueue_nPoll(JNIEnv *env, jobject self, jlong hwnd_handle) { |
||||||
|
MSG msg; |
||||||
|
HWND hwnd = (HWND)(INT_PTR)hwnd_handle; |
||||||
|
jmethodID addMouseEvent_method; |
||||||
|
jmethodID addKeyboardEvent_method; |
||||||
|
UINT input_size; |
||||||
|
RAWINPUT *input_data; |
||||||
|
LONG time; |
||||||
|
jclass self_class = (*env)->GetObjectClass(env, self); |
||||||
|
|
||||||
|
if (self_class == NULL) |
||||||
|
return; |
||||||
|
addMouseEvent_method = (*env)->GetMethodID(env, self_class, "addMouseEvent", "(JJIIIJJJJ)V"); |
||||||
|
if (addMouseEvent_method == NULL) |
||||||
|
return; |
||||||
|
addKeyboardEvent_method = (*env)->GetMethodID(env, self_class, "addKeyboardEvent", "(JJIIIIJ)V"); |
||||||
|
if (addKeyboardEvent_method == NULL) |
||||||
|
return; |
||||||
|
if (GetMessage(&msg, hwnd, 0, 0) != 0) { |
||||||
|
if (msg.message != WM_INPUT) { |
||||||
|
DefWindowProc(hwnd, msg.message, msg.wParam, msg.lParam); |
||||||
|
return; // ignore it
|
||||||
|
} |
||||||
|
time = msg.time; |
||||||
|
if (GetRawInputData((HRAWINPUT)msg.lParam, RID_INPUT, NULL, &input_size, sizeof(RAWINPUTHEADER)) == (UINT)-1) { |
||||||
|
throwIOException(env, "Failed to get raw input data size (%d)\n", GetLastError()); |
||||||
|
DefWindowProc(hwnd, msg.message, msg.wParam, msg.lParam); |
||||||
|
return; |
||||||
|
} |
||||||
|
input_data = (RAWINPUT *)malloc(input_size); |
||||||
|
if (input_data == NULL) { |
||||||
|
throwIOException(env, "Failed to allocate input data buffer\n"); |
||||||
|
DefWindowProc(hwnd, msg.message, msg.wParam, msg.lParam); |
||||||
|
return; |
||||||
|
} |
||||||
|
if (GetRawInputData((HRAWINPUT)msg.lParam, RID_INPUT, input_data, &input_size, sizeof(RAWINPUTHEADER)) == (UINT)-1) { |
||||||
|
free(input_data); |
||||||
|
throwIOException(env, "Failed to get raw input data (%d)\n", GetLastError()); |
||||||
|
DefWindowProc(hwnd, msg.message, msg.wParam, msg.lParam); |
||||||
|
return; |
||||||
|
} |
||||||
|
switch (input_data->header.dwType) { |
||||||
|
case RIM_TYPEMOUSE: |
||||||
|
handleMouseEvent(env, self, addMouseEvent_method, time, input_data); |
||||||
|
break; |
||||||
|
case RIM_TYPEKEYBOARD: |
||||||
|
handleKeyboardEvent(env, self, addKeyboardEvent_method, time, input_data); |
||||||
|
break; |
||||||
|
default: |
||||||
|
/* ignore other types of message */ |
||||||
|
break; |
||||||
|
} |
||||||
|
free(input_data); |
||||||
|
DefWindowProc(hwnd, msg.message, msg.wParam, msg.lParam); |
||||||
|
}
|
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef RAWWINVER_H |
||||||
|
#define RAWWINVER_H |
||||||
|
|
||||||
|
#define _WIN32_WINNT 0x0501 |
||||||
|
#define WINVER 0x0501 |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,21 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "winutil.h" |
||||||
|
|
||||||
|
jbyteArray wrapGUID(JNIEnv *env, const GUID *guid) { |
||||||
|
jbyteArray guid_array = (*env)->NewByteArray(env, sizeof(GUID)); |
||||||
|
if (guid_array == NULL) |
||||||
|
return NULL; |
||||||
|
(*env)->SetByteArrayRegion(env, guid_array, 0, sizeof(GUID), (jbyte *)guid); |
||||||
|
return guid_array; |
||||||
|
} |
||||||
|
|
||||||
|
void unwrapGUID(JNIEnv *env, const jobjectArray byte_array, GUID *guid) { |
||||||
|
(*env)->GetByteArrayRegion(env, byte_array, 0, sizeof(GUID), (jbyte *)guid); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,17 @@ |
|||||||
|
/*
|
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef _WINUTIL_H |
||||||
|
#define _WINUTIL_H |
||||||
|
|
||||||
|
#include <windows.h> |
||||||
|
#include <jni.h> |
||||||
|
|
||||||
|
extern jbyteArray wrapGUID(JNIEnv *env, const GUID *guid); |
||||||
|
extern void unwrapGUID(JNIEnv *env, const jobjectArray byte_array, GUID *guid); |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,167 @@ |
|||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NAME |
||||||
|
Utils.c |
||||||
|
|
||||||
|
PURPOSE |
||||||
|
Some general-purpose functions for the WinTab demos. |
||||||
|
|
||||||
|
COPYRIGHT |
||||||
|
Copyright (c) Wacom Company, Ltd. 2014 All Rights Reserved |
||||||
|
All rights reserved. |
||||||
|
|
||||||
|
The text and information contained in this file may be freely used, |
||||||
|
copied, or distributed without compensation or licensing restrictions. |
||||||
|
|
||||||
|
---------------------------------------------------------------------------- */ |
||||||
|
|
||||||
|
#include "WinTabUtils.h" |
||||||
|
|
||||||
|
#ifdef WACOM_DEBUG |
||||||
|
|
||||||
|
void WacomTrace( char *lpszFormat, ...); |
||||||
|
|
||||||
|
#define WACOM_ASSERT( x ) assert( x ) |
||||||
|
#define WACOM_TRACE(...) WacomTrace(__VA_ARGS__) |
||||||
|
#else |
||||||
|
#define WACOM_TRACE(...) |
||||||
|
#define WACOM_ASSERT( x ) |
||||||
|
|
||||||
|
#endif // WACOM_DEBUG
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
HINSTANCE ghWintab = NULL; |
||||||
|
|
||||||
|
WTINFOA gpWTInfoA = NULL; |
||||||
|
WTOPENA gpWTOpenA = NULL; |
||||||
|
WTGETA gpWTGetA = NULL; |
||||||
|
WTSETA gpWTSetA = NULL; |
||||||
|
WTCLOSE gpWTClose = NULL; |
||||||
|
WTPACKET gpWTPacket = NULL; |
||||||
|
WTENABLE gpWTEnable = NULL; |
||||||
|
WTOVERLAP gpWTOverlap = NULL; |
||||||
|
WTSAVE gpWTSave = NULL; |
||||||
|
WTCONFIG gpWTConfig = NULL; |
||||||
|
WTRESTORE gpWTRestore = NULL; |
||||||
|
WTEXTSET gpWTExtSet = NULL; |
||||||
|
WTEXTGET gpWTExtGet = NULL; |
||||||
|
WTQUEUESIZESET gpWTQueueSizeSet = NULL; |
||||||
|
WTDATAPEEK gpWTDataPeek = NULL; |
||||||
|
WTPACKETSGET gpWTPacketsGet = NULL; |
||||||
|
|
||||||
|
// TODO - add more wintab32 function pointers as needed
|
||||||
|
|
||||||
|
#define GETPROCADDRESS(type, func) \ |
||||||
|
gp##func = (type)GetProcAddress(ghWintab, #func); \
|
||||||
|
if (!gp##func){ WACOM_ASSERT(FALSE); UnloadWintab(); return FALSE; } |
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Purpose
|
||||||
|
// Find wintab32.dll and load it.
|
||||||
|
// Find the exported functions we need from it.
|
||||||
|
//
|
||||||
|
// Returns
|
||||||
|
// TRUE on success.
|
||||||
|
// FALSE on failure.
|
||||||
|
//
|
||||||
|
BOOL LoadWintab( void ) |
||||||
|
{ |
||||||
|
ghWintab = LoadLibraryA( "Wintab32.dll" ); |
||||||
|
if ( !ghWintab ) |
||||||
|
{ |
||||||
|
DWORD err = GetLastError(); |
||||||
|
WACOM_TRACE("LoadLibrary error: %i\n", err); |
||||||
|
return FALSE; |
||||||
|
} |
||||||
|
|
||||||
|
// Explicitly find the exported Wintab functions in which we are interested.
|
||||||
|
// We are using the ASCII, not unicode versions (where applicable).
|
||||||
|
GETPROCADDRESS( WTOPENA, WTOpenA ); |
||||||
|
GETPROCADDRESS( WTINFOA, WTInfoA ); |
||||||
|
GETPROCADDRESS( WTGETA, WTGetA ); |
||||||
|
GETPROCADDRESS( WTSETA, WTSetA ); |
||||||
|
GETPROCADDRESS( WTPACKET, WTPacket ); |
||||||
|
GETPROCADDRESS( WTCLOSE, WTClose ); |
||||||
|
GETPROCADDRESS( WTENABLE, WTEnable ); |
||||||
|
GETPROCADDRESS( WTOVERLAP, WTOverlap ); |
||||||
|
GETPROCADDRESS( WTSAVE, WTSave ); |
||||||
|
GETPROCADDRESS( WTCONFIG, WTConfig ); |
||||||
|
GETPROCADDRESS( WTRESTORE, WTRestore ); |
||||||
|
GETPROCADDRESS( WTEXTSET, WTExtSet ); |
||||||
|
GETPROCADDRESS( WTEXTGET, WTExtGet ); |
||||||
|
GETPROCADDRESS( WTQUEUESIZESET, WTQueueSizeSet ); |
||||||
|
GETPROCADDRESS( WTDATAPEEK, WTDataPeek ); |
||||||
|
GETPROCADDRESS( WTPACKETSGET, WTPacketsGet ); |
||||||
|
|
||||||
|
|
||||||
|
// TODO - don't forget to NULL out pointers in UnloadWintab().
|
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Purpose
|
||||||
|
// Uninitializes use of wintab32.dll
|
||||||
|
//
|
||||||
|
// Returns
|
||||||
|
// Nothing.
|
||||||
|
//
|
||||||
|
void UnloadWintab( void ) |
||||||
|
{ |
||||||
|
WACOM_TRACE( "UnloadWintab()\n" ); |
||||||
|
|
||||||
|
if ( ghWintab ) |
||||||
|
{ |
||||||
|
FreeLibrary( ghWintab ); |
||||||
|
ghWintab = NULL; |
||||||
|
} |
||||||
|
|
||||||
|
gpWTOpenA = NULL; |
||||||
|
gpWTClose = NULL; |
||||||
|
gpWTInfoA = NULL; |
||||||
|
gpWTPacket = NULL; |
||||||
|
gpWTEnable = NULL; |
||||||
|
gpWTOverlap = NULL; |
||||||
|
gpWTSave = NULL; |
||||||
|
gpWTConfig = NULL; |
||||||
|
gpWTGetA = NULL; |
||||||
|
gpWTSetA = NULL; |
||||||
|
gpWTRestore = NULL; |
||||||
|
gpWTExtSet = NULL; |
||||||
|
gpWTExtGet = NULL; |
||||||
|
gpWTQueueSizeSet = NULL; |
||||||
|
gpWTDataPeek = NULL; |
||||||
|
gpWTPacketsGet = NULL; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef WACOM_DEBUG |
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void WacomTrace( char *lpszFormat, ...) |
||||||
|
{ |
||||||
|
char szTraceMessage[ 128 ]; |
||||||
|
|
||||||
|
int nBytesWritten; |
||||||
|
|
||||||
|
va_list args; |
||||||
|
|
||||||
|
WACOM_ASSERT( lpszFormat ); |
||||||
|
|
||||||
|
va_start( args, lpszFormat ); |
||||||
|
|
||||||
|
nBytesWritten = _vsnprintf( szTraceMessage, sizeof( szTraceMessage ) - 1,
|
||||||
|
lpszFormat, args ); |
||||||
|
|
||||||
|
if ( nBytesWritten > 0 ) |
||||||
|
{ |
||||||
|
OutputDebugStringA( szTraceMessage ); |
||||||
|
} |
||||||
|
|
||||||
|
va_end( args ); |
||||||
|
} |
||||||
|
|
||||||
|
#endif // WACOM_DEBUG
|
@ -0,0 +1,92 @@ |
|||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NAME |
||||||
|
Utils.h |
||||||
|
|
||||||
|
PURPOSE |
||||||
|
Defines for the general-purpose functions for the WinTab demos. |
||||||
|
|
||||||
|
COPYRIGHT |
||||||
|
Copyright (c) Wacom Company, Ltd. 2014 All Rights Reserved |
||||||
|
All rights reserved. |
||||||
|
|
||||||
|
The text and information contained in this file may be freely used, |
||||||
|
copied, or distributed without compensation or licensing restrictions. |
||||||
|
|
||||||
|
---------------------------------------------------------------------------- */ |
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <windows.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <assert.h> |
||||||
|
#include <stdarg.h> |
||||||
|
|
||||||
|
#include "wintab.h" // NOTE: get from wactab header package |
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define WACOM_DEBUG |
||||||
|
|
||||||
|
// Ignore warnings about using unsafe string functions.
|
||||||
|
#pragma warning( disable : 4996 ) |
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Function pointers to Wintab functions exported from wintab32.dll.
|
||||||
|
typedef UINT ( API * WTINFOA ) ( UINT, UINT, LPVOID ); |
||||||
|
typedef HCTX ( API * WTOPENA )( HWND, LPLOGCONTEXTA, BOOL ); |
||||||
|
typedef BOOL ( API * WTGETA ) ( HCTX, LPLOGCONTEXT ); |
||||||
|
typedef BOOL ( API * WTSETA ) ( HCTX, LPLOGCONTEXT ); |
||||||
|
typedef BOOL ( API * WTCLOSE ) ( HCTX ); |
||||||
|
typedef BOOL ( API * WTENABLE ) ( HCTX, BOOL ); |
||||||
|
typedef BOOL ( API * WTPACKET ) ( HCTX, UINT, LPVOID ); |
||||||
|
typedef BOOL ( API * WTOVERLAP ) ( HCTX, BOOL ); |
||||||
|
typedef BOOL ( API * WTSAVE ) ( HCTX, LPVOID ); |
||||||
|
typedef BOOL ( API * WTCONFIG ) ( HCTX, HWND ); |
||||||
|
typedef HCTX ( API * WTRESTORE ) ( HWND, LPVOID, BOOL ); |
||||||
|
typedef BOOL ( API * WTEXTSET ) ( HCTX, UINT, LPVOID ); |
||||||
|
typedef BOOL ( API * WTEXTGET ) ( HCTX, UINT, LPVOID ); |
||||||
|
typedef BOOL ( API * WTQUEUESIZESET ) ( HCTX, int ); |
||||||
|
typedef int ( API * WTDATAPEEK ) ( HCTX, UINT, UINT, int, LPVOID, LPINT); |
||||||
|
typedef int ( API * WTPACKETSGET ) (HCTX, int, LPVOID); |
||||||
|
|
||||||
|
// TODO - add more wintab32 function defs as needed
|
||||||
|
|
||||||
|
// Loaded Wintab32 API functions.
|
||||||
|
extern HINSTANCE ghWintab; |
||||||
|
|
||||||
|
extern WTINFOA gpWTInfoA; |
||||||
|
extern WTOPENA gpWTOpenA; |
||||||
|
extern WTGETA gpWTGetA; |
||||||
|
extern WTSETA gpWTSetA; |
||||||
|
extern WTCLOSE gpWTClose; |
||||||
|
extern WTPACKET gpWTPacket; |
||||||
|
extern WTENABLE gpWTEnable; |
||||||
|
extern WTOVERLAP gpWTOverlap; |
||||||
|
extern WTSAVE gpWTSave; |
||||||
|
extern WTCONFIG gpWTConfig; |
||||||
|
extern WTRESTORE gpWTRestore; |
||||||
|
extern WTEXTSET gpWTExtSet; |
||||||
|
extern WTEXTGET gpWTExtGet; |
||||||
|
extern WTQUEUESIZESET gpWTQueueSizeSet; |
||||||
|
extern WTDATAPEEK gpWTDataPeek; |
||||||
|
extern WTPACKETSGET gpWTPacketsGet; |
||||||
|
|
||||||
|
// TODO - add more wintab32 function pointers as needed
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
BOOL LoadWintab( void ); |
||||||
|
void UnloadWintab( void ); |
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
#ifdef WACOM_DEBUG |
||||||
|
|
||||||
|
void WacomTrace( char *lpszFormat, ...); |
||||||
|
|
||||||
|
#define WACOM_ASSERT( x ) assert( x ) |
||||||
|
#define WACOM_TRACE(...) WacomTrace(__VA_ARGS__) |
||||||
|
#else |
||||||
|
#define WACOM_TRACE(...) |
||||||
|
#define WACOM_ASSERT( x ) |
||||||
|
|
||||||
|
#endif // WACOM_DEBUG
|
||||||
|
|
@ -0,0 +1,65 @@ |
|||||||
|
<?xml version="1.0"?> |
||||||
|
|
||||||
|
<project name="JInput wintab port, Native code" basedir="." default="compile"> |
||||||
|
<property environment="env"/> |
||||||
|
<property name="wintabhome" location="${env.WintabSdkDir}"/> |
||||||
|
<property name="sdkhome" location="${env.WindowsSdkDir}"/> |
||||||
|
<property name="generated-natives" location="..\..\..\target\generated-sources\natives"/> |
||||||
|
<property name="compiled-natives" location="..\..\..\target/natives"/> |
||||||
|
<property name="jinput-windows-headers" location="../../../../windows/target/generated-sources/natives"/> |
||||||
|
<property name="jinput-windows-sources" location="../../../../windows/src/main/native"/> |
||||||
|
|
||||||
|
<target name="init"> |
||||||
|
<mkdir dir="${compiled-natives}"/> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="compile_dir"> |
||||||
|
<echo message="${compiledir}"/> |
||||||
|
<echo message="wintab: ${wintabhome}"/> |
||||||
|
<apply dir="${compiled-natives}" failonerror="true" executable="cl" dest="${compiled-natives}" skipemptyfilesets="true"> |
||||||
|
<arg line="/Ox /W2 /nologo /c"/> |
||||||
|
<arg line="/I"${sdkhome}\include""/> |
||||||
|
<arg line="/I"${wintabhome}""/> |
||||||
|
<arg line="/I"${java.home}\include""/> |
||||||
|
<arg line="/I"${java.home}\include\win32""/> |
||||||
|
<arg value="/I${commonhome}/src/native"/> |
||||||
|
<arg value="/I${generated-natives}"/> |
||||||
|
<arg value="/I${jinput-windows-headers}"/> |
||||||
|
<srcfile/> |
||||||
|
<fileset dir="${compiledir}" includes="*.c"/> |
||||||
|
<mapper type="glob" from="*.c" to="*.obj"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="link"> |
||||||
|
<apply dir="${compiled-natives}" parallel="true" executable="cl" failonerror="true"> |
||||||
|
<arg line="/LD /nologo"/> |
||||||
|
<srcfile/> |
||||||
|
<arg line="/Fe${dllname} /link"/> |
||||||
|
<arg line="/LIBPATH:"${java.home}\lib""/> |
||||||
|
<arg line="/LIBPATH:"${sdkhome}\lib""/> |
||||||
|
<arg line="/DLL ${libs}"/> |
||||||
|
<fileset dir="${compiled-natives}" includes="*.obj"/> |
||||||
|
</apply> |
||||||
|
</target> |
||||||
|
|
||||||
|
<target name="compile" depends="init"> |
||||||
|
<property name="wintablibs" value="Kernel32.lib User32.lib"/> |
||||||
|
<property name="commonhome" location="../../../../common"/> |
||||||
|
<property name="dllname" value="jinput-wintab.dll"/> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="${commonhome}/src/native"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="."/> |
||||||
|
</antcall> |
||||||
|
<antcall target="compile_dir"> |
||||||
|
<param name="compiledir" location="${jinput-windows-sources}"/> |
||||||
|
</antcall> |
||||||
|
<antcall target="link"> |
||||||
|
<param name="dllname" value="${dllname}"/> |
||||||
|
<param name="libs" value="${wintablibs}"/> |
||||||
|
</antcall> |
||||||
|
</target> |
||||||
|
</project> |
||||||
|
|
@ -0,0 +1,106 @@ |
|||||||
|
#include <windows.h> |
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
#include <jni.h> |
||||||
|
#include "net_java_games_input_WinTabContext.h" |
||||||
|
#include "wintabutils.h" |
||||||
|
#include <wintab.h> |
||||||
|
//#define PACKETDATA ( PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE | PK_ROTATION | PK_ORIENTATION | PK_CURSOR )
|
||||||
|
#define PACKETDATA ( PK_TIME | PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE | PK_ORIENTATION | PK_CURSOR ) |
||||||
|
#define PACKETMODE 0 |
||||||
|
#include <pktdef.h> |
||||||
|
#include <util.h> |
||||||
|
|
||||||
|
#define MAX_PACKETS 20 |
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_net_java_games_input_WinTabContext_nOpen(JNIEnv *env, jclass unused, jlong hWnd_long) { |
||||||
|
LOGCONTEXT context; |
||||||
|
HWND hWnd = (HWND)(INT_PTR)hWnd_long; |
||||||
|
HCTX hCtx = NULL; |
||||||
|
|
||||||
|
jclass booleanClass = (*env)->FindClass(env, "java/lang/Boolean"); |
||||||
|
jstring propertyName = (*env)->NewStringUTF(env, "jinput.wintab.detachcursor"); |
||||||
|
jmethodID getBooleanMethod = (*env)->GetStaticMethodID(env, booleanClass, "getBoolean", "(Ljava/lang/String;)Z"); |
||||||
|
jboolean detachCursor = (*env)->CallStaticBooleanMethod(env, booleanClass, getBooleanMethod, propertyName); |
||||||
|
|
||||||
|
if(!LoadWintab()) { |
||||||
|
throwIOException(env, "Failed to load wintab (%d)\n", GetLastError()); |
||||||
|
} else { |
||||||
|
printfJava(env, "Wintab dll loaded\n"); |
||||||
|
} |
||||||
|
|
||||||
|
if (!gpWTInfoA(0, 0, NULL)) { |
||||||
|
throwIOException(env, "Wintab is not available (%d)\n", GetLastError()); |
||||||
|
} else { |
||||||
|
printfJava(env, "Wintab is available\n"); |
||||||
|
} |
||||||
|
|
||||||
|
gpWTInfoA(WTI_DEFCONTEXT, 0, &context); |
||||||
|
|
||||||
|
wsprintf(context.lcName, "JInput Digitizing"); |
||||||
|
context.lcPktData = PACKETDATA; |
||||||
|
context.lcPktMode = PACKETMODE; |
||||||
|
context.lcMoveMask = PACKETDATA; |
||||||
|
context.lcBtnUpMask = context.lcBtnDnMask; |
||||||
|
if(!detachCursor) { |
||||||
|
context.lcOptions |= CXO_SYSTEM; |
||||||
|
} |
||||||
|
|
||||||
|
/* open the region */ |
||||||
|
hCtx = gpWTOpenA(hWnd, &context, TRUE); |
||||||
|
|
||||||
|
return (jlong)(intptr_t)hCtx; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_net_java_games_input_WinTabContext_nClose(JNIEnv *env, jclass unused, jlong hCtx_long) { |
||||||
|
gpWTClose((HCTX)(INT_PTR)hCtx_long); |
||||||
|
UnloadWintab(); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_WinTabContext_nGetNumberOfSupportedDevices(JNIEnv *env, jclass unused) { |
||||||
|
int numDevices; |
||||||
|
gpWTInfoA(WTI_INTERFACE, IFC_NDEVICES, &numDevices); |
||||||
|
return numDevices; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_net_java_games_input_WinTabContext_nGetPackets(JNIEnv *env, jclass unused, jlong hCtx_long) { |
||||||
|
|
||||||
|
jobjectArray retval; |
||||||
|
int i=0; |
||||||
|
PACKET packets[MAX_PACKETS]; |
||||||
|
int numberRead = gpWTPacketsGet((HCTX)(INT_PTR)hCtx_long, MAX_PACKETS, packets); |
||||||
|
jclass winTabPacketClass = (*env)->FindClass(env, "net/java/games/input/WinTabPacket"); |
||||||
|
jfieldID packetTimeField = (*env)->GetFieldID(env, winTabPacketClass, "PK_TIME", "J"); |
||||||
|
jfieldID packetXAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_X", "I"); |
||||||
|
jfieldID packetYAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_Y", "I"); |
||||||
|
jfieldID packetZAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_Z", "I"); |
||||||
|
jfieldID packetButtonsField = (*env)->GetFieldID(env, winTabPacketClass, "PK_BUTTONS", "I"); |
||||||
|
jfieldID packetNPressureAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_NORMAL_PRESSURE", "I"); |
||||||
|
jfieldID packetTPressureAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_TANGENT_PRESSURE", "I"); |
||||||
|
jfieldID packetCursorField = (*env)->GetFieldID(env, winTabPacketClass, "PK_CURSOR", "I"); |
||||||
|
jfieldID packetOrientationAltAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_ORIENTATION_ALT", "I"); |
||||||
|
jfieldID packetOrientationAzAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_ORIENTATION_AZ", "I"); |
||||||
|
jfieldID packetOrientationTwistAxisField = (*env)->GetFieldID(env, winTabPacketClass, "PK_ORIENTATION_TWIST", "I"); |
||||||
|
jobject prototypePacket = newJObject(env, "net/java/games/input/WinTabPacket", "()V"); |
||||||
|
|
||||||
|
retval = (*env)->NewObjectArray(env, numberRead, winTabPacketClass, NULL); |
||||||
|
for(i=0;i<numberRead;i++) { |
||||||
|
jobject tempPacket = newJObject(env, "net/java/games/input/WinTabPacket", "()V"); |
||||||
|
|
||||||
|
(*env)->SetLongField(env, tempPacket, packetTimeField, packets[i].pkTime); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetXAxisField, packets[i].pkX); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetYAxisField, packets[i].pkY); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetZAxisField, packets[i].pkZ); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetButtonsField, packets[i].pkButtons); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetNPressureAxisField, packets[i].pkNormalPressure); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetTPressureAxisField, packets[i].pkTangentPressure); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetCursorField, packets[i].pkCursor); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetOrientationAltAxisField, packets[i].pkOrientation.orAzimuth); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetOrientationAzAxisField, packets[i].pkOrientation.orAltitude); |
||||||
|
(*env)->SetIntField(env, tempPacket, packetOrientationTwistAxisField, packets[i].pkOrientation.orTwist); |
||||||
|
|
||||||
|
(*env)->SetObjectArrayElement(env, retval, i, tempPacket); |
||||||
|
} |
||||||
|
|
||||||
|
return retval; |
||||||
|
} |
@ -0,0 +1,107 @@ |
|||||||
|
#include <windows.h> |
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
#include <jni.h> |
||||||
|
#include "net_java_games_input_WinTabDevice.h" |
||||||
|
#include "util.h" |
||||||
|
#include "wintabutils.h" |
||||||
|
#include <wintab.h> |
||||||
|
#include <malloc.h> |
||||||
|
#define PACKETDATA ( PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR ) |
||||||
|
#define PACKETMODE 0 |
||||||
|
#include <pktdef.h> |
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_net_java_games_input_WinTabDevice_nGetName(JNIEnv *env, jclass unused, jint deviceIndex) { |
||||||
|
char name[50]; |
||||||
|
gpWTInfoA(WTI_DEVICES + deviceIndex, DVC_NAME, name); |
||||||
|
return (*env)->NewStringUTF(env, name); |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jintArray JNICALL Java_net_java_games_input_WinTabDevice_nGetAxisDetails(JNIEnv *env, jclass unused, jint deviceIndex, jint axisId) { |
||||||
|
UINT type; |
||||||
|
AXIS threeAxisArray[3]; |
||||||
|
AXIS axis; |
||||||
|
long threeAxisData[6]; |
||||||
|
long axisData[2]; |
||||||
|
int res; |
||||||
|
jintArray retVal = NULL; |
||||||
|
|
||||||
|
if(axisId==net_java_games_input_WinTabDevice_XAxis) type = DVC_X; |
||||||
|
else if(axisId==net_java_games_input_WinTabDevice_YAxis) type = DVC_Y; |
||||||
|
else if(axisId==net_java_games_input_WinTabDevice_ZAxis) type = DVC_Z; |
||||||
|
else if(axisId==net_java_games_input_WinTabDevice_NPressureAxis) type = DVC_NPRESSURE; |
||||||
|
else if(axisId==net_java_games_input_WinTabDevice_TPressureAxis) type = DVC_TPRESSURE; |
||||||
|
else if(axisId==net_java_games_input_WinTabDevice_OrientationAxis) type = DVC_ORIENTATION; |
||||||
|
else if(axisId==net_java_games_input_WinTabDevice_RotationAxis) type = DVC_ROTATION; |
||||||
|
|
||||||
|
if(axisId==net_java_games_input_WinTabDevice_RotationAxis || axisId==net_java_games_input_WinTabDevice_OrientationAxis) { |
||||||
|
res = gpWTInfoA(WTI_DEVICES + deviceIndex, type, &threeAxisArray); |
||||||
|
if(res!=0) { |
||||||
|
threeAxisData[0] = threeAxisArray[0].axMin; |
||||||
|
threeAxisData[1] = threeAxisArray[0].axMax; |
||||||
|
threeAxisData[2] = threeAxisArray[1].axMin; |
||||||
|
threeAxisData[3] = threeAxisArray[1].axMax; |
||||||
|
threeAxisData[4] = threeAxisArray[2].axMin; |
||||||
|
threeAxisData[5] = threeAxisArray[2].axMax; |
||||||
|
retVal = (*env)->NewIntArray(env, 6); |
||||||
|
(*env)->SetIntArrayRegion(env, retVal, 0, 6, threeAxisData); |
||||||
|
} |
||||||
|
} else { |
||||||
|
res = gpWTInfoA(WTI_DEVICES + deviceIndex, type, &axis); |
||||||
|
if(res!=0) { |
||||||
|
axisData[0] = axis.axMin; |
||||||
|
axisData[1] = axis.axMax; |
||||||
|
retVal = (*env)->NewIntArray(env, 2); |
||||||
|
(*env)->SetIntArrayRegion(env, retVal, 0, 2, axisData); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if(retVal==NULL) { |
||||||
|
retVal = (*env)->NewIntArray(env, 0); |
||||||
|
} |
||||||
|
|
||||||
|
return retVal; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_net_java_games_input_WinTabDevice_nGetCursorNames(JNIEnv *env, jclass unused, jint deviceId) { |
||||||
|
int numberCursorTypes; |
||||||
|
int firstCursorType; |
||||||
|
char name[50]; |
||||||
|
int i; |
||||||
|
jclass stringClass = (*env)->FindClass(env, "java/lang/String"); |
||||||
|
jstring nameString; |
||||||
|
jobjectArray retval; |
||||||
|
|
||||||
|
gpWTInfoA(WTI_DEVICES + deviceId, DVC_NCSRTYPES, &numberCursorTypes); |
||||||
|
gpWTInfoA(WTI_DEVICES + deviceId, DVC_FIRSTCSR, &firstCursorType); |
||||||
|
|
||||||
|
retval = (*env)->NewObjectArray(env, numberCursorTypes, stringClass, NULL); |
||||||
|
|
||||||
|
for(i=0;i<numberCursorTypes;i++) { |
||||||
|
gpWTInfoA(WTI_CURSORS + i + firstCursorType, CSR_NAME, name); |
||||||
|
nameString = (*env)->NewStringUTF(env, name); |
||||||
|
(*env)->SetObjectArrayElement(env, retval, i-firstCursorType, nameString); |
||||||
|
} |
||||||
|
|
||||||
|
return retval; |
||||||
|
} |
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_net_java_games_input_WinTabDevice_nGetMaxButtonCount(JNIEnv *env, jclass unused, jint deviceId) { |
||||||
|
int numberCursorTypes; |
||||||
|
int firstCursorType; |
||||||
|
byte buttonCount; |
||||||
|
int i; |
||||||
|
byte retval=0; |
||||||
|
|
||||||
|
gpWTInfoA(WTI_DEVICES + deviceId, DVC_NCSRTYPES, &numberCursorTypes); |
||||||
|
gpWTInfoA(WTI_DEVICES + deviceId, DVC_FIRSTCSR, &firstCursorType); |
||||||
|
|
||||||
|
for(i=0;i<numberCursorTypes;i++) { |
||||||
|
gpWTInfoA(WTI_CURSORS + i + firstCursorType, CSR_BUTTONS, &buttonCount); |
||||||
|
if(buttonCount>retval) { |
||||||
|
retval = buttonCount; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return (jint)retval; |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
||||||
|
|
||||||
|
<HTML> |
||||||
|
<HEAD> |
||||||
|
<TITLE></TITLE> |
||||||
|
</HEAD> |
||||||
|
<BODY> |
||||||
|
This is a fork of the jinput project. The fork is at https://github.com/hervegirod/jinput2. |
||||||
|
<br/> |
||||||
|
<br/> |
||||||
|
The original jinput project is at https://github.com/jinput/jinput |
||||||
|
</BODY> |
||||||
|
</HTML> |
@ -0,0 +1,51 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import net.java.games.input.Controller; |
||||||
|
import net.java.games.input.ControllerEnvironment; |
||||||
|
import net.java.games.util.plugins.Plugin; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Jeremy |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
public class AWTEnvironmentPlugin extends ControllerEnvironment implements Plugin { |
||||||
|
|
||||||
|
private final Controller[] controllers; |
||||||
|
|
||||||
|
public AWTEnvironmentPlugin() { |
||||||
|
this.controllers = new Controller[]{new AWTKeyboard(), new AWTMouse()}; |
||||||
|
} |
||||||
|
|
||||||
|
public Controller[] getControllers() { |
||||||
|
return controllers; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isSupported() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,289 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.awt.event.KeyEvent; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Jeremy |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class AWTKeyMap { |
||||||
|
public final static Component.Identifier.Key mapKeyCode(int key_code) { |
||||||
|
switch (key_code) { |
||||||
|
case KeyEvent.VK_0: |
||||||
|
return Component.Identifier.Key._0; |
||||||
|
case KeyEvent.VK_1: |
||||||
|
return Component.Identifier.Key._1; |
||||||
|
case KeyEvent.VK_2: |
||||||
|
return Component.Identifier.Key._2; |
||||||
|
case KeyEvent.VK_3: |
||||||
|
return Component.Identifier.Key._3; |
||||||
|
case KeyEvent.VK_4: |
||||||
|
return Component.Identifier.Key._4; |
||||||
|
case KeyEvent.VK_5: |
||||||
|
return Component.Identifier.Key._5; |
||||||
|
case KeyEvent.VK_6: |
||||||
|
return Component.Identifier.Key._6; |
||||||
|
case KeyEvent.VK_7: |
||||||
|
return Component.Identifier.Key._7; |
||||||
|
case KeyEvent.VK_8: |
||||||
|
return Component.Identifier.Key._8; |
||||||
|
case KeyEvent.VK_9: |
||||||
|
return Component.Identifier.Key._9; |
||||||
|
|
||||||
|
case KeyEvent.VK_Q: |
||||||
|
return Component.Identifier.Key.Q; |
||||||
|
case KeyEvent.VK_W: |
||||||
|
return Component.Identifier.Key.W; |
||||||
|
case KeyEvent.VK_E: |
||||||
|
return Component.Identifier.Key.E; |
||||||
|
case KeyEvent.VK_R: |
||||||
|
return Component.Identifier.Key.R; |
||||||
|
case KeyEvent.VK_T: |
||||||
|
return Component.Identifier.Key.T; |
||||||
|
case KeyEvent.VK_Y: |
||||||
|
return Component.Identifier.Key.Y; |
||||||
|
case KeyEvent.VK_U: |
||||||
|
return Component.Identifier.Key.U; |
||||||
|
case KeyEvent.VK_I: |
||||||
|
return Component.Identifier.Key.I; |
||||||
|
case KeyEvent.VK_O: |
||||||
|
return Component.Identifier.Key.O; |
||||||
|
case KeyEvent.VK_P: |
||||||
|
return Component.Identifier.Key.P; |
||||||
|
case KeyEvent.VK_A: |
||||||
|
return Component.Identifier.Key.A; |
||||||
|
case KeyEvent.VK_S: |
||||||
|
return Component.Identifier.Key.S; |
||||||
|
case KeyEvent.VK_D: |
||||||
|
return Component.Identifier.Key.D; |
||||||
|
case KeyEvent.VK_F: |
||||||
|
return Component.Identifier.Key.F; |
||||||
|
case KeyEvent.VK_G: |
||||||
|
return Component.Identifier.Key.G; |
||||||
|
case KeyEvent.VK_H: |
||||||
|
return Component.Identifier.Key.H; |
||||||
|
case KeyEvent.VK_J: |
||||||
|
return Component.Identifier.Key.J; |
||||||
|
case KeyEvent.VK_K: |
||||||
|
return Component.Identifier.Key.K; |
||||||
|
case KeyEvent.VK_L: |
||||||
|
return Component.Identifier.Key.L; |
||||||
|
case KeyEvent.VK_Z: |
||||||
|
return Component.Identifier.Key.Z; |
||||||
|
case KeyEvent.VK_X: |
||||||
|
return Component.Identifier.Key.X; |
||||||
|
case KeyEvent.VK_C: |
||||||
|
return Component.Identifier.Key.C; |
||||||
|
case KeyEvent.VK_V: |
||||||
|
return Component.Identifier.Key.V; |
||||||
|
case KeyEvent.VK_B: |
||||||
|
return Component.Identifier.Key.B; |
||||||
|
case KeyEvent.VK_N: |
||||||
|
return Component.Identifier.Key.N; |
||||||
|
case KeyEvent.VK_M: |
||||||
|
return Component.Identifier.Key.M; |
||||||
|
|
||||||
|
case KeyEvent.VK_F1: |
||||||
|
return Component.Identifier.Key.F1; |
||||||
|
case KeyEvent.VK_F2: |
||||||
|
return Component.Identifier.Key.F2; |
||||||
|
case KeyEvent.VK_F3: |
||||||
|
return Component.Identifier.Key.F3; |
||||||
|
case KeyEvent.VK_F4: |
||||||
|
return Component.Identifier.Key.F4; |
||||||
|
case KeyEvent.VK_F5: |
||||||
|
return Component.Identifier.Key.F5; |
||||||
|
case KeyEvent.VK_F6: |
||||||
|
return Component.Identifier.Key.F6; |
||||||
|
case KeyEvent.VK_F7: |
||||||
|
return Component.Identifier.Key.F7; |
||||||
|
case KeyEvent.VK_F8: |
||||||
|
return Component.Identifier.Key.F8; |
||||||
|
case KeyEvent.VK_F9: |
||||||
|
return Component.Identifier.Key.F9; |
||||||
|
case KeyEvent.VK_F10: |
||||||
|
return Component.Identifier.Key.F10; |
||||||
|
case KeyEvent.VK_F11: |
||||||
|
return Component.Identifier.Key.F11; |
||||||
|
case KeyEvent.VK_F12: |
||||||
|
return Component.Identifier.Key.F12; |
||||||
|
|
||||||
|
case KeyEvent.VK_ESCAPE: |
||||||
|
return Component.Identifier.Key.ESCAPE; |
||||||
|
case KeyEvent.VK_MINUS: |
||||||
|
return Component.Identifier.Key.MINUS; |
||||||
|
case KeyEvent.VK_EQUALS: |
||||||
|
return Component.Identifier.Key.EQUALS; |
||||||
|
case KeyEvent.VK_BACK_SPACE: |
||||||
|
return Component.Identifier.Key.BACKSLASH; |
||||||
|
case KeyEvent.VK_TAB: |
||||||
|
return Component.Identifier.Key.TAB; |
||||||
|
case KeyEvent.VK_OPEN_BRACKET: |
||||||
|
return Component.Identifier.Key.LBRACKET; |
||||||
|
case KeyEvent.VK_CLOSE_BRACKET: |
||||||
|
return Component.Identifier.Key.RBRACKET; |
||||||
|
case KeyEvent.VK_SEMICOLON: |
||||||
|
return Component.Identifier.Key.SEMICOLON; |
||||||
|
case KeyEvent.VK_QUOTE: |
||||||
|
return Component.Identifier.Key.APOSTROPHE; |
||||||
|
case KeyEvent.VK_NUMBER_SIGN: |
||||||
|
return Component.Identifier.Key.GRAVE; |
||||||
|
case KeyEvent.VK_BACK_SLASH: |
||||||
|
return Component.Identifier.Key.BACKSLASH; |
||||||
|
case KeyEvent.VK_PERIOD: |
||||||
|
return Component.Identifier.Key.PERIOD; |
||||||
|
case KeyEvent.VK_SLASH: |
||||||
|
return Component.Identifier.Key.SLASH; |
||||||
|
case KeyEvent.VK_MULTIPLY: |
||||||
|
return Component.Identifier.Key.MULTIPLY; |
||||||
|
case KeyEvent.VK_SPACE: |
||||||
|
return Component.Identifier.Key.SPACE; |
||||||
|
case KeyEvent.VK_CAPS_LOCK: |
||||||
|
return Component.Identifier.Key.CAPITAL; |
||||||
|
case KeyEvent.VK_NUM_LOCK: |
||||||
|
return Component.Identifier.Key.NUMLOCK; |
||||||
|
case KeyEvent.VK_SCROLL_LOCK: |
||||||
|
return Component.Identifier.Key.SCROLL; |
||||||
|
case KeyEvent.VK_NUMPAD7: |
||||||
|
return Component.Identifier.Key.NUMPAD7; |
||||||
|
case KeyEvent.VK_NUMPAD8: |
||||||
|
return Component.Identifier.Key.NUMPAD8; |
||||||
|
case KeyEvent.VK_NUMPAD9: |
||||||
|
return Component.Identifier.Key.NUMPAD9; |
||||||
|
case KeyEvent.VK_SUBTRACT: |
||||||
|
return Component.Identifier.Key.SUBTRACT; |
||||||
|
case KeyEvent.VK_NUMPAD4: |
||||||
|
return Component.Identifier.Key.NUMPAD4; |
||||||
|
case KeyEvent.VK_NUMPAD5: |
||||||
|
return Component.Identifier.Key.NUMPAD5; |
||||||
|
case KeyEvent.VK_NUMPAD6: |
||||||
|
return Component.Identifier.Key.NUMPAD6; |
||||||
|
case KeyEvent.VK_ADD: |
||||||
|
return Component.Identifier.Key.ADD; |
||||||
|
case KeyEvent.VK_NUMPAD1: |
||||||
|
return Component.Identifier.Key.NUMPAD1; |
||||||
|
case KeyEvent.VK_NUMPAD2: |
||||||
|
return Component.Identifier.Key.NUMPAD2; |
||||||
|
case KeyEvent.VK_NUMPAD3: |
||||||
|
return Component.Identifier.Key.NUMPAD3; |
||||||
|
case KeyEvent.VK_NUMPAD0: |
||||||
|
return Component.Identifier.Key.NUMPAD0; |
||||||
|
case KeyEvent.VK_DECIMAL: |
||||||
|
return Component.Identifier.Key.DECIMAL; |
||||||
|
|
||||||
|
case KeyEvent.VK_KANA: |
||||||
|
return Component.Identifier.Key.KANA; |
||||||
|
case KeyEvent.VK_CONVERT: |
||||||
|
return Component.Identifier.Key.CONVERT; |
||||||
|
case KeyEvent.VK_NONCONVERT: |
||||||
|
return Component.Identifier.Key.NOCONVERT; |
||||||
|
|
||||||
|
case KeyEvent.VK_CIRCUMFLEX: |
||||||
|
return Component.Identifier.Key.CIRCUMFLEX; |
||||||
|
case KeyEvent.VK_AT: |
||||||
|
return Component.Identifier.Key.AT; |
||||||
|
case KeyEvent.VK_COLON: |
||||||
|
return Component.Identifier.Key.COLON; |
||||||
|
case KeyEvent.VK_UNDERSCORE: |
||||||
|
return Component.Identifier.Key.UNDERLINE; |
||||||
|
case KeyEvent.VK_KANJI: |
||||||
|
return Component.Identifier.Key.KANJI; |
||||||
|
|
||||||
|
case KeyEvent.VK_STOP: |
||||||
|
return Component.Identifier.Key.STOP; |
||||||
|
|
||||||
|
case KeyEvent.VK_DIVIDE: |
||||||
|
return Component.Identifier.Key.DIVIDE; |
||||||
|
|
||||||
|
case KeyEvent.VK_PAUSE: |
||||||
|
return Component.Identifier.Key.PAUSE; |
||||||
|
case KeyEvent.VK_HOME: |
||||||
|
return Component.Identifier.Key.HOME; |
||||||
|
case KeyEvent.VK_UP: |
||||||
|
return Component.Identifier.Key.UP; |
||||||
|
case KeyEvent.VK_PAGE_UP: |
||||||
|
return Component.Identifier.Key.PAGEUP; |
||||||
|
case KeyEvent.VK_LEFT: |
||||||
|
return Component.Identifier.Key.LEFT; |
||||||
|
case KeyEvent.VK_RIGHT: |
||||||
|
return Component.Identifier.Key.RIGHT; |
||||||
|
case KeyEvent.VK_END: |
||||||
|
return Component.Identifier.Key.END; |
||||||
|
case KeyEvent.VK_DOWN: |
||||||
|
return Component.Identifier.Key.DOWN; |
||||||
|
case KeyEvent.VK_PAGE_DOWN: |
||||||
|
return Component.Identifier.Key.PAGEDOWN; |
||||||
|
case KeyEvent.VK_INSERT: |
||||||
|
return Component.Identifier.Key.INSERT; |
||||||
|
case KeyEvent.VK_DELETE: |
||||||
|
return Component.Identifier.Key.DELETE; |
||||||
|
default: |
||||||
|
return Component.Identifier.Key.UNKNOWN; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final static Component.Identifier.Key map(KeyEvent event) { |
||||||
|
int key_code = event.getKeyCode(); |
||||||
|
int key_location = event.getKeyLocation(); |
||||||
|
switch (key_code) { |
||||||
|
case KeyEvent.VK_CONTROL: |
||||||
|
if (key_location == KeyEvent.KEY_LOCATION_RIGHT) |
||||||
|
return Component.Identifier.Key.RCONTROL; |
||||||
|
else |
||||||
|
return Component.Identifier.Key.LCONTROL; |
||||||
|
case KeyEvent.VK_SHIFT: |
||||||
|
if (key_location == KeyEvent.KEY_LOCATION_RIGHT) |
||||||
|
return Component.Identifier.Key.RSHIFT; |
||||||
|
else |
||||||
|
return Component.Identifier.Key.LSHIFT; |
||||||
|
case KeyEvent.VK_ALT: |
||||||
|
if (key_location == KeyEvent.KEY_LOCATION_RIGHT) |
||||||
|
return Component.Identifier.Key.RALT; |
||||||
|
else |
||||||
|
return Component.Identifier.Key.LALT; |
||||||
|
//this is 1.5 only
|
||||||
|
/* case KeyEvent.VK_WINDOWS: |
||||||
|
if (key_location == KeyEvent.KEY_LOCATION_RIGHT) |
||||||
|
return Component.Identifier.Key.RWIN; |
||||||
|
else |
||||||
|
return Component.Identifier.Key.LWIN;*/ |
||||||
|
case KeyEvent.VK_ENTER: |
||||||
|
if (key_location == KeyEvent.KEY_LOCATION_NUMPAD) |
||||||
|
return Component.Identifier.Key.NUMPADENTER; |
||||||
|
else |
||||||
|
return Component.Identifier.Key.RETURN; |
||||||
|
case KeyEvent.VK_COMMA: |
||||||
|
if (key_location == KeyEvent.KEY_LOCATION_NUMPAD) |
||||||
|
return Component.Identifier.Key.NUMPADCOMMA; |
||||||
|
else |
||||||
|
return Component.Identifier.Key.COMMA; |
||||||
|
default: |
||||||
|
return mapKeyCode(key_code); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,170 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.awt.AWTEvent; |
||||||
|
import java.awt.Toolkit; |
||||||
|
import java.awt.event.AWTEventListener; |
||||||
|
import java.awt.event.KeyEvent; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.ArrayList; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
import java.lang.reflect.Field; |
||||||
|
import java.lang.reflect.Modifier; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Jeremy |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class AWTKeyboard extends Keyboard implements AWTEventListener { |
||||||
|
private final List<KeyEvent> awt_events = new ArrayList<>(); |
||||||
|
private Event[] processed_events; |
||||||
|
private int processed_events_index; |
||||||
|
|
||||||
|
protected AWTKeyboard() { |
||||||
|
super("AWTKeyboard", createComponents(), new Controller[]{}, new Rumbler[]{}); |
||||||
|
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK); |
||||||
|
resizeEventQueue(EVENT_QUEUE_DEPTH); |
||||||
|
} |
||||||
|
|
||||||
|
private final static Component[] createComponents() { |
||||||
|
List<Component> components = new ArrayList<>(); |
||||||
|
Field[] vkey_fields = KeyEvent.class.getFields(); |
||||||
|
for (int i = 0; i < vkey_fields.length; i++) { |
||||||
|
Field vkey_field = vkey_fields[i]; |
||||||
|
try { |
||||||
|
if (Modifier.isStatic(vkey_field.getModifiers()) && vkey_field.getType() == int.class && |
||||||
|
vkey_field.getName().startsWith("VK_")) { |
||||||
|
int vkey_code = vkey_field.getInt(null); |
||||||
|
Component.Identifier.Key key_id = AWTKeyMap.mapKeyCode(vkey_code); |
||||||
|
if (key_id != Component.Identifier.Key.UNKNOWN) |
||||||
|
components.add(new Key(key_id)); |
||||||
|
} |
||||||
|
} catch (IllegalAccessException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
components.add(new Key(Component.Identifier.Key.RCONTROL)); |
||||||
|
components.add(new Key(Component.Identifier.Key.LCONTROL)); |
||||||
|
components.add(new Key(Component.Identifier.Key.RSHIFT)); |
||||||
|
components.add(new Key(Component.Identifier.Key.LSHIFT)); |
||||||
|
components.add(new Key(Component.Identifier.Key.RALT)); |
||||||
|
components.add(new Key(Component.Identifier.Key.LALT)); |
||||||
|
components.add(new Key(Component.Identifier.Key.NUMPADENTER)); |
||||||
|
components.add(new Key(Component.Identifier.Key.RETURN)); |
||||||
|
components.add(new Key(Component.Identifier.Key.NUMPADCOMMA)); |
||||||
|
components.add(new Key(Component.Identifier.Key.COMMA)); |
||||||
|
return components.toArray(new Component[]{}); |
||||||
|
} |
||||||
|
|
||||||
|
private final void resizeEventQueue(int size) { |
||||||
|
processed_events = new Event[size]; |
||||||
|
for (int i = 0; i < processed_events.length; i++) |
||||||
|
processed_events[i] = new Event(); |
||||||
|
processed_events_index = 0; |
||||||
|
} |
||||||
|
|
||||||
|
protected final void setDeviceEventQueueSize(int size) throws IOException { |
||||||
|
resizeEventQueue(size); |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized void eventDispatched(AWTEvent event) { |
||||||
|
if (event instanceof KeyEvent) |
||||||
|
awt_events.add((KeyEvent)event); |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized void pollDevice() throws IOException { |
||||||
|
for (int i = 0; i < awt_events.size(); i++) { |
||||||
|
processEvent(awt_events.get(i)); |
||||||
|
} |
||||||
|
awt_events.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
private final void processEvent(KeyEvent event) { |
||||||
|
Component.Identifier.Key key_id = AWTKeyMap.map(event); |
||||||
|
if (key_id == null) |
||||||
|
return; |
||||||
|
Key key = (Key)getComponent(key_id); |
||||||
|
if (key == null) |
||||||
|
return; |
||||||
|
long nanos = event.getWhen()*1000000L; |
||||||
|
if (event.getID() == KeyEvent.KEY_PRESSED) { |
||||||
|
//the key was pressed
|
||||||
|
addEvent(key, 1, nanos); |
||||||
|
} else if (event.getID() == KeyEvent.KEY_RELEASED) { |
||||||
|
KeyEvent nextPress = (KeyEvent)Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent(KeyEvent.KEY_PRESSED); |
||||||
|
if ((nextPress == null) || (nextPress.getWhen() != event.getWhen())) { |
||||||
|
//the key came really came up
|
||||||
|
addEvent(key, 0, nanos); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final void addEvent(Key key, float value, long nanos) { |
||||||
|
key.setValue(value); |
||||||
|
if (processed_events_index < processed_events.length) |
||||||
|
processed_events[processed_events_index++].set(key, value, nanos); |
||||||
|
} |
||||||
|
|
||||||
|
protected final synchronized boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
if (processed_events_index == 0) |
||||||
|
return false; |
||||||
|
processed_events_index--; |
||||||
|
event.set(processed_events[0]); |
||||||
|
Event tmp = processed_events[0]; |
||||||
|
processed_events[0] = processed_events[processed_events_index]; |
||||||
|
processed_events[processed_events_index] = tmp; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private final static class Key extends AbstractComponent { |
||||||
|
private float value; |
||||||
|
|
||||||
|
public Key(Component.Identifier.Key key_id) { |
||||||
|
super(key_id.getName(), key_id); |
||||||
|
} |
||||||
|
|
||||||
|
public final void setValue(float value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
protected final float poll() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isAnalog() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,221 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
|
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.awt.AWTEvent; |
||||||
|
import java.awt.Toolkit; |
||||||
|
import java.awt.event.AWTEventListener; |
||||||
|
import java.awt.event.MouseEvent; |
||||||
|
import java.awt.event.MouseWheelEvent; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.ArrayList; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Jeremy |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class AWTMouse extends Mouse implements AWTEventListener { |
||||||
|
private final static int EVENT_X = 1; |
||||||
|
private final static int EVENT_Y = 2; |
||||||
|
private final static int EVENT_BUTTON = 4; |
||||||
|
|
||||||
|
private final List<AWTEvent> awt_events = new ArrayList<>(); |
||||||
|
private final List<AWTEvent> processed_awt_events = new ArrayList<>(); |
||||||
|
|
||||||
|
private int event_state = EVENT_X; |
||||||
|
|
||||||
|
protected AWTMouse() { |
||||||
|
super("AWTMouse", createComponents(), new Controller[]{}, new Rumbler[]{}); |
||||||
|
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK); |
||||||
|
} |
||||||
|
|
||||||
|
private final static Component[] createComponents() { |
||||||
|
return new Component[]{new Axis(Component.Identifier.Axis.X), |
||||||
|
new Axis(Component.Identifier.Axis.Y), |
||||||
|
new Axis(Component.Identifier.Axis.Z), |
||||||
|
new Button(Component.Identifier.Button.LEFT), |
||||||
|
new Button(Component.Identifier.Button.MIDDLE), |
||||||
|
new Button(Component.Identifier.Button.RIGHT)}; |
||||||
|
} |
||||||
|
|
||||||
|
private final void processButtons(int button_enum, float value) { |
||||||
|
Button button = getButton(button_enum); |
||||||
|
if (button != null) |
||||||
|
button.setValue(value); |
||||||
|
} |
||||||
|
|
||||||
|
private final Button getButton(int button_enum) { |
||||||
|
switch (button_enum) { |
||||||
|
case MouseEvent.BUTTON1: |
||||||
|
return (Button)getLeft(); |
||||||
|
case MouseEvent.BUTTON2: |
||||||
|
return (Button)getMiddle(); |
||||||
|
case MouseEvent.BUTTON3: |
||||||
|
return (Button)getRight(); |
||||||
|
case MouseEvent.NOBUTTON: |
||||||
|
default: |
||||||
|
// Unknown button
|
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final void processEvent(AWTEvent event) throws IOException { |
||||||
|
if (event instanceof MouseWheelEvent) { |
||||||
|
MouseWheelEvent mwe = (MouseWheelEvent)event; |
||||||
|
Axis wheel = (Axis)getWheel(); |
||||||
|
wheel.setValue(wheel.poll() + mwe.getWheelRotation()); |
||||||
|
} else if (event instanceof MouseEvent) { |
||||||
|
MouseEvent me = (MouseEvent)event; |
||||||
|
Axis x = (Axis)getX(); |
||||||
|
Axis y = (Axis)getY(); |
||||||
|
x.setValue(me.getX()); |
||||||
|
y.setValue(me.getY()); |
||||||
|
switch (me.getID()) { |
||||||
|
case MouseEvent.MOUSE_PRESSED: |
||||||
|
processButtons(me.getButton(), 1f); |
||||||
|
break; |
||||||
|
case MouseEvent.MOUSE_RELEASED: |
||||||
|
processButtons(me.getButton(), 0f); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized void pollDevice() throws IOException { |
||||||
|
Axis wheel = (Axis)getWheel(); |
||||||
|
wheel.setValue(0); |
||||||
|
for (int i = 0; i < awt_events.size(); i++) { |
||||||
|
AWTEvent event = awt_events.get(i); |
||||||
|
processEvent(event); |
||||||
|
processed_awt_events.add(event); |
||||||
|
} |
||||||
|
awt_events.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
protected final synchronized boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
while (true) { |
||||||
|
if (processed_awt_events.isEmpty()) |
||||||
|
return false; |
||||||
|
AWTEvent awt_event = processed_awt_events.get(0); |
||||||
|
if (awt_event instanceof MouseWheelEvent) { |
||||||
|
MouseWheelEvent awt_wheel_event = (MouseWheelEvent)awt_event; |
||||||
|
long nanos = awt_wheel_event.getWhen()*1000000L; |
||||||
|
event.set(getWheel(), awt_wheel_event.getWheelRotation(), nanos); |
||||||
|
processed_awt_events.remove(0); |
||||||
|
} else if (awt_event instanceof MouseEvent) { |
||||||
|
MouseEvent mouse_event = (MouseEvent)awt_event; |
||||||
|
long nanos = mouse_event.getWhen()*1000000L; |
||||||
|
switch (event_state) { |
||||||
|
case EVENT_X: |
||||||
|
event_state = EVENT_Y; |
||||||
|
event.set(getX(), mouse_event.getX(), nanos); |
||||||
|
return true; |
||||||
|
case EVENT_Y: |
||||||
|
event_state = EVENT_BUTTON; |
||||||
|
event.set(getY(), mouse_event.getY(), nanos); |
||||||
|
return true; |
||||||
|
case EVENT_BUTTON: |
||||||
|
processed_awt_events.remove(0); |
||||||
|
event_state = EVENT_X; |
||||||
|
Button button = getButton(mouse_event.getButton()); |
||||||
|
if (button != null) { |
||||||
|
switch (mouse_event.getID()) { |
||||||
|
case MouseEvent.MOUSE_PRESSED: |
||||||
|
event.set(button, 1f, nanos); |
||||||
|
return true; |
||||||
|
case MouseEvent.MOUSE_RELEASED: |
||||||
|
event.set(button, 0f, nanos); |
||||||
|
return true; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
break; |
||||||
|
default: |
||||||
|
throw new RuntimeException("Unknown event state: " + event_state); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized void eventDispatched(AWTEvent event) { |
||||||
|
awt_events.add(event); |
||||||
|
} |
||||||
|
|
||||||
|
final static class Axis extends AbstractComponent { |
||||||
|
private float value; |
||||||
|
|
||||||
|
public Axis(Component.Identifier.Axis axis_id) { |
||||||
|
super(axis_id.getName(), axis_id); |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isAnalog() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
protected final void setValue(float value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
protected final float poll() throws IOException { |
||||||
|
return value; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final static class Button extends AbstractComponent { |
||||||
|
private float value; |
||||||
|
|
||||||
|
public Button(Component.Identifier.Button button_id) { |
||||||
|
super(button_id.getName(), button_id); |
||||||
|
} |
||||||
|
|
||||||
|
protected final void setValue(float value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
protected final float poll() throws IOException { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isAnalog() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxAbsInfo { |
||||||
|
private int value; |
||||||
|
private int minimum; |
||||||
|
private int maximum; |
||||||
|
private int fuzz; |
||||||
|
private int flat; |
||||||
|
|
||||||
|
public final void set(int value, int min, int max, int fuzz, int flat) { |
||||||
|
this.value = value; |
||||||
|
this.minimum = min; |
||||||
|
this.maximum = max; |
||||||
|
this.fuzz = fuzz; |
||||||
|
this.flat = flat; |
||||||
|
} |
||||||
|
|
||||||
|
public final String toString() { |
||||||
|
return "AbsInfo: value = " + value + " | min = " + minimum + " | max = " + maximum + " | fuzz = " + fuzz + " | flat = " + flat; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getValue() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
final int getMax() { |
||||||
|
return maximum; |
||||||
|
} |
||||||
|
|
||||||
|
final int getMin() { |
||||||
|
return minimum; |
||||||
|
} |
||||||
|
|
||||||
|
final int getFlat() { |
||||||
|
return flat; |
||||||
|
} |
||||||
|
|
||||||
|
final int getFuzz() { |
||||||
|
return fuzz; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents a Linux controller |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxAbstractController extends AbstractController { |
||||||
|
private final PortType port; |
||||||
|
private final LinuxEventDevice device; |
||||||
|
private final Type type; |
||||||
|
|
||||||
|
protected LinuxAbstractController(LinuxEventDevice device, Component[] components, Controller[] children, Rumbler[] rumblers, Type type) throws IOException { |
||||||
|
super(device.getName(), components, children, rumblers); |
||||||
|
this.device = device; |
||||||
|
this.port = device.getPortType(); |
||||||
|
this.type = type; |
||||||
|
} |
||||||
|
|
||||||
|
public final PortType getPortType() { |
||||||
|
return port; |
||||||
|
} |
||||||
|
|
||||||
|
public final void pollDevice() throws IOException { |
||||||
|
device.pollKeyStates(); |
||||||
|
} |
||||||
|
|
||||||
|
protected final boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
return LinuxControllers.getNextDeviceEvent(event, device); |
||||||
|
} |
||||||
|
|
||||||
|
public Type getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxAxisDescriptor { |
||||||
|
private int type; |
||||||
|
private int code; |
||||||
|
|
||||||
|
public final void set(int type, int code) { |
||||||
|
this.type = type; |
||||||
|
this.code = code; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getCode() { |
||||||
|
return code; |
||||||
|
} |
||||||
|
|
||||||
|
public final int hashCode() { |
||||||
|
return type ^ code; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean equals(Object other) { |
||||||
|
if (!(other instanceof LinuxAxisDescriptor)) |
||||||
|
return false; |
||||||
|
LinuxAxisDescriptor descriptor = (LinuxAxisDescriptor)other; |
||||||
|
return descriptor.type == type && descriptor.code == code; |
||||||
|
} |
||||||
|
|
||||||
|
public final String toString() { |
||||||
|
return "LinuxAxis: type = 0x" + Integer.toHexString(type) + ", code = 0x" + Integer.toHexString(code); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class LinuxCombinedController extends AbstractController { |
||||||
|
|
||||||
|
private LinuxAbstractController eventController; |
||||||
|
private LinuxJoystickAbstractController joystickController; |
||||||
|
|
||||||
|
LinuxCombinedController(LinuxAbstractController eventController, LinuxJoystickAbstractController joystickController) { |
||||||
|
super(eventController.getName(), joystickController.getComponents(), eventController.getControllers(), eventController.getRumblers()); |
||||||
|
this.eventController = eventController; |
||||||
|
this.joystickController = joystickController; |
||||||
|
} |
||||||
|
|
||||||
|
protected boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
return joystickController.getNextDeviceEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
public final PortType getPortType() { |
||||||
|
return eventController.getPortType(); |
||||||
|
} |
||||||
|
|
||||||
|
public final void pollDevice() throws IOException { |
||||||
|
eventController.pollDevice(); |
||||||
|
joystickController.pollDevice(); |
||||||
|
} |
||||||
|
|
||||||
|
public Type getType() { |
||||||
|
return eventController.getType(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents a linux Axis |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
class LinuxComponent extends AbstractComponent { |
||||||
|
private final LinuxEventComponent component; |
||||||
|
|
||||||
|
public LinuxComponent(LinuxEventComponent component) { |
||||||
|
super(component.getIdentifier().getName(), component.getIdentifier()); |
||||||
|
this.component = component; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return component.isRelative(); |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isAnalog() { |
||||||
|
return component.isAnalog(); |
||||||
|
} |
||||||
|
|
||||||
|
protected float poll() throws IOException { |
||||||
|
return convertValue(LinuxControllers.poll(component), component.getDescriptor()); |
||||||
|
} |
||||||
|
|
||||||
|
float convertValue(float value, LinuxAxisDescriptor descriptor) { |
||||||
|
return getComponent().convertValue(value); |
||||||
|
} |
||||||
|
|
||||||
|
public final float getDeadZone() { |
||||||
|
return component.getDeadZone(); |
||||||
|
} |
||||||
|
|
||||||
|
public final LinuxEventComponent getComponent() { |
||||||
|
return component; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxConstantFF extends LinuxForceFeedbackEffect { |
||||||
|
public LinuxConstantFF(LinuxEventDevice device) throws IOException { |
||||||
|
super(device); |
||||||
|
} |
||||||
|
|
||||||
|
protected final int upload(int id, float intensity) throws IOException { |
||||||
|
int scaled_intensity = Math.round(intensity*0x7fff); |
||||||
|
return getDevice().uploadConstantEffect(id, 0, 0, 0, 0, 0, scaled_intensity, 0, 0, 0, 0); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** helper methods for Linux specific Controllers |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxControllers { |
||||||
|
private final static LinuxEvent linux_event = new LinuxEvent(); |
||||||
|
|
||||||
|
/* Declared synchronized to protect linux_event */ |
||||||
|
public final static synchronized boolean getNextDeviceEvent(Event event, LinuxEventDevice device) throws IOException { |
||||||
|
while (device.getNextEvent(linux_event)) { |
||||||
|
LinuxAxisDescriptor descriptor = linux_event.getDescriptor(); |
||||||
|
LinuxComponent component = device.mapDescriptor(descriptor); |
||||||
|
if (component != null) { |
||||||
|
float value = component.convertValue(linux_event.getValue(), descriptor); |
||||||
|
event.set(component, value, linux_event.getNanos()); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
private final static LinuxAbsInfo abs_info = new LinuxAbsInfo(); |
||||||
|
|
||||||
|
/* Declared synchronized to protect abs_info */ |
||||||
|
public final static synchronized float poll(LinuxEventComponent event_component) throws IOException { |
||||||
|
int native_type = event_component.getDescriptor().getType(); |
||||||
|
switch (native_type) { |
||||||
|
case NativeDefinitions.EV_KEY: |
||||||
|
int native_code = event_component.getDescriptor().getCode(); |
||||||
|
float state = event_component.getDevice().isKeySet(native_code) ? 1f : 0f; |
||||||
|
return state; |
||||||
|
case NativeDefinitions.EV_ABS: |
||||||
|
event_component.getAbsInfo(abs_info); |
||||||
|
return abs_info.getValue(); |
||||||
|
default: |
||||||
|
throw new RuntimeException("Unkown native_type: " + native_type); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.ArrayList; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
interface LinuxDevice { |
||||||
|
void close() throws IOException; |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
abstract class LinuxDeviceTask { |
||||||
|
public final static int INPROGRESS = 1; |
||||||
|
public final static int COMPLETED = 2; |
||||||
|
public final static int FAILED = 3; |
||||||
|
|
||||||
|
private Object result; |
||||||
|
private IOException exception; |
||||||
|
private int state = INPROGRESS; |
||||||
|
|
||||||
|
public final void doExecute() { |
||||||
|
try { |
||||||
|
result = execute(); |
||||||
|
state = COMPLETED; |
||||||
|
} catch (IOException e) { |
||||||
|
exception = e; |
||||||
|
state = FAILED; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final IOException getException() { |
||||||
|
return exception; |
||||||
|
} |
||||||
|
|
||||||
|
public final Object getResult() { |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getState() { |
||||||
|
return state; |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract Object execute() throws IOException; |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
import java.util.ArrayList; |
||||||
|
|
||||||
|
/** |
||||||
|
* Linux doesn't have proper support for force feedback |
||||||
|
* from different threads since it relies on PIDs |
||||||
|
* to determine ownership of a particular effect slot. |
||||||
|
* Therefore we have to hack around this by |
||||||
|
* making sure everything related to FF |
||||||
|
* (including the final device close that performs |
||||||
|
* and implicit deletion of all the process' effects) |
||||||
|
* is run on a single thread. |
||||||
|
*/ |
||||||
|
final class LinuxDeviceThread extends Thread { |
||||||
|
private final List<LinuxDeviceTask> tasks = new ArrayList<>(); |
||||||
|
|
||||||
|
public LinuxDeviceThread() { |
||||||
|
setDaemon(true); |
||||||
|
start(); |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized final void run() { |
||||||
|
while (true) { |
||||||
|
if (!tasks.isEmpty()) { |
||||||
|
LinuxDeviceTask task = tasks.remove(0); |
||||||
|
task.doExecute(); |
||||||
|
synchronized (task) { |
||||||
|
task.notify(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
try { |
||||||
|
wait(); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
// ignore
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final Object execute(LinuxDeviceTask task) throws IOException { |
||||||
|
synchronized (this) { |
||||||
|
tasks.add(task); |
||||||
|
notify(); |
||||||
|
} |
||||||
|
synchronized (task) { |
||||||
|
while (task.getState() == LinuxDeviceTask.INPROGRESS) { |
||||||
|
try { |
||||||
|
task.wait(); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
// ignore
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
switch (task.getState()) { |
||||||
|
case LinuxDeviceTask.COMPLETED: |
||||||
|
return task.getResult(); |
||||||
|
case LinuxDeviceTask.FAILED: |
||||||
|
throw task.getException(); |
||||||
|
default: |
||||||
|
throw new RuntimeException("Invalid task state: " + task.getState()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,477 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import net.java.games.util.plugins.Plugin; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Comparator; |
||||||
|
import java.util.List; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FilenameFilter; |
||||||
|
import java.security.AccessController; |
||||||
|
import java.security.PrivilegedAction; |
||||||
|
|
||||||
|
/** Environment plugin for linux |
||||||
|
* @author elias |
||||||
|
* @author Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
*/ |
||||||
|
public final class LinuxEnvironmentPlugin extends ControllerEnvironment implements Plugin { |
||||||
|
private final static String LIBNAME = "jinput-linux"; |
||||||
|
private final static String POSTFIX64BIT = "64"; |
||||||
|
private static boolean supported = false; |
||||||
|
|
||||||
|
private final Controller[] controllers; |
||||||
|
private final List<LinuxDevice> devices = new ArrayList<LinuxDevice>(); |
||||||
|
private final static LinuxDeviceThread device_thread = new LinuxDeviceThread(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Static utility method for loading native libraries. |
||||||
|
* It will try to load from either the path given by |
||||||
|
* the net.java.games.input.librarypath property |
||||||
|
* or through System.loadLibrary(). |
||||||
|
* |
||||||
|
*/ |
||||||
|
static void loadLibrary(final String lib_name) { |
||||||
|
AccessController.doPrivileged((PrivilegedAction<Void>) () -> { |
||||||
|
String lib_path = System.getProperty("net.java.games.input.librarypath"); |
||||||
|
try { |
||||||
|
if(lib_path != null) |
||||||
|
System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); |
||||||
|
else |
||||||
|
System.loadLibrary(lib_name); |
||||||
|
} catch(UnsatisfiedLinkError e) { |
||||||
|
log("Failed to load library: " + e.getMessage()); |
||||||
|
e.printStackTrace(); |
||||||
|
supported = false; |
||||||
|
} |
||||||
|
return null; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static String getPrivilegedProperty(final String property) { |
||||||
|
return AccessController.doPrivileged((PrivilegedAction<String>)() -> System.getProperty(property)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static String getPrivilegedProperty(final String property, final String default_value) { |
||||||
|
return AccessController.doPrivileged((PrivilegedAction<String>)() -> System.getProperty(property, default_value)); |
||||||
|
} |
||||||
|
|
||||||
|
static { |
||||||
|
String osName = getPrivilegedProperty("os.name", "").trim(); |
||||||
|
if(osName.equals("Linux")) { |
||||||
|
supported = true; |
||||||
|
if("i386".equals(getPrivilegedProperty("os.arch"))) { |
||||||
|
loadLibrary(LIBNAME); |
||||||
|
} else { |
||||||
|
loadLibrary(LIBNAME + POSTFIX64BIT); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final static Object execute(LinuxDeviceTask task) throws IOException { |
||||||
|
return device_thread.execute(task); |
||||||
|
} |
||||||
|
|
||||||
|
public LinuxEnvironmentPlugin() { |
||||||
|
if(isSupported()) { |
||||||
|
this.controllers = enumerateControllers(); |
||||||
|
log("Linux plugin claims to have found " + controllers.length + " controllers"); |
||||||
|
AccessController.doPrivileged((PrivilegedAction<Void>)() -> { |
||||||
|
Runtime.getRuntime().addShutdownHook(new ShutdownHook()); |
||||||
|
return null; |
||||||
|
}); |
||||||
|
} else { |
||||||
|
controllers = new Controller[0]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns a list of all controllers available to this environment, |
||||||
|
* or an empty array if there are no controllers in this environment. |
||||||
|
* @return Returns a list of all controllers available to this environment, |
||||||
|
* or an empty array if there are no controllers in this environment. |
||||||
|
*/ |
||||||
|
public final Controller[] getControllers() { |
||||||
|
return controllers; |
||||||
|
} |
||||||
|
|
||||||
|
private final static Component[] createComponents(List<LinuxEventComponent> event_components, LinuxEventDevice device) { |
||||||
|
LinuxEventComponent[][] povs = new LinuxEventComponent[4][2]; |
||||||
|
List<LinuxComponent> components = new ArrayList<>(); |
||||||
|
for(int i = 0; i < event_components.size(); i++) { |
||||||
|
LinuxEventComponent event_component = event_components.get(i); |
||||||
|
Component.Identifier identifier = event_component.getIdentifier(); |
||||||
|
|
||||||
|
if(identifier == Component.Identifier.Axis.POV) { |
||||||
|
int native_code = event_component.getDescriptor().getCode(); |
||||||
|
switch(native_code) { |
||||||
|
case NativeDefinitions.ABS_HAT0X: |
||||||
|
povs[0][0] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT0Y: |
||||||
|
povs[0][1] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT1X: |
||||||
|
povs[1][0] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT1Y: |
||||||
|
povs[1][1] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT2X: |
||||||
|
povs[2][0] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT2Y: |
||||||
|
povs[2][1] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT3X: |
||||||
|
povs[3][0] = event_component; |
||||||
|
break; |
||||||
|
case NativeDefinitions.ABS_HAT3Y: |
||||||
|
povs[3][1] = event_component; |
||||||
|
break; |
||||||
|
default: |
||||||
|
log("Unknown POV instance: " + native_code); |
||||||
|
break; |
||||||
|
} |
||||||
|
} else if(identifier != null) { |
||||||
|
LinuxComponent component = new LinuxComponent(event_component); |
||||||
|
components.add(component); |
||||||
|
device.registerComponent(event_component.getDescriptor(), component); |
||||||
|
} |
||||||
|
} |
||||||
|
for(int i = 0; i < povs.length; i++) { |
||||||
|
LinuxEventComponent x = povs[i][0]; |
||||||
|
LinuxEventComponent y = povs[i][1]; |
||||||
|
if(x != null && y != null) { |
||||||
|
LinuxComponent controller_component = new LinuxPOV(x, y); |
||||||
|
components.add(controller_component); |
||||||
|
device.registerComponent(x.getDescriptor(), controller_component); |
||||||
|
device.registerComponent(y.getDescriptor(), controller_component); |
||||||
|
} |
||||||
|
} |
||||||
|
Component[] components_array = new Component[components.size()]; |
||||||
|
components.toArray(components_array); |
||||||
|
return components_array; |
||||||
|
} |
||||||
|
|
||||||
|
private final static Mouse createMouseFromDevice(LinuxEventDevice device, Component[] components) throws IOException { |
||||||
|
Mouse mouse = new LinuxMouse(device, components, new Controller[]{}, device.getRumblers()); |
||||||
|
if(mouse.getX() != null && mouse.getY() != null && mouse.getPrimaryButton() != null) |
||||||
|
return mouse; |
||||||
|
else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private final static Keyboard createKeyboardFromDevice(LinuxEventDevice device, Component[] components) throws IOException { |
||||||
|
Keyboard keyboard = new LinuxKeyboard(device, components, new Controller[]{}, device.getRumblers()); |
||||||
|
return keyboard; |
||||||
|
} |
||||||
|
|
||||||
|
private final static Controller createJoystickFromDevice(LinuxEventDevice device, Component[] components, Controller.Type type) throws IOException { |
||||||
|
Controller joystick = new LinuxAbstractController(device, components, new Controller[]{}, device.getRumblers(), type); |
||||||
|
return joystick; |
||||||
|
} |
||||||
|
|
||||||
|
private final static Controller createControllerFromDevice(LinuxEventDevice device) throws IOException { |
||||||
|
List<LinuxEventComponent> event_components = device.getComponents(); |
||||||
|
Component[] components = createComponents(event_components, device); |
||||||
|
Controller.Type type = device.getType(); |
||||||
|
|
||||||
|
if(type == Controller.Type.MOUSE) { |
||||||
|
return createMouseFromDevice(device, components); |
||||||
|
} else if(type == Controller.Type.KEYBOARD) { |
||||||
|
return createKeyboardFromDevice(device, components); |
||||||
|
} else if(type == Controller.Type.STICK || type == Controller.Type.GAMEPAD) { |
||||||
|
return createJoystickFromDevice(device, components, type); |
||||||
|
} else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private final Controller[] enumerateControllers() { |
||||||
|
List<Controller> controllers = new ArrayList<>(); |
||||||
|
List<Controller> eventControllers = new ArrayList<>(); |
||||||
|
List<Controller> jsControllers = new ArrayList<>(); |
||||||
|
enumerateEventControllers(eventControllers); |
||||||
|
enumerateJoystickControllers(jsControllers); |
||||||
|
|
||||||
|
for(int i = 0; i < eventControllers.size(); i++) { |
||||||
|
for(int j = 0; j < jsControllers.size(); j++) { |
||||||
|
Controller evController = eventControllers.get(i); |
||||||
|
Controller jsController = jsControllers.get(j); |
||||||
|
|
||||||
|
// compare
|
||||||
|
// Check if the nodes have the same name
|
||||||
|
if(evController.getName().equals(jsController.getName())) { |
||||||
|
// Check they have the same component count
|
||||||
|
Component[] evComponents = evController.getComponents(); |
||||||
|
Component[] jsComponents = jsController.getComponents(); |
||||||
|
if(evComponents.length == jsComponents.length) { |
||||||
|
boolean foundADifference = false; |
||||||
|
// check the component pairs are of the same type
|
||||||
|
for(int k = 0; k < evComponents.length; k++) { |
||||||
|
// Check the type of the component is the same
|
||||||
|
if(!(evComponents[k].getIdentifier() == jsComponents[k].getIdentifier())) { |
||||||
|
foundADifference = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if(!foundADifference) { |
||||||
|
controllers.add(new LinuxCombinedController((LinuxAbstractController) eventControllers.remove(i), (LinuxJoystickAbstractController) jsControllers.remove(j))); |
||||||
|
i--; |
||||||
|
j--; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
controllers.addAll(eventControllers); |
||||||
|
controllers.addAll(jsControllers); |
||||||
|
|
||||||
|
Controller[] controllers_array = new Controller[controllers.size()]; |
||||||
|
controllers.toArray(controllers_array); |
||||||
|
return controllers_array; |
||||||
|
} |
||||||
|
|
||||||
|
private final static Component.Identifier.Button getButtonIdentifier(int index) { |
||||||
|
switch(index) { |
||||||
|
case 0: |
||||||
|
return Component.Identifier.Button._0; |
||||||
|
case 1: |
||||||
|
return Component.Identifier.Button._1; |
||||||
|
case 2: |
||||||
|
return Component.Identifier.Button._2; |
||||||
|
case 3: |
||||||
|
return Component.Identifier.Button._3; |
||||||
|
case 4: |
||||||
|
return Component.Identifier.Button._4; |
||||||
|
case 5: |
||||||
|
return Component.Identifier.Button._5; |
||||||
|
case 6: |
||||||
|
return Component.Identifier.Button._6; |
||||||
|
case 7: |
||||||
|
return Component.Identifier.Button._7; |
||||||
|
case 8: |
||||||
|
return Component.Identifier.Button._8; |
||||||
|
case 9: |
||||||
|
return Component.Identifier.Button._9; |
||||||
|
case 10: |
||||||
|
return Component.Identifier.Button._10; |
||||||
|
case 11: |
||||||
|
return Component.Identifier.Button._11; |
||||||
|
case 12: |
||||||
|
return Component.Identifier.Button._12; |
||||||
|
case 13: |
||||||
|
return Component.Identifier.Button._13; |
||||||
|
case 14: |
||||||
|
return Component.Identifier.Button._14; |
||||||
|
case 15: |
||||||
|
return Component.Identifier.Button._15; |
||||||
|
case 16: |
||||||
|
return Component.Identifier.Button._16; |
||||||
|
case 17: |
||||||
|
return Component.Identifier.Button._17; |
||||||
|
case 18: |
||||||
|
return Component.Identifier.Button._18; |
||||||
|
case 19: |
||||||
|
return Component.Identifier.Button._19; |
||||||
|
case 20: |
||||||
|
return Component.Identifier.Button._20; |
||||||
|
case 21: |
||||||
|
return Component.Identifier.Button._21; |
||||||
|
case 22: |
||||||
|
return Component.Identifier.Button._22; |
||||||
|
case 23: |
||||||
|
return Component.Identifier.Button._23; |
||||||
|
case 24: |
||||||
|
return Component.Identifier.Button._24; |
||||||
|
case 25: |
||||||
|
return Component.Identifier.Button._25; |
||||||
|
case 26: |
||||||
|
return Component.Identifier.Button._26; |
||||||
|
case 27: |
||||||
|
return Component.Identifier.Button._27; |
||||||
|
case 28: |
||||||
|
return Component.Identifier.Button._28; |
||||||
|
case 29: |
||||||
|
return Component.Identifier.Button._29; |
||||||
|
case 30: |
||||||
|
return Component.Identifier.Button._30; |
||||||
|
case 31: |
||||||
|
return Component.Identifier.Button._31; |
||||||
|
default: |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final static Controller createJoystickFromJoystickDevice(LinuxJoystickDevice device) { |
||||||
|
List<AbstractComponent> components = new ArrayList<>(); |
||||||
|
byte[] axisMap = device.getAxisMap(); |
||||||
|
char[] buttonMap = device.getButtonMap(); |
||||||
|
LinuxJoystickAxis[] hatBits = new LinuxJoystickAxis[6]; |
||||||
|
|
||||||
|
for(int i = 0; i < device.getNumButtons(); i++) { |
||||||
|
Component.Identifier button_id = LinuxNativeTypesMap.getButtonID(buttonMap[i]); |
||||||
|
if(button_id != null) { |
||||||
|
LinuxJoystickButton button = new LinuxJoystickButton(button_id); |
||||||
|
device.registerButton(i, button); |
||||||
|
components.add(button); |
||||||
|
} |
||||||
|
} |
||||||
|
for(int i = 0; i < device.getNumAxes(); i++) { |
||||||
|
Component.Identifier.Axis axis_id; |
||||||
|
axis_id = (Component.Identifier.Axis) LinuxNativeTypesMap.getAbsAxisID(axisMap[i]); |
||||||
|
LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id); |
||||||
|
|
||||||
|
device.registerAxis(i, axis); |
||||||
|
|
||||||
|
if(axisMap[i] == NativeDefinitions.ABS_HAT0X) { |
||||||
|
hatBits[0] = axis; |
||||||
|
} else if(axisMap[i] == NativeDefinitions.ABS_HAT0Y) { |
||||||
|
hatBits[1] = axis; |
||||||
|
axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[0], hatBits[1]); |
||||||
|
device.registerPOV((LinuxJoystickPOV) axis); |
||||||
|
components.add(axis); |
||||||
|
} else if(axisMap[i] == NativeDefinitions.ABS_HAT1X) { |
||||||
|
hatBits[2] = axis; |
||||||
|
} else if(axisMap[i] == NativeDefinitions.ABS_HAT1Y) { |
||||||
|
hatBits[3] = axis; |
||||||
|
axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[2], hatBits[3]); |
||||||
|
device.registerPOV((LinuxJoystickPOV) axis); |
||||||
|
components.add(axis); |
||||||
|
} else if(axisMap[i] == NativeDefinitions.ABS_HAT2X) { |
||||||
|
hatBits[4] = axis; |
||||||
|
} else if(axisMap[i] == NativeDefinitions.ABS_HAT2Y) { |
||||||
|
hatBits[5] = axis; |
||||||
|
axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[4], hatBits[5]); |
||||||
|
device.registerPOV((LinuxJoystickPOV) axis); |
||||||
|
components.add(axis); |
||||||
|
} else { |
||||||
|
components.add(axis); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return new LinuxJoystickAbstractController(device, components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{}); |
||||||
|
} |
||||||
|
|
||||||
|
private final void enumerateJoystickControllers(List<Controller> controllers) { |
||||||
|
File[] joystick_device_files = enumerateJoystickDeviceFiles("/dev/input"); |
||||||
|
if(joystick_device_files == null || joystick_device_files.length == 0) { |
||||||
|
joystick_device_files = enumerateJoystickDeviceFiles("/dev"); |
||||||
|
if(joystick_device_files == null) |
||||||
|
return; |
||||||
|
} |
||||||
|
for(int i = 0; i < joystick_device_files.length; i++) { |
||||||
|
File event_file = joystick_device_files[i]; |
||||||
|
try { |
||||||
|
String path = getAbsolutePathPrivileged(event_file); |
||||||
|
LinuxJoystickDevice device = new LinuxJoystickDevice(path); |
||||||
|
Controller controller = createJoystickFromJoystickDevice(device); |
||||||
|
if(controller != null) { |
||||||
|
controllers.add(controller); |
||||||
|
devices.add(device); |
||||||
|
} else |
||||||
|
device.close(); |
||||||
|
} catch(IOException e) { |
||||||
|
log("Failed to open device (" + event_file + "): " + e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final static File[] enumerateJoystickDeviceFiles(final String dev_path) { |
||||||
|
final File dev = new File(dev_path); |
||||||
|
return listFilesPrivileged(dev, new FilenameFilter() { |
||||||
|
public final boolean accept(File dir, String name) { |
||||||
|
return name.startsWith("js"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
private static String getAbsolutePathPrivileged(final File file) { |
||||||
|
return AccessController.doPrivileged((PrivilegedAction<String>) () -> file.getAbsolutePath()); |
||||||
|
} |
||||||
|
|
||||||
|
private static File[] listFilesPrivileged(final File dir, final FilenameFilter filter) { |
||||||
|
return AccessController.doPrivileged((PrivilegedAction<File[]>) () -> { |
||||||
|
File[] files = dir.listFiles(filter); |
||||||
|
if(files == null) { |
||||||
|
log("dir " + dir.getName() + " exists: " + dir.exists() + ", is writable: " + dir.isDirectory()); |
||||||
|
files = new File[]{}; |
||||||
|
} else { |
||||||
|
Arrays.sort(files, Comparator.comparing(File::getName)); |
||||||
|
} |
||||||
|
return files; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
private final void enumerateEventControllers(List<Controller> controllers) { |
||||||
|
final File dev = new File("/dev/input"); |
||||||
|
File[] event_device_files = listFilesPrivileged(dev, (File dir, String name) -> 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) { |
||||||
|
log("Failed to create Controller: " + e.getMessage()); |
||||||
|
device.close(); |
||||||
|
} |
||||||
|
} catch(IOException e) { |
||||||
|
log("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++) { |
||||||
|
try { |
||||||
|
LinuxDevice device = devices.get(i); |
||||||
|
device.close(); |
||||||
|
} catch(IOException e) { |
||||||
|
log("Failed to close device: " + e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isSupported() { |
||||||
|
return supported; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxEvent { |
||||||
|
private long nanos; |
||||||
|
private final LinuxAxisDescriptor descriptor = new LinuxAxisDescriptor(); |
||||||
|
private int value; |
||||||
|
|
||||||
|
public final void set(long seconds, long microseconds, int type, int code, int value) { |
||||||
|
this.nanos = (seconds*1000000 + microseconds)*1000; |
||||||
|
this.descriptor.set(type, code); |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getValue() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
public final LinuxAxisDescriptor getDescriptor() { |
||||||
|
return descriptor; |
||||||
|
} |
||||||
|
|
||||||
|
public final long getNanos() { |
||||||
|
return nanos; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,115 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
* @author Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
*/ |
||||||
|
final class LinuxEventComponent { |
||||||
|
private final LinuxEventDevice device; |
||||||
|
private final Component.Identifier identifier; |
||||||
|
private final Controller.Type button_trait; |
||||||
|
private final boolean is_relative; |
||||||
|
private final LinuxAxisDescriptor descriptor; |
||||||
|
private final int min; |
||||||
|
private final int max; |
||||||
|
private final int flat; |
||||||
|
|
||||||
|
|
||||||
|
public LinuxEventComponent(LinuxEventDevice device, Component.Identifier identifier, boolean is_relative, int native_type, int native_code) throws IOException { |
||||||
|
this.device = device; |
||||||
|
this.identifier = identifier; |
||||||
|
if (native_type == NativeDefinitions.EV_KEY) |
||||||
|
this.button_trait = LinuxNativeTypesMap.guessButtonTrait(native_code); |
||||||
|
else |
||||||
|
this.button_trait = Controller.Type.UNKNOWN; |
||||||
|
this.is_relative = is_relative; |
||||||
|
this.descriptor = new LinuxAxisDescriptor(); |
||||||
|
descriptor.set(native_type, native_code); |
||||||
|
if (native_type == NativeDefinitions.EV_ABS) { |
||||||
|
LinuxAbsInfo abs_info = new LinuxAbsInfo(); |
||||||
|
getAbsInfo(abs_info); |
||||||
|
this.min = abs_info.getMin(); |
||||||
|
this.max = abs_info.getMax(); |
||||||
|
this.flat = abs_info.getFlat(); |
||||||
|
} else { |
||||||
|
this.min = Integer.MIN_VALUE; |
||||||
|
this.max = Integer.MAX_VALUE; |
||||||
|
this.flat = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final LinuxEventDevice getDevice() { |
||||||
|
return device; |
||||||
|
} |
||||||
|
|
||||||
|
public final void getAbsInfo(LinuxAbsInfo abs_info) throws IOException { |
||||||
|
assert descriptor.getType() == NativeDefinitions.EV_ABS; |
||||||
|
device.getAbsInfo(descriptor.getCode(), abs_info); |
||||||
|
} |
||||||
|
|
||||||
|
public final Controller.Type getButtonTrait() { |
||||||
|
return button_trait; |
||||||
|
} |
||||||
|
|
||||||
|
public final Component.Identifier getIdentifier() { |
||||||
|
return identifier; |
||||||
|
} |
||||||
|
|
||||||
|
public final LinuxAxisDescriptor getDescriptor() { |
||||||
|
return descriptor; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return is_relative; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isAnalog() { |
||||||
|
return identifier instanceof Component.Identifier.Axis && identifier != Component.Identifier.Axis.POV; |
||||||
|
} |
||||||
|
|
||||||
|
final float convertValue(float value) { |
||||||
|
if (identifier instanceof Component.Identifier.Axis && !is_relative) { |
||||||
|
// Some axes have min = max = 0
|
||||||
|
if (min == max) |
||||||
|
return 0; |
||||||
|
if (value > max) |
||||||
|
value = max; |
||||||
|
else if (value < min) |
||||||
|
value = min; |
||||||
|
return 2*(value - min)/(max - min) - 1; |
||||||
|
} else { |
||||||
|
return value; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final float getDeadZone() { |
||||||
|
return flat/(2f*(max - min)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,367 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.ArrayList; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxEventDevice implements LinuxDevice { |
||||||
|
private final Map<LinuxAxisDescriptor, LinuxComponent> component_map = new HashMap<>(); |
||||||
|
private final Rumbler[] rumblers; |
||||||
|
private final long fd; |
||||||
|
private final String name; |
||||||
|
private final LinuxInputID input_id; |
||||||
|
private final List<LinuxEventComponent> components; |
||||||
|
private final Controller.Type type; |
||||||
|
|
||||||
|
/* Closed state variable that protects the validity of the file descriptor. |
||||||
|
* Access to the closed state must be synchronized |
||||||
|
*/ |
||||||
|
private boolean closed; |
||||||
|
|
||||||
|
/* Access to the key_states array could be synchronized, but |
||||||
|
* it doesn't hurt to have multiple threads read/write from/to it |
||||||
|
*/ |
||||||
|
private final byte[] key_states = new byte[NativeDefinitions.KEY_MAX/8 + 1]; |
||||||
|
|
||||||
|
public LinuxEventDevice(String filename) throws IOException { |
||||||
|
long fd; |
||||||
|
boolean detect_rumblers = true; |
||||||
|
try { |
||||||
|
fd = nOpen(filename, true); |
||||||
|
} catch (IOException e) { |
||||||
|
fd = nOpen(filename, false); |
||||||
|
detect_rumblers = false; |
||||||
|
} |
||||||
|
this.fd = fd; |
||||||
|
try { |
||||||
|
this.name = getDeviceName(); |
||||||
|
this.input_id = getDeviceInputID(); |
||||||
|
this.components = getDeviceComponents(); |
||||||
|
if (detect_rumblers) |
||||||
|
this.rumblers = enumerateRumblers(); |
||||||
|
else |
||||||
|
this.rumblers = new Rumbler[]{}; |
||||||
|
this.type = guessType(); |
||||||
|
} catch (IOException e) { |
||||||
|
close(); |
||||||
|
throw e; |
||||||
|
} |
||||||
|
} |
||||||
|
private final static native long nOpen(String filename, boolean rw) throws IOException; |
||||||
|
|
||||||
|
public final Controller.Type getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
private final static int countComponents(List<LinuxEventComponent> components, Class<?> id_type, boolean relative) { |
||||||
|
int count = 0; |
||||||
|
for (int i = 0; i < components.size(); i++) { |
||||||
|
LinuxEventComponent component = components.get(i); |
||||||
|
if (id_type.isInstance(component.getIdentifier()) && relative == component.isRelative()) |
||||||
|
count++; |
||||||
|
} |
||||||
|
return count; |
||||||
|
} |
||||||
|
|
||||||
|
private final Controller.Type guessType() throws IOException { |
||||||
|
List<LinuxEventComponent> components = getComponents(); |
||||||
|
if (components.size() == 0) |
||||||
|
return Controller.Type.UNKNOWN; |
||||||
|
int num_rel_axes = countComponents(components, Component.Identifier.Axis.class, true); |
||||||
|
int num_abs_axes = countComponents(components, Component.Identifier.Axis.class, false); |
||||||
|
int num_keys = countComponents(components, Component.Identifier.Key.class, false); |
||||||
|
int mouse_traits = 0; |
||||||
|
int keyboard_traits = 0; |
||||||
|
int joystick_traits = 0; |
||||||
|
int gamepad_traits = 0; |
||||||
|
if (name.toLowerCase().indexOf("mouse") != -1) |
||||||
|
mouse_traits++; |
||||||
|
if (name.toLowerCase().indexOf("keyboard") != -1) |
||||||
|
keyboard_traits++; |
||||||
|
if (name.toLowerCase().indexOf("joystick") != -1) |
||||||
|
joystick_traits++; |
||||||
|
if (name.toLowerCase().indexOf("gamepad") != -1) |
||||||
|
gamepad_traits++; |
||||||
|
int num_keyboard_button_traits = 0; |
||||||
|
int num_mouse_button_traits = 0; |
||||||
|
int num_joystick_button_traits = 0; |
||||||
|
int num_gamepad_button_traits = 0; |
||||||
|
// count button traits
|
||||||
|
for (int i = 0; i < components.size(); i++) { |
||||||
|
LinuxEventComponent component = components.get(i); |
||||||
|
if (component.getButtonTrait() == Controller.Type.MOUSE) |
||||||
|
num_mouse_button_traits++; |
||||||
|
else if (component.getButtonTrait() == Controller.Type.KEYBOARD) |
||||||
|
num_keyboard_button_traits++; |
||||||
|
else if (component.getButtonTrait() == Controller.Type.GAMEPAD) |
||||||
|
num_gamepad_button_traits++; |
||||||
|
else if (component.getButtonTrait() == Controller.Type.STICK) |
||||||
|
num_joystick_button_traits++; |
||||||
|
} |
||||||
|
if ((num_mouse_button_traits >= num_keyboard_button_traits) && (num_mouse_button_traits >= num_joystick_button_traits) && (num_mouse_button_traits >= num_gamepad_button_traits)) { |
||||||
|
mouse_traits++; |
||||||
|
} else if ((num_keyboard_button_traits >= num_mouse_button_traits) && (num_keyboard_button_traits >= num_joystick_button_traits) && (num_keyboard_button_traits >= num_gamepad_button_traits)) { |
||||||
|
keyboard_traits++; |
||||||
|
} else if ((num_joystick_button_traits >= num_keyboard_button_traits) && (num_joystick_button_traits >= num_mouse_button_traits) && (num_joystick_button_traits >= num_gamepad_button_traits)) { |
||||||
|
joystick_traits++; |
||||||
|
} else if ((num_gamepad_button_traits >= num_keyboard_button_traits) && (num_gamepad_button_traits >= num_mouse_button_traits) && (num_gamepad_button_traits >= num_joystick_button_traits)) { |
||||||
|
gamepad_traits++; |
||||||
|
} |
||||||
|
if (num_rel_axes >= 2) { |
||||||
|
mouse_traits++; |
||||||
|
} |
||||||
|
if (num_abs_axes >= 2) { |
||||||
|
joystick_traits++; |
||||||
|
gamepad_traits++; |
||||||
|
} |
||||||
|
|
||||||
|
if ((mouse_traits >= keyboard_traits) && (mouse_traits >= joystick_traits) && (mouse_traits >= gamepad_traits)) { |
||||||
|
return Controller.Type.MOUSE; |
||||||
|
} else if ((keyboard_traits >= mouse_traits) && (keyboard_traits >= joystick_traits) && (keyboard_traits >= gamepad_traits)) { |
||||||
|
return Controller.Type.KEYBOARD; |
||||||
|
} else if ((joystick_traits >= mouse_traits) && (joystick_traits >= keyboard_traits) && (joystick_traits >= gamepad_traits)) { |
||||||
|
return Controller.Type.STICK; |
||||||
|
} else if ((gamepad_traits >= mouse_traits) && (gamepad_traits >= keyboard_traits) && (gamepad_traits >= joystick_traits)) { |
||||||
|
return Controller.Type.GAMEPAD; |
||||||
|
} else |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private final Rumbler[] enumerateRumblers() { |
||||||
|
List<Rumbler> rumblers = new ArrayList<>(); |
||||||
|
try { |
||||||
|
int num_effects = getNumEffects(); |
||||||
|
if (num_effects <= 0) |
||||||
|
return rumblers.toArray(new Rumbler[]{}); |
||||||
|
byte[] ff_bits = getForceFeedbackBits(); |
||||||
|
if (isBitSet(ff_bits, NativeDefinitions.FF_RUMBLE) && num_effects > rumblers.size()) { |
||||||
|
rumblers.add(new LinuxRumbleFF(this)); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
LinuxEnvironmentPlugin.log("Failed to enumerate rumblers: " + e.getMessage()); |
||||||
|
} |
||||||
|
return rumblers.toArray(new Rumbler[]{}); |
||||||
|
} |
||||||
|
|
||||||
|
public final Rumbler[] getRumblers() { |
||||||
|
return rumblers; |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized int uploadRumbleEffect(int id, int trigger_button, int direction, int trigger_interval, int replay_length, int replay_delay, int strong_magnitude, int weak_magnitude) throws IOException { |
||||||
|
checkClosed(); |
||||||
|
return nUploadRumbleEffect(fd, id, direction, trigger_button, trigger_interval, replay_length, replay_delay, strong_magnitude, weak_magnitude); |
||||||
|
} |
||||||
|
private final static native int nUploadRumbleEffect(long fd, int id, int direction, int trigger_button, int trigger_interval, int replay_length, int replay_delay, int strong_magnitude, int weak_magnitude) throws IOException; |
||||||
|
|
||||||
|
public final synchronized int uploadConstantEffect(int id, int trigger_button, int direction, int trigger_interval, int replay_length, int replay_delay, int constant_level, int constant_env_attack_length, int constant_env_attack_level, int constant_env_fade_length, int constant_env_fade_level) throws IOException { |
||||||
|
checkClosed(); |
||||||
|
return nUploadConstantEffect(fd, id, direction, trigger_button, trigger_interval, replay_length, replay_delay, constant_level, constant_env_attack_length, constant_env_attack_level, constant_env_fade_length, constant_env_fade_level); |
||||||
|
} |
||||||
|
private final static native int nUploadConstantEffect(long fd, int id, int direction, int trigger_button, int trigger_interval, int replay_length, int replay_delay, int constant_level, int constant_env_attack_length, int constant_env_attack_level, int constant_env_fade_length, int constant_env_fade_level) throws IOException; |
||||||
|
|
||||||
|
final void eraseEffect(int id) throws IOException { |
||||||
|
nEraseEffect(fd, id); |
||||||
|
} |
||||||
|
private final static native void nEraseEffect(long fd, int ff_id) throws IOException; |
||||||
|
|
||||||
|
public final synchronized void writeEvent(int type, int code, int value) throws IOException { |
||||||
|
checkClosed(); |
||||||
|
nWriteEvent(fd, type, code, value); |
||||||
|
} |
||||||
|
private final static native void nWriteEvent(long fd, int type, int code, int value) throws IOException; |
||||||
|
|
||||||
|
public final void registerComponent(LinuxAxisDescriptor desc, LinuxComponent component) { |
||||||
|
component_map.put(desc, component); |
||||||
|
} |
||||||
|
|
||||||
|
public final LinuxComponent mapDescriptor(LinuxAxisDescriptor desc) { |
||||||
|
return component_map.get(desc); |
||||||
|
} |
||||||
|
|
||||||
|
public final Controller.PortType getPortType() throws IOException { |
||||||
|
return input_id.getPortType(); |
||||||
|
} |
||||||
|
|
||||||
|
public final LinuxInputID getInputID() { |
||||||
|
return input_id; |
||||||
|
} |
||||||
|
|
||||||
|
private final LinuxInputID getDeviceInputID() throws IOException { |
||||||
|
return nGetInputID(fd); |
||||||
|
} |
||||||
|
private final static native LinuxInputID nGetInputID(long fd) throws IOException; |
||||||
|
|
||||||
|
public final int getNumEffects() throws IOException { |
||||||
|
return nGetNumEffects(fd); |
||||||
|
} |
||||||
|
private final static native int nGetNumEffects(long fd) throws IOException; |
||||||
|
|
||||||
|
private final int getVersion() throws IOException { |
||||||
|
return nGetVersion(fd); |
||||||
|
} |
||||||
|
private final static native int nGetVersion(long fd) throws IOException; |
||||||
|
|
||||||
|
public final synchronized boolean getNextEvent(LinuxEvent linux_event) throws IOException { |
||||||
|
checkClosed(); |
||||||
|
return nGetNextEvent(fd, linux_event); |
||||||
|
} |
||||||
|
private final static native boolean nGetNextEvent(long fd, LinuxEvent linux_event) throws IOException; |
||||||
|
|
||||||
|
public final synchronized void getAbsInfo(int abs_axis, LinuxAbsInfo abs_info) throws IOException { |
||||||
|
checkClosed(); |
||||||
|
nGetAbsInfo(fd, abs_axis, abs_info); |
||||||
|
} |
||||||
|
private final static native void nGetAbsInfo(long fd, int abs_axis, LinuxAbsInfo abs_info) throws IOException; |
||||||
|
|
||||||
|
private final void addKeys(List<LinuxEventComponent> components) throws IOException { |
||||||
|
byte[] bits = getKeysBits(); |
||||||
|
for (int i = 0; i < bits.length*8; i++) { |
||||||
|
if (isBitSet(bits, i)) { |
||||||
|
Component.Identifier id = LinuxNativeTypesMap.getButtonID(i); |
||||||
|
components.add(new LinuxEventComponent(this, id, false, NativeDefinitions.EV_KEY, i)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final void addAbsoluteAxes(List<LinuxEventComponent> components) throws IOException { |
||||||
|
byte[] bits = getAbsoluteAxesBits(); |
||||||
|
for (int i = 0; i < bits.length*8; i++) { |
||||||
|
if (isBitSet(bits, i)) { |
||||||
|
Component.Identifier id = LinuxNativeTypesMap.getAbsAxisID(i); |
||||||
|
components.add(new LinuxEventComponent(this, id, false, NativeDefinitions.EV_ABS, i)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final void addRelativeAxes(List<LinuxEventComponent> components) throws IOException { |
||||||
|
byte[] bits = getRelativeAxesBits(); |
||||||
|
for (int i = 0; i < bits.length*8; i++) { |
||||||
|
if (isBitSet(bits, i)) { |
||||||
|
Component.Identifier id = LinuxNativeTypesMap.getRelAxisID(i); |
||||||
|
components.add(new LinuxEventComponent(this, id, true, NativeDefinitions.EV_REL, i)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final List<LinuxEventComponent> getComponents() { |
||||||
|
return components; |
||||||
|
} |
||||||
|
|
||||||
|
private final List<LinuxEventComponent> getDeviceComponents() throws IOException { |
||||||
|
List<LinuxEventComponent> components = new ArrayList<>(); |
||||||
|
byte[] evtype_bits = getEventTypeBits(); |
||||||
|
if (isBitSet(evtype_bits, NativeDefinitions.EV_KEY)) |
||||||
|
addKeys(components); |
||||||
|
if (isBitSet(evtype_bits, NativeDefinitions.EV_ABS)) |
||||||
|
addAbsoluteAxes(components); |
||||||
|
if (isBitSet(evtype_bits, NativeDefinitions.EV_REL)) |
||||||
|
addRelativeAxes(components); |
||||||
|
return components; |
||||||
|
} |
||||||
|
|
||||||
|
private final byte[] getForceFeedbackBits() throws IOException { |
||||||
|
byte[] bits = new byte[NativeDefinitions.FF_MAX/8 + 1]; |
||||||
|
nGetBits(fd, NativeDefinitions.EV_FF, bits); |
||||||
|
return bits; |
||||||
|
} |
||||||
|
|
||||||
|
private final byte[] getKeysBits() throws IOException { |
||||||
|
byte[] bits = new byte[NativeDefinitions.KEY_MAX/8 + 1]; |
||||||
|
nGetBits(fd, NativeDefinitions.EV_KEY, bits); |
||||||
|
return bits; |
||||||
|
} |
||||||
|
|
||||||
|
private final byte[] getAbsoluteAxesBits() throws IOException { |
||||||
|
byte[] bits = new byte[NativeDefinitions.ABS_MAX/8 + 1]; |
||||||
|
nGetBits(fd, NativeDefinitions.EV_ABS, bits); |
||||||
|
return bits; |
||||||
|
} |
||||||
|
|
||||||
|
private final byte[] getRelativeAxesBits() throws IOException { |
||||||
|
byte[] bits = new byte[NativeDefinitions.REL_MAX/8 + 1]; |
||||||
|
nGetBits(fd, NativeDefinitions.EV_REL, bits); |
||||||
|
return bits; |
||||||
|
} |
||||||
|
|
||||||
|
private final byte[] getEventTypeBits() throws IOException { |
||||||
|
byte[] bits = new byte[NativeDefinitions.EV_MAX/8 + 1]; |
||||||
|
nGetBits(fd, 0, bits); |
||||||
|
return bits; |
||||||
|
} |
||||||
|
private final static native void nGetBits(long fd, int ev_type, byte[] evtype_bits) throws IOException; |
||||||
|
|
||||||
|
public final synchronized void pollKeyStates() throws IOException { |
||||||
|
nGetKeyStates(fd, key_states); |
||||||
|
} |
||||||
|
private final static native void nGetKeyStates(long fd, byte[] states) throws IOException; |
||||||
|
|
||||||
|
public final boolean isKeySet(int bit) { |
||||||
|
return isBitSet(key_states, bit); |
||||||
|
} |
||||||
|
|
||||||
|
public final static boolean isBitSet(byte[] bits, int bit) { |
||||||
|
return (bits[bit/8] & (1<<(bit%8))) != 0; |
||||||
|
} |
||||||
|
|
||||||
|
public final String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
private final String getDeviceName() throws IOException { |
||||||
|
return nGetName(fd); |
||||||
|
} |
||||||
|
private final static native String nGetName(long fd) throws IOException; |
||||||
|
|
||||||
|
public synchronized final void close() throws IOException { |
||||||
|
if (closed) |
||||||
|
return; |
||||||
|
closed = true; |
||||||
|
LinuxEnvironmentPlugin.execute(new LinuxDeviceTask() { |
||||||
|
protected final Object execute() throws IOException { |
||||||
|
nClose(fd); |
||||||
|
return null; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
private final static native void nClose(long fd) throws IOException; |
||||||
|
|
||||||
|
private final void checkClosed() throws IOException { |
||||||
|
if (closed) |
||||||
|
throw new IOException("Device is closed"); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") |
||||||
|
protected void finalize() throws IOException { |
||||||
|
close(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,110 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
abstract class LinuxForceFeedbackEffect implements Rumbler { |
||||||
|
private final LinuxEventDevice device; |
||||||
|
private final int ff_id; |
||||||
|
private final WriteTask write_task = new WriteTask(); |
||||||
|
private final UploadTask upload_task = new UploadTask(); |
||||||
|
|
||||||
|
public LinuxForceFeedbackEffect(LinuxEventDevice device) throws IOException { |
||||||
|
this.device = device; |
||||||
|
this.ff_id = upload_task.doUpload(-1, 0); |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract int upload(int id, float intensity) throws IOException; |
||||||
|
|
||||||
|
protected final LinuxEventDevice getDevice() { |
||||||
|
return device; |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized final void rumble(float intensity) { |
||||||
|
try { |
||||||
|
if (intensity > 0) { |
||||||
|
upload_task.doUpload(ff_id, intensity); |
||||||
|
write_task.write(1); |
||||||
|
} else { |
||||||
|
write_task.write(0); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
LinuxEnvironmentPlugin.log("Failed to rumble: " + e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Erase doesn't seem to be implemented on Logitech joysticks, |
||||||
|
* so we'll rely on the kernel cleaning up on device close |
||||||
|
*/ |
||||||
|
/* |
||||||
|
public final void erase() throws IOException { |
||||||
|
device.eraseEffect(ff_id); |
||||||
|
} |
||||||
|
*/ |
||||||
|
public final String getAxisName() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public final Component.Identifier getAxisIdentifier() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private final class UploadTask extends LinuxDeviceTask { |
||||||
|
private int id; |
||||||
|
private float intensity; |
||||||
|
|
||||||
|
public final int doUpload(int id, float intensity) throws IOException { |
||||||
|
this.id = id; |
||||||
|
this.intensity = intensity; |
||||||
|
LinuxEnvironmentPlugin.execute(this); |
||||||
|
return this.id; |
||||||
|
} |
||||||
|
|
||||||
|
protected final Object execute() throws IOException { |
||||||
|
this.id = upload(id, intensity); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final class WriteTask extends LinuxDeviceTask { |
||||||
|
private int value; |
||||||
|
|
||||||
|
public final void write(int value) throws IOException { |
||||||
|
this.value = value; |
||||||
|
LinuxEnvironmentPlugin.execute(this); |
||||||
|
} |
||||||
|
|
||||||
|
protected final Object execute() throws IOException { |
||||||
|
device.writeEvent(NativeDefinitions.EV_FF, ff_id, value); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxInputID { |
||||||
|
private final int bustype; |
||||||
|
private final int vendor; |
||||||
|
private final int product; |
||||||
|
private final int version; |
||||||
|
|
||||||
|
public LinuxInputID(int bustype, int vendor, int product, int version) { |
||||||
|
this.bustype = bustype; |
||||||
|
this.vendor = vendor; |
||||||
|
this.product = product; |
||||||
|
this.version = version; |
||||||
|
} |
||||||
|
|
||||||
|
public final Controller.PortType getPortType() { |
||||||
|
return LinuxNativeTypesMap.getPortType(bustype); |
||||||
|
} |
||||||
|
|
||||||
|
public final String toString() { |
||||||
|
return "LinuxInputID: bustype = 0x" + Integer.toHexString(bustype) + " | vendor = 0x" + Integer.toHexString(vendor) + |
||||||
|
" | product = 0x" + Integer.toHexString(product) + " | version = 0x" + Integer.toHexString(version); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents a Linux controller |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxJoystickAbstractController extends AbstractController { |
||||||
|
private final LinuxJoystickDevice device; |
||||||
|
|
||||||
|
protected LinuxJoystickAbstractController(LinuxJoystickDevice device, Component[] components, Controller[] children, Rumbler[] rumblers) { |
||||||
|
super(device.getName(), components, children, rumblers); |
||||||
|
this.device = device; |
||||||
|
} |
||||||
|
|
||||||
|
protected final void setDeviceEventQueueSize(int size) throws IOException { |
||||||
|
device.setBufferSize(size); |
||||||
|
} |
||||||
|
|
||||||
|
public final void pollDevice() throws IOException { |
||||||
|
device.poll(); |
||||||
|
} |
||||||
|
|
||||||
|
protected final boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
return device.getNextEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
public Type getType() { |
||||||
|
return Controller.Type.STICK; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents a linux Axis |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
class LinuxJoystickAxis extends AbstractComponent { |
||||||
|
private float value; |
||||||
|
private boolean analog; |
||||||
|
|
||||||
|
public LinuxJoystickAxis(Component.Identifier.Axis axis_id) { |
||||||
|
this(axis_id, true); |
||||||
|
} |
||||||
|
|
||||||
|
public LinuxJoystickAxis(Component.Identifier.Axis axis_id, boolean analog) { |
||||||
|
super(axis_id.getName(), axis_id); |
||||||
|
this.analog = analog; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isAnalog() { |
||||||
|
return analog; |
||||||
|
} |
||||||
|
|
||||||
|
final void setValue(float value) { |
||||||
|
this.value = value; |
||||||
|
resetHasPolled(); |
||||||
|
} |
||||||
|
|
||||||
|
protected final float poll() throws IOException { |
||||||
|
return value; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents a linux button from the joystick interface
|
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxJoystickButton extends AbstractComponent { |
||||||
|
private float value; |
||||||
|
|
||||||
|
public LinuxJoystickButton(Component.Identifier button_id) { |
||||||
|
super(button_id.getName(), button_id); |
||||||
|
} |
||||||
|
|
||||||
|
public final boolean isRelative() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
final void setValue(float value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
protected final float poll() throws IOException { |
||||||
|
return value; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,238 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxJoystickDevice implements LinuxDevice { |
||||||
|
public final static int JS_EVENT_BUTTON = 0x01; /* button pressed/released */ |
||||||
|
public final static int JS_EVENT_AXIS = 0x02; /* joystick moved */ |
||||||
|
public final static int JS_EVENT_INIT = 0x80; /* initial state of device */ |
||||||
|
|
||||||
|
public final static int AXIS_MAX_VALUE = 32767; |
||||||
|
|
||||||
|
private final long fd; |
||||||
|
private final String name; |
||||||
|
|
||||||
|
private final LinuxJoystickEvent joystick_event = new LinuxJoystickEvent(); |
||||||
|
private final Event event = new Event(); |
||||||
|
private final LinuxJoystickButton[] buttons; |
||||||
|
private final LinuxJoystickAxis[] axes; |
||||||
|
private final Map<Integer, LinuxJoystickPOV> povXs = new HashMap<>(); |
||||||
|
private final Map<Integer, LinuxJoystickPOV> povYs = new HashMap<>(); |
||||||
|
private final byte[] axisMap; |
||||||
|
private final char[] buttonMap; |
||||||
|
|
||||||
|
private EventQueue event_queue; |
||||||
|
|
||||||
|
/* Closed state variable that protects the validity of the file descriptor. |
||||||
|
* Access to the closed state must be synchronized |
||||||
|
*/ |
||||||
|
private boolean closed; |
||||||
|
|
||||||
|
public LinuxJoystickDevice(String filename) throws IOException { |
||||||
|
this.fd = nOpen(filename); |
||||||
|
try { |
||||||
|
this.name = getDeviceName(); |
||||||
|
setBufferSize(AbstractController.EVENT_QUEUE_DEPTH); |
||||||
|
buttons = new LinuxJoystickButton[getNumDeviceButtons()]; |
||||||
|
axes = new LinuxJoystickAxis[getNumDeviceAxes()]; |
||||||
|
axisMap = getDeviceAxisMap(); |
||||||
|
buttonMap = getDeviceButtonMap(); |
||||||
|
} catch (IOException e) { |
||||||
|
close(); |
||||||
|
throw e; |
||||||
|
} |
||||||
|
} |
||||||
|
private final static native long nOpen(String filename) throws IOException; |
||||||
|
|
||||||
|
public final synchronized void setBufferSize(int size) { |
||||||
|
event_queue = new EventQueue(size); |
||||||
|
} |
||||||
|
|
||||||
|
private final void processEvent(LinuxJoystickEvent joystick_event) { |
||||||
|
int index = joystick_event.getNumber(); |
||||||
|
// Filter synthetic init event flag
|
||||||
|
int type = joystick_event.getType() & ~JS_EVENT_INIT; |
||||||
|
switch (type) { |
||||||
|
case JS_EVENT_BUTTON: |
||||||
|
if (index < getNumButtons()) { |
||||||
|
LinuxJoystickButton button = buttons[index]; |
||||||
|
if (button != null) { |
||||||
|
float value = joystick_event.getValue(); |
||||||
|
button.setValue(value); |
||||||
|
event.set(button, value, joystick_event.getNanos()); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return; |
||||||
|
case JS_EVENT_AXIS: |
||||||
|
if (index < getNumAxes()) { |
||||||
|
LinuxJoystickAxis axis = axes[index]; |
||||||
|
if (axis != null) { |
||||||
|
float value = (float)joystick_event.getValue()/AXIS_MAX_VALUE; |
||||||
|
axis.setValue(value); |
||||||
|
if(povXs.containsKey(index)) { |
||||||
|
LinuxJoystickPOV pov = povXs.get(index); |
||||||
|
pov.updateValue(); |
||||||
|
event.set(pov, pov.getPollData(), joystick_event.getNanos()); |
||||||
|
} else if(povYs.containsKey(index)) { |
||||||
|
LinuxJoystickPOV pov = povYs.get(index); |
||||||
|
pov.updateValue(); |
||||||
|
event.set(pov, pov.getPollData(), joystick_event.getNanos()); |
||||||
|
} else { |
||||||
|
event.set(axis, value, joystick_event.getNanos()); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return; |
||||||
|
default: |
||||||
|
// Unknown component type
|
||||||
|
return; |
||||||
|
} |
||||||
|
if (!event_queue.isFull()) { |
||||||
|
event_queue.add(event); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final void registerAxis(int index, LinuxJoystickAxis axis) { |
||||||
|
axes[index] = axis; |
||||||
|
} |
||||||
|
|
||||||
|
public final void registerButton(int index, LinuxJoystickButton button) { |
||||||
|
buttons[index] = button; |
||||||
|
} |
||||||
|
|
||||||
|
public final void registerPOV(LinuxJoystickPOV pov) { |
||||||
|
// The x and y on a joystick device are not the same as on an event device
|
||||||
|
LinuxJoystickAxis xAxis = pov.getYAxis(); |
||||||
|
LinuxJoystickAxis yAxis = pov.getXAxis(); |
||||||
|
int xIndex; |
||||||
|
int yIndex; |
||||||
|
for(xIndex=0;xIndex<axes.length;xIndex++) { |
||||||
|
if(axes[xIndex]==xAxis) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
for(yIndex=0;yIndex<axes.length;yIndex++) { |
||||||
|
if(axes[yIndex]==yAxis) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
povXs.put(xIndex,pov); |
||||||
|
povYs.put(yIndex,pov); |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized boolean getNextEvent(Event event) throws IOException { |
||||||
|
return event_queue.getNextEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
public final synchronized void poll() throws IOException { |
||||||
|
checkClosed(); |
||||||
|
while (getNextDeviceEvent(joystick_event)) { |
||||||
|
processEvent(joystick_event); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final boolean getNextDeviceEvent(LinuxJoystickEvent joystick_event) throws IOException { |
||||||
|
return nGetNextEvent(fd, joystick_event); |
||||||
|
} |
||||||
|
private final static native boolean nGetNextEvent(long fd, LinuxJoystickEvent joystick_event) throws IOException; |
||||||
|
|
||||||
|
public final int getNumAxes() { |
||||||
|
return axes.length; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getNumButtons() { |
||||||
|
return buttons.length; |
||||||
|
} |
||||||
|
|
||||||
|
public final byte[] getAxisMap() { |
||||||
|
return axisMap; |
||||||
|
} |
||||||
|
|
||||||
|
public final char[] getButtonMap() { |
||||||
|
return buttonMap; |
||||||
|
} |
||||||
|
|
||||||
|
private final int getNumDeviceButtons() throws IOException { |
||||||
|
return nGetNumButtons(fd); |
||||||
|
} |
||||||
|
private final static native int nGetNumButtons(long fd) throws IOException; |
||||||
|
|
||||||
|
private final int getNumDeviceAxes() throws IOException { |
||||||
|
return nGetNumAxes(fd); |
||||||
|
} |
||||||
|
private final static native int nGetNumAxes(long fd) throws IOException; |
||||||
|
|
||||||
|
private final byte[] getDeviceAxisMap() throws IOException { |
||||||
|
return nGetAxisMap(fd); |
||||||
|
} |
||||||
|
private final static native byte[] nGetAxisMap(long fd) throws IOException; |
||||||
|
|
||||||
|
private final char[] getDeviceButtonMap() throws IOException { |
||||||
|
return nGetButtonMap(fd); |
||||||
|
} |
||||||
|
private final static native char[] nGetButtonMap(long fd) throws IOException; |
||||||
|
|
||||||
|
private final int getVersion() throws IOException { |
||||||
|
return nGetVersion(fd); |
||||||
|
} |
||||||
|
private final static native int nGetVersion(long fd) throws IOException; |
||||||
|
|
||||||
|
public final String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
private final String getDeviceName() throws IOException { |
||||||
|
return nGetName(fd); |
||||||
|
} |
||||||
|
private final static native String nGetName(long fd) throws IOException; |
||||||
|
|
||||||
|
public final synchronized void close() throws IOException { |
||||||
|
if (!closed) { |
||||||
|
closed = true; |
||||||
|
nClose(fd); |
||||||
|
} |
||||||
|
} |
||||||
|
private final static native void nClose(long fd) throws IOException; |
||||||
|
|
||||||
|
private final void checkClosed() throws IOException { |
||||||
|
if (closed) |
||||||
|
throw new IOException("Device is closed"); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") |
||||||
|
protected void finalize() throws IOException { |
||||||
|
close(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxJoystickEvent { |
||||||
|
private long nanos; |
||||||
|
private int value; |
||||||
|
private int type; |
||||||
|
private int number; |
||||||
|
|
||||||
|
public final void set(long millis, int value, int type, int number) { |
||||||
|
this.nanos = millis*1000000; |
||||||
|
this.value = value; |
||||||
|
this.type = type; |
||||||
|
this.number = number; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getValue() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public final int getNumber() { |
||||||
|
return number; |
||||||
|
} |
||||||
|
|
||||||
|
public final long getNanos() { |
||||||
|
return nanos; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class LinuxJoystickPOV extends LinuxJoystickAxis { |
||||||
|
|
||||||
|
private LinuxJoystickAxis hatX; |
||||||
|
private LinuxJoystickAxis hatY; |
||||||
|
|
||||||
|
LinuxJoystickPOV(Component.Identifier.Axis id, LinuxJoystickAxis hatX, LinuxJoystickAxis hatY) { |
||||||
|
super(id, false); |
||||||
|
this.hatX = hatX; |
||||||
|
this.hatY = hatY; |
||||||
|
} |
||||||
|
|
||||||
|
protected LinuxJoystickAxis getXAxis() { |
||||||
|
return hatX; |
||||||
|
} |
||||||
|
|
||||||
|
protected LinuxJoystickAxis getYAxis() { |
||||||
|
return hatY; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected void updateValue() { |
||||||
|
float last_x = hatX.getPollData(); |
||||||
|
float last_y = hatY.getPollData(); |
||||||
|
|
||||||
|
resetHasPolled(); |
||||||
|
if (last_x == -1 && last_y == -1) |
||||||
|
setValue(Component.POV.UP_LEFT); |
||||||
|
else if (last_x == -1 && last_y == 0) |
||||||
|
setValue(Component.POV.LEFT); |
||||||
|
else if (last_x == -1 && last_y == 1) |
||||||
|
setValue(Component.POV.DOWN_LEFT); |
||||||
|
else if (last_x == 0 && last_y == -1) |
||||||
|
setValue(Component.POV.UP); |
||||||
|
else if (last_x == 0 && last_y == 0) |
||||||
|
setValue(Component.POV.OFF); |
||||||
|
else if (last_x == 0 && last_y == 1) |
||||||
|
setValue(Component.POV.DOWN); |
||||||
|
else if (last_x == 1 && last_y == -1) |
||||||
|
setValue(Component.POV.UP_RIGHT); |
||||||
|
else if (last_x == 1 && last_y == 0) |
||||||
|
setValue(Component.POV.RIGHT); |
||||||
|
else if (last_x == 1 && last_y == 1) |
||||||
|
setValue(Component.POV.DOWN_RIGHT); |
||||||
|
else { |
||||||
|
LinuxEnvironmentPlugin.log("Unknown values x = " + last_x + " | y = " + last_y); |
||||||
|
setValue(Component.POV.OFF); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents an OSX Keyboard |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxKeyboard extends Keyboard { |
||||||
|
private final PortType port; |
||||||
|
private final LinuxEventDevice device; |
||||||
|
|
||||||
|
protected LinuxKeyboard(LinuxEventDevice device, Component[] components, Controller[] children, Rumbler[] rumblers) throws IOException { |
||||||
|
super(device.getName(), components, children, rumblers); |
||||||
|
this.device = device; |
||||||
|
this.port = device.getPortType(); |
||||||
|
} |
||||||
|
|
||||||
|
public final PortType getPortType() { |
||||||
|
return port; |
||||||
|
} |
||||||
|
|
||||||
|
protected final boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
return LinuxControllers.getNextDeviceEvent(event, device); |
||||||
|
} |
||||||
|
|
||||||
|
public final void pollDevice() throws IOException { |
||||||
|
device.pollKeyStates(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents an OSX Mouse |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxMouse extends Mouse { |
||||||
|
private final PortType port; |
||||||
|
private final LinuxEventDevice device; |
||||||
|
|
||||||
|
protected LinuxMouse(LinuxEventDevice device, Component[] components, Controller[] children, Rumbler[] rumblers) throws IOException { |
||||||
|
super(device.getName(), components, children, rumblers); |
||||||
|
this.device = device; |
||||||
|
this.port = device.getPortType(); |
||||||
|
} |
||||||
|
|
||||||
|
public final PortType getPortType() { |
||||||
|
return port; |
||||||
|
} |
||||||
|
|
||||||
|
public final void pollDevice() throws IOException { |
||||||
|
device.pollKeyStates(); |
||||||
|
} |
||||||
|
|
||||||
|
protected final boolean getNextDeviceEvent(Event event) throws IOException { |
||||||
|
return LinuxControllers.getNextDeviceEvent(event, device); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,848 @@ |
|||||||
|
/** |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
/** |
||||||
|
* Mapping utility class between native type ints and string names or |
||||||
|
* Key.Identifiers |
||||||
|
* @author Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
*/ |
||||||
|
class LinuxNativeTypesMap { |
||||||
|
private static LinuxNativeTypesMap INSTANCE = new LinuxNativeTypesMap(); |
||||||
|
private static Logger log = Logger.getLogger(LinuxNativeTypesMap.class.getName()); |
||||||
|
|
||||||
|
private final Component.Identifier relAxesIDs[]; |
||||||
|
private final Component.Identifier absAxesIDs[]; |
||||||
|
private final Component.Identifier buttonIDs[]; |
||||||
|
|
||||||
|
/** create an empty, uninitialsed map |
||||||
|
*/ |
||||||
|
private LinuxNativeTypesMap() { |
||||||
|
buttonIDs = new Component.Identifier[NativeDefinitions.KEY_MAX]; |
||||||
|
relAxesIDs = new Component.Identifier[NativeDefinitions.REL_MAX]; |
||||||
|
absAxesIDs = new Component.Identifier[NativeDefinitions.ABS_MAX]; |
||||||
|
reInit(); |
||||||
|
} |
||||||
|
|
||||||
|
/** Do the work. |
||||||
|
*/ |
||||||
|
private void reInit() { |
||||||
|
buttonIDs[NativeDefinitions.KEY_ESC] = Component.Identifier.Key.ESCAPE; |
||||||
|
buttonIDs[NativeDefinitions.KEY_1] = Component.Identifier.Key._1; |
||||||
|
buttonIDs[NativeDefinitions.KEY_2] = Component.Identifier.Key._2; |
||||||
|
buttonIDs[NativeDefinitions.KEY_3] = Component.Identifier.Key._3; |
||||||
|
buttonIDs[NativeDefinitions.KEY_4] = Component.Identifier.Key._4; |
||||||
|
buttonIDs[NativeDefinitions.KEY_5] = Component.Identifier.Key._5; |
||||||
|
buttonIDs[NativeDefinitions.KEY_6] = Component.Identifier.Key._6; |
||||||
|
buttonIDs[NativeDefinitions.KEY_7] = Component.Identifier.Key._7; |
||||||
|
buttonIDs[NativeDefinitions.KEY_8] = Component.Identifier.Key._8; |
||||||
|
buttonIDs[NativeDefinitions.KEY_9] = Component.Identifier.Key._9; |
||||||
|
buttonIDs[NativeDefinitions.KEY_0] = Component.Identifier.Key._0; |
||||||
|
buttonIDs[NativeDefinitions.KEY_MINUS] = Component.Identifier.Key.MINUS; |
||||||
|
buttonIDs[NativeDefinitions.KEY_EQUAL] = Component.Identifier.Key.EQUALS; |
||||||
|
buttonIDs[NativeDefinitions.KEY_BACKSPACE] = Component.Identifier.Key.BACK; |
||||||
|
buttonIDs[NativeDefinitions.KEY_TAB] = Component.Identifier.Key.TAB; |
||||||
|
buttonIDs[NativeDefinitions.KEY_Q] = Component.Identifier.Key.Q; |
||||||
|
buttonIDs[NativeDefinitions.KEY_W] = Component.Identifier.Key.W; |
||||||
|
buttonIDs[NativeDefinitions.KEY_E] = Component.Identifier.Key.E; |
||||||
|
buttonIDs[NativeDefinitions.KEY_R] = Component.Identifier.Key.R; |
||||||
|
buttonIDs[NativeDefinitions.KEY_T] = Component.Identifier.Key.T; |
||||||
|
buttonIDs[NativeDefinitions.KEY_Y] = Component.Identifier.Key.Y; |
||||||
|
buttonIDs[NativeDefinitions.KEY_U] = Component.Identifier.Key.U; |
||||||
|
buttonIDs[NativeDefinitions.KEY_I] = Component.Identifier.Key.I; |
||||||
|
buttonIDs[NativeDefinitions.KEY_O] = Component.Identifier.Key.O; |
||||||
|
buttonIDs[NativeDefinitions.KEY_P] = Component.Identifier.Key.P; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LEFTBRACE] = Component.Identifier.Key.LBRACKET; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RIGHTBRACE] = Component.Identifier.Key.RBRACKET; |
||||||
|
buttonIDs[NativeDefinitions.KEY_ENTER] = Component.Identifier.Key.RETURN; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LEFTCTRL] = Component.Identifier.Key.LCONTROL; |
||||||
|
buttonIDs[NativeDefinitions.KEY_A] = Component.Identifier.Key.A; |
||||||
|
buttonIDs[NativeDefinitions.KEY_S] = Component.Identifier.Key.S; |
||||||
|
buttonIDs[NativeDefinitions.KEY_D] = Component.Identifier.Key.D; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F] = Component.Identifier.Key.F; |
||||||
|
buttonIDs[NativeDefinitions.KEY_G] = Component.Identifier.Key.G; |
||||||
|
buttonIDs[NativeDefinitions.KEY_H] = Component.Identifier.Key.H; |
||||||
|
buttonIDs[NativeDefinitions.KEY_J] = Component.Identifier.Key.J; |
||||||
|
buttonIDs[NativeDefinitions.KEY_K] = Component.Identifier.Key.K; |
||||||
|
buttonIDs[NativeDefinitions.KEY_L] = Component.Identifier.Key.L; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SEMICOLON] = Component.Identifier.Key.SEMICOLON; |
||||||
|
buttonIDs[NativeDefinitions.KEY_APOSTROPHE] = Component.Identifier.Key.APOSTROPHE; |
||||||
|
buttonIDs[NativeDefinitions.KEY_GRAVE] = Component.Identifier.Key.GRAVE; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LEFTSHIFT] = Component.Identifier.Key.LSHIFT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_BACKSLASH] = Component.Identifier.Key.BACKSLASH; |
||||||
|
buttonIDs[NativeDefinitions.KEY_Z] = Component.Identifier.Key.Z; |
||||||
|
buttonIDs[NativeDefinitions.KEY_X] = Component.Identifier.Key.X; |
||||||
|
buttonIDs[NativeDefinitions.KEY_C] = Component.Identifier.Key.C; |
||||||
|
buttonIDs[NativeDefinitions.KEY_V] = Component.Identifier.Key.V; |
||||||
|
buttonIDs[NativeDefinitions.KEY_B] = Component.Identifier.Key.B; |
||||||
|
buttonIDs[NativeDefinitions.KEY_N] = Component.Identifier.Key.N; |
||||||
|
buttonIDs[NativeDefinitions.KEY_M] = Component.Identifier.Key.M; |
||||||
|
buttonIDs[NativeDefinitions.KEY_COMMA] = Component.Identifier.Key.COMMA; |
||||||
|
buttonIDs[NativeDefinitions.KEY_DOT] = Component.Identifier.Key.PERIOD; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SLASH] = Component.Identifier.Key.SLASH; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RIGHTSHIFT] = Component.Identifier.Key.RSHIFT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPASTERISK] = Component.Identifier.Key.MULTIPLY; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LEFTALT] = Component.Identifier.Key.LALT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SPACE] = Component.Identifier.Key.SPACE; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CAPSLOCK] = Component.Identifier.Key.CAPITAL; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F1] = Component.Identifier.Key.F1; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F2] = Component.Identifier.Key.F2; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F3] = Component.Identifier.Key.F3; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F4] = Component.Identifier.Key.F4; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F5] = Component.Identifier.Key.F5; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F6] = Component.Identifier.Key.F6; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F7] = Component.Identifier.Key.F7; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F8] = Component.Identifier.Key.F8; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F9] = Component.Identifier.Key.F9; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F10] = Component.Identifier.Key.F10; |
||||||
|
buttonIDs[NativeDefinitions.KEY_NUMLOCK] = Component.Identifier.Key.NUMLOCK; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SCROLLLOCK] = Component.Identifier.Key.SCROLL; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP7] = Component.Identifier.Key.NUMPAD7; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP8] = Component.Identifier.Key.NUMPAD8; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP9] = Component.Identifier.Key.NUMPAD9; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPMINUS] = Component.Identifier.Key.SUBTRACT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP4] = Component.Identifier.Key.NUMPAD4; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP5] = Component.Identifier.Key.NUMPAD5; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP6] = Component.Identifier.Key.NUMPAD6; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPPLUS] = Component.Identifier.Key.ADD; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP1] = Component.Identifier.Key.NUMPAD1; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP2] = Component.Identifier.Key.NUMPAD2; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP3] = Component.Identifier.Key.NUMPAD3; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KP0] = Component.Identifier.Key.NUMPAD0; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPDOT] = Component.Identifier.Key.DECIMAL; |
||||||
|
// buttonIDs[NativeDefinitions.KEY_103RD] = null;
|
||||||
|
buttonIDs[NativeDefinitions.KEY_F13] = Component.Identifier.Key.F13; |
||||||
|
buttonIDs[NativeDefinitions.KEY_102ND] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F11] = Component.Identifier.Key.F11; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F12] = Component.Identifier.Key.F12; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F14] = Component.Identifier.Key.F14; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F15] = Component.Identifier.Key.F15; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F16] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F17] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F18] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F19] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F20] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPENTER] = Component.Identifier.Key.NUMPADENTER; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RIGHTCTRL] = Component.Identifier.Key.RCONTROL; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPSLASH] = Component.Identifier.Key.DIVIDE; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SYSRQ] = Component.Identifier.Key.SYSRQ; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RIGHTALT] = Component.Identifier.Key.RALT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LINEFEED] = null; |
||||||
|
buttonIDs[NativeDefinitions.KEY_HOME] = Component.Identifier.Key.HOME; |
||||||
|
buttonIDs[NativeDefinitions.KEY_UP] = Component.Identifier.Key.UP; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PAGEUP] = Component.Identifier.Key.PAGEUP; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LEFT] = Component.Identifier.Key.LEFT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RIGHT] = Component.Identifier.Key.RIGHT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_END] = Component.Identifier.Key.END; |
||||||
|
buttonIDs[NativeDefinitions.KEY_DOWN] = Component.Identifier.Key.DOWN; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PAGEDOWN] = Component.Identifier.Key.PAGEDOWN; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INSERT] = Component.Identifier.Key.INSERT; |
||||||
|
buttonIDs[NativeDefinitions.KEY_DELETE] = Component.Identifier.Key.DELETE; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PAUSE] = Component.Identifier.Key.PAUSE; |
||||||
|
/* buttonIDs[NativeDefinitions.KEY_MACRO] = "Macro"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_MUTE] = "Mute"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_VOLUMEDOWN] = "Volume Down"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_VOLUMEUP] = "Volume Up"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_POWER] = "Power";*/ |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPEQUAL] = Component.Identifier.Key.NUMPADEQUAL; |
||||||
|
//buttonIDs[NativeDefinitions.KEY_KPPLUSMINUS] = "KeyPad +/-";
|
||||||
|
/* buttonIDs[NativeDefinitions.KEY_F21] = "F21"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F22] = "F22"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F23] = "F23"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_F24] = "F24"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPCOMMA] = "KeyPad comma"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LEFTMETA] = "LH Meta"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RIGHTMETA] = "RH Meta"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_COMPOSE] = "Compose"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_STOP] = "Stop"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_AGAIN] = "Again"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PROPS] = "Properties"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_UNDO] = "Undo"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_FRONT] = "Front"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_COPY] = "Copy"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_OPEN] = "Open"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PASTE] = "Paste"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_FIND] = "Find"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CUT] = "Cut"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_HELP] = "Help"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_MENU] = "Menu"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CALC] = "Calculator"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SETUP] = "Setup";*/ |
||||||
|
buttonIDs[NativeDefinitions.KEY_SLEEP] = Component.Identifier.Key.SLEEP; |
||||||
|
/*buttonIDs[NativeDefinitions.KEY_WAKEUP] = "Wakeup"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_FILE] = "File"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SENDFILE] = "Send File"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_DELETEFILE] = "Delete File"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_XFER] = "Transfer"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PROG1] = "Program 1"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PROG2] = "Program 2"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_WWW] = "Web Browser"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_MSDOS] = "DOS mode"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_COFFEE] = "Coffee"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_DIRECTION] = "Direction"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CYCLEWINDOWS] = "Window cycle"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_MAIL] = "Mail"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_BOOKMARKS] = "Book Marks"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_COMPUTER] = "Computer"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_BACK] = "Back"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_FORWARD] = "Forward"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CLOSECD] = "Close CD"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_EJECTCD] = "Eject CD"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_EJECTCLOSECD] = "Eject / Close CD"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_NEXTSONG] = "Next Song"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PLAYPAUSE] = "Play and Pause"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PREVIOUSSONG] = "Previous Song"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_STOPCD] = "Stop CD"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_RECORD] = "Record"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_REWIND] = "Rewind"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PHONE] = "Phone"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_ISO] = "ISO"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CONFIG] = "Config"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_HOMEPAGE] = "Home"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_REFRESH] = "Refresh"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_EXIT] = "Exit"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_MOVE] = "Move"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_EDIT] = "Edit"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SCROLLUP] = "Scroll Up"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SCROLLDOWN] = "Scroll Down"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPLEFTPAREN] = "KeyPad LH parenthesis"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_KPRIGHTPAREN] = "KeyPad RH parenthesis"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL1] = "Intl 1"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL2] = "Intl 2"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL3] = "Intl 3"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL4] = "Intl 4"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL5] = "Intl 5"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL6] = "Intl 6"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL7] = "Intl 7"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL8] = "Intl 8"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_INTL9] = "Intl 9"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG1] = "Language 1"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG2] = "Language 2"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG3] = "Language 3"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG4] = "Language 4"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG5] = "Language 5"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG6] = "Language 6"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG7] = "Language 7"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG8] = "Language 8"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_LANG9] = "Language 9"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PLAYCD] = "Play CD"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PAUSECD] = "Pause CD"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PROG3] = "Program 3"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_PROG4] = "Program 4"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_SUSPEND] = "Suspend"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_CLOSE] = "Close";*/ |
||||||
|
buttonIDs[NativeDefinitions.KEY_UNKNOWN] = Component.Identifier.Key.UNLABELED; |
||||||
|
/*buttonIDs[NativeDefinitions.KEY_BRIGHTNESSDOWN] = "Brightness Down"; |
||||||
|
buttonIDs[NativeDefinitions.KEY_BRIGHTNESSUP] = "Brightness Up";*/ |
||||||
|
|
||||||
|
//Misc keys
|
||||||
|
buttonIDs[NativeDefinitions.BTN_0] = Component.Identifier.Button._0; |
||||||
|
buttonIDs[NativeDefinitions.BTN_1] = Component.Identifier.Button._1; |
||||||
|
buttonIDs[NativeDefinitions.BTN_2] = Component.Identifier.Button._2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_3] = Component.Identifier.Button._3; |
||||||
|
buttonIDs[NativeDefinitions.BTN_4] = Component.Identifier.Button._4; |
||||||
|
buttonIDs[NativeDefinitions.BTN_5] = Component.Identifier.Button._5; |
||||||
|
buttonIDs[NativeDefinitions.BTN_6] = Component.Identifier.Button._6; |
||||||
|
buttonIDs[NativeDefinitions.BTN_7] = Component.Identifier.Button._7; |
||||||
|
buttonIDs[NativeDefinitions.BTN_8] = Component.Identifier.Button._8; |
||||||
|
buttonIDs[NativeDefinitions.BTN_9] = Component.Identifier.Button._9; |
||||||
|
|
||||||
|
// Mouse
|
||||||
|
buttonIDs[NativeDefinitions.BTN_LEFT] = Component.Identifier.Button.LEFT; |
||||||
|
buttonIDs[NativeDefinitions.BTN_RIGHT] = Component.Identifier.Button.RIGHT; |
||||||
|
buttonIDs[NativeDefinitions.BTN_MIDDLE] = Component.Identifier.Button.MIDDLE; |
||||||
|
buttonIDs[NativeDefinitions.BTN_SIDE] = Component.Identifier.Button.SIDE; |
||||||
|
buttonIDs[NativeDefinitions.BTN_EXTRA] = Component.Identifier.Button.EXTRA; |
||||||
|
buttonIDs[NativeDefinitions.BTN_FORWARD] = Component.Identifier.Button.FORWARD; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BACK] = Component.Identifier.Button.BACK; |
||||||
|
|
||||||
|
// Joystick
|
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER] = Component.Identifier.Button.TRIGGER; |
||||||
|
buttonIDs[NativeDefinitions.BTN_THUMB] = Component.Identifier.Button.THUMB; |
||||||
|
buttonIDs[NativeDefinitions.BTN_THUMB2] = Component.Identifier.Button.THUMB2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOP] = Component.Identifier.Button.TOP; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOP2] = Component.Identifier.Button.TOP2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_PINKIE] = Component.Identifier.Button.PINKIE; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BASE] = Component.Identifier.Button.BASE; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BASE2] = Component.Identifier.Button.BASE2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BASE3] = Component.Identifier.Button.BASE3; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BASE4] = Component.Identifier.Button.BASE4; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BASE5] = Component.Identifier.Button.BASE5; |
||||||
|
buttonIDs[NativeDefinitions.BTN_BASE6] = Component.Identifier.Button.BASE6; |
||||||
|
buttonIDs[NativeDefinitions.BTN_DEAD] = Component.Identifier.Button.DEAD; |
||||||
|
|
||||||
|
// Gamepad
|
||||||
|
buttonIDs[NativeDefinitions.BTN_A] = Component.Identifier.Button.A; |
||||||
|
buttonIDs[NativeDefinitions.BTN_B] = Component.Identifier.Button.B; |
||||||
|
buttonIDs[NativeDefinitions.BTN_C] = Component.Identifier.Button.C; |
||||||
|
buttonIDs[NativeDefinitions.BTN_X] = Component.Identifier.Button.X; |
||||||
|
buttonIDs[NativeDefinitions.BTN_Y] = Component.Identifier.Button.Y; |
||||||
|
buttonIDs[NativeDefinitions.BTN_Z] = Component.Identifier.Button.Z; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TL] = Component.Identifier.Button.LEFT_THUMB; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TR] = Component.Identifier.Button.RIGHT_THUMB; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TL2] = Component.Identifier.Button.LEFT_THUMB2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TR2] = Component.Identifier.Button.RIGHT_THUMB2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_SELECT] = Component.Identifier.Button.SELECT; |
||||||
|
buttonIDs[NativeDefinitions.BTN_START] = Component.Identifier.Button.START; |
||||||
|
buttonIDs[NativeDefinitions.BTN_MODE] = Component.Identifier.Button.MODE; |
||||||
|
buttonIDs[NativeDefinitions.BTN_THUMBL] = Component.Identifier.Button.LEFT_THUMB3; |
||||||
|
buttonIDs[NativeDefinitions.BTN_THUMBR] = Component.Identifier.Button.RIGHT_THUMB3; |
||||||
|
|
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY1] = Component.Identifier.Button.EXTRA_1; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY2] = Component.Identifier.Button.EXTRA_2; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY3] = Component.Identifier.Button.EXTRA_3; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY4] = Component.Identifier.Button.EXTRA_4; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY5] = Component.Identifier.Button.EXTRA_5; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY6] = Component.Identifier.Button.EXTRA_6; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY7] = Component.Identifier.Button.EXTRA_7; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY8] = Component.Identifier.Button.EXTRA_8; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY9] = Component.Identifier.Button.EXTRA_9; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY10] = Component.Identifier.Button.EXTRA_10; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY11] = Component.Identifier.Button.EXTRA_11; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY12] = Component.Identifier.Button.EXTRA_12; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY13] = Component.Identifier.Button.EXTRA_13; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY14] = Component.Identifier.Button.EXTRA_14; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY15] = Component.Identifier.Button.EXTRA_15; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY16] = Component.Identifier.Button.EXTRA_16; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY17] = Component.Identifier.Button.EXTRA_17; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY18] = Component.Identifier.Button.EXTRA_18; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY19] = Component.Identifier.Button.EXTRA_19; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY20] = Component.Identifier.Button.EXTRA_20; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY21] = Component.Identifier.Button.EXTRA_21; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY22] = Component.Identifier.Button.EXTRA_22; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY23] = Component.Identifier.Button.EXTRA_23; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY24] = Component.Identifier.Button.EXTRA_24; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY25] = Component.Identifier.Button.EXTRA_25; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY26] = Component.Identifier.Button.EXTRA_26; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY27] = Component.Identifier.Button.EXTRA_27; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY28] = Component.Identifier.Button.EXTRA_28; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY29] = Component.Identifier.Button.EXTRA_29; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY30] = Component.Identifier.Button.EXTRA_30; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY31] = Component.Identifier.Button.EXTRA_31; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY32] = Component.Identifier.Button.EXTRA_32; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY33] = Component.Identifier.Button.EXTRA_33; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY34] = Component.Identifier.Button.EXTRA_34; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY35] = Component.Identifier.Button.EXTRA_35; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY36] = Component.Identifier.Button.EXTRA_36; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY37] = Component.Identifier.Button.EXTRA_37; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY38] = Component.Identifier.Button.EXTRA_38; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY39] = Component.Identifier.Button.EXTRA_39; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TRIGGER_HAPPY40] = Component.Identifier.Button.EXTRA_40; |
||||||
|
|
||||||
|
// Digitiser
|
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_PEN] = Component.Identifier.Button.TOOL_PEN; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_RUBBER] = Component.Identifier.Button.TOOL_RUBBER; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_BRUSH] = Component.Identifier.Button.TOOL_BRUSH; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_PENCIL] = Component.Identifier.Button.TOOL_PENCIL; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_AIRBRUSH] = Component.Identifier.Button.TOOL_AIRBRUSH; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_FINGER] = Component.Identifier.Button.TOOL_FINGER; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_MOUSE] = Component.Identifier.Button.TOOL_MOUSE; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOOL_LENS] = Component.Identifier.Button.TOOL_LENS; |
||||||
|
buttonIDs[NativeDefinitions.BTN_TOUCH] = Component.Identifier.Button.TOUCH; |
||||||
|
buttonIDs[NativeDefinitions.BTN_STYLUS] = Component.Identifier.Button.STYLUS; |
||||||
|
buttonIDs[NativeDefinitions.BTN_STYLUS2] = Component.Identifier.Button.STYLUS2; |
||||||
|
|
||||||
|
relAxesIDs[NativeDefinitions.REL_X] = Component.Identifier.Axis.X; |
||||||
|
relAxesIDs[NativeDefinitions.REL_Y] = Component.Identifier.Axis.Y; |
||||||
|
relAxesIDs[NativeDefinitions.REL_Z] = Component.Identifier.Axis.Z; |
||||||
|
relAxesIDs[NativeDefinitions.REL_WHEEL] = Component.Identifier.Axis.Z; |
||||||
|
// There are guesses as I have no idea what they would be used for
|
||||||
|
relAxesIDs[NativeDefinitions.REL_HWHEEL] = Component.Identifier.Axis.SLIDER; |
||||||
|
relAxesIDs[NativeDefinitions.REL_DIAL] = Component.Identifier.Axis.SLIDER; |
||||||
|
relAxesIDs[NativeDefinitions.REL_MISC] = Component.Identifier.Axis.SLIDER; |
||||||
|
|
||||||
|
absAxesIDs[NativeDefinitions.ABS_X] = Component.Identifier.Axis.X; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_Y] = Component.Identifier.Axis.Y; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_Z] = Component.Identifier.Axis.Z; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_RX] = Component.Identifier.Axis.RX; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_RY] = Component.Identifier.Axis.RY; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_RZ] = Component.Identifier.Axis.RZ; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_THROTTLE] = Component.Identifier.Axis.SLIDER; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_RUDDER] = Component.Identifier.Axis.RZ; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_WHEEL] = Component.Identifier.Axis.Y; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_GAS] = Component.Identifier.Axis.SLIDER; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_BRAKE] = Component.Identifier.Axis.SLIDER; |
||||||
|
// Hats are done this way as they are mapped from two axis down to one
|
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT0X] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT0Y] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT1X] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT1Y] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT2X] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT2Y] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT3X] = Component.Identifier.Axis.POV; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_HAT3Y] = Component.Identifier.Axis.POV; |
||||||
|
// erm, yeah
|
||||||
|
absAxesIDs[NativeDefinitions.ABS_PRESSURE] = null; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_DISTANCE] = null; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_TILT_X] = null; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_TILT_Y] = null; |
||||||
|
absAxesIDs[NativeDefinitions.ABS_MISC] = null; |
||||||
|
} |
||||||
|
|
||||||
|
public final static Controller.Type guessButtonTrait(int button_code) { |
||||||
|
switch (button_code) { |
||||||
|
case NativeDefinitions.BTN_TRIGGER : |
||||||
|
case NativeDefinitions.BTN_THUMB : |
||||||
|
case NativeDefinitions.BTN_THUMB2 : |
||||||
|
case NativeDefinitions.BTN_TOP : |
||||||
|
case NativeDefinitions.BTN_TOP2 : |
||||||
|
case NativeDefinitions.BTN_PINKIE : |
||||||
|
case NativeDefinitions.BTN_BASE : |
||||||
|
case NativeDefinitions.BTN_BASE2 : |
||||||
|
case NativeDefinitions.BTN_BASE3 : |
||||||
|
case NativeDefinitions.BTN_BASE4 : |
||||||
|
case NativeDefinitions.BTN_BASE5 : |
||||||
|
case NativeDefinitions.BTN_BASE6 : |
||||||
|
case NativeDefinitions.BTN_DEAD : |
||||||
|
return Controller.Type.STICK; |
||||||
|
case NativeDefinitions.BTN_A : |
||||||
|
case NativeDefinitions.BTN_B : |
||||||
|
case NativeDefinitions.BTN_C : |
||||||
|
case NativeDefinitions.BTN_X : |
||||||
|
case NativeDefinitions.BTN_Y : |
||||||
|
case NativeDefinitions.BTN_Z : |
||||||
|
case NativeDefinitions.BTN_TL : |
||||||
|
case NativeDefinitions.BTN_TR : |
||||||
|
case NativeDefinitions.BTN_TL2 : |
||||||
|
case NativeDefinitions.BTN_TR2 : |
||||||
|
case NativeDefinitions.BTN_SELECT : |
||||||
|
case NativeDefinitions.BTN_START : |
||||||
|
case NativeDefinitions.BTN_MODE : |
||||||
|
case NativeDefinitions.BTN_THUMBL : |
||||||
|
case NativeDefinitions.BTN_THUMBR : |
||||||
|
return Controller.Type.GAMEPAD; |
||||||
|
case NativeDefinitions.BTN_0 : |
||||||
|
case NativeDefinitions.BTN_1 : |
||||||
|
case NativeDefinitions.BTN_2 : |
||||||
|
case NativeDefinitions.BTN_3 : |
||||||
|
case NativeDefinitions.BTN_4 : |
||||||
|
case NativeDefinitions.BTN_5 : |
||||||
|
case NativeDefinitions.BTN_6 : |
||||||
|
case NativeDefinitions.BTN_7 : |
||||||
|
case NativeDefinitions.BTN_8 : |
||||||
|
case NativeDefinitions.BTN_9 : |
||||||
|
return Controller.Type.UNKNOWN; |
||||||
|
case NativeDefinitions.BTN_LEFT : |
||||||
|
case NativeDefinitions.BTN_RIGHT : |
||||||
|
case NativeDefinitions.BTN_MIDDLE : |
||||||
|
case NativeDefinitions.BTN_SIDE : |
||||||
|
case NativeDefinitions.BTN_EXTRA : |
||||||
|
return Controller.Type.MOUSE; |
||||||
|
// case NativeDefinitions.KEY_RESERVED:
|
||||||
|
case NativeDefinitions.KEY_ESC: |
||||||
|
case NativeDefinitions.KEY_1: |
||||||
|
case NativeDefinitions.KEY_2: |
||||||
|
case NativeDefinitions.KEY_3: |
||||||
|
case NativeDefinitions.KEY_4: |
||||||
|
case NativeDefinitions.KEY_5: |
||||||
|
case NativeDefinitions.KEY_6: |
||||||
|
case NativeDefinitions.KEY_7: |
||||||
|
case NativeDefinitions.KEY_8: |
||||||
|
case NativeDefinitions.KEY_9: |
||||||
|
case NativeDefinitions.KEY_0: |
||||||
|
case NativeDefinitions.KEY_MINUS: |
||||||
|
case NativeDefinitions.KEY_EQUAL: |
||||||
|
case NativeDefinitions.KEY_BACKSPACE: |
||||||
|
case NativeDefinitions.KEY_TAB: |
||||||
|
case NativeDefinitions.KEY_Q: |
||||||
|
case NativeDefinitions.KEY_W: |
||||||
|
case NativeDefinitions.KEY_E: |
||||||
|
case NativeDefinitions.KEY_R: |
||||||
|
case NativeDefinitions.KEY_T: |
||||||
|
case NativeDefinitions.KEY_Y: |
||||||
|
case NativeDefinitions.KEY_U: |
||||||
|
case NativeDefinitions.KEY_I: |
||||||
|
case NativeDefinitions.KEY_O: |
||||||
|
case NativeDefinitions.KEY_P: |
||||||
|
case NativeDefinitions.KEY_LEFTBRACE: |
||||||
|
case NativeDefinitions.KEY_RIGHTBRACE: |
||||||
|
case NativeDefinitions.KEY_ENTER: |
||||||
|
case NativeDefinitions.KEY_LEFTCTRL: |
||||||
|
case NativeDefinitions.KEY_A: |
||||||
|
case NativeDefinitions.KEY_S: |
||||||
|
case NativeDefinitions.KEY_D: |
||||||
|
case NativeDefinitions.KEY_F: |
||||||
|
case NativeDefinitions.KEY_G: |
||||||
|
case NativeDefinitions.KEY_H: |
||||||
|
case NativeDefinitions.KEY_J: |
||||||
|
case NativeDefinitions.KEY_K: |
||||||
|
case NativeDefinitions.KEY_L: |
||||||
|
case NativeDefinitions.KEY_SEMICOLON: |
||||||
|
case NativeDefinitions.KEY_APOSTROPHE: |
||||||
|
case NativeDefinitions.KEY_GRAVE: |
||||||
|
case NativeDefinitions.KEY_LEFTSHIFT: |
||||||
|
case NativeDefinitions.KEY_BACKSLASH: |
||||||
|
case NativeDefinitions.KEY_Z: |
||||||
|
case NativeDefinitions.KEY_X: |
||||||
|
case NativeDefinitions.KEY_C: |
||||||
|
case NativeDefinitions.KEY_V: |
||||||
|
case NativeDefinitions.KEY_B: |
||||||
|
case NativeDefinitions.KEY_N: |
||||||
|
case NativeDefinitions.KEY_M: |
||||||
|
case NativeDefinitions.KEY_COMMA: |
||||||
|
case NativeDefinitions.KEY_DOT: |
||||||
|
case NativeDefinitions.KEY_SLASH: |
||||||
|
case NativeDefinitions.KEY_RIGHTSHIFT: |
||||||
|
case NativeDefinitions.KEY_KPASTERISK: |
||||||
|
case NativeDefinitions.KEY_LEFTALT: |
||||||
|
case NativeDefinitions.KEY_SPACE: |
||||||
|
case NativeDefinitions.KEY_CAPSLOCK: |
||||||
|
case NativeDefinitions.KEY_F1: |
||||||
|
case NativeDefinitions.KEY_F2: |
||||||
|
case NativeDefinitions.KEY_F3: |
||||||
|
case NativeDefinitions.KEY_F4: |
||||||
|
case NativeDefinitions.KEY_F5: |
||||||
|
case NativeDefinitions.KEY_F6: |
||||||
|
case NativeDefinitions.KEY_F7: |
||||||
|
case NativeDefinitions.KEY_F8: |
||||||
|
case NativeDefinitions.KEY_F9: |
||||||
|
case NativeDefinitions.KEY_F10: |
||||||
|
case NativeDefinitions.KEY_NUMLOCK: |
||||||
|
case NativeDefinitions.KEY_SCROLLLOCK: |
||||||
|
case NativeDefinitions.KEY_KP7: |
||||||
|
case NativeDefinitions.KEY_KP8: |
||||||
|
case NativeDefinitions.KEY_KP9: |
||||||
|
case NativeDefinitions.KEY_KPMINUS: |
||||||
|
case NativeDefinitions.KEY_KP4: |
||||||
|
case NativeDefinitions.KEY_KP5: |
||||||
|
case NativeDefinitions.KEY_KP6: |
||||||
|
case NativeDefinitions.KEY_KPPLUS: |
||||||
|
case NativeDefinitions.KEY_KP1: |
||||||
|
case NativeDefinitions.KEY_KP2: |
||||||
|
case NativeDefinitions.KEY_KP3: |
||||||
|
case NativeDefinitions.KEY_KP0: |
||||||
|
case NativeDefinitions.KEY_KPDOT: |
||||||
|
case NativeDefinitions.KEY_ZENKAKUHANKAKU: |
||||||
|
case NativeDefinitions.KEY_102ND: |
||||||
|
case NativeDefinitions.KEY_F11: |
||||||
|
case NativeDefinitions.KEY_F12: |
||||||
|
case NativeDefinitions.KEY_RO: |
||||||
|
case NativeDefinitions.KEY_KATAKANA: |
||||||
|
case NativeDefinitions.KEY_HIRAGANA: |
||||||
|
case NativeDefinitions.KEY_HENKAN: |
||||||
|
case NativeDefinitions.KEY_KATAKANAHIRAGANA: |
||||||
|
case NativeDefinitions.KEY_MUHENKAN: |
||||||
|
case NativeDefinitions.KEY_KPJPCOMMA: |
||||||
|
case NativeDefinitions.KEY_KPENTER: |
||||||
|
case NativeDefinitions.KEY_RIGHTCTRL: |
||||||
|
case NativeDefinitions.KEY_KPSLASH: |
||||||
|
case NativeDefinitions.KEY_SYSRQ: |
||||||
|
case NativeDefinitions.KEY_RIGHTALT: |
||||||
|
case NativeDefinitions.KEY_LINEFEED: |
||||||
|
case NativeDefinitions.KEY_HOME: |
||||||
|
case NativeDefinitions.KEY_UP: |
||||||
|
case NativeDefinitions.KEY_PAGEUP: |
||||||
|
case NativeDefinitions.KEY_LEFT: |
||||||
|
case NativeDefinitions.KEY_RIGHT: |
||||||
|
case NativeDefinitions.KEY_END: |
||||||
|
case NativeDefinitions.KEY_DOWN: |
||||||
|
case NativeDefinitions.KEY_PAGEDOWN: |
||||||
|
case NativeDefinitions.KEY_INSERT: |
||||||
|
case NativeDefinitions.KEY_DELETE: |
||||||
|
case NativeDefinitions.KEY_MACRO: |
||||||
|
case NativeDefinitions.KEY_MUTE: |
||||||
|
case NativeDefinitions.KEY_VOLUMEDOWN: |
||||||
|
case NativeDefinitions.KEY_VOLUMEUP: |
||||||
|
case NativeDefinitions.KEY_POWER: |
||||||
|
case NativeDefinitions.KEY_KPEQUAL: |
||||||
|
case NativeDefinitions.KEY_KPPLUSMINUS: |
||||||
|
case NativeDefinitions.KEY_PAUSE: |
||||||
|
case NativeDefinitions.KEY_KPCOMMA: |
||||||
|
case NativeDefinitions.KEY_HANGUEL: |
||||||
|
case NativeDefinitions.KEY_HANJA: |
||||||
|
case NativeDefinitions.KEY_YEN: |
||||||
|
case NativeDefinitions.KEY_LEFTMETA: |
||||||
|
case NativeDefinitions.KEY_RIGHTMETA: |
||||||
|
case NativeDefinitions.KEY_COMPOSE: |
||||||
|
case NativeDefinitions.KEY_STOP: |
||||||
|
case NativeDefinitions.KEY_AGAIN: |
||||||
|
case NativeDefinitions.KEY_PROPS: |
||||||
|
case NativeDefinitions.KEY_UNDO: |
||||||
|
case NativeDefinitions.KEY_FRONT: |
||||||
|
case NativeDefinitions.KEY_COPY: |
||||||
|
case NativeDefinitions.KEY_OPEN: |
||||||
|
case NativeDefinitions.KEY_PASTE: |
||||||
|
case NativeDefinitions.KEY_FIND: |
||||||
|
case NativeDefinitions.KEY_CUT: |
||||||
|
case NativeDefinitions.KEY_HELP: |
||||||
|
case NativeDefinitions.KEY_MENU: |
||||||
|
case NativeDefinitions.KEY_CALC: |
||||||
|
case NativeDefinitions.KEY_SETUP: |
||||||
|
case NativeDefinitions.KEY_SLEEP: |
||||||
|
case NativeDefinitions.KEY_WAKEUP: |
||||||
|
case NativeDefinitions.KEY_FILE: |
||||||
|
case NativeDefinitions.KEY_SENDFILE: |
||||||
|
case NativeDefinitions.KEY_DELETEFILE: |
||||||
|
case NativeDefinitions.KEY_XFER: |
||||||
|
case NativeDefinitions.KEY_PROG1: |
||||||
|
case NativeDefinitions.KEY_PROG2: |
||||||
|
case NativeDefinitions.KEY_WWW: |
||||||
|
case NativeDefinitions.KEY_MSDOS: |
||||||
|
case NativeDefinitions.KEY_COFFEE: |
||||||
|
case NativeDefinitions.KEY_DIRECTION: |
||||||
|
case NativeDefinitions.KEY_CYCLEWINDOWS: |
||||||
|
case NativeDefinitions.KEY_MAIL: |
||||||
|
case NativeDefinitions.KEY_BOOKMARKS: |
||||||
|
case NativeDefinitions.KEY_COMPUTER: |
||||||
|
case NativeDefinitions.KEY_BACK: |
||||||
|
case NativeDefinitions.KEY_FORWARD: |
||||||
|
case NativeDefinitions.KEY_CLOSECD: |
||||||
|
case NativeDefinitions.KEY_EJECTCD: |
||||||
|
case NativeDefinitions.KEY_EJECTCLOSECD: |
||||||
|
case NativeDefinitions.KEY_NEXTSONG: |
||||||
|
case NativeDefinitions.KEY_PLAYPAUSE: |
||||||
|
case NativeDefinitions.KEY_PREVIOUSSONG: |
||||||
|
case NativeDefinitions.KEY_STOPCD: |
||||||
|
case NativeDefinitions.KEY_RECORD: |
||||||
|
case NativeDefinitions.KEY_REWIND: |
||||||
|
case NativeDefinitions.KEY_PHONE: |
||||||
|
case NativeDefinitions.KEY_ISO: |
||||||
|
case NativeDefinitions.KEY_CONFIG: |
||||||
|
case NativeDefinitions.KEY_HOMEPAGE: |
||||||
|
case NativeDefinitions.KEY_REFRESH: |
||||||
|
case NativeDefinitions.KEY_EXIT: |
||||||
|
case NativeDefinitions.KEY_MOVE: |
||||||
|
case NativeDefinitions.KEY_EDIT: |
||||||
|
case NativeDefinitions.KEY_SCROLLUP: |
||||||
|
case NativeDefinitions.KEY_SCROLLDOWN: |
||||||
|
case NativeDefinitions.KEY_KPLEFTPAREN: |
||||||
|
case NativeDefinitions.KEY_KPRIGHTPAREN: |
||||||
|
case NativeDefinitions.KEY_F13: |
||||||
|
case NativeDefinitions.KEY_F14: |
||||||
|
case NativeDefinitions.KEY_F15: |
||||||
|
case NativeDefinitions.KEY_F16: |
||||||
|
case NativeDefinitions.KEY_F17: |
||||||
|
case NativeDefinitions.KEY_F18: |
||||||
|
case NativeDefinitions.KEY_F19: |
||||||
|
case NativeDefinitions.KEY_F20: |
||||||
|
case NativeDefinitions.KEY_F21: |
||||||
|
case NativeDefinitions.KEY_F22: |
||||||
|
case NativeDefinitions.KEY_F23: |
||||||
|
case NativeDefinitions.KEY_F24: |
||||||
|
case NativeDefinitions.KEY_PLAYCD: |
||||||
|
case NativeDefinitions.KEY_PAUSECD: |
||||||
|
case NativeDefinitions.KEY_PROG3: |
||||||
|
case NativeDefinitions.KEY_PROG4: |
||||||
|
case NativeDefinitions.KEY_SUSPEND: |
||||||
|
case NativeDefinitions.KEY_CLOSE: |
||||||
|
case NativeDefinitions.KEY_PLAY: |
||||||
|
case NativeDefinitions.KEY_FASTFORWARD: |
||||||
|
case NativeDefinitions.KEY_BASSBOOST: |
||||||
|
case NativeDefinitions.KEY_PRINT: |
||||||
|
case NativeDefinitions.KEY_HP: |
||||||
|
case NativeDefinitions.KEY_CAMERA: |
||||||
|
case NativeDefinitions.KEY_SOUND: |
||||||
|
case NativeDefinitions.KEY_QUESTION: |
||||||
|
case NativeDefinitions.KEY_EMAIL: |
||||||
|
case NativeDefinitions.KEY_CHAT: |
||||||
|
case NativeDefinitions.KEY_SEARCH: |
||||||
|
case NativeDefinitions.KEY_CONNECT: |
||||||
|
case NativeDefinitions.KEY_FINANCE: |
||||||
|
case NativeDefinitions.KEY_SPORT: |
||||||
|
case NativeDefinitions.KEY_SHOP: |
||||||
|
case NativeDefinitions.KEY_ALTERASE: |
||||||
|
case NativeDefinitions.KEY_CANCEL: |
||||||
|
case NativeDefinitions.KEY_BRIGHTNESSDOWN: |
||||||
|
case NativeDefinitions.KEY_BRIGHTNESSUP: |
||||||
|
case NativeDefinitions.KEY_MEDIA: |
||||||
|
case NativeDefinitions.KEY_SWITCHVIDEOMODE: |
||||||
|
case NativeDefinitions.KEY_KBDILLUMTOGGLE: |
||||||
|
case NativeDefinitions.KEY_KBDILLUMDOWN: |
||||||
|
case NativeDefinitions.KEY_KBDILLUMUP: |
||||||
|
// case NativeDefinitions.KEY_UNKNOWN:
|
||||||
|
case NativeDefinitions.KEY_OK: |
||||||
|
case NativeDefinitions.KEY_SELECT: |
||||||
|
case NativeDefinitions.KEY_GOTO: |
||||||
|
case NativeDefinitions.KEY_CLEAR: |
||||||
|
case NativeDefinitions.KEY_POWER2: |
||||||
|
case NativeDefinitions.KEY_OPTION: |
||||||
|
case NativeDefinitions.KEY_INFO: |
||||||
|
case NativeDefinitions.KEY_TIME: |
||||||
|
case NativeDefinitions.KEY_VENDOR: |
||||||
|
case NativeDefinitions.KEY_ARCHIVE: |
||||||
|
case NativeDefinitions.KEY_PROGRAM: |
||||||
|
case NativeDefinitions.KEY_CHANNEL: |
||||||
|
case NativeDefinitions.KEY_FAVORITES: |
||||||
|
case NativeDefinitions.KEY_EPG: |
||||||
|
case NativeDefinitions.KEY_PVR: |
||||||
|
case NativeDefinitions.KEY_MHP: |
||||||
|
case NativeDefinitions.KEY_LANGUAGE: |
||||||
|
case NativeDefinitions.KEY_TITLE: |
||||||
|
case NativeDefinitions.KEY_SUBTITLE: |
||||||
|
case NativeDefinitions.KEY_ANGLE: |
||||||
|
case NativeDefinitions.KEY_ZOOM: |
||||||
|
case NativeDefinitions.KEY_MODE: |
||||||
|
case NativeDefinitions.KEY_KEYBOARD: |
||||||
|
case NativeDefinitions.KEY_SCREEN: |
||||||
|
case NativeDefinitions.KEY_PC: |
||||||
|
case NativeDefinitions.KEY_TV: |
||||||
|
case NativeDefinitions.KEY_TV2: |
||||||
|
case NativeDefinitions.KEY_VCR: |
||||||
|
case NativeDefinitions.KEY_VCR2: |
||||||
|
case NativeDefinitions.KEY_SAT: |
||||||
|
case NativeDefinitions.KEY_SAT2: |
||||||
|
case NativeDefinitions.KEY_CD: |
||||||
|
case NativeDefinitions.KEY_TAPE: |
||||||
|
case NativeDefinitions.KEY_RADIO: |
||||||
|
case NativeDefinitions.KEY_TUNER: |
||||||
|
case NativeDefinitions.KEY_PLAYER: |
||||||
|
case NativeDefinitions.KEY_TEXT: |
||||||
|
case NativeDefinitions.KEY_DVD: |
||||||
|
case NativeDefinitions.KEY_AUX: |
||||||
|
case NativeDefinitions.KEY_MP3: |
||||||
|
case NativeDefinitions.KEY_AUDIO: |
||||||
|
case NativeDefinitions.KEY_VIDEO: |
||||||
|
case NativeDefinitions.KEY_DIRECTORY: |
||||||
|
case NativeDefinitions.KEY_LIST: |
||||||
|
case NativeDefinitions.KEY_MEMO: |
||||||
|
case NativeDefinitions.KEY_CALENDAR: |
||||||
|
case NativeDefinitions.KEY_RED: |
||||||
|
case NativeDefinitions.KEY_GREEN: |
||||||
|
case NativeDefinitions.KEY_YELLOW: |
||||||
|
case NativeDefinitions.KEY_BLUE: |
||||||
|
case NativeDefinitions.KEY_CHANNELUP: |
||||||
|
case NativeDefinitions.KEY_CHANNELDOWN: |
||||||
|
case NativeDefinitions.KEY_FIRST: |
||||||
|
case NativeDefinitions.KEY_LAST: |
||||||
|
case NativeDefinitions.KEY_AB: |
||||||
|
case NativeDefinitions.KEY_NEXT: |
||||||
|
case NativeDefinitions.KEY_RESTART: |
||||||
|
case NativeDefinitions.KEY_SLOW: |
||||||
|
case NativeDefinitions.KEY_SHUFFLE: |
||||||
|
case NativeDefinitions.KEY_BREAK: |
||||||
|
case NativeDefinitions.KEY_PREVIOUS: |
||||||
|
case NativeDefinitions.KEY_DIGITS: |
||||||
|
case NativeDefinitions.KEY_TEEN: |
||||||
|
case NativeDefinitions.KEY_TWEN: |
||||||
|
case NativeDefinitions.KEY_DEL_EOL: |
||||||
|
case NativeDefinitions.KEY_DEL_EOS: |
||||||
|
case NativeDefinitions.KEY_INS_LINE: |
||||||
|
case NativeDefinitions.KEY_DEL_LINE: |
||||||
|
case NativeDefinitions.KEY_FN: |
||||||
|
case NativeDefinitions.KEY_FN_ESC: |
||||||
|
case NativeDefinitions.KEY_FN_F1: |
||||||
|
case NativeDefinitions.KEY_FN_F2: |
||||||
|
case NativeDefinitions.KEY_FN_F3: |
||||||
|
case NativeDefinitions.KEY_FN_F4: |
||||||
|
case NativeDefinitions.KEY_FN_F5: |
||||||
|
case NativeDefinitions.KEY_FN_F6: |
||||||
|
case NativeDefinitions.KEY_FN_F7: |
||||||
|
case NativeDefinitions.KEY_FN_F8: |
||||||
|
case NativeDefinitions.KEY_FN_F9: |
||||||
|
case NativeDefinitions.KEY_FN_F10: |
||||||
|
case NativeDefinitions.KEY_FN_F11: |
||||||
|
case NativeDefinitions.KEY_FN_F12: |
||||||
|
case NativeDefinitions.KEY_FN_1: |
||||||
|
case NativeDefinitions.KEY_FN_2: |
||||||
|
case NativeDefinitions.KEY_FN_D: |
||||||
|
case NativeDefinitions.KEY_FN_E: |
||||||
|
case NativeDefinitions.KEY_FN_F: |
||||||
|
case NativeDefinitions.KEY_FN_S: |
||||||
|
case NativeDefinitions.KEY_FN_B: |
||||||
|
return Controller.Type.KEYBOARD; |
||||||
|
default: |
||||||
|
return Controller.Type.UNKNOWN; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Return port type from a native port type int id |
||||||
|
* @param nativeid The native port type |
||||||
|
* @return The jinput port type |
||||||
|
*/ |
||||||
|
public static Controller.PortType getPortType(int nativeid) { |
||||||
|
// Have to do this one this way as there is no BUS_MAX
|
||||||
|
switch (nativeid) { |
||||||
|
case NativeDefinitions.BUS_GAMEPORT : |
||||||
|
return Controller.PortType.GAME; |
||||||
|
case NativeDefinitions.BUS_I8042 : |
||||||
|
return Controller.PortType.I8042; |
||||||
|
case NativeDefinitions.BUS_PARPORT : |
||||||
|
return Controller.PortType.PARALLEL; |
||||||
|
case NativeDefinitions.BUS_RS232 : |
||||||
|
return Controller.PortType.SERIAL; |
||||||
|
case NativeDefinitions.BUS_USB : |
||||||
|
return Controller.PortType.USB; |
||||||
|
default: |
||||||
|
return Controller.PortType.UNKNOWN; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Gets the identifier for a relative axis |
||||||
|
* @param nativeID The axis type ID |
||||||
|
* @return The jinput id |
||||||
|
*/ |
||||||
|
public static Component.Identifier getRelAxisID(int nativeID) { |
||||||
|
Component.Identifier retval = null; |
||||||
|
try { |
||||||
|
retval = INSTANCE.relAxesIDs[nativeID]; |
||||||
|
} catch (ArrayIndexOutOfBoundsException e) { |
||||||
|
log.warning("INSTANCE.relAxesIDis only " + INSTANCE.relAxesIDs.length + " long, so " + nativeID + " not contained"); |
||||||
|
//ignore, pretend it was null
|
||||||
|
} |
||||||
|
if(retval == null) { |
||||||
|
retval = Component.Identifier.Axis.SLIDER_VELOCITY; |
||||||
|
} |
||||||
|
return retval; |
||||||
|
} |
||||||
|
|
||||||
|
/** Gets the identifier for a absolute axis |
||||||
|
* @param nativeID The native axis type id |
||||||
|
* @return The jinput id |
||||||
|
*/ |
||||||
|
public static Component.Identifier getAbsAxisID(int nativeID) { |
||||||
|
Component.Identifier retval = null; |
||||||
|
try { |
||||||
|
retval = INSTANCE.absAxesIDs[nativeID]; |
||||||
|
} catch (ArrayIndexOutOfBoundsException e) { |
||||||
|
log.warning("INSTANCE.absAxesIDs is only " + INSTANCE.absAxesIDs.length + " long, so " + nativeID + " not contained"); |
||||||
|
//ignore, pretend it was null
|
||||||
|
} |
||||||
|
if(retval == null) { |
||||||
|
retval = Component.Identifier.Axis.SLIDER; |
||||||
|
} |
||||||
|
return retval; |
||||||
|
} |
||||||
|
|
||||||
|
/** Gets the identifier for a button |
||||||
|
* @param nativeID The native button type id |
||||||
|
* @return The jinput id |
||||||
|
*/ |
||||||
|
public static Component.Identifier getButtonID(int nativeID) { |
||||||
|
Component.Identifier retval = null; |
||||||
|
try { |
||||||
|
retval = INSTANCE.buttonIDs[nativeID]; |
||||||
|
} catch (ArrayIndexOutOfBoundsException e) { |
||||||
|
log.warning("INSTANCE.buttonIDs is only " + INSTANCE.buttonIDs.length + " long, so " + nativeID + " not contained"); |
||||||
|
//ignore, pretend it was null
|
||||||
|
} |
||||||
|
if(retval == null) { |
||||||
|
retval = Component.Identifier.Button.UNKNOWN; |
||||||
|
} |
||||||
|
return retval; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* %W% %E% |
||||||
|
* |
||||||
|
* Copyright 2002 Sun Microsystems, Inc. All rights reserved. |
||||||
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
||||||
|
*/ |
||||||
|
/***************************************************************************** |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*****************************************************************************/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** Represents a linux button |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class LinuxPOV extends LinuxComponent { |
||||||
|
private final LinuxEventComponent component_x; |
||||||
|
private final LinuxEventComponent component_y; |
||||||
|
|
||||||
|
private float last_x; |
||||||
|
private float last_y; |
||||||
|
|
||||||
|
public LinuxPOV(LinuxEventComponent component_x, LinuxEventComponent component_y) { |
||||||
|
super(component_x); |
||||||
|
this.component_x = component_x; |
||||||
|
this.component_y = component_y; |
||||||
|
} |
||||||
|
|
||||||
|
protected final float poll() throws IOException { |
||||||
|
last_x = LinuxControllers.poll(component_x); |
||||||
|
last_y = LinuxControllers.poll(component_y); |
||||||
|
return convertValue(0f, null); |
||||||
|
} |
||||||
|
|
||||||
|
public float convertValue(float value, LinuxAxisDescriptor descriptor) { |
||||||
|
if (descriptor == component_x.getDescriptor()) |
||||||
|
last_x = value; |
||||||
|
if (descriptor == component_y.getDescriptor()) |
||||||
|
last_y = value; |
||||||
|
|
||||||
|
if (last_x == -1 && last_y == -1) |
||||||
|
return Component.POV.UP_LEFT; |
||||||
|
else if (last_x == -1 && last_y == 0) |
||||||
|
return Component.POV.LEFT; |
||||||
|
else if (last_x == -1 && last_y == 1) |
||||||
|
return Component.POV.DOWN_LEFT; |
||||||
|
else if (last_x == 0 && last_y == -1) |
||||||
|
return Component.POV.UP; |
||||||
|
else if (last_x == 0 && last_y == 0) |
||||||
|
return Component.POV.OFF; |
||||||
|
else if (last_x == 0 && last_y == 1) |
||||||
|
return Component.POV.DOWN; |
||||||
|
else if (last_x == 1 && last_y == -1) |
||||||
|
return Component.POV.UP_RIGHT; |
||||||
|
else if (last_x == 1 && last_y == 0) |
||||||
|
return Component.POV.RIGHT; |
||||||
|
else if (last_x == 1 && last_y == 1) |
||||||
|
return Component.POV.DOWN_RIGHT; |
||||||
|
else { |
||||||
|
LinuxEnvironmentPlugin.log("Unknown values x = " + last_x + " | y = " + last_y); |
||||||
|
return Component.POV.OFF; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com) |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, this |
||||||
|
* list of conditions and the following disclaimer. Redistributions in binary |
||||||
|
* form must reproduce the above copyright notice, this list of conditions and |
||||||
|
* the following disclaimer in the documentation and/or other materials provided |
||||||
|
* with the distribution. |
||||||
|
* The name of the author may not be used to endorse or promote products derived |
||||||
|
* from this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author elias |
||||||
|
*/ |
||||||
|
final class LinuxRumbleFF extends LinuxForceFeedbackEffect { |
||||||
|
public LinuxRumbleFF(LinuxEventDevice device) throws IOException { |
||||||
|
super(device); |
||||||
|
} |
||||||
|
|
||||||
|
protected final int upload(int id, float intensity) throws IOException { |
||||||
|
int weak_magnitude; |
||||||
|
int strong_magnitude; |
||||||
|
if (intensity > 0.666666f) { |
||||||
|
strong_magnitude = (int)(0x8000*intensity); |
||||||
|
weak_magnitude = (int)(0xc000*intensity); |
||||||
|
} else if (intensity > 0.3333333f) { |
||||||
|
strong_magnitude = (int)(0x8000*intensity); |
||||||
|
weak_magnitude = 0; |
||||||
|
} else { |
||||||
|
strong_magnitude = 0; |
||||||
|
weak_magnitude = (int)(0xc000*intensity); |
||||||
|
} |
||||||
|
|
||||||
|
return getDevice().uploadRumbleEffect(id, 0, 0, 0, -1, 0, strong_magnitude, weak_magnitude); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,634 @@ |
|||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* This file is generated from /usr/src/linux-headers-3.2.0-38-generic/include/linux/input.h please do not edit |
||||||
|
*/ |
||||||
|
class NativeDefinitions { |
||||||
|
public static final int EV_VERSION = 0x010001; |
||||||
|
public static final int EV_SYN = 0x00; |
||||||
|
public static final int EV_KEY = 0x01; |
||||||
|
public static final int EV_REL = 0x02; |
||||||
|
public static final int EV_ABS = 0x03; |
||||||
|
public static final int EV_MSC = 0x04; |
||||||
|
public static final int EV_SW = 0x05; |
||||||
|
public static final int EV_LED = 0x11; |
||||||
|
public static final int EV_SND = 0x12; |
||||||
|
public static final int EV_REP = 0x14; |
||||||
|
public static final int EV_FF = 0x15; |
||||||
|
public static final int EV_PWR = 0x16; |
||||||
|
public static final int EV_FF_STATUS = 0x17; |
||||||
|
public static final int EV_MAX = 0x1f; |
||||||
|
public static final int EV_CNT = (EV_MAX+1); |
||||||
|
public static final int KEY_RESERVED = 0; |
||||||
|
public static final int KEY_ESC = 1; |
||||||
|
public static final int KEY_1 = 2; |
||||||
|
public static final int KEY_2 = 3; |
||||||
|
public static final int KEY_3 = 4; |
||||||
|
public static final int KEY_4 = 5; |
||||||
|
public static final int KEY_5 = 6; |
||||||
|
public static final int KEY_6 = 7; |
||||||
|
public static final int KEY_7 = 8; |
||||||
|
public static final int KEY_8 = 9; |
||||||
|
public static final int KEY_9 = 10; |
||||||
|
public static final int KEY_0 = 11; |
||||||
|
public static final int KEY_MINUS = 12; |
||||||
|
public static final int KEY_EQUAL = 13; |
||||||
|
public static final int KEY_BACKSPACE = 14; |
||||||
|
public static final int KEY_TAB = 15; |
||||||
|
public static final int KEY_Q = 16; |
||||||
|
public static final int KEY_W = 17; |
||||||
|
public static final int KEY_E = 18; |
||||||
|
public static final int KEY_R = 19; |
||||||
|
public static final int KEY_T = 20; |
||||||
|
public static final int KEY_Y = 21; |
||||||
|
public static final int KEY_U = 22; |
||||||
|
public static final int KEY_I = 23; |
||||||
|
public static final int KEY_O = 24; |
||||||
|
public static final int KEY_P = 25; |
||||||
|
public static final int KEY_LEFTBRACE = 26; |
||||||
|
public static final int KEY_RIGHTBRACE = 27; |
||||||
|
public static final int KEY_ENTER = 28; |
||||||
|
public static final int KEY_LEFTCTRL = 29; |
||||||
|
public static final int KEY_A = 30; |
||||||
|
public static final int KEY_S = 31; |
||||||
|
public static final int KEY_D = 32; |
||||||
|
public static final int KEY_F = 33; |
||||||
|
public static final int KEY_G = 34; |
||||||
|
public static final int KEY_H = 35; |
||||||
|
public static final int KEY_J = 36; |
||||||
|
public static final int KEY_K = 37; |
||||||
|
public static final int KEY_L = 38; |
||||||
|
public static final int KEY_SEMICOLON = 39; |
||||||
|
public static final int KEY_APOSTROPHE = 40; |
||||||
|
public static final int KEY_GRAVE = 41; |
||||||
|
public static final int KEY_LEFTSHIFT = 42; |
||||||
|
public static final int KEY_BACKSLASH = 43; |
||||||
|
public static final int KEY_Z = 44; |
||||||
|
public static final int KEY_X = 45; |
||||||
|
public static final int KEY_C = 46; |
||||||
|
public static final int KEY_V = 47; |
||||||
|
public static final int KEY_B = 48; |
||||||
|
public static final int KEY_N = 49; |
||||||
|
public static final int KEY_M = 50; |
||||||
|
public static final int KEY_COMMA = 51; |
||||||
|
public static final int KEY_DOT = 52; |
||||||
|
public static final int KEY_SLASH = 53; |
||||||
|
public static final int KEY_RIGHTSHIFT = 54; |
||||||
|
public static final int KEY_KPASTERISK = 55; |
||||||
|
public static final int KEY_LEFTALT = 56; |
||||||
|
public static final int KEY_SPACE = 57; |
||||||
|
public static final int KEY_CAPSLOCK = 58; |
||||||
|
public static final int KEY_F1 = 59; |
||||||
|
public static final int KEY_F2 = 60; |
||||||
|
public static final int KEY_F3 = 61; |
||||||
|
public static final int KEY_F4 = 62; |
||||||
|
public static final int KEY_F5 = 63; |
||||||
|
public static final int KEY_F6 = 64; |
||||||
|
public static final int KEY_F7 = 65; |
||||||
|
public static final int KEY_F8 = 66; |
||||||
|
public static final int KEY_F9 = 67; |
||||||
|
public static final int KEY_F10 = 68; |
||||||
|
public static final int KEY_NUMLOCK = 69; |
||||||
|
public static final int KEY_SCROLLLOCK = 70; |
||||||
|
public static final int KEY_KP7 = 71; |
||||||
|
public static final int KEY_KP8 = 72; |
||||||
|
public static final int KEY_KP9 = 73; |
||||||
|
public static final int KEY_KPMINUS = 74; |
||||||
|
public static final int KEY_KP4 = 75; |
||||||
|
public static final int KEY_KP5 = 76; |
||||||
|
public static final int KEY_KP6 = 77; |
||||||
|
public static final int KEY_KPPLUS = 78; |
||||||
|
public static final int KEY_KP1 = 79; |
||||||
|
public static final int KEY_KP2 = 80; |
||||||
|
public static final int KEY_KP3 = 81; |
||||||
|
public static final int KEY_KP0 = 82; |
||||||
|
public static final int KEY_KPDOT = 83; |
||||||
|
public static final int KEY_ZENKAKUHANKAKU = 85; |
||||||
|
public static final int KEY_102ND = 86; |
||||||
|
public static final int KEY_F11 = 87; |
||||||
|
public static final int KEY_F12 = 88; |
||||||
|
public static final int KEY_RO = 89; |
||||||
|
public static final int KEY_KATAKANA = 90; |
||||||
|
public static final int KEY_HIRAGANA = 91; |
||||||
|
public static final int KEY_HENKAN = 92; |
||||||
|
public static final int KEY_KATAKANAHIRAGANA = 93; |
||||||
|
public static final int KEY_MUHENKAN = 94; |
||||||
|
public static final int KEY_KPJPCOMMA = 95; |
||||||
|
public static final int KEY_KPENTER = 96; |
||||||
|
public static final int KEY_RIGHTCTRL = 97; |
||||||
|
public static final int KEY_KPSLASH = 98; |
||||||
|
public static final int KEY_SYSRQ = 99; |
||||||
|
public static final int KEY_RIGHTALT = 100; |
||||||
|
public static final int KEY_LINEFEED = 101; |
||||||
|
public static final int KEY_HOME = 102; |
||||||
|
public static final int KEY_UP = 103; |
||||||
|
public static final int KEY_PAGEUP = 104; |
||||||
|
public static final int KEY_LEFT = 105; |
||||||
|
public static final int KEY_RIGHT = 106; |
||||||
|
public static final int KEY_END = 107; |
||||||
|
public static final int KEY_DOWN = 108; |
||||||
|
public static final int KEY_PAGEDOWN = 109; |
||||||
|
public static final int KEY_INSERT = 110; |
||||||
|
public static final int KEY_DELETE = 111; |
||||||
|
public static final int KEY_MACRO = 112; |
||||||
|
public static final int KEY_MUTE = 113; |
||||||
|
public static final int KEY_VOLUMEDOWN = 114; |
||||||
|
public static final int KEY_VOLUMEUP = 115; |
||||||
|
public static final int KEY_POWER = 116; |
||||||
|
public static final int KEY_KPEQUAL = 117; |
||||||
|
public static final int KEY_KPPLUSMINUS = 118; |
||||||
|
public static final int KEY_PAUSE = 119; |
||||||
|
public static final int KEY_SCALE = 120; |
||||||
|
public static final int KEY_KPCOMMA = 121; |
||||||
|
public static final int KEY_HANGEUL = 122; |
||||||
|
public static final int KEY_HANGUEL = KEY_HANGEUL; |
||||||
|
public static final int KEY_HANJA = 123; |
||||||
|
public static final int KEY_YEN = 124; |
||||||
|
public static final int KEY_LEFTMETA = 125; |
||||||
|
public static final int KEY_RIGHTMETA = 126; |
||||||
|
public static final int KEY_COMPOSE = 127; |
||||||
|
public static final int KEY_STOP = 128; |
||||||
|
public static final int KEY_AGAIN = 129; |
||||||
|
public static final int KEY_PROPS = 130; |
||||||
|
public static final int KEY_UNDO = 131; |
||||||
|
public static final int KEY_FRONT = 132; |
||||||
|
public static final int KEY_COPY = 133; |
||||||
|
public static final int KEY_OPEN = 134; |
||||||
|
public static final int KEY_PASTE = 135; |
||||||
|
public static final int KEY_FIND = 136; |
||||||
|
public static final int KEY_CUT = 137; |
||||||
|
public static final int KEY_HELP = 138; |
||||||
|
public static final int KEY_MENU = 139; |
||||||
|
public static final int KEY_CALC = 140; |
||||||
|
public static final int KEY_SETUP = 141; |
||||||
|
public static final int KEY_SLEEP = 142; |
||||||
|
public static final int KEY_WAKEUP = 143; |
||||||
|
public static final int KEY_FILE = 144; |
||||||
|
public static final int KEY_SENDFILE = 145; |
||||||
|
public static final int KEY_DELETEFILE = 146; |
||||||
|
public static final int KEY_XFER = 147; |
||||||
|
public static final int KEY_PROG1 = 148; |
||||||
|
public static final int KEY_PROG2 = 149; |
||||||
|
public static final int KEY_WWW = 150; |
||||||
|
public static final int KEY_MSDOS = 151; |
||||||
|
public static final int KEY_COFFEE = 152; |
||||||
|
public static final int KEY_SCREENLOCK = KEY_COFFEE; |
||||||
|
public static final int KEY_DIRECTION = 153; |
||||||
|
public static final int KEY_CYCLEWINDOWS = 154; |
||||||
|
public static final int KEY_MAIL = 155; |
||||||
|
public static final int KEY_BOOKMARKS = 156; |
||||||
|
public static final int KEY_COMPUTER = 157; |
||||||
|
public static final int KEY_BACK = 158; |
||||||
|
public static final int KEY_FORWARD = 159; |
||||||
|
public static final int KEY_CLOSECD = 160; |
||||||
|
public static final int KEY_EJECTCD = 161; |
||||||
|
public static final int KEY_EJECTCLOSECD = 162; |
||||||
|
public static final int KEY_NEXTSONG = 163; |
||||||
|
public static final int KEY_PLAYPAUSE = 164; |
||||||
|
public static final int KEY_PREVIOUSSONG = 165; |
||||||
|
public static final int KEY_STOPCD = 166; |
||||||
|
public static final int KEY_RECORD = 167; |
||||||
|
public static final int KEY_REWIND = 168; |
||||||
|
public static final int KEY_PHONE = 169; |
||||||
|
public static final int KEY_ISO = 170; |
||||||
|
public static final int KEY_CONFIG = 171; |
||||||
|
public static final int KEY_HOMEPAGE = 172; |
||||||
|
public static final int KEY_REFRESH = 173; |
||||||
|
public static final int KEY_EXIT = 174; |
||||||
|
public static final int KEY_MOVE = 175; |
||||||
|
public static final int KEY_EDIT = 176; |
||||||
|
public static final int KEY_SCROLLUP = 177; |
||||||
|
public static final int KEY_SCROLLDOWN = 178; |
||||||
|
public static final int KEY_KPLEFTPAREN = 179; |
||||||
|
public static final int KEY_KPRIGHTPAREN = 180; |
||||||
|
public static final int KEY_NEW = 181; |
||||||
|
public static final int KEY_REDO = 182; |
||||||
|
public static final int KEY_F13 = 183; |
||||||
|
public static final int KEY_F14 = 184; |
||||||
|
public static final int KEY_F15 = 185; |
||||||
|
public static final int KEY_F16 = 186; |
||||||
|
public static final int KEY_F17 = 187; |
||||||
|
public static final int KEY_F18 = 188; |
||||||
|
public static final int KEY_F19 = 189; |
||||||
|
public static final int KEY_F20 = 190; |
||||||
|
public static final int KEY_F21 = 191; |
||||||
|
public static final int KEY_F22 = 192; |
||||||
|
public static final int KEY_F23 = 193; |
||||||
|
public static final int KEY_F24 = 194; |
||||||
|
public static final int KEY_PLAYCD = 200; |
||||||
|
public static final int KEY_PAUSECD = 201; |
||||||
|
public static final int KEY_PROG3 = 202; |
||||||
|
public static final int KEY_PROG4 = 203; |
||||||
|
public static final int KEY_DASHBOARD = 204; |
||||||
|
public static final int KEY_SUSPEND = 205; |
||||||
|
public static final int KEY_CLOSE = 206; |
||||||
|
public static final int KEY_PLAY = 207; |
||||||
|
public static final int KEY_FASTFORWARD = 208; |
||||||
|
public static final int KEY_BASSBOOST = 209; |
||||||
|
public static final int KEY_PRINT = 210; |
||||||
|
public static final int KEY_HP = 211; |
||||||
|
public static final int KEY_CAMERA = 212; |
||||||
|
public static final int KEY_SOUND = 213; |
||||||
|
public static final int KEY_QUESTION = 214; |
||||||
|
public static final int KEY_EMAIL = 215; |
||||||
|
public static final int KEY_CHAT = 216; |
||||||
|
public static final int KEY_SEARCH = 217; |
||||||
|
public static final int KEY_CONNECT = 218; |
||||||
|
public static final int KEY_FINANCE = 219; |
||||||
|
public static final int KEY_SPORT = 220; |
||||||
|
public static final int KEY_SHOP = 221; |
||||||
|
public static final int KEY_ALTERASE = 222; |
||||||
|
public static final int KEY_CANCEL = 223; |
||||||
|
public static final int KEY_BRIGHTNESSDOWN = 224; |
||||||
|
public static final int KEY_BRIGHTNESSUP = 225; |
||||||
|
public static final int KEY_MEDIA = 226; |
||||||
|
public static final int KEY_SWITCHVIDEOMODE = 227; |
||||||
|
public static final int KEY_KBDILLUMTOGGLE = 228; |
||||||
|
public static final int KEY_KBDILLUMDOWN = 229; |
||||||
|
public static final int KEY_KBDILLUMUP = 230; |
||||||
|
public static final int KEY_SEND = 231; |
||||||
|
public static final int KEY_REPLY = 232; |
||||||
|
public static final int KEY_FORWARDMAIL = 233; |
||||||
|
public static final int KEY_SAVE = 234; |
||||||
|
public static final int KEY_DOCUMENTS = 235; |
||||||
|
public static final int KEY_BATTERY = 236; |
||||||
|
public static final int KEY_BLUETOOTH = 237; |
||||||
|
public static final int KEY_WLAN = 238; |
||||||
|
public static final int KEY_UWB = 239; |
||||||
|
public static final int KEY_UNKNOWN = 240; |
||||||
|
public static final int KEY_VIDEO_NEXT = 241; |
||||||
|
public static final int KEY_VIDEO_PREV = 242; |
||||||
|
public static final int KEY_BRIGHTNESS_CYCLE = 243; |
||||||
|
public static final int KEY_BRIGHTNESS_ZERO = 244; |
||||||
|
public static final int KEY_DISPLAY_OFF = 245; |
||||||
|
public static final int KEY_WIMAX = 246; |
||||||
|
public static final int KEY_RFKILL = 247; |
||||||
|
public static final int KEY_MICMUTE = 248; |
||||||
|
public static final int BTN_MISC = 0x100; |
||||||
|
public static final int BTN_0 = 0x100; |
||||||
|
public static final int BTN_1 = 0x101; |
||||||
|
public static final int BTN_2 = 0x102; |
||||||
|
public static final int BTN_3 = 0x103; |
||||||
|
public static final int BTN_4 = 0x104; |
||||||
|
public static final int BTN_5 = 0x105; |
||||||
|
public static final int BTN_6 = 0x106; |
||||||
|
public static final int BTN_7 = 0x107; |
||||||
|
public static final int BTN_8 = 0x108; |
||||||
|
public static final int BTN_9 = 0x109; |
||||||
|
public static final int BTN_MOUSE = 0x110; |
||||||
|
public static final int BTN_LEFT = 0x110; |
||||||
|
public static final int BTN_RIGHT = 0x111; |
||||||
|
public static final int BTN_MIDDLE = 0x112; |
||||||
|
public static final int BTN_SIDE = 0x113; |
||||||
|
public static final int BTN_EXTRA = 0x114; |
||||||
|
public static final int BTN_FORWARD = 0x115; |
||||||
|
public static final int BTN_BACK = 0x116; |
||||||
|
public static final int BTN_TASK = 0x117; |
||||||
|
public static final int BTN_JOYSTICK = 0x120; |
||||||
|
public static final int BTN_TRIGGER = 0x120; |
||||||
|
public static final int BTN_THUMB = 0x121; |
||||||
|
public static final int BTN_THUMB2 = 0x122; |
||||||
|
public static final int BTN_TOP = 0x123; |
||||||
|
public static final int BTN_TOP2 = 0x124; |
||||||
|
public static final int BTN_PINKIE = 0x125; |
||||||
|
public static final int BTN_BASE = 0x126; |
||||||
|
public static final int BTN_BASE2 = 0x127; |
||||||
|
public static final int BTN_BASE3 = 0x128; |
||||||
|
public static final int BTN_BASE4 = 0x129; |
||||||
|
public static final int BTN_BASE5 = 0x12a; |
||||||
|
public static final int BTN_BASE6 = 0x12b; |
||||||
|
public static final int BTN_DEAD = 0x12f; |
||||||
|
public static final int BTN_GAMEPAD = 0x130; |
||||||
|
public static final int BTN_A = 0x130; |
||||||
|
public static final int BTN_B = 0x131; |
||||||
|
public static final int BTN_C = 0x132; |
||||||
|
public static final int BTN_X = 0x133; |
||||||
|
public static final int BTN_Y = 0x134; |
||||||
|
public static final int BTN_Z = 0x135; |
||||||
|
public static final int BTN_TL = 0x136; |
||||||
|
public static final int BTN_TR = 0x137; |
||||||
|
public static final int BTN_TL2 = 0x138; |
||||||
|
public static final int BTN_TR2 = 0x139; |
||||||
|
public static final int BTN_SELECT = 0x13a; |
||||||
|
public static final int BTN_START = 0x13b; |
||||||
|
public static final int BTN_MODE = 0x13c; |
||||||
|
public static final int BTN_THUMBL = 0x13d; |
||||||
|
public static final int BTN_THUMBR = 0x13e; |
||||||
|
public static final int BTN_DIGI = 0x140; |
||||||
|
public static final int BTN_TOOL_PEN = 0x140; |
||||||
|
public static final int BTN_TOOL_RUBBER = 0x141; |
||||||
|
public static final int BTN_TOOL_BRUSH = 0x142; |
||||||
|
public static final int BTN_TOOL_PENCIL = 0x143; |
||||||
|
public static final int BTN_TOOL_AIRBRUSH = 0x144; |
||||||
|
public static final int BTN_TOOL_FINGER = 0x145; |
||||||
|
public static final int BTN_TOOL_MOUSE = 0x146; |
||||||
|
public static final int BTN_TOOL_LENS = 0x147; |
||||||
|
public static final int BTN_TOOL_QUINTTAP = 0x148; |
||||||
|
public static final int BTN_TOUCH = 0x14a; |
||||||
|
public static final int BTN_STYLUS = 0x14b; |
||||||
|
public static final int BTN_STYLUS2 = 0x14c; |
||||||
|
public static final int BTN_TOOL_DOUBLETAP = 0x14d; |
||||||
|
public static final int BTN_TOOL_TRIPLETAP = 0x14e; |
||||||
|
public static final int BTN_TOOL_QUADTAP = 0x14f; |
||||||
|
public static final int BTN_WHEEL = 0x150; |
||||||
|
public static final int BTN_GEAR_DOWN = 0x150; |
||||||
|
public static final int BTN_GEAR_UP = 0x151; |
||||||
|
public static final int KEY_OK = 0x160; |
||||||
|
public static final int KEY_SELECT = 0x161; |
||||||
|
public static final int KEY_GOTO = 0x162; |
||||||
|
public static final int KEY_CLEAR = 0x163; |
||||||
|
public static final int KEY_POWER2 = 0x164; |
||||||
|
public static final int KEY_OPTION = 0x165; |
||||||
|
public static final int KEY_INFO = 0x166; |
||||||
|
public static final int KEY_TIME = 0x167; |
||||||
|
public static final int KEY_VENDOR = 0x168; |
||||||
|
public static final int KEY_ARCHIVE = 0x169; |
||||||
|
public static final int KEY_PROGRAM = 0x16a; |
||||||
|
public static final int KEY_CHANNEL = 0x16b; |
||||||
|
public static final int KEY_FAVORITES = 0x16c; |
||||||
|
public static final int KEY_EPG = 0x16d; |
||||||
|
public static final int KEY_PVR = 0x16e; |
||||||
|
public static final int KEY_MHP = 0x16f; |
||||||
|
public static final int KEY_LANGUAGE = 0x170; |
||||||
|
public static final int KEY_TITLE = 0x171; |
||||||
|
public static final int KEY_SUBTITLE = 0x172; |
||||||
|
public static final int KEY_ANGLE = 0x173; |
||||||
|
public static final int KEY_ZOOM = 0x174; |
||||||
|
public static final int KEY_MODE = 0x175; |
||||||
|
public static final int KEY_KEYBOARD = 0x176; |
||||||
|
public static final int KEY_SCREEN = 0x177; |
||||||
|
public static final int KEY_PC = 0x178; |
||||||
|
public static final int KEY_TV = 0x179; |
||||||
|
public static final int KEY_TV2 = 0x17a; |
||||||
|
public static final int KEY_VCR = 0x17b; |
||||||
|
public static final int KEY_VCR2 = 0x17c; |
||||||
|
public static final int KEY_SAT = 0x17d; |
||||||
|
public static final int KEY_SAT2 = 0x17e; |
||||||
|
public static final int KEY_CD = 0x17f; |
||||||
|
public static final int KEY_TAPE = 0x180; |
||||||
|
public static final int KEY_RADIO = 0x181; |
||||||
|
public static final int KEY_TUNER = 0x182; |
||||||
|
public static final int KEY_PLAYER = 0x183; |
||||||
|
public static final int KEY_TEXT = 0x184; |
||||||
|
public static final int KEY_DVD = 0x185; |
||||||
|
public static final int KEY_AUX = 0x186; |
||||||
|
public static final int KEY_MP3 = 0x187; |
||||||
|
public static final int KEY_AUDIO = 0x188; |
||||||
|
public static final int KEY_VIDEO = 0x189; |
||||||
|
public static final int KEY_DIRECTORY = 0x18a; |
||||||
|
public static final int KEY_LIST = 0x18b; |
||||||
|
public static final int KEY_MEMO = 0x18c; |
||||||
|
public static final int KEY_CALENDAR = 0x18d; |
||||||
|
public static final int KEY_RED = 0x18e; |
||||||
|
public static final int KEY_GREEN = 0x18f; |
||||||
|
public static final int KEY_YELLOW = 0x190; |
||||||
|
public static final int KEY_BLUE = 0x191; |
||||||
|
public static final int KEY_CHANNELUP = 0x192; |
||||||
|
public static final int KEY_CHANNELDOWN = 0x193; |
||||||
|
public static final int KEY_FIRST = 0x194; |
||||||
|
public static final int KEY_LAST = 0x195; |
||||||
|
public static final int KEY_AB = 0x196; |
||||||
|
public static final int KEY_NEXT = 0x197; |
||||||
|
public static final int KEY_RESTART = 0x198; |
||||||
|
public static final int KEY_SLOW = 0x199; |
||||||
|
public static final int KEY_SHUFFLE = 0x19a; |
||||||
|
public static final int KEY_BREAK = 0x19b; |
||||||
|
public static final int KEY_PREVIOUS = 0x19c; |
||||||
|
public static final int KEY_DIGITS = 0x19d; |
||||||
|
public static final int KEY_TEEN = 0x19e; |
||||||
|
public static final int KEY_TWEN = 0x19f; |
||||||
|
public static final int KEY_VIDEOPHONE = 0x1a0; |
||||||
|
public static final int KEY_GAMES = 0x1a1; |
||||||
|
public static final int KEY_ZOOMIN = 0x1a2; |
||||||
|
public static final int KEY_ZOOMOUT = 0x1a3; |
||||||
|
public static final int KEY_ZOOMRESET = 0x1a4; |
||||||
|
public static final int KEY_WORDPROCESSOR = 0x1a5; |
||||||
|
public static final int KEY_EDITOR = 0x1a6; |
||||||
|
public static final int KEY_SPREADSHEET = 0x1a7; |
||||||
|
public static final int KEY_GRAPHICSEDITOR = 0x1a8; |
||||||
|
public static final int KEY_PRESENTATION = 0x1a9; |
||||||
|
public static final int KEY_DATABASE = 0x1aa; |
||||||
|
public static final int KEY_NEWS = 0x1ab; |
||||||
|
public static final int KEY_VOICEMAIL = 0x1ac; |
||||||
|
public static final int KEY_ADDRESSBOOK = 0x1ad; |
||||||
|
public static final int KEY_MESSENGER = 0x1ae; |
||||||
|
public static final int KEY_DISPLAYTOGGLE = 0x1af; |
||||||
|
public static final int KEY_SPELLCHECK = 0x1b0; |
||||||
|
public static final int KEY_LOGOFF = 0x1b1; |
||||||
|
public static final int KEY_DOLLAR = 0x1b2; |
||||||
|
public static final int KEY_EURO = 0x1b3; |
||||||
|
public static final int KEY_FRAMEBACK = 0x1b4; |
||||||
|
public static final int KEY_FRAMEFORWARD = 0x1b5; |
||||||
|
public static final int KEY_CONTEXT_MENU = 0x1b6; |
||||||
|
public static final int KEY_MEDIA_REPEAT = 0x1b7; |
||||||
|
public static final int KEY_10CHANNELSUP = 0x1b8; |
||||||
|
public static final int KEY_10CHANNELSDOWN = 0x1b9; |
||||||
|
public static final int KEY_IMAGES = 0x1ba; |
||||||
|
public static final int KEY_DEL_EOL = 0x1c0; |
||||||
|
public static final int KEY_DEL_EOS = 0x1c1; |
||||||
|
public static final int KEY_INS_LINE = 0x1c2; |
||||||
|
public static final int KEY_DEL_LINE = 0x1c3; |
||||||
|
public static final int KEY_FN = 0x1d0; |
||||||
|
public static final int KEY_FN_ESC = 0x1d1; |
||||||
|
public static final int KEY_FN_F1 = 0x1d2; |
||||||
|
public static final int KEY_FN_F2 = 0x1d3; |
||||||
|
public static final int KEY_FN_F3 = 0x1d4; |
||||||
|
public static final int KEY_FN_F4 = 0x1d5; |
||||||
|
public static final int KEY_FN_F5 = 0x1d6; |
||||||
|
public static final int KEY_FN_F6 = 0x1d7; |
||||||
|
public static final int KEY_FN_F7 = 0x1d8; |
||||||
|
public static final int KEY_FN_F8 = 0x1d9; |
||||||
|
public static final int KEY_FN_F9 = 0x1da; |
||||||
|
public static final int KEY_FN_F10 = 0x1db; |
||||||
|
public static final int KEY_FN_F11 = 0x1dc; |
||||||
|
public static final int KEY_FN_F12 = 0x1dd; |
||||||
|
public static final int KEY_FN_1 = 0x1de; |
||||||
|
public static final int KEY_FN_2 = 0x1df; |
||||||
|
public static final int KEY_FN_D = 0x1e0; |
||||||
|
public static final int KEY_FN_E = 0x1e1; |
||||||
|
public static final int KEY_FN_F = 0x1e2; |
||||||
|
public static final int KEY_FN_S = 0x1e3; |
||||||
|
public static final int KEY_FN_B = 0x1e4; |
||||||
|
public static final int KEY_BRL_DOT1 = 0x1f1; |
||||||
|
public static final int KEY_BRL_DOT2 = 0x1f2; |
||||||
|
public static final int KEY_BRL_DOT3 = 0x1f3; |
||||||
|
public static final int KEY_BRL_DOT4 = 0x1f4; |
||||||
|
public static final int KEY_BRL_DOT5 = 0x1f5; |
||||||
|
public static final int KEY_BRL_DOT6 = 0x1f6; |
||||||
|
public static final int KEY_BRL_DOT7 = 0x1f7; |
||||||
|
public static final int KEY_BRL_DOT8 = 0x1f8; |
||||||
|
public static final int KEY_BRL_DOT9 = 0x1f9; |
||||||
|
public static final int KEY_BRL_DOT10 = 0x1fa; |
||||||
|
public static final int KEY_NUMERIC_0 = 0x200; |
||||||
|
public static final int KEY_NUMERIC_1 = 0x201; |
||||||
|
public static final int KEY_NUMERIC_2 = 0x202; |
||||||
|
public static final int KEY_NUMERIC_3 = 0x203; |
||||||
|
public static final int KEY_NUMERIC_4 = 0x204; |
||||||
|
public static final int KEY_NUMERIC_5 = 0x205; |
||||||
|
public static final int KEY_NUMERIC_6 = 0x206; |
||||||
|
public static final int KEY_NUMERIC_7 = 0x207; |
||||||
|
public static final int KEY_NUMERIC_8 = 0x208; |
||||||
|
public static final int KEY_NUMERIC_9 = 0x209; |
||||||
|
public static final int KEY_NUMERIC_STAR = 0x20a; |
||||||
|
public static final int KEY_NUMERIC_POUND = 0x20b; |
||||||
|
public static final int KEY_CAMERA_FOCUS = 0x210; |
||||||
|
public static final int KEY_WPS_BUTTON = 0x211; |
||||||
|
public static final int KEY_TOUCHPAD_TOGGLE = 0x212; |
||||||
|
public static final int KEY_TOUCHPAD_ON = 0x213; |
||||||
|
public static final int KEY_TOUCHPAD_OFF = 0x214; |
||||||
|
public static final int KEY_CAMERA_ZOOMIN = 0x215; |
||||||
|
public static final int KEY_CAMERA_ZOOMOUT = 0x216; |
||||||
|
public static final int KEY_CAMERA_UP = 0x217; |
||||||
|
public static final int KEY_CAMERA_DOWN = 0x218; |
||||||
|
public static final int KEY_CAMERA_LEFT = 0x219; |
||||||
|
public static final int KEY_CAMERA_RIGHT = 0x21a; |
||||||
|
public static final int BTN_TRIGGER_HAPPY = 0x2c0; |
||||||
|
public static final int BTN_TRIGGER_HAPPY1 = 0x2c0; |
||||||
|
public static final int BTN_TRIGGER_HAPPY2 = 0x2c1; |
||||||
|
public static final int BTN_TRIGGER_HAPPY3 = 0x2c2; |
||||||
|
public static final int BTN_TRIGGER_HAPPY4 = 0x2c3; |
||||||
|
public static final int BTN_TRIGGER_HAPPY5 = 0x2c4; |
||||||
|
public static final int BTN_TRIGGER_HAPPY6 = 0x2c5; |
||||||
|
public static final int BTN_TRIGGER_HAPPY7 = 0x2c6; |
||||||
|
public static final int BTN_TRIGGER_HAPPY8 = 0x2c7; |
||||||
|
public static final int BTN_TRIGGER_HAPPY9 = 0x2c8; |
||||||
|
public static final int BTN_TRIGGER_HAPPY10 = 0x2c9; |
||||||
|
public static final int BTN_TRIGGER_HAPPY11 = 0x2ca; |
||||||
|
public static final int BTN_TRIGGER_HAPPY12 = 0x2cb; |
||||||
|
public static final int BTN_TRIGGER_HAPPY13 = 0x2cc; |
||||||
|
public static final int BTN_TRIGGER_HAPPY14 = 0x2cd; |
||||||
|
public static final int BTN_TRIGGER_HAPPY15 = 0x2ce; |
||||||
|
public static final int BTN_TRIGGER_HAPPY16 = 0x2cf; |
||||||
|
public static final int BTN_TRIGGER_HAPPY17 = 0x2d0; |
||||||
|
public static final int BTN_TRIGGER_HAPPY18 = 0x2d1; |
||||||
|
public static final int BTN_TRIGGER_HAPPY19 = 0x2d2; |
||||||
|
public static final int BTN_TRIGGER_HAPPY20 = 0x2d3; |
||||||
|
public static final int BTN_TRIGGER_HAPPY21 = 0x2d4; |
||||||
|
public static final int BTN_TRIGGER_HAPPY22 = 0x2d5; |
||||||
|
public static final int BTN_TRIGGER_HAPPY23 = 0x2d6; |
||||||
|
public static final int BTN_TRIGGER_HAPPY24 = 0x2d7; |
||||||
|
public static final int BTN_TRIGGER_HAPPY25 = 0x2d8; |
||||||
|
public static final int BTN_TRIGGER_HAPPY26 = 0x2d9; |
||||||
|
public static final int BTN_TRIGGER_HAPPY27 = 0x2da; |
||||||
|
public static final int BTN_TRIGGER_HAPPY28 = 0x2db; |
||||||
|
public static final int BTN_TRIGGER_HAPPY29 = 0x2dc; |
||||||
|
public static final int BTN_TRIGGER_HAPPY30 = 0x2dd; |
||||||
|
public static final int BTN_TRIGGER_HAPPY31 = 0x2de; |
||||||
|
public static final int BTN_TRIGGER_HAPPY32 = 0x2df; |
||||||
|
public static final int BTN_TRIGGER_HAPPY33 = 0x2e0; |
||||||
|
public static final int BTN_TRIGGER_HAPPY34 = 0x2e1; |
||||||
|
public static final int BTN_TRIGGER_HAPPY35 = 0x2e2; |
||||||
|
public static final int BTN_TRIGGER_HAPPY36 = 0x2e3; |
||||||
|
public static final int BTN_TRIGGER_HAPPY37 = 0x2e4; |
||||||
|
public static final int BTN_TRIGGER_HAPPY38 = 0x2e5; |
||||||
|
public static final int BTN_TRIGGER_HAPPY39 = 0x2e6; |
||||||
|
public static final int BTN_TRIGGER_HAPPY40 = 0x2e7; |
||||||
|
public static final int KEY_MIN_INTERESTING = KEY_MUTE; |
||||||
|
public static final int KEY_MAX = 0x2ff; |
||||||
|
public static final int KEY_CNT = (KEY_MAX+1); |
||||||
|
public static final int REL_X = 0x00; |
||||||
|
public static final int REL_Y = 0x01; |
||||||
|
public static final int REL_Z = 0x02; |
||||||
|
public static final int REL_RX = 0x03; |
||||||
|
public static final int REL_RY = 0x04; |
||||||
|
public static final int REL_RZ = 0x05; |
||||||
|
public static final int REL_HWHEEL = 0x06; |
||||||
|
public static final int REL_DIAL = 0x07; |
||||||
|
public static final int REL_WHEEL = 0x08; |
||||||
|
public static final int REL_MISC = 0x09; |
||||||
|
public static final int REL_MAX = 0x0f; |
||||||
|
public static final int REL_CNT = (REL_MAX+1); |
||||||
|
public static final int ABS_X = 0x00; |
||||||
|
public static final int ABS_Y = 0x01; |
||||||
|
public static final int ABS_Z = 0x02; |
||||||
|
public static final int ABS_RX = 0x03; |
||||||
|
public static final int ABS_RY = 0x04; |
||||||
|
public static final int ABS_RZ = 0x05; |
||||||
|
public static final int ABS_THROTTLE = 0x06; |
||||||
|
public static final int ABS_RUDDER = 0x07; |
||||||
|
public static final int ABS_WHEEL = 0x08; |
||||||
|
public static final int ABS_GAS = 0x09; |
||||||
|
public static final int ABS_BRAKE = 0x0a; |
||||||
|
public static final int ABS_HAT0X = 0x10; |
||||||
|
public static final int ABS_HAT0Y = 0x11; |
||||||
|
public static final int ABS_HAT1X = 0x12; |
||||||
|
public static final int ABS_HAT1Y = 0x13; |
||||||
|
public static final int ABS_HAT2X = 0x14; |
||||||
|
public static final int ABS_HAT2Y = 0x15; |
||||||
|
public static final int ABS_HAT3X = 0x16; |
||||||
|
public static final int ABS_HAT3Y = 0x17; |
||||||
|
public static final int ABS_PRESSURE = 0x18; |
||||||
|
public static final int ABS_DISTANCE = 0x19; |
||||||
|
public static final int ABS_TILT_X = 0x1a; |
||||||
|
public static final int ABS_TILT_Y = 0x1b; |
||||||
|
public static final int ABS_TOOL_WIDTH = 0x1c; |
||||||
|
public static final int ABS_VOLUME = 0x20; |
||||||
|
public static final int ABS_MISC = 0x28; |
||||||
|
public static final int ABS_MT_SLOT = 0x2f; |
||||||
|
public static final int ABS_MT_TOUCH_MAJOR = 0x30; |
||||||
|
public static final int ABS_MT_TOUCH_MINOR = 0x31; |
||||||
|
public static final int ABS_MT_WIDTH_MAJOR = 0x32; |
||||||
|
public static final int ABS_MT_WIDTH_MINOR = 0x33; |
||||||
|
public static final int ABS_MT_ORIENTATION = 0x34; |
||||||
|
public static final int ABS_MT_POSITION_X = 0x35; |
||||||
|
public static final int ABS_MT_POSITION_Y = 0x36; |
||||||
|
public static final int ABS_MT_TOOL_TYPE = 0x37; |
||||||
|
public static final int ABS_MT_BLOB_ID = 0x38; |
||||||
|
public static final int ABS_MT_TRACKING_ID = 0x39; |
||||||
|
public static final int ABS_MT_PRESSURE = 0x3a; |
||||||
|
public static final int ABS_MT_DISTANCE = 0x3b; |
||||||
|
public static final int ABS_MT_FIRST = ABS_MT_TOUCH_MAJOR; |
||||||
|
public static final int ABS_MT_LAST = ABS_MT_DISTANCE; |
||||||
|
public static final int ABS_MAX = 0x3f; |
||||||
|
public static final int ABS_CNT = (ABS_MAX+1); |
||||||
|
public static final int BUS_PCI = 0x01; |
||||||
|
public static final int BUS_ISAPNP = 0x02; |
||||||
|
public static final int BUS_USB = 0x03; |
||||||
|
public static final int BUS_HIL = 0x04; |
||||||
|
public static final int BUS_BLUETOOTH = 0x05; |
||||||
|
public static final int BUS_VIRTUAL = 0x06; |
||||||
|
public static final int BUS_ISA = 0x10; |
||||||
|
public static final int BUS_I8042 = 0x11; |
||||||
|
public static final int BUS_XTKBD = 0x12; |
||||||
|
public static final int BUS_RS232 = 0x13; |
||||||
|
public static final int BUS_GAMEPORT = 0x14; |
||||||
|
public static final int BUS_PARPORT = 0x15; |
||||||
|
public static final int BUS_AMIGA = 0x16; |
||||||
|
public static final int BUS_ADB = 0x17; |
||||||
|
public static final int BUS_I2C = 0x18; |
||||||
|
public static final int BUS_HOST = 0x19; |
||||||
|
public static final int BUS_GSC = 0x1A; |
||||||
|
public static final int BUS_ATARI = 0x1B; |
||||||
|
public static final int BUS_SPI = 0x1C; |
||||||
|
public static final int FF_STATUS_STOPPED = 0x00; |
||||||
|
public static final int FF_STATUS_PLAYING = 0x01; |
||||||
|
public static final int FF_STATUS_MAX = 0x01; |
||||||
|
public static final int FF_RUMBLE = 0x50; |
||||||
|
public static final int FF_PERIODIC = 0x51; |
||||||
|
public static final int FF_CONSTANT = 0x52; |
||||||
|
public static final int FF_SPRING = 0x53; |
||||||
|
public static final int FF_FRICTION = 0x54; |
||||||
|
public static final int FF_DAMPER = 0x55; |
||||||
|
public static final int FF_INERTIA = 0x56; |
||||||
|
public static final int FF_RAMP = 0x57; |
||||||
|
public static final int FF_EFFECT_MIN = FF_RUMBLE; |
||||||
|
public static final int FF_EFFECT_MAX = FF_RAMP; |
||||||
|
public static final int FF_SQUARE = 0x58; |
||||||
|
public static final int FF_TRIANGLE = 0x59; |
||||||
|
public static final int FF_SINE = 0x5a; |
||||||
|
public static final int FF_SAW_UP = 0x5b; |
||||||
|
public static final int FF_SAW_DOWN = 0x5c; |
||||||
|
public static final int FF_CUSTOM = 0x5d; |
||||||
|
public static final int FF_WAVEFORM_MIN = FF_SQUARE; |
||||||
|
public static final int FF_WAVEFORM_MAX = FF_CUSTOM; |
||||||
|
public static final int FF_GAIN = 0x60; |
||||||
|
public static final int FF_AUTOCENTER = 0x61; |
||||||
|
public static final int FF_MAX = 0x7f; |
||||||
|
public static final int FF_CNT = (FF_MAX+1); |
||||||
|
public static final int USAGE_MOUSE = 0x00; |
||||||
|
public static final int USAGE_JOYSTICK = 0x01; |
||||||
|
public static final int USAGE_GAMEPAD = 0x02; |
||||||
|
public static final int USAGE_KEYBOARD = 0x03; |
||||||
|
public static final int USAGE_MAX = 0x0f; |
||||||
|
} |
@ -0,0 +1,135 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* - Redistribution of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* - Redistribution in binary form must reproduce the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer in the documentation |
||||||
|
* and/or other materails provided with the distribution. |
||||||
|
* |
||||||
|
* Neither the name Sun Microsystems, Inc. or the names of the contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* This software is provided "AS IS," without a warranty of any kind. |
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
||||||
|
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR |
||||||
|
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND |
||||||
|
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS |
||||||
|
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS |
||||||
|
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
||||||
|
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
||||||
|
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
||||||
|
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, |
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
||||||
|
* |
||||||
|
* You acknowledge that this software is not designed or intended for us in |
||||||
|
* the design, construction, operation or maintenance of any nuclear facility |
||||||
|
* |
||||||
|
*/ |
||||||
|
package net.java.games.input; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
/** Button Usages |
||||||
|
* @author elias |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
final class ButtonUsage implements Usage { |
||||||
|
private final static Map<Integer, ButtonUsage> map = new HashMap<>(); |
||||||
|
|
||||||
|
private final int button_id; |
||||||
|
|
||||||
|
public final static ButtonUsage map(int button_id) { |
||||||
|
Integer button_id_obj = button_id; |
||||||
|
ButtonUsage existing = map.get(button_id_obj); |
||||||
|
if (existing != null) |
||||||
|
return existing; |
||||||
|
ButtonUsage new_button = new ButtonUsage(button_id); |
||||||
|
map.put(button_id_obj, new_button); |
||||||
|
return new_button; |
||||||
|
} |
||||||
|
|
||||||
|
private ButtonUsage(int button_id) { |
||||||
|
this.button_id = button_id; |
||||||
|
} |
||||||
|
|
||||||
|
public final Component.Identifier.Button getIdentifier() { |
||||||
|
switch (button_id) { |
||||||
|
case 1: |
||||||
|
return Component.Identifier.Button._0; |
||||||
|
case 2: |
||||||
|
return Component.Identifier.Button._1; |
||||||
|
case 3: |
||||||
|
return Component.Identifier.Button._2; |
||||||
|
case 4: |
||||||
|
return Component.Identifier.Button._3; |
||||||
|
case 5: |
||||||
|
return Component.Identifier.Button._4; |
||||||
|
case 6: |
||||||
|
return Component.Identifier.Button._5; |
||||||
|
case 7: |
||||||
|
return Component.Identifier.Button._6; |
||||||
|
case 8: |
||||||
|
return Component.Identifier.Button._7; |
||||||
|
case 9: |
||||||
|
return Component.Identifier.Button._8; |
||||||
|
case 10: |
||||||
|
return Component.Identifier.Button._9; |
||||||
|
case 11: |
||||||
|
return Component.Identifier.Button._10; |
||||||
|
case 12: |
||||||
|
return Component.Identifier.Button._11; |
||||||
|
case 13: |
||||||
|
return Component.Identifier.Button._12; |
||||||
|
case 14: |
||||||
|
return Component.Identifier.Button._13; |
||||||
|
case 15: |
||||||
|
return Component.Identifier.Button._14; |
||||||
|
case 16: |
||||||
|
return Component.Identifier.Button._15; |
||||||
|
case 17: |
||||||
|
return Component.Identifier.Button._16; |
||||||
|
case 18: |
||||||
|
return Component.Identifier.Button._17; |
||||||
|
case 19: |
||||||
|
return Component.Identifier.Button._18; |
||||||
|
case 20: |
||||||
|
return Component.Identifier.Button._19; |
||||||
|
case 21: |
||||||
|
return Component.Identifier.Button._20; |
||||||
|
case 22: |
||||||
|
return Component.Identifier.Button._21; |
||||||
|
case 23: |
||||||
|
return Component.Identifier.Button._22; |
||||||
|
case 24: |
||||||
|
return Component.Identifier.Button._23; |
||||||
|
case 25: |
||||||
|
return Component.Identifier.Button._24; |
||||||
|
case 26: |
||||||
|
return Component.Identifier.Button._25; |
||||||
|
case 27: |
||||||
|
return Component.Identifier.Button._26; |
||||||
|
case 28: |
||||||
|
return Component.Identifier.Button._27; |
||||||
|
case 29: |
||||||
|
return Component.Identifier.Button._28; |
||||||
|
case 30: |
||||||
|
return Component.Identifier.Button._29; |
||||||
|
case 31: |
||||||
|
return Component.Identifier.Button._30; |
||||||
|
case 32: |
||||||
|
return Component.Identifier.Button._31; |
||||||
|
default: |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public final String toString() { |
||||||
|
return "ButtonUsage (" + button_id + ")"; |
||||||
|
} |
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue