21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_RPI 31 #include "../SDL_sysvideo.h" 32 #include "../../events/SDL_mouse_c.h" 33 #include "../../events/default_cursor.h" 37 #define ELEMENT_CHANGE_LAYER (1<<0) 38 #define ELEMENT_CHANGE_OPACITY (1<<1) 39 #define ELEMENT_CHANGE_DEST_RECT (1<<2) 40 #define ELEMENT_CHANGE_SRC_RECT (1<<3) 41 #define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) 42 #define ELEMENT_CHANGE_TRANSFORM (1<<5) 45 static SDL_Cursor *RPI_CreateDefaultCursor(
void);
51 static int RPI_WarpMouseGlobal(
int x,
int y);
54 RPI_CreateDefaultCursor(
void)
61 RPI_CreateCursor(
SDL_Surface * surface,
int hot_x,
int hot_y)
63 RPI_CursorData *curdata;
73 curdata = (RPI_CursorData *)
SDL_calloc(1,
sizeof(*curdata));
75 curdata->hot_x = hot_x;
76 curdata->hot_y = hot_y;
77 curdata->w = surface->
w;
78 curdata->h = surface->
h;
81 curdata->resource = vc_dispmanx_resource_create( VC_IMAGE_ARGB8888, surface->
w | (surface->
pitch << 16), surface->
h | (surface->
h << 16), &dummy );
83 vc_dispmanx_rect_set( &dst_rect, 0, 0, curdata->w, curdata->h);
90 ret = vc_dispmanx_resource_write_data( curdata->resource, VC_IMAGE_ARGB8888, surface->
pitch, surface->
pixels, &dst_rect );
104 DISPMANX_UPDATE_HANDLE_T update;
105 RPI_CursorData *curdata;
106 VC_RECT_T src_rect, dst_rect;
110 VC_DISPMANX_ALPHA_T
alpha = { DISPMANX_FLAGS_ALPHA_FROM_SOURCE , 255 , 0 };
117 if (cursor ==
NULL) {
122 if (curdata->element > DISPMANX_NO_HANDLE) {
123 update = vc_dispmanx_update_start( 10 );
125 ret = vc_dispmanx_element_remove( update, curdata->element );
127 ret = vc_dispmanx_update_submit_sync( update );
129 curdata->element = DISPMANX_NO_HANDLE;
135 curdata = (RPI_CursorData *) cursor->
driverdata;
136 if (curdata ==
NULL) {
145 if (display ==
NULL) {
154 if (curdata->element == DISPMANX_NO_HANDLE) {
155 vc_dispmanx_rect_set( &src_rect, 0, 0, curdata->w << 16, curdata->h << 16 );
156 vc_dispmanx_rect_set( &dst_rect, 0, 0, curdata->w, curdata->h);
158 update = vc_dispmanx_update_start( 10 );
161 curdata->element = vc_dispmanx_element_add( update,
167 DISPMANX_PROTECTION_NONE,
171 SDL_assert( curdata->element > DISPMANX_NO_HANDLE);
172 ret = vc_dispmanx_update_submit_sync( update );
184 DISPMANX_UPDATE_HANDLE_T update;
185 RPI_CursorData *curdata;
187 if (cursor !=
NULL) {
188 curdata = (RPI_CursorData *) cursor->
driverdata;
190 if (curdata !=
NULL) {
191 if (curdata->element != DISPMANX_NO_HANDLE) {
192 update = vc_dispmanx_update_start( 10 );
194 ret = vc_dispmanx_element_remove( update, curdata->element );
196 ret = vc_dispmanx_update_submit_sync( update );
200 if (curdata->resource != DISPMANX_NO_HANDLE) {
201 ret = vc_dispmanx_resource_delete( curdata->resource );
215 RPI_WarpMouseGlobal(x, y);
220 RPI_WarpMouseGlobal(
int x,
int y)
222 RPI_CursorData *curdata;
223 DISPMANX_UPDATE_HANDLE_T update;
229 if (curdata->element != DISPMANX_NO_HANDLE) {
231 update = vc_dispmanx_update_start( 10 );
233 vc_dispmanx_rect_set( &dst_rect, x, y, curdata->w, curdata->h);
234 ret = vc_dispmanx_element_change_attributes(
237 ELEMENT_CHANGE_DEST_RECT,
246 ret = vc_dispmanx_update_submit( update, 0,
NULL );
248 return (ret == DISPMANX_SUCCESS) ? 0 : -1;
284 RPI_WarpMouse(mouse->
focus, mouse->
x, mouse->
y);
SDL_Mouse * SDL_GetMouse(void)
int(* ShowCursor)(SDL_Cursor *cursor)
uint32_t Uint32
An unsigned 32-bit integer type.
#define SDL_RPI_MOUSELAYER
GLint GLint GLint GLint GLint x
A collection of pixels used in software blitting.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLfloat GLfloat GLfloat alpha
SDL_Cursor *(* CreateCursor)(SDL_Surface *surface, int hot_x, int hot_y)
void * SDL_calloc(size_t nmemb, size_t size)
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)
static const unsigned char default_cmask[]
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *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)