[vlc-commits] [Git][videolan/vlc][master] ncurses: make filebrowser searchable

Steve Lhomme (@robUx4) gitlab at videolan.org
Wed Jul 29 16:19:31 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
3aa0538a by Piotr Danecki at 2026-07-29T16:08:49+00:00
ncurses: make filebrowser searchable

- - - - -


1 changed file:

- modules/gui/ncurses.c


Changes:

=====================================
modules/gui/ncurses.c
=====================================
@@ -106,6 +106,7 @@ enum
     BOX_SEARCH,
     BOX_OPEN,
     BOX_BROWSE,
+    BOX_FSEARCH,
     BOX_META,
     BOX_STATS
 };
@@ -119,6 +120,7 @@ static const char box_title[][19] = {
     [BOX_SEARCH]    = " Playlist ",
     [BOX_OPEN]      = " Playlist ",
     [BOX_BROWSE]    = " Browse ",
+    [BOX_FSEARCH]   = " Browse ",
     [BOX_META]      = " Meta-information ",
     [BOX_STATS]     = " Stats ",
 };
@@ -185,6 +187,7 @@ struct intf_sys_t
 
     /* Search Box context */
     char            search_chain[20];
+    char            fsearch_chain[255];
 
     /* Open Box Context */
     char            open_chain[50];
@@ -371,19 +374,23 @@ playlist_on_items_updated(vlc_playlist_t *playlist,
     ((intf_sys_t *)userdata)->need_update = true;
 }
 
+/****************************************************************************
+ * Search
+ ****************************************************************************/
+
 /* Playlist suxx */
-static int SubSearchPlaylist(intf_sys_t *sys, char *searchstring,
-                             int i_start, int i_stop)
+static int SubSearchIn(intf_sys_t *sys, char *searchstring,
+                             int i_start, int i_stop, const char * (*getter)(intf_sys_t *, int))
 {
     for (int i = i_start + 1; i < i_stop; i++)
-        if (strcasestr(sys->pl_item_names.data[i], searchstring))
+        if (strcasestr(getter(sys, i), searchstring))
             return i;
     return -1;
 }
 
-static void SearchPlaylist(intf_sys_t *sys)
+static void SearchIn(intf_sys_t *sys, const char * (*getter)(intf_sys_t *, int), size_t size, char search_chain[])
 {
-    char *str = sys->search_chain;
+    char *str = search_chain;
     int i_first = sys->box_idx;
     if (i_first < 0)
         i_first = 0;
@@ -391,17 +398,41 @@ static void SearchPlaylist(intf_sys_t *sys)
     if (!str || !*str)
         return;
 
-    int i_item = SubSearchPlaylist(sys, str, i_first + 1,
-                                   sys->pl_item_names.size);
+    int i_item = SubSearchIn(sys, str, i_first + 1, size, getter);
     if (i_item < 0)
-        i_item = SubSearchPlaylist(sys, str, 0, i_first);
+        i_item = SubSearchIn(sys, str, 0, i_first, getter);
 
-    if (i_item > 0) {
+    if (i_item >= 0) {
         sys->box_idx = i_item;
         CheckIdx(sys);
     }
 }
 
+static const char * FileSearchGetter(intf_sys_t * sys, int index)
+{
+    return sys->dir_entries[index]->path;
+}
+
+static const char * PlaylistSearchGetter(intf_sys_t * sys, int index)
+{
+    return sys->pl_item_names.data[index];
+}
+
+static void Search(intf_sys_t *sys)
+{
+    switch (sys->box_type)
+    {
+        case BOX_BROWSE:
+        case BOX_FSEARCH:
+            SearchIn(sys, FileSearchGetter, sys->n_dir_entries, sys->fsearch_chain);
+            break;
+        case BOX_PLAYLIST:
+        case BOX_SEARCH:
+            SearchIn(sys, PlaylistSearchGetter, sys->pl_item_names.size, sys->search_chain);
+            break;
+    }
+}
+
 /****************************************************************************
  * Config
  ****************************************************************************/
@@ -1222,6 +1253,8 @@ static void FillTextBox(intf_sys_t *sys)
     DrawEmptyLine(7, 1, width);
     if (sys->box_type == BOX_OPEN)
         mvnprintw(7, 1, width, _("Open: %s"), sys->open_chain);
+    else if (sys->box_type == BOX_FSEARCH)
+        mvnprintw(7, 1, width, _("Find: %s"), sys->fsearch_chain);
     else
         mvnprintw(7, 1, width, _("Find: %s"), sys->search_chain);
 }
@@ -1235,6 +1268,7 @@ static void FillBox(intf_thread_t *intf)
         [BOX_META]      = DrawMeta,
         [BOX_STATS]     = DrawStats,
         [BOX_BROWSE]    = DrawBrowse,
+        [BOX_FSEARCH]   = DrawBrowse,
         [BOX_PLAYLIST]  = DrawPlaylist,
         [BOX_SEARCH]    = DrawPlaylist,
         [BOX_OPEN]      = DrawPlaylist,
@@ -1243,7 +1277,7 @@ static void FillBox(intf_thread_t *intf)
 
     sys->box_lines_total = draw[sys->box_type](intf);
 
-    if (sys->box_type == BOX_SEARCH || sys->box_type == BOX_OPEN)
+    if (sys->box_type == BOX_SEARCH || sys->box_type == BOX_OPEN || sys->box_type == BOX_FSEARCH)
         FillTextBox(sys);
 }
 
@@ -1435,7 +1469,7 @@ static bool HandlePlaylistKey(intf_thread_t *intf, int key)
         return true;
 
     case ';':
-        SearchPlaylist(sys);
+        Search(sys);
         return true;
 
     case 'g':
@@ -1489,6 +1523,10 @@ static bool HandleBrowseKey(intf_thread_t *intf, int key)
         ReadDir(intf);
         return true;
 
+    case ';':
+        Search(sys);
+        return true;
+
     case KEY_ENTER:
     case '\r':
     case '\n':
@@ -1528,12 +1566,16 @@ static void OpenSelection(intf_thread_t *intf)
 
 static void HandleEditBoxKey(intf_thread_t *intf, int key, int box)
 {
+#define SEARCH_SIZE (search ? sizeof sys->search_chain \
+                              : fsearch ? sizeof sys->fsearch_chain \
+                              : sizeof sys->open_chain)
     intf_sys_t *sys = intf->p_sys;
     bool search = box == BOX_SEARCH;
-    char *str = search ? sys->search_chain: sys->open_chain;
+    bool fsearch = box == BOX_FSEARCH;
+    char *str = search ? sys->search_chain: fsearch ? sys->fsearch_chain: sys->open_chain;
     size_t len = strlen(str);
 
-    assert(box == BOX_SEARCH || box == BOX_OPEN);
+    assert(box == BOX_SEARCH || box == BOX_OPEN || box == BOX_FSEARCH);
 
     switch(key)
     {
@@ -1543,12 +1585,12 @@ static void HandleEditBoxKey(intf_thread_t *intf, int key, int box)
     case KEY_ENTER:
     case '\r':
     case '\n':
-        if (search)
-            SearchPlaylist(sys);
+        if (search || fsearch)
+            Search(sys);
         else
             OpenSelection(intf);
 
-        sys->box_type = BOX_PLAYLIST;
+        sys->box_type = sys->previous_box_type;
         return;
 
     case 0x1b: /* ESC */
@@ -1570,21 +1612,27 @@ static void HandleEditBoxKey(intf_thread_t *intf, int key, int box)
             sys->box_type = BOX_PLAYLIST;
         return;
 
+    case 'w' & 037: // expanded from CTRL('w')
+        for (int i = 0; (unsigned long)i < SEARCH_SIZE; i++)
+        {
+            str[i] = 0;
+        }
+        break;
+
     case KEY_BACKSPACE:
     case 0x7f:
         RemoveLastUTF8Entity(str, len);
         break;
 
     default:
-        if (len + 1 < (search ? sizeof sys->search_chain
-                              : sizeof sys->open_chain)) {
+        if (len + 1 < SEARCH_SIZE) {
             str[len + 0] = key;
             str[len + 1] = '\0';
         }
     }
 
-    if (search)
-        SearchPlaylist(sys);
+    if (search || fsearch)
+        Search(sys);
 }
 
 static void HandleCommonKey(intf_thread_t *intf, vlc_player_t *player, int key)
@@ -1615,9 +1663,12 @@ static void HandleCommonKey(intf_thread_t *intf, vlc_player_t *player, int key)
     case 'B': BoxSwitch(sys, BOX_BROWSE);     return;
     case 'S': BoxSwitch(sys, BOX_STATS);      return;
 
-    case '/': /* Search */
+    case '/': /* Search playlist or in file browser */
         sys->plidx_follow = false;
-        BoxSwitch(sys, BOX_SEARCH);
+        if (sys->box_type == BOX_BROWSE)
+            BoxSwitch(sys, BOX_FSEARCH);
+        else
+            BoxSwitch(sys, BOX_SEARCH);
         return;
 
     case 'A': /* Open */
@@ -1768,7 +1819,7 @@ static void HandleKey(intf_thread_t *intf)
     if (key == -1)
         return;
 
-    if (box == BOX_SEARCH || box == BOX_OPEN) {
+    if (box == BOX_SEARCH || box == BOX_OPEN || box == BOX_FSEARCH) {
         HandleEditBoxKey(intf, key, sys->box_type);
         return;
     }



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/3aa0538a6789dd815387ae19957fcb0082d65a40

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/3aa0538a6789dd815387ae19957fcb0082d65a40
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help




More information about the vlc-commits mailing list