forked from pool/spacenavd
Accepting request 790354 from home:hgraeber:branches:hardware
- Remove unnecessary _service file - Fix pidfile (/var/run -> /run) - Bugfix release 0.7.1 * fixed build on gcc 10 * fixed configure script which failed to detect the version number correctly in release 0.7, incorrectly trying to rely on git to do so. - remove support for pre-systemd openSUSE releases - remove patch spacenavd-add-blacklist-and-device-ids.patch - remove patch spacenavd-add-missing-usbid.patc - Release 0.7 * implemented the ability to log to syslog. * ignore joystick devices when searching for USB devices (linux). * added code to attempt to wrestle devices from the X server. * added the new 3Dconnexion vendor id to the device matching logic. * made builds reproducible by linking in alphabetical order. * added option led = auto, to turn the LED on only when a client connects (linux). * implemented a blacklist of USB device ids that should be ignored. OBS-URL: https://build.opensuse.org/request/show/790354 OBS-URL: https://build.opensuse.org/package/show/hardware/spacenavd?expand=0&rev=16
This commit is contained in:
parent
f0d18342af
commit
900e50be56
@ -1,900 +0,0 @@
|
||||
diff --git a/.gitignore b/.gitignore
|
||||
new file mode 100644
|
||||
index 0000000..9cb4787
|
||||
--- /dev/null
|
||||
+++ b/.gitignore
|
||||
@@ -0,0 +1,6 @@
|
||||
+*.o
|
||||
+*.d
|
||||
+*.swp
|
||||
+Makefile
|
||||
+spacenavd
|
||||
+config.h
|
||||
diff --git a/AUTHORS b/AUTHORS
|
||||
index b0e0027..f7911f6 100644
|
||||
--- a/AUTHORS
|
||||
+++ b/AUTHORS
|
||||
@@ -4,5 +4,5 @@ Main author and maintainer:
|
||||
Serial device support (libsball):
|
||||
John E. Stone <j.stone@acm.org>
|
||||
|
||||
-Minor fixes:
|
||||
+Contributors:
|
||||
Doug LaRue, Krister Svanlun, Hans Meine, Jaroslaw Bulat, Pavel Frolov
|
||||
diff --git a/Makefile.in b/Makefile.in
|
||||
index 686bfa5..9eba102 100644
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -1,4 +1,4 @@
|
||||
-src = $(wildcard src/*.c) $(wildcard src/serial/*.c) $(wildcard src/magellan/*.c)
|
||||
+src = $(sort $(wildcard src/*.c) $(wildcard src/serial/*.c) $(wildcard src/magellan/*.c))
|
||||
hdr = $(wildcard src/*.h) $(wildcard src/serial/*.h) $(wildcard src/magellan/*.h)
|
||||
obj = $(src:.c=.o)
|
||||
dep = $(obj:.o=.d)
|
||||
diff --git a/README b/README
|
||||
deleted file mode 100644
|
||||
index 87ca923..0000000
|
||||
--- a/README
|
||||
+++ /dev/null
|
||||
@@ -1,60 +0,0 @@
|
||||
-spacenavd - 0.6
|
||||
----------------
|
||||
-
|
||||
-1. About
|
||||
- Spacenavd, is a free software replacement user-space driver (daemon), for
|
||||
- 3Dconnexion's space-something 6dof input devices. It's compatible with the
|
||||
- original 3dxsrv proprietary daemon provided by 3Dconnexion, and works
|
||||
- perfectly with any program that was written for the 3Dconnexion driver.
|
||||
-
|
||||
- For more info on the spacenav project, visit: http://spacenav.sourceforge.net
|
||||
-
|
||||
-
|
||||
-2. Dependencies
|
||||
- In order to compile the spacenavd daemon, you'll need the following:
|
||||
- * GNU C Compiler
|
||||
- * GNU make
|
||||
- * Xlib headers (optional)
|
||||
-
|
||||
- You can compile the daemon without Xlib, but it won't be compatible with
|
||||
- applications that where written for the original proprietary 3Dconnexion
|
||||
- driver (e.g. blender, maya, etc). The 3dxsrv compatibility interface needs to
|
||||
- go through the X window system.
|
||||
-
|
||||
-3. Installation
|
||||
- If you have the dependencies installed, just run ``./configure'' and then
|
||||
- ``make'' to compile the daemon, and ``make install'', to install it. The
|
||||
- default installation prefix is ``/usr/local''. If you wish to install
|
||||
- somewhere else, you may pass --prefix=/whatever to the configure script.
|
||||
-
|
||||
-4. Running spacenavd
|
||||
- If your system uses SysV init, then you may run the supplied ``setup_init''
|
||||
- script, and everything should be set up to have spacenavd start automatically
|
||||
- during system startup. However, for now, you won't have to reboot, just type
|
||||
- ``/etc/init.d/spacenavd start'' as root, to start the daemon immediately.
|
||||
-
|
||||
- If your system uses BSD init (you can tell if you *don't* have a series of
|
||||
- directories called rc0.d, rc1.d, and so on, in /etc), then you'll have to
|
||||
- follow your init documentation and set this up yourself. You may be able to
|
||||
- use the provided init_script file as a starting point.
|
||||
-
|
||||
-5. Configuration
|
||||
- The spacenavd daemon reads a number of options from the /etc/spnavrc file. If
|
||||
- that file doesn't exist, then it uses default values for everything. You may
|
||||
- use the graphical spnavcfg program to interactively set any of these options.
|
||||
- The daemon should respond immediately to your changes, and also the
|
||||
- configuration file should be updated automatically.
|
||||
- An example configuration file is included in the doc subdirectory.
|
||||
-
|
||||
-6. Troubleshooting
|
||||
- If you're having trouble running spacenavd, read the up to date FAQ on the
|
||||
- spacenav website: http://spacenav.sourceforge.net/faq.html
|
||||
-
|
||||
- If you're still having trouble, send a description of your problem to the
|
||||
- spacenav-users mailing list: spacenav-users@lists.sourceforge.net
|
||||
- along with a copy of your /var/log/spnavd.log and any other relevant
|
||||
- information.
|
||||
-
|
||||
-7. License
|
||||
- This program is released under the terms of the GNU GPLv3, see COPYING for
|
||||
- details.
|
||||
diff --git a/README.md b/README.md
|
||||
new file mode 100644
|
||||
index 0000000..88c6be0
|
||||
--- /dev/null
|
||||
+++ b/README.md
|
||||
@@ -0,0 +1,82 @@
|
||||
+spacenavd
|
||||
+=========
|
||||
+
|
||||
+About
|
||||
+-----
|
||||
+Spacenavd is a free software user-space driver (daemon), for 6-dof input
|
||||
+devices, like 3Dconnexion's space-mice. It's compatible with the original 3dxsrv
|
||||
+proprietary daemon provided by 3Dconnexion, and works as a drop-in replacement
|
||||
+with any program that was written for the 3Dconnexion driver, but also provides
|
||||
+an improved communication mechanism for programs designed specifically to work
|
||||
+with spacenavd.
|
||||
+
|
||||
+For more info on the spacenav project, visit: http://spacenav.sourceforge.net
|
||||
+
|
||||
+License
|
||||
+-------
|
||||
+Copyright (C) 2007-2018 John Tsiombikas <nuclear@member.fsf.org>
|
||||
+
|
||||
+This program is free software. Feel free to copy, modify and/or redistribute it
|
||||
+under the terms of the GNU General Public Licens version 3, or at your option,
|
||||
+any later version published by the Free Software Foundation. See COPYING for
|
||||
+details.
|
||||
+
|
||||
+Dependencies
|
||||
+------------
|
||||
+In order to compile the spacenavd daemon, you'll need the following:
|
||||
+ - GNU C Compiler
|
||||
+ - GNU make
|
||||
+ - Xlib headers (optional)
|
||||
+
|
||||
+You can compile the daemon without Xlib, but it won't be compatible with
|
||||
+applications that where written for the original proprietary 3Dconnexion driver
|
||||
+(e.g. maya, houdini, etc). The 3dxsrv compatibility interface needs to
|
||||
+communicate with clients through the X window system. Programs designed to work
|
||||
+with the alternative spacenavd-specific interface however (e.g. blender) will
|
||||
+work fine even when spacenavd is built without X11 support.
|
||||
+
|
||||
+Installation
|
||||
+------------
|
||||
+If you have the dependencies installed, just run `./configure` and then `make`
|
||||
+to compile the daemon, and then `make install`, to install it.The default
|
||||
+installation prefix is `/usr/local`. If you wish to install somewhere else, you
|
||||
+may pass `--prefix=/whatever` to the configure script.
|
||||
+
|
||||
+Running spacenavd
|
||||
+-----------------
|
||||
+Spacenavd is designed to run during startup as a system daemon.
|
||||
+
|
||||
+If your system uses SysV init, then you may run `setup_init` as root, to install
|
||||
+the spacenavd init script, and have spacenavd start automatically during
|
||||
+startup. To start the daemon right after installing it, without having to reboot
|
||||
+your system, just type `/etc/init.d/spacenavd start` as root.
|
||||
+
|
||||
+If your system uses BSD init or some other init system, then you'll have to
|
||||
+follow your init documentation to set this up yourself. You may be able to
|
||||
+use the provided `init_script` file as a starting point.
|
||||
+
|
||||
+For systems running systemd, there is a spacenavd.service file under
|
||||
+`contrib/systemd`. Follow your system documentation for how to use it.
|
||||
+
|
||||
+Configuration
|
||||
+-------------
|
||||
+The spacenavd daemon reads a number of options from `/etc/spnavrc`. If
|
||||
+that file doesn't exist, then it will use default values for everything. An
|
||||
+example configuration file is included in the doc subdirectory, which you may
|
||||
+copy to `/etc` and tweak.
|
||||
+
|
||||
+You may use the graphical spnavcfg program to interactively set any of these
|
||||
+options, which will create the spnavrc file for you, and automatically notify
|
||||
+the daemon to re-read it.
|
||||
+
|
||||
+Troubleshooting
|
||||
+---------------
|
||||
+If you're having trouble running spacenavd, read the up to date FAQ on the
|
||||
+spacenav website: http://spacenav.sourceforge.net/faq.html
|
||||
+
|
||||
+If you're still having trouble, send a description of your problem to the
|
||||
+spacenav-users mailing list: spacenav-users@lists.sourceforge.net along with a
|
||||
+copy of your /var/log/spnavd.log and any other relevant information.
|
||||
+
|
||||
+If you have encountered a bug, please file a bug report in our bug tracking
|
||||
+system: https://sourceforge.net/p/spacenav/bugs/
|
||||
diff --git a/configure b/configure
|
||||
index 2795a3c..a20f704 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -28,7 +28,7 @@ test_kver() {
|
||||
check_header() {
|
||||
echo "#include <$1>" >.chkhdr.c
|
||||
if cpp .chkhdr.c >/dev/null 2>&1; then
|
||||
- echo "#define HAVE_`echo $1 | tr '[:lower:]' '[:upper:]' | sed 's/\./_/g'`"
|
||||
+ echo "#define HAVE_`basename $1 | tr '[:lower:]' '[:upper:]' | sed 's/\./_/g'`"
|
||||
fi
|
||||
rm -f .chkhdr.c
|
||||
}
|
||||
@@ -39,10 +39,11 @@ OPT=yes
|
||||
DBG=yes
|
||||
X11=yes
|
||||
HOTPLUG=yes
|
||||
-VER=`head -1 README | sed 's/^.*- //'`
|
||||
+XINPUT=yes
|
||||
+VER=`git describe --tags 2>/dev/null`
|
||||
|
||||
-if echo $VER | grep '$Rev' >/dev/null; then
|
||||
- VER=svn-r`echo $VER | awk '{print $2}' | sed 's/$//g'`
|
||||
+if [ -z "$VER" ]; then
|
||||
+ VER=`git rev-parse --short HEAD`
|
||||
fi
|
||||
|
||||
echo "configuring spacenavd - $VER"
|
||||
@@ -140,6 +141,9 @@ fi
|
||||
|
||||
if [ "$X11" = 'yes' ]; then
|
||||
echo 'xlib = -L/usr/X11/lib -lX11' >>Makefile
|
||||
+ if [ -n "`check_header X11/extensions/XInput2.h 2>&1`" ]; then
|
||||
+ echo 'xlib += -lXi' >>Makefile
|
||||
+ fi
|
||||
fi
|
||||
|
||||
if [ -n "$add_cflags" ]; then
|
||||
@@ -170,6 +174,7 @@ echo >>src/config.h
|
||||
|
||||
# check for alloca.h
|
||||
check_header alloca.h >>src/config.h
|
||||
+check_header X11/extensions/XInput2.h >>src/config.h
|
||||
|
||||
echo >>src/config.h
|
||||
echo '#endif /* CONFIG_H_ */' >>src/config.h
|
||||
diff --git a/doc/example-spnavrc b/doc/example-spnavrc
|
||||
index 964b343..0f33b2c 100644
|
||||
--- a/doc/example-spnavrc
|
||||
+++ b/doc/example-spnavrc
|
||||
@@ -9,34 +9,116 @@
|
||||
|
||||
|
||||
# Sensitivity is multiplied with every motion (1.0 normal).
|
||||
+#
|
||||
#sensitivity = 1.0
|
||||
|
||||
-
|
||||
# Separate sensitivity for rotation and translation.
|
||||
+#
|
||||
#sensitivity-translation = 1.0
|
||||
#sensitivity-rotation = 1.0
|
||||
|
||||
+# Separate sensitivity for each roation and translation axis.
|
||||
+#
|
||||
+#sensitivity-translation-x = 1.0
|
||||
+#sensitivity-translation-y = 1.0
|
||||
+#sensitivity-translation-z = 1.0
|
||||
+#sensitivity-rotation-x = 1.0
|
||||
+#sensitivity-rotation-y = 1.0
|
||||
+#sensitivity-rotation-z = 1.0
|
||||
+
|
||||
|
||||
# Dead zone; any motion less than this number is discarded as noise.
|
||||
+#
|
||||
#dead-zone = 2
|
||||
|
||||
+# Separate dead-zone for each rotation and translation axis.
|
||||
+#
|
||||
+#dead-zone-translation-x = 2
|
||||
+#dead-zone-translation-y = 2
|
||||
+#dead-zone-translation-z = 2
|
||||
+#dead-zone-rotation-x = 2
|
||||
+#dead-zone-rotation-y = 2
|
||||
+#dead-zone-rotation-z = 2
|
||||
+
|
||||
|
||||
# Selectively invert translation and rotation axes. Valid values are
|
||||
# combinations of the letters x, y, and z.
|
||||
+#
|
||||
#invert-rot = yz
|
||||
#invert-trans = yz
|
||||
|
||||
|
||||
# Swap Y and Z axes
|
||||
+#
|
||||
#swap-yz = false
|
||||
|
||||
|
||||
+# Axis remapping (zero-based)
|
||||
+#
|
||||
+#axismap0 = 0
|
||||
+#axismap1 = 1
|
||||
+#...
|
||||
+#axismapN = N (N < 64)
|
||||
+
|
||||
+
|
||||
+# Button remapping (zero-based)
|
||||
+#
|
||||
+#bnmap0 = 0
|
||||
+#bnmap1 = 1
|
||||
+#...
|
||||
+#bnmapN = N (N < 64)
|
||||
+
|
||||
+
|
||||
+# Map buttons to keyboard keys (experimental)
|
||||
+# By default no such mappings are active. Use the following syntax:
|
||||
+# kbmapN = <keysym>
|
||||
+# where N is the button number (zero-based), and <keysym> is a keysym name from
|
||||
+# /usr/include/X11/keysymdef.h, without the leading XK_
|
||||
+# Example:
|
||||
+# kbmap0 = Escape
|
||||
+
|
||||
+
|
||||
# Serial device
|
||||
# Set this only if you have a serial device, and make sure you specify the
|
||||
# correct device file. If you do set this option, any USB devices will be
|
||||
# ignored!
|
||||
+#
|
||||
#serial = /dev/ttyS0
|
||||
|
||||
|
||||
# Enable/disable LED light (for devices that have one).
|
||||
+#
|
||||
#led = on
|
||||
+
|
||||
+
|
||||
+# Device grab (USB)
|
||||
+#
|
||||
+# When set to true (default): grab the USB device to prevent other programs
|
||||
+# (such as the X server) from also using it.
|
||||
+#
|
||||
+# Grabbing the device ensures that other programs won't be able to use it without
|
||||
+# talking to spacenavd. For instance some versions of Xorg will use the device to move
|
||||
+# the mouse pointer if we don't grab it.
|
||||
+# Set this to false if you want to use programs that try to talk to the device directly
|
||||
+# such as google earth, then follow FAQ 11 http://spacenav.sourceforge.net/faq.html#faq11
|
||||
+# to force the X server to ignore the device
|
||||
+#
|
||||
+#grab = true
|
||||
+
|
||||
+
|
||||
+# List of additional USB devices to use (multiple devices can be listed)
|
||||
+#
|
||||
+# example:
|
||||
+# device-id = 046d:c625
|
||||
+
|
||||
+
|
||||
+# Repeat interval (milliseconds)
|
||||
+# Non-deadzone events are repeated every so many milliseconds (-1 to disable).
|
||||
+#
|
||||
+# You probably don't need this setting. Set it to something like 250 if you
|
||||
+# find that your apps stop moving the view while you hold the puck/ball at a
|
||||
+# fixed off-center position (like bottomed out on the vertical axis).
|
||||
+# Might cause inadvertent continuous motion if the deadzone is too small for
|
||||
+# the re-centering power of the device.
|
||||
+#
|
||||
+#repeat-interval = -1
|
||||
diff --git a/src/cfgfile.c b/src/cfgfile.c
|
||||
index 75cb45a..9c42ac6 100644
|
||||
--- a/src/cfgfile.c
|
||||
+++ b/src/cfgfile.c
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
spacenavd - a free software replacement driver for 6dof space-mice.
|
||||
-Copyright (C) 2007-2013 John Tsiombikas <nuclear@member.fsf.org>
|
||||
+Copyright (C) 2007-2018 John Tsiombikas <nuclear@member.fsf.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -42,7 +42,7 @@ void default_cfg(struct cfg *cfg)
|
||||
cfg->dead_threshold[i] = 2;
|
||||
}
|
||||
|
||||
- cfg->led = 1;
|
||||
+ cfg->led = LED_ON;
|
||||
cfg->grab_device = 1;
|
||||
|
||||
for(i=0; i<6; i++) {
|
||||
@@ -268,10 +268,12 @@ int read_cfg(const char *fname, struct cfg *cfg)
|
||||
if(isint) {
|
||||
cfg->led = ival;
|
||||
} else {
|
||||
- if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
|
||||
- cfg->led = 1;
|
||||
+ if(strcmp(val_str, "auto") == 0) {
|
||||
+ cfg->led = LED_AUTO;
|
||||
+ } else if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
|
||||
+ cfg->led = LED_ON;
|
||||
} else if(strcmp(val_str, "false") == 0 || strcmp(val_str, "off") == 0 || strcmp(val_str, "no") == 0) {
|
||||
- cfg->led = 0;
|
||||
+ cfg->led = LED_OFF;
|
||||
} else {
|
||||
fprintf(stderr, "invalid configuration value for %s, expected a boolean value.\n", key_str);
|
||||
continue;
|
||||
@@ -293,7 +295,7 @@ int read_cfg(const char *fname, struct cfg *cfg)
|
||||
}
|
||||
|
||||
} else if(strcmp(key_str, "serial") == 0) {
|
||||
- strncpy(cfg->serial_dev, val_str, PATH_MAX);
|
||||
+ strncpy(cfg->serial_dev, val_str, PATH_MAX - 1);
|
||||
|
||||
} else if(strcmp(key_str, "device-id") == 0) {
|
||||
unsigned int vendor, prod;
|
||||
@@ -333,7 +335,7 @@ int write_cfg(const char *fname, struct cfg *cfg)
|
||||
return -1;
|
||||
}
|
||||
|
||||
- /* aquire exclusive write lock */
|
||||
+ /* acquire exclusive write lock */
|
||||
flk.l_type = F_WRLCK;
|
||||
flk.l_start = flk.l_len = 0;
|
||||
flk.l_whence = SEEK_SET;
|
||||
@@ -427,10 +429,8 @@ int write_cfg(const char *fname, struct cfg *cfg)
|
||||
fputc('\n', fp);
|
||||
}
|
||||
|
||||
- if(!cfg->led) {
|
||||
- fprintf(fp, "# disable led\n");
|
||||
- fprintf(fp, "led = 0\n\n");
|
||||
- }
|
||||
+ fprintf(fp, "# led status: on, off, or auto (turn on when a client is connected)\n");
|
||||
+ fprintf(fp, "led = %s\n\n", (cfg->led ? (cfg->led == LED_AUTO ? "auto" : "on") : "off"));
|
||||
|
||||
if(!cfg->grab_device) {
|
||||
fprintf(fp, "# Don't grab USB device\n");
|
||||
@@ -452,8 +452,7 @@ int write_cfg(const char *fname, struct cfg *cfg)
|
||||
fprintf(fp, "#serial = /dev/ttyS0\n");
|
||||
}
|
||||
|
||||
- fprintf(fp, "# custom list USB device ids to open if present\n");
|
||||
- fprintf(fp, "# (multiple entries can be listed)\n");
|
||||
+ fprintf(fp, "List of additional USB devices to use (multiple devices can be listed)");
|
||||
for(i=0; i<MAX_CUSTOM; i++) {
|
||||
if(cfg->devid[i][0] != -1 && cfg->devid[i][1] != -1) {
|
||||
fprintf(fp, "device-id = %x:%x\n", cfg->devid[i][0], cfg->devid[i][1]);
|
||||
diff --git a/src/cfgfile.h b/src/cfgfile.h
|
||||
index 0d85303..8d56df3 100644
|
||||
--- a/src/cfgfile.h
|
||||
+++ b/src/cfgfile.h
|
||||
@@ -25,6 +25,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define MAX_BUTTONS 64
|
||||
#define MAX_CUSTOM 64
|
||||
|
||||
+enum {
|
||||
+ LED_OFF = 0,
|
||||
+ LED_ON = 1,
|
||||
+ LED_AUTO = 2
|
||||
+};
|
||||
+
|
||||
struct cfg {
|
||||
float sensitivity, sens_trans[3], sens_rot[3];
|
||||
int dead_threshold[MAX_AXES];
|
||||
diff --git a/src/client.c b/src/client.c
|
||||
index 27d1931..5d13386 100644
|
||||
--- a/src/client.c
|
||||
+++ b/src/client.c
|
||||
@@ -20,6 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "client.h"
|
||||
+#include "dev.h"
|
||||
+#include "spnavd.h"
|
||||
|
||||
#ifdef USE_X11
|
||||
#include <X11/Xlib.h>
|
||||
@@ -77,9 +79,9 @@ struct client *add_client(int type, void *cdata)
|
||||
client->sens = 1.0f;
|
||||
client->dev_idx = 0; /* default/first device */
|
||||
|
||||
- if(client_list == NULL) {
|
||||
- client->next = NULL;
|
||||
- return (client_list = client);
|
||||
+ if(!client_list && cfg.led == LED_AUTO) {
|
||||
+ /* on first client, turn the led on */
|
||||
+ set_devices_led(1);
|
||||
}
|
||||
client->next = client_list;
|
||||
client_list = client;
|
||||
@@ -90,14 +92,18 @@ struct client *add_client(int type, void *cdata)
|
||||
void remove_client(struct client *client)
|
||||
{
|
||||
struct client *iter = client_list;
|
||||
+ if(!iter) return;
|
||||
|
||||
- if(iter == NULL)
|
||||
- return;
|
||||
if(iter == client) {
|
||||
client_list = iter->next;
|
||||
free(iter);
|
||||
- if((iter = client_list) == NULL)
|
||||
+ iter = client_list;
|
||||
+ if(!iter) {
|
||||
+ if(cfg.led == LED_AUTO) {
|
||||
+ set_devices_led(0); /* no more clients, turn off led */
|
||||
+ }
|
||||
return;
|
||||
+ }
|
||||
}
|
||||
|
||||
while(iter->next) {
|
||||
@@ -150,12 +156,14 @@ int get_client_device_index(struct client *client)
|
||||
|
||||
struct client *first_client(void)
|
||||
{
|
||||
- return (client_iter = client_list);
|
||||
+ client_iter = client_list;
|
||||
+ return client_iter;
|
||||
}
|
||||
|
||||
struct client *next_client(void)
|
||||
{
|
||||
- if(client_iter)
|
||||
+ if(client_iter) {
|
||||
client_iter = client_iter->next;
|
||||
+ }
|
||||
return client_iter;
|
||||
}
|
||||
diff --git a/src/dev.c b/src/dev.c
|
||||
index 7fbfc02..b4e5b4b 100644
|
||||
--- a/src/dev.c
|
||||
+++ b/src/dev.c
|
||||
@@ -25,6 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "dev_serial.h"
|
||||
#include "event.h" /* remove pending events upon device removal */
|
||||
#include "spnavd.h"
|
||||
+#include "proto_x11.h"
|
||||
|
||||
static struct device *add_device(void);
|
||||
static struct device *dev_path_in_use(char const * dev_path);
|
||||
@@ -72,7 +73,7 @@ int init_devices(void)
|
||||
if(open_dev_usb(dev) == -1) {
|
||||
remove_device(dev);
|
||||
} else {
|
||||
- printf("using device: %s\n", dev->path);
|
||||
+ printf("using device: %s (%s)\n", dev->name, dev->path);
|
||||
device_added++;
|
||||
break;
|
||||
}
|
||||
@@ -82,10 +83,12 @@ int init_devices(void)
|
||||
|
||||
free_usb_devices_list(usblist);
|
||||
|
||||
- if(!device_added) {
|
||||
+ if(!usblist) {
|
||||
fprintf(stderr, "failed to find any supported devices\n");
|
||||
return -1;
|
||||
}
|
||||
+
|
||||
+ drop_xinput();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -180,11 +183,22 @@ void set_device_led(struct device *dev, int state)
|
||||
}
|
||||
}
|
||||
|
||||
+void set_devices_led(int state)
|
||||
+{
|
||||
+ struct device *dev = get_devices();
|
||||
+ while(dev) {
|
||||
+ set_device_led(dev, state);
|
||||
+ dev = dev->next;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
struct device *get_devices(void)
|
||||
{
|
||||
return dev_list;
|
||||
}
|
||||
|
||||
+#define VENDOR_3DCONNEXION 0x256f
|
||||
+
|
||||
static int devid_list[][2] = {
|
||||
/* 3Dconnexion devices */
|
||||
{0x46d, 0xc603}, /* spacemouse plus XT */
|
||||
@@ -212,8 +226,13 @@ static int match_usbdev(const struct usb_device_info *devinfo)
|
||||
return 1;
|
||||
}
|
||||
|
||||
- /* match any device in the devid_list */
|
||||
if(devinfo->vendorid != -1 && devinfo->productid != -1) {
|
||||
+ /* match any device with the new 3Dconnexion device id */
|
||||
+ if(devinfo->vendorid == VENDOR_3DCONNEXION) {
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ /* match any device in the devid_list */
|
||||
for(i=0; devid_list[i][0] > 0; i++) {
|
||||
if(devinfo->vendorid == devid_list[i][0] && devinfo->productid == devid_list[i][1]) {
|
||||
return 1;
|
||||
diff --git a/src/dev.h b/src/dev.h
|
||||
index f7ef691..37a7001 100644
|
||||
--- a/src/dev.h
|
||||
+++ b/src/dev.h
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
spacenavd - a free software replacement driver for 6dof space-mice.
|
||||
-Copyright (C) 2007-2013 John Tsiombikas <nuclear@member.fsf.org>
|
||||
+Copyright (C) 2007-2018 John Tsiombikas <nuclear@member.fsf.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -31,7 +31,7 @@ struct device {
|
||||
char name[MAX_DEV_NAME];
|
||||
char path[PATH_MAX];
|
||||
|
||||
- int num_axes;
|
||||
+ int num_axes, num_buttons;
|
||||
int *minval, *maxval; /* input value range (default: -500, 500) */
|
||||
int *fuzz; /* noise threshold */
|
||||
|
||||
@@ -39,7 +39,7 @@ struct device {
|
||||
int (*read)(struct device*, struct dev_input*);
|
||||
void (*set_led)(struct device*, int);
|
||||
|
||||
- struct device *next;
|
||||
+ struct device *next;
|
||||
};
|
||||
|
||||
int init_devices(void);
|
||||
@@ -51,6 +51,7 @@ int get_device_fd(struct device *dev);
|
||||
int get_device_index(struct device *dev);
|
||||
int read_device(struct device *dev, struct dev_input *inp);
|
||||
void set_device_led(struct device *dev, int state);
|
||||
+void set_devices_led(int state);
|
||||
|
||||
struct device *get_devices(void);
|
||||
|
||||
diff --git a/src/dev_usb_darwin.c b/src/dev_usb_darwin.c
|
||||
index 0849f80..f3cb9a4 100644
|
||||
--- a/src/dev_usb_darwin.c
|
||||
+++ b/src/dev_usb_darwin.c
|
||||
@@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <stdio.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
+#include "spnavd.h"
|
||||
#include "dev.h"
|
||||
#include "dev_usb.h"
|
||||
|
||||
diff --git a/src/dev_usb_linux.c b/src/dev_usb_linux.c
|
||||
index 30db579..e206de4 100644
|
||||
--- a/src/dev_usb_linux.c
|
||||
+++ b/src/dev_usb_linux.c
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
spacenavd - a free software replacement driver for 6dof space-mice.
|
||||
-Copyright (C) 2007-2013 John Tsiombikas <nuclear@member.fsf.org>
|
||||
+Copyright (C) 2007-2018 John Tsiombikas <nuclear@member.fsf.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -34,6 +34,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "spnavd.h"
|
||||
#include "event.h"
|
||||
#include "hotplug.h"
|
||||
+#include "client.h"
|
||||
|
||||
#define DEF_MINVAL (-500)
|
||||
#define DEF_MAXVAL 500
|
||||
@@ -64,9 +65,9 @@ static void set_led_evdev(struct device *dev, int state);
|
||||
|
||||
int open_dev_usb(struct device *dev)
|
||||
{
|
||||
- int i;
|
||||
+ int i, axes_rel = 0, axes_abs = 0;
|
||||
struct input_absinfo absinfo;
|
||||
- unsigned char evtype_mask[(EV_MAX + 7) / 8];
|
||||
+ unsigned char evtype_mask[((EV_MAX | KEY_MAX) + 7) / 8];
|
||||
|
||||
if((dev->fd = open(dev->path, O_RDWR)) == -1) {
|
||||
if((dev->fd = open(dev->path, O_RDONLY)) == -1) {
|
||||
@@ -83,22 +84,61 @@ int open_dev_usb(struct device *dev)
|
||||
printf("device name: %s\n", dev->name);
|
||||
|
||||
/* get number of axes */
|
||||
- dev->num_axes = 6; /* default to regular 6dof controller axis count */
|
||||
- if(ioctl(dev->fd, EVIOCGBIT(EV_ABS, sizeof evtype_mask), evtype_mask) == 0) {
|
||||
- dev->num_axes = 0;
|
||||
+ if(ioctl(dev->fd, EVIOCGBIT(EV_ABS, sizeof evtype_mask), evtype_mask) != -1) {
|
||||
for(i=0; i<ABS_CNT; i++) {
|
||||
int idx = i / 8;
|
||||
int bit = i % 8;
|
||||
|
||||
if(evtype_mask[idx] & (1 << bit)) {
|
||||
- dev->num_axes++;
|
||||
+ axes_abs++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
+ } else {
|
||||
+ perror("EVIOCGBIT(EV_ABS) ioctl failed");
|
||||
}
|
||||
- if(verbose) {
|
||||
- printf(" Number of axes: %d\n", dev->num_axes);
|
||||
+ if(ioctl(dev->fd, EVIOCGBIT(EV_REL, sizeof evtype_mask), evtype_mask) != -1) {
|
||||
+ for(i=0; i<ABS_CNT; i++) {
|
||||
+ int idx = i / 8;
|
||||
+ int bit = i % 8;
|
||||
+
|
||||
+ if(evtype_mask[idx] & (1 << bit)) {
|
||||
+ axes_rel++;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ dev->num_axes = axes_rel + axes_abs;
|
||||
+ if(!dev->num_axes) {
|
||||
+ fprintf(stderr, "failed to retrieve number of axes. assuming 6\n");
|
||||
+ dev->num_axes = 6;
|
||||
+ } else {
|
||||
+ if(verbose) {
|
||||
+ printf(" Number of axes: %d (%da %dr)\n", dev->num_axes, axes_abs, axes_rel);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* get number of buttons */
|
||||
+ dev->num_buttons = 0;
|
||||
+ if(ioctl(dev->fd, EVIOCGBIT(EV_KEY, sizeof evtype_mask), evtype_mask) != -1) {
|
||||
+ for(i=0; i<KEY_CNT; i++) {
|
||||
+ int idx = i / 8;
|
||||
+ int bit = i % 8;
|
||||
+
|
||||
+ if(evtype_mask[idx] & (1 << bit)) {
|
||||
+ dev->num_buttons++;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ perror("EVIOCGBIT(EV_KEY) ioctl failed");
|
||||
+ }
|
||||
+ if(!dev->num_buttons) {
|
||||
+ fprintf(stderr, "failed to retrieve number of buttons, will default to 2\n");
|
||||
+ dev->num_buttons = 2;
|
||||
+ } else {
|
||||
+ if(verbose) {
|
||||
+ printf(" Number of buttons: %d\n", dev->num_buttons);
|
||||
+ }
|
||||
}
|
||||
|
||||
dev->minval = malloc(dev->num_axes * sizeof *dev->minval);
|
||||
@@ -127,12 +167,6 @@ int open_dev_usb(struct device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
- /*if(ioctl(dev->fd, EVIOCGBIT(0, sizeof(evtype_mask)), evtype_mask) == -1) {
|
||||
- perror("EVIOCGBIT ioctl failed\n");
|
||||
- close(dev->fd);
|
||||
- return -1;
|
||||
- }*/
|
||||
-
|
||||
if(cfg.grab_device) {
|
||||
int grab = 1;
|
||||
/* try to grab the device */
|
||||
@@ -144,7 +178,7 @@ int open_dev_usb(struct device *dev)
|
||||
/* set non-blocking */
|
||||
fcntl(dev->fd, F_SETFL, fcntl(dev->fd, F_GETFL) | O_NONBLOCK);
|
||||
|
||||
- if(cfg.led) {
|
||||
+ if(cfg.led == 1 || (cfg.led == 2 && first_client())) {
|
||||
set_led_evdev(dev, 1);
|
||||
}
|
||||
|
||||
@@ -229,6 +263,9 @@ static int read_evdev(struct device *dev, struct dev_input *inp)
|
||||
break;
|
||||
|
||||
default:
|
||||
+ if(verbose) {
|
||||
+ printf("unhandled event: %d\n", iev.type);
|
||||
+ }
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -290,7 +327,7 @@ struct usb_device_info *find_usb_devices(int (*match)(const struct usb_device_in
|
||||
if(next_section == NULL) {
|
||||
/* move last (partial) section to start of buf */
|
||||
/* sizeof(buf) - 1 because the last one is '\0' */
|
||||
- buf_used = (buf + sizeof(buf) - 1) - section_start;
|
||||
+ buf_used = strlen(section_start);
|
||||
memmove(buf, section_start, buf_used);
|
||||
buf[buf_used] = '\0';
|
||||
/* point to end of last section and calc remaining space in buf */
|
||||
@@ -342,11 +379,16 @@ struct usb_device_info *find_usb_devices(int (*match)(const struct usb_device_in
|
||||
case 'H':
|
||||
keyptr = strstr(cur_line, "Handlers=");
|
||||
if(keyptr) {
|
||||
- char *devfile, *valptr = keyptr + strlen("Handlers=");
|
||||
+ char *devfile = 0, *valptr = keyptr + strlen("Handlers=");
|
||||
static const char *prefix = "/dev/input/";
|
||||
|
||||
int idx = 0;
|
||||
- while((devfile = strtok(idx ? 0 : valptr, " \t\v\n\r"))) {
|
||||
+ while((devfile = strtok(devfile ? 0 : valptr, " \t\v\n\r"))) {
|
||||
+ if(strstr(devfile, "event") != devfile) {
|
||||
+ /* ignore everything which isn't an event interface device */
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
if(!(devinfo.devfiles[idx] = malloc(strlen(devfile) + strlen(prefix) + 1))) {
|
||||
perror("failed to allocate device filename buffer");
|
||||
continue;
|
||||
diff --git a/src/event.c b/src/event.c
|
||||
index 6ed9875..5812779 100644
|
||||
--- a/src/event.c
|
||||
+++ b/src/event.c
|
||||
@@ -129,11 +129,11 @@ void process_input(struct device *dev, struct dev_input *inp)
|
||||
|
||||
switch(inp->type) {
|
||||
case INP_MOTION:
|
||||
+ inp->idx = cfg.map_axis[inp->idx];
|
||||
+
|
||||
if(abs(inp->val) < cfg.dead_threshold[inp->idx] ) {
|
||||
inp->val = 0;
|
||||
}
|
||||
-
|
||||
- inp->idx = cfg.map_axis[inp->idx];
|
||||
sign = cfg.invert[inp->idx] ? -1 : 1;
|
||||
|
||||
inp->val = (int)((float)inp->val * cfg.sensitivity * (inp->idx < 3 ? cfg.sens_trans[inp->idx] : cfg.sens_rot[inp->idx - 3]));
|
||||
diff --git a/src/proto_x11.c b/src/proto_x11.c
|
||||
index a338ff8..86ebc6f 100644
|
||||
--- a/src/proto_x11.c
|
||||
+++ b/src/proto_x11.c
|
||||
@@ -35,9 +35,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "proto_x11.h"
|
||||
#include "client.h"
|
||||
#include "spnavd.h"
|
||||
+#include "dev.h"
|
||||
#include "xdetect.h"
|
||||
#include "kbemu.h"
|
||||
|
||||
+#ifdef HAVE_XINPUT2_H
|
||||
+#include <X11/Xatom.h>
|
||||
+#include <X11/extensions/XInput2.h>
|
||||
+#endif
|
||||
+
|
||||
|
||||
enum cmd_msg {
|
||||
CMD_NONE,
|
||||
@@ -168,6 +174,8 @@ int init_x11(void)
|
||||
kbemu_set_display(dpy);
|
||||
|
||||
xdet_stop(); /* stop X server detection if it was running */
|
||||
+
|
||||
+ drop_xinput();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -346,6 +354,42 @@ void remove_client_window(Window win)
|
||||
}
|
||||
}
|
||||
|
||||
+void drop_xinput(void)
|
||||
+{
|
||||
+#ifdef HAVE_XINPUT2_H
|
||||
+ XIDeviceInfo *xidevs;
|
||||
+ int i, num_devs;
|
||||
+ static Atom atom_enabled;
|
||||
+
|
||||
+ if(!dpy) return;
|
||||
+
|
||||
+ if(!atom_enabled) {
|
||||
+ atom_enabled = XInternAtom(dpy, "Device Enabled", False);
|
||||
+ }
|
||||
+
|
||||
+ if(!(xidevs = XIQueryDevice(dpy, XIAllDevices, &num_devs))) {
|
||||
+ fprintf(stderr, "failed to query XInput2 devices\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for(i=0; i<num_devs; i++) {
|
||||
+ struct device *dev = get_devices();
|
||||
+ while(dev) {
|
||||
+ if(strcmp(dev->name, xidevs[i].name) == 0 && xidevs[i].enabled) {
|
||||
+ unsigned char zero = 0;
|
||||
+ printf("Removing device \"%s\" from X server\n", dev->name);
|
||||
+
|
||||
+ XIChangeProperty(dpy, xidevs[i].deviceid, atom_enabled, XA_INTEGER, 8, PropModeReplace, &zero, 1);
|
||||
+ break;
|
||||
+ }
|
||||
+ dev = dev->next;
|
||||
+ }
|
||||
+ }
|
||||
+ XIFreeDeviceInfo(xidevs);
|
||||
+
|
||||
+#endif /* HAVE_XINPUT2_H */
|
||||
+}
|
||||
+
|
||||
|
||||
/* X11 error handler */
|
||||
static int xerr(Display *dpy, XErrorEvent *err)
|
||||
diff --git a/src/proto_x11.h b/src/proto_x11.h
|
||||
index 6b78361..49881e5 100644
|
||||
--- a/src/proto_x11.h
|
||||
+++ b/src/proto_x11.h
|
||||
@@ -37,5 +37,7 @@ int handle_xevents(fd_set *rset);
|
||||
void set_client_window(Window win);
|
||||
void remove_client_window(Window win);
|
||||
|
||||
+void drop_xinput(void);
|
||||
+
|
||||
|
||||
#endif /* PROTO_X11_H_ */
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8b4541c72f41e8880904a09fc5d6c5f9d2d9d6b1316708d4079349ea4beebee2
|
||||
size 53529
|
3
spacenavd-0.7.1.tar.gz
Normal file
3
spacenavd-0.7.1.tar.gz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:92bb092f9cdadadef6f8f807833d8f7fdd645569fc14a4c42f3674eb8a35db46
|
||||
size 56213
|
@ -1,139 +0,0 @@
|
||||
commit 68bf97e0458605b671c69744e3bc45e5ca2e9b2b
|
||||
Author: John Tsiombikas <nuclear@member.fsf.org>
|
||||
Date: Sun Oct 28 02:42:46 2018 +0300
|
||||
|
||||
- fixed github issue #4: added a blacklist for USB device matching, and
|
||||
expanded the device list with new USB IDs provided by Herbert Graeber.
|
||||
|
||||
diff --git a/src/cfgfile.h b/src/cfgfile.h
|
||||
index 8d56df3..a959610 100644
|
||||
--- a/src/cfgfile.h
|
||||
+++ b/src/cfgfile.h
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
-spnavcfg - an interactive GUI configurator for the spacenavd daemon.
|
||||
-Copyright (C) 2007-2013 John Tsiombikas <nuclear@member.fsf.org>
|
||||
+spacenavd - a free software replacement driver for 6dof space-mice.
|
||||
+Copyright (C) 2007-2018 John Tsiombikas <nuclear@member.fsf.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
diff --git a/src/dev.c b/src/dev.c
|
||||
index b4e5b4b..31b435c 100644
|
||||
--- a/src/dev.c
|
||||
+++ b/src/dev.c
|
||||
@@ -200,56 +200,86 @@ struct device *get_devices(void)
|
||||
#define VENDOR_3DCONNEXION 0x256f
|
||||
|
||||
static int devid_list[][2] = {
|
||||
- /* 3Dconnexion devices */
|
||||
- {0x46d, 0xc603}, /* spacemouse plus XT */
|
||||
- {0x46d, 0xc605}, /* cadman */
|
||||
- {0x46d, 0xc606}, /* spacemouse classic */
|
||||
- {0x46d, 0xc621}, /* spaceball 5000 */
|
||||
- {0x46d, 0xc623}, /* space traveller */
|
||||
- {0x46d, 0xc625}, /* space pilot */
|
||||
- {0x46d, 0xc626}, /* space navigator */
|
||||
- {0x46d, 0xc627}, /* space explorer */
|
||||
- {0x46d, 0xc628}, /* space navigator for notebooks*/
|
||||
- {0x46d, 0xc629}, /* space pilot pro*/
|
||||
- {0x46d, 0xc62b}, /* space mouse pro*/
|
||||
- {0x46d, 0xc640}, /* nulooq */
|
||||
+ {0x046d, 0xc603}, /* spacemouse plus XT */
|
||||
+ {0x046d, 0xc605}, /* cadman */
|
||||
+ {0x046d, 0xc606}, /* spacemouse classic */
|
||||
+ {0x046d, 0xc621}, /* spaceball 5000 */
|
||||
+ {0x046d, 0xc623}, /* space traveller */
|
||||
+ {0x046d, 0xc625}, /* space pilot */
|
||||
+ {0x046d, 0xc626}, /* space navigator */
|
||||
+ {0x046d, 0xc627}, /* space explorer */
|
||||
+ {0x046d, 0xc628}, /* space navigator for notebooks*/
|
||||
+ {0x046d, 0xc629}, /* space pilot pro*/
|
||||
+ {0x046d, 0xc62b}, /* space mouse pro*/
|
||||
+ {0x046d, 0xc640}, /* nulooq */
|
||||
+ {0x256f, 0xc62e}, /* spacemouse wireless */
|
||||
+ {0x256f, 0xc631}, /* spacemouse pro wireless */
|
||||
+ {0x256f, 0xc632}, /* spacemouse pro wireless receiver */
|
||||
+ {0x256f, 0xc633}, /* spacemouse enterprise */
|
||||
+ {0x256f, 0xc635}, /* spacemouse compact */
|
||||
+ {0x256f, 0xc636}, /* spacemouse module */
|
||||
|
||||
{-1, -1}
|
||||
};
|
||||
|
||||
+/* 3Dconnexion devices which we don't want to match, because they are
|
||||
+ * not 6dof space-mice. reported by: Herbert Graeber in github issue #4
|
||||
+ */
|
||||
+static int devid_blacklist[][2] = {
|
||||
+ {0x256f, 0xc62f}, /* spacemouse wireless receiver */
|
||||
+ {0x256f, 0xc652},
|
||||
+ {0x256f, 0xc650}, /* cadmouse */
|
||||
+ {0x256f, 0xc651}, /* cadmouse wireless */
|
||||
+ {0x256f, 0xc62c}, /* lipari(?) */
|
||||
+ {0x256f, 0xc641}, /* scout(?) */
|
||||
+
|
||||
+ {-1, -1}
|
||||
+};
|
||||
+
|
||||
+
|
||||
static int match_usbdev(const struct usb_device_info *devinfo)
|
||||
{
|
||||
int i;
|
||||
|
||||
- /* if it's a 3Dconnexion device match it immediately */
|
||||
- if((devinfo->name && strstr(devinfo->name, "3Dconnexion"))) {
|
||||
- return 1;
|
||||
+ /* match any USB devices listed in the config file */
|
||||
+ for(i=0; i<MAX_CUSTOM; i++) {
|
||||
+ if(cfg.devid[i][0] != -1 && cfg.devid[i][1] != -1 &&
|
||||
+ (unsigned int)cfg.devid[i][0] == devinfo->vendorid &&
|
||||
+ (unsigned int)cfg.devid[i][1] == devinfo->productid) {
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if(cfg.devname[i] && devinfo->name && strcmp(cfg.devname[i], devinfo->name) == 0) {
|
||||
+ return 1;
|
||||
+ }
|
||||
}
|
||||
|
||||
if(devinfo->vendorid != -1 && devinfo->productid != -1) {
|
||||
+ int vid = devinfo->vendorid;
|
||||
+ int pid = devinfo->productid;
|
||||
+
|
||||
+ /* ignore any device in the devid_blacklist */
|
||||
+ for(i=0; devid_blacklist[i][0] > 0; i++) {
|
||||
+ if(vid == devid_blacklist[i][0] && pid == devid_blacklist[i][1]) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* match any device with the new 3Dconnexion device id */
|
||||
- if(devinfo->vendorid == VENDOR_3DCONNEXION) {
|
||||
+ if(vid == VENDOR_3DCONNEXION) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* match any device in the devid_list */
|
||||
for(i=0; devid_list[i][0] > 0; i++) {
|
||||
- if(devinfo->vendorid == devid_list[i][0] && devinfo->productid == devid_list[i][1]) {
|
||||
+ if(vid == devid_list[i][0] && pid == devid_list[i][1]) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- /* match any joystick devices listed in the config file */
|
||||
- for(i=0; i<MAX_CUSTOM; i++) {
|
||||
- if(cfg.devid[i][0] != -1 && cfg.devid[i][1] != -1 &&
|
||||
- (unsigned int)cfg.devid[i][0] == devinfo->vendorid &&
|
||||
- (unsigned int)cfg.devid[i][1] == devinfo->productid) {
|
||||
- return 1;
|
||||
- }
|
||||
- if(cfg.devname[i] && devinfo->name && strcmp(cfg.devname[i], devinfo->name) == 0) {
|
||||
- return 1;
|
||||
- }
|
||||
+ /* if it's a 3Dconnexion device match it immediately */
|
||||
+ if((devinfo->name && strstr(devinfo->name, "3Dconnexion"))) {
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
return 0; /* no match */
|
@ -1,33 +0,0 @@
|
||||
commit a9eccf34e7cac969ee399f625aef827f4f4aaec6
|
||||
Author: John Tsiombikas <nuclear@member.fsf.org>
|
||||
Date: Sun Feb 24 21:34:21 2019 +0200
|
||||
|
||||
SpaceMouse Wireless device id was erroneously put in the black list;
|
||||
moved it to the device list, solving github issue #12
|
||||
|
||||
diff --git a/src/dev.c b/src/dev.c
|
||||
index 4e8e7a2..466ed42 100644
|
||||
--- a/src/dev.c
|
||||
+++ b/src/dev.c
|
||||
@@ -212,7 +212,8 @@ static int devid_list[][2] = {
|
||||
{0x046d, 0xc629}, /* space pilot pro*/
|
||||
{0x046d, 0xc62b}, /* space mouse pro*/
|
||||
{0x046d, 0xc640}, /* nulooq */
|
||||
- {0x256f, 0xc62e}, /* spacemouse wireless */
|
||||
+ {0x256f, 0xc62e}, /* spacemouse wireless (USB cable) */
|
||||
+ {0x256f, 0xc62f}, /* spacemouse wireless receiver */
|
||||
{0x256f, 0xc631}, /* spacemouse pro wireless */
|
||||
{0x256f, 0xc632}, /* spacemouse pro wireless receiver */
|
||||
{0x256f, 0xc633}, /* spacemouse enterprise */
|
||||
@@ -223,10 +224,9 @@ static int devid_list[][2] = {
|
||||
};
|
||||
|
||||
/* 3Dconnexion devices which we don't want to match, because they are
|
||||
- * not 6dof space-mice. reported by: Herbert Graeber in github issue #4
|
||||
+ * not 6dof space-mice. reported by: Herbert Graeber in github pull request #4
|
||||
*/
|
||||
static int devid_blacklist[][2] = {
|
||||
- {0x256f, 0xc62f}, /* spacemouse wireless receiver */
|
||||
{0x256f, 0xc652},
|
||||
{0x256f, 0xc650}, /* cadmouse */
|
||||
{0x256f, 0xc651}, /* cadmouse wireless */
|
50
spacenavd-fix-pidfile.patch
Normal file
50
spacenavd-fix-pidfile.patch
Normal file
@ -0,0 +1,50 @@
|
||||
diff -up spacenavd-0.7.1/contrib/systemd/spacenavd.service.fix-pidfile spacenavd-0.7.1/contrib/systemd/spacenavd.service
|
||||
--- spacenavd-0.7.1/contrib/systemd/spacenavd.service.fix-pidfile 2020-03-22 16:10:42.581821273 +0100
|
||||
+++ spacenavd-0.7.1/contrib/systemd/spacenavd.service 2020-03-22 16:11:49.253400708 +0100
|
||||
@@ -4,7 +4,7 @@ After=syslog.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
-PIDFile=/var/run/spnavd.pid
|
||||
+PIDFile=/run/spnavd.pid
|
||||
ExecStart=/usr/bin/spacenavd
|
||||
StandardError=syslog
|
||||
|
||||
diff -up spacenavd-0.7.1/init_script.fix-pidfile spacenavd-0.7.1/init_script
|
||||
--- spacenavd-0.7.1/init_script.fix-pidfile 2020-03-22 16:10:57.213842900 +0100
|
||||
+++ spacenavd-0.7.1/init_script 2020-03-22 16:12:08.165156918 +0100
|
||||
@@ -30,7 +30,7 @@ start)
|
||||
stop)
|
||||
echo 'Stopping spacenavd daemon'
|
||||
# detect daemon's process id
|
||||
- pid=`cat /var/run/spnavd.pid 2>/dev/null`
|
||||
+ pid=`cat /run/spnavd.pid 2>/dev/null`
|
||||
if [ $? != 0 ]; then
|
||||
pid=`ps -e | grep spacenavd | awk '{ print $1 }'`
|
||||
if [ -z "$pid" ]; then
|
||||
diff -up spacenavd-0.7.1/spnavd_ctl.fix-pidfile spacenavd-0.7.1/spnavd_ctl
|
||||
--- spacenavd-0.7.1/spnavd_ctl.fix-pidfile 2020-03-22 16:11:13.009768437 +0100
|
||||
+++ spacenavd-0.7.1/spnavd_ctl 2020-03-22 16:12:34.904713390 +0100
|
||||
@@ -32,7 +32,7 @@ else
|
||||
fi
|
||||
|
||||
# detect daemon's process id
|
||||
-pid=`cat /var/run/spnavd.pid 2>/dev/null`
|
||||
+pid=`cat /run/spnavd.pid 2>/dev/null`
|
||||
if [ $? != 0 ]; then
|
||||
pid=`ps -e | grep spacenavd | awk '{ print $1 }'`
|
||||
if [ -z "$pid" ]; then
|
||||
diff -up spacenavd-0.7.1/src/spnavd.h.fix-pidfile spacenavd-0.7.1/src/spnavd.h
|
||||
--- spacenavd-0.7.1/src/spnavd.h.fix-pidfile 2020-03-22 16:11:26.161657639 +0100
|
||||
+++ spacenavd-0.7.1/src/spnavd.h 2020-03-22 16:14:26.920758060 +0100
|
||||
@@ -26,8 +26,8 @@ along with this program. If not, see <h
|
||||
#define DEF_CFGFILE "/etc/spnavrc"
|
||||
#define DEF_LOGFILE "/var/log/spnavd.log"
|
||||
|
||||
-#define SOCK_NAME "/var/run/spnav.sock"
|
||||
-#define PIDFILE "/var/run/spnavd.pid"
|
||||
+#define SOCK_NAME "/run/spnav.sock"
|
||||
+#define PIDFILE "/run/spnavd.pid"
|
||||
#define SYSLOG_ID "spnavd"
|
||||
|
||||
/* Multiple devices support */
|
@ -1,3 +1,32 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 31 15:36:18 UTC 2020 - Herbert Graeber <herbert@graeber-clan.de>
|
||||
|
||||
- Remove unnecessary _service file
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Mar 22 17:19:36 UTC 2020 - Herbert Graeber <herbert@graeber-clan.de>
|
||||
|
||||
- Fix pidfile (/var/run -> /run)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Mar 22 12:30:44 UTC 2020 - Herbert Graeber <herbert@graeber-clan.de>
|
||||
|
||||
- Bugfix release 0.7.1
|
||||
* fixed build on gcc 10
|
||||
* fixed configure script which failed to detect the version number correctly
|
||||
in release 0.7, incorrectly trying to rely on git to do so.
|
||||
- remove support for pre-systemd openSUSE releases
|
||||
- remove patch spacenavd-add-blacklist-and-device-ids.patch
|
||||
- remove patch spacenavd-add-missing-usbid.patc
|
||||
- Release 0.7
|
||||
* implemented the ability to log to syslog.
|
||||
* ignore joystick devices when searching for USB devices (linux).
|
||||
* added code to attempt to wrestle devices from the X server.
|
||||
* added the new 3Dconnexion vendor id to the device matching logic.
|
||||
* made builds reproducible by linking in alphabetical order.
|
||||
* added option led = auto, to turn the LED on only when a client connects (linux).
|
||||
* implemented a blacklist of USB device ids that should be ignored.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Mar 16 11:30:05 UTC 2019 - Herbert Graeber <herbert@graeber-clan.de>
|
||||
|
||||
|
@ -3,7 +3,7 @@ Description=Userspace Daemon of the spacenav driver.
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
PIDFile=/var/run/spnavd.pid
|
||||
PIDFile=/run/spnavd.pid
|
||||
ExecStart=/usr/sbin/spacenavd
|
||||
StandardError=syslog
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package spacenavd
|
||||
#
|
||||
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
|
||||
# Copyright (c) 2020 SUSE LLC
|
||||
# Copyright (c) 2009,2011,2013 Herbert Graeber
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
@ -17,30 +17,23 @@
|
||||
#
|
||||
|
||||
|
||||
%if 0%{?suse_version} > 1140
|
||||
%define has_systemd 1
|
||||
BuildRequires: systemd-rpm-macros
|
||||
%{?systemd_requires}
|
||||
%endif
|
||||
Name: spacenavd
|
||||
Version: 0.6
|
||||
Version: 0.7.1
|
||||
Release: 0
|
||||
Summary: Daemon for 3Dconnexion devices
|
||||
License: GPL-3.0-or-later
|
||||
Group: Hardware/Other
|
||||
URL: http://spacenav.sourceforge.net
|
||||
Source: https://github.com/FreeSpacenav/%{name}/archive/%{name}-%{version}.tar.gz
|
||||
Source: https://github.com/FreeSpacenav/spacenavd/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
|
||||
Source1: spacenavd.8.gz
|
||||
Source2: spnavrc
|
||||
Source3: xinitrc-%{name}
|
||||
Source4: %{name}.service
|
||||
Patch1: spacenavd-0.6+git3066072.patch
|
||||
# PATCH-FIX-UPSTREAM spacenavd-add-blacklist-and-device-ids.patch #4
|
||||
Patch2: spacenavd-add-blacklist-and-device-ids.patch
|
||||
# PATCH-FIX-UPSTREAM spacenavd-add-missing-usbid.patch #12
|
||||
Patch3: spacenavd-add-missing-usbid.patch
|
||||
Patch1: %{name}-fix-pidfile.patch
|
||||
BuildRequires: pkgconfig
|
||||
BuildRequires: systemd-rpm-macros
|
||||
BuildRequires: pkgconfig(x11)
|
||||
%{?systemd_requires}
|
||||
Requires: xdpyinfo
|
||||
Supplements: modalias(usb:v046DpC603d*dc*dsc*dp*ic*isc*ip*)
|
||||
Supplements: modalias(usb:v046DpC605d*dc*dsc*dp*ic*isc*ip*)
|
||||
@ -63,10 +56,8 @@ compatible with the original 3dxsrv daemon, and works perfectly with
|
||||
any program that was written for the 3Dconnexion driver.
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{name}-%{version}
|
||||
%setup -q
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
|
||||
%build
|
||||
%configure
|
||||
@ -80,35 +71,20 @@ ln -sf spacenavd.8.gz %{buildroot}%{_mandir}/man8/spnavd_ctl.8.gz
|
||||
install -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/spnavrc
|
||||
install -D -m 755 %{SOURCE3} %{buildroot}%{_sysconfdir}/X11/xinit/xinitrc.d/%{name}
|
||||
ln -sf service %{buildroot}%{_sbindir}/rc%{name}
|
||||
%if 0%{?has_systemd}
|
||||
install -D -m 644 %{SOURCE4} %{buildroot}%{_unitdir}/%{name}.service
|
||||
%endif
|
||||
|
||||
%post
|
||||
%fillup_only -n %{name}
|
||||
%if 0%{?has_systemd}
|
||||
%service_add_post %{name}.service
|
||||
%endif
|
||||
|
||||
%postun
|
||||
%if 0%{?has_systemd}
|
||||
%service_del_postun %{name}.service
|
||||
%else
|
||||
%restart_on_update %{name}
|
||||
%insserv_cleanup
|
||||
%endif
|
||||
|
||||
%pre
|
||||
%if 0%{?has_systemd}
|
||||
%service_add_pre %{name}.service
|
||||
%endif
|
||||
|
||||
%preun
|
||||
%if 0%{?has_systemd}
|
||||
%service_del_preun %{name}.service
|
||||
%else
|
||||
%stop_on_removal %{name}
|
||||
%endif
|
||||
|
||||
%files
|
||||
%license COPYING
|
||||
@ -117,9 +93,7 @@ install -D -m 644 %{SOURCE4} %{buildroot}%{_unitdir}/%{name}.service
|
||||
%{_sbindir}/rc%{name}
|
||||
%{_bindir}/spnavd_ctl
|
||||
%config(noreplace) %{_sysconfdir}/spnavrc
|
||||
%if 0%{?has_systemd}
|
||||
%{_unitdir}/%{name}.service
|
||||
%endif
|
||||
%{_mandir}/man8/spacenavd.8%{?ext_man}
|
||||
%{_mandir}/man8/spnavd_ctl.8%{?ext_man}
|
||||
%{_sysconfdir}/X11/xinit/
|
||||
|
Loading…
Reference in New Issue
Block a user