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)
46static SDL_Cursor *RPI_CreateDefaultCursor(
void);
52static int RPI_WarpMouseGlobal(
int x,
int y);
57RPI_CreateDefaultCursor(
void)
66 RPI_CursorData *curdata;
80 curdata = (RPI_CursorData *)
SDL_calloc(1,
sizeof(*curdata));
81 if (curdata ==
NULL) {
87 curdata->hot_x =
hot_x;
88 curdata->hot_y = hot_y;
93 curdata->resource = vc_dispmanx_resource_create(VC_IMAGE_ARGB8888,
surface->w | (
surface->pitch << 16),
surface->h | (
surface->h << 16), &dummy);
95 vc_dispmanx_rect_set(&dst_rect, 0, 0, curdata->w, curdata->h);
102 ret = vc_dispmanx_resource_write_data(curdata->resource, VC_IMAGE_ARGB8888,
surface->pitch,
surface->pixels, &dst_rect);
116 DISPMANX_UPDATE_HANDLE_T update;
117 RPI_CursorData *curdata;
118 VC_RECT_T src_rect, dst_rect;
122 VC_DISPMANX_ALPHA_T
alpha = { DISPMANX_FLAGS_ALPHA_FROM_SOURCE , 255 , 0 };
131 if (
cursor != global_cursor) {
132 if (global_cursor !=
NULL) {
133 curdata = (RPI_CursorData *) global_cursor->
driverdata;
134 if (curdata && curdata->element > DISPMANX_NO_HANDLE) {
135 update = vc_dispmanx_update_start(0);
137 ret = vc_dispmanx_element_remove(update, curdata->element);
139 ret = vc_dispmanx_update_submit_sync(update);
141 curdata->element = DISPMANX_NO_HANDLE;
152 if (curdata ==
NULL) {
161 if (display ==
NULL) {
170 if (curdata->element == DISPMANX_NO_HANDLE) {
171 vc_dispmanx_rect_set(&src_rect, 0, 0, curdata->w << 16, curdata->h << 16);
172 vc_dispmanx_rect_set(&dst_rect, mouse->
x - curdata->hot_x, mouse->
y - curdata->hot_y, curdata->w, curdata->h);
174 update = vc_dispmanx_update_start(0);
182 curdata->element = vc_dispmanx_element_add(update,
183 data->dispman_display,
188 DISPMANX_PROTECTION_NONE,
192 SDL_assert(curdata->element > DISPMANX_NO_HANDLE);
193 ret = vc_dispmanx_update_submit_sync(update);
205 DISPMANX_UPDATE_HANDLE_T update;
206 RPI_CursorData *curdata;
211 if (curdata !=
NULL) {
212 if (curdata->element != DISPMANX_NO_HANDLE) {
213 update = vc_dispmanx_update_start(0);
215 ret = vc_dispmanx_element_remove(update, curdata->element);
217 ret = vc_dispmanx_update_submit_sync(update);
221 if (curdata->resource != DISPMANX_NO_HANDLE) {
222 ret = vc_dispmanx_resource_delete(curdata->resource);
236 RPI_WarpMouseGlobal(
x,
y);
241RPI_WarpMouseGlobal(
int x,
int y)
243 RPI_CursorData *curdata;
244 DISPMANX_UPDATE_HANDLE_T update;
258 if (curdata->element == DISPMANX_NO_HANDLE) {
262 update = vc_dispmanx_update_start(0);
269 src_rect.width = curdata->w << 16;
270 src_rect.height = curdata->h << 16;
271 dst_rect.x =
x - curdata->hot_x;
272 dst_rect.y =
y - curdata->hot_y;
273 dst_rect.width = curdata->w;
274 dst_rect.height = curdata->h;
276 ret = vc_dispmanx_element_change_attributes(
286 if (ret != DISPMANX_SUCCESS) {
287 return SDL_SetError(
"vc_dispmanx_element_change_attributes() failed");
291 ret = vc_dispmanx_update_submit(update, 0,
NULL);
292 if (ret != DISPMANX_SUCCESS) {
293 return SDL_SetError(
"vc_dispmanx_update_submit() failed");
300RPI_WarpMouseGlobalGraphicOnly(
int x,
int y)
302 RPI_CursorData *curdata;
303 DISPMANX_UPDATE_HANDLE_T update;
314 if (curdata->element == DISPMANX_NO_HANDLE) {
318 update = vc_dispmanx_update_start(0);
325 src_rect.width = curdata->w << 16;
326 src_rect.height = curdata->h << 16;
327 dst_rect.x =
x - curdata->hot_x;
328 dst_rect.y =
y - curdata->hot_y;
329 dst_rect.width = curdata->w;
330 dst_rect.height = curdata->h;
332 ret = vc_dispmanx_element_change_attributes(
342 if (ret != DISPMANX_SUCCESS) {
343 return SDL_SetError(
"vc_dispmanx_element_change_attributes() failed");
347 ret = vc_dispmanx_update_submit(update, 0,
NULL);
348 if (ret != DISPMANX_SUCCESS) {
349 return SDL_SetError(
"vc_dispmanx_update_submit() failed");
384 RPI_WarpMouseGlobalGraphicOnly(mouse->
x, mouse->
y);
#define SDL_assert(condition)
#define SDL_OutOfMemory()
#define SDL_HINT_RPI_VIDEO_LAYER
Tell SDL which Dispmanx layer to use on a Raspberry PI.
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
void SDL_SetDefaultCursor(SDL_Cursor *cursor)
SDL_Mouse * SDL_GetMouse(void)
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLint GLint GLint x
GLfloat GLfloat GLfloat alpha
GLenum GLuint GLint GLint layer
@ SDL_PIXELFORMAT_ARGB8888
void RPI_QuitMouse(_THIS)
void RPI_InitMouse(_THIS)
#define SDL_RPI_MOUSELAYER
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
static const unsigned char default_cdata[]
static const unsigned char default_cmask[]
EGLSurface EGLNativeWindowType * window
void(* WarpMouse)(SDL_Window *window, int x, int y)
void(* FreeCursor)(SDL_Cursor *cursor)
int(* ShowCursor)(SDL_Cursor *cursor)
int(* WarpMouseGlobal)(int x, int y)
SDL_Cursor *(* CreateCursor)(SDL_Surface *surface, int hot_x, int hot_y)
void(* MoveCursor)(SDL_Cursor *cursor)
A collection of pixels used in software blitting.
The type used to identify a window.