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. */ |
21 | static void |
22 | quit(int rc) |
23 | { |
24 | SDL_Quit(); |
25 | exit(rc); |
26 | } |
27 | |
28 | static int SDLCALL |
29 | button_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 | |
83 | int |
84 | main(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 | |