1 /* 2 Copyright (C) 1997-2014 Sam Lantinga <slouken (at) 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 #include <signal.h> 18 19 #include "SDL.h" 20 #include "SDL_thread.h" 21 22 static int alive = 0; 23 24 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 25 static void 26 quit(int rc) 27 { 28 SDL_Quit(); 29 exit(rc); 30 } 31 32 static int 33 button_messagebox(void *eventNumber) 34 { 35 const SDL_MessageBoxButtonData buttons[] = { 36 { 37 SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 38 0, 39 "OK" 40 },{ 41 SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 42 1, 43 "Cancel" 44 }, 45 }; 46 47 SDL_MessageBoxData data = { 48 SDL_MESSAGEBOX_INFORMATION, 49 NULL, /* no parent window */ 50 "Custom MessageBox", 51 "This is a custom messagebox", 52 2, 53 buttons, 54 NULL /* Default color scheme */ 55 }; 56 57 int button = -1; 58 int success = 0; 59 if (eventNumber) { 60 data.message = "This is a custom messagebox from a background thread."; 61 } 62 63 success = SDL_ShowMessageBox(&data, &button); 64 if (success == -1) { 65 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError()); 66 if (eventNumber) { 67 SDL_UserEvent event; 68 event.type = (intptr_t)eventNumber; 69 SDL_PushEvent((SDL_Event*)&event); 70 return 1; 71 } else { 72 quit(2); 73 } 74 } 75 SDL_Log("Pressed button: %d, %s\n", button, button == 1 ? "Cancel" : "OK"); 76 77 if (eventNumber) { 78 SDL_UserEvent event; 79 event.type = (intptr_t)eventNumber; 80 SDL_PushEvent((SDL_Event*)&event); 81 } 82 83 return 0; 84 } 85 86 int 87 main(int argc, char *argv[]) 88 { 89 int success; 90 91 /* Enable standard application logging */ 92 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 93 94 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 95 "Simple MessageBox", 96 "This is a simple error MessageBox", 97 NULL); 98 if (success == -1) { 99 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError()); 100 quit(1); 101 } 102 103 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 104 "Simple MessageBox", 105 "This is a simple MessageBox with a newline:\r\nHello world!", 106 NULL); 107 if (success == -1) { 108 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError()); 109 quit(1); 110 } 111 112 /* Google says this is Traditional Chinese for "beef with broccoli" */ 113 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 114 "UTF-8 Simple MessageBox", 115 "Unicode text: '' ...", 116 NULL); 117 if (success == -1) { 118 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError()); 119 quit(1); 120 } 121 122 /* Google says this is Traditional Chinese for "beef with broccoli" */ 123 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 124 "UTF-8 Simple MessageBox", 125 "Unicode text and newline:\r\n''\n''", 126 NULL); 127 if (success == -1) { 128 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError()); 129 quit(1); 130 } 131 132 button_messagebox(NULL); 133 134 /* Test showing a message box from a background thread. 135 136 On Mac OS X, the video subsystem needs to be initialized for this 137 to work, since the message box events are dispatched by the Cocoa 138 subsystem on the main thread. 139 */ 140 if (SDL_Init(SDL_INIT_VIDEO) < 0) { 141 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL video subsystem: %s\n", SDL_GetError()); 142 return (1); 143 } 144 { 145 int status = 0; 146 SDL_Event event; 147 intptr_t eventNumber = SDL_RegisterEvents(1); 148 SDL_Thread* thread = SDL_CreateThread(&button_messagebox, "MessageBox", (void*)eventNumber); 149 150 while (SDL_WaitEvent(&event)) 151 { 152 if (event.type == eventNumber) { 153 break; 154 } 155 } 156 157 SDL_WaitThread(thread, &status); 158 159 SDL_Log("Message box thread return %i\n", status); 160 } 161 162 /* Test showing a message box with a parent window */ 163 { 164 SDL_Event event; 165 SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0); 166 167 success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 168 "Simple MessageBox", 169 "This is a simple error MessageBox with a parent window", 170 window); 171 if (success == -1) { 172 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError()); 173 quit(1); 174 } 175 176 while (SDL_WaitEvent(&event)) 177 { 178 if (event.type == SDL_QUIT || event.type == SDL_KEYUP) { 179 break; 180 } 181 } 182 } 183 184 SDL_Quit(); 185 return (0); 186 } 187