summaryrefslogtreecommitdiff
path: root/spnav.py
diff options
context:
space:
mode:
Diffstat (limited to 'spnav.py')
-rw-r--r--spnav.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/spnav.py b/spnav.py
new file mode 100644
index 0000000..9079114
--- /dev/null
+++ b/spnav.py
@@ -0,0 +1,80 @@
+from ctypes import cdll, c_int, c_uint, c_void_p, byref, Structure, Union
+
+libspnav = cdll.LoadLibrary('libspnav.so')
+
+SPNAV_EVENT_ANY = 0
+SPNAV_EVENT_MOTION = 1
+SPNAV_EVENT_BUTTON = 2
+
+class spnav_event_motion(Structure):
+ _fields_ = [('type', c_int),
+ ('x', c_int),
+ ('y', c_int),
+ ('z', c_int),
+ ('rx', c_int),
+ ('ry', c_int),
+ ('rz', c_int),
+ ('period', c_uint),
+ ('data', c_void_p)]
+
+class spnav_event_button(Structure):
+ _fields_ = [('type', c_int),
+ ('press', c_int),
+ ('bnum', c_int)]
+
+class spnav_event(Union):
+ _fields_ = [('type', c_int),
+ ('motion', spnav_event_motion),
+ ('button', spnav_event_button) ]
+
+ def __str__(self):
+ if self.type == SPNAV_EVENT_ANY:
+ return 'SPNAV_EVENT_ANY'
+ elif self.type == SPNAV_EVENT_MOTION:
+ m = self.motion
+ return 'SPNAV_EVENT_MOTION t(%d,%d,%d) r(%d,%d,%d)' % (m.x, m.y, m.z, m.rx, m.ry, m.rz)
+ elif self.type == SPNAV_EVENT_BUTTON:
+ if self.button.press:
+ state = 'down'
+ else:
+ state = 'up'
+ return 'SPNAV_EVENT_BUTTON %d %s' % (self.button.bnum, state)
+
+def spnav_open():
+ if libspnav.spnav_open() == -1:
+ raise Exception('failed to connect to the space navigator daemon')
+
+def spnav_close():
+ libspnav.spnav_close()
+
+def spnav_fd():
+ return libspnav.spnav_fd()
+
+def spnav_wait_event():
+ ev = spnav_event()
+ ret = libspnav.spnav_wait_event(byref(ev))
+ if ret:
+ return ev
+ else:
+ raise Exception('non-zero return code from spnav_wait_event()')
+
+def spnav_poll_event():
+ ev = spnav_event()
+ ret = libspnav.spnav_poll_event(byref(ev))
+ if ret == 0:
+ return None
+ else:
+ return ev
+
+def spnav_remove_events(event_type):
+ return libspnav.spnav_remove_events(event_type)
+
+if __name__ == '__main__':
+ spnav_open()
+ try:
+ while True:
+ ev = spnav_wait_event()
+ print ev
+ finally:
+ spnav_close()
+