Revision: 37394
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37394
Author:   merwin
Date:     2011-06-11 00:25:48 +0000 (Sat, 11 Jun 2011)
Log Message:
-----------
SpaceNav works on Linux

Modified Paths:
--------------
    branches/merwin-spacenav/intern/ghost/GHOST_Types.h
    branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp
    branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp
    branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h
    branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h
    branches/merwin-spacenav/intern/ghost/intern/GHOST_SystemWin32.cpp
    branches/merwin-spacenav/intern/ghost/intern/GHOST_SystemX11.cpp
    branches/merwin-spacenav/intern/ghost/intern/GHOST_SystemX11.h
    branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c
    
branches/merwin-spacenav/source/blender/windowmanager/intern/wm_event_system.c
    branches/merwin-spacenav/source/blender/windowmanager/intern/wm_window.c

Added Paths:
-----------
    branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp

Modified: branches/merwin-spacenav/intern/ghost/GHOST_Types.h
===================================================================
--- branches/merwin-spacenav/intern/ghost/GHOST_Types.h 2011-06-11 00:22:35 UTC 
(rev 37393)
+++ branches/merwin-spacenav/intern/ghost/GHOST_Types.h 2011-06-11 00:25:48 UTC 
(rev 37394)
@@ -47,11 +47,6 @@
 typedef        int                                     GHOST_TInt32;
 typedef        unsigned int            GHOST_TUns32;
 
-#ifdef WIN32
-#define WM_BLND_NDOF_AXIS      WM_USER + 1
-#define WM_BLND_NDOF_BTN       WM_USER + 2
-#endif
-
 #if defined(WIN32) && !defined(FREE_WINDOWS)
 typedef __int64                                GHOST_TInt64;
 typedef unsigned __int64       GHOST_TUns64;

Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp 
2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp 
2011-06-11 00:25:48 UTC (rev 37394)
@@ -42,8 +42,8 @@
 #include "GHOST_EventManager.h"
 #include <algorithm>
 #include "GHOST_Debug.h"
+#include <stdio.h> // [mce] temp debug
 
-
 GHOST_EventManager::GHOST_EventManager()
 {
 }
@@ -111,6 +111,7 @@
 bool GHOST_EventManager::dispatchEvent(GHOST_IEvent* event)
 {
        bool handled;
+       printf("dispatching %d\n", event->getType());
        if (event) {
                handled = true;
                TConsumerVector::iterator iter;

Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp  
2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp  
2011-06-11 00:25:48 UTC (rev 37394)
@@ -16,7 +16,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * Contributor(s):
- *    Mike Erwin
+ *   Mike Erwin
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -54,12 +54,33 @@
        m_atRest = false;
        }
 
-void GHOST_NDOFManager::updateButtons(unsigned short buttons, GHOST_TUns64 
time)
+void GHOST_NDOFManager::updateButton(int button_number, bool press, 
GHOST_TUns64 time)
        {
        GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow();
 
-       unsigned short diff = m_buttons ^ buttons;
+       GHOST_EventNDOFButton* event = new GHOST_EventNDOFButton(time, window);
+       GHOST_TEventNDOFButtonData* data = (GHOST_TEventNDOFButtonData*) 
event->getData();
 
+       data->action = press ? GHOST_kPress : GHOST_kRelease;
+       data->button = button_number + 1;
+
+       printf("sending button %d %s\n", data->button, (data->action == 
GHOST_kPress) ? "pressed" : "released");
+
+       m_system.pushEvent(event);
+
+       unsigned short mask = 1 << button_number;
+       if (press)
+               m_buttons |= mask; // set this button's bit
+       else
+               m_buttons &= ~mask; // clear this button's bit
+       }
+
+void GHOST_NDOFManager::updateButtons(unsigned short button_bits, GHOST_TUns64 
time)
+       {
+       GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow();
+
+       unsigned short diff = m_buttons ^ button_bits;
+
        for (int i = 0; i < 16; ++i)
                {
                unsigned short mask = 1 << i;
@@ -69,16 +90,16 @@
                        GHOST_EventNDOFButton* event = new 
GHOST_EventNDOFButton(time, window);
                        GHOST_TEventNDOFButtonData* data = 
(GHOST_TEventNDOFButtonData*) event->getData();
                        
-                       data->action = (buttons & mask) ? GHOST_kPress : 
GHOST_kRelease;
+                       data->action = (button_bits & mask) ? GHOST_kPress : 
GHOST_kRelease;
                        data->button = i + 1;
 
-                       // printf("sending button %d %s\n", data->button, 
(data->action == GHOST_kPress) ? "pressed" : "released");
+                       printf("sending button %d %s\n", data->button, 
(data->action == GHOST_kPress) ? "pressed" : "released");
 
                        m_system.pushEvent(event);
                        }
                }
 
-       m_buttons = buttons;
+       m_buttons = button_bits;
        }
 
 bool GHOST_NDOFManager::sendMotionEvent()
@@ -109,14 +130,16 @@
 
        m_prevMotionTime = m_motionTime;
 
-       // printf("sending T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
-       //      data->tx, data->ty, data->tz, data->rx, data->ry, data->rz, 
data->dt);
+       printf("sending T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
+               data->tx, data->ty, data->tz, data->rx, data->ry, data->rz, 
data->dt);
 
        m_system.pushEvent(event);
 
        // 'at rest' test goes at the end so that the first 'rest' event gets 
sent
        m_atRest = m_rotation[0] == 0 && m_rotation[1] == 0 && m_rotation[2] == 
0 &&
                m_translation[0] == 0 && m_translation[1] == 0 && 
m_translation[2] == 0;
+       // this needs to be aware of calibration -- 0.01 0.01 0.03 might be 
'rest'
 
        return true;
        }
+

Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h    
2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h    
2011-06-11 00:25:48 UTC (rev 37394)
@@ -15,7 +15,8 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * Contributor(s): none yet.
+ * Contributor(s):
+ *   Mike Erwin
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -40,27 +41,28 @@
        // the latest raw data from the device
        void updateTranslation(short t[3], GHOST_TUns64 time);
        void updateRotation(short r[3], GHOST_TUns64 time);
-       // this one sends events immediately for changed buttons
-       void updateButtons(unsigned short b, GHOST_TUns64 time);
+       // send events immediately for changed buttons
+       void updateButton(int button_number, bool press, GHOST_TUns64 time);
+       void updateButtons(unsigned short button_bits, GHOST_TUns64 time);
 
        // processes most recent raw data into an NDOFMotion event and sends it
        // returns whether an event was sent
-       virtual bool sendMotionEvent();
+       bool sendMotionEvent();
 
 protected:
        GHOST_System& m_system;
 
        short m_translation[3];
        short m_rotation[3];
-       unsigned short m_buttons;
+       unsigned short m_buttons; // bit field
 
-       GHOST_TUns64 m_motionTime;
+       GHOST_TUns64 m_motionTime; // in milliseconds
        GHOST_TUns64 m_prevMotionTime; // time of most recent Motion event sent
        bool m_atRest;
 
-       void updateMotionTime(GHOST_TUns64 t);
-       void resetMotion();
+//     void updateMotionTime(GHOST_TUns64 t);
+//     void resetMotion();
 };
 
+#endif
 
-#endif

Added: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp       
                        (rev 0)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp       
2011-06-11 00:25:48 UTC (rev 37394)
@@ -0,0 +1,86 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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 the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s):
+ *   Mike Erwin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+ 
+#include "GHOST_NDOFManagerX11.h"
+#include "GHOST_SystemX11.h"
+#include <spnav.h>
+#include <stdio.h>
+
+
+GHOST_NDOFManagerX11::GHOST_NDOFManagerX11(GHOST_System& sys)
+       : GHOST_NDOFManager(sys)
+       {
+       if (spnav_open() != -1)
+               {
+               m_available = true;
+               }
+       else
+               {
+               printf("<!> SpaceNav driver not found\n");
+               // This isn't a hard error, just means the user doesn't have a 
SpaceNavigator.
+               m_available = false;
+               }
+       }
+
+GHOST_NDOFManagerX11::~GHOST_NDOFManagerX11()
+       {
+       if (m_available)
+               {
+               spnav_remove_events(SPNAV_EVENT_ANY); // ask nuclear if this is 
needed
+               spnav_close();
+               }
+       }
+
+bool GHOST_NDOFManagerX11::available()
+       {
+       return m_available;
+       }
+
+bool GHOST_NDOFManagerX11::processEvents()
+       {
+       GHOST_TUns64 now = m_system.getMilliSeconds();
+
+       bool anyProcessed = false;
+       spnav_event e;
+       while (spnav_poll_event(&e))
+               {
+               switch (e.type)
+                       {
+                       case SPNAV_EVENT_MOTION:
+                               {
+                               short t[3] = {e.motion.x, e.motion.y, 
e.motion.z};
+                               short r[3] = {e.motion.rx, e.motion.ry, 
e.motion.rz};
+
+                               updateTranslation(t, now);
+                               updateRotation(r, now);
+                               break;
+                               }
+                       case SPNAV_EVENT_BUTTON:
+                               updateButton(e.button.bnum, e.button.press, 
now);
+                               break;
+                       }
+               anyProcessed = true;
+               }
+       return anyProcessed;
+       }
+

Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h 
2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h 
2011-06-11 00:25:48 UTC (rev 37394)
@@ -15,7 +15,8 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * Contributor(s): none yet.
+ * Contributor(s):
+ *   Mike Erwin
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -24,77 +25,18 @@
 #define _GHOST_NDOFMANAGERX11_H_
 
 #include "GHOST_NDOFManager.h"
-#include "GHOST_Types.h"
-#include "GHOST_WindowX11.h"
-#include "GHOST_EventNDOF.h"
-#include <X11/Xlib.h>
-#include <stdio.h>
 
 class GHOST_NDOFManagerX11 : public GHOST_NDOFManager
-{
-GHOST_WindowX11 * m_ghost_window_x11;
-
+       {
 public:
-       GHOST_NDOFManagerX11(GHOST_System& sys)
-               : GHOST_NDOFManager(sys)
-               {}
+       GHOST_NDOFManagerX11(GHOST_System&);
+       ~GHOST_NDOFManagerX11();
+       bool available();
+       bool processEvents();
 
-       void setGHOSTWindowX11(GHOST_WindowX11 * w){
-           if (m_ghost_window_x11 == NULL)
-               m_ghost_window_x11 = w;
-       }
+private:
+       bool m_available;
+       };
 
-       GHOST_WindowX11 * getGHOSTWindowX11(){
-           return m_ghost_window_x11;
-       }       
-
-       // whether multi-axis functionality is available (via the OS or driver)
-       // does not imply that a device is plugged in or being used
-       bool available()
-               {
-               // never available since I've not yet written it!
-               return true;
-               }
-
-       virtual bool sendMotionEvent()
-               {

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to