Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
haiku: Add support for relative mouse mode.
Partially fixes Bugzilla #4442.
- Loading branch information
Showing
with
12 additions
and
23 deletions.
-
+4
−1
src/main/haiku/SDL_BApp.h
-
+8
−22
src/video/haiku/SDL_BWin.h
|
@@ -228,7 +228,6 @@ class SDL_BApp : public BApplication { |
|
|
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 @@ class SDL_BApp : public BApplication { |
|
|
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(); |
|
|
} |
|
|
|
@@ -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 @@ class SDL_BWin:public BDirectWindow |
|
|
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; |
|
|