From b8d91252c6488cf9c645aba447b56bb9dbd9609a Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 25 Jul 2023 11:48:10 -0700
Subject: [PATCH] Fixed automation tests using the dummy video driver
---
src/events/SDL_mouse.c | 32 ++++++++++++++++++++++++--------
src/video/SDL_video.c | 32 ++++++++++++++++++++++++--------
src/video/dummy/SDL_nullvideo.c | 7 -------
test/testautomation_video.c | 2 ++
4 files changed, 50 insertions(+), 23 deletions(-)
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index e25695df6c6d..6591f327d1bf 100644
--- a/src/events/SDL_mouse.c
+++ b/src/events/SDL_mouse.c
@@ -204,6 +204,14 @@ int SDL_InitMouse(void)
mouse->cursor_shown = SDL_TRUE;
+ if (!mouse->CreateCursor) {
+ SDL_Surface *surface = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_ARGB8888);
+ if (surface) {
+ SDL_memset(surface->pixels, 0, (size_t)surface->h * surface->pitch);
+ SDL_SetDefaultCursor(SDL_CreateColorCursor(surface, 0, 0));
+ SDL_DestroySurface(surface);
+ }
+ }
return 0;
}
@@ -846,8 +854,12 @@ void SDL_QuitMouse(void)
mouse->cursors = NULL;
mouse->cur_cursor = NULL;
- if (mouse->def_cursor && mouse->FreeCursor) {
- mouse->FreeCursor(mouse->def_cursor);
+ if (mouse->def_cursor) {
+ if (mouse->FreeCursor) {
+ mouse->FreeCursor(mouse->def_cursor);
+ } else {
+ SDL_free(mouse->def_cursor);
+ }
mouse->def_cursor = NULL;
}
@@ -1220,11 +1232,6 @@ SDL_Cursor *SDL_CreateColorCursor(SDL_Surface *surface, int hot_x, int hot_y)
return NULL;
}
- if (!mouse->CreateCursor) {
- SDL_SetError("Cursors are not currently supported");
- return NULL;
- }
-
/* Sanity check the hot spot */
if ((hot_x < 0) || (hot_y < 0) ||
(hot_x >= surface->w) || (hot_y >= surface->h)) {
@@ -1240,7 +1247,14 @@ SDL_Cursor *SDL_CreateColorCursor(SDL_Surface *surface, int hot_x, int hot_y)
surface = temp;
}
- cursor = mouse->CreateCursor(surface, hot_x, hot_y);
+ if (mouse->CreateCursor) {
+ cursor = mouse->CreateCursor(surface, hot_x, hot_y);
+ } else {
+ cursor = SDL_calloc(1, sizeof(*cursor));
+ if (!cursor) {
+ SDL_OutOfMemory();
+ }
+ }
if (cursor) {
cursor->next = mouse->cursors;
mouse->cursors = cursor;
@@ -1365,6 +1379,8 @@ void SDL_DestroyCursor(SDL_Cursor *cursor)
if (mouse->FreeCursor) {
mouse->FreeCursor(curr);
+ } else {
+ SDL_free(curr);
}
return;
}
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 05de90bfbcec..82bf6e8abe46 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -1607,9 +1607,18 @@ static int SDL_UpdateFullscreenMode(SDL_Window *window, SDL_bool fullscreen)
}
if (_this->SetWindowFullscreen) {
_this->SetWindowFullscreen(_this, window, display, SDL_TRUE);
+ } else {
+ resized = SDL_TRUE;
}
display->fullscreen_window = window;
+ if (mode) {
+ mode_w = mode->w;
+ mode_h = mode->h;
+ } else {
+ mode_w = display->desktop_mode.w;
+ mode_h = display->desktop_mode.h;
+ }
#ifdef __ANDROID__
/* Android may not resize the window to exactly what our fullscreen mode is,
* especially on windowed Android environments like the Chromebook or Samsung DeX.
@@ -1621,13 +1630,6 @@ static int SDL_UpdateFullscreenMode(SDL_Window *window, SDL_bool fullscreen)
* WM_WINDOWPOSCHANGED will send SDL_EVENT_WINDOW_RESIZED).
*/
#else
- if (mode) {
- mode_w = mode->w;
- mode_h = mode->h;
- } else {
- mode_w = display->desktop_mode.w;
- mode_h = display->desktop_mode.h;
- }
if (window->w != mode_w || window->h != mode_h) {
resized = SDL_TRUE;
}
@@ -1642,14 +1644,22 @@ static int SDL_UpdateFullscreenMode(SDL_Window *window, SDL_bool fullscreen)
SDL_RestoreMousePosition(window);
} else {
+ SDL_bool resized = SDL_FALSE;
+
/* Restore the desktop mode */
SDL_SetDisplayModeForDisplay(display, NULL);
if (_this->SetWindowFullscreen) {
_this->SetWindowFullscreen(_this, window, display, SDL_FALSE);
+ } else {
+ resized = SDL_TRUE;
}
display->fullscreen_window = NULL;
- SDL_OnWindowResized(window);
+ if (resized) {
+ SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, window->windowed.w, window->windowed.h);
+ } else {
+ SDL_OnWindowResized(window);
+ }
/* Restore the cursor position */
SDL_RestoreMousePosition(window);
@@ -2804,6 +2814,9 @@ int SDL_ShowWindow(SDL_Window *window)
if (_this->ShowWindow) {
_this->ShowWindow(_this, window);
+ } else {
+ SDL_SetMouseFocus(window);
+ SDL_SetKeyboardFocus(window);
}
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_SHOWN, 0, 0);
@@ -2847,6 +2860,9 @@ int SDL_HideWindow(SDL_Window *window)
window->is_hiding = SDL_TRUE;
if (_this->HideWindow) {
_this->HideWindow(_this, window);
+ } else {
+ SDL_SetMouseFocus(NULL);
+ SDL_SetKeyboardFocus(NULL);
}
window->is_hiding = SDL_FALSE;
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_HIDDEN, 0, 0);
diff --git a/src/video/dummy/SDL_nullvideo.c b/src/video/dummy/SDL_nullvideo.c
index e46bb3aa8c1b..d2bd677beb2c 100644
--- a/src/video/dummy/SDL_nullvideo.c
+++ b/src/video/dummy/SDL_nullvideo.c
@@ -53,7 +53,6 @@
/* Initialization/Query functions */
static int DUMMY_VideoInit(SDL_VideoDevice *_this);
-static int DUMMY_SetDisplayMode(SDL_VideoDevice *_this, SDL_VideoDisplay *display, SDL_DisplayMode *mode);
static void DUMMY_VideoQuit(SDL_VideoDevice *_this);
/* DUMMY driver bootstrap functions */
@@ -93,7 +92,6 @@ static SDL_VideoDevice *DUMMY_InternalCreateDevice(const char *enable_hint)
/* Set the function pointers */
device->VideoInit = DUMMY_VideoInit;
device->VideoQuit = DUMMY_VideoQuit;
- device->SetDisplayMode = DUMMY_SetDisplayMode;
device->PumpEvents = DUMMY_PumpEvents;
device->CreateWindowFramebuffer = SDL_DUMMY_CreateWindowFramebuffer;
device->UpdateWindowFramebuffer = SDL_DUMMY_UpdateWindowFramebuffer;
@@ -158,11 +156,6 @@ int DUMMY_VideoInit(SDL_VideoDevice *_this)
return 0;
}
-static int DUMMY_SetDisplayMode(SDL_VideoDevice *_this, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
-{
- return 0;
-}
-
void DUMMY_VideoQuit(SDL_VideoDevice *_this)
{
#ifdef SDL_INPUT_LINUXEV
diff --git a/test/testautomation_video.c b/test/testautomation_video.c
index ff31e93dcf86..8300b2cee6ca 100644
--- a/test/testautomation_video.c
+++ b/test/testautomation_video.c
@@ -172,6 +172,8 @@ static int video_createWindowVariousFlags(void *arg)
break;
case 2:
flags = SDL_WINDOW_OPENGL;
+ /* Skip - not every video driver supports OpenGL; comment out next line to run test */
+ continue;
break;
case 3:
flags = 0;