21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_OS2
28 #include "../../core/os2/SDL_os2.h"
33 #define IDD_TEXT_MESSAGE 1001
34 #define IDD_BITMAP 1002
35 #define IDD_PB_FIRST 1003
37 typedef struct _MSGBOXDLGDATA {
42 static VOID _wmInitDlg(HWND hwnd, MSGBOXDLGDATA *pDlgData)
44 HPS hps = WinGetPS(hwnd);
45 POINTL aptText[TXTBOX_COUNT];
51 ULONG ulButtonsCY = 0;
52 ULONG ulButtonsCX = 0;
61 HAB hab = WinQueryAnchorBlock(hwnd);
66 hEnum = WinBeginEnumWindows(hwnd);
68 while ((hWndNext = WinGetNextWindow(hEnum)) != NULLHANDLE) {
69 if (WinQueryClassName(hWndNext,
sizeof(acBuf), acBuf) == 0)
72 if (strcmp(acBuf,
"#3") == 0) {
73 if (cButtons <
sizeof(aButtons) /
sizeof(
struct _BUTTON)) {
74 aButtons[cButtons].hwnd = hWndNext;
79 WinEndEnumWindows(hEnum);
86 for(ulIdx = 0; ulIdx < cButtons; ulIdx++) {
88 cbBuf = WinQueryWindowText(aButtons[ulIdx].hwnd,
sizeof(acBuf), acBuf);
89 GpiQueryTextBox(hps, cbBuf, acBuf, TXTBOX_COUNT, aptText);
90 aptText[TXTBOX_TOPRIGHT].x -= aptText[TXTBOX_BOTTOMLEFT].x;
91 aptText[TXTBOX_TOPRIGHT].y -= aptText[TXTBOX_BOTTOMLEFT].y;
93 WinMapDlgPoints(hwnd, &aptText[TXTBOX_TOPRIGHT], 1,
FALSE);
95 if (aptText[TXTBOX_TOPRIGHT].
x < 30) {
96 aptText[TXTBOX_TOPRIGHT].x = 30;
98 aptText[TXTBOX_TOPRIGHT].x += 4;
100 aptText[TXTBOX_TOPRIGHT].y += 3;
102 aButtons[ulIdx].ulCX = aptText[TXTBOX_TOPRIGHT].x;
103 ulButtonsCX += aptText[TXTBOX_TOPRIGHT].x + 2;
105 if (ulButtonsCY < aptText[TXTBOX_TOPRIGHT].
y)
106 ulButtonsCY = aptText[TXTBOX_TOPRIGHT].y + 1;
115 aptText[0].x = ulButtonsCX + 4;
116 WinMapDlgPoints(hwnd, &aptText[0], 1,
TRUE);
118 WinQueryWindowRect(hwnd, &rectlItem);
119 if (rectlItem.xRight <= aptText[0].x)
120 rectlItem.xRight = aptText[0].x;
123 WinQueryWindowRect(pDlgData->hwndUnder, &rectl);
125 rectl.xLeft = (rectl.xRight - rectlItem.xRight) / 2;
126 rectl.yBottom = (rectl.yTop - rectlItem.yTop) / 2;
128 WinMapWindowPoints(pDlgData->hwndUnder, HWND_DESKTOP, (PPOINTL)&rectl, 1);
129 WinOffsetRect(hab, &rectlItem, rectl.xLeft, rectl.yBottom);
132 WinSetWindowPos(hwnd, HWND_TOP, rectlItem.xLeft, rectlItem.yBottom,
133 rectlItem.xRight - rectlItem.xLeft,
134 rectlItem.yTop - rectlItem.yBottom,
135 SWP_SIZE | SWP_MOVE);
140 WinMapDlgPoints(hwnd, (PPOINTL)&rectlItem, 2,
FALSE);
141 ulX = rectlItem.xRight - rectlItem.xLeft - ulButtonsCX - 2;
144 for (ulIdx = 0; ulIdx < cButtons; ulIdx++) {
148 aptText[1].x = aButtons[ulIdx].ulCX;
149 aptText[1].y = ulButtonsCY;
151 WinMapDlgPoints(hwnd, aptText, 2,
TRUE);
153 WinSetWindowPos(aButtons[ulIdx].hwnd, HWND_TOP,
154 aptText[0].
x, aptText[0].
y, aptText[1].
x, aptText[1].
y,
155 SWP_MOVE | SWP_SIZE);
158 ulX += aButtons[ulIdx].ulCX + 2;
165 aptText[2].y = ulButtonsCY + 3;
166 WinMapDlgPoints(hwnd, &aptText[2], 1,
TRUE);
167 hWndNext = WinWindowFromID(hwnd, IDD_TEXT_MESSAGE);
168 WinQueryWindowRect(hWndNext, &rectlItem);
169 rectlItem.xLeft = aptText[2].x;
170 rectlItem.yBottom = aptText[2].y;
172 rectlItem.xRight = aptText[0].x + aptText[1].x;
173 WinSetWindowPos(hWndNext, HWND_TOP, rectlItem.xLeft, rectlItem.yBottom,
174 rectlItem.xRight - rectlItem.xLeft,
175 rectlItem.yTop - rectlItem.yBottom,
176 SWP_MOVE | SWP_SIZE);
179 MRESULT EXPENTRY DynDlgProc(HWND hwnd, USHORT
message, MPARAM mp1, MPARAM mp2)
183 _wmInitDlg(hwnd, (MSGBOXDLGDATA*)mp2);
187 switch (SHORT1FROMMP(mp1)) {
189 WinDismissDlg(hwnd,
FALSE);
196 return(WinDefDlgProc(hwnd,
message, mp1, mp2));
206 ULONG cSDLBtnData = messageboxdata->
numbuttons;
209 ULONG cbTitle = (pszTitle ==
NULL)? 0 : strlen(pszTitle);
211 ULONG cbText = (pszText ==
NULL)? 0 : strlen(pszText);
213 PDLGTEMPLATE pTemplate;
224 MSGBOXDLGDATA stDlgData;
229 cbTemplate =
sizeof(DLGTEMPLATE) + ((2 + cSDLBtnData) *
sizeof(DLGTITEM)) +
235 for (ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++) {
236 pszBtnText = (PSZ)pSDLBtnData[ulIdx].
text;
237 cbTemplate += (pszBtnText ==
NULL)? 1 : (strlen(pszBtnText) + 1);
240 if (pSDLColors !=
NULL)
241 cbTemplate += 26 + 26 +
245 pTemplate = (PDLGTEMPLATE)
SDL_malloc(cbTemplate);
247 pcDlgData = &((PCHAR)pTemplate)[
sizeof(DLGTEMPLATE) +
248 ((2 + cSDLBtnData) *
sizeof(DLGTITEM))];
251 pTemplate->cbTemplate = cbTemplate;
253 pTemplate->codepage = 0;
254 pTemplate->offadlgti = 14;
255 pTemplate->fsTemplateStatus = 0;
259 pTemplate->iItemFocus = 0;
260 pTemplate->coffPresParams = 0;
263 pDlgItem = pTemplate->adlgti;
264 pDlgItem->fsItemStatus = 0;
266 pDlgItem->cChildren = 2 + cSDLBtnData;
268 pDlgItem->cchClassName = 0;
269 pDlgItem->offClassName = (USHORT)WC_FRAME;
271 pDlgItem->cchText = cbTitle + 1;
272 pDlgItem->offText = pcDlgData - (PCHAR)pTemplate;
274 if (pszTitle !=
NULL) {
275 strcpy(pcDlgData, pszTitle);
279 pcDlgData += pDlgItem->cchText;
281 pDlgItem->flStyle = WS_GROUP | WS_VISIBLE | WS_CLIPSIBLINGS |
282 FS_DLGBORDER | WS_SAVEBITS;
287 pDlgItem->id = DID_OK;
288 if (pSDLColors ==
NULL)
289 pDlgItem->offPresParams = 0;
292 pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate;
293 ((PPRESPARAMS)pcDlgData)->cb = 22;
295 ((PPARAM)pcDlgData)->id = PP_FOREGROUNDCOLOR;
296 ((PPARAM)pcDlgData)->cb = 3;
301 ((PPARAM)pcDlgData)->id = PP_BACKGROUNDCOLOR;
302 ((PPARAM)pcDlgData)->cb = 3;
310 pDlgItem->offCtlData = pcDlgData - (PCHAR)pTemplate;
312 *((PULONG)pcDlgData) = FCF_TITLEBAR | FCF_SYSMENU;
313 pcDlgData +=
sizeof(ULONG);
317 pDlgItem->fsItemStatus = 0;
320 pDlgItem->cChildren = 0;
322 pDlgItem->cchClassName = 0;
323 pDlgItem->offClassName = (USHORT)WC_STATIC;
325 pDlgItem->cchText = cbText + 1;
326 pDlgItem->offText = pcDlgData - (PCHAR)pTemplate;
328 if (pszText !=
NULL) {
329 strcpy(pcDlgData, pszText);
333 pcDlgData += pDlgItem->cchText;
335 pDlgItem->flStyle = SS_TEXT | DT_TOP | DT_LEFT | DT_WORDBREAK | WS_VISIBLE;
342 pDlgItem->id = IDD_TEXT_MESSAGE;
343 if (pSDLColors ==
NULL)
344 pDlgItem->offPresParams = 0;
347 pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate;
348 ((PPRESPARAMS)pcDlgData)->cb = 22;
350 ((PPARAM)pcDlgData)->id = PP_FOREGROUNDCOLOR;
351 ((PPARAM)pcDlgData)->cb = 3;
356 ((PPARAM)pcDlgData)->id = PP_BACKGROUNDCOLOR;
357 ((PPARAM)pcDlgData)->cb = 3;
363 pDlgItem->offCtlData = 0;
367 pDlgItem->fsItemStatus = 0;
368 pDlgItem->cChildren = 0;
369 pDlgItem->cchClassName = 0;
370 pDlgItem->offClassName = (USHORT)WC_STATIC;
372 pDlgItem->cchText = 3;
373 pDlgItem->offText = pcDlgData - (PCHAR)pTemplate;
380 SPTR_ICONWARNING : SPTR_ICONINFORMATION;
383 pDlgItem->flStyle = SS_SYSICON | WS_VISIBLE;
390 pDlgItem->id = IDD_BITMAP;
391 pDlgItem->offPresParams = 0;
392 pDlgItem->offCtlData = 0;
395 for (ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++) {
398 pDlgItem->fsItemStatus = 0;
399 pDlgItem->cChildren = 0;
400 pDlgItem->cchClassName = 0;
401 pDlgItem->offClassName = (USHORT)WC_BUTTON;
404 cbBtnText = (pszBtnText ==
NULL)? 0 : strlen(pszBtnText);
405 pDlgItem->cchText = cbBtnText + 1;
406 pDlgItem->offText = pcDlgData - (PCHAR)pTemplate;
408 if (pszBtnText !=
NULL) {
409 strcpy(pcDlgData, pszBtnText);
413 pcDlgData += pDlgItem->cchText;
416 pDlgItem->flStyle = BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE;
418 pDlgItem->flStyle |= BS_DEFAULT;
419 pTemplate->iItemFocus = ulIdx + 3;
431 pDlgItem->id = IDD_PB_FIRST + ulIdx;
432 if (pSDLColors ==
NULL)
433 pDlgItem->offPresParams = 0;
436 pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate;
437 ((PPRESPARAMS)pcDlgData)->cb = 44;
439 ((PPARAM)pcDlgData)->id = PP_FOREGROUNDCOLOR;
440 ((PPARAM)pcDlgData)->cb = 3;
441 ((PPARAM)pcDlgData)->ab[0] = pSDLColor->
b;
442 ((PPARAM)pcDlgData)->ab[1] = pSDLColor->g;
443 ((PPARAM)pcDlgData)->ab[2] = pSDLColor->r;
445 ((PPARAM)pcDlgData)->id = PP_BACKGROUNDCOLOR;
446 ((PPARAM)pcDlgData)->cb = 3;
451 ((PPARAM)pcDlgData)->id = PP_BORDERLIGHTCOLOR;
452 ((PPARAM)pcDlgData)->cb = 3;
457 ((PPARAM)pcDlgData)->id = PP_BORDERDARKCOLOR;
458 ((PPARAM)pcDlgData)->cb = 3;
464 pDlgItem->offCtlData = 0;
469 stDlgData.cb =
sizeof(MSGBOXDLGDATA);
473 hwnd = WinCreateDlg(HWND_DESKTOP,
475 (PFNWP)DynDlgProc, pTemplate, &stDlgData);
490 ULONG cSDLBtnData = messageboxdata->
numbuttons;
494 BOOL fSuccess =
FALSE;
496 if (!fVideoInitialized) {
500 DosGetInfoBlocks(&tib, &pib);
501 if (pib->pib_ultype == 2 || pib->pib_ultype == 0) {
506 hab = WinInitialize(0);
507 if (hab == NULLHANDLE) {
511 hmq = WinCreateMsgQueue(hab, 0);
512 if (hmq == NULLHANDLE) {
519 hwnd = _makeDlg(messageboxdata);
521 ulRC = WinProcessDlg(hwnd);
523 WinDestroyWindow(hwnd);
525 if (ulRC == DID_CANCEL) {
529 for (ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++, pSDLBtnData++) {
538 ulRC -= IDD_PB_FIRST;
539 if (ulRC < cSDLBtnData) {
540 *buttonid = pSDLBtnData[ulRC].
buttonid;
545 if (!fVideoInitialized) {
546 WinDestroyMsgQueue(hmq);
550 return (fSuccess)? 0 : -1;
@ SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND
@ SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED
@ SDL_MESSAGEBOX_COLOR_BACKGROUND
@ SDL_MESSAGEBOX_COLOR_TEXT
@ SDL_MESSAGEBOX_COLOR_BUTTON_BORDER
@ SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT
@ SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT
GLint GLint GLint GLint GLint GLint y
GLint GLint GLint GLint GLint x
GLuint GLsizei const GLchar * message
RGB value used in a message box color scheme.
SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]
MessageBox structure containing title, text, window, etc.
const SDL_MessageBoxColorScheme * colorScheme
const SDL_MessageBoxButtonData * buttons
static char text[MAX_TEXT_LENGTH]