diff options
Diffstat (limited to 'src/ui/statusbar.c')
-rw-r--r-- | src/ui/statusbar.c | 533 |
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(); } |