Fixed crashes related to the default cursor on WinRT and KMSDRM
Fixes https://github.com/libsdl-org/SDL/issues/8104main
parent
94b3f78c44
commit
be67f0de10
|
@ -213,7 +213,7 @@ void SDL_PostInitMouse(void)
|
||||||
/* Create a dummy mouse cursor for video backends that don't support true cursors,
|
/* Create a dummy mouse cursor for video backends that don't support true cursors,
|
||||||
* so that mouse grab and focus functionality will work.
|
* so that mouse grab and focus functionality will work.
|
||||||
*/
|
*/
|
||||||
if (!mouse->CreateCursor) {
|
if (!mouse->default_cursor) {
|
||||||
SDL_Surface *surface = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_ARGB8888);
|
SDL_Surface *surface = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_ARGB8888);
|
||||||
if (surface) {
|
if (surface) {
|
||||||
SDL_memset(surface->pixels, 0, (size_t)surface->h * surface->pitch);
|
SDL_memset(surface->pixels, 0, (size_t)surface->h * surface->pitch);
|
||||||
|
@ -227,8 +227,20 @@ void SDL_SetDefaultCursor(SDL_Cursor *cursor)
|
||||||
{
|
{
|
||||||
SDL_Mouse *mouse = SDL_GetMouse();
|
SDL_Mouse *mouse = SDL_GetMouse();
|
||||||
|
|
||||||
mouse->def_cursor = cursor;
|
if (cursor == mouse->default_cursor) {
|
||||||
if (!mouse->cur_cursor) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mouse->default_cursor) {
|
||||||
|
SDL_Cursor *default_cursor = mouse->default_cursor;
|
||||||
|
|
||||||
|
mouse->default_cursor = NULL;
|
||||||
|
SDL_DestroyCursor(default_cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
mouse->default_cursor = cursor;
|
||||||
|
|
||||||
|
if (!mouse->current_cursor) {
|
||||||
SDL_SetCursor(cursor);
|
SDL_SetCursor(cursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -609,8 +621,8 @@ static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_
|
||||||
|
|
||||||
/* Move the mouse cursor, if needed */
|
/* Move the mouse cursor, if needed */
|
||||||
if (mouse->cursor_shown && !mouse->relative_mode &&
|
if (mouse->cursor_shown && !mouse->relative_mode &&
|
||||||
mouse->MoveCursor && mouse->cur_cursor) {
|
mouse->MoveCursor && mouse->current_cursor) {
|
||||||
mouse->MoveCursor(mouse->cur_cursor);
|
mouse->MoveCursor(mouse->current_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Post the event, if desired */
|
/* Post the event, if desired */
|
||||||
|
@ -860,15 +872,10 @@ void SDL_QuitMouse(void)
|
||||||
cursor = next;
|
cursor = next;
|
||||||
}
|
}
|
||||||
mouse->cursors = NULL;
|
mouse->cursors = NULL;
|
||||||
mouse->cur_cursor = NULL;
|
mouse->current_cursor = NULL;
|
||||||
|
|
||||||
if (mouse->def_cursor) {
|
if (mouse->default_cursor) {
|
||||||
if (mouse->FreeCursor) {
|
SDL_SetDefaultCursor(NULL);
|
||||||
mouse->FreeCursor(mouse->def_cursor);
|
|
||||||
} else {
|
|
||||||
SDL_free(mouse->def_cursor);
|
|
||||||
}
|
|
||||||
mouse->def_cursor = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse->sources) {
|
if (mouse->sources) {
|
||||||
|
@ -1301,14 +1308,14 @@ int SDL_SetCursor(SDL_Cursor *cursor)
|
||||||
SDL_Mouse *mouse = SDL_GetMouse();
|
SDL_Mouse *mouse = SDL_GetMouse();
|
||||||
|
|
||||||
/* Return immediately if setting the cursor to the currently set one (fixes #7151) */
|
/* Return immediately if setting the cursor to the currently set one (fixes #7151) */
|
||||||
if (cursor == mouse->cur_cursor) {
|
if (cursor == mouse->current_cursor) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the new cursor */
|
/* Set the new cursor */
|
||||||
if (cursor) {
|
if (cursor) {
|
||||||
/* Make sure the cursor is still valid for this mouse */
|
/* Make sure the cursor is still valid for this mouse */
|
||||||
if (cursor != mouse->def_cursor) {
|
if (cursor != mouse->default_cursor) {
|
||||||
SDL_Cursor *found;
|
SDL_Cursor *found;
|
||||||
for (found = mouse->cursors; found; found = found->next) {
|
for (found = mouse->cursors; found; found = found->next) {
|
||||||
if (found == cursor) {
|
if (found == cursor) {
|
||||||
|
@ -1319,12 +1326,12 @@ int SDL_SetCursor(SDL_Cursor *cursor)
|
||||||
return SDL_SetError("Cursor not associated with the current mouse");
|
return SDL_SetError("Cursor not associated with the current mouse");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mouse->cur_cursor = cursor;
|
mouse->current_cursor = cursor;
|
||||||
} else {
|
} else {
|
||||||
if (mouse->focus) {
|
if (mouse->focus) {
|
||||||
cursor = mouse->cur_cursor;
|
cursor = mouse->current_cursor;
|
||||||
} else {
|
} else {
|
||||||
cursor = mouse->def_cursor;
|
cursor = mouse->default_cursor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1347,7 +1354,7 @@ SDL_Cursor *SDL_GetCursor(void)
|
||||||
if (mouse == NULL) {
|
if (mouse == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return mouse->cur_cursor;
|
return mouse->current_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Cursor *SDL_GetDefaultCursor(void)
|
SDL_Cursor *SDL_GetDefaultCursor(void)
|
||||||
|
@ -1357,7 +1364,7 @@ SDL_Cursor *SDL_GetDefaultCursor(void)
|
||||||
if (mouse == NULL) {
|
if (mouse == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return mouse->def_cursor;
|
return mouse->default_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDL_DestroyCursor(SDL_Cursor *cursor)
|
void SDL_DestroyCursor(SDL_Cursor *cursor)
|
||||||
|
@ -1369,11 +1376,11 @@ void SDL_DestroyCursor(SDL_Cursor *cursor)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursor == mouse->def_cursor) {
|
if (cursor == mouse->default_cursor) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (cursor == mouse->cur_cursor) {
|
if (cursor == mouse->current_cursor) {
|
||||||
SDL_SetCursor(mouse->def_cursor);
|
SDL_SetCursor(mouse->default_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (prev = NULL, curr = mouse->cursors; curr;
|
for (prev = NULL, curr = mouse->cursors; curr;
|
||||||
|
@ -1385,7 +1392,7 @@ void SDL_DestroyCursor(SDL_Cursor *cursor)
|
||||||
mouse->cursors = curr->next;
|
mouse->cursors = curr->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse->FreeCursor) {
|
if (mouse->FreeCursor && curr->driverdata) {
|
||||||
mouse->FreeCursor(curr);
|
mouse->FreeCursor(curr);
|
||||||
} else {
|
} else {
|
||||||
SDL_free(curr);
|
SDL_free(curr);
|
||||||
|
|
|
@ -114,8 +114,8 @@ typedef struct
|
||||||
SDL_MouseClickState *clickstate;
|
SDL_MouseClickState *clickstate;
|
||||||
|
|
||||||
SDL_Cursor *cursors;
|
SDL_Cursor *cursors;
|
||||||
SDL_Cursor *def_cursor;
|
SDL_Cursor *default_cursor;
|
||||||
SDL_Cursor *cur_cursor;
|
SDL_Cursor *current_cursor;
|
||||||
SDL_bool cursor_shown;
|
SDL_bool cursor_shown;
|
||||||
|
|
||||||
/* Driver-dependent data. */
|
/* Driver-dependent data. */
|
||||||
|
|
Loading…
Reference in New Issue