wxwindows.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:12k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * wxwindows.cpp : wxWindows plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2004 VideoLAN
  5.  * $Id: wxwindows.cpp 8869 2004-09-30 22:17:54Z gbazin $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <stdlib.h>                                      /* malloc(), free() */
  27. #include <errno.h>                                                 /* ENOMEM */
  28. #include <string.h>                                            /* strerror() */
  29. #include <stdio.h>
  30. #include <vlc/vlc.h>
  31. #include <vlc/intf.h>
  32. #ifdef HAVE_LOCALE_H
  33. #   include <locale.h>
  34. #endif
  35. #include "wxwindows.h"
  36. /* Temporary hack */
  37. #if defined(WIN32) && defined(_WX_INIT_H_) 
  38. #if (wxMAJOR_VERSION <= 2) && (wxMINOR_VERSION <= 5) && (wxRELEASE_NUMBER < 3)
  39. /* Hack to detect wxWindows 2.5 which has a different wxEntry() prototype */
  40. extern int wxEntry( HINSTANCE hInstance, HINSTANCE hPrevInstance = NULL,
  41.                     char *pCmdLine = NULL, int nCmdShow = SW_NORMAL );
  42. #endif
  43. #endif
  44. #ifdef SYS_DARWIN
  45. int wxEntry( int argc, char *argv[] , bool enterLoop = TRUE );
  46. #endif
  47. /*****************************************************************************
  48.  * Local prototypes.
  49.  *****************************************************************************/
  50. static int  Open         ( vlc_object_t * );
  51. static void Close        ( vlc_object_t * );
  52. static int  OpenDialogs  ( vlc_object_t * );
  53. static void Run          ( intf_thread_t * );
  54. static void Init         ( intf_thread_t * );
  55. static void ShowDialog   ( intf_thread_t *, int, int, intf_dialog_args_t * );
  56. /*****************************************************************************
  57.  * Local classes declarations.
  58.  *****************************************************************************/
  59. class Instance: public wxApp
  60. {
  61. public:
  62.     Instance();
  63.     Instance( intf_thread_t *_p_intf );
  64.     bool OnInit();
  65.     int  OnExit();
  66. private:
  67.     intf_thread_t *p_intf;
  68.     wxLocale locale;                                /* locale we'll be using */
  69. };
  70. /*****************************************************************************
  71.  * Module descriptor
  72.  *****************************************************************************/
  73. #define EMBED_TEXT N_("Embed video in interface")
  74. #define EMBED_LONGTEXT N_("Embed the video inside the interface instead " 
  75.     "of having it in a separate window.")
  76. #define BOOKMARKS_TEXT N_("Show bookmarks dialog")
  77. #define BOOKMARKS_LONGTEXT N_("Show bookmarks dialog when the interface " 
  78.     "starts.")
  79. vlc_module_begin();
  80. #ifdef WIN32
  81.     int i_score = 150;
  82. #else
  83.     int i_score = getenv( "DISPLAY" ) == NULL ? 15 : 150;
  84. #endif
  85.     set_description( (char *) _("wxWindows interface module") );
  86.     set_capability( "interface", i_score );
  87.     set_callbacks( Open, Close );
  88.     add_shortcut( "wxwindows" );
  89.     add_shortcut( "wxwin" );
  90.     add_shortcut( "wx" );
  91.     set_program( "wxvlc" );
  92.     add_bool( "wxwin-embed", 1, NULL,
  93.               EMBED_TEXT, EMBED_LONGTEXT, VLC_FALSE );
  94.     add_bool( "wxwin-bookmarks", 0, NULL,
  95.               BOOKMARKS_TEXT, BOOKMARKS_LONGTEXT, VLC_FALSE );
  96.     add_submodule();
  97.     set_description( _("wxWindows dialogs provider") );
  98.     set_capability( "dialogs provider", 50 );
  99.     set_callbacks( OpenDialogs, Close );
  100. #if !defined(WIN32)
  101.     linked_with_a_crap_library_which_uses_atexit();
  102. #endif
  103. vlc_module_end();
  104. /*****************************************************************************
  105.  * Open: initialize and create window
  106.  *****************************************************************************/
  107. static int Open( vlc_object_t *p_this )
  108. {
  109.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  110.     /* Allocate instance and initialize some members */
  111.     p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) );
  112.     if( p_intf->p_sys == NULL )
  113.     {
  114.         msg_Err( p_intf, "out of memory" );
  115.         return VLC_ENOMEM;
  116.     }
  117.     memset( p_intf->p_sys, 0, sizeof( intf_sys_t ) );
  118.     p_intf->pf_run = Run;
  119.     p_intf->p_sys->p_sub = msg_Subscribe( p_intf );
  120.     /* Initialize wxWindows thread */
  121.     p_intf->p_sys->b_playing = 0;
  122.     p_intf->p_sys->p_input = NULL;
  123.     p_intf->p_sys->i_playing = -1;
  124.     p_intf->p_sys->b_slider_free = 1;
  125.     p_intf->p_sys->i_slider_pos = p_intf->p_sys->i_slider_oldpos = 0;
  126.     p_intf->p_sys->p_popup_menu = NULL;
  127.     p_intf->p_sys->p_video_window = NULL;
  128.     p_intf->pf_show_dialog = NULL;
  129.     /* We support play on start */
  130.     p_intf->b_play = VLC_TRUE;
  131.     return VLC_SUCCESS;
  132. }
  133. static int OpenDialogs( vlc_object_t *p_this )
  134. {
  135.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  136.     int i_ret = Open( p_this );
  137.     p_intf->pf_show_dialog = ShowDialog;
  138.     return i_ret;
  139. }
  140. /*****************************************************************************
  141.  * Close: destroy interface window
  142.  *****************************************************************************/
  143. static void Close( vlc_object_t *p_this )
  144. {
  145.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  146.     if( p_intf->p_sys->p_input )
  147.     {
  148.         vlc_object_release( p_intf->p_sys->p_input );
  149.     }
  150.     vlc_mutex_lock( &p_intf->object_lock );
  151.     p_intf->b_dead = VLC_TRUE;
  152.     vlc_mutex_unlock( &p_intf->object_lock );
  153.     if( p_intf->pf_show_dialog )
  154.     {
  155.         /* We must destroy the dialogs thread */
  156.         wxCommandEvent event( wxEVT_DIALOG, INTF_DIALOG_EXIT );
  157.         p_intf->p_sys->p_wxwindow->AddPendingEvent( event );
  158.         vlc_thread_join( p_intf );
  159.     }
  160.     msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub );
  161.     /* Destroy structure */
  162.     free( p_intf->p_sys );
  163. }
  164. /*****************************************************************************
  165.  * Run: wxWindows thread
  166.  *****************************************************************************/
  167. #if !defined(__BUILTIN__) && defined( WIN32 )
  168. HINSTANCE hInstance = 0;
  169. extern "C" BOOL WINAPI
  170. DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
  171. {
  172.     hInstance = (HINSTANCE)hModule;
  173.     return TRUE;
  174. }
  175. #endif
  176. static void Run( intf_thread_t *p_intf )
  177. {
  178.     if( p_intf->pf_show_dialog )
  179.     {
  180.         /* The module is used in dialog provider mode */
  181.         /* Create a new thread for wxWindows */
  182.         if( vlc_thread_create( p_intf, "Skins Dialogs Thread",
  183.                                Init, 0, VLC_TRUE ) )
  184.         {
  185.             msg_Err( p_intf, "cannot create Skins Dialogs Thread" );
  186.             p_intf->pf_show_dialog = NULL;
  187.         }
  188.     }
  189.     else
  190.     {
  191.         /* The module is used in interface mode */
  192.         Init( p_intf );
  193.     }
  194. }
  195. static void Init( intf_thread_t *p_intf )
  196. {
  197. #if !defined( WIN32 )
  198.     static char  *p_args[] = { "" };
  199.     int i_args = 1;
  200. #endif
  201.     /* Hack to pass the p_intf pointer to the new wxWindow Instance object */
  202. #ifdef wxTheApp
  203.     wxApp::SetInstance( new Instance( p_intf ) );
  204. #else
  205.     wxTheApp = new Instance( p_intf );
  206. #endif
  207. #if defined( WIN32 )
  208. #if !defined(__BUILTIN__)
  209.     wxEntry( hInstance/*GetModuleHandle(NULL)*/, NULL, NULL, SW_SHOW );
  210. #else
  211.     wxEntry( GetModuleHandle(NULL), NULL, NULL, SW_SHOW );
  212. #endif
  213. #else
  214.     wxEntry( i_args, p_args );
  215. #endif
  216. }
  217. /* following functions are local */
  218. /*****************************************************************************
  219.  * Constructors.
  220.  *****************************************************************************/
  221. Instance::Instance( )
  222. {
  223. }
  224. Instance::Instance( intf_thread_t *_p_intf )
  225. {
  226.     /* Initialization */
  227.     p_intf = _p_intf;
  228. }
  229. IMPLEMENT_APP_NO_MAIN(Instance)
  230. /*****************************************************************************
  231.  * Instance::OnInit: the parent interface execution starts here
  232.  *****************************************************************************
  233.  * This is the "main program" equivalent, the program execution will
  234.  * start here.
  235.  *****************************************************************************/
  236. bool Instance::OnInit()
  237. {
  238.     /* Initialization of i18n stuff.
  239.      * Usefull for things we don't have any control over, like wxWindows
  240.      * provided facilities (eg. open file dialog) */
  241.     locale.Init( wxLANGUAGE_DEFAULT );
  242.     /* FIXME: The stream output mrl parsing uses ',' already so we want to
  243.      * keep the default '.' for floating point numbers. */
  244.     setlocale( LC_NUMERIC, "C" );
  245.     /* Make an instance of your derived frame. Passing NULL (the default value
  246.      * of Frame's constructor is NULL) as the frame doesn't have a parent
  247.      * since it is the first window */
  248.     if( !p_intf->pf_show_dialog )
  249.     {
  250.         /* The module is used in interface mode */
  251.         Interface *MainInterface = new Interface( p_intf );
  252.         p_intf->p_sys->p_wxwindow = MainInterface;
  253.         /* Show the interface */
  254.         MainInterface->Show( TRUE );
  255.         SetTopWindow( MainInterface );
  256.         MainInterface->Raise();
  257.     }
  258.     /* Creates the dialogs provider */
  259.     p_intf->p_sys->p_wxwindow =
  260.         CreateDialogsProvider( p_intf, p_intf->pf_show_dialog ?
  261.                                NULL : p_intf->p_sys->p_wxwindow );
  262.     p_intf->p_sys->pf_show_dialog = ShowDialog;
  263.     /* OK, initialization is over */
  264.     vlc_thread_ready( p_intf );
  265.     /* Check if we need to start playing */
  266.     if( !p_intf->pf_show_dialog && p_intf->b_play )
  267.     {
  268.         playlist_t *p_playlist =
  269.             (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  270.                                            FIND_ANYWHERE );
  271.         if( p_playlist )
  272.         {
  273.             playlist_Play( p_playlist );
  274.             vlc_object_release( p_playlist );
  275.         }
  276.     }
  277.     /* Return TRUE to tell program to continue (FALSE would terminate) */
  278.     return TRUE;
  279. }
  280. /*****************************************************************************
  281.  * Instance::OnExit: called when the interface execution stops
  282.  *****************************************************************************/
  283. int Instance::OnExit()
  284. {
  285.     if( p_intf->pf_show_dialog )
  286.     {
  287.          /* We need to manually clean up the dialogs class */
  288.          if( p_intf->p_sys->p_wxwindow ) delete p_intf->p_sys->p_wxwindow;
  289.     }
  290.     return 0;
  291. }
  292. static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
  293.                         intf_dialog_args_t *p_arg )
  294. {
  295.     wxCommandEvent event( wxEVT_DIALOG, i_dialog_event );
  296.     event.SetInt( i_arg );
  297.     event.SetClientData( p_arg );
  298. #ifdef WIN32
  299.     SendMessage( (HWND)p_intf->p_sys->p_wxwindow->GetHandle(),
  300.                  WM_CANCELMODE, 0, 0 );
  301. #endif
  302.     if( i_dialog_event == INTF_DIALOG_POPUPMENU && i_arg == 0 ) return;
  303.     /* Hack to prevent popup events to be enqueued when
  304.      * one is already active */
  305.     if( i_dialog_event != INTF_DIALOG_POPUPMENU ||
  306.         !p_intf->p_sys->p_popup_menu )
  307.     {
  308.         p_intf->p_sys->p_wxwindow->AddPendingEvent( event );
  309.     }
  310. }