about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2018-03-08 19:55:17 +0000
committerJames Booth <boothj5@gmail.com>2018-03-08 20:01:36 +0000
commit119c5650cf1b40d3074faae1a280e8d3dfbedc03 (patch)
tree4e2adf06fbf86458cb5113666260d560c056a797
parent1215ec9bc8c11c8f31a3eb9508b23ab349336ca7 (diff)
downloadprofani-tty-119c5650cf1b40d3074faae1a280e8d3dfbedc03.tar.gz
Show name in statusbar tabs WIP
-rw-r--r--src/command/cmd_funcs.c2
-rw-r--r--src/event/server_events.c4
-rw-r--r--src/plugins/api.c2
-rw-r--r--src/ui/chatwin.c14
-rw-r--r--src/ui/console.c2
-rw-r--r--src/ui/core.c20
-rw-r--r--src/ui/mucwin.c12
-rw-r--r--src/ui/privwin.c4
-rw-r--r--src/ui/statusbar.c533
-rw-r--r--src/ui/ui.h4
-rw-r--r--src/ui/win_types.h3
-rw-r--r--src/ui/window.c14
-rw-r--r--src/ui/window_list.c21
-rw-r--r--tests/unittests/ui/stub_ui.c4
14 files changed, 243 insertions, 396 deletions
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 53c8b9ed..b4840afd 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -2095,7 +2095,7 @@ cmd_who(ProfWin *window, const char *const command, gchar **args)
     }
 
     if (window->type != WIN_CONSOLE && window->type != WIN_MUC) {
-        status_bar_new(1);
+        status_bar_new(1, "console");
     }
 
     return TRUE;
diff --git a/src/event/server_events.c b/src/event/server_events.c
index efd8756d..230184e7 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -282,7 +282,7 @@ sv_ev_room_message(const char *const room_jid, const char *const nick, const cha
     // currently in groupchat window
     if (wins_is_current(window)) {
         is_current = TRUE;
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
 
         if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_BEEP))) {
             beep();
@@ -290,7 +290,7 @@ sv_ev_room_message(const char *const room_jid, const char *const nick, const cha
 
     // not currently on groupchat window
     } else {
-        status_bar_new(num);
+        status_bar_new(num, window->tab_name);
 
         if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_FLASH))) {
             flash();
diff --git a/src/plugins/api.c b/src/plugins/api.c
index 0ca58452..e75dccf1 100644
--- a/src/plugins/api.c
+++ b/src/plugins/api.c
@@ -333,7 +333,7 @@ api_win_create(
     // set status bar active
     ProfPluginWin *pluginwin = wins_get_plugin(tag);
     int num = wins_get_num((ProfWin*)pluginwin);
-    status_bar_active(num);
+    status_bar_active(num, pluginwin->plugin_name);
 }
 
 int
diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c
index ad62c6c7..29c8cff4 100644
--- a/src/ui/chatwin.c
+++ b/src/ui/chatwin.c
@@ -105,7 +105,7 @@ chatwin_otr_secured(ProfChatWin *chatwin, gboolean trusted)
          title_bar_switch();
     } else {
         int num = wins_get_num(window);
-        status_bar_new(num);
+        status_bar_new(num, window->tab_name);
 
         int ui_index = num;
         if (ui_index == 10) {
@@ -249,11 +249,11 @@ chatwin_incoming_msg(ProfChatWin *chatwin, const char *const resource, const cha
     if (wins_is_current(window)) {
         win_print_incoming(window, timestamp, display_name, plugin_message, enc_mode);
         title_bar_set_typing(FALSE);
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
 
     // not currently viewing chat window with sender
     } else {
-        status_bar_new(num);
+        status_bar_new(num, window->tab_name);
         cons_show_incoming_message(display_name, num, chatwin->unread);
 
         if (prefs_get_boolean(PREF_FLASH)) {
@@ -324,9 +324,11 @@ chatwin_outgoing_carbon(ProfChatWin *chatwin, const char *const message, prof_en
         enc_char = prefs_get_pgp_char();
     }
 
-    win_print_outgoing((ProfWin*)chatwin, enc_char, "%s", message);
-    int num = wins_get_num((ProfWin*)chatwin);
-    status_bar_active(num);
+    ProfWin *window = (ProfWin*)chatwin;
+
+    win_print_outgoing(window, enc_char, "%s", message);
+    int num = wins_get_num(window);
+    status_bar_active(num, window->tab_name);
 }
 
 void
diff --git a/src/ui/console.c b/src/ui/console.c
index e646cf85..55bba1c5 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -2161,7 +2161,7 @@ cons_alert(void)
 {
     ProfWin *current = wins_get_current();
     if (current->type != WIN_CONSOLE) {
-        status_bar_new(1);
+        status_bar_new(1, "console");
     }
 }
 
diff --git a/src/ui/core.c b/src/ui/core.c
index 9c26750a..67205f73 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -103,7 +103,7 @@ ui_init(void)
     refresh();
     create_title_bar();
     status_bar_init();
-    status_bar_active(1);
+    status_bar_active(1, "console");
     create_input_window();
     wins_init();
     notifier_initialise();
@@ -287,7 +287,7 @@ ui_contact_typing(const char *const barejid, const char *const resource)
             title_bar_set_typing(TRUE);
 
             int num = wins_get_num(window);
-            status_bar_active(num);
+            status_bar_active(num, window->tab_name);
        }
     }
 
@@ -673,7 +673,7 @@ ui_focus_win(ProfWin *window)
         title_bar_switch();
     }
     status_bar_current(i);
-    status_bar_active(i);
+    status_bar_active(i, window->tab_name);
 }
 
 void
@@ -690,7 +690,7 @@ ui_close_win(int index)
     wins_close_by_num(index);
     title_bar_console();
     status_bar_current(1);
-    status_bar_active(1);
+    status_bar_active(1, "console");
 }
 
 void
@@ -738,17 +738,18 @@ ui_print_system_msg_from_recipient(const char *const barejid, const char *messag
     if (barejid == NULL || message == NULL)
         return;
 
-    ProfWin *window = (ProfWin*)wins_get_chat(barejid);
+    ProfChatWin *chatwin = wins_get_chat(barejid);
+    ProfWin *window = (ProfWin*)chatwin;
     if (window == NULL) {
         int num = 0;
         window = wins_new_chat(barejid);
         if (window) {
             num = wins_get_num(window);
-            status_bar_active(num);
+            status_bar_active(num, window->tab_name);
         } else {
             num = 0;
             window = wins_get_console();
-            status_bar_active(1);
+            status_bar_active(1, window->tab_name);
         }
     }
 
@@ -758,7 +759,8 @@ ui_print_system_msg_from_recipient(const char *const barejid, const char *messag
 void
 ui_room_join(const char *const roomjid, gboolean focus)
 {
-    ProfWin *window = (ProfWin*)wins_get_muc(roomjid);
+    ProfMucWin *mucwin = wins_get_muc(roomjid);
+    ProfWin *window = (ProfWin*)mucwin;
     if (!window) {
         window = wins_new_muc(roomjid);
     }
@@ -781,7 +783,7 @@ ui_room_join(const char *const roomjid, gboolean focus)
         ui_focus_win(window);
     } else {
         int num = wins_get_num(window);
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
         ProfWin *console = wins_get_console();
         char *nick = muc_nick(roomjid);
         win_println(console, THEME_TYPING, '!', "-> Autojoined %s as %s (%d).", roomjid, nick, num);
diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c
index 15564ed8..10575915 100644
--- a/src/ui/mucwin.c
+++ b/src/ui/mucwin.c
@@ -519,11 +519,11 @@ mucwin_requires_config(ProfMucWin *mucwin)
 
     // currently in groupchat window
     if (wins_is_current(window)) {
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
 
     // not currently on groupchat window
     } else {
-        status_bar_new(num);
+        status_bar_new(num, window->tab_name);
     }
 }
 
@@ -553,11 +553,11 @@ mucwin_subject(ProfMucWin *mucwin, const char *const nick, const char *const sub
 
     // currently in groupchat window
     if (wins_is_current(window)) {
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
 
     // not currently on groupchat window
     } else {
-        status_bar_active(num);
+        status_bar_new(num, window->tab_name);
     }
 }
 
@@ -583,11 +583,11 @@ mucwin_broadcast(ProfMucWin *mucwin, const char *const message)
 
     // currently in groupchat window
     if (wins_is_current(window)) {
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
 
     // not currently on groupchat window
     } else {
-        status_bar_new(num);
+        status_bar_new(num, window->tab_name);
     }
 }
 
diff --git a/src/ui/privwin.c b/src/ui/privwin.c
index 675ca061..76c95fb8 100644
--- a/src/ui/privwin.c
+++ b/src/ui/privwin.c
@@ -62,11 +62,11 @@ privwin_incoming_msg(ProfPrivateWin *privatewin, const char *const message, GDat
     if (wins_is_current(window)) {
         win_print_incoming(window, timestamp, jidp->resourcepart, message, PROF_MSG_PLAIN);
         title_bar_set_typing(FALSE);
-        status_bar_active(num);
+        status_bar_active(num, window->tab_name);
 
     // not currently viewing chat window with sender
     } else {
-        status_bar_new(num);
+        status_bar_new(num, window->tab_name);
         cons_show_incoming_private_message(jidp->resourcepart, jidp->barejid, num, privatewin->unread);
         win_print_incoming(window, timestamp, jidp->resourcepart, message, PROF_MSG_PLAIN);
 
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();
 }
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 9168f58a..5d779df6 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -331,8 +331,8 @@ void title_bar_set_presence(contact_presence_t presence);
 
 // status bar
 void status_bar_inactive(const int win);
-void status_bar_active(const int win);
-void status_bar_new(const int win);
+void status_bar_active(const int win, char *name);
+void status_bar_new(const int win, char *name);
 void status_bar_set_all_inactive(void);
 
 // roster window
diff --git a/src/ui/win_types.h b/src/ui/win_types.h
index 3eb48b29..284dbc1f 100644
--- a/src/ui/win_types.h
+++ b/src/ui/win_types.h
@@ -136,6 +136,7 @@ typedef enum {
 
 typedef struct prof_win_t {
     win_type_t type;
+    char *tab_name;
     ProfLayout *layout;
 } ProfWin;
 
@@ -194,7 +195,7 @@ typedef struct prof_xml_win_t {
 } ProfXMLWin;
 
 typedef struct prof_plugin_win_t {
-    ProfWin super;
+    ProfWin window;
     char *tag;
     char *plugin_name;
     unsigned long memcheck;
diff --git a/src/ui/window.c b/src/ui/window.c
index 2ca5621c..83da1219 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -125,6 +125,7 @@ win_create_console(void)
 {
     ProfConsoleWin *new_win = malloc(sizeof(ProfConsoleWin));
     new_win->window.type = WIN_CONSOLE;
+    new_win->window.tab_name = strdup("console");
     new_win->window.layout = _win_create_split_layout();
 
     return &new_win->window;
@@ -135,6 +136,7 @@ win_create_chat(const char *const barejid)
 {
     ProfChatWin *new_win = malloc(sizeof(ProfChatWin));
     new_win->window.type = WIN_CHAT;
+    new_win->window.tab_name = strdup(barejid);
     new_win->window.layout = _win_create_simple_layout();
 
     new_win->barejid = strdup(barejid);
@@ -162,6 +164,7 @@ win_create_muc(const char *const roomjid)
     int cols = getmaxx(stdscr);
 
     new_win->window.type = WIN_MUC;
+    new_win->window.tab_name = strdup(roomjid);
 
     ProfLayoutSplit *layout = malloc(sizeof(ProfLayoutSplit));
     layout->base.type = LAYOUT_SPLIT;
@@ -207,6 +210,7 @@ win_create_muc_config(const char *const roomjid, DataForm *form)
 {
     ProfMucConfWin *new_win = malloc(sizeof(ProfMucConfWin));
     new_win->window.type = WIN_MUC_CONFIG;
+    new_win->window.tab_name = strdup(roomjid);
     new_win->window.layout = _win_create_simple_layout();
 
     new_win->roomjid = strdup(roomjid);
@@ -222,6 +226,7 @@ win_create_private(const char *const fulljid)
 {
     ProfPrivateWin *new_win = malloc(sizeof(ProfPrivateWin));
     new_win->window.type = WIN_PRIVATE;
+    new_win->window.tab_name = strdup(fulljid);
     new_win->window.layout = _win_create_simple_layout();
 
     new_win->fulljid = strdup(fulljid);
@@ -239,6 +244,7 @@ win_create_xmlconsole(void)
 {
     ProfXMLWin *new_win = malloc(sizeof(ProfXMLWin));
     new_win->window.type = WIN_XML;
+    new_win->window.tab_name = strdup("xmlconsole");
     new_win->window.layout = _win_create_simple_layout();
 
     new_win->memcheck = PROFXMLWIN_MEMCHECK;
@@ -250,15 +256,16 @@ ProfWin*
 win_create_plugin(const char *const plugin_name, const char *const tag)
 {
     ProfPluginWin *new_win = malloc(sizeof(ProfPluginWin));
-    new_win->super.type = WIN_PLUGIN;
-    new_win->super.layout = _win_create_simple_layout();
+    new_win->window.type = WIN_PLUGIN;
+    new_win->window.tab_name = strdup(plugin_name);
+    new_win->window.layout = _win_create_simple_layout();
 
     new_win->tag = strdup(tag);
     new_win->plugin_name = strdup(plugin_name);
 
     new_win->memcheck = PROFPLUGINWIN_MEMCHECK;
 
-    return &new_win->super;
+    return &new_win->window;
 }
 
 char*
@@ -416,6 +423,7 @@ win_show_subwin(ProfWin *window)
 void
 win_free(ProfWin* window)
 {
+    free(window->tab_name);
     if (window->layout->type == LAYOUT_SPLIT) {
         ProfLayoutSplit *layout = (ProfLayoutSplit*)window->layout;
         if (layout->subwin) {
diff --git a/src/ui/window_list.c b/src/ui/window_list.c
index 8c3c4739..640196b5 100644
--- a/src/ui/window_list.c
+++ b/src/ui/window_list.c
@@ -45,7 +45,6 @@
 #include "config/theme.h"
 #include "plugins/plugins.h"
 #include "ui/ui.h"
-#include "ui/statusbar.h"
 #include "ui/window_list.h"
 #include "xmpp/xmpp.h"
 #include "xmpp/roster_list.h"
@@ -862,9 +861,9 @@ wins_swap(int source_win, int target_win)
             g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source);
             status_bar_inactive(source_win);
             if (win_unread(source) > 0) {
-                status_bar_new(target_win);
+                status_bar_new(target_win, source->tab_name);
             } else {
-                status_bar_active(target_win);
+                status_bar_active(target_win, source->tab_name);
             }
             if (wins_get_current_num() == source_win) {
                 wins_set_current_by_num(target_win);
@@ -879,14 +878,14 @@ wins_swap(int source_win, int target_win)
             g_hash_table_insert(windows, GINT_TO_POINTER(source_win), target);
             g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source);
             if (win_unread(source) > 0) {
-                status_bar_new(target_win);
+                status_bar_new(target_win, source->tab_name);
             } else {
-                status_bar_active(target_win);
+                status_bar_active(target_win, source->tab_name);
             }
             if (win_unread(target) > 0) {
-                status_bar_new(source_win);
+                status_bar_new(source_win, target->tab_name);
             } else {
-                status_bar_active(source_win);
+                status_bar_active(source_win, target->tab_name);
             }
             if ((wins_get_current_num() == source_win) || (wins_get_current_num() == target_win)) {
                 ui_focus_win(console);
@@ -1003,16 +1002,16 @@ wins_tidy(void)
             if (num == 10) {
                 g_hash_table_insert(new_windows, GINT_TO_POINTER(0), window);
                 if (win_unread(window) > 0) {
-                    status_bar_new(0);
+                    status_bar_new(0, window->tab_name);
                 } else {
-                    status_bar_active(0);
+                    status_bar_active(0, window->tab_name);
                 }
             } else {
                 g_hash_table_insert(new_windows, GINT_TO_POINTER(num), window);
                 if (win_unread(window) > 0) {
-                    status_bar_new(num);
+                    status_bar_new(num, window->tab_name);
                 } else {
-                    status_bar_active(num);
+                    status_bar_active(num, window->tab_name);
                 }
             }
             num++;
diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c
index 51e8d84a..e31e88f5 100644
--- a/tests/unittests/ui/stub_ui.c
+++ b/tests/unittests/ui/stub_ui.c
@@ -466,8 +466,8 @@ void title_bar_set_presence(contact_presence_t presence) {}
 
 // status bar
 void status_bar_inactive(const int win) {}
-void status_bar_active(const int win) {}
-void status_bar_new(const int win) {}
+void status_bar_active(const int win, char *name) {}
+void status_bar_new(const int win, char *name) {}
 void status_bar_set_all_inactive(void) {}
 
 // roster window