From 95a402d7455dcf437d0a64bb50ec8d3cee4252fd Mon Sep 17 00:00:00 2001 From: Gerasim Troeglazov <3dEyes@gmail.com> Date: Mon, 11 Nov 2019 22:21:17 -0500 Subject: [PATCH] haiku: Add support for relative mouse mode. Partially fixes Bugzilla #4442. --- src/main/haiku/SDL_BApp.h | 5 ++++- src/video/haiku/SDL_BWin.h | 36 +++++++++++------------------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/main/haiku/SDL_BApp.h b/src/main/haiku/SDL_BApp.h index f01ccda84..fca783545 100644 --- a/src/main/haiku/SDL_BApp.h +++ b/src/main/haiku/SDL_BApp.h @@ -228,7 +228,6 @@ private: return; } win = GetSDLWindow(winID); - SDL_SendMouseMotion(win, 0, 0, x, y); // Simple relative mode support for mouse. if ((SDL_GetMouse()->relative_mode || @@ -237,10 +236,14 @@ private: int winWidth, winHeight, winPosX, winPosY; SDL_GetWindowSize(win, &winWidth, &winHeight); SDL_GetWindowPosition(win, &winPosX, &winPosY); + int dx = x - (winWidth / 2); + int dy = y - (winHeight / 2); + SDL_SendMouseMotion(win, 0, SDL_GetMouse()->relative_mode, dx, dy); set_mouse_position((winPosX + winWidth / 2), (winPosY + winHeight / 2)); if (!be_app->IsCursorHidden()) be_app->HideCursor(); } else { + SDL_SendMouseMotion(win, 0, 0, x, y); if (be_app->IsCursorHidden()) be_app->ShowCursor(); } diff --git a/src/video/haiku/SDL_BWin.h b/src/video/haiku/SDL_BWin.h index 15340596b..9f79927bc 100644 --- a/src/video/haiku/SDL_BWin.h +++ b/src/video/haiku/SDL_BWin.h @@ -319,22 +319,17 @@ class SDL_BWin:public BDirectWindow && msg->FindInt32("be:transit", &transit) == B_OK) { _MouseMotionEvent(where, transit); } - - /* FIXME: Apparently a button press/release event might be dropped - if made before before a different button is released. Does - B_MOUSE_MOVED have the data needed to check if a mouse button - state has changed? */ - if (msg->FindInt32("buttons", &buttons) == B_OK) { - _MouseButtonEvent(buttons); - } break; case B_MOUSE_DOWN: - case B_MOUSE_UP: - /* _MouseButtonEvent() detects any and all buttons that may have - changed state, as well as that button's new state */ if (msg->FindInt32("buttons", &buttons) == B_OK) { - _MouseButtonEvent(buttons); + _MouseButtonEvent(buttons, SDL_PRESSED); + } + break; + + case B_MOUSE_UP: + if (msg->FindInt32("buttons", &buttons) == B_OK) { + _MouseButtonEvent(buttons, SDL_RELEASED); } break; @@ -497,26 +492,17 @@ private: if true: SDL_SetCursor(NULL); */ } - void _MouseButtonEvent(int32 buttons) { + void _MouseButtonEvent(int32 buttons, Uint8 state) { int32 buttonStateChange = buttons ^ _last_buttons; - /* Make sure at least one button has changed state */ - if( !(buttonStateChange) ) { - return; - } - - /* Add any mouse button events */ if(buttonStateChange & B_PRIMARY_MOUSE_BUTTON) { - _SendMouseButton(SDL_BUTTON_LEFT, buttons & - B_PRIMARY_MOUSE_BUTTON); + _SendMouseButton(SDL_BUTTON_LEFT, state); } if(buttonStateChange & B_SECONDARY_MOUSE_BUTTON) { - _SendMouseButton(SDL_BUTTON_RIGHT, buttons & - B_PRIMARY_MOUSE_BUTTON); + _SendMouseButton(SDL_BUTTON_RIGHT, state); } if(buttonStateChange & B_TERTIARY_MOUSE_BUTTON) { - _SendMouseButton(SDL_BUTTON_MIDDLE, buttons & - B_PRIMARY_MOUSE_BUTTON); + _SendMouseButton(SDL_BUTTON_MIDDLE, state); } _last_buttons = buttons;