diff options
Diffstat (limited to 'src/wins.c')
-rwxr-xr-x | src/wins.c | 573 |
1 files changed, 294 insertions, 279 deletions
@@ -1,8 +1,8 @@ -/* $calcurse: wins.c,v 1.12 2008/02/14 20:20:23 culot Exp $ */ +/* $calcurse: wins.c,v 1.13 2008/04/12 21:14:03 culot Exp $ */ /* * Calcurse - text-based organizer - * Copyright (c) 2007 Frederic Culot + * Copyright (c) 2007-2008 Frederic Culot * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,331 +37,344 @@ /* Variables to handle calcurse windows. */ window_t win[NBWINS]; -static window_e slctd_win; -static int layout; +static window_e slctd_win; +static int layout; /* Get the current layout. */ int -wins_layout(void) +wins_layout (void) { - return (layout); + return (layout); } /* Set the current layout. */ void -wins_set_layout(int nb) +wins_set_layout (int nb) { - layout = nb; + layout = nb; } /* Initialize the selected window in calcurse's interface. */ void -wins_slctd_init(void) +wins_slctd_init (void) { - wins_slctd_set(CAL); + wins_slctd_set (CAL); } /* Returns an enum which corresponds to the window which is selected. */ window_e -wins_slctd(void) +wins_slctd (void) { - return (slctd_win); + return (slctd_win); } /* Sets the selected window. */ void -wins_slctd_set(window_e window) +wins_slctd_set (window_e window) { - slctd_win = window; + slctd_win = window; } /* TAB key was hit in the interface, need to select next window. */ void -wins_slctd_next(void) +wins_slctd_next (void) { - if (slctd_win == TOD) - slctd_win = CAL; - else - slctd_win++; + if (slctd_win == TOD) + slctd_win = CAL; + else + slctd_win++; } /* Create all the windows. */ -void -wins_init(void) +void +wins_init (void) { - char label[BUFSIZ]; - - /* - * Create the three main windows plus the status bar and the pad used to - * display appointments and event. - */ - win[CAL].p = newwin(CALHEIGHT, CALWIDTH, win[CAL].y, win[CAL].x); - snprintf(label, BUFSIZ, _("Calendar")); - wins_show(win[CAL].p, label); - - win[APP].p = newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x); - snprintf(label, BUFSIZ, _("Appointments")); - wins_show(win[APP].p, label); - apad->width = win[APP].w - 3; - apad->ptrwin = newpad(apad->length, apad->width); - - win[TOD].p = newwin(win[TOD].h, win[TOD].w, win[TOD].y, win[TOD].x); - snprintf(label, BUFSIZ, _("ToDo")); - wins_show(win[TOD].p, label); - - win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - - /* 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[STA].p, TRUE); + char label[BUFSIZ]; + + /* + * Create the three main windows plus the status bar and the pad used to + * display appointments and event. + */ + win[CAL].p = newwin (CALHEIGHT, CALWIDTH, win[CAL].y, win[CAL].x); + snprintf (label, BUFSIZ, _("Calendar")); + wins_show (win[CAL].p, label); + + win[APP].p = newwin (win[APP].h, win[APP].w, win[APP].y, win[APP].x); + snprintf (label, BUFSIZ, _("Appointments")); + wins_show (win[APP].p, label); + apad->width = win[APP].w - 3; + apad->ptrwin = newpad (apad->length, apad->width); + + win[TOD].p = newwin (win[TOD].h, win[TOD].w, win[TOD].y, win[TOD].x); + snprintf (label, BUFSIZ, _("ToDo")); + wins_show (win[TOD].p, label); + + win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, win[STA].x); + + /* 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[STA].p, TRUE); } /* * Delete the existing windows and recreate them with their new * size and placement. */ -void -wins_reinit(void) +void +wins_reinit (void) { - delwin(win[STA].p); - delwin(win[CAL].p); - delwin(win[APP].p); - delwin(apad->ptrwin); - delwin(win[TOD].p); - wins_get_config(); - wins_init(); - if (notify_bar()) - notify_reinit_bar(win[NOT].h, win[NOT].w, win[NOT].y, - win[NOT].x); + delwin (win[STA].p); + delwin (win[CAL].p); + delwin (win[APP].p); + delwin (apad->ptrwin); + delwin (win[TOD].p); + wins_get_config (); + wins_init (); + if (notify_bar ()) + notify_reinit_bar (win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x); } /* Show the window with a border and a label. */ -void -wins_show(WINDOW * win, char *label) +void +wins_show (WINDOW *win, char *label) { - int startx, starty, height, width; + int startx, starty, height, width; - getbegyx(win, starty, startx); - getmaxyx(win, height, width); + getbegyx (win, starty, startx); + getmaxyx (win, height, width); - 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); - - /* fixed values for status, notification bars and calendar */ - win[STA].h = STATUSHEIGHT; - win[STA].w = col; - 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; - } - - if (layout <= 4) { /* APPOINTMENT is the biggest panel */ - win[APP].w = col - CALWIDTH; - win[APP].h = row - (win[STA].h + win[NOT].h); - win[TOD].w = CALWIDTH; - win[TOD].h = row - (CALHEIGHT + win[STA].h + win[NOT].h); - } else { /* TODO is the biggest panel */ - win[TOD].w = col - CALWIDTH; - win[TOD].h = row - (win[STA].h + win[NOT].h); - win[APP].w = CALWIDTH; - win[APP].h = row - (CALHEIGHT + 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 = CALHEIGHT; - 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 = CALWIDTH; - win[TOD].y = CALHEIGHT; - break; - case 4: - win[APP].y = 0; - win[TOD].x = 0; - win[TOD].y = 0; - win[CAL].x = 0; - win[APP].x = CALWIDTH; - win[CAL].y = win[TOD].h; - break; - case 5: - win[TOD].y = 0; - win[TOD].x = 0; - win[CAL].y = 0; - win[APP].y = CALHEIGHT; - 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 = CALWIDTH; - win[APP].y = CALHEIGHT; - break; - case 8: - win[TOD].y = 0; - win[APP].x = 0; - win[CAL].x = 0; - win[APP].y = 0; - win[TOD].x = CALWIDTH; - win[CAL].y = win[APP].h; - break; - } + /* Get the screen configuration */ + getmaxyx (stdscr, row, col); + + /* fixed values for status, notification bars and calendar */ + win[STA].h = STATUSHEIGHT; + win[STA].w = col; + 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; + } + + if (layout <= 4) + { /* APPOINTMENT is the biggest panel */ + win[APP].w = col - CALWIDTH; + win[APP].h = row - (win[STA].h + win[NOT].h); + win[TOD].w = CALWIDTH; + win[TOD].h = row - (CALHEIGHT + win[STA].h + win[NOT].h); + } + else + { /* TODO is the biggest panel */ + win[TOD].w = col - CALWIDTH; + win[TOD].h = row - (win[STA].h + win[NOT].h); + win[APP].w = CALWIDTH; + win[APP].h = row - (CALHEIGHT + 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 = CALHEIGHT; + 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 = CALWIDTH; + win[TOD].y = CALHEIGHT; + break; + case 4: + win[APP].y = 0; + win[TOD].x = 0; + win[TOD].y = 0; + win[CAL].x = 0; + win[APP].x = CALWIDTH; + win[CAL].y = win[TOD].h; + break; + case 5: + win[TOD].y = 0; + win[TOD].x = 0; + win[CAL].y = 0; + win[APP].y = CALHEIGHT; + 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 = CALWIDTH; + win[APP].y = CALHEIGHT; + break; + case 8: + win[TOD].y = 0; + win[APP].x = 0; + win[CAL].x = 0; + win[APP].y = 0; + win[TOD].x = CALWIDTH; + 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); + 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); } /* 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); + 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); } /* * Update all of the three windows and put a border around the * selected window. */ -void -wins_update(void) +void +wins_update (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: - ierror(_("FATAL ERROR in wins_update: no window selected\n"), - IERROR_FATAL); - /* NOTREACHED */ - } - - apoint_update_panel(&win[APP], slctd_win); - todo_update_panel(&win[TOD], slctd_win); - calendar_update_panel(win[CAL].p); - status_bar(); - if (notify_bar()) - notify_update_bar(); - wmove(win[STA].p, 0, 0); - doupdate(); + 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: + ierror (_("FATAL ERROR in wins_update: no window selected\n"), + IERROR_FATAL); + /* NOTREACHED */ + } + + apoint_update_panel (&win[APP], slctd_win); + todo_update_panel (&win[TOD], slctd_win); + calendar_update_panel (win[CAL].p); + status_bar (); + if (notify_bar ()) + notify_update_bar (); + wmove (win[STA].p, 0, 0); + doupdate (); } /* Reset the screen, needed when resizing terminal for example. */ void -wins_reset(void) +wins_reset (void) { - endwin(); - refresh(); - curs_set(0); - wins_reinit(); - wins_update(); + endwin (); + refresh (); + curs_set (0); + wins_reinit (); + wins_update (); } /* @@ -369,30 +382,32 @@ wins_reset(void) * file. */ void -wins_launch_external(const char *file, const char *cmd) +wins_launch_external (const char *file, const char *cmd) { - char *p; - int len; - - len = strlen(file) + strlen(cmd) + 2; /* Beware of space between cmd and - file. */ - p = (char *)malloc(sizeof(char) * len); - if (snprintf(p, len, "%s %s", cmd, file) == -1) { - free(p); - return; - } - if (notify_bar()) - notify_stop_main_thread(); - def_prog_mode(); - endwin(); - clear(); - refresh(); - system(p); - reset_prog_mode(); - clearok(curscr, TRUE); - curs_set(0); - refresh(); - if (notify_bar()) - notify_start_main_thread(); - free(p); + char *p; + int len; + + /* Beware of space between cmd and file. */ + len = strlen (file) + strlen (cmd) + 2; + + p = (char *) malloc (sizeof (char) * len); + if (snprintf (p, len, "%s %s", cmd, file) == -1) + { + free (p); + return; + } + if (notify_bar ()) + notify_stop_main_thread (); + def_prog_mode (); + endwin (); + clear (); + refresh (); + system (p); + reset_prog_mode (); + clearok (curscr, TRUE); + curs_set (0); + refresh (); + if (notify_bar ()) + notify_start_main_thread (); + free (p); } |