]> git.mxchange.org Git - flightgear.git/blobdiff - src/Input/FGMouseInput.cxx
Stop the property tree from keeping a shadow of the deleted input properties, as...
[flightgear.git] / src / Input / FGMouseInput.cxx
index 9a0d13abbe92eb4a1cd6e93ec95de19ab8c46240..8ebdb6becffdd8419e97a137fe794e3cc595ac9a 100644 (file)
 //
 // $Id$
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include "FGMouseInput.hxx"
 #include "Main/globals.hxx"
 
+using std::ios_base;
+
 void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea )
 {
   // Get the list of hit callbacks. Take the first callback that
@@ -75,6 +81,7 @@ const FGMouseInput::MouseCursorMap FGMouseInput::mouse_cursor_map[] = {
 FGMouseInput * FGMouseInput::mouseInput = NULL;
 
 FGMouseInput::FGMouseInput() :
+  haveWarped(false),
   xSizeNode(fgGetNode("/sim/startup/xsize", false ) ),
   ySizeNode(fgGetNode("/sim/startup/ysize", false ) ),
   xAccelNode(fgGetNode("/devices/status/mice/mouse/accel-x", true ) ),
@@ -180,6 +187,7 @@ void FGMouseInput::update ( double dt )
       m.x = (xSizeNode ? xSizeNode->getIntValue() : 800) / 2;
       m.y = (ySizeNode ? ySizeNode->getIntValue() : 600) / 2;
       fgWarpMouse(m.x, m.y);
+      haveWarped = true;
     } else {
       SG_LOG(SG_INPUT, SG_DEBUG, "Mouse mode " << mode << " out of range");
       fgSetMouseCursor(MOUSE_CURSOR_POINTER);
@@ -268,14 +276,9 @@ void FGMouseInput::doMouseClick (int b, int updown, int x, int y, bool mainWindo
   }
 
   if (mode.pass_through) {
+    // remove once PUI uses standard picking mechanism
     if (0 <= x && 0 <= y && puMouse(b, updown, x, y))
       return;
-    else if (0 <= x && 0 <= y && (globals->get_current_panel() != 0) &&
-             globals->get_current_panel()->getVisibility() &&
-             globals->get_current_panel()->doMouseAction(b, updown, x, y))
-      return;
-    else if (0 <= x && 0 <= y && fgHandle3DPanelMouseEvent(b, updown, x, y))
-      return;
     else {
       // pui didn't want the click event so compute a
       // scenegraph intersection point corresponding to the mouse click
@@ -321,37 +324,51 @@ void FGMouseInput::doMouseMotion (int x, int y)
       m.y = y;
       return;
   }
-
+  
+  if (haveWarped)
+  {
+      // don't fire mouse-movement events at the first update after warping the mouse,
+      // just remember the new mouse position
+      haveWarped = false;
+  }
+  else
+  {
                                 // OK, PUI didn't want the event,
                                 // so we can play with it.
-  if (x != m.x) {
-    int delta = x - m.x;
-    xAccelNode->setIntValue( delta );
-    for (unsigned int i = 0; i < mode.x_bindings[modifiers].size(); i++)
-      mode.x_bindings[modifiers][i]->fire(double(delta), double(xsize));
-  }
-  if (y != m.y) {
-    int delta = y - m.y;
-    yAccelNode->setIntValue( -delta );
-    for (unsigned int i = 0; i < mode.y_bindings[modifiers].size(); i++)
-      mode.y_bindings[modifiers][i]->fire(double(delta), double(ysize));
+      if (x != m.x) {
+        int delta = x - m.x;
+        xAccelNode->setIntValue( delta );
+        for (unsigned int i = 0; i < mode.x_bindings[modifiers].size(); i++)
+          mode.x_bindings[modifiers][i]->fire(double(delta), double(xsize));
+      }
+      if (y != m.y) {
+        int delta = y - m.y;
+        yAccelNode->setIntValue( -delta );
+        for (unsigned int i = 0; i < mode.y_bindings[modifiers].size(); i++)
+          mode.y_bindings[modifiers][i]->fire(double(delta), double(ysize));
+      }
   }
-
                                 // Constrain the mouse if requested
   if (mode.constrained) {
+    int new_x=x,new_y=y;
+    
     bool need_warp = false;
     if (x <= (xsize * .25) || x >= (xsize * .75)) {
-      x = int(xsize * .5);
+      new_x = int(xsize * .5);
       need_warp = true;
     }
 
     if (y <= (ysize * .25) || y >= (ysize * .75)) {
-      y = int(ysize * .5);
+      new_y = int(ysize * .5);
       need_warp = true;
     }
 
     if (need_warp)
-      fgWarpMouse(x, y);
+    {
+      fgWarpMouse(new_x, new_y);
+      haveWarped = true;
+      SG_LOG(SG_INPUT, SG_DEBUG, "Mouse warp: " << x << ", " << y << " => " << new_x << ", " << new_y);
+    }
   }
 
   if (m.x != x)