22 #include "../../SDL_internal.h" 24 #if SDL_VIDEO_DRIVER_KMSDRM 30 #include "../../events/SDL_mouse_c.h" 31 #include "../../events/default_cursor.h" 33 static SDL_Cursor *KMSDRM_CreateDefaultCursor(
void);
39 static int KMSDRM_WarpMouseGlobal(
int x,
int y);
42 KMSDRM_CreateDefaultCursor(
void)
63 bo_format = GBM_FORMAT_RGB332;
66 bo_format = GBM_FORMAT_ARGB4444;
69 bo_format = GBM_FORMAT_RGBA4444;
72 bo_format = GBM_FORMAT_ABGR4444;
75 bo_format = GBM_FORMAT_BGRA4444;
78 bo_format = GBM_FORMAT_ARGB1555;
81 bo_format = GBM_FORMAT_RGBA5551;
84 bo_format = GBM_FORMAT_ABGR1555;
87 bo_format = GBM_FORMAT_BGRA5551;
90 bo_format = GBM_FORMAT_RGB565;
93 bo_format = GBM_FORMAT_BGR565;
97 bo_format = GBM_FORMAT_RGB888;
101 bo_format = GBM_FORMAT_BGR888;
104 bo_format = GBM_FORMAT_RGBX8888;
107 bo_format = GBM_FORMAT_BGRX8888;
110 bo_format = GBM_FORMAT_ARGB8888;
113 bo_format = GBM_FORMAT_RGBA8888;
116 bo_format = GBM_FORMAT_ABGR8888;
119 bo_format = GBM_FORMAT_BGRA8888;
122 bo_format = GBM_FORMAT_ARGB2101010;
129 if (!KMSDRM_gbm_device_is_format_supported(vdata->
gbm, bo_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE)) {
135 if (cursor ==
NULL) {
140 if (curdata ==
NULL) {
147 curdata->
hot_y = hot_y;
148 curdata->
w = surface->
w;
149 curdata->
h = surface->
h;
151 curdata->
bo = KMSDRM_gbm_bo_create(vdata->
gbm, surface->
w, surface->
h, bo_format,
152 GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
153 if (curdata->
bo ==
NULL) {
158 bo_stride = KMSDRM_gbm_bo_get_stride(curdata->
bo);
159 bufsize = bo_stride * surface->
h;
161 if (surface->
pitch != bo_stride) {
164 if (buffer ==
NULL) {
177 for (i = 0; i < surface->
h; i++) {
187 if (KMSDRM_gbm_bo_write(curdata->
bo, buffer, bufsize)) {
204 ret = KMSDRM_gbm_bo_write(curdata->
bo, surface->
pixels, bufsize);
221 if (buffer !=
NULL) {
224 if (cursor !=
NULL) {
227 if (curdata !=
NULL) {
228 if (curdata->
bo !=
NULL) {
229 KMSDRM_gbm_bo_destroy(curdata->
bo);
256 if (display !=
NULL) {
261 if (cursor ==
NULL) {
267 ret = KMSDRM_drmModeSetCursor(vdata->
drm_fd, curdata->
crtc_id, 0, 0, 0);
269 SDL_SetError(
"Could not hide current cursor with drmModeSetCursor().");
280 ret = KMSDRM_drmModeSetCursor(vdata->
drm_fd, ddata->
crtc_id, 0, 0, 0);
282 SDL_SetError(
"Could not hide display's cursor with drmModeSetCursor().");
291 if (display ==
NULL) {
292 return SDL_SetError(
"Could not get display for mouse.");
295 return SDL_SetError(
"Could not get display driverdata.");
300 return SDL_SetError(
"Cursor not initialized properly.");
303 bo_handle = KMSDRM_gbm_bo_get_handle(curdata->
bo).u32;
304 if (curdata->
hot_x == 0 && curdata->
hot_y == 0) {
305 ret = KMSDRM_drmModeSetCursor(vdata->
drm_fd, ddata->
crtc_id, bo_handle,
306 curdata->
w, curdata->
h);
308 ret = KMSDRM_drmModeSetCursor2(vdata->
drm_fd, ddata->
crtc_id, bo_handle,
309 curdata->
w, curdata->
h,
329 if (cursor !=
NULL) {
332 if (curdata !=
NULL) {
333 if (curdata->
bo !=
NULL) {
335 drm_fd = KMSDRM_gbm_device_get_fd(KMSDRM_gbm_bo_get_device(curdata->
bo));
337 KMSDRM_drmModeSetCursor(drm_fd, curdata->
crtc_id, 0, 0, 0);
340 KMSDRM_gbm_bo_destroy(curdata->
bo);
354 KMSDRM_WarpMouseGlobal(x, y);
359 KMSDRM_WarpMouseGlobal(
int x,
int y)
366 if (curdata->
bo !=
NULL) {
369 drm_fd = KMSDRM_gbm_device_get_fd(KMSDRM_gbm_bo_get_device(curdata->
bo));
370 ret = KMSDRM_drmModeMoveCursor(drm_fd, curdata->
crtc_id, x, y);
381 return SDL_SetError(
"Cursor not initialized properly.");
417 KMSDRM_WarpMouse(mouse->
focus, mouse->
x, mouse->
y);
SDL_Mouse * SDL_GetMouse(void)
void KMSDRM_QuitMouse(_THIS)
int(* ShowCursor)(SDL_Cursor *cursor)
#define SDL_UnlockSurface
GLint GLint GLint GLint GLint x
void KMSDRM_InitMouse(_THIS)
A collection of pixels used in software blitting.
GLenum GLuint GLsizei bufsize
SDL_Cursor *(* CreateCursor)(SDL_Surface *surface, int hot_x, int hot_y)
void * SDL_calloc(size_t nmemb, size_t size)
int uint32_t uint32_t uint32_t uint32_t uint32_t int drmModeModeInfoPtr mode int uint32_t uint32_t bo_handle
GLint GLint GLint GLint GLint GLint y
void SDL_SetDefaultCursor(SDL_Cursor *cursor)
int(* WarpMouseGlobal)(int x, int y)
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)
void(* FreeCursor)(SDL_Cursor *cursor)
#define SDL_OutOfMemory()
static const unsigned char default_cmask[]
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
EGLSurface EGLNativeWindowType * window
The type used to identify a window.
void(* WarpMouse)(SDL_Window *window, int x, int y)
SDL_VideoDevice * SDL_GetVideoDevice(void)
static const unsigned char default_cdata[]
void(* MoveCursor)(SDL_Cursor *cursor)
static void cleanup(void)
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