symbian-qemu-0.9.1-12/libsdl-trunk/src/main/beos/SDL_BeApp.cc
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2     SDL - Simple DirectMedia Layer
       
     3     Copyright (C) 1997-2006 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 StartBeApp(void *unused)
       
    41 {
       
    42 	BApplication *App;
       
    43 
       
    44 	App = new BApplication("application/x-SDL-executable");
       
    45 
       
    46 	App->Run();
       
    47 	delete App;
       
    48 	return(0);
       
    49 }
       
    50 
       
    51 /* Initialize the Be Application, if it's not already started */
       
    52 int SDL_InitBeApp(void)
       
    53 {
       
    54 	/* Create the BApplication that handles appserver interaction */
       
    55 	if ( SDL_BeAppActive <= 0 ) {
       
    56 		SDL_AppThread = SDL_CreateThread(StartBeApp, NULL);
       
    57 		if ( SDL_AppThread == NULL ) {
       
    58 			SDL_SetError("Couldn't create BApplication thread");
       
    59 			return(-1);
       
    60 		}
       
    61 		
       
    62 		/* Change working to directory to that of executable */
       
    63 		app_info info;
       
    64 		if (B_OK == be_app->GetAppInfo(&info)) {
       
    65 			entry_ref ref = info.ref;
       
    66 			BEntry entry;
       
    67 			if (B_OK == entry.SetTo(&ref)) {
       
    68 				BPath path;
       
    69 				if (B_OK == path.SetTo(&entry)) {
       
    70 					if (B_OK == path.GetParent(&path)) {
       
    71 						chdir(path.Path());
       
    72 					}
       
    73 				}
       
    74 			}
       
    75 		}	
       
    76 		
       
    77 		do {
       
    78 			SDL_Delay(10);
       
    79 		} while ( (be_app == NULL) || be_app->IsLaunching() );
       
    80 
       
    81 		/* Mark the application active */
       
    82 		SDL_BeAppActive = 0;
       
    83 	}
       
    84 
       
    85 	/* Increment the application reference count */
       
    86 	++SDL_BeAppActive;
       
    87 
       
    88 	/* The app is running, and we're ready to go */
       
    89 	return(0);
       
    90 }
       
    91 
       
    92 /* Quit the Be Application, if there's nothing left to do */
       
    93 void SDL_QuitBeApp(void)
       
    94 {
       
    95 	/* Decrement the application reference count */
       
    96 	--SDL_BeAppActive;
       
    97 
       
    98 	/* If the reference count reached zero, clean up the app */
       
    99 	if ( SDL_BeAppActive == 0 ) {
       
   100 		if ( SDL_AppThread != NULL ) {
       
   101 			if ( be_app != NULL ) { /* Not tested */
       
   102 				be_app->PostMessage(B_QUIT_REQUESTED);
       
   103 			}
       
   104 			SDL_WaitThread(SDL_AppThread, NULL);
       
   105 			SDL_AppThread = NULL;
       
   106 		}
       
   107 		/* be_app should now be NULL since be_app has quit */
       
   108 	}
       
   109 }