]> git.sesse.net Git - vlc/blobdiff - modules/gui/beos/InterfaceWindow.cpp
beos/*: update the playlist properly
[vlc] / modules / gui / beos / InterfaceWindow.cpp
index d325a070d20b81b97e5b012564bd988984711f4a..3460a889056618b3e1d95cdc0a67124f0e36eb1e 100644 (file)
@@ -174,6 +174,14 @@ collect_folder_contents( BDirectory& dir, BList& list, bool& deep, bool& asked,
     }
 }
 
+static int PlaylistChanged( vlc_object_t *p_this, const char * psz_variable,
+                            vlc_value_t old_val, vlc_value_t new_val,
+                            void * param )
+{
+    InterfaceWindow * w = (InterfaceWindow *) param;
+    w->UpdatePlaylist();
+    return VLC_SUCCESS;
+}
 
 /*****************************************************************************
  * InterfaceWindow
@@ -193,6 +201,15 @@ InterfaceWindow::InterfaceWindow( intf_thread_t * _p_intf, BRect frame,
       fLastUpdateTime( system_time() ),
       fSettings( new BMessage( 'sett' ) )
 {
+    p_playlist = (playlist_t *)
+        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+
+    var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this );
+    var_AddCallback( p_playlist, "item-change", PlaylistChanged, this );
+    var_AddCallback( p_playlist, "item-append", PlaylistChanged, this );
+    var_AddCallback( p_playlist, "item-deleted", PlaylistChanged, this );
+    var_AddCallback( p_playlist, "playlist-current", PlaylistChanged, this );
+
     char psz_tmp[1024];
 #define ADD_ELLIPSIS( a ) \
     memset( psz_tmp, 0, 1024 ); \
@@ -416,7 +433,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                     playlist_Add( p_playlist, psz_uri, psz_device,
                                   PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
                 }
-                _UpdatePlaylist();
+                UpdatePlaylist();
             }
             break;
 
@@ -731,7 +748,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                 }
             }
 
-            _UpdatePlaylist();
+            UpdatePlaylist();
             break;
         }
 
@@ -792,12 +809,6 @@ bool InterfaceWindow::QuitRequested()
  *****************************************************************************/
 void InterfaceWindow::UpdateInterface()
 {
-    /* Manage the input part */
-    if( !p_playlist )
-    {
-        p_playlist = (playlist_t *)
-            vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-    }
     if( !p_input )
     {
         p_input = (input_thread_t *)
@@ -815,6 +826,17 @@ void InterfaceWindow::UpdateInterface()
         return;
     }
 
+    if( b_playlist_update )
+    {
+        if( fPlaylistWindow->Lock() )
+        {
+            fPlaylistWindow->UpdatePlaylist( true );
+            fPlaylistWindow->Unlock();
+            b_playlist_update = false;
+        }
+        p_mediaControl->SetEnabled( p_playlist->i_size );
+    }
+
     if( p_input )
     {
         vlc_value_t val;
@@ -840,13 +862,6 @@ void InterfaceWindow::UpdateInterface()
         aout_VolumeGet( p_intf, &i_volume );
         p_mediaControl->SetAudioEnabled( true );
         p_mediaControl->SetMuted( i_volume );
-
-        // update playlist as well
-        if( fPlaylistWindow->LockWithTimeout( INTERFACE_LOCKING_TIMEOUT ) == B_OK )
-        {
-            fPlaylistWindow->UpdatePlaylist();
-            fPlaylistWindow->Unlock();
-        }
     }
     else
     {
@@ -877,26 +892,21 @@ void InterfaceWindow::UpdateInterface()
 }
 
 /*****************************************************************************
- * InterfaceWindow::IsStopped
+ * InterfaceWindow::UpdatePlaylist
  *****************************************************************************/
-bool
-InterfaceWindow::IsStopped() const
+void
+InterfaceWindow::UpdatePlaylist()
 {
-    return (system_time() - fLastUpdateTime > INTERFACE_UPDATE_TIMEOUT);
+    b_playlist_update = true;
 }
 
 /*****************************************************************************
- * InterfaceWindow::_UpdatePlaylist
+ * InterfaceWindow::IsStopped
  *****************************************************************************/
-void
-InterfaceWindow::_UpdatePlaylist()
+bool
+InterfaceWindow::IsStopped() const
 {
-    if( fPlaylistWindow->Lock() )
-    {
-        fPlaylistWindow->UpdatePlaylist( true );
-        fPlaylistWindow->Unlock();
-    }
-    p_mediaControl->SetEnabled( p_playlist->i_size );
+    return (system_time() - fLastUpdateTime > INTERFACE_UPDATE_TIMEOUT);
 }
 
 /*****************************************************************************