ryzom_client_x11_free_look_cam_look.patch
b/code/ryzom/client/src/events_listener.cpp Wed May 19 00:38:24 2010 +0200 | ||
---|---|---|
145 | 145 |
// Event from the Mouse (ANGLE) |
146 | 146 |
if(event == EventGDMouseMove) |
147 | 147 |
{ |
148 |
#ifdef NL_OS_WINDOWS |
|
148 | 149 |
CGDMouseMove* mouseEvent=(CGDMouseMove*)&event; |
149 | 150 |
// Mouse acceleration |
150 | 151 |
sint dX = mouseEvent->X; |
151 | 152 |
sint dY = ClientCfg.FreeLookInverted ? -mouseEvent->Y : mouseEvent->Y; |
152 | 153 |
updateFreeLookPos((float) dX, (float) dY); |
154 |
#else |
|
155 |
// just to make sure that there is no game device implementation un unix |
|
156 |
nlerror("not expecting EventGDMouseMove on unix"); |
|
157 |
#endif |
|
153 | 158 |
} |
154 | 159 |
// Event from the Mouse (MOVE) |
155 | 160 |
else if(event == EventMouseMoveId) |
b/code/ryzom/client/src/input.cpp Wed May 19 00:38:24 2010 +0200 | ||
---|---|---|
65 | 65 |
// mask for mouse buttons that are known to be down |
66 | 66 |
uint DownMouseButtons = 0; |
67 | 67 | |
68 |
#ifdef NL_OS_UNIX |
|
69 |
// on X11, store whether the mouse was captured or not |
|
70 |
bool MouseCapture = false; |
|
71 |
#endif |
|
72 | ||
68 | 73 |
////////////// |
69 | 74 |
// FUNCTION // |
70 | 75 |
////////////// |
... | ... | |
244 | 249 |
} |
245 | 250 |
UpdateMouse (); |
246 | 251 |
} |
252 |
|
|
253 |
#ifdef NL_OS_UNIX |
|
254 |
// on X11 the mouse needs to get pulled into the middle each update, else |
|
255 |
// the cursor would reach the border of the window / desktop |
|
256 |
// and freelook would hang |
|
257 |
Driver->setMousePos(0.5f, 0.5f); |
|
258 |
#endif |
|
247 | 259 |
} |
248 | 260 | |
249 | 261 |
//********************************************************************************* |
... | ... | |
360 | 372 |
HWND drvWnd = (HWND) Driver->getDisplay(); |
361 | 373 |
if (!drvWnd) return; |
362 | 374 |
SetCapture(drvWnd); |
375 |
#else |
|
376 |
// on X11, set driver mouse capture on and store it locally as well |
|
377 |
Driver->setCapture(MouseCapture = true); |
|
363 | 378 |
#endif |
364 | 379 |
} |
365 | 380 | |
366 | 381 |
//********************************************************************************* |
367 | 382 |
void ReleaseSystemCursor() |
368 | 383 |
{ |
384 |
if (!IsSystemCursorCaptured()) return; |
|
369 | 385 |
#ifdef NL_OS_WINDOWS |
370 |
if (IsSystemCursorCaptured()) |
|
386 |
// if hardware mouse and not in client area, then force to update its aspect by updating its pos |
|
387 |
if (!IsSystemCursorInClientArea()) |
|
371 | 388 |
{ |
372 |
// if hardware mouse and not in client area, then force to update its aspect by updating its pos |
|
373 |
if (!IsSystemCursorInClientArea()) |
|
374 |
{ |
|
375 |
// force update |
|
376 |
ShowCursor(FALSE); |
|
377 |
ShowCursor(TRUE); |
|
378 |
} |
|
379 |
ReleaseCapture(); |
|
389 |
// force update |
|
390 |
ShowCursor(FALSE); |
|
391 |
ShowCursor(TRUE); |
|
380 | 392 |
} |
393 |
ReleaseCapture(); |
|
394 |
#else |
|
395 |
// on X11, set driver mouse capture off and store it locally as well |
|
396 |
Driver->setCapture(MouseCapture = false); |
|
381 | 397 |
#endif |
382 | 398 |
} |
383 | 399 | |
... | ... | |
388 | 404 |
#ifdef NL_OS_WINDOWS |
389 | 405 |
return GetCapture() == (HWND) Driver->getDisplay(); |
390 | 406 |
#else |
391 |
return false;
|
|
407 |
return MouseCapture;
|
|
392 | 408 |
#endif |
393 | 409 |
} |
394 | 410 |
b/code/ryzom/client/src/motion/user_controls.cpp Wed May 19 00:38:24 2010 +0200 | ||
---|---|---|
431 | 431 |
// The mouse may still "StandardMove" ie through a CEventMouseMove |
432 | 432 |
// This can happens cause DirectInputDisabled, or because of the "Rotation Anti-Lag system" |
433 | 433 |
// which start to rotate before the mouse is hid and message mode passed to RawMode |
434 |
// |
|
435 |
// If we are not on Windows; on X11 there is always StandardMove/CEventMouseMove. |
|
436 |
// Currently, there is only a direct input IMouseDevice, not available on X11. |
|
437 | ||
438 |
#ifdef NL_OS_WINDOWS |
|
434 | 439 |
extern IMouseDevice *MouseDevice; |
435 | 440 |
if (MouseDevice) |
436 | 441 |
{ |
... | ... | |
446 | 451 |
EventsListener.updateFreeLookPos(dmpx, dmpy); |
447 | 452 |
} |
448 | 453 |
} |
454 |
#else |
|
455 |
// On X11, do the thing without IMouseDevice implementation |
|
456 |
if( EventsListener.getMousePosX() != _LastFrameMousePosX || |
|
457 |
EventsListener.getMousePosY() != _LastFrameMousePosY ) |
|
458 |
{ |
|
459 |
float dmpx, dmpy; |
|
460 |
|
|
461 |
// On X11 in free look mode, the mouse is pulled back to (0.5, 0.5) |
|
462 |
// every update to prevent reaching a border and get stuck. |
|
463 |
if(IsMouseFreeLook()) |
|
464 |
{ |
|
465 |
dmpx = EventsListener.getMousePosX() - 0.5; |
|
466 |
dmpy = EventsListener.getMousePosY() - 0.5; |
|
467 |
} |
|
468 |
else |
|
469 |
{ |
|
470 |
dmpx = EventsListener.getMousePosX() - _LastFrameMousePosX; |
|
471 |
dmpy = EventsListener.getMousePosY() - _LastFrameMousePosY; |
|
472 |
} |
|
473 |
|
|
474 |
// TODO: read desktop mouse speed value on X11 / implement X11MouseDevice |
|
475 |
dmpx *= 450.0f; |
|
476 |
dmpy *= 450.0f; |
|
477 | ||
478 |
if(ClientCfg.FreeLookInverted) dmpy = -dmpy; |
|
479 |
// update free look |
|
480 |
EventsListener.updateFreeLookPos(dmpx, dmpy); |
|
481 |
} |
|
482 |
#endif |
|
449 | 483 | |
450 | 484 |
// If the mouse move on the axis X, with a CGDMouseMove |
451 | 485 |
if(EventsListener.isMouseAngleX()) |