]> git.sesse.net Git - vlc/blobdiff - src/misc/win32_specific.c
Sql Core
[vlc] / src / misc / win32_specific.c
index 9e27ca9a18322178178f4be363a1e93da63803c2..ea294eda89771442fd201e6269a17e56c24f5473 100644 (file)
@@ -47,6 +47,7 @@
  *****************************************************************************/
 void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
 {
+    VLC_UNUSED( p_this ); VLC_UNUSED( pi_argc ); VLC_UNUSED( ppsz_argv );
     WSADATA Data;
 
     /* Get our full path */
@@ -76,7 +77,7 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
     }
 #endif
 
-    vlc_global()->psz_vlcpath = strdup( psz_path );
+    psz_vlcpath = strdup( psz_path );
 
     /* Set the default file-translation mode */
 #if !defined( UNDER_CE )
@@ -124,12 +125,13 @@ static unsigned __stdcall IPCHelperThread( void * );
 LRESULT CALLBACK WMCOPYWNDPROC( HWND, UINT, WPARAM, LPARAM );
 static vlc_object_t *p_helper = NULL;
 static unsigned long hIPCHelper;
+static HANDLE hIPCHelperReady;
 
 typedef struct
 {
   int argc;
   int enqueue;
-  char data[0];
+  char data[];
 } vlc_ipc_data_t;
 
 void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
@@ -177,22 +179,22 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
             p_helper =
                 vlc_custom_create( p_this, sizeof(vlc_object_t),
                                    VLC_OBJECT_GENERIC, typename );
-            vlc_object_lock( p_helper );
 
             /* Run the helper thread */
+            hIPCHelperReady = CreateEvent( NULL, FALSE, FALSE, NULL );
             hIPCHelper = _beginthreadex( NULL, 0, IPCHelperThread, p_helper,
                                          0, NULL );
             if( hIPCHelper )
-                vlc_object_wait( p_helper );
-            vlc_object_unlock( p_helper );
-
-            if( !hIPCHelper )
+                WaitForSingleObject( hIPCHelperReady, INFINITE );
+            else
             {
                 msg_Err( p_this, "one instance mode DISABLED "
                          "(IPC helper thread couldn't be created)" );
                 vlc_object_release (p_helper);
                 p_helper = NULL;
             }
+            vlc_object_attach (p_helper, p_this);
+            CloseHandle( hIPCHelperReady );
 
             /* Initialization done.
              * Release the mutex to unblock other instances */
@@ -291,7 +293,7 @@ static unsigned __stdcall IPCHelperThread( void *data )
     SetWindowLongPtr( ipcwindow, GWLP_USERDATA, (LONG_PTR)p_this );
 
     /* Signal the creation of the thread and events queue */
-    vlc_object_signal( p_this );
+    SetEvent( hIPCHelperReady );
 
     while( GetMessage( &message, NULL, 0, 0 ) )
     {
@@ -316,7 +318,7 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
         if( !p_this ) return 0;
 
         /* Add files to the playlist */
-        p_playlist = pl_Yield( p_this );
+        p_playlist = pl_Hold( p_this );
         if( !p_playlist ) return 0;
 
         if( pwm_data->lpData )
@@ -347,8 +349,10 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
                   NULL, PLAYLIST_APPEND |
                         ( ( i_opt || p_data->enqueue ) ? 0 : PLAYLIST_GO ),
                   PLAYLIST_END, -1,
+                  i_options,
                   (char const **)( i_options ? &ppsz_argv[i_opt+1] : NULL ),
-                  i_options, true, pl_Unlocked );
+                  VLC_INPUT_OPTION_TRUSTED,
+                  true, pl_Unlocked );
 
                 i_opt += i_options;
             }
@@ -367,14 +371,22 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
  *****************************************************************************/
 void system_End( libvlc_int_t *p_this )
 {
-    if( p_this && vlc_global() )
+    HWND ipcwindow;
+    if( p_this )
+    {
+        free( psz_vlcpath );
+        psz_vlcpath = NULL;
+    }
+
+    if( ( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) != 0 )
     {
-        free( vlc_global()->psz_vlcpath );
-        vlc_global()->psz_vlcpath = NULL;
+        SendMessage( ipcwindow, WM_QUIT, 0, 0 );
     }
+
     if (p_helper && p_helper->p_parent == VLC_OBJECT(p_this) )
     {
-        /* FIXME: thread-safety + join the thread(?)... */
+        /* FIXME: thread-safety... */
+        vlc_object_detach (p_helper);
         vlc_object_release (p_helper);
         p_helper = NULL;
     }