Imported Upstream version 2.0.14
[platform/upstream/SDL.git] / test / testmessage.c
1 /*
2   Copyright (C) 1997-2020 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         success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
193                     "Simple MessageBox",
194                     "This is a simple error MessageBox with a parent window",
195                     window);
196         if (success == -1) {
197             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
198             quit(1);
199         }
200
201         while (SDL_WaitEvent(&event))
202         {
203             if (event.type == SDL_QUIT || event.type == SDL_KEYUP) {
204                 break;
205             }
206         }
207     }
208
209     SDL_Quit();
210     return (0);
211 }