[vlc-commits] ncurses: only append to PL or ML

Rémi Denis-Courmont git at videolan.org
Sat Nov 19 16:16:32 CET 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Nov 19 17:09:15 2016 +0200| [df6c654ef47740027edc37001964ebd4c6618c3f] | committer: Rémi Denis-Courmont

ncurses: only append to PL or ML

User interfaces should only add new items under the playlist or the
media library nodes. In particular, they have no business adding or
removing SD items.

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

 modules/gui/ncurses.c | 85 +++++++++++++++++++++------------------------------
 1 file changed, 34 insertions(+), 51 deletions(-)

diff --git a/modules/gui/ncurses.c b/modules/gui/ncurses.c
index e523cc0..e6ec6a1 100644
--- a/modules/gui/ncurses.c
+++ b/modules/gui/ncurses.c
@@ -1293,6 +1293,38 @@ static void PlayPause(intf_thread_t *intf, input_thread_t *p_input)
         playlist_Play(pl_Get(intf));
 }
 
+static void AddItem(intf_thread_t *intf, const char *path)
+{
+    char *uri = vlc_path2uri(path, NULL);
+    if (uri == NULL)
+        return;
+
+    input_item_t *item = input_item_New(uri, NULL);
+    free(uri);
+    if (unlikely(item == NULL))
+        return;
+
+    playlist_t *playlist = pl_Get(intf);
+    playlist_item_t *node;
+
+    playlist_Lock(playlist);
+    node = playlist_CurrentPlayingItem(playlist);
+
+    while (node != NULL) {
+        if (node == playlist->p_playing || node == playlist->p_media_library)
+            break;
+        node = node->p_parent;
+    }
+
+    if (node == NULL)
+        node = playlist->p_playing;
+
+    playlist_NodeAddInput(playlist, item, node, 0, PLAYLIST_END);
+    playlist_Unlock(playlist);
+
+    input_item_Release(item);
+}
+
 static inline void BoxSwitch(intf_sys_t *sys, int box)
 {
     sys->box_type = (sys->box_type == box) ? BOX_NONE : box;
@@ -1421,34 +1453,9 @@ static bool HandleBrowseKey(intf_thread_t *intf, int key)
             return true;
         }
 
-        char *uri = vlc_path2uri(path, "file");
+        AddItem(intf, path);
         free(path);
-        if (uri == NULL)
-            return true;
-
-        playlist_t *p_playlist = pl_Get(intf);
-        vlc_mutex_lock(&sys->pl_lock);
-        playlist_item_t *p_parent = sys->node;
-        vlc_mutex_unlock(&sys->pl_lock);
-        if (!p_parent) {
-            playlist_item_t *item;
-            PL_LOCK;
-            item = playlist_CurrentPlayingItem(p_playlist);
-            p_parent = item ? item->p_parent : NULL;
-            PL_UNLOCK;
-            if (!p_parent)
-                p_parent = p_playlist->p_playing;
-        }
-
-        while (p_parent->p_parent && p_parent->p_parent->p_parent)
-            p_parent = p_parent->p_parent;
-
-        input_item_t *p_input = p_playlist->p_playing->p_input;
-        playlist_Add(p_playlist, uri, NULL, 0,
-                     p_parent->p_input == p_input);
-
         BoxSwitch(sys, BOX_PLAYLIST);
-        free(uri);
         return true;
     }
 
@@ -1458,33 +1465,9 @@ static bool HandleBrowseKey(intf_thread_t *intf, int key)
 static void OpenSelection(intf_thread_t *intf)
 {
     intf_sys_t *sys = intf->p_sys;
-    char *uri = vlc_path2uri(sys->open_chain, NULL);
-    if (uri == NULL)
-        return;
-
-    playlist_t *p_playlist = pl_Get(intf);
-    vlc_mutex_lock(&sys->pl_lock);
-    playlist_item_t *p_parent = sys->node;
-    vlc_mutex_unlock(&sys->pl_lock);
-
-    PL_LOCK;
-    if (!p_parent) {
-        playlist_item_t *current;
-        current= playlist_CurrentPlayingItem(p_playlist);
-        p_parent = current ? current->p_parent : NULL;
-        if (!p_parent)
-            p_parent = p_playlist->p_playing;
-    }
-
-    while (p_parent->p_parent && p_parent->p_parent->p_parent)
-        p_parent = p_parent->p_parent;
-    PL_UNLOCK;
-
-    playlist_Add(p_playlist, uri, NULL, PLAYLIST_GO,
-                 p_parent->p_input == p_playlist->p_playing->p_input);
 
+    AddItem(intf, sys->open_chain);
     sys->plidx_follow = true;
-    free(uri);
 }
 
 static void HandleEditBoxKey(intf_thread_t *intf, int key, int box)



More information about the vlc-commits mailing list