diff --git a/include/SDL3/SDL_messagebox.h b/include/SDL3/SDL_messagebox.h index 365ae36a5a69c..fcc251cdf1582 100644 --- a/include/SDL3/SDL_messagebox.h +++ b/include/SDL3/SDL_messagebox.h @@ -63,6 +63,7 @@ typedef Uint32 SDL_MessageBoxFlags; #define SDL_MESSAGEBOX_INFORMATION 0x00000040u /**< informational dialog */ #define SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT 0x00000080u /**< buttons placed left to right */ #define SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT 0x00000100u /**< buttons placed right to left */ +#define SDL_MESSAGEBOX_QUESTION 0x00000200u /**< question dialog, since 3.4.0 */ /** * SDL_MessageBoxButtonData flags. diff --git a/src/dialog/unix/SDL_zenitymessagebox.c b/src/dialog/unix/SDL_zenitymessagebox.c index 3638416ea5500..769152bd2721b 100644 --- a/src/dialog/unix/SDL_zenitymessagebox.c +++ b/src/dialog/unix/SDL_zenitymessagebox.c @@ -97,13 +97,16 @@ bool SDL_Zenity_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *bu * We need to handle it gracefully, otherwise no message box will be shown. */ argv[argc++] = zenity_major > 3 || (zenity_major == 3 && zenity_minor >= 90) ? "--icon" : "--icon-name"; - switch (messageboxdata->flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION)) { + switch (messageboxdata->flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION | SDL_MESSAGEBOX_QUESTION)) { case SDL_MESSAGEBOX_ERROR: argv[argc++] = "dialog-error"; break; case SDL_MESSAGEBOX_WARNING: argv[argc++] = "dialog-warning"; break; + case SDL_MESSAGEBOX_QUESTION: + argv[argc++] = "dialog-question"; + break; case SDL_MESSAGEBOX_INFORMATION: default: argv[argc++] = "dialog-information"; diff --git a/src/video/windows/SDL_windowsmessagebox.c b/src/video/windows/SDL_windowsmessagebox.c index fcb0107d5cd07..fce0de1c73a3f 100644 --- a/src/video/windows/SDL_windowsmessagebox.c +++ b/src/video/windows/SDL_windowsmessagebox.c @@ -728,7 +728,7 @@ static bool WIN_ShowOldMessageBox(const SDL_MessageBoxData *messageboxdata, int return SDL_SetError("Number of buttons exceeds limit of %d", MAX_BUTTONS); } - switch (messageboxdata->flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION)) { + switch (messageboxdata->flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION | SDL_MESSAGEBOX_QUESTION)) { case SDL_MESSAGEBOX_ERROR: icon = (Uint16)(size_t)IDI_ERROR; break; @@ -738,7 +738,10 @@ static bool WIN_ShowOldMessageBox(const SDL_MessageBoxData *messageboxdata, int case SDL_MESSAGEBOX_INFORMATION: icon = (Uint16)(size_t)IDI_INFORMATION; break; - } + case SDL_MESSAGEBOX_QUESTION: + icon = (Uint16)(size_t)IDI_QUESTION; + break; + } /* Jan 25th, 2013 - dant@fleetsa.com * @@ -1006,6 +1009,9 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) TaskConfig.pszMainIcon = TD_WARNING_ICON; } else if (messageboxdata->flags & SDL_MESSAGEBOX_INFORMATION) { TaskConfig.pszMainIcon = TD_INFORMATION_ICON; + } else if (messageboxdata->flags & SDL_MESSAGEBOX_QUESTION) { + TaskConfig.dwFlags |= TDF_USE_HICON_MAIN; + TaskConfig.hMainIcon = LoadIcon(NULL, IDI_QUESTION); } else { TaskConfig.pszMainIcon = NULL; } diff --git a/src/video/x11/SDL_x11toolkit.c b/src/video/x11/SDL_x11toolkit.c index f690c72cca5db..320ce1a072367 100644 --- a/src/video/x11/SDL_x11toolkit.c +++ b/src/video/x11/SDL_x11toolkit.c @@ -155,7 +155,7 @@ typedef struct SDL_ToolkitMenuControlX11 } SDL_ToolkitMenuControlX11; /* Font for icon control */ -static const char *g_IconFont = "-*-*-bold-r-normal-*-%d-*-*-*-*-*-iso8859-1[33 88 105]"; +static const char *g_IconFont = "-*-*-bold-r-normal-*-%d-*-*-*-*-*-iso8859-1[33 88 105 63]"; #define G_ICONFONT_SIZE 22 /* General UI font */ @@ -1845,7 +1845,7 @@ static void X11Toolkit_DrawIconControl(SDL_ToolkitControlX11 *control) { X11_XSetForeground(control->window->display, control->window->ctx, icon_control->xcolor_bg_shadow.pixel); X11_XFillArc(control->window->display, control->window->drawable, control->window->ctx, control->rect.x + (2 * control->window->iscale), control->rect.y + (2* control->window->iscale), control->rect.w, control->rect.h, 0, 360 * 64); - switch (icon_control->flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION)) { + switch (icon_control->flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION | SDL_MESSAGEBOX_QUESTION)) { case SDL_MESSAGEBOX_ERROR: X11_XSetForeground(control->window->display, control->window->ctx, icon_control->xcolor_red_darker.pixel); X11_XFillArc(control->window->display, control->window->drawable, control->window->ctx, control->rect.x, control->rect.y, control->rect.w, control->rect.h, 0, 360 * 64); @@ -1860,6 +1860,7 @@ static void X11Toolkit_DrawIconControl(SDL_ToolkitControlX11 *control) { X11_XFillArc(control->window->display, control->window->drawable, control->window->ctx, control->rect.x+(1* control->window->iscale), control->rect.y+(1* control->window->iscale), control->rect.w-(2* control->window->iscale), control->rect.h-(2* control->window->iscale), 0, 360 * 64); X11_XSetForeground(control->window->display, control->window->ctx, icon_control->xcolor_black.pixel); break; + case SDL_MESSAGEBOX_QUESTION: case SDL_MESSAGEBOX_INFORMATION: X11_XSetForeground(control->window->display, control->window->ctx, icon_control->xcolor_white.pixel); X11_XFillArc(control->window->display, control->window->drawable, control->window->ctx, control->rect.x, control->rect.y, control->rect.w, control->rect.h, 0, 360 * 64); @@ -1956,7 +1957,7 @@ SDL_ToolkitControlX11 *X11Toolkit_CreateIconControl(SDL_ToolkitWindowX11 *window } /* Set colors */ - switch (flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION)) { + switch (flags & (SDL_MESSAGEBOX_ERROR | SDL_MESSAGEBOX_WARNING | SDL_MESSAGEBOX_INFORMATION | SDL_MESSAGEBOX_QUESTION)) { case SDL_MESSAGEBOX_ERROR: control->icon_char = 'X'; control->xcolor_white.flags = DoRed|DoGreen|DoBlue; @@ -2001,6 +2002,19 @@ SDL_ToolkitControlX11 *X11Toolkit_CreateIconControl(SDL_ToolkitWindowX11 *window X11_XAllocColor(window->display, window->cmap, &control->xcolor_white); X11_XAllocColor(window->display, window->cmap, &control->xcolor_blue); break; + case SDL_MESSAGEBOX_QUESTION: + control->icon_char = '?'; + control->xcolor_white.flags = DoRed|DoGreen|DoBlue; + control->xcolor_white.red = 65535; + control->xcolor_white.green = 65535; + control->xcolor_white.blue = 65535; + control->xcolor_blue.flags = DoRed|DoGreen|DoBlue; + control->xcolor_blue.red = 0; + control->xcolor_blue.green = 0; + control->xcolor_blue.blue = 65535; + X11_XAllocColor(window->display, window->cmap, &control->xcolor_white); + X11_XAllocColor(window->display, window->cmap, &control->xcolor_blue); + break; default: X11_XFreeFont(window->display, control->icon_char_font); SDL_free(control); diff --git a/test/testmessage.c b/test/testmessage.c index 272484215ac56..f80e67ec7b705 100644 --- a/test/testmessage.c +++ b/test/testmessage.c @@ -307,6 +307,15 @@ int main(int argc, char *argv[]) SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s", SDL_GetError()); quit(1); } + + success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_QUESTION, + "Question icon", + "This is a MessageBox with a question icon.", + NULL); + if (!success) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s", SDL_GetError()); + quit(1); + } button_messagebox(NULL);