SDL  2.0
SDL_mouse.c File Reference
#include "../SDL_internal.h"
#include "SDL_assert.h"
#include "SDL_hints.h"
#include "SDL_timer.h"
#include "SDL_events.h"
#include "SDL_events_c.h"
#include "../video/SDL_sysvideo.h"
+ Include dependency graph for SDL_mouse.c:

Go to the source code of this file.

Functions

static int SDL_PrivateSendMouseMotion (SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
static void SDL_MouseDoubleClickTimeChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
static void SDL_MouseDoubleClickRadiusChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
static void SDL_MouseNormalSpeedScaleChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
static void SDL_MouseRelativeSpeedScaleChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
static void SDL_TouchMouseEventsChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
int SDL_MouseInit (void)
void SDL_SetDefaultCursor (SDL_Cursor *cursor)
SDL_MouseSDL_GetMouse (void)
SDL_WindowSDL_GetMouseFocus (void)
 Get the window which currently has mouse focus.
void SDL_SetMouseFocus (SDL_Window *window)
static SDL_bool SDL_UpdateMouseFocus (SDL_Window *window, int x, int y, Uint32 buttonstate)
int SDL_SendMouseMotion (SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
static int GetScaledMouseDelta (float scale, int value, float *accum)
static SDL_MouseClickStateGetMouseClickState (SDL_Mouse *mouse, Uint8 button)
static int SDL_PrivateSendMouseButton (SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks)
int SDL_SendMouseButtonClicks (SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks)
int SDL_SendMouseButton (SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
int SDL_SendMouseWheel (SDL_Window *window, SDL_MouseID mouseID, float x, float y, SDL_MouseWheelDirection direction)
void SDL_MouseQuit (void)
Uint32 SDL_GetMouseState (int *x, int *y)
 Retrieve the current state of the mouse.
Uint32 SDL_GetRelativeMouseState (int *x, int *y)
 Retrieve the relative state of the mouse.
Uint32 SDL_GetGlobalMouseState (int *x, int *y)
 Get the current state of the mouse, in relation to the desktop.
void SDL_WarpMouseInWindow (SDL_Window *window, int x, int y)
 Moves the mouse to the given position within the window.
int SDL_WarpMouseGlobal (int x, int y)
 Moves the mouse to the given position in global screen space.
static SDL_bool ShouldUseRelativeModeWarp (SDL_Mouse *mouse)
int SDL_SetRelativeMouseMode (SDL_bool enabled)
 Set relative mouse mode.
SDL_bool SDL_GetRelativeMouseMode ()
 Query whether relative mouse mode is enabled.
int SDL_CaptureMouse (SDL_bool enabled)
 Capture the mouse, to track input outside an SDL window.
SDL_CursorSDL_CreateCursor (const Uint8 *data, const Uint8 *mask, int w, int h, int hot_x, int hot_y)
 Create a cursor, using the specified bitmap data and mask (in MSB format).
SDL_CursorSDL_CreateColorCursor (SDL_Surface *surface, int hot_x, int hot_y)
 Create a color cursor.
SDL_CursorSDL_CreateSystemCursor (SDL_SystemCursor id)
 Create a system cursor.
void SDL_SetCursor (SDL_Cursor *cursor)
 Set the active cursor.
SDL_CursorSDL_GetCursor (void)
 Return the active cursor.
SDL_CursorSDL_GetDefaultCursor (void)
 Return the default cursor.
void SDL_FreeCursor (SDL_Cursor *cursor)
 Frees a cursor created with SDL_CreateCursor() or similar functions.
int SDL_ShowCursor (int toggle)
 Toggle whether or not the cursor is shown.

Variables

static SDL_Mouse SDL_mouse

Function Documentation

static SDL_MouseClickState* GetMouseClickState ( SDL_Mouse mouse,
Uint8  button 
)
static

Definition at line 421 of file SDL_mouse.c.

References button, SDL_Mouse::clickstate, i, NULL, SDL_Mouse::num_clickstates, SDL_realloc, and SDL_zero.

Referenced by SDL_PrivateSendMouseButton().

{
if (button >= mouse->num_clickstates) {
int i, count = button + 1;
SDL_MouseClickState *clickstate = (SDL_MouseClickState *)SDL_realloc(mouse->clickstate, count * sizeof(*mouse->clickstate));
if (!clickstate) {
return NULL;
}
mouse->clickstate = clickstate;
for (i = mouse->num_clickstates; i < count; ++i) {
SDL_zero(mouse->clickstate[i]);
}
}
return &mouse->clickstate[button];
}
static int GetScaledMouseDelta ( float  scale,
int  value,
float *  accum 
)
static

Definition at line 276 of file SDL_mouse.c.

References SDL_ceil, and SDL_floor.

Referenced by SDL_PrivateSendMouseMotion().

{
if (scale != 1.0f) {
*accum += scale * value;
if (*accum >= 0.0f) {
value = (int)SDL_floor(*accum);
} else {
value = (int)SDL_ceil(*accum);
}
*accum -= value;
}
return value;
}
int SDL_CaptureMouse ( SDL_bool  enabled)

Capture the mouse, to track input outside an SDL window.

Parameters
enabledWhether or not to enable capturing

Capturing enables your app to obtain mouse events globally, instead of just within your window. Not all video targets support this function. When capturing is enabled, the current window will get all mouse events, but unlike relative mode, no change is made to the cursor and it is not restrained to your window.

This function may also deny mouse input to other windows–both those in your application and others on the system–so you should use this function sparingly, and in small bursts. For example, you might want to track the mouse while the user is dragging something, until the user releases a mouse button. It is not recommended that you capture the mouse for long periods of time, such as the entire time your app is running.

While captured, mouse events still report coordinates relative to the current (foreground) window, but those coordinates may be outside the bounds of the window (including negative values). Capturing is only allowed for the foreground window. If the window loses focus while capturing, the capture will be disabled automatically.

While capturing is enabled, the current window will have the SDL_WINDOW_MOUSE_CAPTURE flag set.

Returns
0 on success, or -1 if not supported.

Definition at line 787 of file SDL_mouse.c.

References SDL_Mouse::CaptureMouse, SDL_Window::flags, NULL, SDL_GetKeyboardFocus, SDL_GetMouse(), SDL_SetError, SDL_Unsupported, and SDL_WINDOW_MOUSE_CAPTURE.

{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_Window *focusWindow;
SDL_bool isCaptured;
if (!mouse->CaptureMouse) {
return SDL_Unsupported();
}
focusWindow = SDL_GetKeyboardFocus();
isCaptured = focusWindow && (focusWindow->flags & SDL_WINDOW_MOUSE_CAPTURE);
if (isCaptured == enabled) {
return 0; /* already done! */
}
if (enabled) {
if (!focusWindow) {
return SDL_SetError("No window has focus");
} else if (mouse->CaptureMouse(focusWindow) == -1) {
return -1; /* CaptureMouse() should call SetError */
}
} else {
if (mouse->CaptureMouse(NULL) == -1) {
return -1; /* CaptureMouse() should call SetError */
}
focusWindow->flags &= ~SDL_WINDOW_MOUSE_CAPTURE;
}
return 0;
}
SDL_Cursor* SDL_CreateColorCursor ( SDL_Surface surface,
int  hot_x,
int  hot_y 
)

Create a color cursor.

See Also
SDL_FreeCursor()

Definition at line 871 of file SDL_mouse.c.

References SDL_Mouse::CreateCursor, cursor, SDL_Mouse::cursors, SDL_Surface::format, SDL_PixelFormat::format, SDL_Surface::h, SDL_Cursor::next, NULL, SDL_ConvertSurfaceFormat, SDL_FreeSurface, SDL_GetMouse(), SDL_PIXELFORMAT_ARGB8888, SDL_SetError, and SDL_Surface::w.

{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_Surface *temp = NULL;
if (!surface) {
SDL_SetError("Passed NULL cursor surface");
return NULL;
}
if (!mouse->CreateCursor) {
SDL_SetError("Cursors are not currently supported");
return NULL;
}
/* Sanity check the hot spot */
if ((hot_x < 0) || (hot_y < 0) ||
(hot_x >= surface->w) || (hot_y >= surface->h)) {
SDL_SetError("Cursor hot spot doesn't lie within cursor");
return NULL;
}
if (!temp) {
return NULL;
}
surface = temp;
}
cursor = mouse->CreateCursor(surface, hot_x, hot_y);
if (cursor) {
cursor->next = mouse->cursors;
mouse->cursors = cursor;
}
return cursor;
}
SDL_Cursor* SDL_CreateCursor ( const Uint8 data,
const Uint8 mask,
int  w,
int  h,
int  hot_x,
int  hot_y 
)

Create a cursor, using the specified bitmap data and mask (in MSB format).

The cursor width must be a multiple of 8 bits.

The cursor is created in black and white according to the following:

data mask resulting pixel on screen
0 1 White
1 1 Black
0 0 Transparent
1 0 Inverted color if possible, black if not.
See Also
SDL_FreeCursor()

Definition at line 822 of file SDL_mouse.c.

References cursor, NULL, SDL_Surface::pitch, SDL_Surface::pixels, SDL_CreateColorCursor, SDL_CreateRGBSurface, and SDL_FreeSurface.

{
int x, y;
Uint32 *pixel;
Uint8 datab = 0, maskb = 0;
const Uint32 black = 0xFF000000;
const Uint32 white = 0xFFFFFFFF;
const Uint32 transparent = 0x00000000;
/* Make sure the width is a multiple of 8 */
w = ((w + 7) & ~7);
/* Create the surface from a bitmap */
surface = SDL_CreateRGBSurface(0, w, h, 32,
0x00FF0000,
0x0000FF00,
0x000000FF,
0xFF000000);
if (!surface) {
return NULL;
}
for (y = 0; y < h; ++y) {
pixel = (Uint32 *) ((Uint8 *) surface->pixels + y * surface->pitch);
for (x = 0; x < w; ++x) {
if ((x % 8) == 0) {
datab = *data++;
maskb = *mask++;
}
if (maskb & 0x80) {
*pixel++ = (datab & 0x80) ? black : white;
} else {
*pixel++ = (datab & 0x80) ? black : transparent;
}
datab <<= 1;
maskb <<= 1;
}
}
cursor = SDL_CreateColorCursor(surface, hot_x, hot_y);
SDL_FreeSurface(surface);
return cursor;
}
SDL_Cursor* SDL_CreateSystemCursor ( SDL_SystemCursor  id)

Create a system cursor.

See Also
SDL_FreeCursor()

Definition at line 914 of file SDL_mouse.c.

References SDL_Mouse::CreateSystemCursor, cursor, SDL_Mouse::cursors, SDL_Cursor::next, NULL, SDL_GetMouse(), and SDL_SetError.

{
SDL_Mouse *mouse = SDL_GetMouse();
if (!mouse->CreateSystemCursor) {
SDL_SetError("CreateSystemCursor is not currently supported");
return NULL;
}
cursor = mouse->CreateSystemCursor(id);
if (cursor) {
cursor->next = mouse->cursors;
mouse->cursors = cursor;
}
return cursor;
}
void SDL_FreeCursor ( SDL_Cursor cursor)

Frees a cursor created with SDL_CreateCursor() or similar functions.

See Also
SDL_CreateCursor()
SDL_CreateColorCursor()
SDL_CreateSystemCursor()

Definition at line 1000 of file SDL_mouse.c.

References SDL_Mouse::cur_cursor, SDL_Mouse::cursors, SDL_Mouse::def_cursor, SDL_Mouse::FreeCursor, SDL_Cursor::next, NULL, SDL_GetMouse(), and SDL_SetCursor.

{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_Cursor *curr, *prev;
if (!cursor) {
return;
}
if (cursor == mouse->def_cursor) {
return;
}
if (cursor == mouse->cur_cursor) {
}
for (prev = NULL, curr = mouse->cursors; curr;
prev = curr, curr = curr->next) {
if (curr == cursor) {
if (prev) {
prev->next = curr->next;
} else {
mouse->cursors = curr->next;
}
if (mouse->FreeCursor) {
mouse->FreeCursor(curr);
}
return;
}
}
}
SDL_Cursor* SDL_GetCursor ( void  )

Return the active cursor.

Definition at line 978 of file SDL_mouse.c.

References SDL_Mouse::cur_cursor, NULL, and SDL_GetMouse().

{
SDL_Mouse *mouse = SDL_GetMouse();
if (!mouse) {
return NULL;
}
return mouse->cur_cursor;
}
SDL_Cursor* SDL_GetDefaultCursor ( void  )

Return the default cursor.

Definition at line 989 of file SDL_mouse.c.

References SDL_Mouse::def_cursor, NULL, and SDL_GetMouse().

{
SDL_Mouse *mouse = SDL_GetMouse();
if (!mouse) {
return NULL;
}
return mouse->def_cursor;
}
Uint32 SDL_GetGlobalMouseState ( int *  x,
int *  y 
)

Get the current state of the mouse, in relation to the desktop.

This works just like SDL_GetMouseState(), but the coordinates will be reported relative to the top-left of the desktop. This can be useful if you need to track the mouse outside of a specific window and SDL_CaptureMouse() doesn't fit your needs. For example, it could be useful if you need to track the mouse while dragging a window, where coordinates relative to a window might not be in sync at all times.

Note
SDL_GetMouseState() returns the mouse position as SDL understands it from the last pump of the event queue. This function, however, queries the OS for the current mouse position, and as such, might be a slightly less efficient function. Unless you know what you're doing and have a good reason to use this function, you probably want SDL_GetMouseState() instead.
Parameters
xReturns the current X coord, relative to the desktop. Can be NULL.
yReturns the current Y coord, relative to the desktop. Can be NULL.
Returns
The current button state as a bitmask, which can be tested using the SDL_BUTTON(X) macros.
See Also
SDL_GetMouseState

Definition at line 659 of file SDL_mouse.c.

References SDL_Mouse::GetGlobalMouseState, and SDL_GetMouse().

{
SDL_Mouse *mouse = SDL_GetMouse();
int tmpx, tmpy;
/* make sure these are never NULL for the backend implementations... */
if (!x) {
x = &tmpx;
}
if (!y) {
y = &tmpy;
}
*x = *y = 0;
if (!mouse->GetGlobalMouseState) {
return 0;
}
return mouse->GetGlobalMouseState(x, y);
}
SDL_Window* SDL_GetMouseFocus ( void  )

Get the window which currently has mouse focus.

Definition at line 150 of file SDL_mouse.c.

References SDL_Mouse::focus, and SDL_GetMouse().

{
SDL_Mouse *mouse = SDL_GetMouse();
return mouse->focus;
}
Uint32 SDL_GetMouseState ( int *  x,
int *  y 
)

Retrieve the current state of the mouse.

The current button state is returned as a button bitmask, which can be tested using the SDL_BUTTON(X) macros, and x and y are set to the mouse cursor position relative to the focus window for the currently selected mouse. You can pass NULL for either x or y.

Definition at line 629 of file SDL_mouse.c.

References SDL_Mouse::buttonstate, SDL_GetMouse(), SDL_Mouse::x, and SDL_Mouse::y.

{
SDL_Mouse *mouse = SDL_GetMouse();
if (x) {
*x = mouse->x;
}
if (y) {
*y = mouse->y;
}
return mouse->buttonstate;
}
SDL_bool SDL_GetRelativeMouseMode ( void  )

Query whether relative mouse mode is enabled.

See Also
SDL_SetRelativeMouseMode()

Definition at line 779 of file SDL_mouse.c.

References SDL_Mouse::relative_mode, and SDL_GetMouse().

{
SDL_Mouse *mouse = SDL_GetMouse();
return mouse->relative_mode;
}
Uint32 SDL_GetRelativeMouseState ( int *  x,
int *  y 
)

Retrieve the relative state of the mouse.

The current button state is returned as a button bitmask, which can be tested using the SDL_BUTTON(X) macros, and x and y are set to the mouse deltas since the last call to SDL_GetRelativeMouseState().

Definition at line 643 of file SDL_mouse.c.

References SDL_Mouse::buttonstate, SDL_GetMouse(), SDL_Mouse::xdelta, and SDL_Mouse::ydelta.

{
SDL_Mouse *mouse = SDL_GetMouse();
if (x) {
*x = mouse->xdelta;
}
if (y) {
*y = mouse->ydelta;
}
mouse->xdelta = 0;
mouse->ydelta = 0;
return mouse->buttonstate;
}
static void SDL_MouseDoubleClickRadiusChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static

Definition at line 57 of file SDL_mouse.c.

References SDL_Mouse::double_click_radius, and SDL_atoi.

Referenced by SDL_MouseInit().

{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
if (hint && *hint) {
mouse->double_click_radius = SDL_atoi(hint);
} else {
mouse->double_click_radius = 32; /* 32 pixels seems about right for touch interfaces */
}
}
static void SDL_MouseDoubleClickTimeChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static

Definition at line 41 of file SDL_mouse.c.

References SDL_Mouse::double_click_time, and SDL_atoi.

Referenced by SDL_MouseInit().

{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
if (hint && *hint) {
mouse->double_click_time = SDL_atoi(hint);
} else {
#ifdef __WIN32__
mouse->double_click_time = GetDoubleClickTime();
#else
mouse->double_click_time = 500;
#endif
}
}
static void SDL_MouseNormalSpeedScaleChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static

Definition at line 69 of file SDL_mouse.c.

References SDL_Mouse::normal_speed_scale, and SDL_atof.

Referenced by SDL_MouseInit(), and SDL_MouseQuit().

{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
if (hint && *hint) {
mouse->normal_speed_scale = (float)SDL_atof(hint);
} else {
mouse->normal_speed_scale = 1.0f;
}
}
static void SDL_MouseRelativeSpeedScaleChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static

Definition at line 81 of file SDL_mouse.c.

References SDL_Mouse::relative_speed_scale, and SDL_atof.

Referenced by SDL_MouseInit(), and SDL_MouseQuit().

{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
if (hint && *hint) {
mouse->relative_speed_scale = (float)SDL_atof(hint);
} else {
mouse->relative_speed_scale = 1.0f;
}
}
static int SDL_PrivateSendMouseButton ( SDL_Window window,
SDL_MouseID  mouseID,
Uint8  state,
Uint8  button,
int  clicks 
)
static

Definition at line 440 of file SDL_mouse.c.

References button, SDL_Mouse::buttonstate, SDL_MouseClickState::click_count, SDL_Mouse::double_click_radius, SDL_Mouse::double_click_time, SDL_Mouse::focus, GetMouseClickState(), SDL_Window::id, SDL_MouseClickState::last_timestamp, SDL_MouseClickState::last_x, SDL_MouseClickState::last_y, SDL_abs, SDL_BUTTON, SDL_ENABLE, SDL_GetEventState, SDL_GetMouse(), SDL_GetTicks(), SDL_min, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_PRESSED, SDL_PushEvent, SDL_RELEASED, SDL_TICKS_PASSED, SDL_TOUCH_MOUSEID, SDL_UpdateMouseFocus(), state, SDL_Mouse::touch_mouse_events, SDL_Mouse::x, and SDL_Mouse::y.

Referenced by SDL_SendMouseButton(), and SDL_SendMouseButtonClicks().

{
SDL_Mouse *mouse = SDL_GetMouse();
int posted;
Uint32 buttonstate = mouse->buttonstate;
if (mouseID == SDL_TOUCH_MOUSEID && !mouse->touch_mouse_events) {
return 0;
}
/* Figure out which event to perform */
switch (state) {
buttonstate |= SDL_BUTTON(button);
break;
buttonstate &= ~SDL_BUTTON(button);
break;
default:
/* Invalid state -- bail */
return 0;
}
/* We do this after calculating buttonstate so button presses gain focus */
if (window && state == SDL_PRESSED) {
SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate);
}
if (buttonstate == mouse->buttonstate) {
/* Ignore this event, no state change */
return 0;
}
mouse->buttonstate = buttonstate;
if (clicks < 0) {
if (clickstate) {
if (state == SDL_PRESSED) {
if (SDL_TICKS_PASSED(now, clickstate->last_timestamp + mouse->double_click_time) ||
SDL_abs(mouse->x - clickstate->last_x) > mouse->double_click_radius ||
SDL_abs(mouse->y - clickstate->last_y) > mouse->double_click_radius) {
clickstate->click_count = 0;
}
clickstate->last_timestamp = now;
clickstate->last_x = mouse->x;
clickstate->last_y = mouse->y;
if (clickstate->click_count < 255) {
++clickstate->click_count;
}
}
clicks = clickstate->click_count;
} else {
clicks = 1;
}
}
/* Post the event, if desired */
posted = 0;
if (SDL_GetEventState(type) == SDL_ENABLE) {
event.type = type;
event.button.windowID = mouse->focus ? mouse->focus->id : 0;
event.button.which = mouseID;
event.button.state = state;
event.button.button = button;
event.button.clicks = (Uint8) SDL_min(clicks, 255);
event.button.x = mouse->x;
event.button.y = mouse->y;
posted = (SDL_PushEvent(&event) > 0);
}
/* We do this after dispatching event so button releases can lose focus */
if (window && state == SDL_RELEASED) {
SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate);
}
return posted;
}
static int SDL_PrivateSendMouseMotion ( SDL_Window window,
SDL_MouseID  mouseID,
int  relative,
int  x,
int  y 
)
static

Definition at line 291 of file SDL_mouse.c.

References SDL_Mouse::buttonstate, SDL_Mouse::cur_cursor, SDL_Mouse::cursor_shown, SDL_Window::flags, SDL_Mouse::focus, GetScaledMouseDelta(), SDL_Mouse::has_position, SDL_Window::id, SDL_Mouse::last_x, SDL_Mouse::last_y, SDL_Mouse::MoveCursor, SDL_Mouse::normal_speed_scale, SDL_Mouse::relative_mode, SDL_Mouse::relative_mode_warp, SDL_Mouse::relative_speed_scale, SDL_Mouse::scale_accum_x, SDL_Mouse::scale_accum_y, SDL_ENABLE, SDL_GetEventState, SDL_GetMouse(), SDL_GetWindowSize, SDL_MOUSEMOTION, SDL_PushEvent, SDL_TOUCH_MOUSEID, SDL_TRUE, SDL_WarpMouseInWindow, SDL_WINDOW_MOUSE_CAPTURE, SDL_Mouse::touch_mouse_events, SDL_Mouse::x, SDL_Mouse::xdelta, SDL_Mouse::y, and SDL_Mouse::ydelta.

Referenced by SDL_SendMouseMotion(), and SDL_UpdateMouseFocus().

{
SDL_Mouse *mouse = SDL_GetMouse();
int posted;
int xrel;
int yrel;
if (mouseID == SDL_TOUCH_MOUSEID && !mouse->touch_mouse_events) {
return 0;
}
if (mouseID != SDL_TOUCH_MOUSEID && mouse->relative_mode_warp) {
int center_x = 0, center_y = 0;
SDL_GetWindowSize(window, &center_x, &center_y);
center_x /= 2;
center_y /= 2;
if (x == center_x && y == center_y) {
mouse->last_x = center_x;
mouse->last_y = center_y;
return 0;
}
SDL_WarpMouseInWindow(window, center_x, center_y);
}
if (relative) {
if (mouse->relative_mode) {
} else {
}
xrel = x;
yrel = y;
x = (mouse->last_x + xrel);
y = (mouse->last_y + yrel);
} else {
xrel = x - mouse->last_x;
yrel = y - mouse->last_y;
}
/* Drop events that don't change state */
if (!xrel && !yrel) {
#ifdef DEBUG_MOUSE
printf("Mouse event didn't change state - dropped!\n");
#endif
return 0;
}
/* Ignore relative motion when first positioning the mouse */
if (!mouse->has_position) {
xrel = 0;
yrel = 0;
}
/* Ignore relative motion positioning the first touch */
if (mouseID == SDL_TOUCH_MOUSEID && !mouse->buttonstate) {
xrel = 0;
yrel = 0;
}
/* Update internal mouse coordinates */
if (!mouse->relative_mode) {
mouse->x = x;
mouse->y = y;
} else {
mouse->x += xrel;
mouse->y += yrel;
}
/* make sure that the pointers find themselves inside the windows,
unless we have the mouse captured. */
if (window && ((window->flags & SDL_WINDOW_MOUSE_CAPTURE) == 0)) {
int x_max = 0, y_max = 0;
/* !!! FIXME: shouldn't this be (window) instead of (mouse->focus)? */
SDL_GetWindowSize(mouse->focus, &x_max, &y_max);
--x_max;
--y_max;
if (mouse->x > x_max) {
mouse->x = x_max;
}
if (mouse->x < 0) {
mouse->x = 0;
}
if (mouse->y > y_max) {
mouse->y = y_max;
}
if (mouse->y < 0) {
mouse->y = 0;
}
}
mouse->xdelta += xrel;
mouse->ydelta += yrel;
/* Move the mouse cursor, if needed */
if (mouse->cursor_shown && !mouse->relative_mode &&
mouse->MoveCursor && mouse->cur_cursor) {
mouse->MoveCursor(mouse->cur_cursor);
}
/* Post the event, if desired */
posted = 0;
event.motion.type = SDL_MOUSEMOTION;
event.motion.windowID = mouse->focus ? mouse->focus->id : 0;
event.motion.which = mouseID;
event.motion.state = mouse->buttonstate;
event.motion.x = mouse->x;
event.motion.y = mouse->y;
event.motion.xrel = xrel;
event.motion.yrel = yrel;
posted = (SDL_PushEvent(&event) > 0);
}
if (relative) {
mouse->last_x = mouse->x;
mouse->last_y = mouse->y;
} else {
/* Use unclamped values if we're getting events outside the window */
mouse->last_x = x;
mouse->last_y = y;
}
return posted;
}
int SDL_SendMouseButton ( SDL_Window window,
SDL_MouseID  mouseID,
Uint8  state,
Uint8  button 
)

Definition at line 532 of file SDL_mouse.c.

References SDL_PrivateSendMouseButton().

Referenced by SDL_BApp::_HandleMouseButton().

{
return SDL_PrivateSendMouseButton(window, mouseID, state, button, -1);
}
int SDL_SendMouseButtonClicks ( SDL_Window window,
SDL_MouseID  mouseID,
Uint8  state,
Uint8  button,
int  clicks 
)

Definition at line 525 of file SDL_mouse.c.

References SDL_max, and SDL_PrivateSendMouseButton().

{
clicks = SDL_max(clicks, 0);
return SDL_PrivateSendMouseButton(window, mouseID, state, button, clicks);
}
int SDL_SendMouseMotion ( SDL_Window window,
SDL_MouseID  mouseID,
int  relative,
int  x,
int  y 
)

Definition at line 263 of file SDL_mouse.c.

References SDL_Mouse::buttonstate, SDL_GetMouse(), SDL_PrivateSendMouseMotion(), and SDL_UpdateMouseFocus().

Referenced by SDL_BApp::_HandleMouseMove(), and SDL_WarpMouseInWindow().

{
if (window && !relative) {
SDL_Mouse *mouse = SDL_GetMouse();
if (!SDL_UpdateMouseFocus(window, x, y, mouse->buttonstate)) {
return 0;
}
}
return SDL_PrivateSendMouseMotion(window, mouseID, relative, x, y);
}
int SDL_SendMouseWheel ( SDL_Window window,
SDL_MouseID  mouseID,
float  x,
float  y,
SDL_MouseWheelDirection  direction 
)

Definition at line 538 of file SDL_mouse.c.

References SDL_Mouse::accumulated_wheel_x, SDL_Mouse::accumulated_wheel_y, SDL_Mouse::focus, SDL_Window::id, SDL_ceil, SDL_ENABLE, SDL_floor, SDL_GetEventState, SDL_GetMouse(), SDL_MOUSEWHEEL, SDL_PushEvent, and SDL_SetMouseFocus().

Referenced by SDL_BApp::_HandleMouseWheel().

{
SDL_Mouse *mouse = SDL_GetMouse();
int posted;
int integral_x, integral_y;
if (window) {
}
if (!x && !y) {
return 0;
}
if (mouse->accumulated_wheel_x > 0) {
integral_x = (int)SDL_floor(mouse->accumulated_wheel_x);
} else if (mouse->accumulated_wheel_x < 0) {
integral_x = (int)SDL_ceil(mouse->accumulated_wheel_x);
} else {
integral_x = 0;
}
mouse->accumulated_wheel_x -= integral_x;
if (mouse->accumulated_wheel_y > 0) {
integral_y = (int)SDL_floor(mouse->accumulated_wheel_y);
} else if (mouse->accumulated_wheel_y < 0) {
integral_y = (int)SDL_ceil(mouse->accumulated_wheel_y);
} else {
integral_y = 0;
}
mouse->accumulated_wheel_y -= integral_y;
/* Post the event, if desired */
posted = 0;
event.type = SDL_MOUSEWHEEL;
event.wheel.windowID = mouse->focus ? mouse->focus->id : 0;
event.wheel.which = mouseID;
#if 0 /* Uncomment this when it goes in for SDL 2.1 */
event.wheel.preciseX = x;
event.wheel.preciseY = y;
#endif
event.wheel.x = integral_x;
event.wheel.y = integral_y;
event.wheel.direction = (Uint32)direction;
posted = (SDL_PushEvent(&event) > 0);
}
return posted;
}
void SDL_SetCursor ( SDL_Cursor cursor)

Set the active cursor.

Definition at line 938 of file SDL_mouse.c.

References SDL_Mouse::cur_cursor, cursor, SDL_Mouse::cursor_shown, SDL_Mouse::cursors, SDL_Mouse::def_cursor, SDL_Mouse::focus, SDL_Cursor::next, NULL, SDL_Mouse::relative_mode, SDL_GetMouse(), SDL_SetError, and SDL_Mouse::ShowCursor.

{
SDL_Mouse *mouse = SDL_GetMouse();
/* Set the new cursor */
if (cursor) {
/* Make sure the cursor is still valid for this mouse */
if (cursor != mouse->def_cursor) {
SDL_Cursor *found;
for (found = mouse->cursors; found; found = found->next) {
if (found == cursor) {
break;
}
}
if (!found) {
SDL_SetError("Cursor not associated with the current mouse");
return;
}
}
mouse->cur_cursor = cursor;
} else {
if (mouse->focus) {
cursor = mouse->cur_cursor;
} else {
cursor = mouse->def_cursor;
}
}
if (cursor && mouse->cursor_shown && !mouse->relative_mode) {
if (mouse->ShowCursor) {
mouse->ShowCursor(cursor);
}
} else {
if (mouse->ShowCursor) {
mouse->ShowCursor(NULL);
}
}
}
void SDL_SetDefaultCursor ( SDL_Cursor cursor)

Definition at line 133 of file SDL_mouse.c.

References SDL_Mouse::cur_cursor, cursor, SDL_Mouse::def_cursor, SDL_GetMouse(), and SDL_SetCursor.

{
SDL_Mouse *mouse = SDL_GetMouse();
mouse->def_cursor = cursor;
if (!mouse->cur_cursor) {
SDL_SetCursor(cursor);
}
}
void SDL_SetMouseFocus ( SDL_Window window)

Definition at line 177 of file SDL_mouse.c.

References SDL_Mouse::focus, SDL_Mouse::has_position, NULL, SDL_FALSE, SDL_GetMouse(), SDL_SendWindowEvent(), SDL_SetCursor, SDL_WINDOWEVENT_ENTER, and SDL_WINDOWEVENT_LEAVE.

Referenced by SDL_BApp::_HandleMouseFocus(), SDL_DestroyWindow(), SDL_OnWindowFocusGained(), SDL_SendMouseWheel(), SDL_SetRelativeMouseMode(), and SDL_UpdateMouseFocus().

{
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->focus == window) {
return;
}
/* Actually, this ends up being a bad idea, because most operating
systems have an implicit grab when you press the mouse button down
so you can drag things out of the window and then get the mouse up
when it happens. So, #if 0...
*/
#if 0
if (mouse->focus && !window) {
/* We won't get anymore mouse messages, so reset mouse state */
SDL_ResetMouse();
}
#endif
/* See if the current window has lost focus */
if (mouse->focus) {
}
mouse->focus = window;
if (mouse->focus) {
}
/* Update cursor visibility */
}
int SDL_SetRelativeMouseMode ( SDL_bool  enabled)

Set relative mouse mode.

Parameters
enabledWhether or not to enable relative mode
Returns
0 on success, or -1 if relative mode is not supported.

While the mouse is in relative mode, the cursor is hidden, and the driver will try to report continuous motion in the current window. Only relative motion events will be delivered, the mouse position will not change.

Note
This function will flush any pending mouse motion.
See Also
SDL_GetRelativeMouseMode()

Definition at line 725 of file SDL_mouse.c.

References SDL_Mouse::focus, SDL_Window::h, NULL, SDL_Mouse::relative_mode, SDL_Mouse::relative_mode_warp, SDL_Mouse::scale_accum_x, SDL_Mouse::scale_accum_y, SDL_FALSE, SDL_FlushEvent, SDL_GetKeyboardFocus, SDL_GetMouse(), SDL_MOUSEMOTION, SDL_SetCursor, SDL_SetError, SDL_SetMouseFocus(), SDL_TRUE, SDL_UpdateWindowGrab(), SDL_WarpMouseInWindow, SDL_Mouse::SetRelativeMouseMode, ShouldUseRelativeModeWarp(), SDL_Window::w, SDL_Mouse::WarpMouse, SDL_Mouse::x, and SDL_Mouse::y.

{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_Window *focusWindow = SDL_GetKeyboardFocus();
if (enabled == mouse->relative_mode) {
return 0;
}
if (enabled && focusWindow) {
/* Center it in the focused window to prevent clicks from going through
* to background windows.
*/
SDL_SetMouseFocus(focusWindow);
SDL_WarpMouseInWindow(focusWindow, focusWindow->w/2, focusWindow->h/2);
}
/* Set the relative mode */
if (!enabled && mouse->relative_mode_warp) {
} else if (enabled && ShouldUseRelativeModeWarp(mouse)) {
} else if (mouse->SetRelativeMouseMode(enabled) < 0) {
if (enabled) {
/* Fall back to warp mode if native relative mode failed */
if (!mouse->WarpMouse) {
return SDL_SetError("No relative mode implementation available");
}
}
}
mouse->scale_accum_x = 0.0f;
mouse->scale_accum_y = 0.0f;
if (mouse->focus) {
/* Put the cursor back to where the application expects it */
if (!enabled) {
SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y);
}
}
/* Flush pending mouse motion - ideally we would pump events, but that's not always safe */
/* Update cursor visibility */
return 0;
}
int SDL_ShowCursor ( int  toggle)

Toggle whether or not the cursor is shown.

Parameters
toggle1 to show the cursor, 0 to hide it, -1 to query the current state.
Returns
1 if the cursor is shown, or 0 if the cursor is hidden.

Definition at line 1034 of file SDL_mouse.c.

References SDL_Mouse::cursor_shown, NULL, SDL_FALSE, SDL_GetMouse(), SDL_SetCursor, and SDL_TRUE.

{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_bool shown;
if (!mouse) {
return 0;
}
shown = mouse->cursor_shown;
if (toggle >= 0) {
if (toggle) {
} else {
}
if (mouse->cursor_shown != shown) {
}
}
return shown;
}
static void SDL_TouchMouseEventsChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static

Definition at line 93 of file SDL_mouse.c.

References SDL_FALSE, SDL_strcasecmp, SDL_TRUE, and SDL_Mouse::touch_mouse_events.

Referenced by SDL_MouseInit().

{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
if (hint && (*hint == '0' || SDL_strcasecmp(hint, "false") == 0)) {
} else {
}
}
static SDL_bool SDL_UpdateMouseFocus ( SDL_Window window,
int  x,
int  y,
Uint32  buttonstate 
)
static

Definition at line 215 of file SDL_mouse.c.

References SDL_Window::flags, SDL_Mouse::focus, SDL_Mouse::mouseID, NULL, SDL_FALSE, SDL_GetMouse(), SDL_GetWindowSize, SDL_PrivateSendMouseMotion(), SDL_SetMouseFocus(), SDL_TRUE, and SDL_WINDOW_MOUSE_CAPTURE.

Referenced by SDL_PrivateSendMouseButton(), and SDL_SendMouseMotion().

{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_bool inWindow = SDL_TRUE;
if (window && ((window->flags & SDL_WINDOW_MOUSE_CAPTURE) == 0)) {
int w, h;
SDL_GetWindowSize(window, &w, &h);
if (x < 0 || y < 0 || x >= w || y >= h) {
inWindow = SDL_FALSE;
}
}
/* Linux doesn't give you mouse events outside your window unless you grab
the pointer.
Windows doesn't give you mouse events outside your window unless you call
SetCapture().
Both of these are slightly scary changes, so for now we'll punt and if the
mouse leaves the window you'll lose mouse focus and reset button state.
*/
#ifdef SUPPORT_DRAG_OUTSIDE_WINDOW
if (!inWindow && !buttonstate) {
#else
if (!inWindow) {
#endif
if (window == mouse->focus) {
#ifdef DEBUG_MOUSE
printf("Mouse left window, synthesizing move & focus lost event\n");
#endif
SDL_PrivateSendMouseMotion(window, mouse->mouseID, 0, x, y);
}
return SDL_FALSE;
}
if (window != mouse->focus) {
#ifdef DEBUG_MOUSE
printf("Mouse entered window, synthesizing focus gain & move event\n");
#endif
SDL_PrivateSendMouseMotion(window, mouse->mouseID, 0, x, y);
}
return SDL_TRUE;
}
int SDL_WarpMouseGlobal ( int  x,
int  y 
)

Moves the mouse to the given position in global screen space.

Parameters
xThe x coordinate
yThe y coordinate
Returns
0 on success, -1 on error (usually: unsupported by a platform).
Note
This function generates a mouse motion event

Definition at line 702 of file SDL_mouse.c.

References SDL_GetMouse(), SDL_Unsupported, and SDL_Mouse::WarpMouseGlobal.

{
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->WarpMouseGlobal) {
return mouse->WarpMouseGlobal(x, y);
}
return SDL_Unsupported();
}
void SDL_WarpMouseInWindow ( SDL_Window window,
int  x,
int  y 
)

Moves the mouse to the given position within the window.

Parameters
windowThe window to move the mouse into, or NULL for the current mouse focus
xThe x coordinate within the window
yThe y coordinate within the window
Note
This function generates a mouse motion event

Definition at line 682 of file SDL_mouse.c.

References SDL_Mouse::focus, SDL_Mouse::mouseID, NULL, SDL_GetMouse(), SDL_SendMouseMotion(), and SDL_Mouse::WarpMouse.

{
SDL_Mouse *mouse = SDL_GetMouse();
if (window == NULL) {
window = mouse->focus;
}
if (window == NULL) {
return;
}
if (mouse->WarpMouse) {
mouse->WarpMouse(window, x, y);
} else {
SDL_SendMouseMotion(window, mouse->mouseID, 0, x, y);
}
}
static SDL_bool ShouldUseRelativeModeWarp ( SDL_Mouse mouse)
static

Definition at line 714 of file SDL_mouse.c.

References SDL_assert, SDL_FALSE, SDL_GetHintBoolean, SDL_HINT_MOUSE_RELATIVE_MODE_WARP, SDL_TRUE, SDL_Mouse::SetRelativeMouseMode, and SDL_Mouse::WarpMouse.

Referenced by SDL_SetRelativeMouseMode().

{
if (!mouse->SetRelativeMouseMode) {
SDL_assert(mouse->WarpMouse); /* Need this functionality for relative mode warp implementation */
return SDL_TRUE;
}
}

Variable Documentation

SDL_Mouse SDL_mouse
static

Definition at line 35 of file SDL_mouse.c.

Referenced by SDL_GetMouse().