21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_RPI 32 #include "../SDL_sysvideo.h" 33 #include "../../events/SDL_mouse_c.h" 34 #include "../../events/default_cursor.h" 38 #define ELEMENT_CHANGE_LAYER (1<<0) 39 #define ELEMENT_CHANGE_OPACITY (1<<1) 40 #define ELEMENT_CHANGE_DEST_RECT (1<<2) 41 #define ELEMENT_CHANGE_SRC_RECT (1<<3) 42 #define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) 43 #define ELEMENT_CHANGE_TRANSFORM (1<<5) 46 static SDL_Cursor *RPI_CreateDefaultCursor(
void);
52 static int RPI_WarpMouseGlobal(
int x,
int y);
55 RPI_CreateDefaultCursor(
void)
64 RPI_CursorData *curdata;
78 curdata = (RPI_CursorData *)
SDL_calloc(1,
sizeof(*curdata));
79 if (curdata ==
NULL) {
85 curdata->hot_x =
hot_x;
86 curdata->hot_y = hot_y;
87 curdata->w = surface->
w;
88 curdata->h = surface->
h;
91 curdata->resource = vc_dispmanx_resource_create(VC_IMAGE_ARGB8888, surface->
w | (surface->
pitch << 16), surface->
h | (surface->
h << 16), &dummy);
93 vc_dispmanx_rect_set(&dst_rect, 0, 0, curdata->w, curdata->h);
100 ret = vc_dispmanx_resource_write_data(curdata->resource, VC_IMAGE_ARGB8888, surface->
pitch, surface->
pixels, &dst_rect);
114 DISPMANX_UPDATE_HANDLE_T update;
115 RPI_CursorData *curdata;
116 VC_RECT_T src_rect, dst_rect;
120 VC_DISPMANX_ALPHA_T
alpha = { DISPMANX_FLAGS_ALPHA_FROM_SOURCE , 255 , 0 };
129 if (cursor ==
NULL) {
134 if (curdata->element > DISPMANX_NO_HANDLE) {
135 update = vc_dispmanx_update_start(10);
137 ret = vc_dispmanx_element_remove(update, curdata->element);
139 ret = vc_dispmanx_update_submit_sync(update);
141 curdata->element = DISPMANX_NO_HANDLE;
147 curdata = (RPI_CursorData *) cursor->
driverdata;
148 if (curdata ==
NULL) {
157 if (display ==
NULL) {
166 if (curdata->element == DISPMANX_NO_HANDLE) {
167 vc_dispmanx_rect_set(&src_rect, 0, 0, curdata->w << 16, curdata->h << 16);
168 vc_dispmanx_rect_set(&dst_rect, mouse->
x, mouse->
y, curdata->w, curdata->h);
170 update = vc_dispmanx_update_start(10);
178 curdata->element = vc_dispmanx_element_add(update,
184 DISPMANX_PROTECTION_NONE,
188 SDL_assert(curdata->element > DISPMANX_NO_HANDLE);
189 ret = vc_dispmanx_update_submit_sync(update);
201 DISPMANX_UPDATE_HANDLE_T update;
202 RPI_CursorData *curdata;
204 if (cursor !=
NULL) {
205 curdata = (RPI_CursorData *) cursor->
driverdata;
207 if (curdata !=
NULL) {
208 if (curdata->element != DISPMANX_NO_HANDLE) {
209 update = vc_dispmanx_update_start(10);
211 ret = vc_dispmanx_element_remove(update, curdata->element);
213 ret = vc_dispmanx_update_submit_sync(update);
217 if (curdata->resource != DISPMANX_NO_HANDLE) {
218 ret = vc_dispmanx_resource_delete(curdata->resource);
232 RPI_WarpMouseGlobal(x, y);
237 RPI_WarpMouseGlobal(
int x,
int y)
239 RPI_CursorData *curdata;
240 DISPMANX_UPDATE_HANDLE_T update;
254 if (curdata->element == DISPMANX_NO_HANDLE) {
258 update = vc_dispmanx_update_start(10);
265 src_rect.width = curdata->w << 16;
266 src_rect.height = curdata->h << 16;
269 dst_rect.width = curdata->w;
270 dst_rect.height = curdata->h;
272 ret = vc_dispmanx_element_change_attributes(
282 if (ret != DISPMANX_SUCCESS) {
283 return SDL_SetError(
"vc_dispmanx_element_change_attributes() failed");
287 ret = vc_dispmanx_update_submit(update, 0,
NULL);
288 if (ret != DISPMANX_SUCCESS) {
289 return SDL_SetError(
"vc_dispmanx_update_submit() failed");
296 RPI_WarpMouseGlobalGraphicOnly(
int x,
int y)
298 RPI_CursorData *curdata;
299 DISPMANX_UPDATE_HANDLE_T update;
310 if (curdata->element == DISPMANX_NO_HANDLE) {
314 update = vc_dispmanx_update_start(10);
321 src_rect.width = curdata->w << 16;
322 src_rect.height = curdata->h << 16;
325 dst_rect.width = curdata->w;
326 dst_rect.height = curdata->h;
328 ret = vc_dispmanx_element_change_attributes(
338 if (ret != DISPMANX_SUCCESS) {
339 return SDL_SetError(
"vc_dispmanx_element_change_attributes() failed");
343 ret = vc_dispmanx_update_submit(update, 0,
NULL);
344 if (ret != DISPMANX_SUCCESS) {
345 return SDL_SetError(
"vc_dispmanx_update_submit() failed");
381 RPI_WarpMouseGlobalGraphicOnly(mouse->
x, mouse->
y);
SDL_Mouse * SDL_GetMouse(void)
int(* ShowCursor)(SDL_Cursor *cursor)
GLint GLint GLint GLint GLint x
#define SDL_RPI_MOUSELAYER
A collection of pixels used in software blitting.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLint GLint layer
GLfloat GLfloat GLfloat alpha
SDL_Cursor *(* CreateCursor)(SDL_Surface *surface, int hot_x, int hot_y)
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
GLint GLint GLint GLint GLint GLint y
DISPMANX_DISPLAY_HANDLE_T dispman_display
void SDL_SetDefaultCursor(SDL_Cursor *cursor)
int(* WarpMouseGlobal)(int x, int y)
void(* FreeCursor)(SDL_Cursor *cursor)
#define SDL_assert(condition)
#define SDL_OutOfMemory()
static const unsigned char default_cmask[]
#define SDL_HINT_RPI_VIDEO_LAYER
Tell SDL which Dispmanx layer to use on a Raspberry PI.
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
EGLSurface EGLNativeWindowType * window
The type used to identify a window.
void RPI_QuitMouse(_THIS)
void(* WarpMouse)(SDL_Window *window, int x, int y)
static const unsigned char default_cdata[]
void(* MoveCursor)(SDL_Cursor *cursor)
void RPI_InitMouse(_THIS)
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