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);
47 static int RPI_ShowCursor(
SDL_Cursor * cursor);
48 static void RPI_MoveCursor(
SDL_Cursor * cursor);
49 static void RPI_FreeCursor(
SDL_Cursor * cursor);
50 static void RPI_WarpMouse(
SDL_Window * window,
int x,
int y);
53 RPI_CreateDefaultCursor(
void)
74 curdata->
hot_x = hot_x;
75 curdata->
hot_y = hot_y;
76 curdata->
w = surface->
w;
77 curdata->
h = surface->
h;
80 curdata->
resource = vc_dispmanx_resource_create( VC_IMAGE_ARGB8888, surface->
w | (surface->
pitch << 16), surface->
h | (surface->
h << 16), &dummy );
82 vc_dispmanx_rect_set( &dst_rect, 0, 0, curdata->
w, curdata->
h);
89 ret = vc_dispmanx_resource_write_data( curdata->
resource, VC_IMAGE_ARGB8888, surface->
pitch, surface->
pixels, &dst_rect );
103 DISPMANX_UPDATE_HANDLE_T update;
105 VC_RECT_T src_rect, dst_rect;
109 VC_DISPMANX_ALPHA_T
alpha = { DISPMANX_FLAGS_ALPHA_FROM_SOURCE , 255 , 0 };
116 if (cursor ==
NULL) {
121 if (curdata->
element > DISPMANX_NO_HANDLE) {
122 update = vc_dispmanx_update_start( 10 );
124 ret = vc_dispmanx_element_remove( update, curdata->
element );
126 ret = vc_dispmanx_update_submit_sync( update );
128 curdata->
element = DISPMANX_NO_HANDLE;
144 if (display ==
NULL) {
153 if (curdata->
element == DISPMANX_NO_HANDLE) {
154 vc_dispmanx_rect_set( &src_rect, 0, 0, curdata->
w << 16, curdata->
h << 16 );
155 vc_dispmanx_rect_set( &dst_rect, 0, 0, curdata->
w, curdata->
h);
157 update = vc_dispmanx_update_start( 10 );
160 curdata->
element = vc_dispmanx_element_add( update,
166 DISPMANX_PROTECTION_NONE,
171 ret = vc_dispmanx_update_submit_sync( update );
183 DISPMANX_UPDATE_HANDLE_T update;
186 if (cursor !=
NULL) {
190 if (curdata->
element != DISPMANX_NO_HANDLE) {
191 update = vc_dispmanx_update_start( 10 );
193 ret = vc_dispmanx_element_remove( update, curdata->
element );
195 ret = vc_dispmanx_update_submit_sync( update );
199 if (curdata->
resource != DISPMANX_NO_HANDLE) {
200 ret = vc_dispmanx_resource_delete( curdata->
resource );
215 DISPMANX_UPDATE_HANDLE_T update;
222 if (curdata->
element != DISPMANX_NO_HANDLE) {
223 update = vc_dispmanx_update_start( 10 );
225 vc_dispmanx_rect_set( &dst_rect, x, y, curdata->
w, curdata->
h);
226 ret = vc_dispmanx_element_change_attributes(
229 ELEMENT_CHANGE_DEST_RECT,
238 ret = vc_dispmanx_update_submit( update, 0,
NULL );
272 RPI_WarpMouse(mouse->
focus, mouse->
x, mouse->
y);
SDL_Mouse * SDL_GetMouse(void)
DECLSPEC SDL_Cursor *SDLCALL 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).
DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size)
#define SDL_RPI_MOUSELAYER
A collection of pixels used in software blitting.
DECLSPEC void SDLCALL SDL_free(void *mem)
DISPMANX_ELEMENT_HANDLE_T element
void(* MoveCursor)(SDL_Cursor *cursor)
uint32_t Uint32
An unsigned 32-bit integer type.
void(* FreeCursor)(SDL_Cursor *cursor)
SDL_Cursor *(* CreateCursor)(SDL_Surface *surface, int hot_x, int hot_y)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int(* ShowCursor)(SDL_Cursor *cursor)
DISPMANX_RESOURCE_HANDLE_T resource
DISPMANX_DISPLAY_HANDLE_T dispman_display
GLclampf GLclampf GLclampf alpha
void SDL_SetDefaultCursor(SDL_Cursor *cursor)
#define SDL_assert(condition)
EGLSurface EGLint EGLint y
static const unsigned char default_cmask[]
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
void RPI_QuitMouse(_THIS)
static const unsigned char default_cdata[]
void RPI_InitMouse(_THIS)
void(* WarpMouse)(SDL_Window *window, int x, int y)