]> git.sesse.net Git - vlc/blobdiff - modules/gui/skins/win32/win32_run.cpp
* ./configure.ac.in:
[vlc] / modules / gui / skins / win32 / win32_run.cpp
index ff555ae27288726006e74312aca480f176b212d6..e1baf55b19cf75a1593b653570495f060570be7a 100644 (file)
@@ -2,7 +2,7 @@
  * win32_run.cpp:
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: win32_run.cpp,v 1.10 2003/04/28 00:18:27 ipkiss Exp $
+ * $Id: win32_run.cpp,v 1.13 2003/04/30 19:22:27 ipkiss Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -26,7 +26,9 @@
 #ifdef WIN32
 
 //--- GENERAL ---------------------------------------------------------------
+#ifndef BASIC_SKINS
 #include <wx/wx.h>
+#endif
 #include <windows.h>
 
 //--- VLC -------------------------------------------------------------------
 #include "../os_theme.h"
 #include "../src/skin_common.h"
 #include "../src/vlcproc.h"
-#include "../src/wxdialogs.h"
 
-// include the icon graphic
-#include "share/vlc32x32.xpm"
+#ifndef BASIC_SKINS
+#include "../src/wxdialogs.h"
+#include "share/vlc32x32.xpm"       // include the graphic icon
+#endif
 
 //---------------------------------------------------------------------------
 // Specific method
@@ -55,6 +58,7 @@ bool IsVLCEvent( unsigned int msg );
 int  SkinManage( intf_thread_t *p_intf );
 
 
+#ifndef BASIC_SKINS
 //---------------------------------------------------------------------------
 // Local classes declarations.
 //---------------------------------------------------------------------------
@@ -65,12 +69,24 @@ public:
     Instance( intf_thread_t *_p_intf );
 
     bool OnInit();
+    int  OnExit();
     OpenDialog *open;
 
 private:
     intf_thread_t *p_intf;
 };
 
+class ExitTimer: public wxTimer
+{
+public:
+    ExitTimer( intf_thread_t *_p_intf );
+
+    void Notify();
+
+private:
+    intf_thread_t *p_intf;
+};
+
 
 //---------------------------------------------------------------------------
 // Implementation of Instance class
@@ -90,12 +106,20 @@ IMPLEMENT_APP_NO_MAIN(Instance)
 bool Instance::OnInit()
 {
     p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
+
+    // Create all the dialog boxes
     p_intf->p_sys->OpenDlg = new OpenDialog( p_intf, NULL, FILE_ACCESS );
     p_intf->p_sys->MessagesDlg = new Messages( p_intf, NULL );
     p_intf->p_sys->SoutDlg = new SoutDialog( p_intf, NULL );
     p_intf->p_sys->PrefsDlg = new PrefsDialog( p_intf, NULL );
     p_intf->p_sys->InfoDlg = new FileInfo( p_intf, NULL );
 
+    // Start a timer checking if we must exit the main loop
+    p_intf->p_sys->b_wx_die = 0;
+    p_intf->p_sys->p_kludgy_timer = new ExitTimer( p_intf );
+    p_intf->p_sys->p_kludgy_timer->Start( 100 );
+
+    // OK, initialization is over, now the other thread can go on working...
     vlc_mutex_lock( &p_intf->p_sys->init_lock );
     vlc_cond_signal( &p_intf->p_sys->init_cond );
     vlc_mutex_unlock( &p_intf->p_sys->init_lock );
@@ -103,6 +127,37 @@ bool Instance::OnInit()
     return TRUE;
 }
 
+int Instance::OnExit()
+{
+    // Delete evertything
+    delete p_intf->p_sys->p_kludgy_timer;
+    delete p_intf->p_sys->InfoDlg;
+    delete p_intf->p_sys->PrefsDlg;
+    delete p_intf->p_sys->SoutDlg;
+    delete p_intf->p_sys->MessagesDlg;
+    delete p_intf->p_sys->OpenDlg;
+    delete p_intf->p_sys->p_icon;
+
+    return 0;
+}
+
+
+//---------------------------------------------------------------------------
+// Implementation of ExitTimer class
+// This timer is only there to call wxApp::ExitMainLoop() from the wxWindows
+// thread (otherwise we never exit from the wxEntry call).
+//---------------------------------------------------------------------------
+ExitTimer::ExitTimer( intf_thread_t *_p_intf ) : wxTimer()
+{
+    p_intf = _p_intf;
+}
+
+void ExitTimer::Notify()
+{
+    if( p_intf->p_sys->b_wx_die )
+        wxTheApp->ExitMainLoop();
+}
+
 
 //---------------------------------------------------------------------------
 #if !defined(__BUILTIN__) && defined( WIN32 )
@@ -139,6 +194,7 @@ void SkinsDialogsThread( intf_thread_t *p_intf )
     return;
 }
 
+#endif // WX_SKINS
 
 //---------------------------------------------------------------------------
 // Refresh Timer Callback
@@ -164,16 +220,19 @@ void OSRun( intf_thread_t *p_intf )
     Event *ProcessEvent;
     int KeyModifier = 0;
 
+#ifndef BASIC_SKINS
     // Create a new thread for wxWindows
     if( vlc_thread_create( p_intf, "Skins Dialogs Thread", SkinsDialogsThread,
-                           0, 0 ) )                                                 {
+                           0, 0 ) )
+    {
         msg_Err( p_intf, "cannot create SkinsDialogsThread" );
         // Don't even enter the main loop
         return;
     }
-//    vlc_mutex_lock( &p_intf->p_sys->init_lock );
-//    vlc_cond_wait( &p_intf->p_sys->init_cond, &p_intf->p_sys->init_lock );
-//    vlc_mutex_unlock( &p_intf->p_sys->init_lock );
+    vlc_mutex_lock( &p_intf->p_sys->init_lock );
+    vlc_cond_wait( &p_intf->p_sys->init_cond, &p_intf->p_sys->init_lock );
+    vlc_mutex_unlock( &p_intf->p_sys->init_lock );
+#endif
 
      // Create refresh timer
     SetTimer( ((OSTheme *)p_intf->p_sys->p_theme)->GetParentWindow(), 42, 200,
@@ -287,6 +346,11 @@ void OSRun( intf_thread_t *p_intf )
         // Check if vlc is closing
         Proc->IsClosing();
     }
+
+#ifndef BASIC_SKINS
+    // Tell wxWindows it's time to exit
+    p_intf->p_sys->b_wx_die = 1;
+#endif
 }
 //---------------------------------------------------------------------------
 bool IsVLCEvent( unsigned int msg )