]> git.sesse.net Git - vlc/blobdiff - modules/gui/ncurses.c
vlc_plugin: fix non-LGPL plugins meta infos
[vlc] / modules / gui / ncurses.c
index f5a742bd25f1944f8f7b53a92c0f834363085350..6de779b5f4690878ddd3e3beba837a14df7cd5de 100644 (file)
@@ -42,6 +42,7 @@
 #include <math.h>
 #include <errno.h>
 
+#define VLC_MODULE_LICENSE VLC_LICENSE_GPL_2_PLUS
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 
@@ -287,23 +288,20 @@ static void ReadDir(intf_thread_t *intf)
 
     DirsDestroy(sys);
 
-    char *entry;
+    const char *entry;
     while ((entry = vlc_readdir(current_dir))) {
         if (!sys->show_hidden_files && *entry == '.' && strcmp(entry, ".."))
-            goto next;
+            continue;
 
         struct dir_entry_t *dir_entry = malloc(sizeof *dir_entry);
-        if (!dir_entry)
-            goto next;
+        if (unlikely(dir_entry == NULL))
+            continue;
 
         dir_entry->file = IsFile(sys->current_dir, entry);
-        dir_entry->path = entry;
+        dir_entry->path = xstrdup(entry);
         INSERT_ELEM(sys->dir_entries, sys->n_dir_entries,
              sys->n_dir_entries, dir_entry);
         continue;
-
-next:
-        free(entry);
     }
 
     qsort(sys->dir_entries, sys->n_dir_entries,
@@ -721,7 +719,7 @@ static int SubDrawObject(intf_sys_t *sys, int l, vlc_object_t *p_obj, int i_leve
 
     vlc_list_t *list = vlc_list_children(p_obj);
     for (int i = 0; i < list->i_count ; i++) {
-        l = SubDrawObject(sys, l, list->p_values[i].p_object, i_level,
+        l = SubDrawObject(sys, l, list->p_values[i].p_address, i_level,
             (i == list->i_count - 1) ? "`-" : "|-" );
     }
     vlc_list_release(list);
@@ -1570,7 +1568,7 @@ static void CycleESTrack(intf_sys_t *sys, const char *var)
         return;
 
     vlc_value_t val;
-    if (var_Change(input, var, VLC_VAR_GETLIST, &val, NULL) < 0)
+    if (var_Change(input, var, VLC_VAR_GETCHOICES, &val, NULL) < 0)
         return;
 
     vlc_list_t *list = val.p_list;
@@ -1798,6 +1796,15 @@ static inline void UpdateInput(intf_sys_t *sys, playlist_t *p_playlist)
     }
 }
 
+static void cleanup_run(void *data)
+{
+    intf_thread_t *intf = data;
+    playlist_t *p_playlist = pl_Get(intf);
+    var_DelCallback(p_playlist, "intf-change", PlaylistChanged, intf);
+    var_DelCallback(p_playlist, "item-change", ItemChanged, intf);
+    var_DelCallback(p_playlist, "playlist-item-append", PlaylistChanged, intf);
+}
+
 /*****************************************************************************
  * Run: ncurses thread
  *****************************************************************************/
@@ -1811,15 +1818,14 @@ static void *Run(void *data)
     var_AddCallback(p_playlist, "item-change", ItemChanged, intf);
     var_AddCallback(p_playlist, "playlist-item-append", PlaylistChanged, intf);
 
+    vlc_cleanup_push(cleanup_run, data);
     while (!sys->exit) {
         UpdateInput(sys, p_playlist);
         Redraw(intf);
         HandleKey(intf);
     }
+    vlc_cleanup_pop();
 
-    var_DelCallback(p_playlist, "intf-change", PlaylistChanged, intf);
-    var_DelCallback(p_playlist, "item-change", ItemChanged, intf);
-    var_DelCallback(p_playlist, "playlist-item-append", PlaylistChanged, intf);
     return NULL;
 }
 
@@ -1830,7 +1836,7 @@ static int Open(vlc_object_t *p_this)
 {
     intf_thread_t *intf = (intf_thread_t *)p_this;
     intf_sys_t    *sys  = intf->p_sys = calloc(1, sizeof(intf_sys_t));
-    playlist_t    *p_playlist = pl_Get(p_this);
+    playlist_t    *p_playlist = pl_Get(intf);
 
     if (!sys)
         return VLC_ENOMEM;
@@ -1884,6 +1890,7 @@ static void Close(vlc_object_t *p_this)
 {
     intf_sys_t *sys = ((intf_thread_t*)p_this)->p_sys;
 
+    vlc_cancel(sys->thread);
     vlc_join(sys->thread, NULL);
 
     PlaylistDestroy(sys);