From 9d4899110a067d4899116ac229c8b4c489096b60 Mon Sep 17 00:00:00 2001 From: Frederic Culot Date: Sun, 16 Nov 2008 17:42:53 +0000 Subject: More work on implementing user-definable keybindings --- ChangeLog | 10 ++ src/apoint.c | 11 +- src/calcurse.c | 103 +++++++----------- src/calendar.c | 7 +- src/custom.c | 17 +-- src/day.c | 35 +++--- src/help.c | 86 +++++++-------- src/htable.h | 4 +- src/io.c | 84 +++++++-------- src/keys.c | 331 ++++++++++++++++++++++++++++++++++++++++----------------- src/keys.h | 77 +++++++------- src/notify.c | 5 +- src/recur.c | 17 +-- src/todo.c | 14 +-- src/utils.c | 165 +++++++++++++++++++--------- src/utils.h | 25 ++--- src/vars.c | 3 +- src/vars.h | 4 +- 18 files changed, 583 insertions(+), 415 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c048e4..d1f2bf7 100755 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-11-16 Frederic Culot + + * src/keys.c (keys_dump_defaults, dump_intro, keys_str2int) + (keys_int2str, keys_init, add_key_str, del_key_str): new functions + + * src/io.c (key_to_ascii): moved to src/keys.c + + * src/utils.c (status_bar): updated to display user keybindings + * src/utils.c (format_key): new function + 2008-11-09 Frederic Culot * src/io.c (io_load_keys, key_to_ascii): new function diff --git a/src/apoint.c b/src/apoint.c index 1ca2e6f..3f846ff 100755 --- a/src/apoint.c +++ b/src/apoint.c @@ -1,4 +1,4 @@ -/* $calcurse: apoint.c,v 1.23 2008/04/19 21:05:15 culot Exp $ */ +/* $calcurse: apoint.c,v 1.24 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -32,12 +32,13 @@ #include "i18n.h" #include "vars.h" #include "event.h" -#include "apoint.h" #include "day.h" #include "custom.h" #include "notify.h" #include "recur.h" +#include "keys.h" #include "calendar.h" +#include "apoint.h" apoint_llist_t *alist_p; static int hilt = 0; @@ -150,7 +151,7 @@ apoint_add (void) else if (check_time (item_time) != 1) { status_mesg (format_message_1, enter_str); - wgetch (win[STA].p); + keys_getch (win[STA].p); } else sscanf (item_time, "%u:%u", &heures, &minutes); @@ -174,7 +175,7 @@ apoint_add (void) else if (check_time (item_time) == 0) { status_mesg (format_message_2, enter_str); - wgetch (win[STA].p); + keys_getch (win[STA].p); } else { @@ -241,7 +242,7 @@ apoint_delete (conf_t *conf, unsigned *nb_events, unsigned *nb_apoints) if (conf->confirm_delete) { status_mesg (del_app_str, choices); - answer = wgetch (win[STA].p); + answer = keys_getch (win[STA].p); if ((answer == 'y') && (nb_items != 0)) go_for_deletion = true; else diff --git a/src/calcurse.c b/src/calcurse.c index 4070d51..c3bb3ee 100755 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -1,4 +1,4 @@ -/* $calcurse: calcurse.c,v 1.69 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: calcurse.c,v 1.70 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -133,6 +133,7 @@ main (int argc, char **argv) } vars_init (&conf); + keys_init (); wins_init (); wins_slctd_init (); notify_init_bar (); @@ -162,14 +163,10 @@ main (int argc, char **argv) /* User input */ for (;;) { - int ch, key; + int key; do_update = true; - ch = wgetch (win[STA].p); - key = keys_get_key (ch); - if (key == -1) - key = ch; - + key = keys_getch (win[STA].p); switch (key) { case ERR: @@ -229,7 +226,7 @@ main (int argc, char **argv) case KEY_GENERIC_GOTO_TODAY: erase_status_bar (); calendar_set_current_date (); - if (ch == KEY_GENERIC_GOTO_TODAY) + if (key == KEY_GENERIC_GOTO_TODAY) calendar_goto_today (); else calendar_change_day (conf.input_datefmt); @@ -237,8 +234,7 @@ main (int argc, char **argv) day_changed = true; break; - case KEY_APT_VIEW_ITEM: - case KEY_TODO_VIEW_ITEM: + case KEY_VIEW_ITEM: if ((wins_slctd () == APP) && (apoint_hilt () != 0)) day_popup_item (); else if ((wins_slctd () == TOD) && (todo_hilt () != 0)) @@ -248,9 +244,9 @@ main (int argc, char **argv) case KEY_GENERIC_CONFIG_MENU: erase_status_bar (); config_bar (); - while ((ch = wgetch (win[STA].p)) != 'q') + while ((key = wgetch (win[STA].p)) != 'q') { - switch (ch) + switch (key) { case 'C': case 'c': @@ -297,8 +293,7 @@ main (int argc, char **argv) todo_hilt_increase (); break; - case KEY_APT_ADD_ITEM: - case KEY_TODO_ADD_ITEM: + case KEY_ADD_ITEM: switch (wins_slctd ()) { case APP: @@ -315,8 +310,7 @@ main (int argc, char **argv) } break; - case KEY_APT_EDIT_ITEM: - case KEY_TODO_EDIT_ITEM: + case KEY_EDIT_ITEM: if (wins_slctd () == APP && apoint_hilt () != 0) day_edit_item (&conf); else if (wins_slctd () == TOD && todo_hilt () != 0) @@ -324,8 +318,7 @@ main (int argc, char **argv) do_storage = true; break; - case KEY_APT_DEL_ITEM: - case KEY_TODO_DEL_ITEM: + 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) @@ -333,20 +326,20 @@ main (int argc, char **argv) do_storage = true; break; - case KEY_APT_REPEAT: + case KEY_REPEAT_ITEM: if (wins_slctd () == APP && apoint_hilt () != 0) recur_repeat_item (&conf); do_storage = true; break; - case KEY_APT_FLAG_ITEM: + case KEY_FLAG_ITEM: if (wins_slctd () == APP && apoint_hilt () != 0) apoint_switch_notify (); do_storage = true; break; - case KEY_TODO_RAISE_PRIORITY: - case KEY_TODO_LOWER_PRIORITY: + case KEY_RAISE_PRIORITY: + case KEY_LOWER_PRIORITY: if (wins_slctd () == TOD && todo_hilt () != 0) { todo_chg_priority (key); @@ -357,8 +350,7 @@ main (int argc, char **argv) } break; - case KEY_APT_EDIT_NOTE: - case KEY_TODO_EDIT_NOTE: + case KEY_EDIT_NOTE: if (wins_slctd () == APP && apoint_hilt () != 0) day_edit_note (conf.editor); else if (wins_slctd () == TOD && todo_hilt () != 0) @@ -366,8 +358,7 @@ main (int argc, char **argv) do_storage = true; break; - case KEY_APT_VIEW_NOTE: - case KEY_TODO_VIEW_NOTE: + case KEY_VIEW_NOTE: if (wins_slctd () == APP && apoint_hilt () != 0) day_view_note (conf.pager); else if (wins_slctd () == TOD && todo_hilt () != 0) @@ -392,9 +383,9 @@ main (int argc, char **argv) case KEY_GENERIC_EXPORT: erase_status_bar (); io_export_bar (); - while ((ch = wgetch (win[STA].p)) != 'q') + while ((key = keys_getch (win[STA].p)) != 'q') { - switch (ch) + switch (key) { case 'I': case 'i': @@ -415,7 +406,7 @@ main (int argc, char **argv) break; case KEY_GENERIC_NEXT_DAY: - case KEY_CAL_NEXT_DAY: + case KEY_MOVE_RIGHT: if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_DAY) { do_storage = true; @@ -425,7 +416,7 @@ main (int argc, char **argv) break; case KEY_GENERIC_PREV_DAY: - case KEY_CAL_PREV_DAY: + case KEY_MOVE_LEFT: if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_DAY) { do_storage = true; @@ -435,61 +426,49 @@ main (int argc, char **argv) break; case KEY_GENERIC_PREV_WEEK: - case KEY_CAL_PREV_WEEK: + case KEY_MOVE_UP: if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_WEEK) { do_storage = true; day_changed = true; 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_CAL_NEXT_WEEK: + case KEY_MOVE_DOWN: if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_WEEK) { do_storage = true; day_changed = true; calendar_move (DOWN); } - break; - - case KEY_APT_MOVE_UP: - if ((wins_slctd () == APP) && (apoint_hilt () > 1)) - { - apoint_hilt_decrease (); - apoint_scroll_pad_up (inday.nb_events); - } - break; - - case KEY_APT_MOVE_DOWN: - if ((wins_slctd () == APP) && + 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); } - break; - - case KEY_TODO_MOVE_UP: - if ((wins_slctd () == TOD) && (todo_hilt () > 1)) - { - todo_hilt_decrease (); - if (todo_hilt_pos () < 0) - todo_first_decrease (); - } - break; - - case KEY_TODO_MOVE_DOWN: - if ((wins_slctd () == TOD) && (todo_hilt () < todo_nb ())) + else if ((wins_slctd () == TOD) && (todo_hilt () < todo_nb ())) { todo_hilt_increase (); if (todo_hilt_pos () == win[TOD].h - 4) todo_first_increase (); } - break; + break; - case KEY_CAL_START_OF_WEEK: + case KEY_START_OF_WEEK: if (wins_slctd () == CAL) { do_storage = true; @@ -498,7 +477,7 @@ main (int argc, char **argv) } break; - case KEY_CAL_END_OF_WEEK: + case KEY_END_OF_WEEK: if (wins_slctd () == CAL) { do_storage = true; @@ -514,8 +493,8 @@ main (int argc, char **argv) if (conf.confirm_quit) { status_mesg (_(quit_message), choices); - ch = wgetch (win[STA].p); - if (ch == 'y') + key = wgetch (win[STA].p); + if (key == 'y') exit_calcurse (EXIT_SUCCESS); else { diff --git a/src/calendar.c b/src/calendar.c index 94dd870..ca1ec2f 100755 --- a/src/calendar.c +++ b/src/calendar.c @@ -1,4 +1,4 @@ -/* $calcurse: calendar.c,v 1.17 2008/08/10 09:24:46 culot Exp $ */ +/* $calcurse: calendar.c,v 1.18 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -35,10 +35,11 @@ #include "day.h" #include "apoint.h" #include "event.h" -#include "calendar.h" #include "custom.h" #include "vars.h" +#include "keys.h" #include "utils.h" +#include "calendar.h" #ifndef M_PI #define M_PI 3.14159265358979323846 @@ -387,7 +388,7 @@ calendar_change_day (int datefmt) if (wrong_day) { status_mesg (mesg_line1, mesg_line2); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } } diff --git a/src/custom.c b/src/custom.c index 8afd913..9588692 100755 --- a/src/custom.c +++ b/src/custom.c @@ -1,4 +1,4 @@ -/* $calcurse: custom.c,v 1.24 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: custom.c,v 1.25 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -31,6 +31,7 @@ #include "i18n.h" #include "io.h" #include "utils.h" +#include "keys.h" #include "apoint.h" static struct attribute_s attr; @@ -225,7 +226,7 @@ custom_load_conf (conf_t *conf, int background) status_mesg (mesg_line1, mesg_line2); wnoutrefresh (win[STA].p); doupdate (); - wgetch (win[STA].p); + keys_getch (win[STA].p); } var = CUSTOM_CONF_NOVARIABLE; pthread_mutex_lock (&nbar->mutex); @@ -392,11 +393,11 @@ layout_config (void) _(" [1]AT [2]AC [3]TA [4]CA [5]TA [6]TC [7]AT [8]CT"); status_mesg (layout_mesg, choice_mesg); - wgetch (win[STA].p); + keys_getch (win[STA].p); status_mesg (layout_up_mesg, layout_down_mesg); wnoutrefresh (win[STA].p); doupdate (); - while ((ch = wgetch (win[STA].p)) != 'q') + while ((ch = keys_getch (win[STA].p)) != 'q') { if (ch <= '8' && ch >= '1') { @@ -581,7 +582,7 @@ custom_color_config (void) display_color_config (&conf_win, &mark_fore, &mark_back, cursor, need_reset, theme_changed); - while ((ch = wgetch (win[STA].p)) != 'q') + while ((ch = keys_getch (win[STA].p)) != 'q') { need_reset = 0; theme_changed = 0; @@ -809,7 +810,7 @@ custom_general_config (conf_t *conf) cwin.total_lines = print_general_options (cwin.pad.p, conf); wins_scrollwin_display (&cwin); - while ((ch = wgetch (win[STA].p)) != 'q') + while ((ch = keys_getch (win[STA].p)) != 'q') { switch (ch) { @@ -831,10 +832,10 @@ custom_general_config (conf_t *conf) notify_update_bar (); } break; - case CTRL ('n'): + case KEY_MOVE_DOWN: wins_scrollwin_down (&cwin); break; - case CTRL ('p'): + case KEY_MOVE_UP: wins_scrollwin_up (&cwin); break; case '1': diff --git a/src/day.c b/src/day.c index 5986bb2..c8ca3cb 100755 --- a/src/day.c +++ b/src/day.c @@ -1,4 +1,4 @@ -/* $calcurse: day.c,v 1.37 2008/04/19 21:05:15 culot Exp $ */ +/* $calcurse: day.c,v 1.38 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -34,6 +34,7 @@ #include "apoint.h" #include "event.h" #include "custom.h" +#include "keys.h" #include "day.h" static struct day_item_s *day_items_ptr; @@ -526,7 +527,7 @@ day_edit_time (long time) if (check_time (timestr) != 1 || strlen (timestr) == 0) { status_mesg (fmt_msg, enter_str); - wgetch (win[STA].p); + keys_getch (win[STA].p); } else return (timestr); @@ -558,7 +559,7 @@ update_start_time (long *start, long *dur) else { status_mesg (msg_wrong_time, msg_enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); valid_date = 0; } } @@ -641,7 +642,7 @@ update_rept (struct rpt_s **rpt, const long start, conf_t *conf) if (newfreq == 0) { status_mesg (msg_wrong_freq, msg_enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } } @@ -684,7 +685,7 @@ update_rept (struct rpt_s **rpt, const long start, conf_t *conf) if (newuntil < start) { status_mesg (msg_wrong_time, msg_enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); date_entered = 0; } else @@ -695,7 +696,7 @@ update_rept (struct rpt_s **rpt, const long start, conf_t *conf) snprintf (outstr, BUFSIZ, msg_fmts, DATEFMT_DESC (conf->input_datefmt)); status_mesg (msg_wrong_date, _(outstr)); - wgetch (win[STA].p); + keys_getch (win[STA].p); date_entered = 0; } } @@ -735,8 +736,8 @@ day_edit_item (conf_t *conf) case RECUR_EVNT: re = recur_get_event (date, day_item_nb (date, item_num, RECUR_EVNT)); status_mesg (_("Edit: (1)Description or (2)Repetition?"), "[1/2] "); - while (ch != '1' && ch != '2' && ch != ESCAPE) - ch = wgetch (win[STA].p); + while (ch != '1' && ch != '2' && ch != KEY_GENERIC_ESCAPE) + ch = keys_getch (win[STA].p); switch (ch) { case '1': @@ -758,8 +759,8 @@ day_edit_item (conf_t *conf) status_mesg (_("Edit: (1)Start time, (2)End time, " "(3)Description or (4)Repetition?"), "[1/2/3/4] "); while (ch != STRT && ch != END && ch != DESC && - ch != REPT && ch != ESCAPE) - ch = wgetch (win[STA].p); + ch != REPT && ch != KEY_GENERIC_ESCAPE) + ch = keys_getch (win[STA].p); switch (ch) { case STRT: @@ -774,7 +775,7 @@ day_edit_item (conf_t *conf) case REPT: update_rept (&ra->rpt, ra->start, conf); break; - case ESCAPE: + case KEY_GENERIC_ESCAPE: return; } break; @@ -782,8 +783,8 @@ day_edit_item (conf_t *conf) a = apoint_get (date, day_item_nb (date, item_num, APPT)); status_mesg (_("Edit: (1)Start time, (2)End time " "or (3)Description?"), "[1/2/3] "); - while (ch != STRT && ch != END && ch != DESC && ch != ESCAPE) - ch = wgetch (win[STA].p); + while (ch != STRT && ch != END && ch != DESC && ch != KEY_GENERIC_ESCAPE) + ch = keys_getch (win[STA].p); switch (ch) { case STRT: @@ -795,7 +796,7 @@ day_edit_item (conf_t *conf) case DESC: update_desc (&a->mesg); break; - case ESCAPE: + case KEY_GENERIC_ESCAPE: return; } break; @@ -832,7 +833,7 @@ day_erase_item (long date, int item_number, erase_flag_e flag) while (ans != 'i' && ans != 'n') { status_mesg (note_warning, note_choice); - ans = wgetch (win[STA].p); + ans = keys_getch (win[STA].p); } if (ans == 'i') flag = ERASE_FORCE; @@ -851,10 +852,10 @@ day_erase_item (long date, int item_number, erase_flag_e flag) { if (flag == ERASE_FORCE_ONLY_NOTE) ch = 'a'; - while ((ch != 'a') && (ch != 'o') && (ch != ESCAPE)) + while ((ch != 'a') && (ch != 'o') && (ch != KEY_GENERIC_ESCAPE)) { status_mesg (erase_warning, erase_choice); - ch = wgetch (win[STA].p); + ch = keys_getch (win[STA].p); } if (ch == 'a') { diff --git a/src/help.c b/src/help.c index afebcd2..067d24a 100755 --- a/src/help.c +++ b/src/help.c @@ -1,4 +1,4 @@ -/* $calcurse: help.c,v 1.29 2008/09/21 08:06:43 culot Exp $ */ +/* $calcurse: help.c,v 1.30 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -30,10 +30,11 @@ #include #include "i18n.h" -#include "help.h" #include "custom.h" #include "utils.h" +#include "keys.h" #include "notify.h" +#include "help.h" typedef enum { @@ -161,100 +162,96 @@ wanted_page (int ch) switch (ch) { - case '?': + case KEY_GENERIC_HELP: page = HELP_MAIN; break; - case '!': + case KEY_FLAG_ITEM: page = HELP_FLAG; break; - case CTRL ('r'): - case CTRL ('a'): - case CTRL ('t'): - case CTRL ('h'): - case CTRL ('j'): - case CTRL ('k'): - case CTRL ('l'): - case CTRL ('g'): + case KEY_GENERIC_REDRAW: + case KEY_GENERIC_ADD_APPT: + case KEY_GENERIC_ADD_TODO: + case KEY_GENERIC_NEXT_DAY: + case KEY_GENERIC_PREV_DAY: + case KEY_GENERIC_NEXT_WEEK: + case KEY_GENERIC_PREV_WEEK: + case KEY_GENERIC_GOTO_TODAY: page = HELP_GENERAL; break; - case 's': + case KEY_GENERIC_SAVE: page = HELP_SAVE; break; - case 'i': + case KEY_GENERIC_IMPORT: page = HELP_IMPORT; break; - case 'x': + case KEY_GENERIC_EXPORT: page = HELP_EXPORT; break; - case '0': - case '$': - case 'h': - case 'l': - case 'j': - case 'k': - case KEY_UP: - case KEY_DOWN: - case KEY_RIGHT: - case KEY_LEFT: + case KEY_END_OF_WEEK: + case KEY_START_OF_WEEK: + case KEY_MOVE_UP: + case KEY_MOVE_DOWN: + case KEY_MOVE_RIGHT: + case KEY_MOVE_LEFT: page = HELP_DISPLACEMENT; break; - case 'a': + case KEY_ADD_ITEM: page = HELP_ADD; break; - case 'g': + case KEY_GENERIC_GOTO: page = HELP_GOTO; break; - case 'd': + case KEY_DEL_ITEM: page = HELP_DELETE; break; - case 'e': + case KEY_EDIT_ITEM: page = HELP_EDIT; break; - case 'n': + case KEY_EDIT_NOTE: page = HELP_ENOTE; break; - case '>': + case KEY_VIEW_NOTE: page = HELP_VNOTE; break; - case 'c': + case KEY_GENERIC_CONFIG_MENU: page = HELP_CONFIG; break; - case 'o': + case KEY_GENERIC_OTHER_CMD: page = HELP_OTHER; break; - case 'r': + case KEY_REPEAT_ITEM: page = HELP_REPEAT; break; - case 'v': + case KEY_VIEW_ITEM: page = HELP_VIEW; break; - case '+': - case '-': + case KEY_RAISE_PRIORITY: + case KEY_LOWER_PRIORITY: page = HELP_PRIORITY; break; - case 9: + case KEY_GENERIC_CHANGE_VIEW: page = HELP_TAB; break; - case '@': + case KEY_GENERIC_CREDITS: page = HELP_CREDITS; break; @@ -272,7 +269,7 @@ help_screen (void) { scrollwin_t hwin; int need_resize; - int ch = '?'; + int ch = KEY_GENERIC_HELP; int page, oldpage; help_page_t hscr[HELPSCREENS]; @@ -604,7 +601,7 @@ help_screen (void) need_resize = 0; /* Display the help screen related to user input. */ - while (ch != 'q') + while (ch != KEY_GENERIC_QUIT) { erase_window_part (hwin.win.p, 1, hwin.pad.y, col - 2, hwin.win.h - 2); @@ -618,11 +615,11 @@ help_screen (void) need_resize = 1; break; - case CTRL ('n'): + case KEY_GENERIC_SCROLL_DOWN: wins_scrollwin_down (&hwin); break; - case CTRL ('p'): + case KEY_GENERIC_SCROLL_UP: wins_scrollwin_up (&hwin); break; @@ -637,8 +634,7 @@ help_screen (void) break; } wins_scrollwin_display (&hwin); - ch = wgetch (win[STA].p); - ch = tolower (ch); + ch = keys_getch (win[STA].p); } wins_scrollwin_delete (&hwin); if (need_resize) diff --git a/src/htable.h b/src/htable.h index 7ceab4c..67d4a0d 100644 --- a/src/htable.h +++ b/src/htable.h @@ -1,4 +1,4 @@ -/* $calcurse: htable.h,v 1.2 2008/11/09 20:10:18 culot Exp $ */ +/* $Id: htable.h,v 1.3 2008/11/16 17:42:53 culot Exp $ */ /* * Copyright (c) 2008 Frederic Culot @@ -152,7 +152,7 @@ name##_HTABLE_INSERT(struct name *head, struct type *elm) \ while ((__bktp = *__bktpp)) \ { \ if (!(cmp)(elm, __bktp)) \ - return __bktp; \ + return NULL; \ else \ { \ __pos++; \ diff --git a/src/io.c b/src/io.c index b94ef6a..cdfa819 100755 --- a/src/io.c +++ b/src/io.c @@ -1,4 +1,4 @@ -/* $calcurse: io.c,v 1.41 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: io.c,v 1.42 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -47,8 +47,6 @@ #define ICALDATEFMT "%Y%m%d" #define ICALDATETIMEFMT "%Y%m%dT%H%M%S" -#define STRING_BUILD(str) {str, sizeof (str) - 1} - typedef enum { PROGRESS_BAR_SAVE, @@ -56,11 +54,6 @@ typedef enum PROGRESS_BAR_EXPORT } progress_bar_t; -typedef struct { - const char *str; - const int len; -} string_t; - typedef enum { ICAL_VEVENT, ICAL_VTODO, @@ -216,7 +209,7 @@ get_export_stream (export_type_t type) if (stream == NULL) { status_mesg (wrong_name, press_enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } free (stream_name); @@ -913,7 +906,7 @@ io_save_cal (io_mode_t mode, conf_t *conf) if (mode == IO_MODE_INTERACTIVE && !conf->skip_system_dialogs) { status_mesg (save_success, enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } @@ -1127,7 +1120,7 @@ io_load_todo (void) if (data_file == NULL) { status_mesg (mesg_line1, mesg_line2); - wgetch (win[STA].p); + keys_getch (win[STA].p); } for (;;) { @@ -1190,22 +1183,6 @@ load_keys_ht_compare (struct ht_keybindings_s *data1, return 1; } -static int -key_to_ascii (char *key) -{ - const string_t CONTROL_KEY = STRING_BUILD ("CTRL-"); - - if (strlen (key) == 1) - return (int)key[0]; - else - { - if (!strncmp (key, CONTROL_KEY.str, CONTROL_KEY.len)) - return CTRL ((int)key[CONTROL_KEY.len]); - else - return 0; - } -} - /* * Load user-definable keys from file. * A hash table is used to speed up loading process in avoiding string @@ -1214,7 +1191,7 @@ key_to_ascii (char *key) void io_load_keys (void) { - struct ht_keybindings_s keys[NOKEYS]; + struct ht_keybindings_s keys[NBKEYS]; FILE *keyfp; char buf[BUFSIZ]; int i; @@ -1226,7 +1203,7 @@ io_load_keys (void) HTABLE_GENERATE (ht_keybindings, ht_keybindings_s, load_keys_ht_getkey, load_keys_ht_compare); - for (i = 0; i < NOKEYS; i++) + for (i = 0; i < NBKEYS; i++) { keys[i].key = (keys_e)i; keys[i].label = keys_get_label ((keys_e)i); @@ -1261,15 +1238,20 @@ io_load_keys (void) strncpy (tmpbuf, p, BUFSIZ); if (sscanf (tmpbuf, "%s", key_ch) == AWAITED) { - int ch; - char *unknown_key = _("Error reading key: %s"); + int ch, used; + char *unknown_key = _("Error reading key: \"%s\""); + char *already_used = + _("\"%s\" assigned multiple times in keys file!"); - ch = key_to_ascii (key_ch); - p += strlen (key_ch) + 1; - if (ch == 0) - ERROR_MSG (unknown_key); + if ((ch = keys_str2int (key_ch)) < 0) + ERROR_MSG (unknown_key, key_ch); else - keys_assign_binding (ch, ht_elm->key); + { + p += strlen (key_ch) + 1; + used = keys_assign_binding (ch, ht_elm->key); + if (used) + ERROR_MSG (already_used, key_ch); + } } else break; @@ -1323,23 +1305,29 @@ check_file (char *file, int *missing) * | * +--- notes/ * |___ conf + * |___ keys * |___ apts * |___ todo */ int io_check_data_files (void) { - int missing; + int missing, missing_keys; - missing = 0; + missing = missing_keys = 0; errno = 0; check_directory (path_dir, &missing); check_directory (path_notes, &missing); check_file (path_todo, &missing); check_file (path_apts, &missing); check_file (path_conf, &missing); - check_file (path_keys, &missing); - + check_file (path_keys, &missing_keys); + if (missing_keys) + { + missing++; + keys_dump_defaults (path_keys); + } + return missing; } @@ -1355,12 +1343,12 @@ io_startup_screen (bool skip_dialogs, int no_data_file) if (no_data_file != 0) { status_mesg (welcome_mesg, enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } else if (!skip_dialogs) { status_mesg (data_mesg, enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } @@ -1420,7 +1408,7 @@ io_export_data (io_mode_t mode, export_type_t type, conf_t *conf) if (!conf->skip_system_dialogs && mode == IO_MODE_INTERACTIVE) { status_mesg (success, enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } @@ -1612,7 +1600,7 @@ ical_unformat_line (char *line) static char * ical_unfold_content (FILE *fd, char *line, unsigned *lineno) { - const int CHAR_SPACE = 32, CHAR_TAB = 9; + const int CHAR_SPACE = 32; char *content; int c; @@ -1623,7 +1611,7 @@ ical_unfold_content (FILE *fd, char *line, unsigned *lineno) for (;;) { c = getc (fd); - if (c == CHAR_SPACE || c == CHAR_TAB) + if (c == CHAR_SPACE || c == TAB) { char buf[BUFSIZ]; @@ -2460,7 +2448,7 @@ get_import_stream (export_type_t type) if (stream == NULL) { status_mesg (wrong_file, press_enter); - wgetch (win[STA].p); + keys_getch (win[STA].p); } } mem_free (stream_name); @@ -2556,7 +2544,7 @@ io_import_data (io_mode_t mode, import_type_t type, conf_t *conf, snprintf (stat, BUFSIZ, lines_stats_interactive, stats.apoints, stats.events, stats.todos, stats.skipped); status_mesg (read, stat); - wgetch (win[STA].p); + keys_getch (win[STA].p); } else if (mode == IO_MODE_NONINTERACTIVE) { @@ -2596,7 +2584,7 @@ io_import_data (io_mode_t mode, import_type_t type, conf_t *conf, status_mesg (view_log, choices); do { - ans = wgetch (win[STA].p); + ans = keys_getch (win[STA].p); if (ans == 'y') { wins_launch_external (flogname, conf->pager); diff --git a/src/keys.c b/src/keys.c index 2c0fc98..4f8f9bc 100755 --- a/src/keys.c +++ b/src/keys.c @@ -1,4 +1,4 @@ -/* $calcurse: keys.c,v 1.2 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: keys.c,v 1.3 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -24,138 +24,277 @@ * */ +#include + #include "i18n.h" #include "utils.h" -#include "htable.h" #include "keys.h" -#define HTKEYSIZE 512 +#define MAXKEYVAL 256 + +struct keydef_s { + char *label; + char *binding; +}; -struct keys_s { - int key; - keys_e action; - HTABLE_ENTRY (keys_s); +struct key_str_s { + char *str; + struct key_str_s *next; }; -static HTABLE_HEAD (ht_keys, HTKEYSIZE, keys_s) ht_keys_action = - HTABLE_INITIALIZER (&ht_keys_action); - -static char *keylabel[NOKEYS] = { - "generic-help", - "generic-quit", - "generic-save", - "generic-change-view", - "generic-import", - "generic-export", - - "generic-goto", - "generic-other-cmd", - "generic-config-menu", - "generic-redraw", - - "generic-add-appt", - "generic-add-todo", - "generic-next-ady", - "generic-prev-day", - "generic-next-week", - "generic-prev-week", - "generic-goto-today", +static struct key_str_s *keys[NBKEYS]; + +static keys_e actions[MAXKEYVAL]; + +static struct keydef_s keydef[NBKEYS] = { + {"generic-escape", "ESC"}, + {"generic-credits", "@"}, + {"generic-help", "?"}, + {"generic-quit", "q Q"}, + {"generic-save", "s S C-s"}, + {"generic-change-view", "TAB"}, + {"generic-import", "i I"}, + {"generic-export", "x X"}, + {"generic-goto", "g G"}, + {"generic-other-cmd", "o O"}, + {"generic-config-menu", "c C"}, + {"generic-redraw", "C-r"}, + {"generic-add-appt", "C-a"}, + {"generic-add-todo", "C-t"}, + {"generic-next-day", "C-l"}, + {"generic-prev-day", "C-h"}, + {"generic-next-week", "C-j"}, + {"generic-prev-week", "C-k"}, + {"generic-scroll-down", "C-n"}, + {"generic-scroll-up", "C-p"}, + {"generic-goto-today", "C-g"}, - "cal-next-day", - "cal-prev-day", - "cal-next-week", - "cal-prev-week", - "cal-start-of-week", - "cal-end-of-week", - - "apt-add-item", - "apt-del-item", - "apt-edit-item", - "apt-view-item", - "apt-flag-item", - "apt-repeat", - "apt-move-up", - "apt-move-down", - "apt-edit-note", - "apt-view-note", - - "todo-add-item", - "todo-del-item", - "todo-edit-item", - "todo-view-item", - "todo-raise-priority", - "todo-lower-priority", - "todo-move-up", - "todo-move-down", - "todo-edit-note", - "todo-view-bote", - - "config-quit", - "config-general-menu", - "config-layout-menu", - "config-color-menu", - "config-notify-menu" + {"move-right", "l L"}, + {"move-left", "h H"}, + {"move-down", "j J"}, + {"move-up", "k K"}, + {"start-of-week", "0"}, + {"end-of-week", "$"}, + {"add-item", "a A"}, + {"del-item", "d D"}, + {"edit-item", "e E"}, + {"view-item", "v V"}, + {"flag-item", "!"}, + {"repeat", "r R"}, + {"edit-note", "n N"}, + {"view-note", ">"}, + {"raise-priority", "+"}, + {"lower-priority", "-"}, }; static void -ht_getkey (struct keys_s *data, char **key, int *len) +dump_intro (FILE *fd) { - *key = (char *)&data->key; - *len = sizeof (int); + char *intro = + _("#\n" + "# Calcurse keys configuration file\n#\n" + "# This file sets the keybindings used by Calcurse.\n" + "# Lines beginning with \"#\" are comments, and ignored by Calcurse.\n" + "# To assign a keybinding to an action, this file must contain a line\n" + "# with the following syntax:\n#\n" + "# ACTION KEY1 KEY2 ... KEYn\n#\n" + "# Where ACTION is what will be performed when KEY1, KEY2, ..., or KEYn\n" + "# will be pressed.\n" + "#\n" + "# To define bindings which use the CONTROL key, prefix the key with " + "'C-'.\n" + "# The escape and horizontal Tab key can be specified using the 'ESC'\n" + "# and 'TAB' keyword, respectively.\n"); + + fprintf (fd, "%s\n", intro); } -static int -ht_compare (struct keys_s *data1, struct keys_s *data2) +void +keys_init (void) { - if (data1->key == data2->key) - return 0; - else - return 1; + int i; + + for (i = 0; i < MAXKEYVAL; i++) + actions[i] = KEY_UNDEF; + bzero (keys, NBKEYS); } -HTABLE_GENERATE (ht_keys, keys_s, ht_getkey, ht_compare); +void +keys_dump_defaults (char *file) +{ + FILE *fd; + int i; + + fd = fopen (file, "w"); + EXIT_IF (fd == NULL, _("FATAL ERROR in keys_dump_defaults: " + "could not create default keys file.")); + + dump_intro (fd); + for (i = 0; i < NBKEYS; i++) + fprintf (fd, "%s %s\n", keydef[i].label, keydef[i].binding); + fclose (fd); +} char * keys_get_label (keys_e key) { - EXIT_IF (key < 0 || key > NOKEYS, + EXIT_IF (key < 0 || key > NBKEYS, _("FATAL ERROR in keys_get_label: key value out of bounds")); - return keylabel[key]; + return keydef[key].label; +} + +static int +keys_get_action (int pressed) +{ + if (pressed < 0 || pressed > MAXKEYVAL) + return -1; + else + return actions[pressed]; +} + +keys_e +keys_getch (WINDOW *win) +{ + int ch; + + ch = wgetch (win); + + return keys_get_action (ch); +} + +static void +add_key_str (keys_e action, int key) +{ + struct key_str_s *new, **i; + + if (action < 0 || action > NBKEYS) + return; + + new = malloc (sizeof (struct key_str_s)); + new->str = strdup (keys_int2str (key)); + new->next = NULL; + i = &keys[action]; + for (;;) + { + if (*i == NULL) + { + *i = new; + break; + } + else if ((*i)->next == NULL) + { + (*i)->next = new; + break; + } + i = &(*i)->next; + } } int -keys_get_key (int pressed) +keys_assign_binding (int key, keys_e action) +{ + if (key < 0 || key > MAXKEYVAL || actions[key] != KEY_UNDEF) + return 1; + else + { + actions[key] = action; + add_key_str (action, key); + } + + return 0; +} + +static void +del_key_str (keys_e action, int key) { - struct keys_s *key, find; + struct key_str_s *old, **i; + char oldstr[BUFSIZ]; + int oldstrlen; + + if (action < 0 || action > NBKEYS) + return; - find.key = pressed; - key = HTABLE_LOOKUP (ht_keys, &ht_keys_action, &find); + strncpy (oldstr, keys_int2str (key), BUFSIZ); + oldstrlen = strlen (oldstr); + for (i = &keys[action]; *i; i = &(*i)->next) + { + if (strlen ((*i)->str) == oldstrlen + && !(strncmp ((*i)->str, oldstr, oldstrlen))) + { + old = (*i); + (*i) = old->next; + mem_free (old->str); + mem_free (old); + break; + } + } +} - if (key) - return (int)key->action; +void +keys_remove_binding (int key, keys_e action) +{ + if (key < 0 || key > MAXKEYVAL) + return; else + { + actions[key] = KEY_UNDEF; + del_key_str (action, key); + } +} + +int +keys_str2int (char *key) +{ + const string_t CONTROL_KEY = STRING_BUILD ("C-"); + const string_t TAB_KEY = STRING_BUILD ("TAB"); + const string_t ESCAPE_KEY = STRING_BUILD ("ESC"); + + if (!key) return -1; + if (strlen (key) == 1) + return (int)key[0]; + else + { + if (!strncmp (key, CONTROL_KEY.str, CONTROL_KEY.len)) + return CTRL ((int)key[CONTROL_KEY.len]); + else if (!strncmp (key, TAB_KEY.str, TAB_KEY.len)) + return TAB; + else if (!strncmp (key, ESCAPE_KEY.str, ESCAPE_KEY.len)) + return ESCAPE; + else + return -1; + } } -void -keys_assign_binding (int key, keys_e action) +char * +keys_int2str (int key) { - struct keys_s *binding; + return keyname (key); +} - binding = malloc (sizeof (struct keys_s)); - binding->key = key; - binding->action = action; - HTABLE_INSERT (ht_keys, &ht_keys_action, binding); +char * +keys_action_firstkey (keys_e action) +{ + return (keys[action] != NULL) ? keys[action]->str : NULL; } -void -key_remove_binding (int key, keys_e action) +char * +keys_action_allkeys (keys_e action) { - struct keys_s find, *removed; + static char keystr[BUFSIZ]; + struct key_str_s *i; + const char *SPACE = " "; + + if (keys[action] == NULL) + return NULL; + keystr[0] = '\0'; + for (i = keys[action]; i; i = i->next) + { + const int MAXLEN = sizeof (keystr) - 1 - strlen (keystr); + strncat (keystr, i->str, MAXLEN - 1); + strncat (keystr, SPACE, 1); + } - find.key = key; - find.action = action; - removed = HTABLE_REMOVE (ht_keys, &ht_keys_action, &find); - mem_free (removed); + return keystr; } diff --git a/src/keys.h b/src/keys.h index c16d3e1..ef9faa4 100755 --- a/src/keys.h +++ b/src/keys.h @@ -1,4 +1,4 @@ -/* $calcurse: keys.h,v 1.2 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: keys.h,v 1.3 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -27,8 +27,16 @@ #ifndef CALCURSE_KEYS_H #define CALCURSE_KEYS_H +#define CTRLVAL 0x1F +#define TAB 9 + +#define CTRL(x) ((x) & CTRLVAL) +#define ESCAPE 27 + typedef enum { + KEY_GENERIC_ESCAPE, + KEY_GENERIC_CREDITS, KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE, @@ -45,50 +53,41 @@ typedef enum KEY_GENERIC_PREV_DAY, KEY_GENERIC_NEXT_WEEK, KEY_GENERIC_PREV_WEEK, + KEY_GENERIC_SCROLL_DOWN, + KEY_GENERIC_SCROLL_UP, KEY_GENERIC_GOTO_TODAY, - KEY_CAL_NEXT_DAY, - KEY_CAL_PREV_DAY, - KEY_CAL_NEXT_WEEK, - KEY_CAL_PREV_WEEK, - KEY_CAL_START_OF_WEEK, - KEY_CAL_END_OF_WEEK, - - KEY_APT_ADD_ITEM, - KEY_APT_DEL_ITEM, - KEY_APT_EDIT_ITEM, - KEY_APT_VIEW_ITEM, - KEY_APT_FLAG_ITEM, - KEY_APT_REPEAT, - KEY_APT_MOVE_UP, - KEY_APT_MOVE_DOWN, - KEY_APT_EDIT_NOTE, - KEY_APT_VIEW_NOTE, - - KEY_TODO_ADD_ITEM, - KEY_TODO_DEL_ITEM, - KEY_TODO_EDIT_ITEM, - KEY_TODO_VIEW_ITEM, - KEY_TODO_RAISE_PRIORITY, - KEY_TODO_LOWER_PRIORITY, - KEY_TODO_MOVE_UP, - KEY_TODO_MOVE_DOWN, - KEY_TODO_EDIT_NOTE, - KEY_TODO_VIEW_NOTE, - - KEY_CONFIG_QUIT, - KEY_CONFIG_GENERAL_MENU, - KEY_CONFIG_LAYOUT_MENU, - KEY_CONFIG_COLOR_MENU, - KEY_CONFIG_NOTIFY_MENU, + KEY_MOVE_RIGHT, + KEY_MOVE_LEFT, + KEY_MOVE_DOWN, + KEY_MOVE_UP, + KEY_START_OF_WEEK, + KEY_END_OF_WEEK, + KEY_ADD_ITEM, + KEY_DEL_ITEM, + KEY_EDIT_ITEM, + KEY_VIEW_ITEM, + KEY_FLAG_ITEM, + KEY_REPEAT_ITEM, + KEY_EDIT_NOTE, + KEY_VIEW_NOTE, + KEY_RAISE_PRIORITY, + KEY_LOWER_PRIORITY, - NOKEYS + NBKEYS, + KEY_UNDEF } keys_e; +void keys_init (void); +void keys_dump_defaults (char *); char *keys_get_label (keys_e); -int keys_get_key (int); -void keys_assign_binding (int, keys_e); -void key_remove_binding (int, keys_e); +keys_e keys_getch (WINDOW *win); +int keys_assign_binding (int, keys_e); +void keys_remove_binding (int, keys_e); +int keys_str2int (char *); +char *keys_int2str (int); +char *keys_action_firstkey (keys_e); +char *keys_action_allkeys (keys_e); #endif /* CALCURSE_KEYS_H */ diff --git a/src/notify.c b/src/notify.c index 422ce09..7c1108a 100755 --- a/src/notify.c +++ b/src/notify.c @@ -1,4 +1,4 @@ -/* $calcurse: notify.c,v 1.27 2008/04/20 13:49:39 culot Exp $ */ +/* $calcurse: notify.c,v 1.28 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -32,6 +32,7 @@ #include "i18n.h" #include "utils.h" #include "custom.h" +#include "keys.h" #include "notify.h" static struct notify_vars_s *notify = NULL; @@ -538,7 +539,7 @@ notify_config_bar (void) status_mesg (number_str, ""); notify_print_options (conf_win.p, col); *buf = '\0'; - ch = wgetch (win[STA].p); + ch = keys_getch (win[STA].p); switch (ch) { diff --git a/src/recur.c b/src/recur.c index c0024a4..0207e9d 100755 --- a/src/recur.c +++ b/src/recur.c @@ -1,4 +1,4 @@ -/* $calcurse: recur.c,v 1.38 2008/09/16 19:41:36 culot Exp $ */ +/* $calcurse: recur.c,v 1.39 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -34,6 +34,7 @@ #include "utils.h" #include "notify.h" #include "day.h" +#include "keys.h" #include "recur.h" recur_apoint_llist_t *recur_alist_p; @@ -688,18 +689,18 @@ recur_repeat_item (conf_t *conf) if (p->type != APPT && p->type != EVNT) { status_mesg (wrong_type_1, wrong_type_2); - ch = wgetch (win[STA].p); + ch = keys_getch (win[STA].p); return; } while ((ch != 'D') && (ch != 'W') && (ch != 'M') - && (ch != 'Y') && (ch != ESCAPE)) + && (ch != 'Y') && (ch != KEY_GENERIC_ESCAPE)) { status_mesg (mesg_type_1, mesg_type_2); - ch = wgetch (win[STA].p); + ch = keys_getch (win[STA].p); ch = toupper (ch); } - if (ch == ESCAPE) + if (ch == KEY_GENERIC_ESCAPE) { return; } @@ -718,7 +719,7 @@ recur_repeat_item (conf_t *conf) if (freq == 0) { status_mesg (mesg_wrong_freq, wrong_type_2); - wgetch (win[STA].p); + keys_getch (win[STA].p); } user_input[0] = '\0'; } @@ -752,7 +753,7 @@ recur_repeat_item (conf_t *conf) if (until < p->start) { status_mesg (mesg_older, wrong_type_2); - wgetch (win[STA].p); + keys_getch (win[STA].p); date_entered = 0; } else @@ -765,7 +766,7 @@ recur_repeat_item (conf_t *conf) snprintf (outstr, BUFSIZ, mesg_wrong_2, DATEFMT_DESC (conf->input_datefmt)); status_mesg (mesg_wrong_1, _(outstr)); - wgetch (win[STA].p); + keys_getch (win[STA].p); date_entered = 0; } } diff --git a/src/todo.c b/src/todo.c index 54fd059..0a54074 100755 --- a/src/todo.c +++ b/src/todo.c @@ -1,4 +1,4 @@ -/* $calcurse: todo.c,v 1.23 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: todo.c,v 1.24 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -146,7 +146,7 @@ todo_new_item (void) while ((ch < '1') || (ch > '9')) { status_mesg (mesg_id, ""); - ch = wgetch (win[STA].p); + ch = keys_getch (win[STA].p); } todo_add (todo_input, ch - '0', NULL); todos++; @@ -249,7 +249,7 @@ todo_delete (conf_t *conf) if (conf->confirm_delete) { status_mesg (del_todo_str, choices); - answer = wgetch (win[STA].p); + answer = keys_getch (win[STA].p); if ((answer == 'y') && (todos > 0)) { go_for_todo_del = true; @@ -274,10 +274,10 @@ todo_delete (conf_t *conf) if (has_note == 0) answer = 't'; - while (answer != 't' && answer != 'n' && answer != ESCAPE) + while (answer != 't' && answer != 'n' && answer != KEY_GENERIC_ESCAPE) { status_mesg (erase_warning, erase_choice); - answer = wgetch (win[STA].p); + answer = keys_getch (win[STA].p); } switch (answer) @@ -348,11 +348,11 @@ todo_chg_priority (int action) strncpy (backup_note, backup->note, NOTESIZ + 1); else backup_note[0] = '\0'; - if (action == KEY_TODO_RAISE_PRIORITY) + if (action == KEY_RAISE_PRIORITY) { (backup_id > 1) ? backup_id-- : do_chg--; } - else if (action == KEY_TODO_LOWER_PRIORITY) + else if (action == KEY_LOWER_PRIORITY) { (backup_id < 9) ? backup_id++ : do_chg--; } diff --git a/src/utils.c b/src/utils.c index 482edac..caec3af 100755 --- a/src/utils.c +++ b/src/utils.c @@ -1,4 +1,4 @@ -/* $calcurse: utils.c,v 1.52 2008/09/23 17:31:57 culot Exp $ */ +/* $calcurse: utils.c,v 1.53 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -37,8 +37,21 @@ #include "i18n.h" #include "wins.h" #include "custom.h" +#include "keys.h" #include "utils.h" +#define NB_CAL_CMDS 26 /* number of commands while in cal view */ +#define NB_APP_CMDS 30 /* 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 KEY_LENGTH 4 /* length of each keybinding + one space */ + +typedef struct { + char *label; + keys_e action; +} binding_t; + static unsigned status_page; /* General routine to exit calcurse properly. */ @@ -79,7 +92,7 @@ ierror (const char *errmsg, ierror_sev_e sev) exitmsg); custom_remove_attr (errwin, ATTR_HIGHEST); wrefresh (errwin); - wgetch (errwin); + keys_getch (errwin); if (sev == IERROR_FATAL) exit_calcurse (EXIT_FAILURE); } @@ -114,7 +127,7 @@ warnbox (const char *msg) mvwprintw (warnwin, 5, (WINCOL - strlen (displmsg)) / 2, "%s", displmsg); custom_remove_attr (warnwin, ATTR_HIGHEST); wrefresh (warnwin); - wgetch (warnwin); + keys_getch (warnwin); delwin (warnwin); doupdate (); } @@ -216,7 +229,9 @@ showcursor (WINDOW *win, int y, int pos, char *str, int l, int offset) nc = str + pos; wmove (win, y, pos - offset); - (pos >= l) ? waddch (win, SPC | A_REVERSE) : waddch (win, *nc | A_REVERSE); +#define SPACE 32 + (pos >= l) ? waddch (win, SPACE | A_REVERSE) : waddch (win, *nc | A_REVERSE); +#undef SPACE } /* Print the string at the desired position. */ @@ -356,7 +371,7 @@ getstring (WINDOW *win, char *str, int l, int x, int y) newpos++; break; - case ESCAPE: /* cancel editing */ + case KEY_GENERIC_ESCAPE: /* cancel editing */ return (GETSTRING_ESC); break; @@ -427,64 +442,98 @@ is_all_digit (char *string) return (all_digit); } +/* Need this to display keys properly inside status bar. */ +static char * +format_key (char *key) +{ + static char fmtkey[KEY_LENGTH]; + + switch (strlen (key)) + { + case 0: + snprintf (fmtkey, KEY_LENGTH, " ?"); + case 1: + snprintf (fmtkey, KEY_LENGTH, " %s", key); + break; + case 2: + snprintf (fmtkey, KEY_LENGTH, " %s", key); + break; + case 3: + snprintf (fmtkey, KEY_LENGTH, "%s", key); + break; + default: + snprintf (fmtkey, KEY_LENGTH, "%c%c.", key[0], key[1]); + /* NOTREACHED */ + } + return fmtkey; +} + /* * Draws the status bar. * To add a keybinding, insert a new binding_t item, add it in the *binding - * table, and update the NB_CAL_CMDS, NB_APP_CMDS or NB_TOD_CMDS defines in - * utils.h, depending on which panel the added keybind is assigned to. + * 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 status_bar (void) { +#define NB_PANELS 3 /* 3 panels: CALENDAR, APPOINTMENT, TODO */ window_e which_pan; - int cmd_length, space_between_cmds, start, end, i, j = 0; + int cmd_length, space_between_cmds, start, end, i, j; const int pos[NB_PANELS + 1] = { 0, NB_CAL_CMDS, NB_CAL_CMDS + NB_APP_CMDS, TOTAL_CMDS }; - binding_t help = { " ?", _("Help") }; - binding_t quit = { " Q", _("Quit") }; - binding_t save = { " S", _("Save") }; - binding_t export = { " X", _("Export") }; - binding_t import = { " I", _("Import") }; - binding_t add = { " A", _("Add Item") }; - binding_t del = { " D", _("Del Item") }; - binding_t edit = { " E", _("Edit Itm") }; - binding_t flag = { " !", _("Flag Itm") }; - binding_t day = { "H/L", _("-+1 Day") }; - binding_t week = { "K/J", _("-+1 Week") }; - binding_t updn = { "K/J", _("Up/Down") }; - binding_t rept = { " R", _("Repeat") }; - binding_t prio = { "+/-", _("Priority") }; - binding_t tab = { "Tab", _("Chg View") }; - binding_t togo = { " G", _("Go to") }; - binding_t conf = { " C", _("Config") }; - binding_t view = { " V", _("View") }; - binding_t draw = { " ^R", _("Redraw") }; - binding_t appt = { " ^A", _("Add Appt") }; - binding_t todo = { " ^T", _("Add Todo") }; - binding_t enote = { " N", _("EditNote") }; - binding_t vnote = { " >", _("ViewNote") }; - binding_t eday = { "^HL", _("-+1 Day") }; - binding_t ewek = { "^KJ", _("-+1 Week") }; - binding_t othr = { " O", _("OtherCmd") }; - binding_t today = {" ^G", _("Today") }; - binding_t weekb = {" 0", _("beg Week") }; - binding_t weeke = {" $", _("end Week") }; - + binding_t crdts = {_("Credits"), KEY_GENERIC_CREDITS}; + binding_t help = {_("Help"), KEY_GENERIC_HELP}; + binding_t quit = {_("Quit"), KEY_GENERIC_QUIT}; + binding_t save = {_("Save"), KEY_GENERIC_SAVE}; + binding_t chgvu = {_("Chg View"), KEY_GENERIC_CHANGE_VIEW}; + binding_t import = {_("Import"), KEY_GENERIC_IMPORT}; + binding_t export = {_("Export"), KEY_GENERIC_EXPORT}; + binding_t togo = {_("Go to"), KEY_GENERIC_GOTO}; + binding_t othr = {_("OtherCmd"), KEY_GENERIC_OTHER_CMD}; + binding_t conf = {_("Config"), KEY_GENERIC_CONFIG_MENU}; + binding_t draw = {_("Redraw"), KEY_GENERIC_REDRAW}; + binding_t appt = {_("Add Appt"), KEY_GENERIC_ADD_APPT}; + binding_t todo = {_("Add Todo"), KEY_GENERIC_ADD_TODO}; + binding_t gnday = {_("+1 Day"), KEY_GENERIC_NEXT_DAY}; + binding_t gpday = {_("-1 Day"), KEY_GENERIC_PREV_DAY}; + binding_t gnweek = {_("+1 Week"), KEY_GENERIC_NEXT_WEEK}; + binding_t gpweek = {_("-1 Week"), KEY_GENERIC_PREV_WEEK}; + binding_t today = {_("Today"), KEY_GENERIC_GOTO_TODAY}; + binding_t up = {_("Up"), KEY_MOVE_UP}; + binding_t down = {_("Down"), KEY_MOVE_DOWN}; + binding_t left = {_("Left"), KEY_MOVE_LEFT}; + binding_t right = {_("Right"), KEY_MOVE_RIGHT}; + binding_t weekb = {_("beg Week"), KEY_START_OF_WEEK}; + binding_t weeke = {_("end Week"), KEY_END_OF_WEEK}; + binding_t add = {_("Add Item"), KEY_ADD_ITEM}; + binding_t del = {_("Del Item"), KEY_DEL_ITEM}; + binding_t edit = {_("Edit Itm"), KEY_EDIT_ITEM}; + binding_t view = {_("View"), KEY_VIEW_ITEM}; + binding_t flag = {_("Flag Itm"), KEY_FLAG_ITEM}; + binding_t rept = {_("Repeat"), KEY_REPEAT_ITEM}; + binding_t enote = {_("EditNote"), KEY_EDIT_NOTE}; + binding_t vnote = {_("ViewNote"), KEY_VIEW_NOTE}; + binding_t rprio = {_("Prio.+"), KEY_RAISE_PRIORITY}; + binding_t lprio = {_("Prio.-"), KEY_LOWER_PRIORITY}; + binding_t *binding[TOTAL_CMDS] = { /* calendar keys */ - &help, &quit, &save, &tab, &import, &export, &day, &week, &weekb, &weeke, - &togo, &othr, &conf, &draw, &appt, &todo, &eday, &ewek, &today, &othr, + &help, &quit, &save, &chgvu, &import, &export, &up, &down, &left, &right, + &togo, &othr, &weekb, &weeke, &conf, &draw, &appt, &todo, &gnday, &gpday, + &gnweek, &gpweek, &today, &othr, &crdts, &othr, /* appointment keys */ - &help, &quit, &save, &tab, &import, &export, &add, &del, &edit, &view, - &rept, &othr, &updn, &flag, &enote, &vnote, &appt, &todo, &eday, &ewek, - &conf, &togo, &draw, &othr, &today, &othr, + &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, &crdts, &othr, /* todo keys */ - &help, &quit, &save, &tab, &import, &export, &add, &del, &edit, &view, - &prio, &othr, &updn, &conf, &enote, &vnote, &appt, &todo, &eday, &ewek, - &togo, &draw, &today, &othr + &help, &quit, &save, &chgvu, &import, &export, &add, &del, &edit, &view, + &draw, &othr, &rprio, &lprio, &enote, &vnote, &up, &down, &gnday, &gpday, + &gnweek, &gpweek, &togo, &othr, &today, &conf, &appt, &todo, &crdts, &othr }; +#define LABEL_LENGTH 8 /* length of command description */ /* Total length of a command. */ cmd_length = KEY_LENGTH + LABEL_LENGTH; space_between_cmds = floor (col / CMDS_PER_LINE - cmd_length); @@ -495,12 +544,22 @@ status_bar (void) which_pan = wins_slctd (); start = pos[which_pan] + 2 * CMDS_PER_LINE * (status_page - 1); end = MIN (start + 2 * CMDS_PER_LINE, pos[which_pan + 1]); + j = 0; for (i = start; i < end; i += 2) { + char key[KEY_LENGTH], *fmtkey; + + strncpy (key, keys_action_firstkey (binding[i]->action), KEY_LENGTH); + fmtkey = format_key (key); custom_apply_attr (win[STA].p, ATTR_HIGHEST); - mvwprintw (win[STA].p, 0, j * cmd_length, binding[i]->key); + mvwprintw (win[STA].p, 0, j * cmd_length, fmtkey); if (i + 1 != end) - mvwprintw (win[STA].p, 1, j * cmd_length, binding[i + 1]->key); + { + strncpy (key, keys_action_firstkey (binding[i + 1]->action), + KEY_LENGTH); + fmtkey = format_key (key); + mvwprintw (win[STA].p, 1, j * cmd_length, fmtkey); + } custom_remove_attr (win[STA].p, ATTR_HIGHEST); mvwprintw (win[STA].p, 0, j * cmd_length + KEY_LENGTH, binding[i]->label); @@ -510,6 +569,8 @@ status_bar (void) j++; } wnoutrefresh (win[STA].p); +#undef LABEL_LENGTH +#undef NB_PANELS } long @@ -759,7 +820,7 @@ item_in_popup (char *saved_a_start, char *saved_a_end, char *msg, wmove (win[STA].p, 0, 0); pnoutrefresh (pad, 0, 0, margin_top + 2, margin_left, padl, winw); doupdate (); - wgetch (popup_win); + keys_getch (popup_win); delwin (pad); delwin (popup_win); } @@ -1003,6 +1064,8 @@ str_toupper (char *s) void mem_free (void *ptr) { - if (ptr) - free (ptr); + if (!ptr) + return; + free (ptr); + ptr = NULL; } diff --git a/src/utils.h b/src/utils.h index ceaf430..13f8057 100755 --- a/src/utils.h +++ b/src/utils.h @@ -1,4 +1,4 @@ -/* $calcurse: utils.h,v 1.37 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: utils.h,v 1.38 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -35,6 +35,8 @@ #define MAX(x,y) ((x)>(y)?(x):(y)) #define MIN(x,y) ((x)<(y)?(x):(y)) +#define STRING_BUILD(str) {str, sizeof (str) - 1} + #define ERROR_MSG(...) do { \ char msg[BUFSIZ]; \ \ @@ -84,27 +86,14 @@ ((e) ? (void)0 : aerror(__FILE__, __LINE__, #e)); \ } while (0) -#define SPC 32 /* ASCII code for white space */ - -#define NB_CAL_CMDS 20 /* number of commands while in cal view */ -#define NB_APP_CMDS 26 /* same thing while in appointment view */ -#define NB_TOD_CMDS 24 /* same thing while in todo view */ -#define TOTAL_CMDS NB_CAL_CMDS + NB_APP_CMDS + NB_TOD_CMDS -#define NB_PANELS 3 /* 3 panels: CALENDAR, APPOINTMENT, TODO */ -#define CMDS_PER_LINE 6 /* max number of commands per line */ -#define KEY_LENGTH 4 /* length of each keybinding + one space */ -#define LABEL_LENGTH 8 /* length of command description */ - #define GETSTRING_VALID 0 /* value returned by getstring() if text is valid */ #define GETSTRING_ESC 1 /* user pressed escape to cancel editing */ #define GETSTRING_RET 2 /* return was pressed without entering any text */ -typedef struct -{ /* structure defining a keybinding */ - char *key; - char *label; -} -binding_t; +typedef struct { + const char *str; + const int len; +} string_t; typedef enum { diff --git a/src/vars.c b/src/vars.c index 4e838ee..3931729 100755 --- a/src/vars.c +++ b/src/vars.c @@ -1,4 +1,4 @@ -/* $calcurse: vars.c,v 1.10 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: vars.c,v 1.11 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -31,6 +31,7 @@ #include "calendar.h" #include "custom.h" #include "wins.h" +#include "keys.h" #include "vars.h" /* diff --git a/src/vars.h b/src/vars.h index 1527f81..9b0dc06 100755 --- a/src/vars.h +++ b/src/vars.h @@ -1,4 +1,4 @@ -/* $calcurse: vars.h,v 1.25 2008/11/09 20:10:18 culot Exp $ */ +/* $calcurse: vars.h,v 1.26 2008/11/16 17:42:53 culot Exp $ */ /* * Calcurse - text-based organizer @@ -43,8 +43,6 @@ #define KEYS_PATH DIR_NAME KEYS_PATH_NAME #define NOTES_DIR DIR_NAME NOTES_DIR_NAME -#define CTRL(x) ((x) & 0x1f) -#define ESCAPE 27 #define ATTR_FALSE 0 #define ATTR_TRUE 1 #define ATTR_LOWEST 2 -- cgit v1.2.3-54-g00ecf