[vlc-commits] commit: ncurses: factor HandlePlaylistKey() out of HandleKey() ( Rafaël Carré )

git at videolan.org git at videolan.org
Tue Oct 26 20:15:15 CEST 2010


vlc | branch: master | Rafaël Carré <rafael.carre at gmail.com> | Tue Oct 26 20:14:19 2010 +0200| [b1b43f10c6f0eaeb7813ea1030592472f50fd433] | committer: Rafaël Carré 

ncurses: factor HandlePlaylistKey() out of HandleKey()

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

 modules/gui/ncurses.c |  224 +++++++++++++++++++++++--------------------------
 1 files changed, 105 insertions(+), 119 deletions(-)

diff --git a/modules/gui/ncurses.c b/modules/gui/ncurses.c
index 03dfe9a..f319e28 100644
--- a/modules/gui/ncurses.c
+++ b/modules/gui/ncurses.c
@@ -1440,148 +1440,134 @@ static inline void BoxSwitch(intf_sys_t *p_sys, int box)
     p_sys->i_box_type = (p_sys->i_box_type == box) ? BOX_NONE : box;
 }
 
-static int HandleKey(intf_thread_t *p_intf)
+static bool HandlePlaylistKey(intf_thread_t *p_intf, int key)
 {
+    bool b_box_plidx_follow = false;
     intf_sys_t *p_sys = p_intf->p_sys;
     playlist_t *p_playlist = pl_Get(p_intf);
-    int i_key = wgetch(p_sys->w);
-
-    if (i_key == -1)
-        return 0;
+    struct pl_item_t *p_pl_item;
 
-    if (p_sys->i_box_type == BOX_PLAYLIST)
+    switch(key)
     {
-        int b_ret = true;
-        bool b_box_plidx_follow = false;
-
-        switch(i_key)
-        {
-        /* Playlist Settings */
-        case 'r':
-            var_ToggleBool(p_playlist, "random");
-            return 1;
-        case 'l':
-            var_ToggleBool(p_playlist, "loop");
-            return 1;
-        case 'R':
-            var_ToggleBool(p_playlist, "repeat");
-            return 1;
-
-        /* Playlist sort */
-        case 'o':
-            playlist_RecursiveNodeSort(p_playlist, PlaylistGetRoot(p_intf),
-                                        SORT_TITLE_NODES_FIRST, ORDER_NORMAL);
-            p_sys->b_need_update = true;
-            return 1;
-        case 'O':
-            playlist_RecursiveNodeSort(p_playlist, PlaylistGetRoot(p_intf),
-                                        SORT_TITLE_NODES_FIRST, ORDER_REVERSE);
-            p_sys->b_need_update = true;
-            return 1;
-
-        /* Playlist view */
-        case 'v':
-            p_sys->category_view = !p_sys->category_view;
-            PlaylistRebuild(p_intf);
-            return 1;
-
-        /* Playlist navigation */
-        case 'g':
-            FindIndex(p_sys, p_playlist, false);
-            break;
-        case KEY_HOME:
-            p_sys->i_box_plidx = 0;
-            break;
+    /* Playlist Settings */
+    case 'r': var_ToggleBool(p_playlist, "random"); return true;
+    case 'l': var_ToggleBool(p_playlist, "loop");   return true;
+    case 'R': var_ToggleBool(p_playlist, "repeat"); return true;
+
+    /* Playlist sort */
+    case 'o':
+    case 'O':
+        playlist_RecursiveNodeSort(p_playlist, PlaylistGetRoot(p_intf),
+                                    SORT_TITLE_NODES_FIRST,
+                                    (key == 'o')? ORDER_NORMAL : ORDER_REVERSE);
+        p_sys->b_need_update = true;
+        return true;
+
+    /* Playlist view */
+    case 'v':
+        p_sys->category_view = !p_sys->category_view;
+        p_sys->b_need_update = true;
+        return true;
+
+    /* Playlist navigation */
 #ifdef __FreeBSD__
 /* workaround for FreeBSD + xterm:
 * see http://www.nabble.com/curses-vs.-xterm-key-mismatch-t3574377.html */
-        case KEY_SELECT:
+    case KEY_SELECT:
 #endif
-        case KEY_END:
-            p_sys->i_box_plidx = p_playlist->items.i_size - 1;
-            break;
-        case KEY_UP:
-            p_sys->i_box_plidx--;
-            break;
-        case KEY_DOWN:
-            p_sys->i_box_plidx++;
-            break;
-        case KEY_PPAGE:
-            p_sys->i_box_plidx -= p_sys->i_box_lines;
-            break;
-        case KEY_NPAGE:
-            p_sys->i_box_plidx += p_sys->i_box_lines;
-            break;
-        case 'D':
-        case KEY_BACKSPACE:
-        case 0x7f:
-        case KEY_DC:
-        {
-            playlist_item_t *p_item;
+    case KEY_END:   p_sys->i_box_plidx = p_playlist->items.i_size - 1;  break;
+    case KEY_HOME:  p_sys->i_box_plidx = 0;                             break;
+    case KEY_UP:    p_sys->i_box_plidx--;                               break;
+    case KEY_DOWN:  p_sys->i_box_plidx++;                               break;
+    case KEY_PPAGE: p_sys->i_box_plidx -= p_sys->i_box_lines;           break;
+    case KEY_NPAGE: p_sys->i_box_plidx += p_sys->i_box_lines;           break;
+    case 'g':       FindIndex(p_sys, p_playlist, false);                break;
+
+    /* Deletion */
+    case 'D':
+    case KEY_BACKSPACE:
+    case 0x7f:
+    case KEY_DC:
+    {
+        playlist_item_t *p_item;
 
-            PL_LOCK;
-            p_item = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
-            if (p_item->i_children == -1)
-                playlist_DeleteFromInput(p_playlist, p_item->p_input, pl_Locked);
-            else
-                playlist_NodeDelete(p_playlist, p_item, true , false);
-            PL_UNLOCK;
-            PlaylistRebuild(p_intf);
-            break;
-        }
+        PL_LOCK;
+        p_item = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
+        if (p_item->i_children == -1)
+            playlist_DeleteFromInput(p_playlist, p_item->p_input, pl_Locked);
+        else
+            playlist_NodeDelete(p_playlist, p_item, true , false);
+        PL_UNLOCK;
+        p_sys->b_need_update = true;
+        break;
+    }
 
-        case KEY_ENTER:
-        case '\r':
-        case '\n':
-            if (!p_sys->pp_plist[p_sys->i_box_plidx])
-            {
-                b_ret = false;
-                break;
-            }
-            if (p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children == -1)
+    case KEY_ENTER:
+    case '\r':
+    case '\n':
+        if (!(p_pl_item = p_sys->pp_plist[p_sys->i_box_plidx]))
+            return false;
+
+        if (p_pl_item->p_item->i_children)
+        {
+            playlist_item_t *p_item, *p_parent = p_pl_item->p_item;
+            if (p_parent->i_children == -1)
             {
-                playlist_item_t *p_item, *p_parent;
-                p_item = p_parent = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
+                p_item = p_parent;
 
-                if (!p_parent)
-                    p_parent = p_playlist->p_root_onelevel;
                 while (p_parent->p_parent)
                     p_parent = p_parent->p_parent;
-                playlist_Control(p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked,
-                                  p_parent, p_item);
-            }
-            else if (!p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children)
-            {   /* We only want to set the current node */
-                playlist_Stop(p_playlist);
-                p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
             }
             else
             {
-                p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
-                playlist_Control(p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked,
-                    p_sys->pp_plist[p_sys->i_box_plidx]->p_item, NULL);
+                p_sys->p_node = p_parent;
+                p_item = NULL;
             }
-            b_box_plidx_follow = true;
-            break;
-        default:
-            b_ret = false;
-            break;
+
+            playlist_Control(p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked,
+                              p_parent, p_item);
+        }
+        else
+        {   /* We only want to set the current node */
+            playlist_Stop(p_playlist);
+            p_sys->p_node = p_pl_item->p_item;
         }
 
-        if (b_ret)
-        {
-            int i_max = p_sys->i_plist_entries;
-            if (p_sys->i_box_plidx >= i_max) p_sys->i_box_plidx = i_max - 1;
-            if (p_sys->i_box_plidx < 0) p_sys->i_box_plidx = 0;
+        b_box_plidx_follow = true;
+        break;
 
-            PL_LOCK;
-            if (PlaylistIsPlaying(p_playlist,
-                                   p_sys->pp_plist[p_sys->i_box_plidx]->p_item))
-                b_box_plidx_follow = true;
-            PL_UNLOCK;
-            p_sys->b_box_plidx_follow = b_box_plidx_follow;
+    default:
+        return false;
+    }
+
+    if (p_sys->i_box_plidx > p_sys->i_plist_entries - 1)
+        p_sys->i_box_plidx = p_sys->i_plist_entries - 1;
+    if (p_sys->i_box_plidx < 0)
+        p_sys->i_box_plidx = 0;
+
+    p_pl_item = p_sys->pp_plist[p_sys->i_box_plidx];
+
+    PL_LOCK;
+    if (PlaylistIsPlaying(p_playlist, p_pl_item->p_item))
+        b_box_plidx_follow = true;
+    PL_UNLOCK;
+    p_sys->b_box_plidx_follow = b_box_plidx_follow;
+    return true;
+}
+
+static int HandleKey(intf_thread_t *p_intf)
+{
+    intf_sys_t *p_sys = p_intf->p_sys;
+    playlist_t *p_playlist = pl_Get(p_intf);
+    int i_key = wgetch(p_sys->w);
+
+    if (i_key == -1)
+        return 0;
+
+    if (p_sys->i_box_type == BOX_PLAYLIST)
+    {
+        if (HandlePlaylistKey(p_intf, i_key))
             return 1;
-        }
     }
     else if (p_sys->i_box_type == BOX_BROWSE)
     {



More information about the vlc-commits mailing list