21 #include "../SDL_internal.h"
29 #include "../SDL_hints_c.h"
30 #include "../video/SDL_sysvideo.h"
32 #include "../core/windows/SDL_windows.h"
60 #elif defined(__OS2__)
118 #if defined(__ANDROID__) || (defined(__IPHONEOS__) && !defined(__TVOS__))
196 printf(
"Resetting mouse\n");
268 #ifdef SUPPORT_DRAG_OUTSIDE_WINDOW
269 if (!inWindow && !buttonstate) {
275 printf(
"Mouse left window, synthesizing move & focus lost event\n");
277 if (send_mouse_motion) {
287 printf(
"Mouse entered window, synthesizing focus gain & move event\n");
290 if (send_mouse_motion) {
300 if (
window && !relative) {
315 if (*accum >= 0.0f) {
337 float fx = (float)
x / (
float)
window->w;
338 float fy = (float)
y / (
float)
window->h;
352 int center_x = 0, center_y = 0;
356 if (
x == center_x &&
y == center_y) {
386 }
else if (!xrel && !yrel) {
388 printf(
"Mouse event didn't change state - dropped!\n");
411 int x_max = 0, y_max = 0;
418 if (mouse->
x > x_max) {
425 if (mouse->
y > y_max) {
447 event.motion.windowID = mouse->
focus ? mouse->
focus->
id : 0;
448 event.motion.which = mouseID;
452 event.motion.x = mouse->
x;
453 event.motion.y = mouse->
y;
454 event.motion.xrel = xrel;
455 event.motion.yrel = yrel;
504 float fx = (float)mouse->
x / (
float)
window->w;
505 float fy = (float)mouse->
y / (
float)
window->h;
573 event.button.windowID = mouse->
focus ? mouse->
focus->
id : 0;
574 event.button.which = mouseID;
575 event.button.state =
state;
576 event.button.button =
button;
578 event.button.x = mouse->
x;
579 event.button.y = mouse->
y;
609 int integral_x, integral_y;
615 if (
x == 0.0f &&
y == 0.0f) {
644 event.wheel.windowID = mouse->
focus ? mouse->
focus->
id : 0;
645 event.wheel.which = mouseID;
647 event.wheel.preciseX =
x;
648 event.wheel.preciseY =
y;
650 event.wheel.x = integral_x;
651 event.wheel.y = integral_y;
652 event.wheel.direction = (
Uint32)direction;
812 return SDL_SetError(
"No relative mode implementation available");
892 int w,
int h,
int hot_x,
int hot_y)
898 Uint8 datab = 0, maskb = 0;
899 const Uint32 black = 0xFF000000;
900 const Uint32 white = 0xFFFFFFFF;
901 const Uint32 transparent = 0x00000000;
915 for (
y = 0;
y <
h; ++
y) {
917 for (
x = 0;
x <
w; ++
x) {
923 *pixel++ = (datab & 0x80) ? black : white;
925 *pixel++ = (datab & 0x80) ? black : transparent;
957 if ((
hot_x < 0) || (hot_y < 0) ||
959 SDL_SetError(
"Cursor hot spot doesn't lie within cursor");
989 SDL_SetError(
"CreateSystemCursor is not currently supported");
1016 for (found = mouse->
cursors; found; found = found->
next) {
1022 SDL_SetError(
"Cursor not associated with the current mouse");
1086 prev = curr, curr = curr->
next) {
#define SDL_assert(condition)
#define SDL_GetWindowSize
#define SDL_DelHintCallback
#define SDL_GetKeyboardFocus
#define SDL_ConvertSurfaceFormat
#define SDL_GetHintBoolean
#define SDL_CreateRGBSurface
#define SDL_AddHintCallback
#define SDL_Unsupported()
#define SDL_GetEventState(type)
SDL_bool SDL_GetStringBoolean(const char *value, SDL_bool default_value)
#define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE
A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in rela...
#define SDL_HINT_MOUSE_TOUCH_EVENTS
A variable controlling whether mouse events should generate synthetic touch events.
#define SDL_HINT_TOUCH_MOUSE_EVENTS
A variable controlling whether touch events should generate synthetic mouse events.
#define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME
A variable setting the double click time, in milliseconds.
#define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS
A variable setting the double click radius, in pixels.
#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP
A variable controlling whether relative mouse mode is implemented using mouse warping.
#define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE
A variable setting the scale for mouse motion, in floating point, when the mouse is in relative mode.
int uint32_t uint32_t uint32_t uint32_t uint32_t int drmModeModeInfoPtr mode int uint32_t uint32_t uint32_t uint32_t int32_t hot_x
static void SDL_MouseDoubleClickTimeChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
static SDL_bool ShouldUseRelativeModeWarp(SDL_Mouse *mouse)
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
static int SDL_PrivateSendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks)
static void SDL_MouseTouchEventsChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
SDL_Cursor * SDL_GetDefaultCursor(void)
Return the default cursor.
static void SDL_TouchMouseEventsChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
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).
SDL_Mouse * SDL_GetMouse(void)
void SDL_FreeCursor(SDL_Cursor *cursor)
Frees a cursor created with SDL_CreateCursor() or similar functions.
Uint32 SDL_GetRelativeMouseState(int *x, int *y)
Retrieve the relative state of the mouse.
void SDL_SetDefaultCursor(SDL_Cursor *cursor)
int SDL_ShowCursor(int toggle)
Toggle whether or not the cursor is shown.
SDL_Cursor * SDL_CreateColorCursor(SDL_Surface *surface, int hot_x, int hot_y)
Create a color cursor.
void SDL_SetCursor(SDL_Cursor *cursor)
Set the active cursor.
static void SDL_MouseRelativeSpeedScaleChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Uint32 SDL_GetMouseState(int *x, int *y)
Retrieve the current state of the mouse.
void SDL_WarpMouseInWindow(SDL_Window *window, int x, int y)
Moves the mouse to the given position within the window.
int SDL_SendMouseButtonClicks(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button, int clicks)
void SDL_SetMouseFocus(SDL_Window *window)
static SDL_bool SDL_UpdateMouseFocus(SDL_Window *window, int x, int y, Uint32 buttonstate, SDL_bool send_mouse_motion)
static void SDL_MouseNormalSpeedScaleChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
static int GetScaledMouseDelta(float scale, int value, float *accum)
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, float x, float y, SDL_MouseWheelDirection direction)
static SDL_MouseClickState * GetMouseClickState(SDL_Mouse *mouse, Uint8 button)
static SDL_bool track_mouse_down
int SDL_CaptureMouse(SDL_bool enabled)
Capture the mouse, to track input outside an SDL window.
SDL_Window * SDL_GetMouseFocus(void)
Get the window which currently has mouse focus.
SDL_Cursor * SDL_GetCursor(void)
Return the active cursor.
int SDL_WarpMouseGlobal(int x, int y)
Moves the mouse to the given position in global screen space.
SDL_Cursor * SDL_CreateSystemCursor(SDL_SystemCursor id)
Create a system cursor.
SDL_bool SDL_GetRelativeMouseMode()
Query whether relative mouse mode is enabled.
static void SDL_MouseDoubleClickRadiusChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
int SDL_SetRelativeMouseMode(SDL_bool enabled)
Set relative mouse mode.
Uint32 SDL_GetGlobalMouseState(int *x, int *y)
Get the current state of the mouse, in relation to the desktop.
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
static SDL_Mouse SDL_mouse
static int SDL_PrivateSendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
SDL_SystemCursor
Cursor types for SDL_CreateSystemCursor().
SDL_MouseWheelDirection
Scroll direction types for the Scroll event.
GLint GLint GLint GLint GLint GLint y
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum type
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum GLenum GLenum GLenum GLenum scale
GLuint const GLchar * name
GLsizei const GLfloat * value
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
@ SDL_PIXELFORMAT_ARGB8888
void SDL_UpdateWindowGrab(SDL_Window *window)
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, SDL_bool down, float x, float y, float pressure)
int SDL_AddTouch(SDL_TouchID touchID, SDL_TouchDeviceType type, const char *name)
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, float x, float y, float pressure)
#define SDL_MOUSE_TOUCHID
@ SDL_TOUCH_DEVICE_DIRECT
#define SDL_TOUCH_MOUSEID
@ SDL_WINDOW_MOUSE_CAPTURE
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
EGLSurface EGLNativeWindowType * window
int(* SetRelativeMouseMode)(SDL_bool enabled)
float accumulated_wheel_x
void(* WarpMouse)(SDL_Window *window, int x, int y)
SDL_Cursor *(* CreateCursor)(SDL_Surface *surface, int hot_x, int hot_y)
void(* FreeCursor)(SDL_Cursor *cursor)
int(* ShowCursor)(SDL_Cursor *cursor)
SDL_MouseClickState * clickstate
SDL_bool relative_mode_warp
SDL_bool touch_mouse_events
int(* WarpMouseGlobal)(int x, int y)
SDL_Cursor *(* CreateSystemCursor)(SDL_SystemCursor id)
Uint32(* GetGlobalMouseState)(int *x, int *y)
void(* MoveCursor)(SDL_Cursor *cursor)
float relative_speed_scale
float accumulated_wheel_y
int(* CaptureMouse)(SDL_Window *window)
SDL_bool was_touch_mouse_events
SDL_bool mouse_touch_events
A collection of pixels used in software blitting.
The type used to identify a window.
typedef int(__stdcall *FARPROC)()