[vlc-commits] commit: ncurses: messages box ( Rafaël Carré )

git at videolan.org git at videolan.org
Fri Oct 29 17:33:30 CEST 2010


vlc | branch: master | Rafaël Carré <rafael.carre at gmail.com> | Fri Oct 29 17:29:12 2010 +0200| [d8f0784231067b3da279a8f54d83320b32c87cf9] | committer: Rafaël Carré 

ncurses: messages box

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

 modules/gui/ncurses.c |   97 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 86 insertions(+), 11 deletions(-)

diff --git a/modules/gui/ncurses.c b/modules/gui/ncurses.c
index 54a3b6f..07c4239 100644
--- a/modules/gui/ncurses.c
+++ b/modules/gui/ncurses.c
@@ -92,7 +92,7 @@ enum
     BOX_NONE,
     BOX_HELP,
     BOX_INFO,
-//  BOX_LOG,
+    BOX_LOG,
     BOX_PLAYLIST,
     BOX_SEARCH,
     BOX_OPEN,
@@ -106,7 +106,7 @@ static const char *box_title[] = {
     [BOX_NONE]      = "",
     [BOX_HELP]      = " Help ",
     [BOX_INFO]      = " Information ",
-//  [BOX_LOG]       = " Messages ",
+    [BOX_LOG]       = " Messages ",
     [BOX_PLAYLIST]  = " Playlist ",
     [BOX_SEARCH]    = " Playlist ",
     [BOX_OPEN]      = " Playlist ",
@@ -125,12 +125,10 @@ enum
     C_PLAYLIST_3,
     C_BOX,
     C_STATUS,
-#if 0
     C_INFO,
     C_ERROR,
     C_WARNING,
     C_DEBUG,
-#endif
     C_CATEGORY,
     C_FOLDER,
     /* XXX: new elements here ! */
@@ -154,13 +152,12 @@ static const struct { short f; short b; } color_pairs[] =
     /* Source: State, Position, Volume, Chapters, etc...*/
     [C_STATUS]      = { COLOR_BLUE,     COLOR_BLACK },
 
-#if 0
     /* VLC messages, keep the order from highest priority to lowest */
     [C_INFO]        = { COLOR_BLACK,    COLOR_WHITE },
     [C_ERROR]       = { COLOR_RED,      COLOR_BLACK },
     [C_WARNING]     = { COLOR_YELLOW,   COLOR_BLACK },
     [C_DEBUG]       = { COLOR_WHITE,    COLOR_BLACK },
-#endif
+
     /* Category title: help, info, metadata */
     [C_CATEGORY]    = { COLOR_MAGENTA,  COLOR_BLACK },
     /* Folder (BOX_BROWSE) */
@@ -192,7 +189,10 @@ struct intf_sys_t
     int             i_box_start;        // first line of box displayed
     int             i_box_idx;          // selected line
 
-//  msg_subscription_t* p_sub;                  /* message bank subscription */
+    msg_subscription_t  *p_sub;         // message bank subscription
+    msg_item_t          *msgs[50];      // ring buffer
+    int                 i_msgs;
+    vlc_mutex_t         msg_lock;
 
     /* Search Box context */
     char            psz_search_chain[20];
@@ -218,6 +218,11 @@ struct intf_sys_t
 
 };
 
+struct msg_cb_data_t
+{
+    intf_sys_t *p_sys;
+};
+
 /*****************************************************************************
  * Directories
  *****************************************************************************/
@@ -910,7 +915,7 @@ static int DrawHelp(intf_thread_t *p_intf)
     MainBoxWrite(p_sys, l++, _("     h,H         Show/Hide help box"));
     MainBoxWrite(p_sys, l++, _("     i           Show/Hide info box"));
     MainBoxWrite(p_sys, l++, _("     m           Show/Hide metadata box"));
-//  MainBoxWrite(p_sys, l++, _("     L           Show/Hide messages box"));
+    MainBoxWrite(p_sys, l++, _("     L           Show/Hide messages box"));
     MainBoxWrite(p_sys, l++, _("     P           Show/Hide playlist box"));
     MainBoxWrite(p_sys, l++, _("     B           Show/Hide filebrowser"));
     MainBoxWrite(p_sys, l++, _("     x           Show/Hide objects box"));
@@ -1036,6 +1041,34 @@ static int DrawPlaylist(intf_thread_t *p_intf)
     return p_sys->i_plist_entries;
 }
 
+static int DrawMessages(intf_thread_t *p_intf)
+{
+    intf_sys_t *p_sys = p_intf->p_sys;
+    int l = 0;
+    int i;
+
+    vlc_mutex_lock(&p_sys->msg_lock);
+    i = p_sys->i_msgs;
+    for(;;)
+    {
+        msg_item_t *msg = p_sys->msgs[i];
+        if (msg)
+        {
+            if (p_sys->b_color)
+                color_set(msg->i_type + C_INFO, NULL);
+            MainBoxWrite(p_sys, l++, "[%s] %s", msg->psz_module, msg->psz_msg);
+        }
+
+        if (++i == sizeof p_sys->msgs / sizeof *p_sys->msgs)
+            i = 0;
+
+        if (i == p_sys->i_msgs) /* did we loop around the ring buffer ? */
+            break;
+    }
+    vlc_mutex_unlock(&p_sys->msg_lock);
+    return l;
+}
+
 static int DrawStatus(intf_thread_t *p_intf)
 {
     intf_sys_t     *p_sys = p_intf->p_sys;
@@ -1169,6 +1202,7 @@ static void FillBox(intf_thread_t *p_intf)
         [BOX_PLAYLIST]  = DrawPlaylist,
         [BOX_SEARCH]    = DrawPlaylist,
         [BOX_OPEN]      = DrawPlaylist,
+        [BOX_LOG]       = DrawMessages,
     };
 
     p_sys->i_box_lines_total = draw[p_sys->i_box_type](p_intf);
@@ -1595,7 +1629,7 @@ static bool HandleCommonKey(intf_thread_t *p_intf, int key)
     case 'H': BoxSwitch(p_sys, BOX_HELP);       return true;
     case 'i': BoxSwitch(p_sys, BOX_INFO);       return true;
     case 'm': BoxSwitch(p_sys, BOX_META);       return true;
-//  case 'L': BoxSwitch(p_sys, BOX_LOG)         return true;
+    case 'L': BoxSwitch(p_sys, BOX_LOG);        return true;
     case 'P': BoxSwitch(p_sys, BOX_PLAYLIST);   return true;
     case 'B': BoxSwitch(p_sys, BOX_BROWSE);     return true;
     case 'x': BoxSwitch(p_sys, BOX_OBJECTS);    return true;
@@ -1723,6 +1757,30 @@ static bool HandleKey(intf_thread_t *p_intf)
     return HandleListKey(p_intf, key) || HandleCommonKey(p_intf, key);
 }
 
+/*
+ *
+ */
+
+static void MsgCallback(msg_cb_data_t *data, msg_item_t *msg, unsigned i)
+{
+    intf_sys_t *p_sys = data->p_sys;
+    (void)i; // what is this?
+    int canc = vlc_savecancel();
+
+    vlc_mutex_lock(&p_sys->msg_lock);
+
+    if (p_sys->msgs[p_sys->i_msgs])
+        msg_Release(p_sys->msgs[p_sys->i_msgs]);
+    p_sys->msgs[p_sys->i_msgs++] = msg_Hold(msg);
+
+    if (p_sys->i_msgs == (sizeof p_sys->msgs / sizeof *p_sys->msgs))
+        p_sys->i_msgs = 0;
+
+    vlc_mutex_unlock(&p_sys->msg_lock);
+
+    vlc_restorecancel(canc);
+}
+
 /*****************************************************************************
  * Run: ncurses thread
  *****************************************************************************/
@@ -1773,13 +1831,26 @@ static int Open(vlc_object_t *p_this)
 {
     intf_thread_t *p_intf = (intf_thread_t *)p_this;
     intf_sys_t    *p_sys  = p_intf->p_sys = calloc(1, sizeof(intf_sys_t));
+    struct msg_cb_data_t *msg_cb_data;
 
     if (!p_sys)
         return VLC_ENOMEM;
 
+    msg_cb_data = malloc(sizeof *msg_cb_data);
+    if (!msg_cb_data)
+    {
+        free(p_sys);
+        return VLC_ENOMEM;
+    }
+
+    msg_cb_data->p_sys = p_sys;
+    vlc_mutex_init(&p_sys->msg_lock);
+    p_sys->i_msgs = 0;
+    memset(p_sys->msgs, 0, sizeof p_sys->msgs);
+    p_sys->p_sub = msg_Subscribe(p_intf->p_libvlc, MsgCallback, msg_cb_data);
+
     p_sys->i_box_type = BOX_PLAYLIST;
     p_sys->b_plidx_follow = true;
-//  p_sys->p_sub = msg_Subscribe(p_intf);
     p_sys->b_color = var_CreateGetBool(p_intf, "color");
 
     p_sys->category_view = true; //FIXME: switching back & forth is broken
@@ -1833,7 +1904,11 @@ static void Close(vlc_object_t *p_this)
 
     endwin();   /* Close the ncurses interface */
 
-//  msg_Unsubscribe(p_sys->p_sub);
+    msg_Unsubscribe(p_sys->p_sub);
+    vlc_mutex_destroy(&p_sys->msg_lock);
+    for(unsigned i = 0; i < sizeof p_sys->msgs / sizeof *p_sys->msgs; i++)
+        if (p_sys->msgs[i])
+            msg_Release(p_sys->msgs[i]);
 
     free(p_sys);
 }



More information about the vlc-commits mailing list