about summary refs log tree commit diff stats
path: root/src/ui/statusbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/statusbar.c')
-rw-r--r--src/ui/statusbar.c533
1 files changed, 184 insertions, 349 deletions
diff --git a/src/ui/statusbar.c b/src/ui/statusbar.c
index 33c37822..ff264202 100644
--- a/src/ui/statusbar.c
+++ b/src/ui/statusbar.c
@@ -51,34 +51,40 @@
 #include "ui/inputwin.h"
 #include "ui/screen.h"
 
+typedef struct _status_bar_tab_t {
+    char *display_name;
+    gboolean highlight;
+} StatusBarTab;
+
 typedef struct _status_bar_t {
     gchar *time;
     char *message;
-    GList *tabs;
+    GHashTable *tabs;
+    int current_tab;
 } StatusBar;
 
+#define MAX_TABS 5
+#define SHOW_EMPTY_TABS FALSE
+#define SHOW_NAME TRUE
+
 static GTimeZone *tz;
 static StatusBar *statusbar;
 static WINDOW *statusbar_win;
-//static char *message = NULL;
-////                          1  2  3  4  5  6  7  8  9  0  >
-//static char _active[34] = "[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]";
-//static char *bracket = "- -";
-//static int is_active[12];
-//static GHashTable *remaining_active;
-//static int is_new[12];
-//static GHashTable *remaining_new;
-//static GTimeZone *tz;
-//static GDateTime *last_time;
-//static int current;
-
-//static void _update_win_statuses(void);
-//static void _mark_new(int num);
-//static void _mark_active(int num);
-//static void _mark_inactive(int num);
+
 static void _status_bar_draw(void);
 
 void
+_destroy_tab(StatusBarTab *tab)
+{
+    if (tab) {
+        if (tab->display_name) {
+            free(tab->display_name);
+        }
+        free(tab);
+    }
+}
+
+void
 status_bar_init(void)
 {
     tz = g_time_zone_new_local();
@@ -86,44 +92,17 @@ status_bar_init(void)
     statusbar = malloc(sizeof(StatusBar));
     statusbar->time = NULL;
     statusbar->message = NULL;
+    statusbar->tabs = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)_destroy_tab);
+    StatusBarTab *console = malloc(sizeof(StatusBarTab));
+    console->display_name = strdup("console");
+    g_hash_table_insert(statusbar->tabs, GINT_TO_POINTER(1), console);
+    statusbar->current_tab = 1;
 
     int row = screen_statusbar_row();
     int cols = getmaxx(stdscr);
     statusbar_win = newwin(1, cols, row, 0);
 
     _status_bar_draw();
-
-//    int i;
-//    int cols = getmaxx(stdscr);
-//
-//    is_active[1] = TRUE;
-//    is_new[1] = FALSE;
-//    for (i = 2; i < 12; i++) {
-//        is_active[i] = FALSE;
-//        is_new[i] = FALSE;
-//    }
-//    remaining_active = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
-//    remaining_new = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL);
-//    current = 1;
-//
-//    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
-//
-//    int row = screen_statusbar_row();
-//    status_bar = newwin(1, cols, row, 0);
-//    wbkgd(status_bar, theme_attrs(THEME_STATUS_TEXT));
-//    wattron(status_bar, bracket_attrs);
-//    mvwprintw(status_bar, 0, cols - 34, _active);
-//    mvwprintw(status_bar, 0, cols - 34 + ((current - 1) * 3), bracket);
-//    wattroff(status_bar, bracket_attrs);
-//
-//    tz = g_time_zone_new_local();
-//
-//    if (last_time) {
-//        g_date_time_unref(last_time);
-//    }
-//    last_time = g_date_time_new_now(tz);
-//
-//    _status_bar_draw();
 }
 
 void
@@ -159,188 +138,69 @@ status_bar_resize(void)
     wresize(statusbar_win, 1, cols);
 
     _status_bar_draw();
-
-//    int cols = getmaxx(stdscr);
-//
-//    werase(status_bar);
-//
-//    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
-//
-//    int row = screen_statusbar_row();
-//    mvwin(status_bar, row, 0);
-//    wresize(status_bar, 1, cols);
-//    wbkgd(status_bar, theme_attrs(THEME_STATUS_TEXT));
-//    wattron(status_bar, bracket_attrs);
-//    mvwprintw(status_bar, 0, cols - 34, _active);
-//    mvwprintw(status_bar, 0, cols - 34 + ((current - 1) * 3), bracket);
-//    wattroff(status_bar, bracket_attrs);
-//
-//    if (message) {
-//        char *time_pref = prefs_get_string(PREF_TIME_STATUSBAR);
-//
-//        gchar *date_fmt = NULL;
-//        if (g_strcmp0(time_pref, "off") == 0) {
-//            date_fmt = g_strdup("");
-//        } else {
-//            date_fmt = g_date_time_format(last_time, time_pref);
-//        }
-//        assert(date_fmt != NULL);
-//        size_t len = strlen(date_fmt);
-//        g_free(date_fmt);
-//        if (g_strcmp0(time_pref, "off") != 0) {
-//            /* 01234567890123456
-//             *  [HH:MM]  message */
-//            mvwprintw(status_bar, 0, 5 + len, message);
-//        } else {
-//            mvwprintw(status_bar, 0, 1, message);
-//        }
-//        prefs_free_string(time_pref);
-//    }
-//    if (last_time) {
-//        g_date_time_unref(last_time);
-//    }
-//    last_time = g_date_time_new_now_local();
-//
-//    _status_bar_draw();
 }
 
 void
 status_bar_set_all_inactive(void)
 {
-//    int i = 0;
-//    for (i = 0; i < 12; i++) {
-//        is_active[i] = FALSE;
-//        is_new[i] = FALSE;
-//        _mark_inactive(i);
-//    }
-//
-//    g_hash_table_remove_all(remaining_active);
-//    g_hash_table_remove_all(remaining_new);
-//
-//    _status_bar_draw();
+    g_hash_table_remove_all(statusbar->tabs);
 }
 
 void
 status_bar_current(int i)
 {
-//    if (i == 0) {
-//        current = 10;
-//    } else if (i > 10) {
-//        current = 11;
-//    } else {
-//        current = i;
-//    }
-//    int cols = getmaxx(stdscr);
-//    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
-//    wattron(status_bar, bracket_attrs);
-//    mvwprintw(status_bar, 0, cols - 34, _active);
-//    mvwprintw(status_bar, 0, cols - 34 + ((current - 1) * 3), bracket);
-//    wattroff(status_bar, bracket_attrs);
-//
-//    _status_bar_draw();
+    if (i == 0) {
+        statusbar->current_tab = 10;
+    } else {
+        statusbar->current_tab = i;
+    }
+
+    _status_bar_draw();
 }
 
 void
 status_bar_inactive(const int win)
 {
-//    int true_win = win;
-//    if (true_win == 0) {
-//        true_win = 10;
-//    }
-//
-//    // extra windows
-//    if (true_win > 10) {
-//        g_hash_table_remove(remaining_active, GINT_TO_POINTER(true_win));
-//        g_hash_table_remove(remaining_new, GINT_TO_POINTER(true_win));
-//
-//        // still have new windows
-//        if (g_hash_table_size(remaining_new) != 0) {
-//            is_active[11] = TRUE;
-//            is_new[11] = TRUE;
-//            _mark_new(11);
-//
-//        // still have active windows
-//        } else if (g_hash_table_size(remaining_active) != 0) {
-//            is_active[11] = TRUE;
-//            is_new[11] = FALSE;
-//            _mark_active(11);
-//
-//        // no active or new windows
-//        } else {
-//            is_active[11] = FALSE;
-//            is_new[11] = FALSE;
-//            _mark_inactive(11);
-//        }
-//
-//    // visible window indicators
-//    } else {
-//        is_active[true_win] = FALSE;
-//        is_new[true_win] = FALSE;
-//        _mark_inactive(true_win);
-//    }
-//
-//    _status_bar_draw();
+    int true_win = win;
+    if (true_win == 0) {
+        true_win = 10;
+    }
+
+    g_hash_table_remove(statusbar->tabs, GINT_TO_POINTER(true_win));
+
+    _status_bar_draw();
 }
 
 void
-status_bar_active(const int win)
+status_bar_active(const int win, char *name)
 {
-//    int true_win = win;
-//    if (true_win == 0) {
-//        true_win = 10;
-//    }
-//
-//    // extra windows
-//    if (true_win > 10) {
-//        g_hash_table_add(remaining_active, GINT_TO_POINTER(true_win));
-//        g_hash_table_remove(remaining_new, GINT_TO_POINTER(true_win));
-//
-//        // still have new windows
-//        if (g_hash_table_size(remaining_new) != 0) {
-//            is_active[11] = TRUE;
-//            is_new[11] = TRUE;
-//            _mark_new(11);
-//
-//        // only active windows
-//        } else {
-//            is_active[11] = TRUE;
-//            is_new[11] = FALSE;
-//            _mark_active(11);
-//        }
-//
-//    // visible window indicators
-//    } else {
-//        is_active[true_win] = TRUE;
-//        is_new[true_win] = FALSE;
-//        _mark_active(true_win);
-//    }
-//
-//    _status_bar_draw();
+    int true_win = win;
+    if (true_win == 0) {
+        true_win = 10;
+    }
+
+    StatusBarTab *tab = malloc(sizeof(StatusBarTab));
+    tab->display_name = strdup(name);
+    tab->highlight = FALSE;
+    g_hash_table_replace(statusbar->tabs, GINT_TO_POINTER(true_win), tab);
+
+    _status_bar_draw();
 }
 
 void
-status_bar_new(const int win)
+status_bar_new(const int win, char* name)
 {
-//    int true_win = win;
-//    if (true_win == 0) {
-//        true_win = 10;
-//    }
-//
-//    if (true_win > 10) {
-//        g_hash_table_add(remaining_active, GINT_TO_POINTER(true_win));
-//        g_hash_table_add(remaining_new, GINT_TO_POINTER(true_win));
-//
-//        is_active[11] = TRUE;
-//        is_new[11] = TRUE;
-//        _mark_new(11);
-//
-//    } else {
-//        is_active[true_win] = TRUE;
-//        is_new[true_win] = TRUE;
-//        _mark_new(true_win);
-//    }
-//
-//    _status_bar_draw();
+    int true_win = win;
+    if (true_win == 0) {
+        true_win = 10;
+    }
+
+    StatusBarTab *tab = malloc(sizeof(StatusBarTab));
+    tab->display_name = strdup(name);
+    tab->highlight = TRUE;
+    g_hash_table_replace(statusbar->tabs, GINT_TO_POINTER(true_win), tab);
+
+    _status_bar_draw();
 }
 
 void
@@ -359,62 +219,19 @@ status_bar_print_message(const char *const msg)
     statusbar->message = strdup(msg);
 
     _status_bar_draw();
-
-//    werase(status_bar);
-//
-//    if (message) {
-//        free(message);
-//    }
-//    message = strdup(msg);
-//
-//    char *time_pref = prefs_get_string(PREF_TIME_STATUSBAR);
-//    gchar *date_fmt = NULL;
-//    if (g_strcmp0(time_pref, "off") == 0) {
-//        date_fmt = g_strdup("");
-//    } else {
-//        date_fmt = g_date_time_format(last_time, time_pref);
-//    }
-//
-//    assert(date_fmt != NULL);
-//    size_t len = strlen(date_fmt);
-//    g_free(date_fmt);
-//    if (g_strcmp0(time_pref, "off") != 0) {
-//        mvwprintw(status_bar, 0, 5 + len, message);
-//    } else {
-//        mvwprintw(status_bar, 0, 1, message);
-//    }
-//    prefs_free_string(time_pref);
-//
-//    int cols = getmaxx(stdscr);
-//    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
-//
-//    wattron(status_bar, bracket_attrs);
-//    mvwprintw(status_bar, 0, cols - 34, _active);
-//    mvwprintw(status_bar, 0, cols - 34 + ((current - 1) * 3), bracket);
-//    wattroff(status_bar, bracket_attrs);
-//
-//    _status_bar_draw();
 }
 
 void
 status_bar_clear(void)
 {
-//    if (message) {
-//        free(message);
-//        message = NULL;
-//    }
-//
-//    werase(status_bar);
-//
-//    int cols = getmaxx(stdscr);
-//    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
-//
-//    wattron(status_bar, bracket_attrs);
-//    mvwprintw(status_bar, 0, cols - 34, _active);
-//    mvwprintw(status_bar, 0, cols - 34 + ((current - 1) * 3), bracket);
-//    wattroff(status_bar, bracket_attrs);
-//
-//    _status_bar_draw();
+    if (statusbar->message) {
+        free(statusbar->message);
+        statusbar->message = NULL;
+    }
+
+    werase(statusbar_win);
+
+    _status_bar_draw();
 }
 
 void
@@ -428,66 +245,43 @@ status_bar_clear_message(void)
     _status_bar_draw();
 }
 
-//static void
-//_update_win_statuses(void)
-//{
-//    int i;
-//    for(i = 1; i < 12; i++) {
-//        if (is_new[i]) {
-//            _mark_new(i);
-//        }
-//        else if (is_active[i]) {
-//            _mark_active(i);
-//        }
-//        else {
-//            _mark_inactive(i);
-//        }
-//    }
-//}
-
-//static void
-//_mark_new(int num)
-//{
-//    int active_pos = 1 + ((num-1) * 3);
-//    int cols = getmaxx(stdscr);
-//    int status_attrs = theme_attrs(THEME_STATUS_NEW);
-//    wattron(status_bar, status_attrs);
-//    wattron(status_bar, A_BLINK);
-//    if (num == 10) {
-//        mvwprintw(status_bar, 0, cols - 34 + active_pos, "0");
-//    } else if (num > 10) {
-//        mvwprintw(status_bar, 0, cols - 34 + active_pos, ">");
-//    } else {
-//        mvwprintw(status_bar, 0, cols - 34 + active_pos, "%d", num);
-//    }
-//    wattroff(status_bar, status_attrs);
-//    wattroff(status_bar, A_BLINK);
-//}
-
-//static void
-//_mark_active(int num)
-//{
-//    int active_pos = 1 + ((num-1) * 3);
-//    int cols = getmaxx(stdscr);
-//    int status_attrs = theme_attrs(THEME_STATUS_ACTIVE);
-//    wattron(status_bar, status_attrs);
-//    if (num == 10) {
-//        mvwprintw(status_bar, 0, cols - 34 + active_pos, "0");
-//    } else if (num > 10) {
-//        mvwprintw(status_bar, 0, cols - 34 + active_pos, ">");
-//    } else {
-//        mvwprintw(status_bar, 0, cols - 34 + active_pos, "%d", num);
-//    }
-//    wattroff(status_bar, status_attrs);
-//}
-
-//static void
-//_mark_inactive(int num)
-//{
-//    int active_pos = 1 + ((num-1) * 3);
-//    int cols = getmaxx(stdscr);
-//    mvwaddch(status_bar, 0, cols - 34 + active_pos, ' ');
-//}
+static int
+_tabs_width(void)
+{
+    if (SHOW_NAME) {
+        if (SHOW_EMPTY_TABS) {
+            int width = 4;
+            int i = 0;
+            for (i = 1; i <= MAX_TABS; i++) {
+                StatusBarTab *tab = g_hash_table_lookup(statusbar->tabs, GINT_TO_POINTER(i));
+                if (tab) {
+                    width += strlen(tab->display_name);
+                    width += 4;
+                } else {
+                    width += 3;
+                }
+            }
+            return width;
+        } else {
+            int width = 4;
+            int i = 0;
+            for (i = 1; i <= MAX_TABS; i++) {
+                StatusBarTab *tab = g_hash_table_lookup(statusbar->tabs, GINT_TO_POINTER(i));
+                if (tab) {
+                    width += strlen(tab->display_name);
+                    width += 4;
+                }
+            }
+            return width;
+        }
+    } else {
+        if (SHOW_EMPTY_TABS) {
+            return MAX_TABS * 3 + 4;
+        } else {
+            return g_hash_table_size(statusbar->tabs) * 3 + 4;
+        }
+    }
+}
 
 static void
 _status_bar_draw(void)
@@ -538,36 +332,77 @@ _status_bar_draw(void)
     }
     prefs_free_string(time_pref);
 
+    // tabs
+    int cols = getmaxx(stdscr);
+    pos = cols - _tabs_width();
+    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
+
+    int i = 1;
+    for (i = 1; i <= MAX_TABS; i++) {
+        int display_num = i == 10 ? 0 : i;
+
+        StatusBarTab *tab = g_hash_table_lookup(statusbar->tabs, GINT_TO_POINTER(i));
+        if (tab || (tab == NULL && SHOW_EMPTY_TABS)) {
+            wattron(statusbar_win, bracket_attrs);
+            if (i == statusbar->current_tab) {
+                mvwprintw(statusbar_win, 0, pos, "-");
+            } else {
+                mvwprintw(statusbar_win, 0, pos, "[");
+            }
+            wattroff(statusbar_win, bracket_attrs);
+            pos++;
+            if (tab) {
+                if (tab->highlight) {
+                    int status_attrs = theme_attrs(THEME_STATUS_NEW);
+                    wattron(statusbar_win, status_attrs);
+                    mvwprintw(statusbar_win, 0, pos, "%d", display_num);
+                    if (SHOW_NAME) {
+                        pos++;
+                        mvwprintw(statusbar_win, 0, pos, ":");
+                        pos++;
+                        mvwprintw(statusbar_win, 0, pos, tab->display_name);
+                        pos += strlen(tab->display_name) -1 ;
+                    }
+                    wattroff(statusbar_win, status_attrs);
+                } else {
+                    int status_attrs = theme_attrs(THEME_STATUS_ACTIVE);
+                    wattron(statusbar_win, status_attrs);
+                    mvwprintw(statusbar_win, 0, pos, "%d", display_num);
+                    if (SHOW_NAME) {
+                        pos++;
+                        mvwprintw(statusbar_win, 0, pos, ":");
+                        pos++;
+                        mvwprintw(statusbar_win, 0, pos, tab->display_name);
+                        pos += strlen(tab->display_name) - 1;
+                    }
+                    wattroff(statusbar_win, status_attrs);
+                }
+            } else {
+                mvwprintw(statusbar_win, 0, pos, " ");
+            }
+            pos++;
+            wattron(statusbar_win, bracket_attrs);
+            if (i == statusbar->current_tab) {
+                mvwprintw(statusbar_win, 0, pos, "-");
+            } else {
+                mvwprintw(statusbar_win, 0, pos, "]");
+            }
+            pos++;
+            wattroff(statusbar_win, bracket_attrs);
+        }
+    }
+
+    wattron(statusbar_win, bracket_attrs);
+    mvwprintw(statusbar_win, 0, pos, "[");
+    wattroff(statusbar_win, bracket_attrs);
+    pos++;
+    mvwprintw(statusbar_win, 0, pos, " ");
+    pos++;
+    wattron(statusbar_win, bracket_attrs);
+    mvwprintw(statusbar_win, 0, pos, "]");
+    wattroff(statusbar_win, bracket_attrs);
+    pos++;
+
     wnoutrefresh(statusbar_win);
     inp_put_back();
-
-//    if (last_time) {
-//        g_date_time_unref(last_time);
-//    }
-//    last_time = g_date_time_new_now(tz);
-//
-//    int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
-//    int time_attrs = theme_attrs(THEME_STATUS_TIME);
-//
-//    char *time_pref = prefs_get_string(PREF_TIME_STATUSBAR);
-//    if (g_strcmp0(time_pref, "off") != 0) {
-//        gchar *date_fmt = g_date_time_format(last_time, time_pref);
-//        assert(date_fmt != NULL);
-//        size_t len = strlen(date_fmt);
-//        wattron(status_bar, bracket_attrs);
-//        mvwaddch(status_bar, 0, 1, '[');
-//        wattroff(status_bar, bracket_attrs);
-//        wattron(status_bar, time_attrs);
-//        mvwprintw(status_bar, 0, 2, date_fmt);
-//        wattroff(status_bar, time_attrs);
-//        wattron(status_bar, bracket_attrs);
-//        mvwaddch(status_bar, 0, 2 + len, ']');
-//        wattroff(status_bar, bracket_attrs);
-//        g_free(date_fmt);
-//    }
-//    prefs_free_string(time_pref);
-//
-//    _update_win_statuses();
-//    wnoutrefresh(status_bar);
-//    inp_put_back();
 }