haiku: Add support for relative mouse mode. Partially fixes Bugzilla #4442.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
diff --git a/src/main/haiku/SDL_BApp.h b/src/main/haiku/SDL_BApp.h
index f01ccda..fca7835 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 1534059..9f79927 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);
}
+ break;
- /* 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? */
+ case B_MOUSE_DOWN:
if (msg->FindInt32("buttons", &buttons) == B_OK) {
- _MouseButtonEvent(buttons);
+ _MouseButtonEvent(buttons, SDL_PRESSED);
}
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_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;