src/main/beos/SDL_BeApp.cc
author Sam Lantinga
Sat, 19 Sep 2009 13:29:40 +0000
changeset 3280 00cace2d9080
parent 2859 99210400e8b9
child 5262 b530ef003506
permissions -rw-r--r--
Merged a cleaned up version of Jiang's code changes from Google Summer of Code 2009
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2009 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 /* Handle the BeApp specific portions of the application */
    25 
    26 #include <AppKit.h>
    27 #include <storage/Path.h>
    28 #include <storage/Entry.h>
    29 #include <unistd.h>
    30 
    31 #include "SDL_BeApp.h"
    32 #include "SDL_thread.h"
    33 #include "SDL_timer.h"
    34 #include "SDL_error.h"
    35 
    36 /* Flag to tell whether or not the Be application is active or not */
    37 int SDL_BeAppActive = 0;
    38 static SDL_Thread *SDL_AppThread = NULL;
    39 
    40 static int
    41 StartBeApp(void *unused)
    42 {
    43     BApplication *App;
    44 
    45     App = new BApplication("application/x-SDL-executable");
    46 
    47     App->Run();
    48     delete App;
    49     return (0);
    50 }
    51 
    52 /* Initialize the Be Application, if it's not already started */
    53 int
    54 SDL_InitBeApp(void)
    55 {
    56     /* Create the BApplication that handles appserver interaction */
    57     if (SDL_BeAppActive <= 0) {
    58         SDL_AppThread = SDL_CreateThread(StartBeApp, NULL);
    59         if (SDL_AppThread == NULL) {
    60             SDL_SetError("Couldn't create BApplication thread");
    61             return (-1);
    62         }
    63 
    64         /* Change working to directory to that of executable */
    65         app_info info;
    66         if (B_OK == be_app->GetAppInfo(&info)) {
    67             entry_ref ref = info.ref;
    68             BEntry entry;
    69             if (B_OK == entry.SetTo(&ref)) {
    70                 BPath path;
    71                 if (B_OK == path.SetTo(&entry)) {
    72                     if (B_OK == path.GetParent(&path)) {
    73                         chdir(path.Path());
    74                     }
    75                 }
    76             }
    77         }
    78 
    79         do {
    80             SDL_Delay(10);
    81         } while ((be_app == NULL) || be_app->IsLaunching());
    82 
    83         /* Mark the application active */
    84         SDL_BeAppActive = 0;
    85     }
    86 
    87     /* Increment the application reference count */
    88     ++SDL_BeAppActive;
    89 
    90     /* The app is running, and we're ready to go */
    91     return (0);
    92 }
    93 
    94 /* Quit the Be Application, if there's nothing left to do */
    95 void
    96 SDL_QuitBeApp(void)
    97 {
    98     /* Decrement the application reference count */
    99     --SDL_BeAppActive;
   100 
   101     /* If the reference count reached zero, clean up the app */
   102     if (SDL_BeAppActive == 0) {
   103         if (SDL_AppThread != NULL) {
   104             if (be_app != NULL) {       /* Not tested */
   105                 be_app->PostMessage(B_QUIT_REQUESTED);
   106             }
   107             SDL_WaitThread(SDL_AppThread, NULL);
   108             SDL_AppThread = NULL;
   109         }
   110         /* be_app should now be NULL since be_app has quit */
   111     }
   112 }
   113 
   114 /* vi: set ts=4 sw=4 expandtab: */