applied Linux SpaceNav patch from Rafael Ortis
[blender.git] / intern / ghost / intern / GHOST_NDOFManagerX11.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): none yet.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22  
23 #ifndef _GHOST_NDOFMANAGERX11_H_
24 #define _GHOST_NDOFMANAGERX11_H_
25
26 #include "GHOST_NDOFManager.h"
27 #include "GHOST_Types.h"
28 #include "GHOST_WindowX11.h"
29 #include "GHOST_EventNDOF.h"
30 #include <X11/Xlib.h>
31 #include <stdio.h>
32
33 class GHOST_NDOFManagerX11 : public GHOST_NDOFManager
34 {
35 GHOST_WindowX11 * m_ghost_window_x11;
36
37 public:
38         GHOST_NDOFManagerX11(GHOST_System& sys)
39                 : GHOST_NDOFManager(sys)
40                 {}
41
42         void setGHOSTWindowX11(GHOST_WindowX11 * w){
43             if (m_ghost_window_x11 == NULL)
44                 m_ghost_window_x11 = w;
45         }
46
47         GHOST_WindowX11 * getGHOSTWindowX11(){
48             return m_ghost_window_x11;
49         }       
50
51         // whether multi-axis functionality is available (via the OS or driver)
52         // does not imply that a device is plugged in or being used
53         bool available()
54                 {
55                 // never available since I've not yet written it!
56                 return true;
57                 }
58
59         virtual bool sendMotionEvent()
60                 {
61                 if (m_atRest)
62                         return false;           
63
64                 GHOST_EventNDOFMotion* event = new GHOST_EventNDOFMotion(m_motionTime, getGHOSTWindowX11());
65                 GHOST_TEventNDOFMotionData* data = (GHOST_TEventNDOFMotionData*) event->getData();
66
67                 const float scale = 1.f/350.f; // SpaceNavigator sends +/- 350 usually
68                 // 350 according to their developer's guide; others recommend 500 as comfortable
69
70                 // possible future enhancement
71                 // scale *= m_sensitivity;
72
73                 data->tx = -scale * m_translation[0];
74                 data->ty = scale * m_translation[1];
75                 data->tz = scale * m_translation[2];
76
77                 data->rx = scale * m_rotation[0];
78                 data->ry = scale * m_rotation[1];
79                 data->rz = scale * m_rotation[2];
80
81                 data->dt = 0.001f * (m_motionTime - m_prevMotionTime); // in seconds
82
83                 m_prevMotionTime = m_motionTime;
84
85                 printf("sending T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
86                         data->tx, data->ty, data->tz, data->rx, data->ry, data->rz, data->dt);
87
88                 if (!m_system.pushEvent(event))
89                     return false;
90
91                 // 'at rest' test goes at the end so that the first 'rest' event gets sent
92                 m_atRest = m_rotation[0] == 0 && m_rotation[1] == 0 && m_rotation[2] == 0 &&
93                         m_translation[0] == 0 && m_translation[1] == 0 && m_translation[2] == 0;
94
95                 return true;
96                 }
97 };
98
99
100 #endif