[vlc-commits] playlist: fix root node tracking

Rémi Denis-Courmont git at videolan.org
Sat Nov 19 22:26:38 CET 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Nov 19 23:14:33 2016 +0200| [9411fa2d0b9b0f67f5f2c20b212a6e8cd12f992f] | committer: Rémi Denis-Courmont

playlist: fix root node tracking

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9411fa2d0b9b0f67f5f2c20b212a6e8cd12f992f
---

 modules/gui/ncurses.c | 43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/modules/gui/ncurses.c b/modules/gui/ncurses.c
index aafdc8b..dd45ee8 100644
--- a/modules/gui/ncurses.c
+++ b/modules/gui/ncurses.c
@@ -223,8 +223,7 @@ struct intf_sys_t
     int             plist_entries;
     bool            need_update;
     bool            plidx_follow;
-    playlist_item_t *node;        /* current node */
-
+    input_item_t    *node;        /* current node */
 };
 
 /*****************************************************************************
@@ -439,14 +438,18 @@ static int ItemChanged(vlc_object_t *p_this, const char *variable,
 static int PlaylistChanged(vlc_object_t *p_this, const char *variable,
                             vlc_value_t oval, vlc_value_t nval, void *param)
 {
-    VLC_UNUSED(p_this); VLC_UNUSED(variable);
+    playlist_t *playlist = (playlist_t *)p_this;
+    intf_sys_t *sys = param;
+    playlist_item_t *node = playlist_CurrentPlayingItem(playlist);
+
+    VLC_UNUSED(variable);
     VLC_UNUSED(oval); VLC_UNUSED(nval);
-    intf_thread_t *intf   = (intf_thread_t *)param;
-    intf_sys_t *sys       = intf->p_sys;
-    playlist_item_t *node = playlist_CurrentPlayingItem(pl_Get(intf));
 
     sys->need_update = true;
-    sys->node = node ? node->p_parent : NULL;
+
+    if (sys->node != NULL)
+        input_item_Release(sys->node);
+    sys->node = (node != NULL) ? input_item_Hold(node->p_input) : NULL;
 
     return VLC_SUCCESS;
 }
@@ -484,14 +487,14 @@ static void SearchPlaylist(intf_sys_t *sys)
 
 static inline bool IsIndex(intf_sys_t *sys, playlist_t *p_playlist, int i)
 {
+    PL_ASSERT_LOCKED;
+
     input_item_t *input = sys->plist[i]->item;
     playlist_item_t *item = playlist_ItemGetByInput(p_playlist, input);
     if (unlikely(item == NULL))
         return false;
 
-    PL_ASSERT_LOCKED;
-
-    if (item->i_children == 0 && item == sys->node)
+    if (item->i_children == 0 && input == sys->node)
         return true;
 
     playlist_item_t *p_played_item = playlist_CurrentPlayingItem(p_playlist);
@@ -977,12 +980,10 @@ static int DrawPlaylist(intf_thread_t *intf, input_thread_t *input)
         input_item_t *input = sys->plist[i]->item;
 
         PL_LOCK;
-        playlist_item_t *node = sys->node;
-
         current = playlist_CurrentPlayingItem(p_playlist);
 
-        if ((node && input == node->p_input) ||
-            (!node && current != NULL && input == current->p_input))
+        if ((sys->node != NULL && input == sys->node) ||
+            (sys->node == NULL && current != NULL && input == current->p_input))
             c = '*';
         else if (current != NULL && current->p_input == input)
             c = '>';
@@ -1395,7 +1396,10 @@ static bool HandlePlaylistKey(intf_thread_t *intf, int key)
                 while (parent->p_parent != NULL)
                     parent = parent->p_parent;
             } else {
-                sys->node = parent;
+                if (sys->node != NULL)
+                    input_item_Release(sys->node);
+                sys->node = parent->p_input ? input_item_Hold(parent->p_input)
+                                            : NULL;
                 item = NULL;
             }
 
@@ -1403,7 +1407,10 @@ static bool HandlePlaylistKey(intf_thread_t *intf, int key)
                              parent, item);
         } else {   /* We only want to set the current node */
             playlist_Control(p_playlist, PLAYLIST_STOP, true);
-            sys->node = item;
+            if (sys->node != NULL)
+                input_item_Release(sys->node);
+            sys->node = p_pl_item->item ? input_item_Hold(p_pl_item->item)
+                                        : NULL;
         }
         playlist_Unlock(p_playlist);
 
@@ -1826,7 +1833,7 @@ static int Open(vlc_object_t *p_this)
     PL_UNLOCK;
 
     var_AddCallback(p_playlist, "item-change", ItemChanged, sys);
-    var_AddCallback(p_playlist, "playlist-item-append", PlaylistChanged, intf);
+    var_AddCallback(p_playlist, "playlist-item-append", PlaylistChanged, sys);
 
     if (vlc_clone(&sys->thread, Run, intf, VLC_THREAD_PRIORITY_LOW))
         abort(); /* TODO */
@@ -1846,7 +1853,7 @@ static void Close(vlc_object_t *p_this)
     vlc_cancel(sys->thread);
     vlc_join(sys->thread, NULL);
 
-    var_DelCallback(playlist, "playlist-item-append", PlaylistChanged, intf);
+    var_DelCallback(playlist, "playlist-item-append", PlaylistChanged, sys);
     var_DelCallback(playlist, "item-change", ItemChanged, sys);
 
     PlaylistDestroy(sys);



More information about the vlc-commits mailing list