diff options
Diffstat (limited to '3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c')
-rw-r--r-- | 3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c | 482 |
1 files changed, 0 insertions, 482 deletions
diff --git a/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c b/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c deleted file mode 100644 index 689e5bbc386..00000000000 --- a/3rdparty/SDL2/src/video/windows/SDL_windowsmessagebox.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WINDOWS - -#include "../../core/windows/SDL_windows.h" - -#include "SDL_assert.h" -#include "SDL_windowsvideo.h" - - -#ifndef SS_EDITCONTROL -#define SS_EDITCONTROL 0x2000 -#endif - -/* Display a Windows message box */ - -#pragma pack(push, 1) - -typedef struct -{ - WORD dlgVer; - WORD signature; - DWORD helpID; - DWORD exStyle; - DWORD style; - WORD cDlgItems; - short x; - short y; - short cx; - short cy; -} DLGTEMPLATEEX; - -typedef struct -{ - DWORD helpID; - DWORD exStyle; - DWORD style; - short x; - short y; - short cx; - short cy; - DWORD id; -} DLGITEMTEMPLATEEX; - -#pragma pack(pop) - -typedef struct -{ - DLGTEMPLATEEX* lpDialog; - Uint8 *data; - size_t size; - size_t used; -} WIN_DialogData; - - -static INT_PTR MessageBoxDialogProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) -{ - switch ( iMessage ) { - case WM_COMMAND: - /* Return the ID of the button that was pushed */ - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - - default: - break; - } - return FALSE; -} - -static SDL_bool ExpandDialogSpace(WIN_DialogData *dialog, size_t space) -{ - size_t size = dialog->size; - - if (size == 0) { - size = space; - } else { - while ((dialog->used + space) > size) { - size *= 2; - } - } - if (size > dialog->size) { - void *data = SDL_realloc(dialog->data, size); - if (!data) { - SDL_OutOfMemory(); - return SDL_FALSE; - } - dialog->data = data; - dialog->size = size; - dialog->lpDialog = (DLGTEMPLATEEX*)dialog->data; - } - return SDL_TRUE; -} - -static SDL_bool AlignDialogData(WIN_DialogData *dialog, size_t size) -{ - size_t padding = (dialog->used % size); - - if (!ExpandDialogSpace(dialog, padding)) { - return SDL_FALSE; - } - - dialog->used += padding; - - return SDL_TRUE; -} - -static SDL_bool AddDialogData(WIN_DialogData *dialog, const void *data, size_t size) -{ - if (!ExpandDialogSpace(dialog, size)) { - return SDL_FALSE; - } - - SDL_memcpy(dialog->data+dialog->used, data, size); - dialog->used += size; - - return SDL_TRUE; -} - -static SDL_bool AddDialogString(WIN_DialogData *dialog, const char *string) -{ - WCHAR *wstring; - WCHAR *p; - size_t count; - SDL_bool status; - - if (!string) { - string = ""; - } - - wstring = WIN_UTF8ToString(string); - if (!wstring) { - return SDL_FALSE; - } - - /* Find out how many characters we have, including null terminator */ - count = 0; - for (p = wstring; *p; ++p) { - ++count; - } - ++count; - - status = AddDialogData(dialog, wstring, count*sizeof(WCHAR)); - SDL_free(wstring); - return status; -} - -static int s_BaseUnitsX; -static int s_BaseUnitsY; -static void Vec2ToDLU(short *x, short *y) -{ - SDL_assert(s_BaseUnitsX != 0); /* we init in WIN_ShowMessageBox(), which is the only public function... */ - - *x = MulDiv(*x, 4, s_BaseUnitsX); - *y = MulDiv(*y, 8, s_BaseUnitsY); -} - - -static SDL_bool AddDialogControl(WIN_DialogData *dialog, WORD type, DWORD style, DWORD exStyle, int x, int y, int w, int h, int id, const char *caption) -{ - DLGITEMTEMPLATEEX item; - WORD marker = 0xFFFF; - WORD extraData = 0; - - SDL_zero(item); - item.style = style; - item.exStyle = exStyle; - item.x = x; - item.y = y; - item.cx = w; - item.cy = h; - item.id = id; - - Vec2ToDLU(&item.x, &item.y); - Vec2ToDLU(&item.cx, &item.cy); - - if (!AlignDialogData(dialog, sizeof(DWORD))) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &item, sizeof(item))) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &marker, sizeof(marker))) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &type, sizeof(type))) { - return SDL_FALSE; - } - if (!AddDialogString(dialog, caption)) { - return SDL_FALSE; - } - if (!AddDialogData(dialog, &extraData, sizeof(extraData))) { - return SDL_FALSE; - } - ++dialog->lpDialog->cDlgItems; - - return SDL_TRUE; -} - -static SDL_bool AddDialogStatic(WIN_DialogData *dialog, int x, int y, int w, int h, const char *text) -{ - DWORD style = WS_VISIBLE | WS_CHILD | SS_LEFT | SS_NOPREFIX | SS_EDITCONTROL; - return AddDialogControl(dialog, 0x0082, style, 0, x, y, w, h, -1, text); -} - -static SDL_bool AddDialogButton(WIN_DialogData *dialog, int x, int y, int w, int h, const char *text, int id, SDL_bool isDefault) -{ - DWORD style = WS_VISIBLE | WS_CHILD; - if (isDefault) { - style |= BS_DEFPUSHBUTTON; - } else { - style |= BS_PUSHBUTTON; - } - return AddDialogControl(dialog, 0x0080, style, 0, x, y, w, h, id, text); -} - -static void FreeDialogData(WIN_DialogData *dialog) -{ - SDL_free(dialog->data); - SDL_free(dialog); -} - -static WIN_DialogData *CreateDialogData(int w, int h, const char *caption) -{ - WIN_DialogData *dialog; - DLGTEMPLATEEX dialogTemplate; - WORD WordToPass; - - SDL_zero(dialogTemplate); - dialogTemplate.dlgVer = 1; - dialogTemplate.signature = 0xffff; - dialogTemplate.style = (WS_CAPTION | DS_CENTER | DS_SHELLFONT); - dialogTemplate.x = 0; - dialogTemplate.y = 0; - dialogTemplate.cx = w; - dialogTemplate.cy = h; - Vec2ToDLU(&dialogTemplate.cx, &dialogTemplate.cy); - - dialog = (WIN_DialogData *)SDL_calloc(1, sizeof(*dialog)); - if (!dialog) { - return NULL; - } - - if (!AddDialogData(dialog, &dialogTemplate, sizeof(dialogTemplate))) { - FreeDialogData(dialog); - return NULL; - } - - /* No menu */ - WordToPass = 0; - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* No custom class */ - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* title */ - if (!AddDialogString(dialog, caption)) { - FreeDialogData(dialog); - return NULL; - } - - /* Font stuff */ - { - /* - * We want to use the system messagebox font. - */ - BYTE ToPass; - - NONCLIENTMETRICSA NCM; - NCM.cbSize = sizeof(NCM); - SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &NCM, 0); - - /* Font size - convert to logical font size for dialog parameter. */ - { - HDC ScreenDC = GetDC(NULL); - int LogicalPixelsY = GetDeviceCaps(ScreenDC, LOGPIXELSY); - if (!LogicalPixelsY) /* This can happen if the application runs out of GDI handles */ - LogicalPixelsY = 72; - WordToPass = (WORD)(-72 * NCM.lfMessageFont.lfHeight / LogicalPixelsY); - ReleaseDC(NULL, ScreenDC); - } - - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* Font weight */ - WordToPass = (WORD)NCM.lfMessageFont.lfWeight; - if (!AddDialogData(dialog, &WordToPass, 2)) { - FreeDialogData(dialog); - return NULL; - } - - /* italic? */ - ToPass = NCM.lfMessageFont.lfItalic; - if (!AddDialogData(dialog, &ToPass, 1)) { - FreeDialogData(dialog); - return NULL; - } - - /* charset? */ - ToPass = NCM.lfMessageFont.lfCharSet; - if (!AddDialogData(dialog, &ToPass, 1)) { - FreeDialogData(dialog); - return NULL; - } - - /* font typeface. */ - if (!AddDialogString(dialog, NCM.lfMessageFont.lfFaceName)) { - FreeDialogData(dialog); - return NULL; - } - } - - return dialog; -} - -int -WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) -{ - WIN_DialogData *dialog; - int i, x, y; - UINT_PTR which; - const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons; - HFONT DialogFont; - SIZE Size; - RECT TextSize; - wchar_t* wmessage; - TEXTMETRIC TM; - - - const int ButtonWidth = 88; - const int ButtonHeight = 26; - const int TextMargin = 16; - const int ButtonMargin = 12; - - - /* Jan 25th, 2013 - dant@fleetsa.com - * - * - * I've tried to make this more reasonable, but I've run in to a lot - * of nonsense. - * - * The original issue is the code was written in pixels and not - * dialog units (DLUs). All DialogBox functions use DLUs, which - * vary based on the selected font (yay). - * - * According to MSDN, the most reliable way to convert is via - * MapDialogUnits, which requires an HWND, which we don't have - * at time of template creation. - * - * We do however have: - * The system font (DLU width 8 for me) - * The font we select for the dialog (DLU width 6 for me) - * - * Based on experimentation, *neither* of these return the value - * actually used. Stepping in to MapDialogUnits(), the conversion - * is fairly clear, and uses 7 for me. - * - * As a result, some of this is hacky to ensure the sizing is - * somewhat correct. - * - * Honestly, a long term solution is to use CreateWindow, not CreateDialog. - * - - * - * In order to get text dimensions we need to have a DC with the desired font. - * I'm assuming a dialog box in SDL is rare enough we can to the create. - */ - HDC FontDC = CreateCompatibleDC(0); - - { - /* Create a duplicate of the font used in system message boxes. */ - LOGFONT lf; - NONCLIENTMETRICS NCM; - NCM.cbSize = sizeof(NCM); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &NCM, 0); - lf = NCM.lfMessageFont; - DialogFont = CreateFontIndirect(&lf); - } - - /* Select the font in to our DC */ - SelectObject(FontDC, DialogFont); - - { - /* Get the metrics to try and figure our DLU conversion. */ - GetTextMetrics(FontDC, &TM); - s_BaseUnitsX = TM.tmAveCharWidth + 1; - s_BaseUnitsY = TM.tmHeight; - } - - /* Measure the *pixel* size of the string. */ - wmessage = WIN_UTF8ToString(messageboxdata->message); - SDL_zero(TextSize); - Size.cx = DrawText(FontDC, wmessage, -1, &TextSize, DT_CALCRECT); - - /* Add some padding for hangs, etc. */ - TextSize.right += 2; - TextSize.bottom += 2; - - /* Done with the DC, and the string */ - DeleteDC(FontDC); - SDL_free(wmessage); - - /* Increase the size of the dialog by some border spacing around the text. */ - Size.cx = TextSize.right - TextSize.left; - Size.cy = TextSize.bottom - TextSize.top; - Size.cx += TextMargin * 2; - Size.cy += TextMargin * 2; - - /* Ensure the size is wide enough for all of the buttons. */ - if (Size.cx < messageboxdata->numbuttons * (ButtonWidth + ButtonMargin) + ButtonMargin) - Size.cx = messageboxdata->numbuttons * (ButtonWidth + ButtonMargin) + ButtonMargin; - - /* Add vertical space for the buttons and border. */ - Size.cy += ButtonHeight + TextMargin; - - dialog = CreateDialogData(Size.cx, Size.cy, messageboxdata->title); - if (!dialog) { - return -1; - } - - if (!AddDialogStatic(dialog, TextMargin, TextMargin, TextSize.right - TextSize.left, TextSize.bottom - TextSize.top, messageboxdata->message)) { - FreeDialogData(dialog); - return -1; - } - - /* Align the buttons to the right/bottom. */ - x = Size.cx - (ButtonWidth + ButtonMargin) * messageboxdata->numbuttons; - y = Size.cy - ButtonHeight - ButtonMargin; - for (i = messageboxdata->numbuttons - 1; i >= 0; --i) { - SDL_bool isDefault; - - if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) { - isDefault = SDL_TRUE; - } else { - isDefault = SDL_FALSE; - } - if (!AddDialogButton(dialog, x, y, ButtonWidth, ButtonHeight, buttons[i].text, i, isDefault)) { - FreeDialogData(dialog); - return -1; - } - x += ButtonWidth + ButtonMargin; - } - - /* FIXME: If we have a parent window, get the Instance and HWND for them */ - which = DialogBoxIndirect(NULL, (DLGTEMPLATE*)dialog->lpDialog, NULL, (DLGPROC)MessageBoxDialogProc); - *buttonid = buttons[which].buttonid; - - FreeDialogData(dialog); - return 0; -} - -#endif /* SDL_VIDEO_DRIVER_WINDOWS */ - -/* vi: set ts=4 sw=4 expandtab: */ |