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