kmsdrm: Move cursor plane setup and freeing to MouseInit() and MouseQuit(), for better consistency.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
diff --git a/src/video/kmsdrm/SDL_kmsdrmmouse.c b/src/video/kmsdrm/SDL_kmsdrmmouse.c
index 6759b62..2d62861 100644
--- a/src/video/kmsdrm/SDL_kmsdrmmouse.c
+++ b/src/video/kmsdrm/SDL_kmsdrmmouse.c
@@ -144,8 +144,7 @@ KMSDRM_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
goto cleanup;
}
- /* Here simply set the hox_x and hot_y, that will be used in drm_atomic_movecursor().
- These are the coordinates of the "tip of the cursor" from it's base. */
+ /* hox_x and hot_y are the coordinates of the "tip of the cursor" from it's base. */
curdata->hot_x = hot_x;
curdata->hot_y = hot_y;
curdata->w = usable_cursor_w;
@@ -264,9 +263,6 @@ KMSDRM_ShowCursor(SDL_Cursor * cursor)
if (dispdata && dispdata->cursor_plane) {
info.plane = dispdata->cursor_plane; /* The rest of the members are zeroed. */
ret = drm_atomic_set_plane_props(&info);
- /* Free the plane on which the cursor was being shown. */
- free_plane(&dispdata->cursor_plane);
-
if (ret) {
SDL_SetError("Could not hide current cursor.");
return ret;
@@ -290,6 +286,9 @@ KMSDRM_ShowCursor(SDL_Cursor * cursor)
if (!dispdata) {
return SDL_SetError("Could not get display driverdata.");
}
+ if (!dispdata->cursor_plane) {
+ return SDL_SetError("Hardware cursor plane not initialized.");
+ }
curdata = (KMSDRM_CursorData *) cursor->driverdata;
@@ -301,11 +300,6 @@ KMSDRM_ShowCursor(SDL_Cursor * cursor)
curdata->plane = dispdata->cursor_plane;
curdata->video = video_device;
- /* Init cursor plane, if we haven't yet. */
- if (!dispdata->cursor_plane) {
- setup_plane(curdata->video, &(dispdata->cursor_plane), DRM_PLANE_TYPE_CURSOR);
- }
-
fb = KMSDRM_FBFromBO(curdata->video, curdata->bo);
info.plane = dispdata->cursor_plane;
@@ -321,7 +315,7 @@ KMSDRM_ShowCursor(SDL_Cursor * cursor)
ret = drm_atomic_set_plane_props(&info);
if (ret) {
- SDL_SetError("KMSDRM_SetCursor failed.");
+ SDL_SetError("KMSDRM_ShowCursor failed.");
return ret;
}
@@ -410,6 +404,8 @@ KMSDRM_InitMouse(_THIS)
/* FIXME: Using UDEV it should be possible to scan all mice
* but there's no point in doing so as there's no multimice support...yet!
*/
+
+ SDL_DisplayData *dispdata = (SDL_DisplayData *)SDL_GetDisplayDriverData(0);
SDL_Mouse *mouse = SDL_GetMouse();
mouse->CreateCursor = KMSDRM_CreateCursor;
@@ -419,13 +415,20 @@ KMSDRM_InitMouse(_THIS)
mouse->WarpMouse = KMSDRM_WarpMouse;
mouse->WarpMouseGlobal = KMSDRM_WarpMouseGlobal;
+ /* Init cursor plane, if we haven't yet. */
+ if (!dispdata->cursor_plane) {
+ setup_plane(_this, &(dispdata->cursor_plane), DRM_PLANE_TYPE_CURSOR);
+ }
+
SDL_SetDefaultCursor(KMSDRM_CreateDefaultCursor());
}
void
KMSDRM_QuitMouse(_THIS)
{
- /* TODO: ? */
+ /* Free the plane on which the cursor was being shown. */
+ SDL_DisplayData *dispdata = (SDL_DisplayData *)SDL_GetDisplayDriverData(0);
+ free_plane(&dispdata->cursor_plane);
}
/* This is called when a mouse motion event occurs */