* modules/gui/skins/*: use the new generic "open file" dialog to load skins.
* interface, such as message output.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: vlc_interface.h,v 1.3 2003/07/17 18:58:23 gbazin Exp $
+ * $Id: vlc_interface.h,v 1.4 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
+typedef struct intf_dialog_args_t intf_dialog_args_t;
+
/*****************************************************************************
* intf_thread_t: describe an interface thread
*****************************************************************************
void ( *pf_run ) ( intf_thread_t * );
/* Specific for dialogs providers */
- void ( *pf_show_dialog ) ( intf_thread_t *, int, int );
+ void ( *pf_show_dialog ) ( intf_thread_t *, int, int,
+ intf_dialog_args_t * );
/* XXX: new message passing stuff will go here */
vlc_mutex_t change_lock;
vlc_bool_t b_menu;
};
+/*****************************************************************************
+ * intf_dialog_args_t: arguments structure passed to a dialogs provider.
+ *****************************************************************************
+ * This struct describes the arguments passed to the dialogs provider.
+ * For now they are only used with INTF_DIALOG_FILE_GENERIC.
+ *****************************************************************************/
+struct intf_dialog_args_t
+{
+ char *psz_title;
+
+ vlc_bool_t b_blocking;
+ vlc_bool_t b_ready;
+ vlc_mutex_t lock;
+ vlc_cond_t wait;
+
+ char **psz_results;
+ int i_results;
+
+ void (*pf_callback) ( intf_dialog_args_t * );
+ void *p_arg;
+
+ /* Specifically for INTF_DIALOG_FILE_GENERIC */
+ char *psz_extensions;
+ vlc_bool_t b_save;
+ vlc_bool_t b_multiple;
+};
+
/*****************************************************************************
* Prototypes
*****************************************************************************/
#define INTF_DIALOG_PREFS 13
#define INTF_DIALOG_POPUPMENU 20
+
+#define INTF_DIALOG_FILE_GENERIC 30
+
+#define INTF_DIALOG_EXIT 99
* dialogs.cpp: Handles all the different dialog boxes we provide.
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: dialogs.cpp,v 1.11 2003/07/17 18:58:23 gbazin Exp $
+ * $Id: dialogs.cpp,v 1.12 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
}
}
-void Dialogs::ShowDialog( intf_thread_t *p_intf, int i_dialog_event,
- int i_arg )
+void Dialogs::ShowOpen( bool b_play )
{
+ if( p_provider && p_provider->pf_show_dialog )
+ p_provider->pf_show_dialog( p_provider, INTF_DIALOG_FILE,
+ (int)b_play, 0 );
}
-void Dialogs::ShowOpen( bool b_play )
+static void ShowOpenSkinCallback( intf_dialog_args_t *p_arg )
{
- if( p_provider && p_provider->pf_show_dialog )
- p_provider->pf_show_dialog( p_provider, INTF_DIALOG_FILE, b_play );
+ if( p_arg->i_results )
+ {
+ intf_thread_t *p_intf = (intf_thread_t *)p_arg->p_arg;
+ p_intf->p_sys->p_new_theme_file = strdup( p_arg->psz_results[0] );
+
+ if( !p_arg->b_blocking )
+ {
+ // Tell vlc to change skin after hiding interface
+ OSAPI_PostMessage( NULL, VLC_HIDE, VLC_LOAD_SKIN, 0 );
+ }
+ }
}
-void Dialogs::ShowOpenSkin()
+void Dialogs::ShowOpenSkin( bool b_block )
{
if( p_provider && p_provider->pf_show_dialog )
- p_provider->pf_show_dialog( p_provider, INTF_DIALOG_FILE, 0 );
+ {
+ intf_dialog_args_t *p_arg =
+ (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
+ memset( p_arg, 0, sizeof(intf_dialog_args_t) );
+
+ p_arg->b_blocking = b_block;
+ if( b_block )
+ {
+ vlc_mutex_init( p_intf, &p_arg->lock );
+ vlc_cond_init( p_intf, &p_arg->wait );
+ }
+
+ p_arg->psz_title = strdup( _("Open a skin file") );
+ p_arg->psz_extensions =
+ strdup( "Skin files (*.vlt)|*.vlt|Skin files (*.xml)|*.xml|" );
+
+ p_arg->p_arg = p_intf;
+ p_arg->pf_callback = ShowOpenSkinCallback;
+
+ p_provider->pf_show_dialog( p_provider, INTF_DIALOG_FILE_GENERIC,
+ 0, p_arg );
+
+ if( b_block )
+ {
+ vlc_mutex_lock( &p_arg->lock );
+ if( !p_arg->b_ready )
+ {
+ vlc_cond_wait( &p_arg->wait, &p_arg->lock );
+ }
+ vlc_mutex_unlock( &p_arg->lock );
+ }
+ }
}
void Dialogs::ShowMessages()
{
if( p_provider && p_provider->pf_show_dialog )
- p_provider->pf_show_dialog( p_provider, INTF_DIALOG_MESSAGES, 0 );
+ p_provider->pf_show_dialog( p_provider, INTF_DIALOG_MESSAGES, 0, 0 );
}
void Dialogs::ShowPrefs()
{
if( p_provider && p_provider->pf_show_dialog )
- p_provider->pf_show_dialog( p_provider, INTF_DIALOG_PREFS, 0 );
+ p_provider->pf_show_dialog( p_provider, INTF_DIALOG_PREFS, 0, 0 );
}
void Dialogs::ShowFileInfo()
{
if( p_provider && p_provider->pf_show_dialog )
- p_provider->pf_show_dialog( p_provider, INTF_DIALOG_FILEINFO, 0 );
+ p_provider->pf_show_dialog( p_provider, INTF_DIALOG_FILEINFO, 0, 0 );
}
void Dialogs::ShowPopup()
{
if( p_provider && p_provider->pf_show_dialog )
- p_provider->pf_show_dialog( p_provider, INTF_DIALOG_POPUPMENU, 0 );
+ p_provider->pf_show_dialog( p_provider, INTF_DIALOG_POPUPMENU, 0, 0 );
}
/*****************************************************************************
* dialogs.h: Dialogs class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: dialogs.h,v 1.7 2003/07/17 17:30:40 gbazin Exp $
+ * $Id: dialogs.h,v 1.8 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
// Destructor
virtual ~Dialogs();
- static void ShowDialog( intf_thread_t *, int, int );
void ShowOpen( bool b_play );
- void ShowOpenSkin();
+ void ShowOpenSkin( bool b_block );
void ShowMessages();
void ShowPrefs();
void ShowFileInfo();
* skin_common.h: Private Skin interface description
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: skin_common.h,v 1.22 2003/07/17 17:30:40 gbazin Exp $
+ * $Id: skin_common.h,v 1.23 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
// Interface dialogs
Dialogs *p_dialogs;
- // Send an event to show a dialog
- void (*pf_showdialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg );
-
// Popup menu
vlc_bool_t b_popup_change;
#if !defined(MODULE_NAME_IS_basic_skins)
* skin-main.cpp: skins plugin for VLC
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: skin_main.cpp,v 1.46 2003/07/18 20:06:00 gbazin Exp $
+ * $Id: skin_main.cpp,v 1.47 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
};
p_intf->pf_run = Run;
- p_intf->p_sys->pf_showdialog = Dialogs::ShowDialog;
-
// Suscribe to messages bank
p_intf->p_sys->p_sub = msg_Subscribe( p_intf );
if( !Loader->Load( user_skin ) && !Loader->Load( default_skin ) )
{
#endif
-#if 0
-#if !defined(MODULE_NAME_IS_basic_skins)
- wxMutexGuiEnter();
- wxFileDialog dialog( NULL,
- wxU(_("Open a skin file")), wxT(""), wxT(""),
- wxT("Skin files (*.vlt)|*.vlt|Skin files (*.xml)|*.xml|"
- "All files|*.*"), wxOPEN );
-
- if( dialog.ShowModal() == wxID_OK )
- {
- // try to load selected file
- if( ! Loader->Load( (string)dialog.GetPath().mb_str() ) )
- {
- // He, he, what the hell is he doing ?
- delete Loader;
- wxMutexGuiLeave();
- return;
- }
- wxMutexGuiLeave();
- }
- else
-#endif
-#endif
+ p_intf->p_sys->p_dialogs->ShowOpenSkin( 1 /* block */ );
+
+ // try to load selected file
+ if( !p_intf->p_sys->p_new_theme_file ||
+ !Loader->Load( (string)p_intf->p_sys->p_new_theme_file ) )
{
+ // He, he, what the hell is he doing ?
delete Loader;
-#if 0
-#if !defined(MODULE_NAME_IS_basic_skins)
- wxMutexGuiLeave();
-#endif
-#endif
+ delete p_intf->p_sys->p_dialogs;
+ if( skin_last ) free( skin_last );
return;
}
}
p_intf->p_sys->p_theme->InitTheme();
p_intf->p_sys->p_theme->ShowTheme();
+ if( skin_last ) free( skin_last );
delete Loader;
msg_Dbg( p_intf, "Load theme time : %i ms", OSAPI_GetTime() - a );
* vlcproc.cpp: VlcProc class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: vlcproc.cpp,v 1.40 2003/06/24 22:26:01 asmax Exp $
+ * $Id: vlcproc.cpp,v 1.41 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
{
if( p_intf->p_sys->p_new_theme_file == NULL )
{
- p_intf->p_sys->p_dialogs->ShowOpenSkin();
+ p_intf->p_sys->p_dialogs->ShowOpenSkin( 0 /*none blocking*/ );
}
else
{
* dialogs.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: dialogs.cpp,v 1.3 2003/07/18 11:39:39 gbazin Exp $
+ * $Id: dialogs.cpp,v 1.4 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
EVT_COMMAND(INTF_DIALOG_NET, wxEVT_DIALOG, DialogsProvider::OnOpenNet)
EVT_COMMAND(INTF_DIALOG_FILE_SIMPLE, wxEVT_DIALOG,
DialogsProvider::OnOpenFileSimple)
+ EVT_COMMAND(INTF_DIALOG_FILE_GENERIC, wxEVT_DIALOG,
+ DialogsProvider::OnOpenFileGeneric)
EVT_COMMAND(INTF_DIALOG_PLAYLIST, wxEVT_DIALOG,
DialogsProvider::OnPlaylist)
DialogsProvider::OnFileInfo)
EVT_COMMAND(INTF_DIALOG_POPUPMENU, wxEVT_DIALOG,
DialogsProvider::OnPopupMenu)
+ EVT_COMMAND(INTF_DIALOG_EXIT, wxEVT_DIALOG,
+ DialogsProvider::OnExitThread)
END_EVENT_TABLE()
/*****************************************************************************
p_messages_dialog = NULL;
p_fileinfo_dialog = NULL;
p_prefs_dialog = NULL;
+ p_file_generic_dialog = NULL;
/* Give our interface a nice little icon */
p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
if( p_playlist_dialog ) delete p_playlist_dialog;
if( p_messages_dialog ) delete p_messages_dialog;
if( p_fileinfo_dialog ) delete p_fileinfo_dialog;
+ if( p_file_generic_dialog ) delete p_file_generic_dialog;
if( p_intf->p_sys->p_icon ) delete p_intf->p_sys->p_icon;
}
}
}
+void DialogsProvider::OnOpenFileGeneric( wxCommandEvent& event )
+{
+ intf_dialog_args_t *p_arg = (intf_dialog_args_t *)event.GetClientData();
+
+ if( p_arg == NULL )
+ {
+ msg_Dbg( p_intf, "OnOpenFileGeneric() called with NULL arg" );
+ return;
+ }
+
+ if( p_file_generic_dialog == NULL )
+ p_file_generic_dialog = new wxFileDialog( this );
+
+ if( p_file_generic_dialog )
+ {
+ p_file_generic_dialog->SetMessage( wxU(p_arg->psz_title) );
+ p_file_generic_dialog->SetWildcard( wxU(p_arg->psz_extensions) );
+ p_file_generic_dialog->SetStyle( (p_arg->b_save ? wxSAVE : wxOPEN) |
+ (p_arg->b_multiple ? wxMULTIPLE:0) );
+ }
+
+ if( p_file_generic_dialog &&
+ p_file_generic_dialog->ShowModal() == wxID_OK )
+ {
+ wxArrayString paths;
+
+ p_file_generic_dialog->GetPaths( paths );
+
+ p_arg->i_results = paths.GetCount();
+ p_arg->psz_results = (char **)malloc( p_arg->i_results *
+ sizeof(char *) );
+ for( size_t i = 0; i < paths.GetCount(); i++ )
+ {
+ p_arg->psz_results[i] = strdup( paths[i].mb_str() );
+ }
+ }
+
+ /* Callback */
+ if( p_arg->pf_callback )
+ {
+ p_arg->pf_callback( p_arg );
+ }
+
+ /* Blocking or not ? */
+ if( p_arg->b_blocking )
+ {
+ vlc_mutex_lock( &p_arg->lock );
+ p_arg->b_ready = 1;
+ vlc_cond_signal( &p_arg->wait );
+ vlc_mutex_unlock( &p_arg->lock );
+ }
+
+ /* Clean-up */
+ if( p_arg->b_blocking )
+ {
+ vlc_mutex_destroy( &p_arg->lock );
+ vlc_cond_destroy( &p_arg->wait );
+ }
+ if( p_arg->psz_results )
+ {
+ for( int i = 0; i < p_arg->i_results; i++ )
+ {
+ free( p_arg->psz_results[i] );
+ }
+ free( p_arg->psz_results );
+ }
+ if( p_arg->psz_title ) free( p_arg->psz_title );
+ if( p_arg->psz_extensions ) free( p_arg->psz_extensions );
+ free( p_arg );
+}
+
void DialogsProvider::OnOpenFileSimple( wxCommandEvent& event )
{
playlist_t *p_playlist =
::PopupMenu( p_intf, this, mousepos );
}
+
+void DialogsProvider::OnExitThread( wxCommandEvent& WXUNUSED(event) )
+{
+ delete this;
+ wxTheApp->ExitMainLoop();
+}
* interface.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: interface.cpp,v 1.49 2003/07/19 16:33:55 gbazin Exp $
+ * $Id: interface.cpp,v 1.50 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
Interface::~Interface()
{
+ if( p_intf->p_sys->p_wxwindow )
+ {
+ delete p_intf->p_sys->p_wxwindow;
+ }
/* Clean up */
}
}
if( p_intf->p_sys->pf_show_dialog )
- p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0 );
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0, 0 );
}
#endif
void Interface::OnContextMenu(wxMouseEvent& event)
{
if( p_intf->p_sys->pf_show_dialog )
- p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0 );
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0, 0 );
}
void Interface::OnExit( wxCommandEvent& WXUNUSED(event) )
}
- p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1 );
+ p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
}
}
* menus.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: menus.cpp,v 1.16 2003/07/17 17:30:40 gbazin Exp $
+ * $Id: menus.cpp,v 1.17 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
}
- p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1 );
+ p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
}
}
}
- p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1 );
+ p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
}
}
* playlist.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: messages.cpp,v 1.12 2003/07/12 13:33:10 gbazin Exp $
+ * $Id: messages.cpp,v 1.13 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
*
/* Create the Verbose checkbox */
wxCheckBox *verbose_checkbox =
new wxCheckBox( messages_panel, Verbose_Event, wxU(_("Verbose")) );
- b_verbose = p_intf->p_libvlc->i_verbose > 0;
+ b_verbose = p_intf->p_libvlc->i_verbose > 2;
verbose_checkbox->SetValue( b_verbose );
/* Place everything in sizers */
* playlist.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: playlist.cpp,v 1.13 2003/07/17 17:30:40 gbazin Exp $
+ * $Id: playlist.cpp,v 1.14 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
*
void Playlist::OnAddFile( wxCommandEvent& WXUNUSED(event) )
{
- p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE_SIMPLE, 0 );
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE_SIMPLE, 0, 0 );
#if 0
Rebuild();
void Playlist::OnAddMRL( wxCommandEvent& WXUNUSED(event) )
{
- p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE, 0 );
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE, 0, 0 );
#if 0
Rebuild();
* timer.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: timer.cpp,v 1.28 2003/07/18 11:39:39 gbazin Exp $
+ * $Id: timer.cpp,v 1.29 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
intf_thread_t *p_intf = (intf_thread_t *)param;
if( p_intf->p_sys->pf_show_dialog )
- p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0 );
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0, 0 );
return VLC_SUCCESS;
}
* wxwindows.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: wxwindows.cpp,v 1.22 2003/07/19 16:33:55 gbazin Exp $
+ * $Id: wxwindows.cpp,v 1.23 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
static void Run ( intf_thread_t * );
static void Init ( intf_thread_t * );
-static void ShowDialog ( intf_thread_t *, int, int );
+static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * );
/*****************************************************************************
* Local classes declarations.
msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub );
+ 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 );
+ }
+
/* Destroy structure */
free( p_intf->p_sys );
}
return TRUE;
}
-static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg )
+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 );
/* Hack to prevent popup events to be enqueued when
* one is already active */
* wxwindows.h: private wxWindows interface description
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: wxwindows.h,v 1.46 2003/07/19 16:33:55 gbazin Exp $
+ * $Id: wxwindows.h,v 1.47 2003/07/20 10:38:49 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
#if wxUSE_UNICODE
# define wxU(utf8) wxString(utf8, wxConvUTF8)
#else
-# define wxU(ut8 ) wxString(wxConvUTF8.cMB2WC(ut8), *wxConvCurrent)
+# define wxU(utf8) wxString(wxConvUTF8.cMB2WC(utf8), *wxConvCurrent)
#endif
#else // ENABLE_NLS && HAVE_GETTEXT && WIN32 && !HAVE_INCLUDED_GETTEXT
int i_playing; /* playlist selected item */
/* Send an event to show a dialog */
- void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg );
+ void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
+ intf_dialog_args_t *p_arg );
/* Popup menu */
wxMenu *p_popup_menu;
void OnFileInfo( wxCommandEvent& event );
void OnPreferences( wxCommandEvent& event );
+ void OnOpenFileGeneric( wxCommandEvent& event );
void OnOpenFileSimple( wxCommandEvent& event );
void OnOpenFile( wxCommandEvent& event );
void OnOpenDisc( wxCommandEvent& event );
void OnIdle( wxIdleEvent& event );
+ void OnExitThread( wxCommandEvent& event );
+
DECLARE_EVENT_TABLE();
intf_thread_t *p_intf;
Messages *p_messages_dialog;
FileInfo *p_fileinfo_dialog;
wxFrame *p_prefs_dialog;
+ wxFileDialog *p_file_generic_dialog;
};
/* Open Dialog */