1/*
2 Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely.
11*/
12
13/* Simple test of the SDL MessageBox API */
14
15#include <stdio.h>
16#include <stdlib.h>
17
18#include "SDL.h"
19
20/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
21static void
22quit(int rc)
23{
24 SDL_Quit();
25 exit(rc);
26}
27
28static int SDLCALL
29button_messagebox(void *eventNumber)
30{
31 const SDL_MessageBoxButtonData buttons[] = {
32 {
33 SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT,
34 0,
35 "OK"
36 },{
37 SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT,
38 1,
39 "Cancel"
40 },
41 };
42
43 SDL_MessageBoxData data = {
44 SDL_MESSAGEBOX_INFORMATION,
45 NULL, /* no parent window */
46 "Custom MessageBox",
47 "This is a custom messagebox",
48 2,
49 NULL,/* buttons */
50 NULL /* Default color scheme */
51 };
52
53 int button = -1;
54 int success = 0;
55 data.buttons = buttons;
56 if (eventNumber) {
57 data.message = "This is a custom messagebox from a background thread.";
58 }
59
60 success = SDL_ShowMessageBox(&data, &button);
61 if (success == -1) {
62 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
63 if (eventNumber) {
64 SDL_UserEvent event;
65 event.type = (intptr_t)eventNumber;
66 SDL_PushEvent((SDL_Event*)&event);
67 return 1;
68 } else {
69 quit(2);
70 }
71 }
72 SDL_Log("Pressed button: %d, %s\n", button, button == -1 ? "[closed]" : button == 1 ? "Cancel" : "OK");
73
74 if (eventNumber) {
75 SDL_UserEvent event;
76 event.type = (intptr_t)eventNumber;
77 SDL_PushEvent((SDL_Event*)&event);
78 }
79
80 return 0;
81}
82
83int
84main(int argc, char *argv[])
85{
86 int success;
87
88 /* Enable standard application logging */
89 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
90
91 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
92 "Simple MessageBox",
93 "This is a simple error MessageBox",
94 NULL);
95 if (success == -1) {
96 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
97 quit(1);
98 }
99
100 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
101 "Simple MessageBox",
102 "This is a simple MessageBox with a newline:\r\nHello world!",
103 NULL);
104 if (success == -1) {
105 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
106 quit(1);
107 }
108
109 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
110 NULL,
111 "NULL Title",
112 NULL);
113 if (success == -1) {
114 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
115 quit(1);
116 }
117
118 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
119 "NULL Message",
120 NULL,
121 NULL);
122 if (success == -1) {
123 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
124 quit(1);
125 }
126
127 /* Google says this is Traditional Chinese for "beef with broccoli" */
128 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
129 "UTF-8 Simple MessageBox",
130 "Unicode text: '牛肉西蘭花' ...",
131 NULL);
132 if (success == -1) {
133 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
134 quit(1);
135 }
136
137 /* Google says this is Traditional Chinese for "beef with broccoli" */
138 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
139 "UTF-8 Simple MessageBox",
140 "Unicode text and newline:\r\n'牛肉西蘭花'\n'牛肉西蘭花'",
141 NULL);
142 if (success == -1) {
143 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
144 quit(1);
145 }
146
147 /* Google says this is Traditional Chinese for "beef with broccoli" */
148 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
149 "牛肉西蘭花",
150 "Unicode text in the title.",
151 NULL);
152 if (success == -1) {
153 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
154 quit(1);
155 }
156
157 button_messagebox(NULL);
158
159 /* Test showing a message box from a background thread.
160
161 On Mac OS X, the video subsystem needs to be initialized for this
162 to work, since the message box events are dispatched by the Cocoa
163 subsystem on the main thread.
164 */
165 if (SDL_Init(SDL_INIT_VIDEO) < 0) {
166 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL video subsystem: %s\n", SDL_GetError());
167 return (1);
168 }
169 {
170 int status = 0;
171 SDL_Event event;
172 intptr_t eventNumber = SDL_RegisterEvents(1);
173 SDL_Thread* thread = SDL_CreateThread(&button_messagebox, "MessageBox", (void*)eventNumber);
174
175 while (SDL_WaitEvent(&event))
176 {
177 if (event.type == eventNumber) {
178 break;
179 }
180 }
181
182 SDL_WaitThread(thread, &status);
183
184 SDL_Log("Message box thread return %i\n", status);
185 }
186
187 /* Test showing a message box with a parent window */
188 {
189 SDL_Event event;
190 SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
191
192 /* On wayland, no window will actually show until something has
193 actually been displayed.
194 */
195 SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);
196 SDL_RenderPresent(renderer);
197
198 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
199 "Simple MessageBox",
200 "This is a simple error MessageBox with a parent window",
201 window);
202 if (success == -1) {
203 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
204 quit(1);
205 }
206
207 while (SDL_WaitEvent(&event))
208 {
209 if (event.type == SDL_QUIT || event.type == SDL_KEYUP) {
210 break;
211 }
212 }
213 }
214
215 SDL_Quit();
216 return (0);
217}
218