testmessage.c (6496B)
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 }