1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/*
2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  This software is provided 'as-is', without any express or implied
5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  warranty.  In no event will the authors be held liable for any damages
6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  arising from the use of this software.
7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Permission is granted to anyone to use this software for any purpose,
9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  including commercial applications, and to alter it and redistribute it
10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  freely.
11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot*/
12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Simple test of the SDL MessageBox API */
14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <stdio.h>
16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <stdlib.h>
17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <signal.h>
18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL.h"
20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_thread.h"
21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int alive = 0;
23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotquit(int rc)
27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Quit();
29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    exit(rc);
30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int
33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotbutton_messagebox(void *eventNumber)
34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    const SDL_MessageBoxButtonData buttons[] = {
36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT,
38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            0,
39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            "OK"
40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        },{
41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT,
42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            1,
43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            "Cancel"
44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        },
45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_MessageBoxData data = {
48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_MESSAGEBOX_INFORMATION,
49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        NULL, /* no parent window */
50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        "Custom MessageBox",
51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        "This is a custom messagebox",
52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        2,
53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        buttons,
54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        NULL /* Default color scheme */
55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int button = -1;
58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int success = 0;
59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (eventNumber) {
60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        data.message = "This is a custom messagebox from a background thread.";
61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    success = SDL_ShowMessageBox(&data, &button);
64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (success == -1) {
65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (eventNumber) {
67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_UserEvent event;
68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            event.type = (intptr_t)eventNumber;
69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_PushEvent((SDL_Event*)&event);
70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            return 1;
71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        } else {
72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            quit(2);
73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Log("Pressed button: %d, %s\n", button, button == 1 ? "Cancel" : "OK");
76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (eventNumber) {
78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_UserEvent event;
79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        event.type = (intptr_t)eventNumber;
80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_PushEvent((SDL_Event*)&event);
81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return 0;
84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotint
87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotmain(int argc, char *argv[])
88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int success;
90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot	/* Enable standard application logging */
92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "Simple MessageBox",
96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "This is a simple error MessageBox",
97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                NULL);
98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (success == -1) {
99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(1);
101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "Simple MessageBox",
105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "This is a simple MessageBox with a newline:\r\nHello world!",
106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                NULL);
107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (success == -1) {
108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(1);
110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Google says this is Traditional Chinese for "beef with broccoli" */
113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "UTF-8 Simple MessageBox",
115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "Unicode text: '牛肉西蘭花' ...",
116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                NULL);
117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (success == -1) {
118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(1);
120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Google says this is Traditional Chinese for "beef with broccoli" */
123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "UTF-8 Simple MessageBox",
125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "Unicode text and newline:\r\n'牛肉西蘭花'\n'牛肉西蘭花'",
126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                NULL);
127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (success == -1) {
128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(1);
130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    button_messagebox(NULL);
133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Test showing a message box from a background thread.
135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot       On Mac OS X, the video subsystem needs to be initialized for this
137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot       to work, since the message box events are dispatched by the Cocoa
138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot       subsystem on the main thread.
139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot     */
140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL video subsystem: %s\n", SDL_GetError());
142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return (1);
143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    {
145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        int status = 0;
146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Event event;
147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        intptr_t eventNumber = SDL_RegisterEvents(1);
148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Thread* thread = SDL_CreateThread(&button_messagebox, "MessageBox", (void*)eventNumber);
149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        while (SDL_WaitEvent(&event))
151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if (event.type == eventNumber) {
153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                break;
154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_WaitThread(thread, &status);
158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Log("Message box thread return %i\n", status);
160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Test showing a message box with a parent window */
163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    {
164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Event event;
165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    "Simple MessageBox",
169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    "This is a simple error MessageBox with a parent window",
170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    window);
171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (success == -1) {
172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            quit(1);
174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        while (SDL_WaitEvent(&event))
177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if (event.type == SDL_QUIT || event.type == SDL_KEYUP) {
179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                break;
180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Quit();
185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return (0);
186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
187