btr: Rename btr_bytes_pending() and make it public.
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 21770ca86a368e177b5d9923f51743fe1932999c..5b44819c05afc074fadca3a5a7d5c1ece9fe8b8f 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -6,14 +6,16 @@
 
 /** \file gui.c Curses-based interface for paraslash. */
 
 
 /** \file gui.c Curses-based interface for paraslash. */
 
+#include <regex.h>
 #include <signal.h>
 #include <sys/types.h>
 #include <dirent.h>
 #include <signal.h>
 #include <sys/types.h>
 #include <dirent.h>
+#include <curses.h>
+
 #include "gui.cmdline.h"
 #include "para.h"
 #include "gui.h"
 #include "string.h"
 #include "gui.cmdline.h"
 #include "para.h"
 #include "gui.h"
 #include "string.h"
-#include <curses.h>
 #include "ringbuffer.h"
 #include "fd.h"
 #include "error.h"
 #include "ringbuffer.h"
 #include "fd.h"
 #include "error.h"
@@ -43,7 +45,7 @@ struct rb_entry {
        size_t len;
        int color;
 };
        size_t len;
        int color;
 };
-struct ringbuffer *bot_win_rb;
+static struct ringbuffer *bot_win_rb;
 #define NUM_LINES(len) (1 + (len) / bot.cols)
 
 static unsigned scroll_position;
 #define NUM_LINES(len) (1 + (len) / bot.cols)
 
 static unsigned scroll_position;
@@ -89,8 +91,8 @@ struct stat_item {
 
 static struct gui_theme theme;
 
 
 static struct gui_theme theme;
 
-int _argc;
-char **_argv;
+static int _argc;
+static char **_argv;
 
 static void com_help(void);
 static void com_reread_conf(void);
 
 static void com_help(void);
 static void com_reread_conf(void);
@@ -108,7 +110,7 @@ static void com_scroll_down(void);
 static void com_page_up(void);
 static void com_page_down(void);
 
 static void com_page_up(void);
 static void com_page_down(void);
 
-struct gui_command command_list[] = {
+static struct gui_command command_list[] = {
        {
                .key = "?",
                .name = "help",
        {
                .key = "?",
                .name = "help",
@@ -294,20 +296,23 @@ static void add_spaces(WINDOW* win, unsigned int num)
  * print aligned string to curses window. This function always prints
  * exactly len chars.
  */
  * print aligned string to curses window. This function always prints
  * exactly len chars.
  */
-static int align_str(WINDOW* win, const char *string, unsigned int len,
+static int align_str(WINDOW* win, char *str, unsigned int len,
                unsigned int align)
 {
                unsigned int align)
 {
-       int num; /* of spaces */
-       char *str;
+       int i, num; /* of spaces */
 
 
-       if (!win || !string)
+       if (!win || !str)
                return -1;
                return -1;
-       num = len - strlen(string);
-       str = para_strdup(string);
+       num = len - strlen(str);
        if (num < 0) {
                str[len] = '\0';
                num = 0;
        }
        if (num < 0) {
                str[len] = '\0';
                num = 0;
        }
+       /* replace newlines by spaces */
+       for (i = 0; i < len && str[i]; i++) {
+               if (str[i] == '\n')
+                       str[i] = ' ';
+       }
        if (align == LEFT) {
                waddstr(win, str);
                add_spaces(win, num);
        if (align == LEFT) {
                waddstr(win, str);
                add_spaces(win, num);
@@ -319,7 +324,6 @@ static int align_str(WINDOW* win, const char *string, unsigned int len,
                waddstr(win, str[0]? str: "");
                add_spaces(win, num - num / 2);
        }
                waddstr(win, str[0]? str: "");
                add_spaces(win, num - num / 2);
        }
-       free(str);
        return 1;
 }
 
        return 1;
 }
 
@@ -342,10 +346,14 @@ __printf_2_3 static void print_in_bar(int color, const char *fmt,...)
  */
 static void print_status_bar(void)
 {
  */
 static void print_status_bar(void)
 {
+       char *tmp;
+
        if (!curses_active)
                return;
        if (!curses_active)
                return;
+       tmp = para_strdup(STANDARD_STATUS_BAR);
        wmove(sb.win, 0, 0);
        wmove(sb.win, 0, 0);
-       align_str(sb.win, STANDARD_STATUS_BAR, sb.cols, CENTER);
+       align_str(sb.win, tmp, sb.cols, CENTER);
+       free(tmp);
        wrefresh(sb.win);
 }
 
        wrefresh(sb.win);
 }
 
@@ -669,13 +677,33 @@ static void print_stat_item(int i)
        wrefresh(top.win);
 }
 
        wrefresh(top.win);
 }
 
-/*
- * print status line if line starts with known command.
- */
 static int update_item(int item_num, char *buf)
 {
 static int update_item(int item_num, char *buf)
 {
-       free(stat_content[item_num]);
-       stat_content[item_num] = para_strdup(buf);
+       char **c = stat_content + item_num;
+
+       free(*c);
+       if (buf && buf[0])
+               goto dup;
+       switch (item_num) {
+       case SI_ARTIST:
+               *c = para_strdup("(artist tag not set)");
+               goto print;
+       case SI_TITLE:
+               *c = para_strdup("(title tag not set)");
+               goto print;
+       case SI_YEAR:
+               *c = para_strdup("????");
+               goto print;
+       case SI_ALBUM:
+               *c = para_strdup("(album tag not set)");
+               goto print;
+       case SI_COMMENT:
+               *c = para_strdup("(comment tag not set)");
+               goto print;
+       }
+dup:
+       *c = para_strdup(buf);
+print:
        print_stat_item(item_num);
        return 1;
 }
        print_stat_item(item_num);
        return 1;
 }