summaryrefslogtreecommitdiffstats
path: root/plugins/linux/src/native/eventInterface.cpp
diff options
context:
space:
mode:
authorendolf <[email protected]>2003-07-31 19:34:46 +0000
committerendolf <[email protected]>2003-07-31 19:34:46 +0000
commitb2f4c7ccd86474da65136f8fdf2cfd34d1e94841 (patch)
treeb0ef45439e7f1f5955039bef8654e12e2094ee91 /plugins/linux/src/native/eventInterface.cpp
parent878c5df2d77ce39aac091ede505a3dd94d897dd7 (diff)
Initial commit of Linux plugin
git-svn-id: file:///home/sven/projects/JOGL/git-svn/svn-server-sync/jinput/trunk@23 e343933a-64c8-49c5-92b1-88f2ce3e89e8
Diffstat (limited to 'plugins/linux/src/native/eventInterface.cpp')
-rw-r--r--plugins/linux/src/native/eventInterface.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/plugins/linux/src/native/eventInterface.cpp b/plugins/linux/src/native/eventInterface.cpp
new file mode 100644
index 0000000..303c667
--- /dev/null
+++ b/plugins/linux/src/native/eventInterface.cpp
@@ -0,0 +1,131 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * 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
+ */
+
+#include <sys/dir.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <linux/input.h>
+#include <string.h>
+#include <malloc.h>
+#include <unistd.h>
+#include "Device.h"
+#include "EventDevice.h"
+
+int evNumDevices;
+int eventInterfaceVersion;
+Device **evDeviceList;
+int evInited = 0;
+
+int evFileFilter(const struct direct *entry) {
+ if (strncmp(entry->d_name, "event", 5) == 0) {
+ return 1;
+ }
+ return 0;
+ }
+
+int evGetDeviceFiles(char ***filenames) {
+ struct direct **files;
+ int num_files, i;
+ char dirName[] = {"/dev/input"};
+
+ num_files = scandir(dirName, &files, &evFileFilter, alphasort);
+
+ *filenames = (char **)malloc(num_files * sizeof(char *));
+
+ for(i=0;i<num_files;i++) {
+ char *filename = files[i]->d_name;
+ char *fullFileName;
+
+ fullFileName = (char *)malloc((strlen(dirName) + 1 + strlen(filename) + 1));
+ sprintf(fullFileName, "%s/%s", dirName, filename);
+ (*filenames)[i] = fullFileName;
+ }
+
+ return num_files;
+}
+
+int evInit() {
+ int fd=-1;
+ int i;
+ char **deviceFileNames;
+ int numDeviceFiles;
+
+ numDeviceFiles = evGetDeviceFiles(&deviceFileNames);
+ if(numDeviceFiles<0) {
+ return -1;
+ }
+
+ if ((fd = open(deviceFileNames[0], O_RDONLY)) <0) {
+ return -1;
+ }
+
+ if (ioctl(fd, EVIOCGVERSION, &eventInterfaceVersion)) {
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+
+ Device *tempDeviceList[numDeviceFiles];
+
+ evNumDevices = 0;
+ for(i=0;i<numDeviceFiles;i++) {
+ tempDeviceList[i] = new EventDevice(deviceFileNames[i]);
+ if(tempDeviceList[i]->getBusType()!=-1) {
+ evNumDevices++;
+ }
+ }
+
+ // Now we know for certain which devices are open, we can take notes
+ evDeviceList = (Device **)malloc(evNumDevices * sizeof(Device *));
+ for(i=0;i<evNumDevices;i++) {
+ evDeviceList[i] = tempDeviceList[i];
+ }
+
+ evInited=1;
+
+ return 0;
+}
+
+int evGetEventInterfaceVersionNumber() {
+ return eventInterfaceVersion;
+}
+
+int evGetNumberDevices() {
+ if(evInited) {
+ return evNumDevices;
+ }
+ return -1;
+}
+
+void evGetDevices(Device **theirDeviceList) {
+ int i;
+ for(i=0;i<evNumDevices;i++) {
+ theirDeviceList[i] = evDeviceList[i];
+ }
+}