23 #if SDL_VIDEO_DRIVER_WINDOWS
29 #ifndef SS_EDITCONTROL
30 #define SS_EDITCONTROL 0x2000
67 DLGTEMPLATEEX* lpDialog;
74 static INT_PTR MessageBoxDialogProc(HWND hDlg,
UINT iMessage, WPARAM wParam, LPARAM lParam)
79 EndDialog(hDlg, LOWORD(wParam));
88 static SDL_bool ExpandDialogSpace(WIN_DialogData *dialog,
size_t space)
90 size_t size = dialog->size;
95 while ((dialog->used + space) > size) {
99 if (size > dialog->size) {
107 dialog->lpDialog = (DLGTEMPLATEEX*)dialog->data;
112 static SDL_bool AlignDialogData(WIN_DialogData *dialog,
size_t size)
114 size_t padding = (dialog->used %
size);
116 if (!ExpandDialogSpace(dialog, padding)) {
120 dialog->used += padding;
125 static SDL_bool AddDialogData(WIN_DialogData *dialog,
const void *
data,
size_t size)
127 if (!ExpandDialogSpace(dialog, size)) {
131 SDL_memcpy(dialog->data+dialog->used, data, size);
132 dialog->used +=
size;
137 static SDL_bool AddDialogString(WIN_DialogData *dialog,
const char *
string)
155 for (p = wstring; *
p; ++
p) {
160 status = AddDialogData(dialog, wstring, count*
sizeof(WCHAR));
165 static int s_BaseUnitsX;
166 static int s_BaseUnitsY;
167 static void Vec2ToDLU(
short *
x,
short *
y)
171 *x = MulDiv(*x, 4, s_BaseUnitsX);
172 *y = MulDiv(*y, 8, s_BaseUnitsY);
176 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)
178 DLGITEMTEMPLATEEX item;
184 item.exStyle = exStyle;
191 Vec2ToDLU(&item.x, &item.y);
192 Vec2ToDLU(&item.cx, &item.cy);
194 if (!AlignDialogData(dialog,
sizeof(
DWORD))) {
197 if (!AddDialogData(dialog, &item,
sizeof(item))) {
200 if (!AddDialogData(dialog, &marker,
sizeof(marker))) {
203 if (!AddDialogData(dialog, &type,
sizeof(type))) {
206 if (!AddDialogString(dialog, caption)) {
209 if (!AddDialogData(dialog, &extraData,
sizeof(extraData))) {
212 ++dialog->lpDialog->cDlgItems;
217 static SDL_bool AddDialogStatic(WIN_DialogData *dialog,
int x,
int y,
int w,
int h,
const char *text)
219 DWORD style = WS_VISIBLE | WS_CHILD | SS_LEFT | SS_NOPREFIX | SS_EDITCONTROL;
220 return AddDialogControl(dialog, 0x0082, style, 0, x, y, w, h, -1, text);
223 static SDL_bool AddDialogButton(WIN_DialogData *dialog,
int x,
int y,
int w,
int h,
const char *text,
int id,
SDL_bool isDefault)
225 DWORD style = WS_VISIBLE | WS_CHILD;
227 style |= BS_DEFPUSHBUTTON;
229 style |= BS_PUSHBUTTON;
231 return AddDialogControl(dialog, 0x0080, style, 0, x, y, w, h,
id, text);
234 static void FreeDialogData(WIN_DialogData *dialog)
240 static WIN_DialogData *CreateDialogData(
int w,
int h,
const char *caption)
242 WIN_DialogData *dialog;
243 DLGTEMPLATEEX dialogTemplate;
247 dialogTemplate.dlgVer = 1;
248 dialogTemplate.signature = 0xffff;
249 dialogTemplate.style = (WS_CAPTION | DS_CENTER | DS_SHELLFONT);
250 dialogTemplate.x = 0;
251 dialogTemplate.y = 0;
252 dialogTemplate.cx =
w;
253 dialogTemplate.cy =
h;
254 Vec2ToDLU(&dialogTemplate.cx, &dialogTemplate.cy);
256 dialog = (WIN_DialogData *)
SDL_calloc(1,
sizeof(*dialog));
261 if (!AddDialogData(dialog, &dialogTemplate,
sizeof(dialogTemplate))) {
262 FreeDialogData(dialog);
268 if (!AddDialogData(dialog, &WordToPass, 2)) {
269 FreeDialogData(dialog);
274 if (!AddDialogData(dialog, &WordToPass, 2)) {
275 FreeDialogData(dialog);
280 if (!AddDialogString(dialog, caption)) {
281 FreeDialogData(dialog);
292 NONCLIENTMETRICSA NCM;
293 NCM.cbSize =
sizeof(NCM);
294 SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &NCM, 0);
298 HDC ScreenDC = GetDC(0);
299 WordToPass = (WORD)(-72 * NCM.lfMessageFont.lfHeight / GetDeviceCaps(ScreenDC, LOGPIXELSY));
300 ReleaseDC(0, ScreenDC);
303 if (!AddDialogData(dialog, &WordToPass, 2)) {
304 FreeDialogData(dialog);
309 WordToPass = (WORD)NCM.lfMessageFont.lfWeight;
310 if (!AddDialogData(dialog, &WordToPass, 2)) {
311 FreeDialogData(dialog);
316 ToPass = NCM.lfMessageFont.lfItalic;
317 if (!AddDialogData(dialog, &ToPass, 1)) {
318 FreeDialogData(dialog);
323 ToPass = NCM.lfMessageFont.lfCharSet;
324 if (!AddDialogData(dialog, &ToPass, 1)) {
325 FreeDialogData(dialog);
330 if (!AddDialogString(dialog, NCM.lfMessageFont.lfFaceName)) {
331 FreeDialogData(dialog);
342 WIN_DialogData *dialog;
352 const int ButtonWidth = 88;
353 const int ButtonHeight = 26;
354 const int TextMargin = 16;
355 const int ButtonMargin = 12;
390 HDC FontDC = CreateCompatibleDC(0);
395 NONCLIENTMETRICS NCM;
396 NCM.cbSize =
sizeof(NCM);
397 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &NCM, 0);
398 lf = NCM.lfMessageFont;
399 DialogFont = CreateFontIndirect(&lf);
403 SelectObject(FontDC, DialogFont);
407 GetTextMetrics(FontDC, &TM);
408 s_BaseUnitsX = TM.tmAveCharWidth + 1;
409 s_BaseUnitsY = TM.tmHeight;
415 Size.cx = DrawText(FontDC, wmessage, -1, &TextSize, DT_CALCRECT);
419 TextSize.bottom += 2;
426 Size.cx = TextSize.right - TextSize.left;
427 Size.cy = TextSize.bottom - TextSize.top;
428 Size.cx += TextMargin * 2;
429 Size.cy += TextMargin * 2;
432 if (Size.cx < messageboxdata->
numbuttons * (ButtonWidth + ButtonMargin) + ButtonMargin)
433 Size.cx = messageboxdata->
numbuttons * (ButtonWidth + ButtonMargin) + ButtonMargin;
436 Size.cy += ButtonHeight + TextMargin;
438 dialog = CreateDialogData(Size.cx, Size.cy, messageboxdata->
title);
443 if (!AddDialogStatic(dialog, TextMargin, TextMargin, TextSize.right - TextSize.left, TextSize.bottom - TextSize.top, messageboxdata->
message)) {
444 FreeDialogData(dialog);
449 x = Size.cx - ButtonWidth - ButtonMargin;
450 y = Size.cy - ButtonHeight - ButtonMargin;
459 if (!AddDialogButton(dialog, x, y, ButtonWidth, ButtonHeight, buttons[i].text, i, isDefault)) {
460 FreeDialogData(dialog);
463 x -= ButtonWidth + ButtonMargin;
467 which = DialogBoxIndirect(
NULL, (DLGTEMPLATE*)dialog->lpDialog,
NULL, (DLGPROC)MessageBoxDialogProc);
468 *buttonid = buttons[which].
buttonid;
470 FreeDialogData(dialog);
#define WIN_UTF8ToString(S)
GLfloat GLfloat GLfloat GLfloat h
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size)
DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size)
DECLSPEC void SDLCALL SDL_free(void *mem)
typedef UINT(WINAPI *PFNWGLGETCONTEXTGPUIDAMDPROC)(HGLRC hglrc)
typedef HDC(WINAPI *PFNWGLGETCURRENTREADDCARBPROC)(VOID)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
const SDL_MessageBoxButtonData * buttons
MessageBox structure containing title, text, window, etc.
#define SDL_assert(condition)
EGLSurface EGLint EGLint y
#define SDL_OutOfMemory()
DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len)
GLenum GLsizei GLsizei GLsizei GLsizei GLbitfield flags
uint8_t Uint8
An unsigned 8-bit integer type.
typedef DWORD(WINAPI *XInputGetState_t)(DWORD dwUserIndex
GLint GLint GLint GLint GLint w