beos_specific.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:9k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * beos_init.cpp: Initialization for BeOS specific features
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2004 the VideoLAN team
  5.  * $Id: 51c70cf8a8182b9caeb871e1b55dab9c037c16f0 $
  6.  *
  7.  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include <Application.h>
  24. #include <Roster.h>
  25. #include <Path.h>
  26. #include <Alert.h>
  27. #include <Message.h>
  28. #include <Window.h>
  29. #include <stdio.h>
  30. #include <string.h> /* strdup() */
  31. #include <malloc.h> /* free() */
  32. extern "C"
  33. {
  34. #ifdef HAVE_CONFIG_H
  35. # include "config.h"
  36. #endif
  37. #include <vlc_common.h>
  38. #include "../libvlc.h"
  39. }
  40. /*****************************************************************************
  41.  * The VlcApplication class
  42.  *****************************************************************************/
  43. class VlcApplication : public BApplication
  44. {
  45. public:
  46.     vlc_object_t *p_this;
  47.     VlcApplication(char* );
  48.     ~VlcApplication();
  49.     virtual void ReadyToRun();
  50.     virtual void AboutRequested();
  51.     virtual void RefsReceived(BMessage* message);
  52.     virtual void MessageReceived(BMessage* message);
  53.     virtual bool QuitRequested();
  54. private:
  55.     BWindow*     fInterfaceWindow;
  56.     BMessage*    fRefsMessage;
  57.     bool         fReadyToQuit;
  58. };
  59. /*****************************************************************************
  60.  * Static vars
  61.  *****************************************************************************/
  62. #include "../../modules/gui/beos/MsgVals.h"
  63. #define REALLY_QUIT 'requ'
  64. static vlc_object_t *p_appthread;
  65. extern "C"
  66. {
  67. /*****************************************************************************
  68.  * Local prototypes.
  69.  *****************************************************************************/
  70. static void* AppThread( vlc_object_t *p_appthread );
  71. /*****************************************************************************
  72.  * system_Init: create a BApplication object and fill in program path.
  73.  *****************************************************************************/
  74. void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
  75. {
  76.     p_appthread =
  77.             (vlc_object_t *)vlc_object_create( p_this, sizeof(vlc_object_t) );
  78.     /* Create the BApplication thread and wait for initialization */
  79.     vlc_thread_create( p_appthread, "app thread", AppThread,
  80.                        VLC_THREAD_PRIORITY_LOW, true );
  81. }
  82. /*****************************************************************************
  83.  * system_Configure: check for system specific configuration options.
  84.  *****************************************************************************/
  85. void system_Configure( libvlc_int_t *, int *pi_argc, const char *ppsz_argv[] )
  86. {
  87. }
  88. /*****************************************************************************
  89.  * system_End: destroy the BApplication object.
  90.  *****************************************************************************/
  91. void system_End( libvlc_int_t *p_this )
  92. {
  93.     /* Tell the BApplication to die */
  94.     be_app->PostMessage( REALLY_QUIT );
  95.     vlc_thread_join( p_appthread );
  96.     vlc_object_release( p_appthread );
  97.     free( psz_vlcpath );
  98. }
  99. /* following functions are local */
  100. /*****************************************************************************
  101.  * AppThread: the BApplication thread.
  102.  *****************************************************************************/
  103. static void* AppThread( vlc_object_t * p_this )
  104. {
  105.     int canc = vlc_savecancel ();
  106.     VlcApplication * BeApp =
  107.         new VlcApplication("application/x-vnd.videolan-vlc");
  108.     vlc_object_attach( p_this, p_this->p_libvlc );
  109.     BeApp->p_this = p_this;
  110.     BeApp->Run();
  111.     vlc_object_detach( p_this );
  112.     delete BeApp;
  113.     vlc_restorecancel (canc);
  114.     return NULL;
  115. }
  116. } /* extern "C" */
  117. /*****************************************************************************
  118.  * VlcApplication: application constructor
  119.  *****************************************************************************/
  120. VlcApplication::VlcApplication( char * psz_mimetype )
  121.                :BApplication( psz_mimetype ),
  122.                 fInterfaceWindow( NULL ),
  123.                 fRefsMessage( NULL ),
  124.                 fReadyToQuit( false )
  125. {
  126.     /* Nothing to do, we use the default constructor */
  127. }
  128. /*****************************************************************************
  129.  * ~VlcApplication: application destructor
  130.  *****************************************************************************/
  131. VlcApplication::~VlcApplication( )
  132. {
  133.     /* Nothing to do, we use the default destructor */
  134.     delete fRefsMessage;
  135. }
  136. /*****************************************************************************
  137.  * AboutRequested: called by the system on B_ABOUT_REQUESTED
  138.  *****************************************************************************/
  139. void VlcApplication::AboutRequested( )
  140. {
  141.     BAlert *alert;
  142.     alert = new BAlert( "VLC " PACKAGE_VERSION,
  143.                         "VLC " PACKAGE_VERSION " for BeOSnn"
  144.                                         "<www.videolan.org>", "OK");
  145.     alert->Go( NULL );
  146. }
  147. /*****************************************************************************
  148.  * ReadyToRun: called when the BApplication is initialized
  149.  *****************************************************************************/
  150. void VlcApplication::ReadyToRun( )
  151. {
  152.     BPath path;
  153.     app_info info;
  154.     /* Get the program path */
  155.     be_app->GetAppInfo( &info );
  156.     BEntry entry( &info.ref );
  157.     entry.GetPath( &path );
  158.     path.GetParent( &path );
  159.     psz_vlcpath = strdup( path.Path() );
  160.     /* Tell the main thread we are finished initializing the BApplication */
  161.     vlc_thread_ready( p_this );
  162. }
  163. /*****************************************************************************
  164.  * RefsReceived: called when files are sent to our application
  165.  *               (for example when the user drops fils onto our icon)
  166.  *****************************************************************************/
  167. void VlcApplication::RefsReceived(BMessage* message)
  168. {
  169.     if (fInterfaceWindow)
  170.         fInterfaceWindow->PostMessage(message);
  171.     else {
  172.         delete fRefsMessage;
  173.         fRefsMessage = new BMessage(*message);
  174.     }
  175. }
  176. /*****************************************************************************
  177.  * MessageReceived: a BeOS applications main message loop
  178.  *                  Since VlcApplication and interface are separated
  179.  *                  in the vlc binary and the interface plugin,
  180.  *                  we use this method to "stick" them together.
  181.  *                  The interface will post a message to the global
  182.  *                  "be_app" pointer when the interface is created
  183.  *                  containing a pointer to the interface window.
  184.  *                  In this way, we can keep a B_REFS_RECEIVED message
  185.  *                  in store for the interface window to handle later.
  186.  *****************************************************************************/
  187. void VlcApplication::MessageReceived(BMessage* message)
  188. {
  189.     switch (message->what) {
  190.         case INTERFACE_CREATED: {
  191.             BWindow* interfaceWindow;
  192.             if (message->FindPointer("window", (void**)&interfaceWindow) == B_OK) {
  193.                 fInterfaceWindow = interfaceWindow;
  194.                 if (fRefsMessage) {
  195.                     fInterfaceWindow->PostMessage(fRefsMessage);
  196.                     delete fRefsMessage;
  197.                     fRefsMessage = NULL;
  198.                 }
  199.             }
  200.             break;
  201.         }
  202.         case REALLY_QUIT:
  203.             fReadyToQuit = true;
  204.             PostMessage( B_QUIT_REQUESTED );
  205.             break;
  206.         default:
  207.             BApplication::MessageReceived(message);
  208.     }
  209. }
  210. bool VlcApplication::QuitRequested()
  211. {
  212.     if( !fReadyToQuit )
  213.     {
  214.         libvlc_Quit( p_this->p_libvlc );
  215.         return false;
  216.     }
  217.     BApplication::QuitRequested();
  218.     return true;
  219. }