diff options
Diffstat (limited to 'src/wins.c')
-rw-r--r-- | src/wins.c | 878 |
1 files changed, 409 insertions, 469 deletions
@@ -1,7 +1,7 @@ /* * Calcurse - text-based organizer * - * Copyright (c) 2004-2011 calcurse Development Team <misc@calcurse.org> + * Copyright (c) 2004-2012 calcurse Development Team <misc@calcurse.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,7 +44,7 @@ struct window win[NBWINS]; /* User-configurable side bar width. */ -static unsigned sbarwidth; +static unsigned sbarwidth_perc; static enum win slctd_win; static int layout; @@ -63,93 +63,85 @@ static int layout; */ static pthread_mutex_t screen_mutex = PTHREAD_MUTEX_INITIALIZER; -static unsigned -screen_acquire (void) +static unsigned screen_acquire(void) { - if (pthread_mutex_lock (&screen_mutex) != 0) + if (pthread_mutex_lock(&screen_mutex) != 0) return 0; else return 1; } -static void -screen_release (void) +static void screen_release(void) { - (void)pthread_mutex_unlock (&screen_mutex); + pthread_mutex_unlock(&screen_mutex); } -int -wins_refresh (void) +int wins_refresh(void) { int rc; - if (!screen_acquire ()) + if (!screen_acquire()) return ERR; - rc = refresh (); - screen_release (); + rc = refresh(); + screen_release(); return rc; } -int -wins_wrefresh (WINDOW *win) +int wins_wrefresh(WINDOW * win) { int rc; - if (!win || !screen_acquire ()) + if (!win || !screen_acquire()) return ERR; - rc = wrefresh (win); - screen_release (); + rc = wrefresh(win); + screen_release(); return rc; } -int -wins_doupdate (void) +int wins_doupdate(void) { int rc; - if (!screen_acquire ()) + if (!screen_acquire()) return ERR; - rc = doupdate (); - screen_release (); + rc = doupdate(); + screen_release(); return rc; } /* Get the current layout. */ -int -wins_layout (void) +int wins_layout(void) { return layout; } /* Set the current layout. */ -void -wins_set_layout (int nb) +void wins_set_layout(int nb) { layout = nb; } /* Get the current side bar width. */ -unsigned -wins_sbar_width (void) +unsigned wins_sbar_width(void) { - return sbarwidth ? sbarwidth : SBARMINWIDTH; + if (sbarwidth_perc > SBARMAXWIDTHPERC) + return col * SBARMAXWIDTHPERC / 100; + else { + unsigned sbarwidth = (unsigned)(col * sbarwidth_perc / 100); + return (sbarwidth < SBARMINWIDTH) ? SBARMINWIDTH : sbarwidth; + } } /* * Return the side bar width in percentage of the total number of columns * available in calcurse's screen. */ -unsigned -wins_sbar_wperc (void) +unsigned wins_sbar_wperc(void) { - unsigned perc; - - perc = col ? (unsigned)(100 * sbarwidth / col + 1): 0; - - return perc > SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : perc; + return sbarwidth_perc > SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : sbarwidth_perc; } /* @@ -158,62 +150,44 @@ wins_sbar_wperc (void) * The side bar could not have a width representing more than 50% of the screen, * and could not be less than SBARMINWIDTH characters. */ -void -wins_set_sbar_width (unsigned perc) +void wins_set_sbar_width(unsigned perc) { - if (perc > SBARMAXWIDTHPERC) - sbarwidth = col * SBARMAXWIDTHPERC / 100; - else if (perc <= 0) - sbarwidth = SBARMINWIDTH; - else - { - sbarwidth = (unsigned)(col * perc / 100); - if (sbarwidth < SBARMINWIDTH) - sbarwidth = SBARMINWIDTH; - } + sbarwidth_perc = perc; } /* Change the width of the side bar within acceptable boundaries. */ -void -wins_sbar_winc (void) +void wins_sbar_winc(void) { - if (sbarwidth < SBARMINWIDTH) - sbarwidth = SBARMINWIDTH + 1; - else if (sbarwidth < SBARMAXWIDTHPERC * col / 100) - sbarwidth++; + if (sbarwidth_perc < SBARMAXWIDTHPERC) + sbarwidth_perc++; } -void -wins_sbar_wdec (void) +void wins_sbar_wdec(void) { - if (sbarwidth > SBARMINWIDTH) - sbarwidth--; + if (sbarwidth_perc > 0) + sbarwidth_perc--; } /* Initialize the selected window in calcurse's interface. */ -void -wins_slctd_init (void) +void wins_slctd_init(void) { - wins_slctd_set (CAL); + wins_slctd_set(CAL); } /* Returns an enum which corresponds to the window which is selected. */ -enum win -wins_slctd (void) +enum win wins_slctd(void) { - return (slctd_win); + return slctd_win; } /* Sets the selected window. */ -void -wins_slctd_set (enum win window) +void wins_slctd_set(enum win window) { slctd_win = window; } /* TAB key was hit in the interface, need to select next window. */ -void -wins_slctd_next (void) +void wins_slctd_next(void) { if (slctd_win == TOD) slctd_win = CAL; @@ -221,39 +195,32 @@ wins_slctd_next (void) slctd_win++; } -static void -wins_init_panels (void) +static void wins_init_panels(void) { - char label[BUFSIZ]; - - win[CAL].p = newwin (CALHEIGHT, wins_sbar_width (), win[CAL].y, win[CAL].x); - (void)snprintf (label, BUFSIZ, _("Calendar")); - wins_show (win[CAL].p, label); + win[CAL].p = newwin(CALHEIGHT, wins_sbar_width(), win[CAL].y, win[CAL].x); + wins_show(win[CAL].p, _("Calendar")); - win[APP].p = newwin (win[APP].h, win[APP].w, win[APP].y, win[APP].x); - (void)snprintf (label, BUFSIZ, _("Appointments")); - wins_show (win[APP].p, label); + win[APP].p = newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x); + wins_show(win[APP].p, _("Appointments")); apad.width = win[APP].w - 3; - apad.ptrwin = newpad (apad.length, apad.width); + apad.ptrwin = newpad(apad.length, apad.width); - win[TOD].p = newwin (win[TOD].h, win[TOD].w, win[TOD].y, win[TOD].x); - (void)snprintf (label, BUFSIZ, _("ToDo")); - wins_show (win[TOD].p, label); + win[TOD].p = newwin(win[TOD].h, win[TOD].w, win[TOD].y, win[TOD].x); + wins_show(win[TOD].p, _("ToDo")); /* Enable function keys (i.e. arrow keys) in those windows */ - keypad (win[CAL].p, TRUE); - keypad (win[APP].p, TRUE); - keypad (win[TOD].p, TRUE); + keypad(win[CAL].p, TRUE); + keypad(win[APP].p, TRUE); + keypad(win[TOD].p, TRUE); } /* Create all the windows. */ -void -wins_init (void) +void wins_init(void) { - wins_init_panels (); - win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, win[STA].x); + wins_init_panels(); + win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - keypad (win[STA].p, TRUE); + keypad(win[STA].p, TRUE); /* Notify that the curses mode is now launched. */ ui_mode = UI_CURSES; @@ -263,116 +230,105 @@ wins_init (void) * Create a new window and its associated pad, which is used to make the * scrolling faster. */ -void -wins_scrollwin_init (struct scrollwin *sw) +void wins_scrollwin_init(struct scrollwin *sw) { - EXIT_IF (sw == NULL, "null pointer"); - sw->win.p = newwin (sw->win.h, sw->win.w, sw->win.y, sw->win.x); - sw->pad.p = newpad (sw->pad.h, sw->pad.w); + EXIT_IF(sw == NULL, "null pointer"); + sw->win.p = newwin(sw->win.h, sw->win.w, sw->win.y, sw->win.x); + sw->pad.p = newpad(sw->pad.h, sw->pad.w); sw->first_visible_line = 0; sw->total_lines = 0; } /* Free an already created scrollwin. */ -void -wins_scrollwin_delete (struct scrollwin *sw) +void wins_scrollwin_delete(struct scrollwin *sw) { - EXIT_IF (sw == NULL, "null pointer"); + EXIT_IF(sw == NULL, "null pointer"); delwin(sw->win.p); delwin(sw->pad.p); } /* Display a scrolling window. */ -void -wins_scrollwin_display (struct scrollwin *sw) +void wins_scrollwin_display(struct scrollwin *sw) { const int visible_lines = sw->win.h - sw->pad.y - 1; - if (sw->total_lines > visible_lines) - { - float ratio = ((float) visible_lines) / ((float) sw->total_lines); - int sbar_length = (int) (ratio * visible_lines); - int highend = (int) (ratio * sw->first_visible_line); - int sbar_top = highend + sw->pad.y + 1; + if (sw->total_lines > visible_lines) { + float ratio = ((float)visible_lines) / ((float)sw->total_lines); + int sbar_length = (int)(ratio * visible_lines); + int highend = (int)(ratio * sw->first_visible_line); + int sbar_top = highend + sw->pad.y + 1; - if ((sbar_top + sbar_length) > sw->win.h - 1) - sbar_length = sw->win.h - sbar_top; - draw_scrollbar (sw->win.p, sbar_top, sw->win.w + sw->win.x - 2, - sbar_length, sw->pad.y + 1, sw->win.h - 1, 1); - } - wmove (win[STA].p, 0, 0); - wnoutrefresh (sw->win.p); - pnoutrefresh (sw->pad.p, sw->first_visible_line, 0, sw->pad.y, sw->pad.x, - sw->win.h - sw->pad.y + 1, sw->win.w - sw->win.x); - wins_doupdate (); + if ((sbar_top + sbar_length) > sw->win.h - 1) + sbar_length = sw->win.h - sbar_top; + draw_scrollbar(sw->win.p, sbar_top, sw->win.w + sw->win.x - 2, + sbar_length, sw->pad.y + 1, sw->win.h - 1, 1); + } + wmove(win[STA].p, 0, 0); + wnoutrefresh(sw->win.p); + pnoutrefresh(sw->pad.p, sw->first_visible_line, 0, sw->pad.y, sw->pad.x, + sw->win.h - sw->pad.y + 1, sw->win.w - sw->win.x); + wins_doupdate(); } -void -wins_scrollwin_up (struct scrollwin *sw, int amount) +void wins_scrollwin_up(struct scrollwin *sw, int amount) { if (sw->first_visible_line > 0) sw->first_visible_line -= amount; } -void -wins_scrollwin_down (struct scrollwin *sw, int amount) +void wins_scrollwin_down(struct scrollwin *sw, int amount) { - if (sw->total_lines - > (sw->first_visible_line + sw->win.h - sw->pad.y - 1)) + if (sw->total_lines > (sw->first_visible_line + sw->win.h - sw->pad.y - 1)) sw->first_visible_line += amount; } -void -wins_reinit_panels (void) +void wins_reinit_panels(void) { - delwin (win[CAL].p); - delwin (win[APP].p); - delwin (apad.ptrwin); - delwin (win[TOD].p); - wins_get_config (); - wins_init_panels (); + delwin(win[CAL].p); + delwin(win[APP].p); + delwin(apad.ptrwin); + delwin(win[TOD].p); + wins_get_config(); + wins_init_panels(); } /* * Delete the existing windows and recreate them with their new * size and placement. */ -void -wins_reinit (void) +void wins_reinit(void) { - delwin (win[CAL].p); - delwin (win[APP].p); - delwin (apad.ptrwin); - delwin (win[TOD].p); - delwin (win[STA].p); - wins_get_config (); - wins_init (); - if (notify_bar ()) - notify_reinit_bar (); + delwin(win[CAL].p); + delwin(win[APP].p); + delwin(apad.ptrwin); + delwin(win[TOD].p); + delwin(win[STA].p); + wins_get_config(); + wins_init(); + if (notify_bar()) + notify_reinit_bar(); } /* Show the window with a border and a label. */ -void -wins_show (WINDOW *win, char *label) +void wins_show(WINDOW * win, const char *label) { - int width = getmaxx (win); + int width = getmaxx(win); - box (win, 0, 0); - mvwaddch (win, 2, 0, ACS_LTEE); - mvwhline (win, 2, 1, ACS_HLINE, width - 2); - mvwaddch (win, 2, width - 1, ACS_RTEE); + box(win, 0, 0); + mvwaddch(win, 2, 0, ACS_LTEE); + mvwhline(win, 2, 1, ACS_HLINE, width - 2); + mvwaddch(win, 2, width - 1, ACS_RTEE); - print_in_middle (win, 1, 0, width, label); + print_in_middle(win, 1, 0, width, label); } /* * Get the screen size and recalculate the windows configurations. */ -void -wins_get_config (void) +void wins_get_config(void) { /* Get the screen configuration */ - getmaxyx (stdscr, row, col); + getmaxyx(stdscr, row, col); /* fixed values for status, notification bars and calendar */ win[STA].h = STATUSHEIGHT; @@ -380,267 +336,243 @@ wins_get_config (void) win[STA].y = row - win[STA].h; win[STA].x = 0; - if (notify_bar ()) - { - win[NOT].h = 1; - win[NOT].w = col; - win[NOT].y = win[STA].y - 1; - win[NOT].x = 0; - } - else - { - win[NOT].h = 0; - win[NOT].w = 0; - win[NOT].y = 0; - win[NOT].x = 0; - } - - win[CAL].w = wins_sbar_width (); + if (notify_bar()) { + win[NOT].h = 1; + win[NOT].w = col; + win[NOT].y = win[STA].y - 1; + win[NOT].x = 0; + } else { + win[NOT].h = 0; + win[NOT].w = 0; + win[NOT].y = 0; + win[NOT].x = 0; + } + + win[CAL].w = wins_sbar_width(); win[CAL].h = CALHEIGHT; - if (layout <= 4) - { /* APPOINTMENT is the biggest panel */ - win[APP].w = col - win[CAL].w; - win[APP].h = row - (win[STA].h + win[NOT].h); - win[TOD].w = win[CAL].w; - win[TOD].h = row - (win[CAL].h + win[STA].h + win[NOT].h); - } - else - { /* TODO is the biggest panel */ - win[TOD].w = col - win[CAL].w; - win[TOD].h = row - (win[STA].h + win[NOT].h); - win[APP].w = win[CAL].w; - win[APP].h = row - (win[CAL].h + win[STA].h + win[NOT].h); - } + if (layout <= 4) { /* APPOINTMENT is the biggest panel */ + win[APP].w = col - win[CAL].w; + win[APP].h = row - (win[STA].h + win[NOT].h); + win[TOD].w = win[CAL].w; + win[TOD].h = row - (win[CAL].h + win[STA].h + win[NOT].h); + } else { /* TODO is the biggest panel */ + win[TOD].w = col - win[CAL].w; + win[TOD].h = row - (win[STA].h + win[NOT].h); + win[APP].w = win[CAL].w; + win[APP].h = row - (win[CAL].h + win[STA].h + win[NOT].h); + } /* defining the layout */ - switch (layout) - { - case 1: - win[APP].y = 0; - win[APP].x = 0; - win[CAL].y = 0; - win[TOD].x = win[APP].w; - win[TOD].y = win[CAL].h; - win[CAL].x = win[APP].w; - break; - case 2: - win[APP].y = 0; - win[APP].x = 0; - win[TOD].y = 0; - win[TOD].x = win[APP].w; - win[CAL].x = win[APP].w; - win[CAL].y = win[TOD].h; - break; - case 3: - win[APP].y = 0; - win[TOD].x = 0; - win[CAL].x = 0; - win[CAL].y = 0; - win[APP].x = win[CAL].w; - win[TOD].y = win[CAL].h; - break; - case 4: - win[APP].y = 0; - win[TOD].x = 0; - win[TOD].y = 0; - win[CAL].x = 0; - win[APP].x = win[CAL].w; - win[CAL].y = win[TOD].h; - break; - case 5: - win[TOD].y = 0; - win[TOD].x = 0; - win[CAL].y = 0; - win[APP].y = win[CAL].h; - win[APP].x = win[TOD].w; - win[CAL].x = win[TOD].w; - break; - case 6: - win[TOD].y = 0; - win[TOD].x = 0; - win[APP].y = 0; - win[APP].x = win[TOD].w; - win[CAL].x = win[TOD].w; - win[CAL].y = win[APP].h; - break; - case 7: - win[TOD].y = 0; - win[APP].x = 0; - win[CAL].x = 0; - win[CAL].y = 0; - win[TOD].x = win[CAL].w; - win[APP].y = win[CAL].h; - break; - case 8: - win[TOD].y = 0; - win[APP].x = 0; - win[CAL].x = 0; - win[APP].y = 0; - win[TOD].x = win[CAL].w; - win[CAL].y = win[APP].h; - break; - } + switch (layout) { + case 1: + win[APP].y = 0; + win[APP].x = 0; + win[CAL].y = 0; + win[TOD].x = win[APP].w; + win[TOD].y = win[CAL].h; + win[CAL].x = win[APP].w; + break; + case 2: + win[APP].y = 0; + win[APP].x = 0; + win[TOD].y = 0; + win[TOD].x = win[APP].w; + win[CAL].x = win[APP].w; + win[CAL].y = win[TOD].h; + break; + case 3: + win[APP].y = 0; + win[TOD].x = 0; + win[CAL].x = 0; + win[CAL].y = 0; + win[APP].x = win[CAL].w; + win[TOD].y = win[CAL].h; + break; + case 4: + win[APP].y = 0; + win[TOD].x = 0; + win[TOD].y = 0; + win[CAL].x = 0; + win[APP].x = win[CAL].w; + win[CAL].y = win[TOD].h; + break; + case 5: + win[TOD].y = 0; + win[TOD].x = 0; + win[CAL].y = 0; + win[APP].y = win[CAL].h; + win[APP].x = win[TOD].w; + win[CAL].x = win[TOD].w; + break; + case 6: + win[TOD].y = 0; + win[TOD].x = 0; + win[APP].y = 0; + win[APP].x = win[TOD].w; + win[CAL].x = win[TOD].w; + win[CAL].y = win[APP].h; + break; + case 7: + win[TOD].y = 0; + win[APP].x = 0; + win[CAL].x = 0; + win[CAL].y = 0; + win[TOD].x = win[CAL].w; + win[APP].y = win[CAL].h; + break; + case 8: + win[TOD].y = 0; + win[APP].x = 0; + win[CAL].x = 0; + win[APP].y = 0; + win[TOD].x = win[CAL].w; + win[CAL].y = win[APP].h; + break; + } } /* draw panel border in color */ -static void -border_color (WINDOW *window) +static void border_color(WINDOW * window) { int color_attr = A_BOLD; int no_color_attr = A_BOLD; - if (colorize) - { - wattron (window, color_attr | COLOR_PAIR (COLR_CUSTOM)); - box (window, 0, 0); - } - else - { - wattron (window, no_color_attr); - box (window, 0, 0); - } - if (colorize) - { - wattroff (window, color_attr | COLOR_PAIR (COLR_CUSTOM)); - } - else - { - wattroff (window, no_color_attr); - } - wnoutrefresh (window); + if (colorize) { + wattron(window, color_attr | COLOR_PAIR(COLR_CUSTOM)); + box(window, 0, 0); + } else { + wattron(window, no_color_attr); + box(window, 0, 0); + } + if (colorize) { + wattroff(window, color_attr | COLOR_PAIR(COLR_CUSTOM)); + } else { + wattroff(window, no_color_attr); + } + wnoutrefresh(window); } /* draw panel border without any color */ -static void -border_nocolor (WINDOW *window) +static void border_nocolor(WINDOW * window) { int color_attr = A_BOLD; int no_color_attr = A_DIM; - if (colorize) - { - wattron (window, color_attr | COLOR_PAIR (COLR_DEFAULT)); - } - else - { - wattron (window, no_color_attr); - } - box (window, 0, 0); - if (colorize) - { - wattroff (window, color_attr | COLOR_PAIR (COLR_DEFAULT)); - } - else - { - wattroff (window, no_color_attr); - } - wnoutrefresh (window); -} - -void -wins_update_border (void) -{ - switch (slctd_win) - { - case CAL: - border_color (win[CAL].p); - border_nocolor (win[APP].p); - border_nocolor (win[TOD].p); - break; - case APP: - border_color (win[APP].p); - border_nocolor (win[CAL].p); - border_nocolor (win[TOD].p); - break; - case TOD: - border_color (win[TOD].p); - border_nocolor (win[APP].p); - border_nocolor (win[CAL].p); - break; - default: - EXIT (_("no window selected")); - /* NOTREACHED */ - } -} - -void -wins_update_panels (void) -{ - apoint_update_panel (slctd_win); - todo_update_panel (slctd_win); - calendar_update_panel (&win[CAL]); + if (colorize) { + wattron(window, color_attr | COLOR_PAIR(COLR_DEFAULT)); + } else { + wattron(window, no_color_attr); + } + box(window, 0, 0); + if (colorize) { + wattroff(window, color_attr | COLOR_PAIR(COLR_DEFAULT)); + } else { + wattroff(window, no_color_attr); + } + wnoutrefresh(window); +} + +void wins_update_border(int flags) +{ + if (flags & FLAG_CAL) { + if (slctd_win == CAL) + border_color(win[CAL].p); + else + border_nocolor(win[CAL].p); + } + if (flags & FLAG_APP) { + if (slctd_win == APP) + border_color(win[APP].p); + else + border_nocolor(win[APP].p); + } + if (flags & FLAG_TOD) { + if (slctd_win == TOD) + border_color(win[TOD].p); + else + border_nocolor(win[TOD].p); + } +} + +void wins_update_panels(int flags) +{ + if (flags & FLAG_APP) + apoint_update_panel(slctd_win); + if (flags & FLAG_TOD) + todo_update_panel(slctd_win); + if (flags & FLAG_CAL) + calendar_update_panel(&win[CAL]); } /* * Update all of the three windows and put a border around the * selected window. */ -void -wins_update (void) +void wins_update(int flags) { - wins_update_border (); - wins_update_panels (); - wins_status_bar (); - if (notify_bar ()) - notify_update_bar (); - wmove (win[STA].p, 0, 0); - wins_doupdate (); + wins_update_border(flags); + wins_update_panels(flags); + if (flags & FLAG_STA) + wins_status_bar(); + if ((flags & FLAG_NOT) && notify_bar()) + notify_update_bar(); + wmove(win[STA].p, 0, 0); + wins_doupdate(); } /* Reset the screen, needed when resizing terminal for example. */ -void -wins_reset (void) +void wins_reset(void) { - endwin (); - wins_refresh (); - curs_set (0); - wins_reinit (); - wins_update (); + endwin(); + wins_refresh(); + curs_set(0); + wins_reinit(); + wins_update(FLAG_ALL); +} + +/* Prepare windows for the execution of an external command. */ +void wins_prepare_external(void) +{ + if (notify_bar()) + notify_stop_main_thread(); + def_prog_mode(); + ui_mode = UI_CMDLINE; + clear(); + wins_refresh(); + endwin(); +} + +/* Restore windows when returning from an external command. */ +void wins_unprepare_external(void) +{ + reset_prog_mode(); + clearok(curscr, TRUE); + curs_set(0); + ui_mode = UI_CURSES; + wins_refresh(); + if (notify_bar()) + notify_start_main_thread(); } /* * While inside interactive mode, launch the external command cmd on the given * file. */ -void -wins_launch_external (const char *file, const char *cmd) -{ - char *p; - int len; - - /* Beware of space between cmd and file. */ - len = strlen (file) + strlen (cmd) + 2; - - p = (char *) mem_calloc (len, sizeof (char)); - if (snprintf (p, len, "%s %s", cmd, file) == -1) - { - mem_free (p); - return; - } - if (notify_bar ()) - notify_stop_main_thread (); - def_prog_mode (); - endwin (); - ui_mode = UI_CMDLINE; - clear (); - wins_refresh (); - (void)system (p); - reset_prog_mode (); - clearok (curscr, TRUE); - curs_set (0); - ui_mode = UI_CURSES; - wins_refresh (); - if (notify_bar ()) - notify_start_main_thread (); - mem_free (p); +void wins_launch_external(const char *file, const char *cmd) +{ + const char *arg[] = { cmd, file, NULL }; + int pid; + + wins_prepare_external(); + if ((pid = shell_exec(NULL, NULL, *arg, arg))) + child_wait(NULL, NULL, pid); + wins_unprepare_external(); } -#define NB_CAL_CMDS 27 /* number of commands while in cal view */ -#define NB_APP_CMDS 31 /* same thing while in appointment view */ -#define NB_TOD_CMDS 30 /* same thing while in todo view */ -#define TOTAL_CMDS NB_CAL_CMDS + NB_APP_CMDS + NB_TOD_CMDS -#define CMDS_PER_LINE 6 /* max number of commands per line */ +#define NB_CAL_CMDS 27 /* number of commands while in cal view */ +#define NB_APP_CMDS 32 /* same thing while in appointment view */ +#define NB_TOD_CMDS 31 /* same thing while in todo view */ static unsigned status_page; @@ -650,114 +582,124 @@ static unsigned status_page; * table, and update the NB_CAL_CMDS, NB_APP_CMDS or NB_TOD_CMDS defines, * depending on which panel the added keybind is assigned to. */ -void -wins_status_bar (void) -{ -#define NB_PANELS 3 /* 3 panels: CALENDAR, APPOINTMENT, TODO */ - enum win which_pan; - int start, end; - const int pos[NB_PANELS + 1] = - { 0, NB_CAL_CMDS, NB_CAL_CMDS + NB_APP_CMDS, TOTAL_CMDS }; - - struct binding help = {_("Help"), KEY_GENERIC_HELP}; - struct binding quit = {_("Quit"), KEY_GENERIC_QUIT}; - struct binding save = {_("Save"), KEY_GENERIC_SAVE}; - struct binding cut = {_("Cut"), KEY_GENERIC_CUT}; - struct binding paste = {_("Paste"), KEY_GENERIC_PASTE}; - struct binding chgvu = {_("Chg Win"), KEY_GENERIC_CHANGE_VIEW}; - struct binding import = {_("Import"), KEY_GENERIC_IMPORT}; - struct binding export = {_("Export"), KEY_GENERIC_EXPORT}; - struct binding togo = {_("Go to"), KEY_GENERIC_GOTO}; - struct binding othr = {_("OtherCmd"), KEY_GENERIC_OTHER_CMD}; - struct binding conf = {_("Config"), KEY_GENERIC_CONFIG_MENU}; - struct binding draw = {_("Redraw"), KEY_GENERIC_REDRAW}; - struct binding appt = {_("Add Appt"), KEY_GENERIC_ADD_APPT}; - struct binding todo = {_("Add Todo"), KEY_GENERIC_ADD_TODO}; - struct binding gnday = {_("+1 Day"), KEY_GENERIC_NEXT_DAY}; - struct binding gpday = {_("-1 Day"), KEY_GENERIC_PREV_DAY}; - struct binding gnweek = {_("+1 Week"), KEY_GENERIC_NEXT_WEEK}; - struct binding gpweek = {_("-1 Week"), KEY_GENERIC_PREV_WEEK}; - struct binding today = {_("Today"), KEY_GENERIC_GOTO_TODAY}; - struct binding nview = {_("Nxt View"), KEY_GENERIC_SCROLL_DOWN}; - struct binding pview = {_("Prv View"), KEY_GENERIC_SCROLL_UP}; - struct binding up = {_("Up"), KEY_MOVE_UP}; - struct binding down = {_("Down"), KEY_MOVE_DOWN}; - struct binding left = {_("Left"), KEY_MOVE_LEFT}; - struct binding right = {_("Right"), KEY_MOVE_RIGHT}; - struct binding weekb = {_("beg Week"), KEY_START_OF_WEEK}; - struct binding weeke = {_("end Week"), KEY_END_OF_WEEK}; - struct binding add = {_("Add Item"), KEY_ADD_ITEM}; - struct binding del = {_("Del Item"), KEY_DEL_ITEM}; - struct binding edit = {_("Edit Itm"), KEY_EDIT_ITEM}; - struct binding view = {_("View"), KEY_VIEW_ITEM}; - struct binding flag = {_("Flag Itm"), KEY_FLAG_ITEM}; - struct binding rept = {_("Repeat"), KEY_REPEAT_ITEM}; - struct binding enote = {_("EditNote"), KEY_EDIT_NOTE}; - struct binding vnote = {_("ViewNote"), KEY_VIEW_NOTE}; - struct binding rprio = {_("Prio.+"), KEY_RAISE_PRIORITY}; - struct binding lprio = {_("Prio.-"), KEY_LOWER_PRIORITY}; - - struct binding *binding[TOTAL_CMDS] = { - /* calendar keys */ +void wins_status_bar(void) +{ + struct binding help = { _("Help"), KEY_GENERIC_HELP }; + struct binding quit = { _("Quit"), KEY_GENERIC_QUIT }; + struct binding save = { _("Save"), KEY_GENERIC_SAVE }; + struct binding cut = { _("Cut"), KEY_GENERIC_CUT }; + struct binding paste = { _("Paste"), KEY_GENERIC_PASTE }; + struct binding chgvu = { _("Chg Win"), KEY_GENERIC_CHANGE_VIEW }; + struct binding import = { _("Import"), KEY_GENERIC_IMPORT }; + struct binding export = { _("Export"), KEY_GENERIC_EXPORT }; + struct binding togo = { _("Go to"), KEY_GENERIC_GOTO }; + struct binding conf = { _("Config"), KEY_GENERIC_CONFIG_MENU }; + struct binding draw = { _("Redraw"), KEY_GENERIC_REDRAW }; + struct binding appt = { _("Add Appt"), KEY_GENERIC_ADD_APPT }; + struct binding todo = { _("Add Todo"), KEY_GENERIC_ADD_TODO }; + struct binding gnday = { _("+1 Day"), KEY_GENERIC_NEXT_DAY }; + struct binding gpday = { _("-1 Day"), KEY_GENERIC_PREV_DAY }; + struct binding gnweek = { _("+1 Week"), KEY_GENERIC_NEXT_WEEK }; + struct binding gpweek = { _("-1 Week"), KEY_GENERIC_PREV_WEEK }; + struct binding today = { _("Today"), KEY_GENERIC_GOTO_TODAY }; + struct binding nview = { _("Nxt View"), KEY_GENERIC_SCROLL_DOWN }; + struct binding pview = { _("Prv View"), KEY_GENERIC_SCROLL_UP }; + struct binding up = { _("Up"), KEY_MOVE_UP }; + struct binding down = { _("Down"), KEY_MOVE_DOWN }; + struct binding left = { _("Left"), KEY_MOVE_LEFT }; + struct binding right = { _("Right"), KEY_MOVE_RIGHT }; + struct binding weekb = { _("beg Week"), KEY_START_OF_WEEK }; + struct binding weeke = { _("end Week"), KEY_END_OF_WEEK }; + struct binding add = { _("Add Item"), KEY_ADD_ITEM }; + struct binding del = { _("Del Item"), KEY_DEL_ITEM }; + struct binding edit = { _("Edit Itm"), KEY_EDIT_ITEM }; + struct binding view = { _("View"), KEY_VIEW_ITEM }; + struct binding pipe = { _("Pipe"), KEY_PIPE_ITEM }; + struct binding flag = { _("Flag Itm"), KEY_FLAG_ITEM }; + struct binding rept = { _("Repeat"), KEY_REPEAT_ITEM }; + struct binding enote = { _("EditNote"), KEY_EDIT_NOTE }; + struct binding vnote = { _("ViewNote"), KEY_VIEW_NOTE }; + struct binding rprio = { _("Prio.+"), KEY_RAISE_PRIORITY }; + struct binding lprio = { _("Prio.-"), KEY_LOWER_PRIORITY }; + struct binding othr = { _("OtherCmd"), KEY_GENERIC_OTHER_CMD }; + + struct binding *bindings_cal[] = { &help, &quit, &save, &chgvu, &nview, &pview, &up, &down, &left, &right, - &togo, &othr, &import, &export, &weekb, &weeke, &appt, &todo, - &gnday, &gpday, &gnweek, &gpweek, &draw, &othr, &today, &conf, &othr, - /* appointment keys */ + &togo, &import, &export, &weekb, &weeke, &appt, &todo, &gnday, &gpday, + &gnweek, &gpweek, &draw, &today, &conf + }; + + struct binding *bindings_apoint[] = { &help, &quit, &save, &chgvu, &import, &export, &add, &del, &edit, &view, - &draw, &othr, &rept, &flag, &enote, &vnote, &up, &down, &gnday, &gpday, - &gnweek, &gpweek, &togo, &othr, &today, &conf, &appt, &todo, &cut, &paste, - &othr, - /* todo keys */ + &pipe, &draw, &rept, &flag, &enote, &vnote, &up, &down, &gnday, &gpday, + &gnweek, &gpweek, &togo, &today, &conf, &appt, &todo, &cut, &paste + }; + + struct binding *bindings_todo[] = { &help, &quit, &save, &chgvu, &import, &export, &add, &del, &edit, &view, - &flag, &othr, &rprio, &lprio, &enote, &vnote, &up, &down, &gnday, &gpday, - &gnweek, &gpweek, &togo, &othr, &today, &conf, &appt, &todo, &draw, &othr + &pipe, &flag, &rprio, &lprio, &enote, &vnote, &up, &down, &gnday, &gpday, + &gnweek, &gpweek, &togo, &today, &conf, &appt, &todo, &draw }; - /* Drawing the keybinding with attribute and label without. */ - which_pan = wins_slctd (); - start = pos[which_pan] + 2 * KEYS_CMDS_PER_LINE * (status_page - 1); - end = MIN (start + 2 * KEYS_CMDS_PER_LINE, pos[which_pan + 1]); - keys_display_bindings_bar (win[STA].p, binding, start, end); + enum win active_panel = wins_slctd(); + + struct binding **bindings; + int bindings_size; + + switch (active_panel) { + case CAL: + bindings = bindings_cal; + bindings_size = sizeof(bindings_cal) / sizeof(bindings_cal[0]); + break; + case APP: + bindings = bindings_apoint; + bindings_size = sizeof(bindings_apoint) / sizeof(bindings_apoint[0]); + break; + case TOD: + bindings = bindings_todo; + bindings_size = sizeof(bindings_todo) / sizeof(bindings_todo[0]); + break; + default: + EXIT(_("unknown panel")); + /* NOTREACHED */ + } + + keys_display_bindings_bar(win[STA].p, bindings, bindings_size, + (KEYS_CMDS_PER_LINE * 2 - 1) * (status_page - 1), + KEYS_CMDS_PER_LINE * 2, &othr); } /* Erase status bar. */ -void -wins_erase_status_bar (void) +void wins_erase_status_bar(void) { - erase_window_part (win[STA].p, 0, 0, col, STATUSHEIGHT); + erase_window_part(win[STA].p, 0, 0, col, STATUSHEIGHT); } /* Update the status bar page number to display other commands. */ -void -wins_other_status_page (int panel) +void wins_other_status_page(int panel) { int nb_item, max_page; - switch (panel) - { - case CAL: - nb_item = NB_CAL_CMDS; - break; - case APP: - nb_item = NB_APP_CMDS; - break; - case TOD: - nb_item = NB_TOD_CMDS; - break; - default: - EXIT (_("unknown panel")); - /* NOTREACHED */ - } - max_page = ceil (nb_item / (2 * CMDS_PER_LINE + 1)) + 1; - if (status_page < max_page) - status_page++; - else - status_page = 1; + switch (panel) { + case CAL: + nb_item = NB_CAL_CMDS; + break; + case APP: + nb_item = NB_APP_CMDS; + break; + case TOD: + nb_item = NB_TOD_CMDS; + break; + default: + EXIT(_("unknown panel")); + /* NOTREACHED */ + } + max_page = nb_item / (KEYS_CMDS_PER_LINE * 2 - 1) + 1; + status_page = (status_page % max_page) + 1; } /* Reset the status bar page. */ -void -wins_reset_status_page (void) +void wins_reset_status_page(void) { status_page = 1; } @@ -765,5 +707,3 @@ wins_reset_status_page (void) #undef NB_CAL_CMDS #undef NB_APP_CMDS #undef NB_TOD_CMDS -#undef TOTAL_CMDS -#undef CMDS_PER_LINE |