From f6f69f8044af4f479e15ca85bd2e950a9ab8c605 Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 10:56:46 +0200 Subject: [PATCH 1/7] #1473: SDL_SetWindowIcon now reports errors. --- include/SDL3/SDL_video.h | 7 ++++++- src/dynapi/SDL_dynapi_procs.h | 2 +- src/video/SDL_sysvideo.h | 2 +- src/video/SDL_video.c | 19 ++++++++++++++----- src/video/cocoa/SDL_cocoawindow.h | 2 +- src/video/cocoa/SDL_cocoawindow.m | 4 ++++ src/video/haiku/SDL_bwindow.cc | 6 ++++-- src/video/haiku/SDL_bwindow.h | 2 +- src/video/kmsdrm/SDL_kmsdrmvideo.c | 4 +++- src/video/kmsdrm/SDL_kmsdrmvideo.h | 2 +- src/video/psp/SDL_pspvideo.c | 4 +++- src/video/psp/SDL_pspvideo.h | 2 +- src/video/raspberry/SDL_rpivideo.c | 2 ++ src/video/raspberry/SDL_rpivideo.h | 2 +- src/video/vita/SDL_vitavideo.c | 4 +++- src/video/vita/SDL_vitavideo.h | 2 +- src/video/windows/SDL_windowswindow.c | 11 ++++++++++- src/video/windows/SDL_windowswindow.h | 2 +- src/video/x11/SDL_x11window.c | 4 +++- src/video/x11/SDL_x11window.h | 2 +- 20 files changed, 62 insertions(+), 23 deletions(-) diff --git a/include/SDL3/SDL_video.h b/include/SDL3/SDL_video.h index 07a978c69..36c318551 100644 --- a/include/SDL3/SDL_video.h +++ b/include/SDL3/SDL_video.h @@ -813,12 +813,17 @@ extern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_Window * window); /** * Set the icon for a window. * + * Systems that do not support setting an icon to the window, will always fail, + * reporting `SDL_UNSUPPORTED`. + * * \param window the window to change * \param icon an SDL_Surface structure containing the icon for the window + * \return 0 on success, an error code on failure; call SDL_GetError() for + * more information * * \since This function is available since SDL 3.0.0. */ -extern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_Window * window, +extern DECLSPEC int SDLCALL SDL_SetWindowIcon(SDL_Window * window, SDL_Surface * icon); /** diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 6e756a068..2fda998f7 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -702,7 +702,7 @@ SDL_DYNAPI_PROC(int,SDL_SetWindowDisplayMode,(SDL_Window *a, const SDL_DisplayMo SDL_DYNAPI_PROC(int,SDL_SetWindowFullscreen,(SDL_Window *a, Uint32 b),(a,b),return) SDL_DYNAPI_PROC(void,SDL_SetWindowGrab,(SDL_Window *a, SDL_bool b),(a,b),) SDL_DYNAPI_PROC(int,SDL_SetWindowHitTest,(SDL_Window *a, SDL_HitTest b, void *c),(a,b,c),return) -SDL_DYNAPI_PROC(void,SDL_SetWindowIcon,(SDL_Window *a, SDL_Surface *b),(a,b),) +SDL_DYNAPI_PROC(int,SDL_SetWindowIcon,(SDL_Window *a, SDL_Surface *b),(a,b),) SDL_DYNAPI_PROC(int,SDL_SetWindowInputFocus,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(void,SDL_SetWindowKeyboardGrab,(SDL_Window *a, SDL_bool b),(a,b),) SDL_DYNAPI_PROC(void,SDL_SetWindowMaximumSize,(SDL_Window *a, int b, int c),(a,b,c),) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 525a84f5b..24e6bfa7c 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -218,7 +218,7 @@ struct SDL_VideoDevice int (*CreateSDLWindow)(_THIS, SDL_Window *window); int (*CreateSDLWindowFrom)(_THIS, SDL_Window *window, const void *data); void (*SetWindowTitle)(_THIS, SDL_Window *window); - void (*SetWindowIcon)(_THIS, SDL_Window *window, SDL_Surface *icon); + int (*SetWindowIcon)(_THIS, SDL_Window *window, SDL_Surface *icon); void (*SetWindowPosition)(_THIS, SDL_Window *window); void (*SetWindowSize)(_THIS, SDL_Window *window); void (*SetWindowMinimumSize)(_THIS, SDL_Window *window); diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 6d9644eca..80399d8cf 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2023,12 +2023,15 @@ const char *SDL_GetWindowTitle(SDL_Window *window) return window->title ? window->title : ""; } -void SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon) +int SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon) { - CHECK_WINDOW_MAGIC(window, ); + int retVal = 0; + + CHECK_WINDOW_MAGIC(window, -1); if (icon == NULL) { - return; + SDL_SetError("SDL_SetWindowIcon(): Invalid surface"); + return -2; } SDL_DestroySurface(window->icon); @@ -2036,12 +2039,18 @@ void SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon) /* Convert the icon into ARGB8888 */ window->icon = SDL_ConvertSurfaceFormat(icon, SDL_PIXELFORMAT_ARGB8888); if (!window->icon) { - return; + SDL_SetError("SDL_SetWindowIcon(): Unable to convert the icon's format"); + return -3; } if (_this->SetWindowIcon) { - _this->SetWindowIcon(_this, window, window->icon); + retVal = _this->SetWindowIcon(_this, window, window->icon); + } else { + SDL_Unsupported(); + return SDL_UNSUPPORTED; } + + return retVal; } void *SDL_SetWindowData(SDL_Window *window, const char *name, void *userdata) diff --git a/src/video/cocoa/SDL_cocoawindow.h b/src/video/cocoa/SDL_cocoawindow.h index d3b108deb..1e27e6e37 100644 --- a/src/video/cocoa/SDL_cocoawindow.h +++ b/src/video/cocoa/SDL_cocoawindow.h @@ -142,7 +142,7 @@ extern int Cocoa_CreateWindow(_THIS, SDL_Window *window); extern int Cocoa_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); extern void Cocoa_SetWindowTitle(_THIS, SDL_Window *window); -extern void Cocoa_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +extern int Cocoa_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); extern void Cocoa_SetWindowPosition(_THIS, SDL_Window *window); extern void Cocoa_SetWindowSize(_THIS, SDL_Window *window); extern void Cocoa_SetWindowMinimumSize(_THIS, SDL_Window *window); diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 94f53190e..f57a8b9d4 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -1887,7 +1887,11 @@ void Cocoa_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) if (nsimage) { [NSApp setApplicationIconImage:nsimage]; + + return 0; } + + return -1; } } diff --git a/src/video/haiku/SDL_bwindow.cc b/src/video/haiku/SDL_bwindow.cc index 121e4c427..1cfd090a3 100644 --- a/src/video/haiku/SDL_bwindow.cc +++ b/src/video/haiku/SDL_bwindow.cc @@ -127,8 +127,10 @@ void HAIKU_SetWindowTitle(_THIS, SDL_Window * window) { _ToBeWin(window)->PostMessage(&msg); } -void HAIKU_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) { - /* FIXME: Icons not supported by Haiku */ +int HAIKU_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) { + /* Icons not supported by Haiku */ + SDL_Unsupported(); + return SDL_UNSUPPORTED; } void HAIKU_SetWindowPosition(_THIS, SDL_Window * window) { diff --git a/src/video/haiku/SDL_bwindow.h b/src/video/haiku/SDL_bwindow.h index d42c3e580..0e825448f 100644 --- a/src/video/haiku/SDL_bwindow.h +++ b/src/video/haiku/SDL_bwindow.h @@ -27,7 +27,7 @@ extern int HAIKU_CreateWindow(_THIS, SDL_Window *window); extern int HAIKU_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); extern void HAIKU_SetWindowTitle(_THIS, SDL_Window *window); -extern void HAIKU_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +extern int HAIKU_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); extern void HAIKU_SetWindowPosition(_THIS, SDL_Window *window); extern void HAIKU_SetWindowSize(_THIS, SDL_Window *window); extern void HAIKU_SetWindowMinimumSize(_THIS, SDL_Window *window); diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index 93b4ca46c..ca54ce2e2 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -1559,8 +1559,10 @@ int KMSDRM_CreateWindowFrom(_THIS, SDL_Window *window, const void *data) void KMSDRM_SetWindowTitle(_THIS, SDL_Window *window) { } -void KMSDRM_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) +int KMSDRM_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { + SDL_Unsupported(); + return SDL_UNSUPPORTED; } void KMSDRM_SetWindowPosition(_THIS, SDL_Window *window) { diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h index b9044cecd..179f53871 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h @@ -124,7 +124,7 @@ int KMSDRM_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mod int KMSDRM_CreateWindow(_THIS, SDL_Window *window); int KMSDRM_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); void KMSDRM_SetWindowTitle(_THIS, SDL_Window *window); -void KMSDRM_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +int KMSDRM_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); void KMSDRM_SetWindowPosition(_THIS, SDL_Window *window); void KMSDRM_SetWindowSize(_THIS, SDL_Window *window); void KMSDRM_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *_display, SDL_bool fullscreen); diff --git a/src/video/psp/SDL_pspvideo.c b/src/video/psp/SDL_pspvideo.c index 70c764851..8e6f6cea6 100644 --- a/src/video/psp/SDL_pspvideo.c +++ b/src/video/psp/SDL_pspvideo.c @@ -217,8 +217,10 @@ int PSP_CreateWindowFrom(_THIS, SDL_Window *window, const void *data) void PSP_SetWindowTitle(_THIS, SDL_Window *window) { } -void PSP_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) +int PSP_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { + SDL_Unsupported(); + return SDL_UNSUPPORTED; } void PSP_SetWindowPosition(_THIS, SDL_Window *window) { diff --git a/src/video/psp/SDL_pspvideo.h b/src/video/psp/SDL_pspvideo.h index 036e7224d..c6ee78edb 100644 --- a/src/video/psp/SDL_pspvideo.h +++ b/src/video/psp/SDL_pspvideo.h @@ -57,7 +57,7 @@ int PSP_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode); int PSP_CreateWindow(_THIS, SDL_Window *window); int PSP_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); void PSP_SetWindowTitle(_THIS, SDL_Window *window); -void PSP_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +int PSP_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); void PSP_SetWindowPosition(_THIS, SDL_Window *window); void PSP_SetWindowSize(_THIS, SDL_Window *window); void PSP_ShowWindow(_THIS, SDL_Window *window); diff --git a/src/video/raspberry/SDL_rpivideo.c b/src/video/raspberry/SDL_rpivideo.c index 7dd4017ef..4459bfda1 100644 --- a/src/video/raspberry/SDL_rpivideo.c +++ b/src/video/raspberry/SDL_rpivideo.c @@ -368,6 +368,8 @@ void RPI_SetWindowTitle(_THIS, SDL_Window *window) } void RPI_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { + SDL_Unsupported(); + return SDL_UNSUPPORTED; } void RPI_SetWindowPosition(_THIS, SDL_Window *window) { diff --git a/src/video/raspberry/SDL_rpivideo.h b/src/video/raspberry/SDL_rpivideo.h index 6fff482ea..15407d767 100644 --- a/src/video/raspberry/SDL_rpivideo.h +++ b/src/video/raspberry/SDL_rpivideo.h @@ -67,7 +67,7 @@ int RPI_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode); int RPI_CreateWindow(_THIS, SDL_Window *window); int RPI_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); void RPI_SetWindowTitle(_THIS, SDL_Window *window); -void RPI_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +int RPI_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); void RPI_SetWindowPosition(_THIS, SDL_Window *window); void RPI_SetWindowSize(_THIS, SDL_Window *window); void RPI_ShowWindow(_THIS, SDL_Window *window); diff --git a/src/video/vita/SDL_vitavideo.c b/src/video/vita/SDL_vitavideo.c index 6732e4701..bd9c94454 100644 --- a/src/video/vita/SDL_vitavideo.c +++ b/src/video/vita/SDL_vitavideo.c @@ -325,8 +325,10 @@ int VITA_CreateWindowFrom(_THIS, SDL_Window *window, const void *data) void VITA_SetWindowTitle(_THIS, SDL_Window *window) { } -void VITA_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) +int VITA_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { + SDL_Unsupported(); + return SDL_UNSUPPORTED; } void VITA_SetWindowPosition(_THIS, SDL_Window *window) { diff --git a/src/video/vita/SDL_vitavideo.h b/src/video/vita/SDL_vitavideo.h index 68a34577f..7c393e0d6 100644 --- a/src/video/vita/SDL_vitavideo.h +++ b/src/video/vita/SDL_vitavideo.h @@ -70,7 +70,7 @@ int VITA_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode) int VITA_CreateWindow(_THIS, SDL_Window *window); int VITA_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); void VITA_SetWindowTitle(_THIS, SDL_Window *window); -void VITA_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +int VITA_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); void VITA_SetWindowPosition(_THIS, SDL_Window *window); void VITA_SetWindowSize(_THIS, SDL_Window *window); void VITA_ShowWindow(_THIS, SDL_Window *window); diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 7f792dc82..da553ee98 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -620,8 +620,9 @@ void WIN_SetWindowTitle(_THIS, SDL_Window *window) #endif } -void WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) +int WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { + int retVal = 0; #if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) HWND hwnd = ((SDL_WindowData *)window->driverdata)->hwnd; HICON hicon = NULL; @@ -666,6 +667,10 @@ void WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) SDL_memset(icon_bmp + icon_len - mask_len, 0xFF, mask_len); hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000); + if (hicon == NULL) { + SDL_SetError("SDL_SetWindowIcon(): Unable to create a resource from the icon"); + retVal = -1; + } SDL_small_free(icon_bmp, isstack); @@ -674,7 +679,11 @@ void WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) /* Set the icon in the task manager (should we do this?) */ SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hicon); +#else + SDL_Unsupported(); + retVal = SDL_UNSUPPORTED; #endif + return retVal; } void WIN_SetWindowPosition(_THIS, SDL_Window *window) diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h index 4490f48d7..a65004e69 100644 --- a/src/video/windows/SDL_windowswindow.h +++ b/src/video/windows/SDL_windowswindow.h @@ -77,7 +77,7 @@ typedef struct extern int WIN_CreateWindow(_THIS, SDL_Window *window); extern int WIN_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); extern void WIN_SetWindowTitle(_THIS, SDL_Window *window); -extern void WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +extern int WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); extern void WIN_SetWindowPosition(_THIS, SDL_Window *window); extern void WIN_SetWindowSize(_THIS, SDL_Window *window); extern int WIN_GetWindowBordersSize(_THIS, SDL_Window *window, int *top, int *left, int *bottom, int *right); diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index c088d21a6..652c67b0c 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -738,7 +738,7 @@ void X11_SetWindowTitle(_THIS, SDL_Window *window) SDL_X11_SetWindowTitle(display, xwindow, title); } -void X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) +int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { SDL_WindowData *data = (SDL_WindowData *)window->driverdata; Display *display = data->videodata->display; @@ -775,6 +775,8 @@ void X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) X11_XDeleteProperty(display, data->xwindow, _NET_WM_ICON); } X11_XFlush(display); + + return 0; } static SDL_bool caught_x11_error = SDL_FALSE; diff --git a/src/video/x11/SDL_x11window.h b/src/video/x11/SDL_x11window.h index 97756b815..fc8e1a876 100644 --- a/src/video/x11/SDL_x11window.h +++ b/src/video/x11/SDL_x11window.h @@ -87,7 +87,7 @@ extern int X11_CreateWindow(_THIS, SDL_Window *window); extern int X11_CreateWindowFrom(_THIS, SDL_Window *window, const void *data); extern char *X11_GetWindowTitle(_THIS, Window xwindow); extern void X11_SetWindowTitle(_THIS, SDL_Window *window); -extern void X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); +extern int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon); extern void X11_SetWindowPosition(_THIS, SDL_Window *window); extern void X11_SetWindowMinimumSize(_THIS, SDL_Window *window); extern void X11_SetWindowMaximumSize(_THIS, SDL_Window *window); From 54b1e24ca0f62c3c32d6e9cabfbbf79fdcd54ba3 Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 11:08:52 +0200 Subject: [PATCH 2/7] Fix issue with dynapi --- src/dynapi/SDL_dynapi_procs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 2fda998f7..f95958367 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -702,7 +702,7 @@ SDL_DYNAPI_PROC(int,SDL_SetWindowDisplayMode,(SDL_Window *a, const SDL_DisplayMo SDL_DYNAPI_PROC(int,SDL_SetWindowFullscreen,(SDL_Window *a, Uint32 b),(a,b),return) SDL_DYNAPI_PROC(void,SDL_SetWindowGrab,(SDL_Window *a, SDL_bool b),(a,b),) SDL_DYNAPI_PROC(int,SDL_SetWindowHitTest,(SDL_Window *a, SDL_HitTest b, void *c),(a,b,c),return) -SDL_DYNAPI_PROC(int,SDL_SetWindowIcon,(SDL_Window *a, SDL_Surface *b),(a,b),) +SDL_DYNAPI_PROC(int,SDL_SetWindowIcon,(SDL_Window *a, SDL_Surface *b),(a,b),return) SDL_DYNAPI_PROC(int,SDL_SetWindowInputFocus,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(void,SDL_SetWindowKeyboardGrab,(SDL_Window *a, SDL_bool b),(a,b),) SDL_DYNAPI_PROC(void,SDL_SetWindowMaximumSize,(SDL_Window *a, int b, int c),(a,b,c),) From ab9388bc966e934a83dfb9fa3edc00f3731585cb Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 11:19:38 +0200 Subject: [PATCH 3/7] Change return type for Cocoa_SetWindowIcon --- src/video/cocoa/SDL_cocoawindow.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index f57a8b9d4..4f52e5eec 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -1880,7 +1880,7 @@ void Cocoa_SetWindowTitle(_THIS, SDL_Window *window) } } -void Cocoa_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) +int Cocoa_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { @autoreleasepool { NSImage *nsimage = Cocoa_CreateImage(icon); From abffb52d1822ef3bfc2477e38329d373c6363415 Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 15:06:46 +0200 Subject: [PATCH 4/7] Move condition after freeing the resource. --- src/video/windows/SDL_windowswindow.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index da553ee98..47f139b1d 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -667,13 +667,14 @@ int WIN_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) SDL_memset(icon_bmp + icon_len - mask_len, 0xFF, mask_len); hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000); - if (hicon == NULL) { - SDL_SetError("SDL_SetWindowIcon(): Unable to create a resource from the icon"); - retVal = -1; - } SDL_small_free(icon_bmp, isstack); + if (hicon == NULL) { + SDL_SetError("SDL_SetWindowIcon(): Unable to create a resource from the icon"); + retVal = (int)GetLastError(); + } + /* Set the icon for the window */ SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon); From ebc634db83b3d67e5e96134b9ae40ee61b8c4d43 Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 15:30:50 +0200 Subject: [PATCH 5/7] Proper error handling for X11 --- src/video/x11/SDL_x11window.c | 58 ++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 652c67b0c..d4dd6c817 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -743,6 +743,8 @@ int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) SDL_WindowData *data = (SDL_WindowData *)window->driverdata; Display *display = data->videodata->display; Atom _NET_WM_ICON = data->videodata->_NET_WM_ICON; + int retVal = 0; + int (*prevHandler)(Display *, XErrorEvent *) = NULL; if (icon) { int propsize; @@ -752,31 +754,57 @@ int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) SDL_assert(icon->format->format == SDL_PIXELFORMAT_ARGB8888); propsize = 2 + (icon->w * icon->h); propdata = SDL_malloc(propsize * sizeof(long)); - if (propdata) { - int x, y; - Uint32 *src; - long *dst; - propdata[0] = icon->w; - propdata[1] = icon->h; - dst = &propdata[2]; - for (y = 0; y < icon->h; ++y) { - src = (Uint32 *)((Uint8 *)icon->pixels + y * icon->pitch); - for (x = 0; x < icon->w; ++x) { - *dst++ = *src++; - } + if (!propdata) { + SDL_OutOfMemory() + return SDL_ENOMEM; + } + + prevHandler = X11_XSetErrorHandler(X11_CatchAnyError); + + int x, y; + Uint32 *src; + long *dst; + + propdata[0] = icon->w; + propdata[1] = icon->h; + dst = &propdata[2]; + for (y = 0; y < icon->h; ++y) { + src = (Uint32 *)((Uint8 *)icon->pixels + y * icon->pitch); + for (x = 0; x < icon->w; ++x) { + *dst++ = *src++; } - X11_XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL, + } + + X11_XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)propdata, propsize); - } SDL_free(propdata); + + if (caught_x11_error) { + SDL_SetError("SDL_SetWindowIcon(): An error occurred while trying to set the window's icon"); + retVal = -1; + } + } else { + prevHandler = X11_XSetErrorHandler(X11_CatchAnyError); X11_XDeleteProperty(display, data->xwindow, _NET_WM_ICON); + + if (caught_x11_error) { + SDL_SetError("SDL_SetWindowIcon(): An error occurred while trying to unset the window's icon"); + retVal = -1; + } } + + X11_XFlush(display); - return 0; + if (prevHandler != NULL) { + X11_XSetErrorHandler(prev_handler); + caught_x11_error = SDL_FALSE; + } + + return retVal; } static SDL_bool caught_x11_error = SDL_FALSE; From 8cfbd0e7129107b2d5650362c00dfd3ecc23c4df Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 15:44:00 +0200 Subject: [PATCH 6/7] Add missing semicolon and move function --- src/video/x11/SDL_x11window.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index d4dd6c817..a908fe63f 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -738,6 +738,15 @@ void X11_SetWindowTitle(_THIS, SDL_Window *window) SDL_X11_SetWindowTitle(display, xwindow, title); } +static SDL_bool caught_x11_error = SDL_FALSE; +static int X11_CatchAnyError(Display *d, XErrorEvent *e) +{ + /* this may happen during tumultuous times when we are polling anyhow, + so just note we had an error and return control. */ + caught_x11_error = SDL_TRUE; + return 0; +} + int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) { SDL_WindowData *data = (SDL_WindowData *)window->driverdata; @@ -750,25 +759,26 @@ int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) int propsize; long *propdata; + int x, y; + Uint32 *src; + long *dst; + /* Set the _NET_WM_ICON property */ SDL_assert(icon->format->format == SDL_PIXELFORMAT_ARGB8888); propsize = 2 + (icon->w * icon->h); propdata = SDL_malloc(propsize * sizeof(long)); if (!propdata) { - SDL_OutOfMemory() + SDL_OutOfMemory(); return SDL_ENOMEM; } prevHandler = X11_XSetErrorHandler(X11_CatchAnyError); - int x, y; - Uint32 *src; - long *dst; - propdata[0] = icon->w; propdata[1] = icon->h; dst = &propdata[2]; + for (y = 0; y < icon->h; ++y) { src = (Uint32 *)((Uint8 *)icon->pixels + y * icon->pitch); for (x = 0; x < icon->w; ++x) { @@ -807,15 +817,6 @@ int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) return retVal; } -static SDL_bool caught_x11_error = SDL_FALSE; -static int X11_CatchAnyError(Display *d, XErrorEvent *e) -{ - /* this may happen during tumultuous times when we are polling anyhow, - so just note we had an error and return control. */ - caught_x11_error = SDL_TRUE; - return 0; -} - void X11_SetWindowPosition(_THIS, SDL_Window *window) { SDL_WindowData *data = (SDL_WindowData *)window->driverdata; From b672f2f1f93fda486fd7f623b6409c8fb0d9b29b Mon Sep 17 00:00:00 2001 From: Alexandros Koutroulis Date: Sat, 14 Jan 2023 15:50:46 +0200 Subject: [PATCH 7/7] Fix typo --- src/video/x11/SDL_x11window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index a908fe63f..33669a1f2 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -810,7 +810,7 @@ int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon) X11_XFlush(display); if (prevHandler != NULL) { - X11_XSetErrorHandler(prev_handler); + X11_XSetErrorHandler(prevHandler); caught_x11_error = SDL_FALSE; }