testmessage.c revision 555d6a58708babe6bb79b5824ef24eb1f37f708
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