1
0
Fork 0

Codechange: remove queue_wrap / last_position from mouse movement

No backend uses it anymore, so also no longer any need to support
it.
pull/10920/head
Patric Stout 2023-06-03 23:10:16 +02:00 committed by Patric Stout
parent e83f244750
commit 0d840b4570
7 changed files with 12 additions and 44 deletions

View File

@ -1897,50 +1897,22 @@ void CursorVars::UpdateCursorPositionRelative(int delta_x, int delta_y)
* Update cursor position on mouse movement. * Update cursor position on mouse movement.
* @param x New X position. * @param x New X position.
* @param y New Y position. * @param y New Y position.
* @param queued_warp True, if the OS queues mouse warps after pending mouse movement events.
* False, if the warp applies instantaneous.
* @return true, if the OS cursor position should be warped back to this->pos. * @return true, if the OS cursor position should be warped back to this->pos.
*/ */
bool CursorVars::UpdateCursorPosition(int x, int y, bool queued_warp) bool CursorVars::UpdateCursorPosition(int x, int y)
{ {
/* Detecting relative mouse movement is somewhat tricky. this->delta.x = x - this->pos.x;
* - There may be multiple mouse move events in the video driver queue (esp. when OpenTTD lags a bit). this->delta.y = y - this->pos.y;
* - When we request warping the mouse position (return true), a mouse move event is appended at the end of the queue.
*
* So, when this->fix_at is active, we use the following strategy:
* - The first movement triggers the warp to reset the mouse position.
* - Subsequent events have to compute movement relative to the previous event.
* - The relative movement is finished, when we receive the event matching the warp.
*/
if (x == this->pos.x && y == this->pos.y) {
/* Warp finished. */
this->queued_warp = false;
}
this->delta.x = x - (this->queued_warp ? this->last_position.x : this->pos.x);
this->delta.y = y - (this->queued_warp ? this->last_position.y : this->pos.y);
this->last_position.x = x;
this->last_position.y = y;
bool need_warp = false;
if (this->fix_at) { if (this->fix_at) {
if (this->delta.x != 0 || this->delta.y != 0) { return this->delta.x != 0 || this->delta.y != 0;
/* Trigger warp.
* Note: We also trigger warping again, if there is already a pending warp.
* This makes it more tolerant about the OS or other software in between
* botchering the warp. */
this->queued_warp = queued_warp;
need_warp = true;
}
} else if (this->pos.x != x || this->pos.y != y) { } else if (this->pos.x != x || this->pos.y != y) {
this->queued_warp = false; // Cancel warping, we are no longer confining the position.
this->dirty = true; this->dirty = true;
this->pos.x = x; this->pos.x = x;
this->pos.y = y; this->pos.y = y;
} }
return need_warp;
return false;
} }
bool ChangeResInGame(int width, int height) bool ChangeResInGame(int width, int height)

View File

@ -144,11 +144,7 @@ struct CursorVars {
bool vehchain; ///< vehicle chain is dragged bool vehchain; ///< vehicle chain is dragged
void UpdateCursorPositionRelative(int delta_x, int delta_y); void UpdateCursorPositionRelative(int delta_x, int delta_y);
bool UpdateCursorPosition(int x, int y, bool queued_warp); bool UpdateCursorPosition(int x, int y);
private:
bool queued_warp;
Point last_position;
}; };
/** Data about how and where to blit pixels. */ /** Data about how and where to blit pixels. */

View File

@ -391,7 +391,7 @@ bool VideoDriver_Allegro::PollEvent()
} }
/* Mouse movement */ /* Mouse movement */
if (_cursor.UpdateCursorPosition(mouse_x, mouse_y, false)) { if (_cursor.UpdateCursorPosition(mouse_x, mouse_y)) {
position_mouse(_cursor.pos.x, _cursor.pos.y); position_mouse(_cursor.pos.x, _cursor.pos.y);
} }
if (_cursor.delta.x != 0 || _cursor.delta.y) mouse_action = true; if (_cursor.delta.x != 0 || _cursor.delta.y) mouse_action = true;

View File

@ -658,7 +658,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
_cursor.UpdateCursorPositionRelative(event.deltaX * self.getContentsScale, event.deltaY * self.getContentsScale); _cursor.UpdateCursorPositionRelative(event.deltaX * self.getContentsScale, event.deltaY * self.getContentsScale);
} else { } else {
NSPoint pt = [ self mousePositionFromEvent:event ]; NSPoint pt = [ self mousePositionFromEvent:event ];
_cursor.UpdateCursorPosition(pt.x, pt.y, false); _cursor.UpdateCursorPosition(pt.x, pt.y);
} }
HandleMouseEvents(); HandleMouseEvents();

View File

@ -384,7 +384,7 @@ bool VideoDriver_SDL_Base::PollEvent()
} }
} }
if (_cursor.UpdateCursorPosition(x, y, false)) { if (_cursor.UpdateCursorPosition(x, y)) {
SDL_WarpMouseInWindow(this->sdl_window, _cursor.pos.x, _cursor.pos.y); SDL_WarpMouseInWindow(this->sdl_window, _cursor.pos.x, _cursor.pos.y);
} }
HandleMouseEvents(); HandleMouseEvents();

View File

@ -491,7 +491,7 @@ bool VideoDriver_SDL::PollEvent()
} }
} }
if (_cursor.UpdateCursorPosition(x, y, false)) { if (_cursor.UpdateCursorPosition(x, y)) {
SDL_WarpMouse(_cursor.pos.x, _cursor.pos.y); SDL_WarpMouse(_cursor.pos.x, _cursor.pos.y);
} }
HandleMouseEvents(); HandleMouseEvents();

View File

@ -490,7 +490,7 @@ LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
} }
} }
if (_cursor.UpdateCursorPosition(x, y, false)) { if (_cursor.UpdateCursorPosition(x, y)) {
POINT pt; POINT pt;
pt.x = _cursor.pos.x; pt.x = _cursor.pos.x;
pt.y = _cursor.pos.y; pt.y = _cursor.pos.y;