* modules/gui/wxwindows/*, include/vlc_interface.h: new generic "open file" dialog.
authorGildas Bazin <gbazin@videolan.org>
Sun, 20 Jul 2003 10:38:49 +0000 (10:38 +0000)
committerGildas Bazin <gbazin@videolan.org>
Sun, 20 Jul 2003 10:38:49 +0000 (10:38 +0000)
* modules/gui/skins/*: use the new generic "open file" dialog to load skins.

14 files changed:
include/vlc_interface.h
modules/gui/skins/src/dialogs.cpp
modules/gui/skins/src/dialogs.h
modules/gui/skins/src/skin_common.h
modules/gui/skins/src/skin_main.cpp
modules/gui/skins/src/vlcproc.cpp
modules/gui/wxwindows/dialogs.cpp
modules/gui/wxwindows/interface.cpp
modules/gui/wxwindows/menus.cpp
modules/gui/wxwindows/messages.cpp
modules/gui/wxwindows/playlist.cpp
modules/gui/wxwindows/timer.cpp
modules/gui/wxwindows/wxwindows.cpp
modules/gui/wxwindows/wxwindows.h

index af4cd87..9b7c256 100644 (file)
@@ -4,7 +4,7 @@
  * 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>
  *
@@ -23,6 +23,8 @@
  * 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
  *****************************************************************************
@@ -45,7 +47,8 @@ struct intf_thread_t
     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;
@@ -53,6 +56,33 @@ struct intf_thread_t
     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
  *****************************************************************************/
@@ -93,3 +123,7 @@ VLC_EXPORT( void,              intf_Destroy,    ( intf_thread_t * ) );
 #define INTF_DIALOG_PREFS      13
 
 #define INTF_DIALOG_POPUPMENU  20
+
+#define INTF_DIALOG_FILE_GENERIC 30
+
+#define INTF_DIALOG_EXIT       99
index cd23ca5..1fa74ce 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -96,45 +96,87 @@ Dialogs::~Dialogs()
     }
 }
 
-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 );
 }
 
 /*****************************************************************************
index 9909107..b13611f 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -45,9 +45,8 @@ class Dialogs
         // 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();
index 906b747..771ef2d 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
@@ -75,9 +75,6 @@ struct intf_sys_t
     // 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)
index 142ecea..0ed57c2 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
@@ -87,8 +87,6 @@ static int Open ( vlc_object_t *p_this )
     };
 
     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 );
@@ -269,36 +267,16 @@ static void Run( intf_thread_t *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;
             }
         }
@@ -308,6 +286,7 @@ static void Run( intf_thread_t *p_intf )
     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 );
index 0daa1de..d06d743 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
@@ -370,7 +370,7 @@ void VlcProc::LoadSkin()
 {
     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
     {
index 4148629..1d01a63 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -63,6 +63,8 @@ BEGIN_EVENT_TABLE(DialogsProvider, wxFrame)
     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)
@@ -74,6 +76,8 @@ BEGIN_EVENT_TABLE(DialogsProvider, wxFrame)
                 DialogsProvider::OnFileInfo)
     EVT_COMMAND(INTF_DIALOG_POPUPMENU, wxEVT_DIALOG,
                 DialogsProvider::OnPopupMenu)
+    EVT_COMMAND(INTF_DIALOG_EXIT, wxEVT_DIALOG,
+                DialogsProvider::OnExitThread)
 END_EVENT_TABLE()
 
 /*****************************************************************************
@@ -90,6 +94,7 @@ DialogsProvider::DialogsProvider( intf_thread_t *_p_intf, wxWindow *p_parent )
     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 );
@@ -110,6 +115,7 @@ DialogsProvider::~DialogsProvider()
     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;
 }
@@ -177,6 +183,77 @@ void DialogsProvider::OnPreferences( wxCommandEvent& WXUNUSED(event) )
     }
 }
 
+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 =
@@ -248,3 +325,9 @@ void DialogsProvider::OnPopupMenu( wxCommandEvent& event )
     ::PopupMenu( p_intf, this, mousepos );
 
 }
+
+void DialogsProvider::OnExitThread( wxCommandEvent& WXUNUSED(event) )
+{
+    delete this;
+    wxTheApp->ExitMainLoop();
+}
index aaec87f..196ed19 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -239,6 +239,10 @@ Interface::Interface( intf_thread_t *_p_intf ):
 
 Interface::~Interface()
 {
+    if( p_intf->p_sys->p_wxwindow )
+    {
+        delete p_intf->p_sys->p_wxwindow;
+    }
     /* Clean up */
 }
 
@@ -547,13 +551,13 @@ void Interface::OnContextMenu2(wxContextMenuEvent& 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 );
 }
 #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) )
@@ -619,7 +623,7 @@ void Interface::OnShowDialog( wxCommandEvent& 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 );
     }
 }
 
index 4eab755..d306ca0 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -585,7 +585,7 @@ void Menu::OnShowDialog( wxCommandEvent& 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 );
     }
 }
 
@@ -630,7 +630,7 @@ void MenuEvtHandler::OnShowDialog( wxCommandEvent& 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 );
     }
 }
 
index f9b5b9d..8be8123 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -119,7 +119,7 @@ Messages::Messages( intf_thread_t *_p_intf, wxWindow *p_parent ):
     /* 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 */
index 64d421e..7364aa0 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -363,7 +363,7 @@ void Playlist::OnOpen( wxCommandEvent& WXUNUSED(event) )
 
 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();
@@ -372,7 +372,7 @@ void Playlist::OnAddFile( wxCommandEvent& WXUNUSED(event) )
 
 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();
index 0cb9857..1e5196a 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -284,7 +284,7 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
     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;
 }
index 51d4ec1..20e0259 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -66,7 +66,7 @@ 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 );
+static void ShowDialog   ( intf_thread_t *, int, int, intf_dialog_args_t * );
 
 /*****************************************************************************
  * Local classes declarations.
@@ -164,6 +164,14 @@ static void Close( vlc_object_t *p_this )
 
     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 );
 }
@@ -286,10 +294,12 @@ bool Instance::OnInit()
     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 */
index e8fc4d7..3d14724 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -53,7 +53,7 @@ class FileInfo;
 #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
@@ -93,7 +93,8 @@ struct intf_sys_t
     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;
@@ -207,6 +208,7 @@ private:
     void OnFileInfo( wxCommandEvent& event );
     void OnPreferences( wxCommandEvent& event );
 
+    void OnOpenFileGeneric( wxCommandEvent& event );
     void OnOpenFileSimple( wxCommandEvent& event );
     void OnOpenFile( wxCommandEvent& event );
     void OnOpenDisc( wxCommandEvent& event );
@@ -217,6 +219,8 @@ private:
 
     void OnIdle( wxIdleEvent& event );
 
+    void OnExitThread( wxCommandEvent& event );
+
     DECLARE_EVENT_TABLE();
 
     intf_thread_t *p_intf;
@@ -229,6 +233,7 @@ public:
     Messages            *p_messages_dialog;
     FileInfo            *p_fileinfo_dialog;
     wxFrame             *p_prefs_dialog;
+    wxFileDialog        *p_file_generic_dialog;
 };
 
 /* Open Dialog */