X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fwxwindows%2Fwxwindows.cpp;h=0454ef54810eff4e30a9e2462d22e0a1b7c9a538;hb=a5ee53f77453343410be793192b3a7cacb2ce08d;hp=ed2d351fc7303a8550673cd8d5506ea6b1eaf1b2;hpb=270c49946420f12a7337ba1188b5d1c80ad9e538;p=vlc diff --git a/modules/gui/wxwindows/wxwindows.cpp b/modules/gui/wxwindows/wxwindows.cpp index ed2d351fc7..0454ef5481 100644 --- a/modules/gui/wxwindows/wxwindows.cpp +++ b/modules/gui/wxwindows/wxwindows.cpp @@ -1,8 +1,8 @@ /***************************************************************************** * wxwindows.cpp : wxWindows plugin for vlc ***************************************************************************** - * Copyright (C) 2000-2001 VideoLAN - * $Id: wxwindows.cpp,v 1.8 2002/12/13 01:50:32 gbazin Exp $ + * Copyright (C) 2000-2004 VideoLAN + * $Id$ * * Authors: Gildas Bazin * @@ -10,7 +10,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -30,24 +30,21 @@ #include #include +#include -#ifdef WIN32 /* mingw32 hack */ -#undef Yield -#undef CreateDialog +#ifdef HAVE_LOCALE_H +# include #endif -/* Let vlc take care of the i18n stuff */ -#define WXINTL_NO_GETTEXT_MACRO - -#include -#include - -#include - #include "wxwindows.h" /* Temporary hack */ -#ifdef __DARWIN__ +#if defined(WIN32) && defined(_WX_INIT_H_) +/* Hack to detect wxWindows 2.5 which has a different wxEntry() prototype */ +extern int wxEntry( HINSTANCE hInstance, HINSTANCE hPrevInstance = NULL, + char *pCmdLine = NULL, int nCmdShow = SW_NORMAL ); +#endif +#ifdef SYS_DARWIN int wxEntry( int argc, char *argv[] , bool enterLoop = TRUE ); #endif @@ -56,8 +53,12 @@ int wxEntry( int argc, char *argv[] , bool enterLoop = TRUE ); *****************************************************************************/ static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); +static int OpenDialogs ( vlc_object_t * ); static void Run ( intf_thread_t * ); +static void Init ( intf_thread_t * ); + +static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); /***************************************************************************** * Local classes declarations. @@ -69,6 +70,7 @@ public: Instance( intf_thread_t *_p_intf ); bool OnInit(); + int OnExit(); private: intf_thread_t *p_intf; @@ -78,14 +80,40 @@ private: /***************************************************************************** * Module descriptor *****************************************************************************/ +#define EMBED_TEXT N_("Embed video in interface") +#define EMBED_LONGTEXT N_("Embed the video window inside the interface. The "\ + "default behaviour is to have video windows separate from the interface.") +#define BOOKMARKS_TEXT N_("Show bookmarks dialog") +#define BOOKMARKS_LONGTEXT N_("Show bookmarks dialog when the interface " \ + "starts.") + vlc_module_begin(); - add_category_hint( N_("wxWindows"), NULL ); +#ifdef WIN32 + int i_score = 150; +#else + int i_score = getenv( "DISPLAY" ) == NULL ? 15 : 150; +#endif set_description( (char *) _("wxWindows interface module") ); - set_capability( "interface", 50 ); + set_capability( "interface", i_score ); set_callbacks( Open, Close ); add_shortcut( "wxwindows" ); add_shortcut( "wxwin" ); + add_shortcut( "wx" ); set_program( "wxvlc" ); + + add_bool( "wxwin-embed", 0, NULL, + EMBED_TEXT, EMBED_LONGTEXT, VLC_FALSE ); + add_bool( "wxwin-bookmarks", 0, NULL, + BOOKMARKS_TEXT, BOOKMARKS_LONGTEXT, VLC_FALSE ); + + add_submodule(); + set_description( _("wxWindows dialogs provider") ); + set_capability( "dialogs provider", 50 ); + set_callbacks( OpenDialogs, Close ); + +#if !defined(WIN32) + linked_with_a_crap_library_which_uses_atexit(); +#endif vlc_module_end(); /***************************************************************************** @@ -109,20 +137,33 @@ static int Open( vlc_object_t *p_this ) /* Initialize wxWindows thread */ p_intf->p_sys->b_playing = 0; - p_intf->p_sys->b_popup_changed = 0; - p_intf->p_sys->b_window_changed = 0; - p_intf->p_sys->b_playlist_changed = 0; p_intf->p_sys->p_input = NULL; p_intf->p_sys->i_playing = -1; p_intf->p_sys->b_slider_free = 1; p_intf->p_sys->i_slider_pos = p_intf->p_sys->i_slider_oldpos = 0; - p_intf->p_sys->i_part = 0; + p_intf->p_sys->p_popup_menu = NULL; + p_intf->p_sys->p_video_window = NULL; + + p_intf->pf_show_dialog = NULL; + + /* We support play on start */ + p_intf->b_play = VLC_TRUE; return VLC_SUCCESS; } +static int OpenDialogs( vlc_object_t *p_this ) +{ + intf_thread_t *p_intf = (intf_thread_t *)p_this; + int i_ret = Open( p_this ); + + p_intf->pf_show_dialog = ShowDialog; + + return i_ret; +} + /***************************************************************************** * Close: destroy interface window *****************************************************************************/ @@ -135,6 +176,14 @@ static void Close( vlc_object_t *p_this ) vlc_object_release( p_intf->p_sys->p_input ); } + if( p_intf->pf_show_dialog ) + { + /* We must destroy the dialogs thread */ + wxCommandEvent event( wxEVT_DIALOG, INTF_DIALOG_EXIT ); + p_intf->p_sys->p_wxwindow->AddPendingEvent( event ); + vlc_thread_join( p_intf ); + } + msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub ); /* Destroy structure */ @@ -144,19 +193,59 @@ static void Close( vlc_object_t *p_this ) /***************************************************************************** * Run: wxWindows thread *****************************************************************************/ +#if !defined(__BUILTIN__) && defined( WIN32 ) +HINSTANCE hInstance = 0; +extern "C" BOOL WINAPI +DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) +{ + hInstance = (HINSTANCE)hModule; + return TRUE; +} +#endif + static void Run( intf_thread_t *p_intf ) +{ + if( p_intf->pf_show_dialog ) + { + /* The module is used in dialog provider mode */ + + /* Create a new thread for wxWindows */ + if( vlc_thread_create( p_intf, "Skins Dialogs Thread", + Init, 0, VLC_TRUE ) ) + { + msg_Err( p_intf, "cannot create Skins Dialogs Thread" ); + p_intf->pf_show_dialog = NULL; + } + } + else + { + /* The module is used in interface mode */ + Init( p_intf ); + } +} + +static void Init( intf_thread_t *p_intf ) { #if !defined( WIN32 ) static char *p_args[] = { "" }; + int i_args = 1; #endif /* Hack to pass the p_intf pointer to the new wxWindow Instance object */ +#ifdef wxTheApp + wxApp::SetInstance( new Instance( p_intf ) ); +#else wxTheApp = new Instance( p_intf ); +#endif #if defined( WIN32 ) - wxEntry( GetModuleHandle(NULL), NULL, NULL, SW_SHOW, TRUE ); +#if !defined(__BUILTIN__) + wxEntry( hInstance/*GetModuleHandle(NULL)*/, NULL, NULL, SW_SHOW ); #else - wxEntry( 1, p_args ); + wxEntry( GetModuleHandle(NULL), NULL, NULL, SW_SHOW ); +#endif +#else + wxEntry( i_args, p_args ); #endif } @@ -190,22 +279,84 @@ bool Instance::OnInit() * provided facilities (eg. open file dialog) */ locale.Init( wxLANGUAGE_DEFAULT ); + /* FIXME: The stream output mrl parsing uses ',' already so we want to + * keep the default '.' for floating point numbers. */ + setlocale( LC_NUMERIC, "C" ); + /* Make an instance of your derived frame. Passing NULL (the default value - * of Frame's constructor is NULL) as the frame doesn't have a frame + * of Frame's constructor is NULL) as the frame doesn't have a parent * since it is the first window */ - Interface *MainInterface = new Interface( p_intf ); - /* Create the playlist window */ - p_intf->p_sys->p_playlist_window = new Playlist( p_intf, MainInterface ); + if( !p_intf->pf_show_dialog ) + { + /* The module is used in interface mode */ + Interface *MainInterface = new Interface( p_intf ); + p_intf->p_sys->p_wxwindow = MainInterface; + + /* Show the interface */ + MainInterface->Show( TRUE ); + SetTopWindow( MainInterface ); + MainInterface->Raise(); + } + + /* Creates the dialogs provider */ + p_intf->p_sys->p_wxwindow = + CreateDialogsProvider( p_intf, p_intf->pf_show_dialog ? + NULL : p_intf->p_sys->p_wxwindow ); - /* Show the interface */ - MainInterface->Show(TRUE); + p_intf->p_sys->pf_show_dialog = ShowDialog; - SetTopWindow(MainInterface); + /* OK, initialization is over */ + vlc_thread_ready( p_intf ); - /* Start timer */ - new Timer( p_intf, MainInterface ); + /* Check if we need to start playing */ + if( p_intf->b_play ) + { + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + if( p_playlist ) + { + playlist_Play( p_playlist ); + vlc_object_release( p_playlist ); + } + } /* Return TRUE to tell program to continue (FALSE would terminate) */ return TRUE; } + +/***************************************************************************** + * Instance::OnExit: called when the interface execution stops + *****************************************************************************/ +int Instance::OnExit() +{ + if( p_intf->pf_show_dialog ) + { + /* We need to manually clean up the dialogs class */ + if( p_intf->p_sys->p_wxwindow ) delete p_intf->p_sys->p_wxwindow; + } + return 0; +} + +static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg, + intf_dialog_args_t *p_arg ) +{ + wxCommandEvent event( wxEVT_DIALOG, i_dialog_event ); + event.SetInt( i_arg ); + event.SetClientData( p_arg ); + +#ifdef WIN32 + SendMessage( (HWND)p_intf->p_sys->p_wxwindow->GetHandle(), + WM_CANCELMODE, 0, 0 ); +#endif + if( i_dialog_event == INTF_DIALOG_POPUPMENU && i_arg == 0 ) return; + + /* Hack to prevent popup events to be enqueued when + * one is already active */ + if( i_dialog_event != INTF_DIALOG_POPUPMENU || + !p_intf->p_sys->p_popup_menu ) + { + p_intf->p_sys->p_wxwindow->AddPendingEvent( event ); + } +}