1
0
Fork 0

#359: jumping mouse control axis in "constrained" mouse modes

Experimental patch - let's see if this helps those who saw the issue,
otherwise we'll try a different patch...
This commit is contained in:
ThorstenB 2011-08-11 21:36:29 +02:00
parent e9a9f8c96d
commit 28496bb6ac
2 changed files with 34 additions and 16 deletions

View file

@ -75,6 +75,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 +181,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);
@ -321,37 +323,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 (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 (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)

View file

@ -118,6 +118,8 @@ private:
} mouse_cursor_map[];
mouse bindings[MAX_MICE];
bool haveWarped;
SGPropertyNode_ptr xSizeNode;
SGPropertyNode_ptr ySizeNode;