X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fbeos_specific.cpp;h=51c70cf8a8182b9caeb871e1b55dab9c037c16f0;hb=c1ba81aeb1d72979953c4eeaf85f1202e0008469;hp=c87f90020e3ebcad994463711b4e352afc8fd1e1;hpb=cf1ded5901502712e880a5de58e078f67653785e;p=vlc diff --git a/src/misc/beos_specific.cpp b/src/misc/beos_specific.cpp index c87f90020e..51c70cf8a8 100644 --- a/src/misc/beos_specific.cpp +++ b/src/misc/beos_specific.cpp @@ -1,8 +1,8 @@ /***************************************************************************** * beos_init.cpp: Initialization for BeOS specific features ***************************************************************************** - * Copyright (C) 1999-2001 VideoLAN - * $Id: beos_specific.cpp,v 1.34 2003/11/09 16:00:54 titer Exp $ + * Copyright (C) 1999-2004 the VideoLAN team + * $Id$ * * Authors: Jean-Marc Dressler * @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #include #include @@ -29,11 +29,16 @@ #include #include /* strdup() */ -#include /* free() */ +#include /* free() */ extern "C" { -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "../libvlc.h" } /***************************************************************************** @@ -56,14 +61,17 @@ public: private: BWindow* fInterfaceWindow; BMessage* fRefsMessage; + bool fReadyToQuit; }; /***************************************************************************** * Static vars *****************************************************************************/ -//const uint32_t INTERFACE_CREATED = 'ifcr'; /* message sent from interface */ #include "../../modules/gui/beos/MsgVals.h" +#define REALLY_QUIT 'requ' + +static vlc_object_t *p_appthread; extern "C" { @@ -71,41 +79,40 @@ extern "C" /***************************************************************************** * Local prototypes. *****************************************************************************/ -static void AppThread( vlc_object_t *p_appthread ); +static void* AppThread( vlc_object_t *p_appthread ); /***************************************************************************** * system_Init: create a BApplication object and fill in program path. *****************************************************************************/ -void system_Init( vlc_t *p_this, int *pi_argc, char *ppsz_argv[] ) +void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] ) { - p_this->p_libvlc->p_appthread = + p_appthread = (vlc_object_t *)vlc_object_create( p_this, sizeof(vlc_object_t) ); /* Create the BApplication thread and wait for initialization */ - vlc_thread_create( p_this->p_libvlc->p_appthread, "app thread", AppThread, - VLC_THREAD_PRIORITY_LOW, VLC_TRUE ); + vlc_thread_create( p_appthread, "app thread", AppThread, + VLC_THREAD_PRIORITY_LOW, true ); } /***************************************************************************** * system_Configure: check for system specific configuration options. *****************************************************************************/ -void system_Configure( vlc_t *, int *pi_argc, char *ppsz_argv[] ) +void system_Configure( libvlc_int_t *, int *pi_argc, const char *ppsz_argv[] ) { - } /***************************************************************************** * system_End: destroy the BApplication object. *****************************************************************************/ -void system_End( vlc_t *p_this ) +void system_End( libvlc_int_t *p_this ) { /* Tell the BApplication to die */ - be_app->PostMessage( B_QUIT_REQUESTED ); + be_app->PostMessage( REALLY_QUIT ); - vlc_thread_join( p_this->p_libvlc->p_appthread ); - vlc_object_destroy( p_this->p_libvlc->p_appthread ); + vlc_thread_join( p_appthread ); + vlc_object_release( p_appthread ); - free( p_this->p_libvlc->psz_vlcpath ); + free( psz_vlcpath ); } /* following functions are local */ @@ -113,14 +120,18 @@ void system_End( vlc_t *p_this ) /***************************************************************************** * AppThread: the BApplication thread. *****************************************************************************/ -static void AppThread( vlc_object_t * p_this ) +static void* AppThread( vlc_object_t * p_this ) { - VlcApplication *BeApp = new VlcApplication("application/x-vnd.videolan-vlc"); - vlc_object_attach( p_this, p_this->p_vlc ); + int canc = vlc_savecancel (); + VlcApplication * BeApp = + new VlcApplication("application/x-vnd.videolan-vlc"); + vlc_object_attach( p_this, p_this->p_libvlc ); BeApp->p_this = p_this; BeApp->Run(); vlc_object_detach( p_this ); delete BeApp; + vlc_restorecancel (canc); + return NULL; } } /* extern "C" */ @@ -131,7 +142,8 @@ static void AppThread( vlc_object_t * p_this ) VlcApplication::VlcApplication( char * psz_mimetype ) :BApplication( psz_mimetype ), fInterfaceWindow( NULL ), - fRefsMessage( NULL ) + fRefsMessage( NULL ), + fReadyToQuit( false ) { /* Nothing to do, we use the default constructor */ } @@ -170,7 +182,7 @@ void VlcApplication::ReadyToRun( ) BEntry entry( &info.ref ); entry.GetPath( &path ); path.GetParent( &path ); - p_this->p_libvlc->psz_vlcpath = strdup( path.Path() ); + psz_vlcpath = strdup( path.Path() ); /* Tell the main thread we are finished initializing the BApplication */ vlc_thread_ready( p_this ); @@ -182,12 +194,12 @@ void VlcApplication::ReadyToRun( ) *****************************************************************************/ void VlcApplication::RefsReceived(BMessage* message) { - if (fInterfaceWindow) - fInterfaceWindow->PostMessage(message); - else { - delete fRefsMessage; - fRefsMessage = new BMessage(*message); - } + if (fInterfaceWindow) + fInterfaceWindow->PostMessage(message); + else { + delete fRefsMessage; + fRefsMessage = new BMessage(*message); + } } /***************************************************************************** @@ -203,32 +215,35 @@ void VlcApplication::RefsReceived(BMessage* message) *****************************************************************************/ void VlcApplication::MessageReceived(BMessage* message) { - switch (message->what) { - case INTERFACE_CREATED: { - BWindow* interfaceWindow; - if (message->FindPointer("window", (void**)&interfaceWindow) == B_OK) { - fInterfaceWindow = interfaceWindow; - if (fRefsMessage) { - fInterfaceWindow->PostMessage(fRefsMessage); - delete fRefsMessage; - fRefsMessage = NULL; - } - } - break; - } - - default: - BApplication::MessageReceived(message); - } + switch (message->what) { + case INTERFACE_CREATED: { + BWindow* interfaceWindow; + if (message->FindPointer("window", (void**)&interfaceWindow) == B_OK) { + fInterfaceWindow = interfaceWindow; + if (fRefsMessage) { + fInterfaceWindow->PostMessage(fRefsMessage); + delete fRefsMessage; + fRefsMessage = NULL; + } + } + break; + } + + case REALLY_QUIT: + fReadyToQuit = true; + PostMessage( B_QUIT_REQUESTED ); + break; + + default: + BApplication::MessageReceived(message); + } } bool VlcApplication::QuitRequested() { - if( CurrentMessage() && CurrentMessage()->FindBool( "shortcut" ) ) + if( !fReadyToQuit ) { - /* The user hit Alt+Q, don't let the be_app exit without - cleaning */ - p_this->p_vlc->b_die = 1; + libvlc_Quit( p_this->p_libvlc ); return false; }