]> git.sesse.net Git - vlc/blobdiff - src/misc/beos_specific.cpp
* ./src/misc/variables.c: callbacks are now called after the variable has
[vlc] / src / misc / beos_specific.cpp
index d68ec6fe57b6b1338dac03c87fa4d6ae572e79e2..dab984350afa3587017e9c9b499c517308f1794a 100644 (file)
@@ -2,7 +2,7 @@
  * beos_init.cpp: Initialization for BeOS specific features 
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: beos_specific.cpp,v 1.12 2001/11/28 15:08:06 massiot Exp $
+ * $Id: beos_specific.cpp,v 1.27 2002/10/09 01:14:18 titer Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  *****************************************************************************/
-#include "defs.h"
-
 #include <Application.h>
 #include <Roster.h>
 #include <Path.h>
 #include <Alert.h>
+#include <Message.h>
+#include <Window.h>
+
 #include <stdio.h>
 #include <string.h> /* strdup() */
 #include <malloc.h>   /* free() */
 
 extern "C"
 {
-#include "config.h"
-#include "common.h"
-#include "intf_msg.h"
-#include "threads.h"
-#include "mtime.h"
+#include <vlc/vlc.h>
 }
-#include "beos_specific.h"
 
 /*****************************************************************************
  * The VlcApplication class
@@ -46,20 +42,28 @@ extern "C"
 class VlcApplication : public BApplication
 {
 public:
+    vlc_object_t *p_this;
+
     VlcApplication(char* );
     ~VlcApplication();
 
     virtual void ReadyToRun();
     virtual void AboutRequested();
+    virtual void RefsReceived(BMessage* message);
+    virtual void MessageReceived(BMessage* message);
+    
+private:
+    BWindow*     fInterfaceWindow;
+    BMessage*    fRefsMessage;
 };
 
 /*****************************************************************************
  * Static vars
  *****************************************************************************/
-static vlc_thread_t app_thread;
-static vlc_mutex_t  app_lock;
-static vlc_cond_t   app_wait;
-static char        *psz_program_path;
+static char *         psz_program_path;
+
+//const uint32 INTERFACE_CREATED = 'ifcr';  /* message sent from interface */
+#include "../../modules/gui/beos/MsgVals.h"
 
 extern "C"
 {
@@ -67,41 +71,41 @@ extern "C"
 /*****************************************************************************
  * Local prototypes.
  *****************************************************************************/
-static void system_AppThread( void * args );
+static void AppThread( vlc_object_t *p_appthread );
 
 /*****************************************************************************
  * system_Init: create a BApplication object and fill in program path.
  *****************************************************************************/
-void system_Init( int *pi_argc, char *ppsz_argv[], char *ppsz_env[] )
+void system_Init( vlc_t *p_this, int *pi_argc, char *ppsz_argv[] )
 {
-    /* Prepare the lock/wait before launching the BApplication thread */
-    vlc_mutex_init( &app_lock );
-    vlc_cond_init( &app_wait );
-    vlc_mutex_lock( &app_lock );
-
-    /* Create the BApplication thread */
-    vlc_thread_create( &app_thread, "app thread",
-                       (vlc_thread_func_t)system_AppThread, 0 );
-
-    /* Wait for the application to be initialized */
-    vlc_cond_wait( &app_wait, &app_lock );
-    vlc_mutex_unlock( &app_lock );
-
-    /* Destroy the locks */
-    vlc_mutex_destroy( &app_lock );
-    vlc_cond_destroy( &app_wait );
+    p_this->p_libvlc->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 );
 }
 
 /*****************************************************************************
- * system_End: destroy the BApplication object.
+ * system_Configure: check for system specific configuration options.
  *****************************************************************************/
-void system_End( void )
+void system_Configure( vlc_t * )
 {
-    free( psz_program_path );
 
+}
+
+/*****************************************************************************
+ * system_End: destroy the BApplication object.
+ *****************************************************************************/
+void system_End( vlc_t *p_this )
+{
     /* Tell the BApplication to die */
     be_app->PostMessage( B_QUIT_REQUESTED );
-    vlc_thread_join( app_thread );
+
+    vlc_thread_join( p_this->p_libvlc->p_appthread );
+    vlc_object_destroy( p_this->p_libvlc->p_appthread );
+
+    free( psz_program_path );
 }
 
 /*****************************************************************************
@@ -115,12 +119,15 @@ char * system_GetProgramPath( void )
 /* following functions are local */
 
 /*****************************************************************************
- * system_AppThread: the BApplication thread.
+ * AppThread: the BApplication thread.
  *****************************************************************************/
-static void system_AppThread( void * args )
+static void AppThread( vlc_object_t * p_this )
 {
     VlcApplication *BeApp = new VlcApplication("application/x-vnd.Ink-vlc");
+    vlc_object_attach( p_this, p_this->p_vlc );
+    BeApp->p_this = p_this;
     BeApp->Run();
+    vlc_object_detach( p_this );
     delete BeApp;
 }
 
@@ -130,7 +137,9 @@ static void system_AppThread( void * args )
  * VlcApplication: application constructor
  *****************************************************************************/
 VlcApplication::VlcApplication( char * psz_mimetype )
-               :BApplication( psz_mimetype )
+               :BApplication( psz_mimetype ),
+                fInterfaceWindow( NULL ),
+                fRefsMessage( NULL )
 {
     /* Nothing to do, we use the default constructor */
 }
@@ -141,6 +150,7 @@ VlcApplication::VlcApplication( char * psz_mimetype )
 VlcApplication::~VlcApplication( )
 {
     /* Nothing to do, we use the default destructor */
+    delete fRefsMessage;
 }
 
 /*****************************************************************************
@@ -148,9 +158,11 @@ VlcApplication::~VlcApplication( )
  *****************************************************************************/
 void VlcApplication::AboutRequested( )
 {
-       BAlert *alert;
-       alert = new BAlert( VOUT_TITLE, "BeOS " VOUT_TITLE "\n\n<www.videolan.org>", "Ok" );
-       alert->Go( NULL );
+    BAlert *alert;
+    alert = new BAlert( VOUT_TITLE,
+                        "BeOS " VOUT_TITLE "\n\n<www.videolan.org>",
+                        "Ok" );
+    alert->Go( NULL );
 }
 
 /*****************************************************************************
@@ -169,8 +181,50 @@ void VlcApplication::ReadyToRun( )
     psz_program_path = strdup( path.Path() );
 
     /* Tell the main thread we are finished initializing the BApplication */
-    vlc_mutex_lock( &app_lock );
-    vlc_cond_signal( &app_wait );
-    vlc_mutex_unlock( &app_lock );
+    vlc_thread_ready( p_this );
+}
+
+/*****************************************************************************
+ * RefsReceived: called when files are sent to our application
+ *               (for example when the user drops fils onto our icon)
+ *****************************************************************************/
+void VlcApplication::RefsReceived(BMessage* message)
+{
+       if (fInterfaceWindow)
+               fInterfaceWindow->PostMessage(message);
+       else {
+               delete fRefsMessage;
+               fRefsMessage = new BMessage(*message);
+       }
 }
 
+/*****************************************************************************
+ * MessageReceived: a BeOS applications main message loop
+ *                  Since VlcApplication and interface are separated
+ *                  in the vlc binary and the interface plugin,
+ *                  we use this method to "stick" them together.
+ *                  The interface will post a message to the global
+ *                  "be_app" pointer when the interface is created
+ *                  containing a pointer to the interface window.
+ *                  In this way, we can keep a B_REFS_RECEIVED message
+ *                  in store for the interface window to handle later.
+ *****************************************************************************/
+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);
+       }
+}