summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/args.c33
-rwxr-xr-xsrc/calcurse.c8
-rwxr-xr-xsrc/custom.c8
-rwxr-xr-xsrc/help.c25
-rwxr-xr-xsrc/io.c131
-rwxr-xr-xsrc/io.h6
-rwxr-xr-xsrc/utils.c19
-rwxr-xr-xsrc/utils.h18
8 files changed, 146 insertions, 102 deletions
diff --git a/src/args.c b/src/args.c
index 0eb0539..4f676d1 100755
--- a/src/args.c
+++ b/src/args.c
@@ -1,4 +1,4 @@
-/* $calcurse: args.c,v 1.39 2008/09/15 20:40:22 culot Exp $ */
+/* $calcurse: args.c,v 1.40 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -48,7 +48,7 @@ static void
usage ()
{
char *arg_usage =
- _("Usage: calcurse [-h|-v] [-N] [-an] [-t[num]] [-x[format]]\n"
+ _("Usage: calcurse [-h|-v] [-N] [-an] [-t[num]] [-i<file>] [-x[format]]\n"
" [-d <date>|<num>] [-s[date]] [-r[range]]\n"
" [-c<file> | -D<dir>]\n");
fputs (arg_usage, stdout);
@@ -103,6 +103,8 @@ help_arg ()
" print events and appointments for <date> or <num> upcoming days and"
"\n\texit. To specify both a starting date and a range, use the\n"
"\t'--startday' and the '--range' option.\n"
+ "\n -i <file>, --import <file>\n"
+ " import the icalendar data contained in <file>. \n"
"\n -n, --next\n"
" print next appointment within upcoming 24 hours "
"and exit. Also given\n\tis the remaining time before this "
@@ -573,21 +575,22 @@ parse_args (int argc, char **argv, conf_t *conf)
int dflag = 0; /* -d: print appointments for a specified days */
int Dflag = 0; /* -D: specify data directory to use */
int hflag = 0; /* -h: print help text */
+ int iflag = 0; /* -i: import data */
int nflag = 0; /* -n: print next appointment */
int Nflag = 0; /* -N: also print note content with apps and todos */
int rflag = 0; /* -r: specify the range of days to consider */
int sflag = 0; /* -s: specify the first day to consider */
int tflag = 0; /* -t: print todo list */
int vflag = 0; /* -v: print version number */
- int xflag = 0; /* -x: export data to iCalendar format */
+ int xflag = 0; /* -x: export data */
int tnum = 0, xfmt = 0;
int non_interactive = 0, multiple_flag = 0, load_data = 0;
int no_file = 1;
char *ddate = "", *cfile = NULL, *range = NULL, *startday = NULL;
- char *datadir = NULL;
+ char *datadir = NULL, *ifile = NULL;
- static char *optstr = "hvnNax::t::d:c:r:s:D:";
+ static char *optstr = "hvnNax::t::d:c:r:s:D:i:";
struct option longopts[] = {
{"appointment", no_argument, NULL, 'a'},
@@ -595,6 +598,7 @@ parse_args (int argc, char **argv, conf_t *conf)
{"day", required_argument, NULL, 'd'},
{"directory", required_argument, NULL, 'D'},
{"help", no_argument, NULL, 'h'},
+ {"import", required_argument, NULL, 'i'},
{"next", no_argument, NULL, 'n'},
{"note", no_argument, NULL, 'N'},
{"range", required_argument, NULL, 'r'},
@@ -633,6 +637,12 @@ parse_args (int argc, char **argv, conf_t *conf)
case 'h':
hflag = 1;
break;
+ case 'i':
+ iflag = 1;
+ multiple_flag++;
+ load_data++;
+ ifile = optarg;
+ break;
case 'n':
nflag = 1;
multiple_flag++;
@@ -746,9 +756,20 @@ parse_args (int argc, char **argv, conf_t *conf)
{
io_init (cfile, datadir);
no_file = io_check_data_files ();
- if (dflag || aflag || nflag || xflag || rflag || sflag)
+ if (dflag || aflag || nflag || iflag || xflag || rflag || sflag)
io_load_app ();
}
+ if (iflag)
+ {
+ notify_init_vars ();
+ vars_init (conf);
+ custom_load_conf (conf, 0);
+ io_load_todo ();
+ io_import_data (IO_MODE_NONINTERACTIVE, IO_IMPORT_ICAL, conf,
+ ifile);
+ io_save_cal (IO_MODE_NONINTERACTIVE, conf);
+ non_interactive = 1;
+ }
if (xflag)
{
notify_init_vars ();
diff --git a/src/calcurse.c b/src/calcurse.c
index f274ffb..9ed1d9d 100755
--- a/src/calcurse.c
+++ b/src/calcurse.c
@@ -1,4 +1,4 @@
-/* $calcurse: calcurse.c,v 1.67 2008/09/20 12:47:06 culot Exp $ */
+/* $calcurse: calcurse.c,v 1.68 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -379,13 +379,13 @@ main (int argc, char **argv)
case 'S':
case 's': /* Save function */
- io_save_cal (&conf);
+ io_save_cal (IO_MODE_INTERACTIVE, &conf);
break;
case 'I':
case 'i': /* Import function */
erase_status_bar ();
- io_import_data (IO_MODE_INTERACTIVE, IO_IMPORT_ICAL, &conf);
+ io_import_data (IO_MODE_INTERACTIVE, IO_IMPORT_ICAL, &conf, NULL);
do_storage = true;
break;
@@ -513,7 +513,7 @@ main (int argc, char **argv)
case ('Q'): /* Quit calcurse :( */
case ('q'):
if (conf.auto_save)
- io_save_cal (&conf);
+ io_save_cal (IO_MODE_INTERACTIVE, &conf);
if (conf.confirm_quit)
{
diff --git a/src/custom.c b/src/custom.c
index a0465de..e90439d 100755
--- a/src/custom.c
+++ b/src/custom.c
@@ -1,4 +1,4 @@
-/* $calcurse: custom.c,v 1.22 2008/04/19 21:05:15 culot Exp $ */
+/* $calcurse: custom.c,v 1.23 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -191,7 +191,7 @@ custom_init_attr (void)
/* Apply window attribute */
void
-custom_apply_attr (WINDOW * win, int attr_num)
+custom_apply_attr (WINDOW *win, int attr_num)
{
if (colorize)
wattron (win, attr.color[attr_num]);
@@ -201,7 +201,7 @@ custom_apply_attr (WINDOW * win, int attr_num)
/* Remove window attribute */
void
-custom_remove_attr (WINDOW * win, int attr_num)
+custom_remove_attr (WINDOW *win, int attr_num)
{
if (colorize)
wattroff (win, attr.color[attr_num]);
@@ -211,7 +211,7 @@ custom_remove_attr (WINDOW * win, int attr_num)
/* Load the user configuration. */
void
-custom_load_conf (conf_t * conf, int background)
+custom_load_conf (conf_t *conf, int background)
{
FILE *data_file;
char *mesg_line1 = _("Failed to open config file");
diff --git a/src/help.c b/src/help.c
index 6223577..afebcd2 100755
--- a/src/help.c
+++ b/src/help.c
@@ -1,4 +1,4 @@
-/* $calcurse: help.c,v 1.28 2008/08/11 18:08:45 culot Exp $ */
+/* $calcurse: help.c,v 1.29 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -39,6 +39,7 @@ typedef enum
{
HELP_MAIN,
HELP_SAVE,
+ HELP_IMPORT,
HELP_EXPORT,
HELP_DISPLACEMENT,
HELP_VIEW,
@@ -183,6 +184,10 @@ wanted_page (int ch)
page = HELP_SAVE;
break;
+ case 'i':
+ page = HELP_IMPORT;
+ break;
+
case 'x':
page = HELP_EXPORT;
break;
@@ -299,6 +304,24 @@ help_screen (void)
"\nIn the config menu, you can choose to save the Calcurse data\n"
"automatically before quitting.");
+ hscr[HELP_IMPORT].title = _("Import:\n");
+ hscr[HELP_IMPORT].text =
+ _("Pressing 'I' allows you to import data from an icalendar file.\n"
+ "You are asked to enter the file name from which to load ical items.\n\n"
+ "At the end of the import process, and if the general option\n"
+ "'skip_system_dialogs' is not set to 'yes', a report indicating how\n"
+ "many items were imported is shown.\n"
+ "This report contains the total number of lines read, the number of\n"
+ "appointments, events and todo items which were successfully imported,\n"
+ "together with the number of items for which problems occured and that\n"
+ "were skipped, if any.\n\n"
+ "If one or more items could not be imported, one has the possibility to\n"
+ "read the import process report in order to identify which problems\n"
+ "occured.\n"
+ "In this report is shown one item per line, with the line in the input\n"
+ "stream at which this item begins, together with the description of why\n"
+ "the item could not be imported.\n");
+
hscr[HELP_EXPORT].title = _("Export:\n");
hscr[HELP_EXPORT].text =
_("Pressing 'X' leads to the export submenu, from which you can choose\n"
diff --git a/src/io.c b/src/io.c
index 9d75ea3..545d565 100755
--- a/src/io.c
+++ b/src/io.c
@@ -1,4 +1,4 @@
-/* $calcurse: io.c,v 1.36 2008/09/20 12:47:06 culot Exp $ */
+/* $calcurse: io.c,v 1.37 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -723,7 +723,7 @@ io_extract_data (char *dst_data, const char *org, int len)
/* Save the calendar data */
void
-io_save_cal (conf_t *conf)
+io_save_cal (io_mode_t mode, conf_t *conf)
{
FILE *data_file;
struct event_s *k;
@@ -745,7 +745,7 @@ io_save_cal (conf_t *conf)
char *enter = _("Press [ENTER] to continue");
bool show_bar = false;
- if (!conf->skip_progress_bar)
+ if (mode == IO_MODE_INTERACTIVE && !conf->skip_progress_bar)
show_bar = true;
/* Save the user configuration. */
@@ -753,8 +753,8 @@ io_save_cal (conf_t *conf)
if (show_bar)
progress_bar (PROGRESS_BAR_SAVE, 0);
data_file = fopen (path_conf, "w");
- if (data_file == (FILE *) 0)
- status_mesg (access_pb, "");
+ if (data_file == NULL)
+ ERROR_MSG (access_pb);
else
{
custom_color_theme_name (theme_name);
@@ -806,7 +806,8 @@ io_save_cal (conf_t *conf)
fprintf (data_file, "layout=\n");
fprintf (data_file, "%d\n", wins_layout ());
- pthread_mutex_lock (&nbar->mutex);
+ if (mode == IO_MODE_INTERACTIVE)
+ pthread_mutex_lock (&nbar->mutex);
fprintf (data_file,
"\n# If this option is set to yes, "
"notify-bar will be displayed :\n");
@@ -847,7 +848,8 @@ io_save_cal (conf_t *conf)
fprintf (data_file, "input_datefmt=\n");
fprintf (data_file, "%d\n", conf->input_datefmt);
- pthread_mutex_unlock (&nbar->mutex);
+ if (mode == IO_MODE_INTERACTIVE)
+ pthread_mutex_unlock (&nbar->mutex);
fclose (data_file);
}
@@ -856,8 +858,8 @@ io_save_cal (conf_t *conf)
if (show_bar)
progress_bar (PROGRESS_BAR_SAVE, 1);
data_file = fopen (path_todo, "w");
- if (data_file == (FILE *) 0)
- status_mesg (access_pb, "");
+ if (data_file == NULL)
+ ERROR_MSG (access_pb);
else
{
for (i = todolist; i != 0; i = i->next)
@@ -878,16 +880,18 @@ io_save_cal (conf_t *conf)
if (show_bar)
progress_bar (PROGRESS_BAR_SAVE, 2);
data_file = fopen (path_apts, "w");
- if (data_file == (FILE *) 0)
- status_mesg (access_pb, "");
+ if (data_file == NULL)
+ ERROR_MSG (access_pb);
else
{
recur_save_data (data_file);
- pthread_mutex_lock (&(alist_p->mutex));
+ if (mode == IO_MODE_INTERACTIVE)
+ pthread_mutex_lock (&(alist_p->mutex));
for (j = alist_p->root; j != 0; j = j->next)
apoint_write (j, data_file);
- pthread_mutex_unlock (&(alist_p->mutex));
+ if (mode == IO_MODE_INTERACTIVE)
+ pthread_mutex_unlock (&(alist_p->mutex));
for (k = eventlist; k != 0; k = k->next)
event_write (k, data_file);
@@ -895,7 +899,7 @@ io_save_cal (conf_t *conf)
}
/* Print a message telling data were saved */
- if (!conf->skip_system_dialogs)
+ if (mode == IO_MODE_INTERACTIVE && !conf->skip_system_dialogs)
{
status_mesg (save_success, enter);
wgetch (win[STA].p);
@@ -2142,16 +2146,17 @@ get_import_stream (export_type_t type)
* and is cleared at the end.
*/
void
-io_import_data (io_mode_t mode, import_type_t type, conf_t *conf)
+io_import_data (io_mode_t mode, import_type_t type, conf_t *conf,
+ char *stream_name)
{
const char *logprefix = "/tmp/calcurse_log.";
const string_t vevent = STRING_BUILD ("BEGIN:VEVENT");
const string_t vtodo = STRING_BUILD ("BEGIN:VTODO");
- char *success = _("The data were successfully imported");
- char *enter = _("Press [ENTER] to continue");
- char *lines_read = _("Number of lines read: %04d ");
+ char *proc_report = _("Import process report: %04d lines read ");
char *lines_stats =
- _("(apoints: %d / events: %d / todos: %d / skipped: %d)\r");
+ _("%d apps / %d events / %d todos / %d skipped ");
+ char *lines_stats_interactive =
+ _("%d apps / %d events / %d todos / %d skipped ([ENTER] to continue)");
char *logname, flogname[BUFSIZ], buf[BUFSIZ];
FILE *stream = NULL, *logfd;
float ical_version;
@@ -2164,7 +2169,10 @@ io_import_data (io_mode_t mode, import_type_t type, conf_t *conf)
switch (mode)
{
case IO_MODE_NONINTERACTIVE:
- stream = stdin;
+ stream = fopen (stream_name, "r");
+ EXIT_IF (stream == NULL,
+ _("FATAL ERROR: the input file cannot be accessed, "
+ "Aborting..."));
break;
case IO_MODE_INTERACTIVE:
stream = get_import_stream (type);
@@ -2177,43 +2185,26 @@ io_import_data (io_mode_t mode, import_type_t type, conf_t *conf)
if (stream == NULL)
return;
+ bzero (&stats, sizeof stats);
+ ical_version = ical_chk_header (stream, &stats.lines);
+ RETURN_IF (ical_version < 0,
+ _("Warning: ical header malformed, wrong version number. "
+ "Aborting..."));
+
logname = new_tempfile (logprefix, NOTESIZ);
RETURN_IF (logname == NULL,
_("Warning: could not create new note file to store "
"description. Aborting...\n"));
-
snprintf (flogname, BUFSIZ, "%s%s", logprefix, logname);
logfd = fopen (flogname, "w");
RETURN_IF (logfd == NULL,
_("Warning: could not open temporary log file, Aborting..."));
-
- bzero (&stats, sizeof stats);
- ical_version = ical_chk_header (stream, &stats.lines);
- RETURN_IF (ical_version < 0,
- _("Warning: ical header malformed, wrong version number. "
- "Aborting..."));
-
ical_log_init (logfd, ical_version);
+
while (fgets (buf, BUFSIZ, stream) != NULL)
{
stats.lines++;
str_toupper (buf);
- if (mode == IO_MODE_INTERACTIVE)
- {
- char read[BUFSIZ], stat[BUFSIZ];
-
- snprintf (read, BUFSIZ, lines_read, stats.lines);
- snprintf (stat, BUFSIZ, lines_stats, stats.apoints, stats.events,
- stats.todos, stats.skipped);
- status_mesg (read, stat);
- }
- else
- {
- printf (lines_read, stats.lines);
- printf (lines_stats,
- stats.lines, stats.apoints, stats.events, stats.todos,
- stats.skipped);
- }
if (strncmp (buf, vevent.str, vevent.len) == 0)
{
ical_read_event (stream, logfd, &stats.events, &stats.apoints,
@@ -2228,6 +2219,24 @@ io_import_data (io_mode_t mode, import_type_t type, conf_t *conf)
if (stream != stdin)
fclose (stream);
+ if (mode == IO_MODE_INTERACTIVE && !conf->skip_system_dialogs)
+ {
+ char read[BUFSIZ], stat[BUFSIZ];
+
+ snprintf (read, BUFSIZ, proc_report, stats.lines);
+ snprintf (stat, BUFSIZ, lines_stats_interactive, stats.apoints,
+ stats.events, stats.todos, stats.skipped);
+ status_mesg (read, stat);
+ wgetch (win[STA].p);
+ }
+ else if (mode == IO_MODE_NONINTERACTIVE)
+ {
+ printf (proc_report, stats.lines);
+ printf ("\n");
+ printf (lines_stats, stats.lines, stats.apoints, stats.events,
+ stats.todos, stats.skipped);
+ }
+
/* User has the choice to look at the log file if some items could not be
imported.
*/
@@ -2236,47 +2245,37 @@ io_import_data (io_mode_t mode, import_type_t type, conf_t *conf)
{
char *view_log = _("Some items could not be imported, see log file ?");
char *choices = "[y/n] ";
- int answer;
+ int ans;
if (mode == IO_MODE_NONINTERACTIVE)
{
- fprintf (stdout, "\n%s %s", view_log, choices);
- do
+ int ans;
+
+ printf ("\n%s %s", view_log, choices);
+ ans = fgetc (stdin);
+ if (ans == 'y')
{
- answer = scanf ("%d", &answer);
- if (answer == 'y')
- {
- char cmd[BUFSIZ];
+ char cmd[BUFSIZ];
- snprintf (cmd, BUFSIZ, "%s %s", conf->pager, flogname);
- system (cmd);
- }
+ snprintf (cmd, BUFSIZ, "%s %s", conf->pager, flogname);
+ system (cmd);
}
- while (answer != 'y' && answer != 'n');
}
else
{
status_mesg (view_log, choices);
do
{
- answer = wgetch (win[STA].p);
- if (answer == 'y')
+ ans = wgetch (win[STA].p);
+ if (ans == 'y')
{
wins_launch_external (flogname, conf->pager);
}
}
- while (answer != 'y' && answer != 'n');
+ while (ans != 'y' && ans != 'n');
erase_status_bar ();
}
}
- else
- {
- if (!conf->skip_system_dialogs && mode == IO_MODE_INTERACTIVE)
- {
- status_mesg (success, enter);
- wgetch (win[STA].p);
- }
- }
EXIT_IF (unlink (flogname) != 0,
_("Warning: could not erase temporary log file, Aborting..."));
free (logname);
diff --git a/src/io.h b/src/io.h
index 4d61660..16b896b 100755
--- a/src/io.h
+++ b/src/io.h
@@ -1,4 +1,4 @@
-/* $calcurse: io.h,v 1.14 2008/09/20 12:47:06 culot Exp $ */
+/* $calcurse: io.h,v 1.15 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -51,13 +51,13 @@ typedef enum
void io_init (char *, char *);
void io_extract_data (char *, const char *, int);
-void io_save_cal (conf_t *);
+void io_save_cal (io_mode_t, conf_t *);
void io_load_app (void);
void io_load_todo (void);
int io_check_data_files (void);
void io_startup_screen (bool, int);
void io_export_data (io_mode_t, export_type_t, conf_t *);
void io_export_bar (void);
-void io_import_data (io_mode_t, import_type_t, conf_t *);
+void io_import_data (io_mode_t, import_type_t, conf_t *, char *);
#endif /* CALCURSE_IO_H */
diff --git a/src/utils.c b/src/utils.c
index a2107b0..0c0a425 100755
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,4 +1,4 @@
-/* $calcurse: utils.c,v 1.50 2008/09/20 12:47:06 culot Exp $ */
+/* $calcurse: utils.c,v 1.51 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -445,6 +445,7 @@ status_bar (void)
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") };
@@ -472,16 +473,16 @@ status_bar (void)
binding_t *binding[TOTAL_CMDS] = {
/* calendar keys */
- &help, &quit, &save, &export, &day, &week, &weekb, &weeke, &tab,
- &togo, &conf, &othr, &appt, &todo, &eday, &ewek, &draw, &today, &othr,
+ &help, &quit, &save, &tab, &import, &export, &day, &week, &weekb, &weeke,
+ &togo, &othr, &conf, &draw, &appt, &todo, &eday, &ewek, &today, &othr,
/* appointment keys */
- &help, &quit, &save, &export, &add, &del, &edit, &view, &rept,
- &updn, &flag, &othr, &enote, &vnote, &appt, &todo, &eday, &ewek,
- &conf, &togo, &tab, &draw, &today, &othr,
+ &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,
/* todo keys */
- &help, &quit, &save, &export, &add, &del, &edit, &view, &prio,
- &updn, &tab, &othr, &enote, &vnote, &appt, &todo, &eday, &ewek,
- &conf, &togo, &draw, &today, &othr
+ &help, &quit, &save, &tab, &import, &export, &add, &del, &edit, &view,
+ &prio, &othr, &updn, &conf, &enote, &vnote, &appt, &todo, &eday, &ewek,
+ &togo, &draw, &today, &othr
};
/* Total length of a command. */
diff --git a/src/utils.h b/src/utils.h
index 587f66b..367262a 100755
--- a/src/utils.h
+++ b/src/utils.h
@@ -1,4 +1,4 @@
-/* $calcurse: utils.h,v 1.34 2008/09/20 12:47:06 culot Exp $ */
+/* $calcurse: utils.h,v 1.35 2008/09/21 08:06:43 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -32,7 +32,7 @@
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
-#define DISPLAY(...) do { \
+#define ERROR_MSG(...) do { \
char msg[BUFSIZ]; \
\
snprintf (msg, BUFSIZ, __VA_ARGS__); \
@@ -43,7 +43,7 @@
} while (0)
#define EXIT(...) do { \
- DISPLAY(__VA_ARGS__); \
+ ERROR_MSG(__VA_ARGS__); \
if (ui_mode == UI_CURSES) \
exit_calcurse (EXIT_FAILURE); \
else \
@@ -53,7 +53,7 @@
#define EXIT_IF(cond, ...) do { \
if ((cond)) \
{ \
- DISPLAY(__VA_ARGS__); \
+ ERROR_MSG(__VA_ARGS__); \
if (ui_mode == UI_CURSES) \
exit_calcurse (EXIT_FAILURE); \
else \
@@ -64,7 +64,7 @@
#define RETURN_IF(cond, ...) do { \
if ((cond)) \
{ \
- DISPLAY(__VA_ARGS__); \
+ ERROR_MSG(__VA_ARGS__); \
return; \
} \
} while (0)
@@ -72,7 +72,7 @@
#define RETVAL_IF(cond, val, ...) do { \
if ((cond)) \
{ \
- DISPLAY(__VA_ARGS__); \
+ ERROR_MSG(__VA_ARGS__); \
return (val); \
} \
} while (0)
@@ -83,9 +83,9 @@
#define SPC 32 /* ASCII code for white space */
-#define NB_CAL_CMDS 19 /* number of commands while in cal view */
-#define NB_APP_CMDS 24 /* same thing while in appointment view */
-#define NB_TOD_CMDS 23 /* same thing while in todo view */
+#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 */