diff options
Diffstat (limited to 'src/calcurse.c')
-rw-r--r-- | src/calcurse.c | 925 |
1 files changed, 434 insertions, 491 deletions
diff --git a/src/calcurse.c b/src/calcurse.c index 662f185..9e42eee 100644 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -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 @@ -39,541 +39,484 @@ #include "calcurse.h" /* + * Store the events and appointments for the selected day and reset the + * appointment highlight pointer if a new day was selected. + */ +static struct day_items_nb do_storage(int day_changed) +{ + struct day_items_nb inday = *day_process_storage(calendar_get_slctd_day(), + day_changed, &inday); + + if (day_changed) + apoint_hilt_set(1); + + return inday; +} + +/* * Calcurse is a text-based personal organizer which helps keeping track * of events and everyday tasks. It contains a calendar, a 'todo' list, * and puts your appointments in order. The user interface is configurable, * and one can choose between different color schemes and layouts. * All of the commands are documented within an online help system. */ -int -main (int argc, char **argv) +int main(int argc, char **argv) { - struct conf conf; struct day_items_nb inday; - int background, foreground; - int non_interactive; int no_data_file = 1; - int sav_hilt_app = 0; - int sav_hilt_tod = 0; int cut_item = 0; - unsigned do_storage = 0; - unsigned do_update = 1; - unsigned day_changed = 0; - char *no_color_support = - _("Sorry, colors are not supported by your terminal\n" - "(Press [ENTER] to continue)"); - char *quit_message = _("Do you really want to quit ?"); - char choices[] = "[y/n] "; + int count; #if ENABLE_NLS - setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); #endif /* ENABLE_NLS */ /* Thread-safe data structure init */ - apoint_llist_init (); - recur_apoint_llist_init (); + apoint_llist_init(); + recur_apoint_llist_init(); /* Initialize non-thread-safe data structures. */ - event_llist_init (); - todo_init_list (); + event_llist_init(); + todo_init_list(); /* * Begin by parsing and handling command line arguments. * The data path is also initialized here. */ - non_interactive = parse_args (argc, argv, &conf); - if (non_interactive) - exit_calcurse (EXIT_SUCCESS); - else - { - no_data_file = io_check_data_files (); - dmon_stop (); - io_set_lock (); - } + if (parse_args(argc, argv)) { + /* Non-interactive mode. */ + exit_calcurse(EXIT_SUCCESS); + } else { + no_data_file = io_check_data_files(); + dmon_stop(); + io_set_lock(); + } /* Begin of interactive mode with ncurses interface. */ - sigs_init (); /* signal handling init */ - initscr (); /* start the curses mode */ - cbreak (); /* control chars generate a signal */ - noecho (); /* controls echoing of typed chars */ - curs_set (0); /* make cursor invisible */ - calendar_set_current_date (); - notify_init_vars (); - wins_get_config (); + sigs_init(); /* signal handling init */ + initscr(); /* start the curses mode */ + cbreak(); /* control chars generate a signal */ + noecho(); /* controls echoing of typed chars */ + curs_set(0); /* make cursor invisible */ + calendar_set_current_date(); + notify_init_vars(); + wins_get_config(); /* Check if terminal supports color. */ - if (has_colors ()) - { - colorize = 1; - background = COLOR_BLACK; - foreground = COLOR_WHITE; - start_color (); + if (has_colors()) { + colorize = 1; + background = COLOR_BLACK; + foreground = COLOR_WHITE; + start_color(); #ifdef NCURSES_VERSION - if (use_default_colors () != ERR) - { - background = -1; - foreground = -1; - } -#endif /* NCURSES_VERSION */ - - /* Color assignment */ - init_pair (COLR_RED, COLOR_RED, background); - init_pair (COLR_GREEN, COLOR_GREEN, background); - init_pair (COLR_YELLOW, COLOR_YELLOW, background); - init_pair (COLR_BLUE, COLOR_BLUE, background); - init_pair (COLR_MAGENTA, COLOR_MAGENTA, background); - init_pair (COLR_CYAN, COLOR_CYAN, background); - init_pair (COLR_DEFAULT, foreground, background); - init_pair (COLR_HIGH, COLOR_BLACK, COLOR_GREEN); - init_pair (COLR_CUSTOM, COLOR_RED, background); - - } - else - { - colorize = 0; - background = COLOR_BLACK; + if (use_default_colors() != ERR) { + background = -1; + foreground = -1; } +#endif /* NCURSES_VERSION */ - vars_init (&conf); - wins_init (); - wins_slctd_init (); - notify_init_bar (); - wins_reset_status_page (); + /* Color assignment */ + init_pair(COLR_RED, COLOR_RED, background); + init_pair(COLR_GREEN, COLOR_GREEN, background); + init_pair(COLR_YELLOW, COLOR_YELLOW, background); + init_pair(COLR_BLUE, COLOR_BLUE, background); + init_pair(COLR_MAGENTA, COLOR_MAGENTA, background); + init_pair(COLR_CYAN, COLOR_CYAN, background); + init_pair(COLR_DEFAULT, foreground, background); + init_pair(COLR_HIGH, COLOR_BLACK, COLOR_GREEN); + init_pair(COLR_CUSTOM, COLOR_RED, background); + } else { + colorize = 0; + background = COLOR_BLACK; + } + + vars_init(); + wins_init(); + wins_slctd_init(); + notify_init_bar(); + wins_reset_status_page(); /* * Read the data from files : first the user * configuration (the display is then updated), and then * the todo list, appointments and events. */ - custom_load_conf (&conf, background); - wins_erase_status_bar (); - io_load_keys (conf.pager); - io_load_todo (); - io_load_app (); - wins_reinit (); - if (notify_bar ()) - notify_start_main_thread (); - wins_update (); - io_startup_screen (conf.skip_system_dialogs, no_data_file); - inday = *day_process_storage (0, day_changed, &inday); - wins_slctd_set (CAL); - wins_update (); - calendar_start_date_thread (); + config_load(); + wins_erase_status_bar(); + io_load_keys(conf.pager); + io_load_todo(); + io_load_app(); + wins_reinit(); + if (conf.system_dialogs) { + wins_update(FLAG_ALL); + io_startup_screen(no_data_file); + } + inday = *day_process_storage(0, 0, &inday); + wins_slctd_set(CAL); + wins_update(FLAG_ALL); + + /* Start miscellaneous threads. */ + if (notify_bar()) + notify_start_main_thread(); + calendar_start_date_thread(); if (conf.periodic_save > 0) - io_start_psave_thread (&conf); + io_start_psave_thread(); /* User input */ - for (;;) - { - int key; - - do_update = 1; - key = keys_getch (win[STA].p); - switch (key) - { - case ERR: - do_update = 0; - break; - - case KEY_GENERIC_REDRAW: - resize = 1; - break; - - case KEY_GENERIC_CHANGE_VIEW: - wins_reset_status_page (); - /* Need to save the previously highlighted event. */ - switch (wins_slctd ()) - { - case TOD: - sav_hilt_tod = todo_hilt (); - todo_hilt_set (0); - break; - case APP: - sav_hilt_app = apoint_hilt (); - apoint_hilt_set (0); - break; - default: - break; - } - wins_slctd_next (); - - /* Select the event to highlight. */ - switch (wins_slctd ()) - { - case TOD: - if ((sav_hilt_tod == 0) && (todo_nb () != 0)) - todo_hilt_set (1); - else - todo_hilt_set (sav_hilt_tod); - break; - case APP: - if ((sav_hilt_app == 0) - && ((inday.nb_events + inday.nb_apoints) != 0)) - apoint_hilt_set (1); - else - apoint_hilt_set (sav_hilt_app); - break; - default: - break; - } - break; - - case KEY_GENERIC_OTHER_CMD: - wins_other_status_page (wins_slctd ()); - break; - - case KEY_GENERIC_GOTO: - case KEY_GENERIC_GOTO_TODAY: - wins_erase_status_bar (); - calendar_set_current_date (); - if (key == KEY_GENERIC_GOTO_TODAY) - calendar_goto_today (); - else - calendar_change_day (conf.input_datefmt); - do_storage = 1; - day_changed = 1; - break; - - case KEY_VIEW_ITEM: - if ((wins_slctd () == APP) && (apoint_hilt () != 0)) - day_popup_item (); - else if ((wins_slctd () == TOD) && (todo_hilt () != 0)) - item_in_popup (NULL, NULL, todo_saved_mesg (), _("To do :")); - break; - - case KEY_GENERIC_CONFIG_MENU: - wins_erase_status_bar (); - custom_config_bar (); - while ((key = wgetch (win[STA].p)) != 'q') - { - switch (key) - { - case 'C': - case 'c': - if (has_colors ()) - custom_color_config (); - else - { - colorize = 0; - wins_erase_status_bar (); - mvwprintw (win[STA].p, 0, 0, _(no_color_support)); - wgetch (win[STA].p); - } - break; - case 'L': - case 'l': - custom_layout_config (); - break; - case 'G': - case 'g': - custom_general_config (&conf); - break; - case 'N': - case 'n': - notify_config_bar (); - break; - case 'K': - case 'k': - custom_keys_config (); - break; - case 's': - case 'S': - custom_sidebar_config (); - break; - } - wins_reset (); - wins_update (); - do_storage = 1; - wins_erase_status_bar (); - custom_config_bar (); - } - wins_update (); - break; - - case KEY_GENERIC_ADD_APPT: - apoint_add (); - do_storage = 1; - break; - - case KEY_GENERIC_ADD_TODO: - todo_new_item (); - if (todo_hilt () == 0 && todo_nb () == 1) - todo_hilt_increase (); - break; - - case KEY_ADD_ITEM: - switch (wins_slctd ()) - { - case APP: - apoint_add (); - do_storage = 1; - break; - case TOD: - todo_new_item (); - if (todo_hilt () == 0 && todo_nb () == 1) - todo_hilt_increase (); - break; - default: - break; - } - break; - - case KEY_EDIT_ITEM: - if (wins_slctd () == APP && apoint_hilt () != 0) - day_edit_item (&conf); - else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_edit_item (); - do_storage = 1; - break; - - case KEY_DEL_ITEM: - if (wins_slctd () == APP && apoint_hilt () != 0) - apoint_delete (&conf, &inday.nb_events, &inday.nb_apoints); - else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_delete (&conf); - do_storage = 1; - break; - - case KEY_GENERIC_CUT: - if (wins_slctd () == APP && apoint_hilt () != 0) - { - cut_item = apoint_cut (&inday.nb_events, &inday.nb_apoints); - do_storage = 1; - } - break; - - case KEY_GENERIC_PASTE: - if (wins_slctd () == APP) - { - apoint_paste (&inday.nb_events, &inday.nb_apoints, cut_item); - cut_item = 0; - do_storage = 1; - } - break; + for (;;) { + int key; - case KEY_REPEAT_ITEM: - if (wins_slctd () == APP && apoint_hilt () != 0) - recur_repeat_item (&conf); - do_storage = 1; - break; - - case KEY_FLAG_ITEM: - if (wins_slctd () == APP && apoint_hilt () != 0) - apoint_switch_notify (); - else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_flag (); - do_storage = 1; - break; - - case KEY_RAISE_PRIORITY: - case KEY_LOWER_PRIORITY: - if (wins_slctd () == TOD && todo_hilt () != 0) - { - todo_chg_priority (key); - if (todo_hilt_pos () < 0) - todo_set_first (todo_hilt ()); - else if (todo_hilt_pos () >= win[TOD].h - 4) - todo_set_first (todo_hilt () - win[TOD].h + 5); - } - break; - - case KEY_EDIT_NOTE: - if (wins_slctd () == APP && apoint_hilt () != 0) - day_edit_note (conf.editor); - else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_edit_note (conf.editor); - do_storage = 1; - break; - - case KEY_VIEW_NOTE: - if (wins_slctd () == APP && apoint_hilt () != 0) - day_view_note (conf.pager); - else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_view_note (conf.pager); - break; - - case KEY_GENERIC_HELP: - wins_status_bar (); - help_screen (); - break; - - case KEY_GENERIC_SAVE: - io_save_cal (&conf, IO_SAVE_DISPLAY_BAR); - break; - - case KEY_GENERIC_IMPORT: - wins_erase_status_bar (); - io_import_data (IO_IMPORT_ICAL, &conf, NULL); - do_storage = 1; - break; - - case KEY_GENERIC_EXPORT: - wins_erase_status_bar (); - io_export_bar (); - while ((key = wgetch (win[STA].p)) != 'q') - { - switch (key) - { - case 'I': - case 'i': - io_export_data (IO_EXPORT_ICAL, &conf); - break; - case 'P': - case 'p': - io_export_data (IO_EXPORT_PCAL, &conf); - break; - } - wins_reset (); - wins_update (); - do_storage = 1; - wins_erase_status_bar (); - io_export_bar (); - } - wins_update (); - break; - - case KEY_GENERIC_NEXT_DAY: - case KEY_MOVE_RIGHT: - if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_DAY) - { - do_storage = 1; - day_changed = 1; - calendar_move (RIGHT); - } - break; - - case KEY_GENERIC_PREV_DAY: - case KEY_MOVE_LEFT: - if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_DAY) - { - do_storage = 1; - day_changed = 1; - calendar_move (LEFT); - } - break; - - case KEY_GENERIC_PREV_WEEK: - case KEY_MOVE_UP: - if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_WEEK) - { - do_storage = 1; - day_changed = 1; - calendar_move (UP); - } - else if ((wins_slctd () == APP) && (apoint_hilt () > 1)) - { - apoint_hilt_decrease (); - apoint_scroll_pad_up (inday.nb_events); - } - else if ((wins_slctd () == TOD) && (todo_hilt () > 1)) - { - todo_hilt_decrease (); - if (todo_hilt_pos () < 0) - todo_first_decrease (); - } - break; - - case KEY_GENERIC_NEXT_WEEK: - case KEY_MOVE_DOWN: - if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_WEEK) - { - do_storage = 1; - day_changed = 1; - calendar_move (DOWN); - } - else if ((wins_slctd () == APP) && - (apoint_hilt () < inday.nb_events + inday.nb_apoints)) - { - apoint_hilt_increase (); - apoint_scroll_pad_down (inday.nb_events, win[APP].h); - } - else if ((wins_slctd () == TOD) && (todo_hilt () < todo_nb ())) - { - todo_hilt_increase (); - if (todo_hilt_pos () == win[TOD].h - 4) - todo_first_increase (); - } - break; - - case KEY_START_OF_WEEK: - if (wins_slctd () == CAL) - { - do_storage = 1; - day_changed = 1; - calendar_move (WEEK_START); - } - break; - - case KEY_END_OF_WEEK: - if (wins_slctd () == CAL) - { - do_storage = 1; - day_changed = 1; - calendar_move (WEEK_END); - } - break; - - case KEY_GENERIC_SCROLL_UP: - if (wins_slctd () == CAL) - calendar_view_prev (); - break; - - case KEY_GENERIC_SCROLL_DOWN: - if (wins_slctd () == CAL) - calendar_view_next (); - break; - - case KEY_GENERIC_QUIT: - if (conf.auto_save) - io_save_cal (&conf, IO_SAVE_DISPLAY_BAR); - - if (conf.confirm_quit) - { - status_mesg (_(quit_message), choices); - key = wgetch (win[STA].p); - if (key == 'y') - exit_calcurse (EXIT_SUCCESS); - else - { - wins_erase_status_bar (); - break; - } - } - else - exit_calcurse (EXIT_SUCCESS); - break; + if (resize) { + resize = 0; + wins_reset(); + } - default: - do_update = 0; + key = keys_getch(win[STA].p, &count); + switch (key) { + case KEY_GENERIC_REDRAW: + resize = 1; + break; + + case KEY_GENERIC_CHANGE_VIEW: + wins_reset_status_page(); + wins_slctd_next(); + + /* Select the event to highlight. */ + switch (wins_slctd()) { + case TOD: + if ((todo_hilt() == 0) && (todo_nb() > 0)) + todo_hilt_set(1); + break; + case APP: + if ((apoint_hilt() == 0) && ((inday.nb_events + inday.nb_apoints) > 0)) + apoint_hilt_set(1); + break; + default: + break; + } + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_OTHER_CMD: + wins_other_status_page(wins_slctd()); + wins_update(FLAG_STA); + break; + + case KEY_GENERIC_GOTO: + case KEY_GENERIC_GOTO_TODAY: + wins_erase_status_bar(); + calendar_set_current_date(); + if (key == KEY_GENERIC_GOTO_TODAY) + calendar_goto_today(); + else + calendar_change_day(conf.input_datefmt); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + break; + + case KEY_VIEW_ITEM: + if ((wins_slctd() == APP) && (apoint_hilt() != 0)) + day_popup_item(); + else if ((wins_slctd() == TOD) && (todo_hilt() != 0)) + item_in_popup(NULL, NULL, todo_saved_mesg(), _("To do :")); + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_CONFIG_MENU: + wins_erase_status_bar(); + custom_config_main(); + inday = do_storage(0); + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_ADD_APPT: + apoint_add(); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + break; + + case KEY_GENERIC_ADD_TODO: + todo_new_item(); + if (todo_hilt() == 0 && todo_nb() == 1) + todo_hilt_increase(1); + wins_update(FLAG_TOD | FLAG_STA); + break; + + case KEY_ADD_ITEM: + switch (wins_slctd()) { + case APP: + apoint_add(); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + break; + case TOD: + todo_new_item(); + if (todo_hilt() == 0 && todo_nb() == 1) + todo_hilt_increase(1); + wins_update(FLAG_TOD | FLAG_STA); + break; + default: + break; + } + break; + + case KEY_EDIT_ITEM: + if (wins_slctd() == APP && apoint_hilt() != 0) { + day_edit_item(); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + } else if (wins_slctd() == TOD && todo_hilt() != 0) { + todo_edit_item(); + wins_update(FLAG_TOD | FLAG_STA); + } + break; + + case KEY_DEL_ITEM: + if (wins_slctd() == APP && apoint_hilt() != 0) { + apoint_delete(&inday.nb_events, &inday.nb_apoints); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + } else if (wins_slctd() == TOD && todo_hilt() != 0) { + todo_delete(); + wins_update(FLAG_TOD | FLAG_STA); + } + break; + + case KEY_GENERIC_CUT: + if (wins_slctd() == APP && apoint_hilt() != 0) { + cut_item = apoint_cut(&inday.nb_events, &inday.nb_apoints); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_GENERIC_PASTE: + if (wins_slctd() == APP) { + apoint_paste(&inday.nb_events, &inday.nb_apoints, cut_item); + cut_item = 0; + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_REPEAT_ITEM: + if (wins_slctd() == APP && apoint_hilt() != 0) + recur_repeat_item(); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + break; + + case KEY_FLAG_ITEM: + if (wins_slctd() == APP && apoint_hilt() != 0) { + apoint_switch_notify(); + inday = do_storage(0); + wins_update(FLAG_APP); + } else if (wins_slctd() == TOD && todo_hilt() != 0) { + todo_flag(); + wins_update(FLAG_TOD); + } + break; + + case KEY_PIPE_ITEM: + if (wins_slctd() == APP && apoint_hilt() != 0) + day_pipe_item(); + else if (wins_slctd() == TOD && todo_hilt() != 0) + todo_pipe_item(); + wins_update(FLAG_ALL); + break; + + case KEY_RAISE_PRIORITY: + case KEY_LOWER_PRIORITY: + if (wins_slctd() == TOD && todo_hilt() != 0) { + todo_chg_priority(key); + if (todo_hilt_pos() < 0) + todo_set_first(todo_hilt()); + else if (todo_hilt_pos() >= win[TOD].h - 4) + todo_set_first(todo_hilt() - win[TOD].h + 5); + wins_update(FLAG_TOD); + } + break; + + case KEY_EDIT_NOTE: + if (wins_slctd() == APP && apoint_hilt() != 0) { + day_edit_note(conf.editor); + inday = do_storage(0); + } else if (wins_slctd() == TOD && todo_hilt() != 0) + todo_edit_note(conf.editor); + wins_update(FLAG_ALL); + break; + + case KEY_VIEW_NOTE: + if (wins_slctd() == APP && apoint_hilt() != 0) + day_view_note(conf.pager); + else if (wins_slctd() == TOD && todo_hilt() != 0) + todo_view_note(conf.pager); + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_HELP: + wins_status_bar(); + help_screen(); + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_SAVE: + io_save_cal(IO_SAVE_DISPLAY_BAR); + wins_update(FLAG_STA); + break; + + case KEY_GENERIC_IMPORT: + wins_erase_status_bar(); + io_import_data(IO_IMPORT_ICAL, NULL); + inday = do_storage(0); + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_EXPORT: + wins_erase_status_bar(); + io_export_bar(); + while ((key = wgetch(win[STA].p)) != 'q') { + switch (key) { + case 'I': + case 'i': + io_export_data(IO_EXPORT_ICAL); + break; + case 'P': + case 'p': + io_export_data(IO_EXPORT_PCAL); break; } - - if (do_storage) - { - inday = *day_process_storage (calendar_get_slctd_day (), - day_changed, &inday); - do_storage = !do_storage; - if (day_changed) - { - sav_hilt_app = 0; - day_changed = !day_changed; - if ((wins_slctd () == APP) && - (inday.nb_events + inday.nb_apoints != 0)) - apoint_hilt_set (1); - } + wins_reset(); + wins_update(FLAG_ALL); + wins_erase_status_bar(); + io_export_bar(); + } + inday = do_storage(0); + wins_update(FLAG_ALL); + break; + + case KEY_GENERIC_NEXT_DAY: + case KEY_MOVE_RIGHT: + if (wins_slctd() == CAL || key == KEY_GENERIC_NEXT_DAY) { + calendar_move(RIGHT, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_GENERIC_PREV_DAY: + case KEY_MOVE_LEFT: + if (wins_slctd() == CAL || key == KEY_GENERIC_PREV_DAY) { + calendar_move(LEFT, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_GENERIC_PREV_WEEK: + case KEY_MOVE_UP: + if (wins_slctd() == CAL || key == KEY_GENERIC_PREV_WEEK) { + calendar_move(UP, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } else if (wins_slctd() == APP) { + if (count >= apoint_hilt()) + count = apoint_hilt() - 1; + apoint_hilt_decrease(count); + apoint_scroll_pad_up(inday.nb_events); + wins_update(FLAG_APP); + } else if (wins_slctd() == TOD) { + if (count >= todo_hilt()) + count = todo_hilt() - 1; + todo_hilt_decrease(count); + if (todo_hilt_pos() < 0) + todo_first_increase(todo_hilt_pos()); + wins_update(FLAG_TOD); + } + break; + + case KEY_GENERIC_NEXT_WEEK: + case KEY_MOVE_DOWN: + if (wins_slctd() == CAL || key == KEY_GENERIC_NEXT_WEEK) { + calendar_move(DOWN, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } else if (wins_slctd() == APP) { + if (count > inday.nb_events + inday.nb_apoints - apoint_hilt()) + count = inday.nb_events + inday.nb_apoints - apoint_hilt(); + apoint_hilt_increase(count); + apoint_scroll_pad_down(inday.nb_events, win[APP].h); + wins_update(FLAG_APP); + } else if (wins_slctd() == TOD) { + if (count > todo_nb() - todo_hilt()) + count = todo_nb() - todo_hilt(); + todo_hilt_increase(count); + if (todo_hilt_pos() >= win[TOD].h - 4) + todo_first_increase(todo_hilt_pos() - win[TOD].h + 5); + wins_update(FLAG_TOD); + } + break; + + case KEY_START_OF_WEEK: + if (wins_slctd() == CAL) { + calendar_move(WEEK_START, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_END_OF_WEEK: + if (wins_slctd() == CAL) { + calendar_move(WEEK_END, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_GENERIC_SCROLL_UP: + if (wins_slctd() == CAL) { + calendar_view_prev(); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_GENERIC_SCROLL_DOWN: + if (wins_slctd() == CAL) { + calendar_view_next(); + wins_update(FLAG_CAL | FLAG_APP); + } + break; + + case KEY_GENERIC_QUIT: + if (conf.auto_save) + io_save_cal(IO_SAVE_DISPLAY_BAR); + if (conf.auto_gc) + note_gc(); + + if (conf.confirm_quit) { + if (status_ask_bool(_("Do you really want to quit ?")) == 1) + exit_calcurse(EXIT_SUCCESS); + else { + wins_erase_status_bar(); + wins_update(FLAG_STA); + break; } + } else + exit_calcurse(EXIT_SUCCESS); + break; - if (resize) - { - resize = 0; - do_update = 0; - wins_reset (); - } + case KEY_RESIZE: + case ERR: + /* Do not reset the count parameter on resize or error. */ + continue; - if (do_update) - wins_update (); + default: + break; } + + count = 0; + } } |