diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2013-04-13 23:31:06 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2013-04-14 00:19:01 +0200 |
commit | 694d28eb78dfad98e2e7ea670d93a153d8efd368 (patch) | |
tree | 485dc11d3644d9dadb5fd4d67c5ef8103be79623 | |
parent | 9907069f442c56c90b67accb2d8fbd046dfce6db (diff) | |
download | calcurse-694d28eb78dfad98e2e7ea670d93a153d8efd368.zip |
Use tabs instead of spaces for indentation
This completes our switch to the Linux kernel coding style. Note that we
still use deeply nested constructs at some places which need to be fixed
up later.
Converted using the `Lindent` script from the Linux kernel code base,
along with some manual fixes.
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r-- | src/apoint.c | 273 | ||||
-rw-r--r-- | src/args.c | 1107 | ||||
-rw-r--r-- | src/calcurse.c | 847 | ||||
-rw-r--r-- | src/calcurse.h | 449 | ||||
-rw-r--r-- | src/config.c | 698 | ||||
-rw-r--r-- | src/custom.c | 1869 | ||||
-rw-r--r-- | src/day.c | 937 | ||||
-rw-r--r-- | src/dmon.c | 233 | ||||
-rw-r--r-- | src/event.c | 140 | ||||
-rw-r--r-- | src/getstring.c | 383 | ||||
-rw-r--r-- | src/help.c | 1417 | ||||
-rw-r--r-- | src/htable.h | 2 | ||||
-rw-r--r-- | src/ical.c | 1652 | ||||
-rw-r--r-- | src/io.c | 1939 | ||||
-rw-r--r-- | src/keys.c | 880 | ||||
-rw-r--r-- | src/llist.c | 271 | ||||
-rw-r--r-- | src/llist.h | 8 | ||||
-rw-r--r-- | src/llist_ts.h | 6 | ||||
-rw-r--r-- | src/mem.c | 281 | ||||
-rw-r--r-- | src/note.c | 290 | ||||
-rw-r--r-- | src/notify.c | 1082 | ||||
-rw-r--r-- | src/pcal.c | 384 | ||||
-rw-r--r-- | src/recur.c | 1105 | ||||
-rw-r--r-- | src/sha1.c | 321 | ||||
-rw-r--r-- | src/sha1.h | 6 | ||||
-rw-r--r-- | src/sigs.c | 72 | ||||
-rw-r--r-- | src/todo.c | 100 | ||||
-rw-r--r-- | src/ui-calendar.c | 1182 | ||||
-rw-r--r-- | src/ui-day.c | 1503 | ||||
-rw-r--r-- | src/ui-todo.c | 360 | ||||
-rw-r--r-- | src/utf8.c | 556 | ||||
-rw-r--r-- | src/utils.c | 1889 | ||||
-rw-r--r-- | src/vars.c | 132 | ||||
-rw-r--r-- | src/wins.c | 779 | ||||
-rw-r--r-- | test/run-test.c | 301 |
35 files changed, 12019 insertions, 11435 deletions
diff --git a/src/apoint.c b/src/apoint.c index ca400e9..f00dd1e 100644 --- a/src/apoint.c +++ b/src/apoint.c @@ -45,31 +45,31 @@ llist_ts_t alist_p; void apoint_free(struct apoint *apt) { - mem_free(apt->mesg); - erase_note(&apt->note); - mem_free(apt); + mem_free(apt->mesg); + erase_note(&apt->note); + mem_free(apt); } struct apoint *apoint_dup(struct apoint *in) { - EXIT_IF(!in, _("null pointer")); - - struct apoint *apt = mem_malloc(sizeof(struct apoint)); - apt->start = in->start; - apt->dur = in->dur; - apt->state = in->state; - apt->mesg = mem_strdup(in->mesg); - if (in->note) - apt->note = mem_strdup(in->note); - else - apt->note = NULL; - - return apt; + EXIT_IF(!in, _("null pointer")); + + struct apoint *apt = mem_malloc(sizeof(struct apoint)); + apt->start = in->start; + apt->dur = in->dur; + apt->state = in->state; + apt->mesg = mem_strdup(in->mesg); + if (in->note) + apt->note = mem_strdup(in->note); + else + apt->note = NULL; + + return apt; } void apoint_llist_init(void) { - LLIST_TS_INIT(&alist_p); + LLIST_TS_INIT(&alist_p); } /* @@ -79,142 +79,145 @@ void apoint_llist_init(void) */ void apoint_llist_free(void) { - LLIST_TS_FREE_INNER(&alist_p, apoint_free); - LLIST_TS_FREE(&alist_p); + LLIST_TS_FREE_INNER(&alist_p, apoint_free); + LLIST_TS_FREE(&alist_p); } static int apoint_cmp_start(struct apoint *a, struct apoint *b) { - return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1); + return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1); } struct apoint *apoint_new(char *mesg, char *note, long start, long dur, - char state) + char state) { - struct apoint *apt; + struct apoint *apt; - apt = mem_malloc(sizeof(struct apoint)); - apt->mesg = mem_strdup(mesg); - apt->note = (note != NULL) ? mem_strdup(note) : NULL; - apt->state = state; - apt->start = start; - apt->dur = dur; + apt = mem_malloc(sizeof(struct apoint)); + apt->mesg = mem_strdup(mesg); + apt->note = (note != NULL) ? mem_strdup(note) : NULL; + apt->state = state; + apt->start = start; + apt->dur = dur; - LLIST_TS_LOCK(&alist_p); - LLIST_TS_ADD_SORTED(&alist_p, apt, apoint_cmp_start); - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_LOCK(&alist_p); + LLIST_TS_ADD_SORTED(&alist_p, apt, apoint_cmp_start); + LLIST_TS_UNLOCK(&alist_p); - return apt; + return apt; } unsigned apoint_inday(struct apoint *i, long *start) { - return (i->start <= *start + DAYINSEC && i->start + i->dur > *start); + return (i->start <= *start + DAYINSEC + && i->start + i->dur > *start); } void apoint_sec2str(struct apoint *o, long day, char *start, char *end) { - struct tm lt; - time_t t; - - if (o->start < day) { - strncpy(start, "..:..", 6); - } else { - t = o->start; - localtime_r(&t, <); - snprintf(start, HRMIN_SIZE, "%02u:%02u", lt.tm_hour, lt.tm_min); - } - if (o->start + o->dur > day + DAYINSEC) { - strncpy(end, "..:..", 6); - } else { - t = o->start + o->dur; - localtime_r(&t, <); - snprintf(end, HRMIN_SIZE, "%02u:%02u", lt.tm_hour, lt.tm_min); - } + struct tm lt; + time_t t; + + if (o->start < day) { + strncpy(start, "..:..", 6); + } else { + t = o->start; + localtime_r(&t, <); + snprintf(start, HRMIN_SIZE, "%02u:%02u", lt.tm_hour, + lt.tm_min); + } + if (o->start + o->dur > day + DAYINSEC) { + strncpy(end, "..:..", 6); + } else { + t = o->start + o->dur; + localtime_r(&t, <); + snprintf(end, HRMIN_SIZE, "%02u:%02u", lt.tm_hour, + lt.tm_min); + } } void apoint_write(struct apoint *o, FILE * f) { - struct tm lt; - time_t t; + struct tm lt; + time_t t; - t = o->start; - localtime_r(&t, <); - fprintf(f, "%02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, lt.tm_mday, - 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); + t = o->start; + localtime_r(&t, <); + fprintf(f, "%02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, lt.tm_mday, + 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); - t = o->start + o->dur; - localtime_r(&t, <); - fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u ", lt.tm_mon + 1, lt.tm_mday, - 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); + t = o->start + o->dur; + localtime_r(&t, <); + fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u ", lt.tm_mon + 1, + lt.tm_mday, 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); - if (o->note != NULL) - fprintf(f, ">%s ", o->note); + if (o->note != NULL) + fprintf(f, ">%s ", o->note); - if (o->state & APOINT_NOTIFY) - fputc('!', f); - else - fputc('|', f); + if (o->state & APOINT_NOTIFY) + fputc('!', f); + else + fputc('|', f); - fprintf(f, "%s\n", o->mesg); + fprintf(f, "%s\n", o->mesg); } -struct apoint *apoint_scan(FILE * f, struct tm start, struct tm end, char state, - char *note) +struct apoint *apoint_scan(FILE * f, struct tm start, struct tm end, + char state, char *note) { - char buf[BUFSIZ], *newline; - time_t tstart, tend; - - EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || - !check_date(end.tm_year, end.tm_mon, end.tm_mday) || - !check_time(start.tm_hour, start.tm_min) || - !check_time(end.tm_hour, end.tm_min), - _("date error in appointment")); - - /* Read the appointment description */ - if (!fgets(buf, sizeof buf, f)) - return NULL; - - newline = strchr(buf, '\n'); - if (newline) - *newline = '\0'; - - start.tm_sec = end.tm_sec = 0; - start.tm_isdst = end.tm_isdst = -1; - start.tm_year -= 1900; - start.tm_mon--; - end.tm_year -= 1900; - end.tm_mon--; - - tstart = mktime(&start); - tend = mktime(&end); - EXIT_IF(tstart == -1 || tend == -1 || tstart > tend, - _("date error in appointment")); - return apoint_new(buf, note, tstart, tend - tstart, state); + char buf[BUFSIZ], *newline; + time_t tstart, tend; + + EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || + !check_date(end.tm_year, end.tm_mon, end.tm_mday) || + !check_time(start.tm_hour, start.tm_min) || + !check_time(end.tm_hour, end.tm_min), + _("date error in appointment")); + + /* Read the appointment description */ + if (!fgets(buf, sizeof buf, f)) + return NULL; + + newline = strchr(buf, '\n'); + if (newline) + *newline = '\0'; + + start.tm_sec = end.tm_sec = 0; + start.tm_isdst = end.tm_isdst = -1; + start.tm_year -= 1900; + start.tm_mon--; + end.tm_year -= 1900; + end.tm_mon--; + + tstart = mktime(&start); + tend = mktime(&end); + EXIT_IF(tstart == -1 || tend == -1 || tstart > tend, + _("date error in appointment")); + return apoint_new(buf, note, tstart, tend - tstart, state); } void apoint_delete(struct apoint *apt) { - LLIST_TS_LOCK(&alist_p); + LLIST_TS_LOCK(&alist_p); - llist_item_t *i = LLIST_TS_FIND_FIRST(&alist_p, apt, NULL); - int need_check_notify = 0; + llist_item_t *i = LLIST_TS_FIND_FIRST(&alist_p, apt, NULL); + int need_check_notify = 0; - if (!i) - EXIT(_("no such appointment")); + if (!i) + EXIT(_("no such appointment")); - if (notify_bar()) - need_check_notify = notify_same_item(apt->start); - LLIST_TS_REMOVE(&alist_p, i); - if (need_check_notify) - notify_check_next_app(0); + if (notify_bar()) + need_check_notify = notify_same_item(apt->start); + LLIST_TS_REMOVE(&alist_p, i); + if (need_check_notify) + notify_check_next_app(0); - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_UNLOCK(&alist_p); } static int apoint_starts_after(struct apoint *apt, long *time) { - return apt->start > *time; + return apt->start > *time; } /* @@ -223,25 +226,25 @@ static int apoint_starts_after(struct apoint *apt, long *time) */ struct notify_app *apoint_check_next(struct notify_app *app, long start) { - llist_item_t *i; + llist_item_t *i; - LLIST_TS_LOCK(&alist_p); - i = LLIST_TS_FIND_FIRST(&alist_p, &start, apoint_starts_after); + LLIST_TS_LOCK(&alist_p); + i = LLIST_TS_FIND_FIRST(&alist_p, &start, apoint_starts_after); - if (i) { - struct apoint *apt = LLIST_TS_GET_DATA(i); + if (i) { + struct apoint *apt = LLIST_TS_GET_DATA(i); - if (apt->start <= app->time) { - app->time = apt->start; - app->txt = mem_strdup(apt->mesg); - app->state = apt->state; - app->got_app = 1; - } - } + if (apt->start <= app->time) { + app->time = apt->start; + app->txt = mem_strdup(apt->mesg); + app->state = apt->state; + app->got_app = 1; + } + } - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_UNLOCK(&alist_p); - return app; + return app; } /* @@ -249,23 +252,23 @@ struct notify_app *apoint_check_next(struct notify_app *app, long start) */ void apoint_switch_notify(struct apoint *apt) { - LLIST_TS_LOCK(&alist_p); + LLIST_TS_LOCK(&alist_p); - apt->state ^= APOINT_NOTIFY; - if (notify_bar()) - notify_check_added(apt->mesg, apt->start, apt->state); + apt->state ^= APOINT_NOTIFY; + if (notify_bar()) + notify_check_added(apt->mesg, apt->start, apt->state); - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_UNLOCK(&alist_p); } void apoint_paste_item(struct apoint *apt, long date) { - apt->start = date + get_item_time(apt->start); + apt->start = date + get_item_time(apt->start); - LLIST_TS_LOCK(&alist_p); - LLIST_TS_ADD_SORTED(&alist_p, apt, apoint_cmp_start); - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_LOCK(&alist_p); + LLIST_TS_ADD_SORTED(&alist_p, apt, apoint_cmp_start); + LLIST_TS_UNLOCK(&alist_p); - if (notify_bar()) - notify_check_added(apt->mesg, apt->start, apt->state); + if (notify_bar()) + notify_check_added(apt->mesg, apt->start, apt->state); } @@ -46,12 +46,12 @@ /* Long options */ enum { - OPT_FMT_APT = 1000, - OPT_FMT_RAPT, - OPT_FMT_EV, - OPT_FMT_REV, - OPT_FMT_TODO, - OPT_READ_ONLY + OPT_FMT_APT = 1000, + OPT_FMT_RAPT, + OPT_FMT_EV, + OPT_FMT_REV, + OPT_FMT_TODO, + OPT_READ_ONLY }; /* @@ -59,18 +59,19 @@ enum { */ static void usage(void) { - const char *arg_usage = - _("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n" - " [-d <date>|<num>] [-s[date]] [-r[range]]\n" - " [-c<file>] [-D<dir>] [-S<regex>] [--status]\n" - " [--read-only]\n"); - fputs(arg_usage, stdout); + const char *arg_usage = + _("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n" + " [-d <date>|<num>] [-s[date]] [-r[range]]\n" + " [-c<file>] [-D<dir>] [-S<regex>] [--status]\n" + " [--read-only]\n"); + fputs(arg_usage, stdout); } static void usage_try(void) { - const char *arg_usage_try = _("Try 'calcurse -h' for more information.\n"); - fputs(arg_usage_try, stdout); + const char *arg_usage_try = + _("Try 'calcurse -h' for more information.\n"); + fputs(arg_usage_try, stdout); } /* @@ -78,21 +79,22 @@ static void usage_try(void) */ static void version_arg(void) { - const char *vtext = - _("\nCopyright (c) 2004-2013 calcurse Development Team.\n" - "This is free software; see the source for copying conditions.\n"); + const char *vtext = + _("\nCopyright (c) 2004-2013 calcurse Development Team.\n" + "This is free software; see the source for copying conditions.\n"); - fprintf(stdout, _("Calcurse %s - text-based organizer\n"), VERSION); - fputs(vtext, stdout); + fprintf(stdout, _("Calcurse %s - text-based organizer\n"), + VERSION); + fputs(vtext, stdout); } static void more_info(void) { - fputs(_("\nFor more information, type '?' from within Calcurse, " - "or read the manpage.\n"), stdout); - fputs(_("Mail feature requests and suggestions to <misc@calcurse.org>.\n"), - stdout); - fputs(_("Mail bug reports to <bugs@calcurse.org>.\n"), stdout); + fputs(_("\nFor more information, type '?' from within Calcurse, " + "or read the manpage.\n"), stdout); + fputs(_("Mail feature requests and suggestions to <misc@calcurse.org>.\n"), + stdout); + fputs(_("Mail bug reports to <bugs@calcurse.org>.\n"), stdout); } /* @@ -100,65 +102,66 @@ static void more_info(void) */ static void help_arg(void) { - const char *htext = - _("\nMiscellaneous:\n" - " -h, --help\n" - " print this help and exit.\n" - "\n -v, --version\n" - " print calcurse version and exit.\n" - "\n --status\n" - " display the status of running instances of calcurse.\n" - "\n --read-only\n" - " Don't save configuration nor appointments/todos. Use with care.\n" - "\nFiles:\n" - " -c <file>, --calendar <file>\n" - " specify the calendar <file> to use (has precedence over '-D').\n" - "\n -D <dir>, --directory <dir>\n" - " specify the data directory to use.\n" - "\tIf not specified, the default directory is ~/.calcurse\n" - "\nNon-interactive:\n" - " -a, --appointment\n" - " print events and appointments for current day and exit.\n" - "\n -d <date|num>, --day <date|num>\n" - " 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 -g, --gc\n" - " run the garbage collector for note files and exit. \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 " - "next appointment.\n" - "\n -r[num], --range[=num]\n" - " print events and appointments for the [num] number of days" - "\n\tand exit. If no [num] is given, a range of 1 day is considered.\n" - "\n -s[date], --startday[=date]\n" - " print events and appointments from [date] and exit.\n" - "\tIf no [date] is given, the current day is considered.\n" - "\n -S<regex>, --search=<regex>\n" - " search for the given regular expression within events, appointments,\n" - "\tand todos description.\n" - "\n -t[num], --todo[=num]\n" - " print todo list and exit. If the optional number [num] is given,\n" - "\tthen only todos having a priority equal to [num] will be returned.\n" - "\tThe priority number must be between 1 (highest) and 9 (lowest).\n" - "\tIt is also possible to specify '0' for the priority, in which case\n" - "\tonly completed tasks will be shown.\n" - "\n -x[format], --export[=format]\n" - " export user data to the specified format. Events, appointments and\n" - "\ttodos are converted and echoed to stdout.\n" - "\tTwo possible formats are available: 'ical' and 'pcal'.\n" - "\tIf the optional argument format is not given, ical format is\n" - "\tselected by default.\n" - "\tnote: redirect standard output to export data to a file,\n" - "\tby issuing a command such as: calcurse --export > calcurse.dat\n"); - - fprintf(stdout, _("Calcurse %s - text-based organizer\n"), VERSION); - usage(); - fputs(htext, stdout); - more_info(); + const char *htext = + _("\nMiscellaneous:\n" + " -h, --help\n" + " print this help and exit.\n" + "\n -v, --version\n" + " print calcurse version and exit.\n" + "\n --status\n" + " display the status of running instances of calcurse.\n" + "\n --read-only\n" + " Don't save configuration nor appointments/todos. Use with care.\n" + "\nFiles:\n" + " -c <file>, --calendar <file>\n" + " specify the calendar <file> to use (has precedence over '-D').\n" + "\n -D <dir>, --directory <dir>\n" + " specify the data directory to use.\n" + "\tIf not specified, the default directory is ~/.calcurse\n" + "\nNon-interactive:\n" + " -a, --appointment\n" + " print events and appointments for current day and exit.\n" + "\n -d <date|num>, --day <date|num>\n" + " 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 -g, --gc\n" + " run the garbage collector for note files and exit. \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 " + "next appointment.\n" + "\n -r[num], --range[=num]\n" + " print events and appointments for the [num] number of days" + "\n\tand exit. If no [num] is given, a range of 1 day is considered.\n" + "\n -s[date], --startday[=date]\n" + " print events and appointments from [date] and exit.\n" + "\tIf no [date] is given, the current day is considered.\n" + "\n -S<regex>, --search=<regex>\n" + " search for the given regular expression within events, appointments,\n" + "\tand todos description.\n" + "\n -t[num], --todo[=num]\n" + " print todo list and exit. If the optional number [num] is given,\n" + "\tthen only todos having a priority equal to [num] will be returned.\n" + "\tThe priority number must be between 1 (highest) and 9 (lowest).\n" + "\tIt is also possible to specify '0' for the priority, in which case\n" + "\tonly completed tasks will be shown.\n" + "\n -x[format], --export[=format]\n" + " export user data to the specified format. Events, appointments and\n" + "\ttodos are converted and echoed to stdout.\n" + "\tTwo possible formats are available: 'ical' and 'pcal'.\n" + "\tIf the optional argument format is not given, ical format is\n" + "\tselected by default.\n" + "\tnote: redirect standard output to export data to a file,\n" + "\tby issuing a command such as: calcurse --export > calcurse.dat\n"); + + fprintf(stdout, _("Calcurse %s - text-based organizer\n"), + VERSION); + usage(); + fputs(htext, stdout); + more_info(); } /* @@ -174,22 +177,25 @@ static void help_arg(void) */ static void status_arg(void) { - int cpid, dpid; - - cpid = io_get_pid(path_cpid); - dpid = io_get_pid(path_dpid); - - EXIT_IF(cpid && dpid, - _("Error: both calcurse (pid: %d) and its daemon (pid: %d)\n" - "seem to be running at the same time!\n" - "Please check manually and restart calcurse.\n"), cpid, dpid); - - if (cpid) - fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid); - else if (dpid) - fprintf(stdout, _("calcurse is running in background (pid %d)\n"), dpid); - else - puts(_("calcurse is not running\n")); + int cpid, dpid; + + cpid = io_get_pid(path_cpid); + dpid = io_get_pid(path_dpid); + + EXIT_IF(cpid && dpid, + _("Error: both calcurse (pid: %d) and its daemon (pid: %d)\n" + "seem to be running at the same time!\n" + "Please check manually and restart calcurse.\n"), cpid, + dpid); + + if (cpid) + fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid); + else if (dpid) + fprintf(stdout, + _("calcurse is running in background (pid %d)\n"), + dpid); + else + puts(_("calcurse is not running\n")); } /* @@ -201,13 +207,13 @@ static void status_arg(void) */ static void todo_arg(int priority, const char *format, regex_t * regex) { - llist_item_t *i; - int title = 1; - const char *titlestr; - const char *all_todos_title = _("to do:\n"); - const char *completed_title = _("completed tasks:\n"); + llist_item_t *i; + int title = 1; + const char *titlestr; + const char *all_todos_title = _("to do:\n"); + const char *completed_title = _("completed tasks:\n"); - titlestr = priority == 0 ? completed_title : all_todos_title; + titlestr = priority == 0 ? completed_title : all_todos_title; #define DISPLAY_TITLE do { \ if (title) \ @@ -217,23 +223,23 @@ static void todo_arg(int priority, const char *format, regex_t * regex) } \ } while (0) - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_TS_GET_DATA(i); - if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0) - continue; - - if (todo->id < 0) { /* completed task */ - if (priority == 0) { - DISPLAY_TITLE; - print_todo(format, todo); - } - } else { - if (priority < 0 || todo->id == priority) { - DISPLAY_TITLE; - print_todo(format, todo); - } - } - } + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_TS_GET_DATA(i); + if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0) + continue; + + if (todo->id < 0) { /* completed task */ + if (priority == 0) { + DISPLAY_TITLE; + print_todo(format, todo); + } + } else { + if (priority < 0 || todo->id == priority) { + DISPLAY_TITLE; + print_todo(format, todo); + } + } + } #undef DISPLAY_TITLE } @@ -241,26 +247,27 @@ static void todo_arg(int priority, const char *format, regex_t * regex) /* Print the next appointment within the upcoming 24 hours. */ static void next_arg(void) { - struct notify_app next_app; - const long current_time = now(); - int time_left, hours_left, min_left; - - next_app.time = current_time + DAYINSEC; - next_app.got_app = 0; - next_app.txt = NULL; - - next_app = *recur_apoint_check_next(&next_app, current_time, get_today()); - next_app = *apoint_check_next(&next_app, current_time); - - if (next_app.got_app) { - time_left = next_app.time - current_time; - hours_left = (time_left / HOURINSEC); - min_left = (time_left - hours_left * HOURINSEC) / MININSEC; - fputs(_("next appointment:\n"), stdout); - fprintf(stdout, " [%02d:%02d] %s\n", hours_left, min_left, - next_app.txt); - mem_free(next_app.txt); - } + struct notify_app next_app; + const long current_time = now(); + int time_left, hours_left, min_left; + + next_app.time = current_time + DAYINSEC; + next_app.got_app = 0; + next_app.txt = NULL; + + next_app = + *recur_apoint_check_next(&next_app, current_time, get_today()); + next_app = *apoint_check_next(&next_app, current_time); + + if (next_app.got_app) { + time_left = next_app.time - current_time; + hours_left = (time_left / HOURINSEC); + min_left = (time_left - hours_left * HOURINSEC) / MININSEC; + fputs(_("next appointment:\n"), stdout); + fprintf(stdout, " [%02d:%02d] %s\n", hours_left, + min_left, next_app.txt); + mem_free(next_app.txt); + } } /* @@ -268,13 +275,13 @@ static void next_arg(void) */ static void arg_print_date(long date) { - char date_str[BUFSIZ]; - struct tm lt; + char date_str[BUFSIZ]; + struct tm lt; - localtime_r((time_t *)&date, <); - strftime(date_str, BUFSIZ, conf.output_datefmt, <); - fputs(date_str, stdout); - fputs(":\n", stdout); + localtime_r((time_t *) & date, <); + strftime(date_str, BUFSIZ, conf.output_datefmt, <); + fputs(date_str, stdout); + fputs(":\n", stdout); } /* @@ -285,22 +292,22 @@ static void arg_print_date(long date) */ static int app_arg(int add_line, struct date *day, long date, const char *fmt_apt, - const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t *regex) + const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, + regex_t * regex) { - if (date == 0) - date = get_sec_date(*day); + if (date == 0) + date = get_sec_date(*day); - int n = day_store_items(date, NULL, NULL, regex); + int n = day_store_items(date, NULL, NULL, regex); - if (n > 0) { - if (add_line) - fputs("\n", stdout); - arg_print_date(date); - day_write_stdout(date, fmt_apt, fmt_rapt, fmt_ev, fmt_rev); - } + if (n > 0) { + if (add_line) + fputs("\n", stdout); + arg_print_date(date); + day_write_stdout(date, fmt_apt, fmt_rapt, fmt_ev, fmt_rev); + } - return n; + return n; } /* @@ -310,23 +317,24 @@ app_arg(int add_line, struct date *day, long date, const char *fmt_apt, */ static void display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, - const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, + regex_t * regex) { - int i, app_found; - struct date day; - - for (i = 0; i < numdays; i++) { - day.dd = t->tm_mday; - day.mm = t->tm_mon + 1; - day.yyyy = t->tm_year + 1900; - app_found = app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, - fmt_rev, regex); - if (app_found) - add_line = 1; - t->tm_mday++; - mktime(t); - } + int i, app_found; + struct date day; + + for (i = 0; i < numdays; i++) { + day.dd = t->tm_mday; + day.mm = t->tm_mon + 1; + day.yyyy = t->tm_year + 1900; + app_found = + app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, + fmt_rev, regex); + if (app_found) + add_line = 1; + t->tm_mday++; + mktime(t); + } } /* @@ -335,39 +343,42 @@ display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, */ static void date_arg(const char *ddate, int add_line, const char *fmt_apt, - const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, + regex_t * regex) { - struct date day; - static struct tm t; - time_t timer; - - /* - * Check (with the argument length) if a date or a number of days - * was entered, and then call app_arg() to print appointments - */ - if (strlen(ddate) <= 4 && is_all_digit(ddate)) { - /* - * A number of days was entered. Get current date and print appointments - * for each day in the chosen interval. app_found and add_line are used to - * format the output correctly. - */ - timer = time(NULL); - localtime_r(&timer, &t); - display_app(&t, atoi(ddate), add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, - regex); - } else { - /* A date was entered. */ - if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy, - (int *)&day.mm, (int *)&day.dd, NULL)) { - app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, regex); - } else { - fputs(_("Argument to the '-d' flag is not valid\n"), stderr); - fprintf(stdout, _("Possible argument format are: '%s' or 'n'\n"), - DATEFMT_DESC(conf.input_datefmt)); - more_info(); - } - } + struct date day; + static struct tm t; + time_t timer; + + /* + * Check (with the argument length) if a date or a number of days + * was entered, and then call app_arg() to print appointments + */ + if (strlen(ddate) <= 4 && is_all_digit(ddate)) { + /* + * A number of days was entered. Get current date and print appointments + * for each day in the chosen interval. app_found and add_line are used to + * format the output correctly. + */ + timer = time(NULL); + localtime_r(&timer, &t); + display_app(&t, atoi(ddate), add_line, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, regex); + } else { + /* A date was entered. */ + if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy, + (int *)&day.mm, (int *)&day.dd, NULL)) { + app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, regex); + } else { + fputs(_("Argument to the '-d' flag is not valid\n"), + stderr); + fprintf(stdout, + _("Possible argument format are: '%s' or 'n'\n"), + DATEFMT_DESC(conf.input_datefmt)); + more_info(); + } + } } /* @@ -380,45 +391,48 @@ date_arg(const char *ddate, int add_line, const char *fmt_apt, */ static void date_arg_extended(const char *startday, const char *range, int add_line, - const char *fmt_apt, const char *fmt_rapt, - const char *fmt_ev, const char *fmt_rev, regex_t * regex) + const char *fmt_apt, const char *fmt_rapt, + const char *fmt_ev, const char *fmt_rev, regex_t * regex) { - int numdays = 1, error = 0; - static struct tm t; - time_t timer; - - /* - * Check arguments and extract information - */ - if (range != NULL) { - if (is_all_digit(range)) { - numdays = atoi(range); - } else { - error = 1; - } - } - timer = time(NULL); - localtime_r(&timer, &t); - if (startday != NULL) { - if (parse_date(startday, conf.input_datefmt, (int *)&t.tm_year, - (int *)&t.tm_mon, (int *)&t.tm_mday, NULL)) { - t.tm_year -= 1900; - t.tm_mon--; - mktime(&t); - } else { - error = 1; - } - } - if (!error) { - display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, - regex); - } else { - fputs(_("Argument is not valid\n"), stderr); - fprintf(stdout, _("Argument format for -s and --startday is: '%s'\n"), - DATEFMT_DESC(conf.input_datefmt)); - fputs(_("Argument format for -r and --range is: 'n'\n"), stdout); - more_info(); - } + int numdays = 1, error = 0; + static struct tm t; + time_t timer; + + /* + * Check arguments and extract information + */ + if (range != NULL) { + if (is_all_digit(range)) { + numdays = atoi(range); + } else { + error = 1; + } + } + timer = time(NULL); + localtime_r(&timer, &t); + if (startday != NULL) { + if (parse_date + (startday, conf.input_datefmt, (int *)&t.tm_year, + (int *)&t.tm_mon, (int *)&t.tm_mday, NULL)) { + t.tm_year -= 1900; + t.tm_mon--; + mktime(&t); + } else { + error = 1; + } + } + if (!error) { + display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, regex); + } else { + fputs(_("Argument is not valid\n"), stderr); + fprintf(stdout, + _("Argument format for -s and --startday is: '%s'\n"), + DATEFMT_DESC(conf.input_datefmt)); + fputs(_("Argument format for -r and --range is: 'n'\n"), + stdout); + more_info(); + } } /* @@ -427,299 +441,310 @@ date_arg_extended(const char *startday, const char *range, int add_line, */ int parse_args(int argc, char **argv) { - int ch, add_line = 0; - int unknown_flag = 0; - /* Command-line flags */ - int aflag = 0; /* -a: print appointments for current day */ - int dflag = 0; /* -d: print appointments for a specified days */ - int hflag = 0; /* -h: print help text */ - int gflag = 0; /* -g: run garbage collector */ - int iflag = 0; /* -i: import data */ - int nflag = 0; /* -n: print next appointment */ - int rflag = 0; /* -r: specify the range of days to consider */ - int sflag = 0; /* -s: specify the first day to consider */ - int Sflag = 0; /* -S: specify a regex to search for */ - int tflag = 0; /* -t: print todo list */ - int vflag = 0; /* -v: print version number */ - int xflag = 0; /* -x: export data */ - /* Format strings */ - const char *fmt_apt = " - %S -> %E\n\t%m\n"; - const char *fmt_rapt = " - %S -> %E\n\t%m\n"; - const char *fmt_ev = " * %m\n"; - const char *fmt_rev = " * %m\n"; - const char *fmt_todo = "%p. %m\n"; - - int tnum = 0, xfmt = 0, non_interactive = 0, multiple_flag = 0, load_data = 0; - const char *ddate = "", *cfile = NULL, *range = NULL, *startday = NULL; - const char *datadir = NULL, *ifile = NULL; - regex_t reg, *preg = NULL; - - /* Long options only */ - int statusflag = 0; /* --status: get the status of running instances */ - enum { - STATUS_OPT = CHAR_MAX + 1 - }; - - static const char *optstr = "ghvnNax::t::d:c:r::s::S:D:i:"; - - struct option longopts[] = { - {"appointment", no_argument, NULL, 'a'}, - {"calendar", required_argument, NULL, 'c'}, - {"day", required_argument, NULL, 'd'}, - {"directory", required_argument, NULL, 'D'}, - {"gc", no_argument, NULL, 'g'}, - {"help", no_argument, NULL, 'h'}, - {"import", required_argument, NULL, 'i'}, - {"next", no_argument, NULL, 'n'}, - {"note", no_argument, NULL, 'N'}, - {"range", optional_argument, NULL, 'r'}, - {"startday", optional_argument, NULL, 's'}, - {"search", required_argument, NULL, 'S'}, - {"status", no_argument, NULL, STATUS_OPT}, - {"todo", optional_argument, NULL, 't'}, - {"version", no_argument, NULL, 'v'}, - {"export", optional_argument, NULL, 'x'}, - - {"format-apt", required_argument, NULL, OPT_FMT_APT}, - {"format-recur-apt", required_argument, NULL, OPT_FMT_RAPT}, - {"format-event", required_argument, NULL, OPT_FMT_EV}, - {"format-recur-event", required_argument, NULL, OPT_FMT_REV}, - {"format-todo", required_argument, NULL, OPT_FMT_TODO}, - {"read-only", no_argument, NULL, OPT_READ_ONLY}, - {NULL, no_argument, NULL, 0} - }; - - while ((ch = getopt_long(argc, argv, optstr, longopts, NULL)) != -1) { - switch (ch) { - case STATUS_OPT: - statusflag = 1; - break; - case 'a': - aflag = 1; - multiple_flag++; - load_data++; - break; - case 'c': - multiple_flag++; - cfile = optarg; - load_data++; - break; - case 'd': - dflag = 1; - multiple_flag++; - load_data++; - ddate = optarg; - break; - case 'D': - datadir = optarg; - break; - case 'h': - hflag = 1; - break; - case 'g': - gflag = 1; - break; - case 'i': - iflag = 1; - multiple_flag++; - load_data++; - ifile = optarg; - break; - case 'n': - nflag = 1; - multiple_flag++; - load_data++; - break; - case 'r': - rflag = 1; - multiple_flag++; - load_data++; - range = optarg; - break; - case 's': - sflag = 1; - multiple_flag++; - load_data++; - startday = optarg; - break; - case 'S': - EXIT_IF(Sflag > 0, _("Can not handle more than one regular expression.")); - Sflag = 1; - if (regcomp(®, optarg, REG_EXTENDED)) - EXIT(_("Could not compile regular expression.")); - preg = ® - break; - case 't': - tflag = 1; - multiple_flag++; - load_data++; - add_line = 1; - if (optarg != NULL) { - tnum = atoi(optarg); - if (tnum < 0 || tnum > 9) { - usage(); - usage_try(); - return EXIT_FAILURE; - } - } else { - tnum = -1; - } - break; - case 'v': - vflag = 1; - break; - case 'x': - xflag = 1; - multiple_flag++; - load_data++; - if (optarg != NULL) { - if (strcmp(optarg, "ical") == 0) { - xfmt = IO_EXPORT_ICAL; - } else if (strcmp(optarg, "pcal") == 0) { - xfmt = IO_EXPORT_PCAL; - } else { - fputs(_("Argument for '-x' should be either " - "'ical' or 'pcal'\n"), stderr); - usage(); - usage_try(); - return EXIT_FAILURE; - } - } else { - xfmt = IO_EXPORT_ICAL; - } - break; - case OPT_FMT_APT: - fmt_apt = optarg; - break; - case OPT_FMT_RAPT: - fmt_rapt = optarg; - break; - case OPT_FMT_EV: - fmt_ev = optarg; - break; - case OPT_FMT_REV: - fmt_rev = optarg; - break; - case OPT_FMT_TODO: - fmt_todo = optarg; - break; - case OPT_READ_ONLY: - read_only = 1; - break; - default: - usage(); - usage_try(); - unknown_flag = 1; - non_interactive = 1; - /* NOTREACHED */ - } - } - argc -= optind; - - if (argc >= 1) { - usage(); - usage_try(); - return EXIT_FAILURE; - /* Incorrect arguments */ - } else if (Sflag && !(aflag || dflag || rflag || sflag || tflag)) { - fputs(_("Option '-S' must be used with either '-d', '-r', '-s', " - "'-a' or '-t'\n"), stderr); - usage(); - usage_try(); - return EXIT_FAILURE; - } else { - if (unknown_flag) { - non_interactive = 1; - } else if (hflag) { - help_arg(); - non_interactive = 1; - } else if (vflag) { - version_arg(); - non_interactive = 1; - } else if (statusflag) { - io_init(cfile, datadir); - status_arg(); - non_interactive = 1; - } else if (gflag) { - io_init(cfile, datadir); - io_check_dir(path_dir); - io_check_dir(path_notes); - io_check_file(path_apts); - io_check_file(path_todo); - io_load_app(); - io_load_todo(); - note_gc(); - non_interactive = 1; - } else if (multiple_flag) { - if (load_data) { - io_init(cfile, datadir); - io_check_dir(path_dir); - io_check_dir(path_notes); - } - if (iflag) { - io_check_file(path_apts); - io_check_file(path_todo); - /* Get default pager in case we need to show a log file. */ - vars_init(); - io_load_app(); - io_load_todo(); - io_import_data(IO_IMPORT_ICAL, ifile); - io_save_apts(); - io_save_todo(); - non_interactive = 1; - } - if (xflag) { - io_check_file(path_apts); - io_check_file(path_todo); - io_load_app(); - io_load_todo(); - io_export_data(xfmt); - non_interactive = 1; - return non_interactive; - } - if (tflag) { - io_check_file(path_todo); - io_load_todo(); - todo_arg(tnum, fmt_todo, preg); - non_interactive = 1; - } - if (nflag) { - io_check_file(path_apts); - io_load_app(); - next_arg(); - non_interactive = 1; - } - if (dflag || rflag || sflag) { - io_check_file(path_apts); - io_check_file(path_conf); - io_load_app(); - config_load(); /* To get output date format. */ - if (dflag) - date_arg(ddate, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg); - if (rflag || sflag) - date_arg_extended(startday, range, add_line, fmt_apt, - fmt_rapt, fmt_ev, fmt_rev, preg); - non_interactive = 1; - } else if (aflag) { - struct date day; - - io_check_file(path_apts); - io_check_file(path_conf); - vars_init(); - config_load(); /* To get output date format. */ - io_load_app(); - day.dd = day.mm = day.yyyy = 0; - app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg); - non_interactive = 1; - } - } else { - non_interactive = 0; - io_init(cfile, datadir); - } - } - - if (preg) - regfree(preg); - - return non_interactive; + int ch, add_line = 0; + int unknown_flag = 0; + /* Command-line flags */ + int aflag = 0; /* -a: print appointments for current day */ + int dflag = 0; /* -d: print appointments for a specified days */ + int hflag = 0; /* -h: print help text */ + int gflag = 0; /* -g: run garbage collector */ + int iflag = 0; /* -i: import data */ + int nflag = 0; /* -n: print next appointment */ + int rflag = 0; /* -r: specify the range of days to consider */ + int sflag = 0; /* -s: specify the first day to consider */ + int Sflag = 0; /* -S: specify a regex to search for */ + int tflag = 0; /* -t: print todo list */ + int vflag = 0; /* -v: print version number */ + int xflag = 0; /* -x: export data */ + /* Format strings */ + const char *fmt_apt = " - %S -> %E\n\t%m\n"; + const char *fmt_rapt = " - %S -> %E\n\t%m\n"; + const char *fmt_ev = " * %m\n"; + const char *fmt_rev = " * %m\n"; + const char *fmt_todo = "%p. %m\n"; + + int tnum = 0, xfmt = 0, non_interactive = 0, multiple_flag = + 0, load_data = 0; + const char *ddate = "", *cfile = NULL, *range = NULL, *startday = + NULL; + const char *datadir = NULL, *ifile = NULL; + regex_t reg, *preg = NULL; + + /* Long options only */ + int statusflag = 0; /* --status: get the status of running instances */ + enum { + STATUS_OPT = CHAR_MAX + 1 + }; + + static const char *optstr = "ghvnNax::t::d:c:r::s::S:D:i:"; + + struct option longopts[] = { + {"appointment", no_argument, NULL, 'a'}, + {"calendar", required_argument, NULL, 'c'}, + {"day", required_argument, NULL, 'd'}, + {"directory", required_argument, NULL, 'D'}, + {"gc", no_argument, NULL, 'g'}, + {"help", no_argument, NULL, 'h'}, + {"import", required_argument, NULL, 'i'}, + {"next", no_argument, NULL, 'n'}, + {"note", no_argument, NULL, 'N'}, + {"range", optional_argument, NULL, 'r'}, + {"startday", optional_argument, NULL, 's'}, + {"search", required_argument, NULL, 'S'}, + {"status", no_argument, NULL, STATUS_OPT}, + {"todo", optional_argument, NULL, 't'}, + {"version", no_argument, NULL, 'v'}, + {"export", optional_argument, NULL, 'x'}, + + {"format-apt", required_argument, NULL, OPT_FMT_APT}, + {"format-recur-apt", required_argument, NULL, OPT_FMT_RAPT}, + {"format-event", required_argument, NULL, OPT_FMT_EV}, + {"format-recur-event", required_argument, NULL, OPT_FMT_REV}, + {"format-todo", required_argument, NULL, OPT_FMT_TODO}, + {"read-only", no_argument, NULL, OPT_READ_ONLY}, + {NULL, no_argument, NULL, 0} + }; + + while ((ch = + getopt_long(argc, argv, optstr, longopts, NULL)) != -1) { + switch (ch) { + case STATUS_OPT: + statusflag = 1; + break; + case 'a': + aflag = 1; + multiple_flag++; + load_data++; + break; + case 'c': + multiple_flag++; + cfile = optarg; + load_data++; + break; + case 'd': + dflag = 1; + multiple_flag++; + load_data++; + ddate = optarg; + break; + case 'D': + datadir = optarg; + break; + case 'h': + hflag = 1; + break; + case 'g': + gflag = 1; + break; + case 'i': + iflag = 1; + multiple_flag++; + load_data++; + ifile = optarg; + break; + case 'n': + nflag = 1; + multiple_flag++; + load_data++; + break; + case 'r': + rflag = 1; + multiple_flag++; + load_data++; + range = optarg; + break; + case 's': + sflag = 1; + multiple_flag++; + load_data++; + startday = optarg; + break; + case 'S': + EXIT_IF(Sflag > 0, + _("Can not handle more than one regular expression.")); + Sflag = 1; + if (regcomp(®, optarg, REG_EXTENDED)) + EXIT(_("Could not compile regular expression.")); + preg = ® + break; + case 't': + tflag = 1; + multiple_flag++; + load_data++; + add_line = 1; + if (optarg != NULL) { + tnum = atoi(optarg); + if (tnum < 0 || tnum > 9) { + usage(); + usage_try(); + return EXIT_FAILURE; + } + } else { + tnum = -1; + } + break; + case 'v': + vflag = 1; + break; + case 'x': + xflag = 1; + multiple_flag++; + load_data++; + if (optarg != NULL) { + if (strcmp(optarg, "ical") == 0) { + xfmt = IO_EXPORT_ICAL; + } else if (strcmp(optarg, "pcal") == 0) { + xfmt = IO_EXPORT_PCAL; + } else { + fputs(_("Argument for '-x' should be either " + "'ical' or 'pcal'\n"), + stderr); + usage(); + usage_try(); + return EXIT_FAILURE; + } + } else { + xfmt = IO_EXPORT_ICAL; + } + break; + case OPT_FMT_APT: + fmt_apt = optarg; + break; + case OPT_FMT_RAPT: + fmt_rapt = optarg; + break; + case OPT_FMT_EV: + fmt_ev = optarg; + break; + case OPT_FMT_REV: + fmt_rev = optarg; + break; + case OPT_FMT_TODO: + fmt_todo = optarg; + break; + case OPT_READ_ONLY: + read_only = 1; + break; + default: + usage(); + usage_try(); + unknown_flag = 1; + non_interactive = 1; + /* NOTREACHED */ + } + } + argc -= optind; + + if (argc >= 1) { + usage(); + usage_try(); + return EXIT_FAILURE; + /* Incorrect arguments */ + } else if (Sflag && !(aflag || dflag || rflag || sflag || tflag)) { + fputs(_("Option '-S' must be used with either '-d', '-r', '-s', " + "'-a' or '-t'\n"), stderr); + usage(); + usage_try(); + return EXIT_FAILURE; + } else { + if (unknown_flag) { + non_interactive = 1; + } else if (hflag) { + help_arg(); + non_interactive = 1; + } else if (vflag) { + version_arg(); + non_interactive = 1; + } else if (statusflag) { + io_init(cfile, datadir); + status_arg(); + non_interactive = 1; + } else if (gflag) { + io_init(cfile, datadir); + io_check_dir(path_dir); + io_check_dir(path_notes); + io_check_file(path_apts); + io_check_file(path_todo); + io_load_app(); + io_load_todo(); + note_gc(); + non_interactive = 1; + } else if (multiple_flag) { + if (load_data) { + io_init(cfile, datadir); + io_check_dir(path_dir); + io_check_dir(path_notes); + } + if (iflag) { + io_check_file(path_apts); + io_check_file(path_todo); + /* Get default pager in case we need to show a log file. */ + vars_init(); + io_load_app(); + io_load_todo(); + io_import_data(IO_IMPORT_ICAL, ifile); + io_save_apts(); + io_save_todo(); + non_interactive = 1; + } + if (xflag) { + io_check_file(path_apts); + io_check_file(path_todo); + io_load_app(); + io_load_todo(); + io_export_data(xfmt); + non_interactive = 1; + return non_interactive; + } + if (tflag) { + io_check_file(path_todo); + io_load_todo(); + todo_arg(tnum, fmt_todo, preg); + non_interactive = 1; + } + if (nflag) { + io_check_file(path_apts); + io_load_app(); + next_arg(); + non_interactive = 1; + } + if (dflag || rflag || sflag) { + io_check_file(path_apts); + io_check_file(path_conf); + io_load_app(); + config_load(); /* To get output date format. */ + if (dflag) + date_arg(ddate, add_line, fmt_apt, + fmt_rapt, fmt_ev, fmt_rev, + preg); + if (rflag || sflag) + date_arg_extended(startday, range, + add_line, + fmt_apt, + fmt_rapt, fmt_ev, + fmt_rev, preg); + non_interactive = 1; + } else if (aflag) { + struct date day; + + io_check_file(path_apts); + io_check_file(path_conf); + vars_init(); + config_load(); /* To get output date format. */ + io_load_app(); + day.dd = day.mm = day.yyyy = 0; + app_arg(add_line, &day, 0, fmt_apt, + fmt_rapt, fmt_ev, fmt_rev, preg); + non_interactive = 1; + } + } else { + non_interactive = 0; + io_init(cfile, datadir); + } + } + + if (preg) + regfree(preg); + + return non_interactive; } diff --git a/src/calcurse.c b/src/calcurse.c index 59f912e..7ab9c6a 100644 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -49,432 +49,443 @@ int count, reg; */ static struct day_items_nb do_storage(int day_changed) { - struct day_items_nb inday = day_process_storage(ui_calendar_get_slctd_day(), - day_changed); + struct day_items_nb inday = + day_process_storage(ui_calendar_get_slctd_day(), + day_changed); - if (day_changed) { - if ((inday.nb_events + inday.nb_apoints) > 0) - ui_day_hilt_set(1); - else - ui_day_hilt_set(0); - } + if (day_changed) { + if ((inday.nb_events + inday.nb_apoints) > 0) + ui_day_hilt_set(1); + else + ui_day_hilt_set(0); + } - return inday; + return inday; } static inline void key_generic_change_view(void) { - wins_reset_status_page(); - wins_slctd_next(); - - /* Select the event to highlight. */ - switch (wins_slctd()) { - case TOD: - if ((ui_todo_hilt() == 0) && (ui_todo_nb() > 0)) - ui_todo_hilt_set(1); - break; - case APP: - if ((ui_day_hilt() == 0) && ((inday.nb_events + inday.nb_apoints) > 0)) - ui_day_hilt_set(1); - break; - default: - break; - } - wins_update(FLAG_ALL); + wins_reset_status_page(); + wins_slctd_next(); + + /* Select the event to highlight. */ + switch (wins_slctd()) { + case TOD: + if ((ui_todo_hilt() == 0) && (ui_todo_nb() > 0)) + ui_todo_hilt_set(1); + break; + case APP: + if ((ui_day_hilt() == 0) + && ((inday.nb_events + inday.nb_apoints) > 0)) + ui_day_hilt_set(1); + break; + default: + break; + } + wins_update(FLAG_ALL); } static inline void key_generic_other_cmd(void) { - wins_other_status_page(wins_slctd()); - wins_update(FLAG_STA); + wins_other_status_page(wins_slctd()); + wins_update(FLAG_STA); } static inline void key_generic_goto(void) { - wins_erase_status_bar(); - ui_calendar_set_current_date(); - ui_calendar_change_day(conf.input_datefmt); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + wins_erase_status_bar(); + ui_calendar_set_current_date(); + ui_calendar_change_day(conf.input_datefmt); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } static inline void key_generic_goto_today(void) { - wins_erase_status_bar(); - ui_calendar_set_current_date(); - ui_calendar_goto_today(); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + wins_erase_status_bar(); + ui_calendar_set_current_date(); + ui_calendar_goto_today(); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } static inline void key_view_item(void) { - if ((wins_slctd() == APP) && (ui_day_hilt() != 0)) - day_popup_item(day_get_item(ui_day_hilt())); - else if ((wins_slctd() == TOD) && (ui_todo_hilt() != 0)) - item_in_popup(NULL, NULL, ui_todo_saved_mesg(), _("To do :")); - wins_update(FLAG_ALL); + if ((wins_slctd() == APP) && (ui_day_hilt() != 0)) + day_popup_item(day_get_item(ui_day_hilt())); + else if ((wins_slctd() == TOD) && (ui_todo_hilt() != 0)) + item_in_popup(NULL, NULL, ui_todo_saved_mesg(), + _("To do :")); + wins_update(FLAG_ALL); } static inline void key_generic_config_menu(void) { - wins_erase_status_bar(); - custom_config_main(); - inday = do_storage(0); - wins_update(FLAG_ALL); + wins_erase_status_bar(); + custom_config_main(); + inday = do_storage(0); + wins_update(FLAG_ALL); } static inline void key_generic_add_appt(void) { - ui_day_item_add(); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + ui_day_item_add(); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } static inline void key_generic_add_todo(void) { - ui_todo_add(); - if (ui_todo_hilt() == 0 && ui_todo_nb() == 1) - ui_todo_hilt_increase(1); - wins_update(FLAG_TOD | FLAG_STA); + ui_todo_add(); + if (ui_todo_hilt() == 0 && ui_todo_nb() == 1) + ui_todo_hilt_increase(1); + wins_update(FLAG_TOD | FLAG_STA); } static inline void key_add_item(void) { - switch (wins_slctd()) { - case APP: - ui_day_item_add(); - inday = do_storage(0); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); - break; - case TOD: - ui_todo_add(); - if (ui_todo_hilt() == 0 && ui_todo_nb() == 1) - ui_todo_hilt_increase(1); - wins_update(FLAG_TOD | FLAG_STA); - break; - default: - break; - } + switch (wins_slctd()) { + case APP: + ui_day_item_add(); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + break; + case TOD: + ui_todo_add(); + if (ui_todo_hilt() == 0 && ui_todo_nb() == 1) + ui_todo_hilt_increase(1); + wins_update(FLAG_TOD | FLAG_STA); + break; + default: + break; + } } static inline void key_edit_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - ui_day_item_edit(); - inday = do_storage(0); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); - } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { - ui_todo_edit(); - wins_update(FLAG_TOD | FLAG_STA); - } + if (wins_slctd() == APP && ui_day_hilt() != 0) { + ui_day_item_edit(); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { + ui_todo_edit(); + wins_update(FLAG_TOD | FLAG_STA); + } } static inline void key_del_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - ui_day_item_delete(&inday.nb_events, &inday.nb_apoints, reg); - inday = do_storage(0); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); - } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { - ui_todo_delete(); - wins_update(FLAG_TOD | FLAG_STA); - } + if (wins_slctd() == APP && ui_day_hilt() != 0) { + ui_day_item_delete(&inday.nb_events, &inday.nb_apoints, + reg); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { + ui_todo_delete(); + wins_update(FLAG_TOD | FLAG_STA); + } } static inline void key_generic_copy(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - ui_day_item_copy(&inday.nb_events, &inday.nb_apoints, reg); - inday = do_storage(0); - wins_update(FLAG_CAL | FLAG_APP); - } + if (wins_slctd() == APP && ui_day_hilt() != 0) { + ui_day_item_copy(&inday.nb_events, &inday.nb_apoints, reg); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP); + } } static inline void key_generic_paste(void) { - if (wins_slctd() == APP) { - ui_day_item_paste(&inday.nb_events, &inday.nb_apoints, reg); - inday = do_storage(0); - wins_update(FLAG_CAL | FLAG_APP); - } + if (wins_slctd() == APP) { + ui_day_item_paste(&inday.nb_events, &inday.nb_apoints, + reg); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP); + } } static inline void key_repeat_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) - ui_day_item_repeat(); - inday = do_storage(0); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + if (wins_slctd() == APP && ui_day_hilt() != 0) + ui_day_item_repeat(); + inday = do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } static inline void key_flag_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - day_item_switch_notify(day_get_item(ui_day_hilt())); - inday = do_storage(0); - wins_update(FLAG_APP); - } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { - todo_flag(todo_get_item(ui_todo_hilt())); - wins_update(FLAG_TOD); - } + if (wins_slctd() == APP && ui_day_hilt() != 0) { + day_item_switch_notify(day_get_item(ui_day_hilt())); + inday = do_storage(0); + wins_update(FLAG_APP); + } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { + todo_flag(todo_get_item(ui_todo_hilt())); + wins_update(FLAG_TOD); + } } static inline void key_pipe_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) - ui_day_item_pipe(); - else if (wins_slctd() == TOD && ui_todo_hilt() != 0) - ui_todo_pipe(); - wins_update(FLAG_ALL); + if (wins_slctd() == APP && ui_day_hilt() != 0) + ui_day_item_pipe(); + else if (wins_slctd() == TOD && ui_todo_hilt() != 0) + ui_todo_pipe(); + wins_update(FLAG_ALL); } static inline void change_priority(int diff) { - if (wins_slctd() == TOD && ui_todo_hilt() != 0) { - ui_todo_chg_priority(todo_get_item(ui_todo_hilt()), diff); - if (ui_todo_hilt_pos() < 0) - ui_todo_set_first(ui_todo_hilt()); - else if (ui_todo_hilt_pos() >= win[TOD].h - 4) - ui_todo_set_first(ui_todo_hilt() - win[TOD].h + 5); - wins_update(FLAG_TOD); - } + if (wins_slctd() == TOD && ui_todo_hilt() != 0) { + ui_todo_chg_priority(todo_get_item(ui_todo_hilt()), diff); + if (ui_todo_hilt_pos() < 0) + ui_todo_set_first(ui_todo_hilt()); + else if (ui_todo_hilt_pos() >= win[TOD].h - 4) + ui_todo_set_first(ui_todo_hilt() - win[TOD].h + 5); + wins_update(FLAG_TOD); + } } static inline void key_raise_priority(void) { - change_priority(1); + change_priority(1); } static inline void key_lower_priority(void) { - change_priority(-1); + change_priority(-1); } static inline void key_edit_note(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - day_edit_note(day_get_item(ui_day_hilt()), conf.editor); - inday = do_storage(0); - } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { - todo_edit_note(todo_get_item(ui_todo_hilt()), conf.editor); - } - wins_update(FLAG_ALL); + if (wins_slctd() == APP && ui_day_hilt() != 0) { + day_edit_note(day_get_item(ui_day_hilt()), conf.editor); + inday = do_storage(0); + } else if (wins_slctd() == TOD && ui_todo_hilt() != 0) { + todo_edit_note(todo_get_item(ui_todo_hilt()), conf.editor); + } + wins_update(FLAG_ALL); } static inline void key_view_note(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) - day_view_note(day_get_item(ui_day_hilt()), conf.pager); - else if (wins_slctd() == TOD && ui_todo_hilt() != 0) - todo_view_note(todo_get_item(ui_todo_hilt()), conf.pager); - wins_update(FLAG_ALL); + if (wins_slctd() == APP && ui_day_hilt() != 0) + day_view_note(day_get_item(ui_day_hilt()), conf.pager); + else if (wins_slctd() == TOD && ui_todo_hilt() != 0) + todo_view_note(todo_get_item(ui_todo_hilt()), conf.pager); + wins_update(FLAG_ALL); } static inline void key_generic_help(void) { - wins_status_bar(); - help_screen(); - wins_update(FLAG_ALL); + wins_status_bar(); + help_screen(); + wins_update(FLAG_ALL); } static inline void key_generic_save(void) { - io_save_cal(IO_SAVE_DISPLAY_BAR); - wins_update(FLAG_STA); + io_save_cal(IO_SAVE_DISPLAY_BAR); + wins_update(FLAG_STA); } static inline void key_generic_import(void) { - wins_erase_status_bar(); - io_import_data(IO_IMPORT_ICAL, NULL); - ui_calendar_monthly_view_cache_set_invalid(); - inday = do_storage(0); - wins_update(FLAG_ALL); + wins_erase_status_bar(); + io_import_data(IO_IMPORT_ICAL, NULL); + ui_calendar_monthly_view_cache_set_invalid(); + inday = do_storage(0); + wins_update(FLAG_ALL); } static inline void key_generic_export() { - const char *export_msg = _("Export to (i)cal or (p)cal format?"); - const char *export_choices = _("[ip]"); - const int nb_export_choices = 2; + const char *export_msg = _("Export to (i)cal or (p)cal format?"); + const char *export_choices = _("[ip]"); + const int nb_export_choices = 2; - wins_erase_status_bar(); + wins_erase_status_bar(); - switch (status_ask_choice(export_msg, export_choices, nb_export_choices)) { - case 1: - io_export_data(IO_EXPORT_ICAL); - break; - case 2: - io_export_data(IO_EXPORT_PCAL); - break; - default: /* User escaped */ - break; - } + switch (status_ask_choice + (export_msg, export_choices, nb_export_choices)) { + case 1: + io_export_data(IO_EXPORT_ICAL); + break; + case 2: + io_export_data(IO_EXPORT_PCAL); + break; + default: /* User escaped */ + break; + } - inday = do_storage(0); - wins_update(FLAG_ALL); + inday = do_storage(0); + wins_update(FLAG_ALL); } static inline void key_generic_prev_day(void) { - ui_calendar_move(DAY_PREV, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(DAY_PREV, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_move_left(void) { - if (wins_slctd() == CAL) - key_generic_prev_day(); + if (wins_slctd() == CAL) + key_generic_prev_day(); } static inline void key_generic_next_day(void) { - ui_calendar_move(DAY_NEXT, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(DAY_NEXT, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_move_right(void) { - if (wins_slctd() == CAL) - key_generic_next_day(); + if (wins_slctd() == CAL) + key_generic_next_day(); } static inline void key_generic_prev_week(void) { - ui_calendar_move(WEEK_PREV, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(WEEK_PREV, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_move_up(void) { - if (wins_slctd() == CAL) { - key_generic_prev_week(); - } else if (wins_slctd() == APP) { - if (count >= ui_day_hilt()) - count = ui_day_hilt() - 1; - ui_day_hilt_decrease(count); - ui_day_scroll_pad_up(inday.nb_events); - wins_update(FLAG_APP); - } else if (wins_slctd() == TOD) { - if (count >= ui_todo_hilt()) - count = ui_todo_hilt() - 1; - ui_todo_hilt_decrease(count); - if (ui_todo_hilt_pos() < 0) - ui_todo_first_increase(ui_todo_hilt_pos()); - wins_update(FLAG_TOD); - } + if (wins_slctd() == CAL) { + key_generic_prev_week(); + } else if (wins_slctd() == APP) { + if (count >= ui_day_hilt()) + count = ui_day_hilt() - 1; + ui_day_hilt_decrease(count); + ui_day_scroll_pad_up(inday.nb_events); + wins_update(FLAG_APP); + } else if (wins_slctd() == TOD) { + if (count >= ui_todo_hilt()) + count = ui_todo_hilt() - 1; + ui_todo_hilt_decrease(count); + if (ui_todo_hilt_pos() < 0) + ui_todo_first_increase(ui_todo_hilt_pos()); + wins_update(FLAG_TOD); + } } static inline void key_generic_next_week(void) { - ui_calendar_move(WEEK_NEXT, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(WEEK_NEXT, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_move_down(void) { - if (wins_slctd() == CAL) { - key_generic_next_week(); - } else if (wins_slctd() == APP) { - if (count > inday.nb_events + inday.nb_apoints - ui_day_hilt()) - count = inday.nb_events + inday.nb_apoints - ui_day_hilt(); - ui_day_hilt_increase(count); - ui_day_scroll_pad_down(inday.nb_events, win[APP].h); - wins_update(FLAG_APP); - } else if (wins_slctd() == TOD) { - if (count > ui_todo_nb() - ui_todo_hilt()) - count = ui_todo_nb() - ui_todo_hilt(); - ui_todo_hilt_increase(count); - if (ui_todo_hilt_pos() >= win[TOD].h - 4) - ui_todo_first_increase(ui_todo_hilt_pos() - win[TOD].h + 5); - wins_update(FLAG_TOD); - } + if (wins_slctd() == CAL) { + key_generic_next_week(); + } else if (wins_slctd() == APP) { + if (count > + inday.nb_events + inday.nb_apoints - ui_day_hilt()) + count = + inday.nb_events + inday.nb_apoints - + ui_day_hilt(); + ui_day_hilt_increase(count); + ui_day_scroll_pad_down(inday.nb_events, win[APP].h); + wins_update(FLAG_APP); + } else if (wins_slctd() == TOD) { + if (count > ui_todo_nb() - ui_todo_hilt()) + count = ui_todo_nb() - ui_todo_hilt(); + ui_todo_hilt_increase(count); + if (ui_todo_hilt_pos() >= win[TOD].h - 4) + ui_todo_first_increase(ui_todo_hilt_pos() - + win[TOD].h + 5); + wins_update(FLAG_TOD); + } } static inline void key_generic_prev_month(void) { - ui_calendar_move(MONTH_PREV, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(MONTH_PREV, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_generic_next_month(void) { - ui_calendar_move(MONTH_NEXT, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(MONTH_NEXT, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_generic_prev_year(void) { - ui_calendar_move(YEAR_PREV, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(YEAR_PREV, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_generic_next_year(void) { - ui_calendar_move(YEAR_NEXT, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); + ui_calendar_move(YEAR_NEXT, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); } static inline void key_start_of_week(void) { - if (wins_slctd() == CAL) { - ui_calendar_move(WEEK_START, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); - } + if (wins_slctd() == CAL) { + ui_calendar_move(WEEK_START, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } } static inline void key_end_of_week(void) { - if (wins_slctd() == CAL) { - ui_calendar_move(WEEK_END, count); - inday = do_storage(1); - wins_update(FLAG_CAL | FLAG_APP); - } + if (wins_slctd() == CAL) { + ui_calendar_move(WEEK_END, count); + inday = do_storage(1); + wins_update(FLAG_CAL | FLAG_APP); + } } static inline void key_generic_scroll_up(void) { - if (wins_slctd() == CAL) { - ui_calendar_view_prev(); - wins_update(FLAG_CAL | FLAG_APP); - } + if (wins_slctd() == CAL) { + ui_calendar_view_prev(); + wins_update(FLAG_CAL | FLAG_APP); + } } static inline void key_generic_scroll_down(void) { - if (wins_slctd() == CAL) { - ui_calendar_view_next(); - wins_update(FLAG_CAL | FLAG_APP); - } + if (wins_slctd() == CAL) { + ui_calendar_view_next(); + wins_update(FLAG_CAL | FLAG_APP); + } } static inline void key_generic_quit(void) { - if (conf.auto_save) - io_save_cal(IO_SAVE_DISPLAY_BAR); - if (conf.auto_gc) - note_gc(); + 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); - } - } else { - exit_calcurse(EXIT_SUCCESS); - } + 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); + } + } else { + exit_calcurse(EXIT_SUCCESS); + } } /* @@ -486,178 +497,178 @@ static inline void key_generic_quit(void) */ int main(int argc, char **argv) { - int no_data_file = 1; + int no_data_file = 1; #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(); - - /* Initialize non-thread-safe data structures. */ - event_llist_init(); - todo_init_list(); - - /* - * Begin by parsing and handling command line arguments. - * The data path is also initialized here. - */ - 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 */ - ui_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(); + /* Thread-safe data structure init */ + apoint_llist_init(); + recur_apoint_llist_init(); + + /* Initialize non-thread-safe data structures. */ + event_llist_init(); + todo_init_list(); + + /* + * Begin by parsing and handling command line arguments. + * The data path is also initialized here. + */ + 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 */ + ui_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(); #ifdef NCURSES_VERSION - if (use_default_colors() != ERR) { - background = -1; - foreground = -1; - } + 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; - } - - vars_init(); - wins_init(); - /* Default to the calendar panel -- this is overridden later. */ - wins_slctd_set(CAL); - 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. - */ - config_load(); - wins_erase_status_bar(); - io_load_keys(conf.pager); - io_load_todo(); - io_load_app(); - wins_reinit(); - /* - * Refresh the hidden key handler window here to prevent wgetch() from - * implicitly calling wrefresh() later (causing ncurses race conditions). - */ - wins_wrefresh(win[KEY].p); - if (conf.system_dialogs) { - wins_update(FLAG_ALL); - io_startup_screen(no_data_file); - } - inday = day_process_storage(0, 0); - wins_slctd_set(conf.default_panel); - wins_update(FLAG_ALL); - - /* Start miscellaneous threads. */ - if (notify_bar()) - notify_start_main_thread(); - ui_calendar_start_date_thread(); - if (conf.periodic_save > 0) - io_start_psave_thread(); - - /* User input */ - for (;;) { - int key; - - if (resize) { - resize = 0; - wins_reset(); - } - - key = keys_getch(win[KEY].p, &count, ®); - switch (key) { - case KEY_GENERIC_REDRAW: - resize = 1; - break; - - HANDLE_KEY(KEY_GENERIC_CHANGE_VIEW, key_generic_change_view); - HANDLE_KEY(KEY_GENERIC_OTHER_CMD, key_generic_other_cmd); - HANDLE_KEY(KEY_GENERIC_GOTO, key_generic_goto); - HANDLE_KEY(KEY_GENERIC_GOTO_TODAY, key_generic_goto_today); - HANDLE_KEY(KEY_VIEW_ITEM, key_view_item); - HANDLE_KEY(KEY_GENERIC_CONFIG_MENU, key_generic_config_menu); - HANDLE_KEY(KEY_GENERIC_ADD_APPT, key_generic_add_appt); - HANDLE_KEY(KEY_GENERIC_ADD_TODO, key_generic_add_todo); - HANDLE_KEY(KEY_ADD_ITEM, key_add_item); - HANDLE_KEY(KEY_EDIT_ITEM, key_edit_item); - HANDLE_KEY(KEY_DEL_ITEM, key_del_item); - HANDLE_KEY(KEY_GENERIC_COPY, key_generic_copy); - HANDLE_KEY(KEY_GENERIC_PASTE, key_generic_paste); - HANDLE_KEY(KEY_REPEAT_ITEM, key_repeat_item); - HANDLE_KEY(KEY_FLAG_ITEM, key_flag_item); - HANDLE_KEY(KEY_PIPE_ITEM, key_pipe_item); - HANDLE_KEY(KEY_RAISE_PRIORITY, key_raise_priority); - HANDLE_KEY(KEY_LOWER_PRIORITY, key_lower_priority); - HANDLE_KEY(KEY_EDIT_NOTE, key_edit_note); - HANDLE_KEY(KEY_VIEW_NOTE, key_view_note); - HANDLE_KEY(KEY_GENERIC_HELP, key_generic_help); - HANDLE_KEY(KEY_GENERIC_SAVE, key_generic_save); - HANDLE_KEY(KEY_GENERIC_IMPORT, key_generic_import); - HANDLE_KEY(KEY_GENERIC_EXPORT, key_generic_export); - HANDLE_KEY(KEY_GENERIC_PREV_DAY, key_generic_prev_day); - HANDLE_KEY(KEY_MOVE_LEFT, key_move_left); - HANDLE_KEY(KEY_GENERIC_NEXT_DAY, key_generic_next_day); - HANDLE_KEY(KEY_MOVE_RIGHT, key_move_right); - HANDLE_KEY(KEY_GENERIC_PREV_WEEK, key_generic_prev_week); - HANDLE_KEY(KEY_MOVE_UP, key_move_up); - HANDLE_KEY(KEY_GENERIC_NEXT_WEEK, key_generic_next_week); - HANDLE_KEY(KEY_MOVE_DOWN, key_move_down); - HANDLE_KEY(KEY_GENERIC_PREV_MONTH, key_generic_prev_month); - HANDLE_KEY(KEY_GENERIC_NEXT_MONTH, key_generic_next_month); - HANDLE_KEY(KEY_GENERIC_PREV_YEAR, key_generic_prev_year); - HANDLE_KEY(KEY_GENERIC_NEXT_YEAR, key_generic_next_year); - HANDLE_KEY(KEY_START_OF_WEEK, key_start_of_week); - HANDLE_KEY(KEY_END_OF_WEEK, key_end_of_week); - HANDLE_KEY(KEY_GENERIC_SCROLL_UP, key_generic_scroll_up); - HANDLE_KEY(KEY_GENERIC_SCROLL_DOWN, key_generic_scroll_down); - HANDLE_KEY(KEY_GENERIC_QUIT, key_generic_quit); - - case KEY_RESIZE: - case ERR: - /* Do not reset the count parameter on resize or error. */ - continue; - - default: - break; - } - - count = 0; - } + /* 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(); + /* Default to the calendar panel -- this is overridden later. */ + wins_slctd_set(CAL); + 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. + */ + config_load(); + wins_erase_status_bar(); + io_load_keys(conf.pager); + io_load_todo(); + io_load_app(); + wins_reinit(); + /* + * Refresh the hidden key handler window here to prevent wgetch() from + * implicitly calling wrefresh() later (causing ncurses race conditions). + */ + wins_wrefresh(win[KEY].p); + if (conf.system_dialogs) { + wins_update(FLAG_ALL); + io_startup_screen(no_data_file); + } + inday = day_process_storage(0, 0); + wins_slctd_set(conf.default_panel); + wins_update(FLAG_ALL); + + /* Start miscellaneous threads. */ + if (notify_bar()) + notify_start_main_thread(); + ui_calendar_start_date_thread(); + if (conf.periodic_save > 0) + io_start_psave_thread(); + + /* User input */ + for (;;) { + int key; + + if (resize) { + resize = 0; + wins_reset(); + } + + key = keys_getch(win[KEY].p, &count, ®); + switch (key) { + case KEY_GENERIC_REDRAW: + resize = 1; + break; + + HANDLE_KEY(KEY_GENERIC_CHANGE_VIEW, key_generic_change_view); + HANDLE_KEY(KEY_GENERIC_OTHER_CMD, key_generic_other_cmd); + HANDLE_KEY(KEY_GENERIC_GOTO, key_generic_goto); + HANDLE_KEY(KEY_GENERIC_GOTO_TODAY, key_generic_goto_today); + HANDLE_KEY(KEY_VIEW_ITEM, key_view_item); + HANDLE_KEY(KEY_GENERIC_CONFIG_MENU, key_generic_config_menu); + HANDLE_KEY(KEY_GENERIC_ADD_APPT, key_generic_add_appt); + HANDLE_KEY(KEY_GENERIC_ADD_TODO, key_generic_add_todo); + HANDLE_KEY(KEY_ADD_ITEM, key_add_item); + HANDLE_KEY(KEY_EDIT_ITEM, key_edit_item); + HANDLE_KEY(KEY_DEL_ITEM, key_del_item); + HANDLE_KEY(KEY_GENERIC_COPY, key_generic_copy); + HANDLE_KEY(KEY_GENERIC_PASTE, key_generic_paste); + HANDLE_KEY(KEY_REPEAT_ITEM, key_repeat_item); + HANDLE_KEY(KEY_FLAG_ITEM, key_flag_item); + HANDLE_KEY(KEY_PIPE_ITEM, key_pipe_item); + HANDLE_KEY(KEY_RAISE_PRIORITY, key_raise_priority); + HANDLE_KEY(KEY_LOWER_PRIORITY, key_lower_priority); + HANDLE_KEY(KEY_EDIT_NOTE, key_edit_note); + HANDLE_KEY(KEY_VIEW_NOTE, key_view_note); + HANDLE_KEY(KEY_GENERIC_HELP, key_generic_help); + HANDLE_KEY(KEY_GENERIC_SAVE, key_generic_save); + HANDLE_KEY(KEY_GENERIC_IMPORT, key_generic_import); + HANDLE_KEY(KEY_GENERIC_EXPORT, key_generic_export); + HANDLE_KEY(KEY_GENERIC_PREV_DAY, key_generic_prev_day); + HANDLE_KEY(KEY_MOVE_LEFT, key_move_left); + HANDLE_KEY(KEY_GENERIC_NEXT_DAY, key_generic_next_day); + HANDLE_KEY(KEY_MOVE_RIGHT, key_move_right); + HANDLE_KEY(KEY_GENERIC_PREV_WEEK, key_generic_prev_week); + HANDLE_KEY(KEY_MOVE_UP, key_move_up); + HANDLE_KEY(KEY_GENERIC_NEXT_WEEK, key_generic_next_week); + HANDLE_KEY(KEY_MOVE_DOWN, key_move_down); + HANDLE_KEY(KEY_GENERIC_PREV_MONTH, key_generic_prev_month); + HANDLE_KEY(KEY_GENERIC_NEXT_MONTH, key_generic_next_month); + HANDLE_KEY(KEY_GENERIC_PREV_YEAR, key_generic_prev_year); + HANDLE_KEY(KEY_GENERIC_NEXT_YEAR, key_generic_next_year); + HANDLE_KEY(KEY_START_OF_WEEK, key_start_of_week); + HANDLE_KEY(KEY_END_OF_WEEK, key_end_of_week); + HANDLE_KEY(KEY_GENERIC_SCROLL_UP, key_generic_scroll_up); + HANDLE_KEY(KEY_GENERIC_SCROLL_DOWN, key_generic_scroll_down); + HANDLE_KEY(KEY_GENERIC_QUIT, key_generic_quit); + + case KEY_RESIZE: + case ERR: + /* Do not reset the count parameter on resize or error. */ + continue; + + default: + break; + } + + count = 0; + } } diff --git a/src/calcurse.h b/src/calcurse.h index e8313b0..1dfd648 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -156,9 +156,9 @@ #define TAB 9 #define SPACE 32 -#define KEYS_KEYLEN 3 /* length of each keybinding */ -#define KEYS_LABELEN 8 /* length of command description */ -#define KEYS_CMDS_PER_LINE 6 /* max number of commands per line */ +#define KEYS_KEYLEN 3 /* length of each keybinding */ +#define KEYS_LABELEN 8 /* length of command description */ +#define KEYS_CMDS_PER_LINE 6 /* max number of commands per line */ /* Register definitions. */ #define REG_BLACK_HOLE 37 @@ -234,45 +234,45 @@ #define MIN(x,y) ((x)<(y)?(x):(y)) enum win { - CAL, - APP, - TOD, - NOT, - STA, - KEY, - NBWINS + CAL, + APP, + TOD, + NOT, + STA, + KEY, + NBWINS }; /* General configuration variables. */ struct conf { - unsigned auto_save; - unsigned auto_gc; - unsigned periodic_save; - unsigned confirm_quit; - unsigned confirm_delete; - enum win default_panel; - unsigned compact_panels; - unsigned system_dialogs; - unsigned progress_bar; - const char *editor; - const char *pager; - char output_datefmt[BUFSIZ]; /* format for displaying date */ - int input_datefmt; /* format for reading date */ + unsigned auto_save; + unsigned auto_gc; + unsigned periodic_save; + unsigned confirm_quit; + unsigned confirm_delete; + enum win default_panel; + unsigned compact_panels; + unsigned system_dialogs; + unsigned progress_bar; + const char *editor; + const char *pager; + char output_datefmt[BUFSIZ]; /* format for displaying date */ + int input_datefmt; /* format for reading date */ }; /* Daemon-related configuration. */ struct dmon_conf { - unsigned enable; /* launch daemon automatically when exiting */ - unsigned log; /* log daemon activity */ + unsigned enable; /* launch daemon automatically when exiting */ + unsigned log; /* log daemon activity */ }; /* Input date formats. */ enum datefmt { - DATEFMT_MMDDYYYY = 1, - DATEFMT_DDMMYYYY, - DATEFMT_YYYYMMDD, - DATEFMT_ISO, - DATEFMT_MAX + DATEFMT_MMDDYYYY = 1, + DATEFMT_DDMMYYYY, + DATEFMT_YYYYMMDD, + DATEFMT_ISO, + DATEFMT_MAX }; #define DATE_FORMATS (DATEFMT_MAX - 1) @@ -286,179 +286,179 @@ enum datefmt { (datefmt == DATEFMT_YYYYMMDD ? _("yyyy/mm/dd") : _("yyyy-mm-dd")))) struct date { - unsigned dd; - unsigned mm; - unsigned yyyy; + unsigned dd; + unsigned mm; + unsigned yyyy; }; /* Appointment definition. */ struct apoint { - long start; /* seconds since 1 jan 1970 */ - long dur; /* duration of the appointment in seconds */ + long start; /* seconds since 1 jan 1970 */ + long dur; /* duration of the appointment in seconds */ #define APOINT_NULL 0x0 -#define APOINT_NOTIFY 0x1 /* Item needs to be notified */ -#define APOINT_NOTIFIED 0x2 /* Item was already notified */ - int state; +#define APOINT_NOTIFY 0x1 /* Item needs to be notified */ +#define APOINT_NOTIFIED 0x2 /* Item was already notified */ + int state; - char *mesg; - char *note; + char *mesg; + char *note; }; /* Event definition. */ struct event { - int id; /* event identifier */ - long day; /* seconds since 1 jan 1970 */ - char *mesg; - char *note; + int id; /* event identifier */ + long day; /* seconds since 1 jan 1970 */ + char *mesg; + char *note; }; /* Todo item definition. */ struct todo { - char *mesg; - int id; - char *note; + char *mesg; + int id; + char *note; }; /* Number of items in current day. */ struct day_items_nb { - unsigned nb_events; - unsigned nb_apoints; + unsigned nb_events; + unsigned nb_apoints; }; struct excp { - long st; /* beggining of the considered day, in seconds */ + long st; /* beggining of the considered day, in seconds */ }; enum recur_type { - RECUR_NO, - RECUR_DAILY, - RECUR_WEEKLY, - RECUR_MONTHLY, - RECUR_YEARLY, - RECUR_TYPES + RECUR_NO, + RECUR_DAILY, + RECUR_WEEKLY, + RECUR_MONTHLY, + RECUR_YEARLY, + RECUR_TYPES }; /* To describe an item's repetition. */ struct rpt { - enum recur_type type; /* repetition type */ - int freq; /* repetition frequence */ - long until; /* ending date for repeated event */ + enum recur_type type; /* repetition type */ + int freq; /* repetition frequence */ + long until; /* ending date for repeated event */ }; /* Recurrent appointment definition. */ struct recur_apoint { - struct rpt *rpt; /* information about repetition */ - llist_t exc; /* days when the item should not be repeated */ - long start; /* beggining of the appointment */ - long dur; /* duration of the appointment */ - char state; /* 8 bits to store item state */ - char *mesg; /* appointment description */ - char *note; /* note attached to appointment */ + struct rpt *rpt; /* information about repetition */ + llist_t exc; /* days when the item should not be repeated */ + long start; /* beggining of the appointment */ + long dur; /* duration of the appointment */ + char state; /* 8 bits to store item state */ + char *mesg; /* appointment description */ + char *note; /* note attached to appointment */ }; /* Reccurent event definition. */ struct recur_event { - struct rpt *rpt; /* information about repetition */ - llist_t exc; /* days when the item should not be repeated */ - int id; /* event type */ - long day; /* day at which event occurs */ - char *mesg; /* event description */ - char *note; /* note attached to event */ + struct rpt *rpt; /* information about repetition */ + llist_t exc; /* days when the item should not be repeated */ + int id; /* event type */ + long day; /* day at which event occurs */ + char *mesg; /* event description */ + char *note; /* note attached to event */ }; /* Generic pointer data type for appointments and events. */ union aptev_ptr { - struct apoint *apt; - struct event *ev; - struct recur_apoint *rapt; - struct recur_event *rev; + struct apoint *apt; + struct event *ev; + struct recur_apoint *rapt; + struct recur_event *rev; }; /* Generic item description (to hold appointments, events...). */ struct day_item { - int type; /* (recursive or normal) event or appointment */ - long start; /* start time of the repetition occurrence */ - union aptev_ptr item; /* pointer to the actual item */ + int type; /* (recursive or normal) event or appointment */ + long start; /* start time of the repetition occurrence */ + union aptev_ptr item; /* pointer to the actual item */ }; /* Available view for the calendar panel. */ enum { - CAL_MONTH_VIEW, - CAL_WEEK_VIEW, - CAL_VIEWS + CAL_MONTH_VIEW, + CAL_WEEK_VIEW, + CAL_VIEWS }; struct notify_app { - long time; - int got_app; - char *txt; - char state; - pthread_mutex_t mutex; + long time; + int got_app; + char *txt; + char state; + pthread_mutex_t mutex; }; struct io_file { - FILE *fd; - char name[BUFSIZ]; + FILE *fd; + char name[BUFSIZ]; }; /* Available keys. */ enum key { - KEY_GENERIC_CANCEL, - KEY_GENERIC_SELECT, - KEY_GENERIC_CREDITS, - KEY_GENERIC_HELP, - KEY_GENERIC_QUIT, - KEY_GENERIC_SAVE, - KEY_GENERIC_COPY, - KEY_GENERIC_PASTE, - KEY_GENERIC_CHANGE_VIEW, - KEY_GENERIC_IMPORT, - KEY_GENERIC_EXPORT, - KEY_GENERIC_GOTO, - KEY_GENERIC_OTHER_CMD, - KEY_GENERIC_CONFIG_MENU, - KEY_GENERIC_REDRAW, - KEY_GENERIC_ADD_APPT, - KEY_GENERIC_ADD_TODO, - KEY_GENERIC_PREV_DAY, - KEY_GENERIC_NEXT_DAY, - KEY_GENERIC_PREV_WEEK, - KEY_GENERIC_NEXT_WEEK, - KEY_GENERIC_PREV_MONTH, - KEY_GENERIC_NEXT_MONTH, - KEY_GENERIC_PREV_YEAR, - KEY_GENERIC_NEXT_YEAR, - KEY_GENERIC_SCROLL_DOWN, - KEY_GENERIC_SCROLL_UP, - KEY_GENERIC_GOTO_TODAY, - - 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_PIPE_ITEM, - KEY_FLAG_ITEM, - KEY_REPEAT_ITEM, - KEY_EDIT_NOTE, - KEY_VIEW_NOTE, - KEY_RAISE_PRIORITY, - KEY_LOWER_PRIORITY, - - NBKEYS, - KEY_UNDEF + KEY_GENERIC_CANCEL, + KEY_GENERIC_SELECT, + KEY_GENERIC_CREDITS, + KEY_GENERIC_HELP, + KEY_GENERIC_QUIT, + KEY_GENERIC_SAVE, + KEY_GENERIC_COPY, + KEY_GENERIC_PASTE, + KEY_GENERIC_CHANGE_VIEW, + KEY_GENERIC_IMPORT, + KEY_GENERIC_EXPORT, + KEY_GENERIC_GOTO, + KEY_GENERIC_OTHER_CMD, + KEY_GENERIC_CONFIG_MENU, + KEY_GENERIC_REDRAW, + KEY_GENERIC_ADD_APPT, + KEY_GENERIC_ADD_TODO, + KEY_GENERIC_PREV_DAY, + KEY_GENERIC_NEXT_DAY, + KEY_GENERIC_PREV_WEEK, + KEY_GENERIC_NEXT_WEEK, + KEY_GENERIC_PREV_MONTH, + KEY_GENERIC_NEXT_MONTH, + KEY_GENERIC_PREV_YEAR, + KEY_GENERIC_NEXT_YEAR, + KEY_GENERIC_SCROLL_DOWN, + KEY_GENERIC_SCROLL_UP, + KEY_GENERIC_GOTO_TODAY, + + 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_PIPE_ITEM, + KEY_FLAG_ITEM, + KEY_REPEAT_ITEM, + KEY_EDIT_NOTE, + KEY_VIEW_NOTE, + KEY_RAISE_PRIORITY, + KEY_LOWER_PRIORITY, + + NBKEYS, + KEY_UNDEF }; /* To describe a key binding. */ struct binding { - char *label; - enum key action; + char *label; + enum key action; }; #define FLAG_CAL (1 << CAL) @@ -485,122 +485,122 @@ struct binding { pthread_cleanup_pop(0); enum ui_mode { - UI_CURSES, - UI_CMDLINE, - UI_MODES + UI_CURSES, + UI_CMDLINE, + UI_MODES }; /* Generic window structure. */ struct window { - WINDOW *p; /* pointer to window */ - unsigned w; /* width */ - unsigned h; /* height */ - int x; /* x position */ - int y; /* y position */ + WINDOW *p; /* pointer to window */ + unsigned w; /* width */ + unsigned h; /* height */ + int x; /* x position */ + int y; /* y position */ }; /* Generic scrolling window structure. */ struct scrollwin { - struct window win; - struct window pad; - unsigned first_visible_line; - unsigned total_lines; - const char *label; + struct window win; + struct window pad; + unsigned first_visible_line; + unsigned total_lines; + const char *label; }; /* Pad structure to handle scrolling. */ struct pad { - int width; - int length; - int first_onscreen; /* first line to be displayed inside window */ - WINDOW *ptrwin; /* pointer to the pad window */ + int width; + int length; + int first_onscreen; /* first line to be displayed inside window */ + WINDOW *ptrwin; /* pointer to the pad window */ }; /* Notification bar definition. */ struct nbar { - unsigned show; /* display or hide the notify-bar */ - int cntdwn; /* warn when time left before next app - becomes lesser than cntdwn */ - char datefmt[BUFSIZ]; /* format for displaying date */ - char timefmt[BUFSIZ]; /* format for displaying time */ - char cmd[BUFSIZ]; /* notification command */ - const char *shell; /* user shell to launch notif. cmd */ - unsigned notify_all; /* notify all appointments */ - pthread_mutex_t mutex; + unsigned show; /* display or hide the notify-bar */ + int cntdwn; /* warn when time left before next app + becomes lesser than cntdwn */ + char datefmt[BUFSIZ]; /* format for displaying date */ + char timefmt[BUFSIZ]; /* format for displaying time */ + char cmd[BUFSIZ]; /* notification command */ + const char *shell; /* user shell to launch notif. cmd */ + unsigned notify_all; /* notify all appointments */ + pthread_mutex_t mutex; }; /* Available types of items. */ enum item_type { - RECUR_EVNT = 1, - EVNT, - RECUR_APPT, - APPT, - MAX_TYPES = APPT + RECUR_EVNT = 1, + EVNT, + RECUR_APPT, + APPT, + MAX_TYPES = APPT }; /* Return codes for the getstring() function. */ enum getstr { - GETSTRING_VALID, - GETSTRING_ESC, /* user pressed escape to cancel editing. */ - GETSTRING_RET /* return was pressed without entering any text. */ + GETSTRING_VALID, + GETSTRING_ESC, /* user pressed escape to cancel editing. */ + GETSTRING_RET /* return was pressed without entering any text. */ }; /* Week days. */ enum wday { - SUNDAY, - MONDAY, - TUESDAY, - WEDNESDAY, - THURSDAY, - FRIDAY, - SATURDAY, - WDAYS + SUNDAY, + MONDAY, + TUESDAY, + WEDNESDAY, + THURSDAY, + FRIDAY, + SATURDAY, + WDAYS }; /* Possible movements inside calendar. */ enum move { - DAY_PREV, - DAY_NEXT, - WEEK_PREV, - WEEK_NEXT, - WEEK_START, - WEEK_END, - MONTH_PREV, - MONTH_NEXT, - YEAR_PREV, - YEAR_NEXT + DAY_PREV, + DAY_NEXT, + WEEK_PREV, + WEEK_NEXT, + WEEK_START, + WEEK_END, + MONTH_PREV, + MONTH_NEXT, + YEAR_PREV, + YEAR_NEXT }; /* Available color pairs. */ enum { - COLR_RED = 1, - COLR_GREEN, - COLR_YELLOW, - COLR_BLUE, - COLR_MAGENTA, - COLR_CYAN, - COLR_DEFAULT, - COLR_HIGH, - COLR_CUSTOM + COLR_RED = 1, + COLR_GREEN, + COLR_YELLOW, + COLR_BLUE, + COLR_MAGENTA, + COLR_CYAN, + COLR_DEFAULT, + COLR_HIGH, + COLR_CUSTOM }; /* Available import types. */ enum import_type { - IO_IMPORT_ICAL, - IO_IMPORT_NBTYPES + IO_IMPORT_ICAL, + IO_IMPORT_NBTYPES }; /* Available export types. */ enum export_type { - IO_EXPORT_ICAL, - IO_EXPORT_PCAL, - IO_EXPORT_NBTYPES + IO_EXPORT_ICAL, + IO_EXPORT_PCAL, + IO_EXPORT_NBTYPES }; /* To customize the display when saving data. */ enum save_display { - IO_SAVE_DISPLAY_BAR, - IO_SAVE_DISPLAY_NONE + IO_SAVE_DISPLAY_BAR, + IO_SAVE_DISPLAY_NONE }; /* apoint.c */ @@ -687,7 +687,7 @@ int day_store_items(long, unsigned *, unsigned *, regex_t *); struct day_items_nb day_process_storage(struct date *, unsigned); void day_write_pad(long, int, int, int); void day_write_stdout(long, const char *, const char *, const char *, - const char *); + const char *); void day_popup_item(struct day_item *); int day_check_if_item(struct date); unsigned day_chk_busy_slices(struct date, int, int *); @@ -726,7 +726,7 @@ int updatestring(WINDOW *, char **, int, int); /* ical.c */ void ical_import_data(FILE *, FILE *, unsigned *, unsigned *, unsigned *, - unsigned *, unsigned *); + unsigned *, unsigned *); void ical_export_data(FILE *); /* interaction.c */ @@ -789,7 +789,7 @@ const char *keys_action_firstkey(enum key); const char *keys_action_nkey(enum key, int); char *keys_action_allkeys(enum key); void keys_display_bindings_bar(WINDOW *, struct binding *[], int, int, - int, struct binding *); + int, struct binding *); void keys_popup_info(enum key); void keys_save_bindings(FILE *); int keys_check_missing_bindings(void); @@ -875,23 +875,25 @@ void recur_apoint_llist_init(void); void recur_apoint_llist_free(void); void recur_event_llist_free(void); struct recur_apoint *recur_apoint_new(char *, char *, long, long, char, - int, int, long, llist_t *); + int, int, long, llist_t *); struct recur_event *recur_event_new(char *, char *, long, int, int, int, - long, llist_t *); + long, llist_t *); char recur_def2char(enum recur_type); int recur_char2def(char); struct recur_apoint *recur_apoint_scan(FILE *, struct tm, struct tm, - char, int, struct tm, char *, - llist_t *, char); + char, int, struct tm, char *, + llist_t *, char); struct recur_event *recur_event_scan(FILE *, struct tm, int, char, - int, struct tm, char *, llist_t *); + int, struct tm, char *, llist_t *); void recur_apoint_write(struct recur_apoint *, FILE *); void recur_event_write(struct recur_event *, FILE *); void recur_save_data(FILE *); unsigned recur_item_find_occurrence(long, long, llist_t *, int, - int, long, long, unsigned *); -unsigned recur_apoint_find_occurrence(struct recur_apoint *, long, unsigned *); -unsigned recur_event_find_occurrence(struct recur_event *, long, unsigned *); + int, long, long, unsigned *); +unsigned recur_apoint_find_occurrence(struct recur_apoint *, long, + unsigned *); +unsigned recur_event_find_occurrence(struct recur_event *, long, + unsigned *); unsigned recur_item_inday(long, long, llist_t *, int, int, long, long); unsigned recur_apoint_inday(struct recur_apoint *, long *); unsigned recur_event_inday(struct recur_event *, long *); @@ -900,7 +902,8 @@ void recur_apoint_add_exc(struct recur_apoint *, long); void recur_event_erase(struct recur_event *); void recur_apoint_erase(struct recur_apoint *); void recur_exc_scan(llist_t *, FILE *); -struct notify_app *recur_apoint_check_next(struct notify_app *, long, long); +struct notify_app *recur_apoint_check_next(struct notify_app *, long, + long); void recur_apoint_switch_notify(struct recur_apoint *); void recur_event_paste_item(struct recur_event *, long); void recur_apoint_paste_item(struct recur_apoint *, long); @@ -975,7 +978,8 @@ void print_bool_option_incolor(WINDOW *, unsigned, int, int); const char *get_tempdir(void); char *new_tempfile(const char *, int); int check_date(unsigned, unsigned, unsigned); -int parse_date(const char *, enum datefmt, int *, int *, int *, struct date *); +int parse_date(const char *, enum datefmt, int *, int *, int *, + struct date *); int check_time(unsigned, unsigned); int parse_time(const char *, unsigned *, unsigned *); int parse_duration(const char *, unsigned *); @@ -987,7 +991,8 @@ int child_wait(int *, int *, int); void press_any_key(void); void print_apoint(const char *, long, struct apoint *); void print_event(const char *, long, struct event *); -void print_recur_apoint(const char *, long, unsigned, struct recur_apoint *); +void print_recur_apoint(const char *, long, unsigned, + struct recur_apoint *); void print_recur_event(const char *, long, struct recur_event *); void print_todo(const char *, struct todo *); diff --git a/src/config.c b/src/config.c index 083b9cf..39ac338 100644 --- a/src/config.c +++ b/src/config.c @@ -43,10 +43,10 @@ typedef int (*config_fn_parse_t) (void *, const char *); typedef int (*config_fn_serialize_t) (char *, void *); struct confvar { - const char *key; - config_fn_parse_t fn_parse; - config_fn_serialize_t fn_serialize; - void *target; + const char *key; + config_fn_parse_t fn_parse; + config_fn_serialize_t fn_serialize; + void *target; }; static int config_parse_bool(unsigned *, const char *); @@ -84,42 +84,35 @@ static int config_serialize_input_datefmt(char *, void *); (config_fn_serialize_t) config_serialize_str, &(var) static const struct confvar confmap[] = { - {"appearance.calendarview", config_parse_calendar_view, - config_serialize_calendar_view, NULL}, - {"appearance.compactpanels", CONFIG_HANDLER_BOOL(conf.compact_panels)}, - {"appearance.defaultpanel", config_parse_default_panel, - config_serialize_default_panel, NULL}, - {"appearance.layout", config_parse_layout, config_serialize_layout, NULL}, - {"appearance.notifybar", CONFIG_HANDLER_BOOL(nbar.show)}, - {"appearance.sidebarwidth", config_parse_sidebar_width, - config_serialize_sidebar_width, NULL}, - {"appearance.theme", config_parse_color_theme, config_serialize_color_theme, - NULL}, - {"daemon.enable", CONFIG_HANDLER_BOOL(dmon.enable)}, - {"daemon.log", CONFIG_HANDLER_BOOL(dmon.log)}, - {"format.inputdate", config_parse_input_datefmt, - config_serialize_input_datefmt, NULL}, - {"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)}, - {"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)}, - {"format.outputdate", config_parse_output_datefmt, - config_serialize_output_datefmt, NULL}, - {"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)}, - {"general.autosave", CONFIG_HANDLER_BOOL(conf.auto_save)}, - {"general.confirmdelete", CONFIG_HANDLER_BOOL(conf.confirm_delete)}, - {"general.confirmquit", CONFIG_HANDLER_BOOL(conf.confirm_quit)}, - {"general.firstdayofweek", config_parse_first_day_of_week, - config_serialize_first_day_of_week, NULL}, - {"general.periodicsave", CONFIG_HANDLER_UNSIGNED(conf.periodic_save)}, - {"general.progressbar", CONFIG_HANDLER_BOOL(conf.progress_bar)}, - {"general.systemdialogs", CONFIG_HANDLER_BOOL(conf.system_dialogs)}, - {"notification.command", CONFIG_HANDLER_STR(nbar.cmd)}, - {"notification.notifyall", CONFIG_HANDLER_BOOL(nbar.notify_all)}, - {"notification.warning", CONFIG_HANDLER_INT(nbar.cntdwn)} + {"appearance.calendarview", config_parse_calendar_view, config_serialize_calendar_view, NULL}, + {"appearance.compactpanels", CONFIG_HANDLER_BOOL(conf.compact_panels)}, + {"appearance.defaultpanel", config_parse_default_panel, config_serialize_default_panel, NULL}, + {"appearance.layout", config_parse_layout, config_serialize_layout, NULL}, + {"appearance.notifybar", CONFIG_HANDLER_BOOL(nbar.show)}, + {"appearance.sidebarwidth", config_parse_sidebar_width, config_serialize_sidebar_width, NULL}, + {"appearance.theme", config_parse_color_theme, config_serialize_color_theme, NULL}, + {"daemon.enable", CONFIG_HANDLER_BOOL(dmon.enable)}, + {"daemon.log", CONFIG_HANDLER_BOOL(dmon.log)}, + {"format.inputdate", config_parse_input_datefmt, config_serialize_input_datefmt, NULL}, + {"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)}, + {"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)}, + {"format.outputdate", config_parse_output_datefmt, config_serialize_output_datefmt, NULL}, + {"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)}, + {"general.autosave", CONFIG_HANDLER_BOOL(conf.auto_save)}, + {"general.confirmdelete", CONFIG_HANDLER_BOOL(conf.confirm_delete)}, + {"general.confirmquit", CONFIG_HANDLER_BOOL(conf.confirm_quit)}, + {"general.firstdayofweek", config_parse_first_day_of_week, config_serialize_first_day_of_week, NULL}, + {"general.periodicsave", CONFIG_HANDLER_UNSIGNED(conf.periodic_save)}, + {"general.progressbar", CONFIG_HANDLER_BOOL(conf.progress_bar)}, + {"general.systemdialogs", CONFIG_HANDLER_BOOL(conf.system_dialogs)}, + {"notification.command", CONFIG_HANDLER_STR(nbar.cmd)}, + {"notification.notifyall", CONFIG_HANDLER_BOOL(nbar.notify_all)}, + {"notification.warning", CONFIG_HANDLER_INT(nbar.cntdwn)} }; struct config_save_status { - FILE *fp; - int done[sizeof(confmap) / sizeof(confmap[0])]; + FILE *fp; + int done[sizeof(confmap) / sizeof(confmap[0])]; }; typedef int (*config_fn_walk_cb_t) (const char *, const char *, void *); @@ -127,207 +120,211 @@ typedef int (*config_fn_walk_junk_cb_t) (const char *, void *); static int config_parse_bool(unsigned *dest, const char *val) { - if (strcmp(val, "yes") == 0) - *dest = 1; - else if (strcmp(val, "no") == 0) - *dest = 0; - else - return 0; + if (strcmp(val, "yes") == 0) + *dest = 1; + else if (strcmp(val, "no") == 0) + *dest = 0; + else + return 0; - return 1; + return 1; } static int config_parse_unsigned(unsigned *dest, const char *val) { - if (is_all_digit(val)) - *dest = atoi(val); - else - return 0; + if (is_all_digit(val)) + *dest = atoi(val); + else + return 0; - return 1; + return 1; } static int config_parse_int(int *dest, const char *val) { - if ((*val == '+' || *val == '-' || isdigit(*val)) && is_all_digit(val + 1)) - *dest = atoi(val); - else - return 0; + if ((*val == '+' || *val == '-' || isdigit(*val)) + && is_all_digit(val + 1)) + *dest = atoi(val); + else + return 0; - return 1; + return 1; } static int config_parse_str(char *dest, const char *val) { - strncpy(dest, val, BUFSIZ); - return 1; + strncpy(dest, val, BUFSIZ); + return 1; } static int config_parse_color(int *dest, const char *val) { - if (!strcmp(val, "black")) - *dest = COLOR_BLACK; - else if (!strcmp(val, "red")) - *dest = COLOR_RED; - else if (!strcmp(val, "green")) - *dest = COLOR_GREEN; - else if (!strcmp(val, "yellow")) - *dest = COLOR_YELLOW; - else if (!strcmp(val, "blue")) - *dest = COLOR_BLUE; - else if (!strcmp(val, "magenta")) - *dest = COLOR_MAGENTA; - else if (!strcmp(val, "cyan")) - *dest = COLOR_CYAN; - else if (!strcmp(val, "white")) - *dest = COLOR_WHITE; - else if (!strcmp(val, "default")) - *dest = background; - else - return 0; - - return 1; + if (!strcmp(val, "black")) + *dest = COLOR_BLACK; + else if (!strcmp(val, "red")) + *dest = COLOR_RED; + else if (!strcmp(val, "green")) + *dest = COLOR_GREEN; + else if (!strcmp(val, "yellow")) + *dest = COLOR_YELLOW; + else if (!strcmp(val, "blue")) + *dest = COLOR_BLUE; + else if (!strcmp(val, "magenta")) + *dest = COLOR_MAGENTA; + else if (!strcmp(val, "cyan")) + *dest = COLOR_CYAN; + else if (!strcmp(val, "white")) + *dest = COLOR_WHITE; + else if (!strcmp(val, "default")) + *dest = background; + else + return 0; + + return 1; } static int config_parse_color_pair(int *dest1, int *dest2, const char *val) { - char s1[BUFSIZ], s2[BUFSIZ]; + char s1[BUFSIZ], s2[BUFSIZ]; - if (sscanf(val, "%s on %s", s1, s2) != 2) - return 0; + if (sscanf(val, "%s on %s", s1, s2) != 2) + return 0; - return (config_parse_color(dest1, s1) && config_parse_color(dest2, s2)); + return (config_parse_color(dest1, s1) + && config_parse_color(dest2, s2)); } static int config_parse_calendar_view(void *dummy, const char *val) { - if (!strcmp(val, "monthly")) - ui_calendar_set_view(CAL_MONTH_VIEW); - else if (!strcmp(val, "weekly")) - ui_calendar_set_view(CAL_WEEK_VIEW); - else - return 0; + if (!strcmp(val, "monthly")) + ui_calendar_set_view(CAL_MONTH_VIEW); + else if (!strcmp(val, "weekly")) + ui_calendar_set_view(CAL_WEEK_VIEW); + else + return 0; - return 1; + return 1; } static int config_parse_default_panel(void *dummy, const char *val) { - if (!strcmp(val, "calendar")) - conf.default_panel = CAL; - else if (!strcmp(val, "appointments")) - conf.default_panel = APP; - else if (!strcmp(val, "todo")) - conf.default_panel = TOD; - else - return 0; + if (!strcmp(val, "calendar")) + conf.default_panel = CAL; + else if (!strcmp(val, "appointments")) + conf.default_panel = APP; + else if (!strcmp(val, "todo")) + conf.default_panel = TOD; + else + return 0; - return 1; + return 1; } static int config_parse_first_day_of_week(void *dummy, const char *val) { - if (!strcmp(val, "monday")) - ui_calendar_set_first_day_of_week(MONDAY); - else if (!strcmp(val, "sunday")) - ui_calendar_set_first_day_of_week(SUNDAY); - else - return 0; + if (!strcmp(val, "monday")) + ui_calendar_set_first_day_of_week(MONDAY); + else if (!strcmp(val, "sunday")) + ui_calendar_set_first_day_of_week(SUNDAY); + else + return 0; - return 1; + return 1; } static int config_parse_color_theme(void *dummy, const char *val) { - int color1, color2; - if (!strcmp(val, "0") || !strcmp(val, "none")) { - colorize = 0; - return 1; - } - if (!config_parse_color_pair(&color1, &color2, val)) - return 0; - init_pair(COLR_CUSTOM, color1, color2); - return 1; + int color1, color2; + if (!strcmp(val, "0") || !strcmp(val, "none")) { + colorize = 0; + return 1; + } + if (!config_parse_color_pair(&color1, &color2, val)) + return 0; + init_pair(COLR_CUSTOM, color1, color2); + return 1; } static int config_parse_layout(void *dummy, const char *val) { - wins_set_layout(atoi(val)); - return 1; + wins_set_layout(atoi(val)); + return 1; } static int config_parse_sidebar_width(void *dummy, const char *val) { - wins_set_sbar_width(atoi(val)); - return 1; + wins_set_sbar_width(atoi(val)); + return 1; } static int config_parse_output_datefmt(void *dummy, const char *val) { - if (val[0] != '\0') - return config_parse_str(conf.output_datefmt, val); - return 1; + if (val[0] != '\0') + return config_parse_str(conf.output_datefmt, val); + return 1; } static int config_parse_input_datefmt(void *dummy, const char *val) { - if (config_parse_int(&conf.input_datefmt, val)) { - if (conf.input_datefmt <= 0 || conf.input_datefmt > DATE_FORMATS) - conf.input_datefmt = 1; - return 1; - } else { - return 0; - } + if (config_parse_int(&conf.input_datefmt, val)) { + if (conf.input_datefmt <= 0 + || conf.input_datefmt > DATE_FORMATS) + conf.input_datefmt = 1; + return 1; + } else { + return 0; + } } /* Set a configuration variable. */ static int config_set_conf(const char *key, const char *value) { - int i; + int i; - if (!key) - return -1; + if (!key) + return -1; - for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) { - if (!strcmp(confmap[i].key, key)) - return confmap[i].fn_parse(confmap[i].target, value); - } + for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) { + if (!strcmp(confmap[i].key, key)) + return confmap[i].fn_parse(confmap[i].target, + value); + } - return -1; + return -1; } static int config_serialize_bool(char *dest, unsigned *val) { - if (*val) { - dest[0] = 'y'; - dest[1] = 'e'; - dest[2] = 's'; - dest[3] = '\0'; - } else { - dest[0] = 'n'; - dest[1] = 'o'; - dest[2] = '\0'; - } + if (*val) { + dest[0] = 'y'; + dest[1] = 'e'; + dest[2] = 's'; + dest[3] = '\0'; + } else { + dest[0] = 'n'; + dest[1] = 'o'; + dest[2] = '\0'; + } - return 1; + return 1; } static int config_serialize_unsigned(char *dest, unsigned *val) { - snprintf(dest, BUFSIZ, "%u", *val); - return 1; + snprintf(dest, BUFSIZ, "%u", *val); + return 1; } static int config_serialize_int(char *dest, int *val) { - snprintf(dest, BUFSIZ, "%d", *val); - return 1; + snprintf(dest, BUFSIZ, "%d", *val); + return 1; } static int config_serialize_str(char *dest, const char *val) { - strncpy(dest, val, BUFSIZ); - return 1; + strncpy(dest, val, BUFSIZ); + return 1; } /* @@ -345,281 +342,290 @@ static void config_color_theme_name(char *theme_name) #define DEFAULTCOLOR 255 #define DEFAULTCOLOR_EXT -1 - int i; - short color[NBCOLORS]; - const char *color_name[NBCOLORS]; - const char *default_color = "default"; - const char *name[MAXCOLORS] = { - "black", - "red", - "green", - "yellow", - "blue", - "magenta", - "cyan", - "white" - }; - - if (!colorize) { - strncpy(theme_name, "none", BUFSIZ); - } else { - pair_content(COLR_CUSTOM, &color[0], &color[1]); - for (i = 0; i < NBCOLORS; i++) { - if ((color[i] == DEFAULTCOLOR) || (color[i] == DEFAULTCOLOR_EXT)) { - color_name[i] = default_color; - } else if (color[i] >= 0 && color[i] <= MAXCOLORS) { - color_name[i] = name[color[i]]; - } else { - EXIT(_("unknown color")); - /* NOTREACHED */ - } - } - snprintf(theme_name, BUFSIZ, "%s on %s", color_name[0], color_name[1]); - } + int i; + short color[NBCOLORS]; + const char *color_name[NBCOLORS]; + const char *default_color = "default"; + const char *name[MAXCOLORS] = { + "black", + "red", + "green", + "yellow", + "blue", + "magenta", + "cyan", + "white" + }; + + if (!colorize) { + strncpy(theme_name, "none", BUFSIZ); + } else { + pair_content(COLR_CUSTOM, &color[0], &color[1]); + for (i = 0; i < NBCOLORS; i++) { + if ((color[i] == DEFAULTCOLOR) + || (color[i] == DEFAULTCOLOR_EXT)) { + color_name[i] = default_color; + } else if (color[i] >= 0 && color[i] <= MAXCOLORS) { + color_name[i] = name[color[i]]; + } else { + EXIT(_("unknown color")); + /* NOTREACHED */ + } + } + snprintf(theme_name, BUFSIZ, "%s on %s", color_name[0], + color_name[1]); + } } static int config_serialize_calendar_view(char *buf, void *dummy) { - if (ui_calendar_get_view() == CAL_WEEK_VIEW) - strcpy(buf, "weekly"); - else - strcpy(buf, "monthly"); + if (ui_calendar_get_view() == CAL_WEEK_VIEW) + strcpy(buf, "weekly"); + else + strcpy(buf, "monthly"); - return 1; + return 1; } static int config_serialize_default_panel(char *buf, void *dummy) { - if (conf.default_panel == CAL) - strcpy(buf, "calendar"); - else if (conf.default_panel == APP) - strcpy(buf, "appointments"); - else - strcpy(buf, "todo"); + if (conf.default_panel == CAL) + strcpy(buf, "calendar"); + else if (conf.default_panel == APP) + strcpy(buf, "appointments"); + else + strcpy(buf, "todo"); - return 1; + return 1; } static int config_serialize_first_day_of_week(char *buf, void *dummy) { - if (ui_calendar_week_begins_on_monday()) - strcpy(buf, "monday"); - else - strcpy(buf, "sunday"); + if (ui_calendar_week_begins_on_monday()) + strcpy(buf, "monday"); + else + strcpy(buf, "sunday"); - return 1; + return 1; } static int config_serialize_color_theme(char *buf, void *dummy) { - config_color_theme_name(buf); - return 1; + config_color_theme_name(buf); + return 1; } static int config_serialize_layout(char *buf, void *dummy) { - int tmp = wins_layout(); - return config_serialize_int(buf, &tmp); + int tmp = wins_layout(); + return config_serialize_int(buf, &tmp); } static int config_serialize_sidebar_width(char *buf, void *dummy) { - int tmp = wins_sbar_wperc(); - return config_serialize_int(buf, &tmp); + int tmp = wins_sbar_wperc(); + return config_serialize_int(buf, &tmp); } static int config_serialize_output_datefmt(char *buf, void *dummy) { - return config_serialize_str(buf, conf.output_datefmt); + return config_serialize_str(buf, conf.output_datefmt); } static int config_serialize_input_datefmt(char *buf, void *dummy) { - return config_serialize_int(buf, &conf.input_datefmt); + return config_serialize_int(buf, &conf.input_datefmt); } /* Serialize the value of a configuration variable. */ static int config_serialize_conf(char *buf, const char *key, - struct config_save_status *status) + struct config_save_status *status) { - int i; + int i; - if (!key) - return -1; + if (!key) + return -1; - for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) { - if (!strcmp(confmap[i].key, key)) { - if (confmap[i].fn_serialize(buf, confmap[i].target)) { - if (status) - status->done[i] = 1; - return 1; - } else { - return 0; - } - } - } + for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) { + if (!strcmp(confmap[i].key, key)) { + if (confmap[i]. + fn_serialize(buf, confmap[i].target)) { + if (status) + status->done[i] = 1; + return 1; + } else { + return 0; + } + } + } - return -1; + return -1; } static void config_file_walk(config_fn_walk_cb_t fn_cb, - config_fn_walk_junk_cb_t fn_junk_cb, void *data) -{ - FILE *data_file; - char buf[BUFSIZ], e_conf[BUFSIZ]; - char *key, *value; - - data_file = fopen(path_conf, "r"); - EXIT_IF(data_file == NULL, _("failed to open configuration file")); - - pthread_mutex_lock(&nbar.mutex); - for (;;) { - if (fgets(buf, sizeof buf, data_file) == NULL) - break; - io_extract_data(e_conf, buf, sizeof buf); - - if (*e_conf == '\0') { - if (fn_junk_cb) - fn_junk_cb(buf, data); - continue; - } - - key = e_conf; - value = strchr(e_conf, '='); - if (value) { - *value = '\0'; - value++; - } else { - EXIT(_("invalid configuration directive: \"%s\""), e_conf); - } - - if (strcmp(key, "auto_save") == 0 || - strcmp(key, "auto_gc") == 0 || - strcmp(key, "periodic_save") == 0 || - strcmp(key, "confirm_quit") == 0 || - strcmp(key, "confirm_delete") == 0 || - strcmp(key, "skip_system_dialogs") == 0 || - strcmp(key, "skip_progress_bar") == 0 || - strcmp(key, "calendar_default_view") == 0 || - strcmp(key, "week_begins_on_monday") == 0 || - strcmp(key, "color-theme") == 0 || - strcmp(key, "layout") == 0 || - strcmp(key, "side-bar_width") == 0 || - strcmp(key, "notify-bar_show") == 0 || - strcmp(key, "notify-bar_date") == 0 || - strcmp(key, "notify-bar_clock") == 0 || - strcmp(key, "notify-bar_warning") == 0 || - strcmp(key, "notify-bar_command") == 0 || - strcmp(key, "notify-all") == 0 || - strcmp(key, "output_datefmt") == 0 || - strcmp(key, "input_datefmt") == 0 || - strcmp(key, "notify-daemon_enable") == 0 || - strcmp(key, "notify-daemon_log") == 0) { - WARN_MSG(_("Pre-3.0.0 configuration file format detected, " - "please upgrade running `calcurse-upgrade`.")); - } - - if (value && (*value == '\0' || *value == '\n')) { - /* Backward compatibility mode. */ - if (fgets(buf, sizeof buf, data_file) == NULL) - break; - io_extract_data(e_conf, buf, sizeof buf); - value = e_conf; - } - - fn_cb(key, value, data); - } - file_close(data_file, __FILE_POS__); - pthread_mutex_unlock(&nbar.mutex); + config_fn_walk_junk_cb_t fn_junk_cb, void *data) +{ + FILE *data_file; + char buf[BUFSIZ], e_conf[BUFSIZ]; + char *key, *value; + + data_file = fopen(path_conf, "r"); + EXIT_IF(data_file == NULL, _("failed to open configuration file")); + + pthread_mutex_lock(&nbar.mutex); + for (;;) { + if (fgets(buf, sizeof buf, data_file) == NULL) + break; + io_extract_data(e_conf, buf, sizeof buf); + + if (*e_conf == '\0') { + if (fn_junk_cb) + fn_junk_cb(buf, data); + continue; + } + + key = e_conf; + value = strchr(e_conf, '='); + if (value) { + *value = '\0'; + value++; + } else { + EXIT(_("invalid configuration directive: \"%s\""), + e_conf); + } + + if (strcmp(key, "auto_save") == 0 || + strcmp(key, "auto_gc") == 0 || + strcmp(key, "periodic_save") == 0 || + strcmp(key, "confirm_quit") == 0 || + strcmp(key, "confirm_delete") == 0 || + strcmp(key, "skip_system_dialogs") == 0 || + strcmp(key, "skip_progress_bar") == 0 || + strcmp(key, "calendar_default_view") == 0 || + strcmp(key, "week_begins_on_monday") == 0 || + strcmp(key, "color-theme") == 0 || + strcmp(key, "layout") == 0 || + strcmp(key, "side-bar_width") == 0 || + strcmp(key, "notify-bar_show") == 0 || + strcmp(key, "notify-bar_date") == 0 || + strcmp(key, "notify-bar_clock") == 0 || + strcmp(key, "notify-bar_warning") == 0 || + strcmp(key, "notify-bar_command") == 0 || + strcmp(key, "notify-all") == 0 || + strcmp(key, "output_datefmt") == 0 || + strcmp(key, "input_datefmt") == 0 || + strcmp(key, "notify-daemon_enable") == 0 || + strcmp(key, "notify-daemon_log") == 0) { + WARN_MSG(_("Pre-3.0.0 configuration file format detected, " + "please upgrade running `calcurse-upgrade`.")); + } + + if (value && (*value == '\0' || *value == '\n')) { + /* Backward compatibility mode. */ + if (fgets(buf, sizeof buf, data_file) == NULL) + break; + io_extract_data(e_conf, buf, sizeof buf); + value = e_conf; + } + + fn_cb(key, value, data); + } + file_close(data_file, __FILE_POS__); + pthread_mutex_unlock(&nbar.mutex); } static int config_load_cb(const char *key, const char *value, void *dummy) { - int result = config_set_conf(key, value); + int result = config_set_conf(key, value); - if (result < 0) { - EXIT(_("configuration variable unknown: \"%s\""), key); - /* NOTREACHED */ - } else if (result == 0) { - EXIT(_("wrong configuration variable format for \"%s\""), key); - /* NOTREACHED */ - } + if (result < 0) { + EXIT(_("configuration variable unknown: \"%s\""), key); + /* NOTREACHED */ + } else if (result == 0) { + EXIT(_("wrong configuration variable format for \"%s\""), + key); + /* NOTREACHED */ + } - return 1; + return 1; } /* Load the user configuration. */ void config_load(void) { - config_file_walk(config_load_cb, NULL, NULL); + config_file_walk(config_load_cb, NULL, NULL); } static int config_save_cb(const char *key, const char *value, void *status) { - char buf[BUFSIZ]; - int result = - config_serialize_conf(buf, key, (struct config_save_status *)status); + char buf[BUFSIZ]; + int result = + config_serialize_conf(buf, key, + (struct config_save_status *)status); - if (result < 0) { - EXIT(_("configuration variable unknown: \"%s\""), key); - /* NOTREACHED */ - } else if (result == 0) { - EXIT(_("wrong configuration variable format for \"%s\""), key); - /* NOTREACHED */ - } + if (result < 0) { + EXIT(_("configuration variable unknown: \"%s\""), key); + /* NOTREACHED */ + } else if (result == 0) { + EXIT(_("wrong configuration variable format for \"%s\""), + key); + /* NOTREACHED */ + } - fputs(key, ((struct config_save_status *)status)->fp); - fputc('=', ((struct config_save_status *)status)->fp); - fputs(buf, ((struct config_save_status *)status)->fp); - fputc('\n', ((struct config_save_status *)status)->fp); + fputs(key, ((struct config_save_status *)status)->fp); + fputc('=', ((struct config_save_status *)status)->fp); + fputs(buf, ((struct config_save_status *)status)->fp); + fputc('\n', ((struct config_save_status *)status)->fp); - return 1; + return 1; } static int config_save_junk_cb(const char *data, void *status) { - fputs(data, ((struct config_save_status *)status)->fp); - return 1; + fputs(data, ((struct config_save_status *)status)->fp); + return 1; } /* Save the user configuration. */ unsigned config_save(void) { - char tmppath[BUFSIZ]; - char *tmpext; - struct config_save_status status; - int i; + char tmppath[BUFSIZ]; + char *tmpext; + struct config_save_status status; + int i; - if (read_only) - return 1; + if (read_only) + return 1; - strncpy(tmppath, get_tempdir(), BUFSIZ); - strncat(tmppath, "/" CONF_PATH_NAME ".", BUFSIZ - strlen(tmppath) - 1); - if ((tmpext = new_tempfile(tmppath, TMPEXTSIZ)) == NULL) - return 0; - strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1); - mem_free(tmpext); + strncpy(tmppath, get_tempdir(), BUFSIZ); + strncat(tmppath, "/" CONF_PATH_NAME ".", + BUFSIZ - strlen(tmppath) - 1); + if ((tmpext = new_tempfile(tmppath, TMPEXTSIZ)) == NULL) + return 0; + strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1); + mem_free(tmpext); - status.fp = fopen(tmppath, "w"); - if (!status.fp) - return 0; + status.fp = fopen(tmppath, "w"); + if (!status.fp) + return 0; - memset(status.done, 0, sizeof(status.done)); + memset(status.done, 0, sizeof(status.done)); - config_file_walk(config_save_cb, config_save_junk_cb, (void *)&status); + config_file_walk(config_save_cb, config_save_junk_cb, + (void *)&status); - /* Set variables that were missing from the configuration file. */ - for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) { - if (!status.done[i]) - config_save_cb(confmap[i].key, NULL, &status); - } + /* Set variables that were missing from the configuration file. */ + for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) { + if (!status.done[i]) + config_save_cb(confmap[i].key, NULL, &status); + } - file_close(status.fp, __FILE_POS__); + file_close(status.fp, __FILE_POS__); - if (io_file_cp(tmppath, path_conf)) - unlink(tmppath); + if (io_file_cp(tmppath, path_conf)) + unlink(tmppath); - return 1; + return 1; } diff --git a/src/custom.c b/src/custom.c index 6f573c5..6ae8abc 100644 --- a/src/custom.c +++ b/src/custom.c @@ -42,8 +42,8 @@ #include "calcurse.h" struct attribute { - int color[7]; - int nocolor[7]; + int color[7]; + int nocolor[7]; }; static struct attribute attr; @@ -58,225 +58,230 @@ static struct attribute attr; */ void custom_init_attr(void) { - attr.color[ATTR_HIGHEST] = COLOR_PAIR(COLR_CUSTOM); - attr.color[ATTR_HIGH] = COLOR_PAIR(COLR_HIGH); - attr.color[ATTR_MIDDLE] = COLOR_PAIR(COLR_RED); - attr.color[ATTR_LOW] = COLOR_PAIR(COLR_CYAN); - attr.color[ATTR_LOWEST] = COLOR_PAIR(COLR_YELLOW); - attr.color[ATTR_TRUE] = COLOR_PAIR(COLR_GREEN); - attr.color[ATTR_FALSE] = COLOR_PAIR(COLR_RED); - - attr.nocolor[ATTR_HIGHEST] = A_BOLD; - attr.nocolor[ATTR_HIGH] = A_REVERSE; - attr.nocolor[ATTR_MIDDLE] = A_REVERSE; - attr.nocolor[ATTR_LOW] = A_UNDERLINE; - attr.nocolor[ATTR_LOWEST] = A_BOLD; - attr.nocolor[ATTR_TRUE] = A_BOLD; - attr.nocolor[ATTR_FALSE] = A_DIM; + attr.color[ATTR_HIGHEST] = COLOR_PAIR(COLR_CUSTOM); + attr.color[ATTR_HIGH] = COLOR_PAIR(COLR_HIGH); + attr.color[ATTR_MIDDLE] = COLOR_PAIR(COLR_RED); + attr.color[ATTR_LOW] = COLOR_PAIR(COLR_CYAN); + attr.color[ATTR_LOWEST] = COLOR_PAIR(COLR_YELLOW); + attr.color[ATTR_TRUE] = COLOR_PAIR(COLR_GREEN); + attr.color[ATTR_FALSE] = COLOR_PAIR(COLR_RED); + + attr.nocolor[ATTR_HIGHEST] = A_BOLD; + attr.nocolor[ATTR_HIGH] = A_REVERSE; + attr.nocolor[ATTR_MIDDLE] = A_REVERSE; + attr.nocolor[ATTR_LOW] = A_UNDERLINE; + attr.nocolor[ATTR_LOWEST] = A_BOLD; + attr.nocolor[ATTR_TRUE] = A_BOLD; + attr.nocolor[ATTR_FALSE] = A_DIM; } /* Apply window attribute */ void custom_apply_attr(WINDOW * win, int attr_num) { - if (colorize) - wattron(win, attr.color[attr_num]); - else - wattron(win, attr.nocolor[attr_num]); + if (colorize) + wattron(win, attr.color[attr_num]); + else + wattron(win, attr.nocolor[attr_num]); } /* Remove window attribute */ void custom_remove_attr(WINDOW * win, int attr_num) { - if (colorize) - wattroff(win, attr.color[attr_num]); - else - wattroff(win, attr.nocolor[attr_num]); + if (colorize) + wattroff(win, attr.color[attr_num]); + else + wattroff(win, attr.nocolor[attr_num]); } /* Draws the configuration bar */ void custom_config_bar(void) { - const int SMLSPC = 2; - const int SPC = 15; - - custom_apply_attr(win[STA].p, ATTR_HIGHEST); - mvwaddstr(win[STA].p, 0, 2, "Q"); - mvwaddstr(win[STA].p, 1, 2, "G"); - mvwaddstr(win[STA].p, 0, 2 + SPC, "L"); - mvwaddstr(win[STA].p, 1, 2 + SPC, "S"); - mvwaddstr(win[STA].p, 0, 2 + 2 * SPC, "C"); - mvwaddstr(win[STA].p, 1, 2 + 2 * SPC, "N"); - mvwaddstr(win[STA].p, 0, 2 + 3 * SPC, "K"); - custom_remove_attr(win[STA].p, ATTR_HIGHEST); - - mvwaddstr(win[STA].p, 0, 2 + SMLSPC, _("Exit")); - mvwaddstr(win[STA].p, 1, 2 + SMLSPC, _("General")); - mvwaddstr(win[STA].p, 0, 2 + SPC + SMLSPC, _("Layout")); - mvwaddstr(win[STA].p, 1, 2 + SPC + SMLSPC, _("Sidebar")); - mvwaddstr(win[STA].p, 0, 2 + 2 * SPC + SMLSPC, _("Color")); - mvwaddstr(win[STA].p, 1, 2 + 2 * SPC + SMLSPC, _("Notify")); - mvwaddstr(win[STA].p, 0, 2 + 3 * SPC + SMLSPC, _("Keys")); - - wnoutrefresh(win[STA].p); - wmove(win[STA].p, 0, 0); - wins_doupdate(); + const int SMLSPC = 2; + const int SPC = 15; + + custom_apply_attr(win[STA].p, ATTR_HIGHEST); + mvwaddstr(win[STA].p, 0, 2, "Q"); + mvwaddstr(win[STA].p, 1, 2, "G"); + mvwaddstr(win[STA].p, 0, 2 + SPC, "L"); + mvwaddstr(win[STA].p, 1, 2 + SPC, "S"); + mvwaddstr(win[STA].p, 0, 2 + 2 * SPC, "C"); + mvwaddstr(win[STA].p, 1, 2 + 2 * SPC, "N"); + mvwaddstr(win[STA].p, 0, 2 + 3 * SPC, "K"); + custom_remove_attr(win[STA].p, ATTR_HIGHEST); + + mvwaddstr(win[STA].p, 0, 2 + SMLSPC, _("Exit")); + mvwaddstr(win[STA].p, 1, 2 + SMLSPC, _("General")); + mvwaddstr(win[STA].p, 0, 2 + SPC + SMLSPC, _("Layout")); + mvwaddstr(win[STA].p, 1, 2 + SPC + SMLSPC, _("Sidebar")); + mvwaddstr(win[STA].p, 0, 2 + 2 * SPC + SMLSPC, _("Color")); + mvwaddstr(win[STA].p, 1, 2 + 2 * SPC + SMLSPC, _("Notify")); + mvwaddstr(win[STA].p, 0, 2 + 3 * SPC + SMLSPC, _("Keys")); + + wnoutrefresh(win[STA].p); + wmove(win[STA].p, 0, 0); + wins_doupdate(); } static void layout_selection_bar(void) { - struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; - struct binding select = { _("Select"), KEY_GENERIC_SELECT }; - struct binding up = { _("Up"), KEY_MOVE_UP }; - struct binding down = { _("Down"), KEY_MOVE_DOWN }; - struct binding left = { _("Left"), KEY_MOVE_LEFT }; - struct binding right = { _("Right"), KEY_MOVE_RIGHT }; - struct binding help = { _("Help"), KEY_GENERIC_HELP }; - - struct binding *bindings[] = { - &quit, &select, &up, &down, &left, &right, &help - }; - int bindings_size = sizeof(bindings) / sizeof(bindings[0]); - - keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, - bindings_size, NULL); + struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; + struct binding select = { _("Select"), KEY_GENERIC_SELECT }; + struct binding up = { _("Up"), KEY_MOVE_UP }; + struct binding down = { _("Down"), KEY_MOVE_DOWN }; + struct binding left = { _("Left"), KEY_MOVE_LEFT }; + struct binding right = { _("Right"), KEY_MOVE_RIGHT }; + struct binding help = { _("Help"), KEY_GENERIC_HELP }; + + struct binding *bindings[] = { + &quit, &select, &up, &down, &left, &right, &help + }; + int bindings_size = sizeof(bindings) / sizeof(bindings[0]); + + keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, + bindings_size, NULL); } #define NBLAYOUTS 8 #define LAYOUTSPERCOL 2 /* Used to display available layouts in layout configuration menu. */ -static void display_layout_config(struct window *lwin, int mark, int cursor) +static void display_layout_config(struct window *lwin, int mark, + int cursor) { #define CURSOR (32 | A_REVERSE) #define MARK 88 #define LAYOUTH 5 #define LAYOUTW 9 - const char *box = "[ ]"; - const int BOXSIZ = strlen(box); - const int NBCOLS = NBLAYOUTS / LAYOUTSPERCOL; - const int COLSIZ = LAYOUTW + BOXSIZ + 1; - const int XSPC = (lwin->w - NBCOLS * COLSIZ) / (NBCOLS + 1); - const int XOFST = (lwin->w - NBCOLS * (XSPC + COLSIZ)) / 2; - const int YSPC = - (lwin->h - 8 - LAYOUTSPERCOL * LAYOUTH) / (LAYOUTSPERCOL + 1); - const int YOFST = (lwin->h - LAYOUTSPERCOL * (YSPC + LAYOUTH)) / 2; - enum { YPOS, XPOS, NBPOS }; - int pos[NBLAYOUTS][NBPOS]; - const char *layouts[LAYOUTH][NBLAYOUTS] = { - {"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", - "+---+---+", "+---+---+", "+---+---+"}, - {"| | c |", "| | t |", "| c | |", "| t | |", "| | c |", - "| | a |", "| c | |", "| a | |"}, - {"| a +---+", "| a +---+", "+---+ a |", "|---+ a |", "| t +---+", - "| t +---+", "+---+ t |", "+---+ t |"}, - {"| | t |", "| | c |", "| t | |", "| c | |", "| | a |", - "| | c |", "| a | |", "| c | |"}, - {"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", - "+---+---+", "+---+---+", "+---+---+"} - }; - int i; - - for (i = 0; i < NBLAYOUTS; i++) { - pos[i][YPOS] = YOFST + (i % LAYOUTSPERCOL) * (YSPC + LAYOUTH); - pos[i][XPOS] = XOFST + (i / LAYOUTSPERCOL) * (XSPC + COLSIZ); - } - - for (i = 0; i < NBLAYOUTS; i++) { - int j; - - mvwaddstr(lwin->p, pos[i][YPOS] + 2, pos[i][XPOS], box); - if (i == mark) - custom_apply_attr(lwin->p, ATTR_HIGHEST); - for (j = 0; j < LAYOUTH; j++) { - mvwaddstr(lwin->p, pos[i][YPOS] + j, pos[i][XPOS] + BOXSIZ + 1, - layouts[j][i]); - } - if (i == mark) - custom_remove_attr(lwin->p, ATTR_HIGHEST); - } - mvwaddch(lwin->p, pos[mark][YPOS] + 2, pos[mark][XPOS] + 1, MARK); - mvwaddch(lwin->p, pos[cursor][YPOS] + 2, pos[cursor][XPOS] + 1, CURSOR); - - layout_selection_bar(); - wnoutrefresh(win[STA].p); - wnoutrefresh(lwin->p); - wins_doupdate(); - if (notify_bar()) - notify_update_bar(); + const char *box = "[ ]"; + const int BOXSIZ = strlen(box); + const int NBCOLS = NBLAYOUTS / LAYOUTSPERCOL; + const int COLSIZ = LAYOUTW + BOXSIZ + 1; + const int XSPC = (lwin->w - NBCOLS * COLSIZ) / (NBCOLS + 1); + const int XOFST = (lwin->w - NBCOLS * (XSPC + COLSIZ)) / 2; + const int YSPC = + (lwin->h - 8 - LAYOUTSPERCOL * LAYOUTH) / (LAYOUTSPERCOL + 1); + const int YOFST = (lwin->h - LAYOUTSPERCOL * (YSPC + LAYOUTH)) / 2; + enum { YPOS, XPOS, NBPOS }; + int pos[NBLAYOUTS][NBPOS]; + const char *layouts[LAYOUTH][NBLAYOUTS] = { + {"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+"}, + {"| | c |", "| | t |", "| c | |", "| t | |", "| | c |", "| | a |", "| c | |", "| a | |"}, + {"| a +---+", "| a +---+", "+---+ a |", "|---+ a |", "| t +---+", "| t +---+", "+---+ t |", "+---+ t |"}, + {"| | t |", "| | c |", "| t | |", "| c | |", "| | a |", "| | c |", "| a | |", "| c | |"}, + {"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+"} + }; + int i; + + for (i = 0; i < NBLAYOUTS; i++) { + pos[i][YPOS] = + YOFST + (i % LAYOUTSPERCOL) * (YSPC + LAYOUTH); + pos[i][XPOS] = + XOFST + (i / LAYOUTSPERCOL) * (XSPC + COLSIZ); + } + + for (i = 0; i < NBLAYOUTS; i++) { + int j; + + mvwaddstr(lwin->p, pos[i][YPOS] + 2, pos[i][XPOS], box); + if (i == mark) + custom_apply_attr(lwin->p, ATTR_HIGHEST); + for (j = 0; j < LAYOUTH; j++) { + mvwaddstr(lwin->p, pos[i][YPOS] + j, + pos[i][XPOS] + BOXSIZ + 1, + layouts[j][i]); + } + if (i == mark) + custom_remove_attr(lwin->p, ATTR_HIGHEST); + } + mvwaddch(lwin->p, pos[mark][YPOS] + 2, pos[mark][XPOS] + 1, MARK); + mvwaddch(lwin->p, pos[cursor][YPOS] + 2, pos[cursor][XPOS] + 1, + CURSOR); + + layout_selection_bar(); + wnoutrefresh(win[STA].p); + wnoutrefresh(lwin->p); + wins_doupdate(); + if (notify_bar()) + notify_update_bar(); } /* Choose the layout */ void custom_layout_config(void) { - struct scrollwin hwin; - struct window conf_win; - int ch, mark, cursor, need_reset; - const char *label = _("layout configuration"); - const char *help_text = - _("With this configuration menu, one can choose where panels will be\n" - "displayed inside calcurse screen. \n" - "It is possible to choose between eight different configurations.\n" - "\nIn the configuration representations, letters correspond to:\n\n" - " 'c' -> calendar panel\n\n" - " 'a' -> appointment panel\n\n" " 't' -> todo panel\n\n"); - - conf_win.p = NULL; - custom_confwin_init(&conf_win, label); - cursor = mark = wins_layout() - 1; - display_layout_config(&conf_win, mark, cursor); - clear(); - - while ((ch = keys_getch(win[KEY].p, NULL, NULL)) != KEY_GENERIC_QUIT) { - need_reset = 0; - switch (ch) { - case KEY_GENERIC_HELP: - help_wins_init(&hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col); - mvwprintw(hwin.pad.p, 1, 0, help_text, SBARMINWIDTH); - hwin.total_lines = 7; - wins_scrollwin_display(&hwin); - wgetch(hwin.win.p); - wins_scrollwin_delete(&hwin); - need_reset = 1; - break; - case KEY_GENERIC_SELECT: - mark = cursor; - break; - case KEY_MOVE_DOWN: - if (cursor % LAYOUTSPERCOL < LAYOUTSPERCOL - 1) - cursor++; - break; - case KEY_MOVE_UP: - if (cursor % LAYOUTSPERCOL > 0) - cursor--; - break; - case KEY_MOVE_LEFT: - if (cursor >= LAYOUTSPERCOL) - cursor -= LAYOUTSPERCOL; - break; - case KEY_MOVE_RIGHT: - if (cursor < NBLAYOUTS - LAYOUTSPERCOL) - cursor += LAYOUTSPERCOL; - break; - case KEY_GENERIC_CANCEL: - need_reset = 1; - break; - } - - if (resize) { - resize = 0; - endwin(); - wins_refresh(); - curs_set(0); - need_reset = 1; - } - - if (need_reset) - custom_confwin_init(&conf_win, label); - - display_layout_config(&conf_win, mark, cursor); - } - wins_set_layout(mark + 1); - delwin(conf_win.p); + struct scrollwin hwin; + struct window conf_win; + int ch, mark, cursor, need_reset; + const char *label = _("layout configuration"); + const char *help_text = + _("With this configuration menu, one can choose where panels will be\n" + "displayed inside calcurse screen. \n" + "It is possible to choose between eight different configurations.\n" + "\nIn the configuration representations, letters correspond to:\n\n" + " 'c' -> calendar panel\n\n" + " 'a' -> appointment panel\n\n" + " 't' -> todo panel\n\n"); + + conf_win.p = NULL; + custom_confwin_init(&conf_win, label); + cursor = mark = wins_layout() - 1; + display_layout_config(&conf_win, mark, cursor); + clear(); + + while ((ch = + keys_getch(win[KEY].p, NULL, NULL)) != KEY_GENERIC_QUIT) { + need_reset = 0; + switch (ch) { + case KEY_GENERIC_HELP: + help_wins_init(&hwin, 0, 0, + (notify_bar())? row - 3 : row - 2, + col); + mvwprintw(hwin.pad.p, 1, 0, help_text, + SBARMINWIDTH); + hwin.total_lines = 7; + wins_scrollwin_display(&hwin); + wgetch(hwin.win.p); + wins_scrollwin_delete(&hwin); + need_reset = 1; + break; + case KEY_GENERIC_SELECT: + mark = cursor; + break; + case KEY_MOVE_DOWN: + if (cursor % LAYOUTSPERCOL < LAYOUTSPERCOL - 1) + cursor++; + break; + case KEY_MOVE_UP: + if (cursor % LAYOUTSPERCOL > 0) + cursor--; + break; + case KEY_MOVE_LEFT: + if (cursor >= LAYOUTSPERCOL) + cursor -= LAYOUTSPERCOL; + break; + case KEY_MOVE_RIGHT: + if (cursor < NBLAYOUTS - LAYOUTSPERCOL) + cursor += LAYOUTSPERCOL; + break; + case KEY_GENERIC_CANCEL: + need_reset = 1; + break; + } + + if (resize) { + resize = 0; + endwin(); + wins_refresh(); + curs_set(0); + need_reset = 1; + } + + if (need_reset) + custom_confwin_init(&conf_win, label); + + display_layout_config(&conf_win, mark, cursor); + } + wins_set_layout(mark + 1); + delwin(conf_win.p); } #undef NBLAYOUTS @@ -285,71 +290,74 @@ void custom_layout_config(void) /* Sidebar configuration screen. */ void custom_sidebar_config(void) { - struct scrollwin hwin; - struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; - struct binding inc = { _("Width +"), KEY_MOVE_UP }; - struct binding dec = { _("Width -"), KEY_MOVE_DOWN }; - struct binding help = { _("Help"), KEY_GENERIC_HELP }; - struct binding *bindings[] = { - &inc, &dec, &help, &quit - }; - const char *help_text = - _ - ("This configuration screen is used to change the width of the side bar.\n" - "The side bar is the part of the screen which contains two panels:\n" - "the calendar and, depending on the chosen layout, either the todo list\n" - "or the appointment list.\n\n" - "The side bar width can be up to 50%% of the total screen width, but\n" - "can't be smaller than %d characters wide.\n\n"); - int ch, bindings_size; - - bindings_size = sizeof(bindings) / sizeof(bindings[0]); - - keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, - bindings_size, NULL); - wins_doupdate(); - - while ((ch = keys_getch(win[KEY].p, NULL, NULL)) != KEY_GENERIC_QUIT) { - switch (ch) { - case KEY_MOVE_UP: - wins_sbar_winc(); - break; - case KEY_MOVE_DOWN: - wins_sbar_wdec(); - break; - case KEY_GENERIC_HELP: - help_wins_init(&hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col); - mvwaddstr(hwin.pad.p, 1, 0, help_text); - hwin.total_lines = 6; - wins_scrollwin_display(&hwin); - wgetch(hwin.win.p); - wins_scrollwin_delete(&hwin); - break; - case KEY_RESIZE: - break; - default: - continue; - } - - if (resize) { - resize = 0; - wins_reset(); - } else { - wins_reinit_panels(); - wins_update_border(FLAG_ALL); - wins_update_panels(FLAG_ALL); - keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, - bindings_size, NULL); - wins_doupdate(); - } - } + struct scrollwin hwin; + struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; + struct binding inc = { _("Width +"), KEY_MOVE_UP }; + struct binding dec = { _("Width -"), KEY_MOVE_DOWN }; + struct binding help = { _("Help"), KEY_GENERIC_HELP }; + struct binding *bindings[] = { + &inc, &dec, &help, &quit + }; + const char *help_text = + _("This configuration screen is used to change the width of the side bar.\n" + "The side bar is the part of the screen which contains two panels:\n" + "the calendar and, depending on the chosen layout, either the todo list\n" + "or the appointment list.\n\n" + "The side bar width can be up to 50%% of the total screen width, but\n" + "can't be smaller than %d characters wide.\n\n"); + int ch, bindings_size; + + bindings_size = sizeof(bindings) / sizeof(bindings[0]); + + keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, + bindings_size, NULL); + wins_doupdate(); + + while ((ch = + keys_getch(win[KEY].p, NULL, NULL)) != KEY_GENERIC_QUIT) { + switch (ch) { + case KEY_MOVE_UP: + wins_sbar_winc(); + break; + case KEY_MOVE_DOWN: + wins_sbar_wdec(); + break; + case KEY_GENERIC_HELP: + help_wins_init(&hwin, 0, 0, + (notify_bar())? row - 3 : row - 2, + col); + mvwaddstr(hwin.pad.p, 1, 0, help_text); + hwin.total_lines = 6; + wins_scrollwin_display(&hwin); + wgetch(hwin.win.p); + wins_scrollwin_delete(&hwin); + break; + case KEY_RESIZE: + break; + default: + continue; + } + + if (resize) { + resize = 0; + wins_reset(); + } else { + wins_reinit_panels(); + wins_update_border(FLAG_ALL); + wins_update_panels(FLAG_ALL); + keys_display_bindings_bar(win[STA].p, bindings, + bindings_size, 0, + bindings_size, NULL); + wins_doupdate(); + } + } } static void set_confwin_attr(struct window *cwin) { - cwin->h = (notify_bar())? row - 3 : row - 2; - cwin->w = col; - cwin->x = cwin->y = 0; + cwin->h = (notify_bar())? row - 3 : row - 2; + cwin->w = col; + cwin->x = cwin->y = 0; } /* @@ -358,43 +366,45 @@ static void set_confwin_attr(struct window *cwin) */ void custom_confwin_init(struct window *confwin, const char *label) { - if (confwin->p) { - erase_window_part(confwin->p, confwin->x, confwin->y, - confwin->x + confwin->w, confwin->y + confwin->h); - delwin(confwin->p); - } - - wins_get_config(); - set_confwin_attr(confwin); - confwin->p = newwin(confwin->h, col, 0, 0); - box(confwin->p, 0, 0); - wins_show(confwin->p, label); - delwin(win[STA].p); - win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - keypad(win[STA].p, TRUE); - if (notify_bar()) { - notify_reinit_bar(); - notify_update_bar(); - } + if (confwin->p) { + erase_window_part(confwin->p, confwin->x, confwin->y, + confwin->x + confwin->w, + confwin->y + confwin->h); + delwin(confwin->p); + } + + wins_get_config(); + set_confwin_attr(confwin); + confwin->p = newwin(confwin->h, col, 0, 0); + box(confwin->p, 0, 0); + wins_show(confwin->p, label); + delwin(win[STA].p); + win[STA].p = + newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); + keypad(win[STA].p, TRUE); + if (notify_bar()) { + notify_reinit_bar(); + notify_update_bar(); + } } static void color_selection_bar(void) { - struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; - struct binding select = { _("Select"), KEY_GENERIC_SELECT }; - struct binding nocolor = { _("No color"), KEY_GENERIC_CANCEL }; - struct binding up = { _("Up"), KEY_MOVE_UP }; - struct binding down = { _("Down"), KEY_MOVE_DOWN }; - struct binding left = { _("Left"), KEY_MOVE_LEFT }; - struct binding right = { _("Right"), KEY_MOVE_RIGHT }; - - struct binding *bindings[] = { - &quit, &nocolor, &up, &down, &left, &right, &select - }; - int bindings_size = sizeof(bindings) / sizeof(bindings[0]); - - keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, - bindings_size, NULL); + struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; + struct binding select = { _("Select"), KEY_GENERIC_SELECT }; + struct binding nocolor = { _("No color"), KEY_GENERIC_CANCEL }; + struct binding up = { _("Up"), KEY_MOVE_UP }; + struct binding down = { _("Down"), KEY_MOVE_DOWN }; + struct binding left = { _("Left"), KEY_MOVE_LEFT }; + struct binding right = { _("Right"), KEY_MOVE_RIGHT }; + + struct binding *bindings[] = { + &quit, &nocolor, &up, &down, &left, &right, &select + }; + int bindings_size = sizeof(bindings) / sizeof(bindings[0]); + + keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, + bindings_size, NULL); } /* @@ -403,7 +413,7 @@ static void color_selection_bar(void) */ static void display_color_config(struct window *cwin, int *mark_fore, int *mark_back, - int cursor, int theme_changed) + int cursor, int theme_changed) { #define SIZE (2 * (NBUSERCOLORS + 1)) #define DEFAULTCOLOR 255 @@ -411,676 +421,719 @@ display_color_config(struct window *cwin, int *mark_fore, int *mark_back, #define CURSOR (32 | A_REVERSE) #define MARK 88 - const char *fore_txt = _("Foreground"); - const char *back_txt = _("Background"); - const char *default_txt = _("(terminal's default)"); - const char *bar = " "; - const char *box = "[ ]"; - const unsigned Y = 3; - const unsigned XOFST = 5; - const unsigned YSPC = (cwin->h - 8) / (NBUSERCOLORS + 1); - const unsigned BARSIZ = strlen(bar); - const unsigned BOXSIZ = strlen(box); - const unsigned XSPC = (cwin->w - 2 * BARSIZ - 2 * BOXSIZ - 6) / 3; - const unsigned XFORE = XSPC; - const unsigned XBACK = 2 * XSPC + BOXSIZ + XOFST + BARSIZ; - enum { YPOS, XPOS, NBPOS }; - unsigned i; - int pos[SIZE][NBPOS]; - short colr_fore, colr_back; - int colr[SIZE] = { - COLR_RED, COLR_GREEN, COLR_YELLOW, COLR_BLUE, - COLR_MAGENTA, COLR_CYAN, COLR_DEFAULT, - COLR_RED, COLR_GREEN, COLR_YELLOW, COLR_BLUE, - COLR_MAGENTA, COLR_CYAN, COLR_DEFAULT - }; - - for (i = 0; i < NBUSERCOLORS + 1; i++) { - pos[i][YPOS] = Y + YSPC * (i + 1); - pos[NBUSERCOLORS + i + 1][YPOS] = Y + YSPC * (i + 1); - pos[i][XPOS] = XFORE; - pos[NBUSERCOLORS + i + 1][XPOS] = XBACK; - } - - if (colorize) { - if (theme_changed) { - pair_content(colr[*mark_fore], &colr_fore, 0L); - if (colr_fore == 255) - colr_fore = -1; - pair_content(colr[*mark_back], &colr_back, 0L); - if (colr_back == 255) - colr_back = -1; - init_pair(COLR_CUSTOM, colr_fore, colr_back); - } else { - /* Retrieve the actual color theme. */ - pair_content(COLR_CUSTOM, &colr_fore, &colr_back); - - if ((colr_fore == DEFAULTCOLOR) || (colr_fore == DEFAULTCOLOR_EXT)) { - *mark_fore = NBUSERCOLORS; - } else { - for (i = 0; i < NBUSERCOLORS + 1; i++) - if (colr_fore == colr[i]) - *mark_fore = i; - } - - if ((colr_back == DEFAULTCOLOR) || (colr_back == DEFAULTCOLOR_EXT)) { - *mark_back = SIZE - 1; - } else { - for (i = 0; i < NBUSERCOLORS + 1; i++) - if (colr_back == colr[NBUSERCOLORS + 1 + i]) - *mark_back = NBUSERCOLORS + 1 + i; - } - } - } - - /* color boxes */ - for (i = 0; i < SIZE - 1; i++) { - mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS], box); - wattron(cwin->p, COLOR_PAIR(colr[i]) | A_REVERSE); - mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS] + XOFST, bar); - wattroff(cwin->p, COLOR_PAIR(colr[i]) | A_REVERSE); - } - - /* Terminal's default color */ - i = SIZE - 1; - mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS], box); - wattron(cwin->p, COLOR_PAIR(colr[i])); - mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS] + XOFST, bar); - wattroff(cwin->p, COLOR_PAIR(colr[i])); - mvwaddstr(cwin->p, pos[NBUSERCOLORS][YPOS] + 1, - pos[NBUSERCOLORS][XPOS] + XOFST, default_txt); - mvwaddstr(cwin->p, pos[SIZE - 1][YPOS] + 1, - pos[SIZE - 1][XPOS] + XOFST, default_txt); - - custom_apply_attr(cwin->p, ATTR_HIGHEST); - mvwaddstr(cwin->p, Y, XFORE + XOFST, fore_txt); - mvwaddstr(cwin->p, Y, XBACK + XOFST, back_txt); - custom_remove_attr(cwin->p, ATTR_HIGHEST); - - if (colorize) { - mvwaddch(cwin->p, pos[*mark_fore][YPOS], pos[*mark_fore][XPOS] + 1, MARK); - mvwaddch(cwin->p, pos[*mark_back][YPOS], pos[*mark_back][XPOS] + 1, MARK); - } - - mvwaddch(cwin->p, pos[cursor][YPOS], pos[cursor][XPOS] + 1, CURSOR); - color_selection_bar(); - wnoutrefresh(win[STA].p); - wnoutrefresh(cwin->p); - wins_doupdate(); - if (notify_bar()) - notify_update_bar(); + const char *fore_txt = _("Foreground"); + const char *back_txt = _("Background"); + const char *default_txt = _("(terminal's default)"); + const char *bar = " "; + const char *box = "[ ]"; + const unsigned Y = 3; + const unsigned XOFST = 5; + const unsigned YSPC = (cwin->h - 8) / (NBUSERCOLORS + 1); + const unsigned BARSIZ = strlen(bar); + const unsigned BOXSIZ = strlen(box); + const unsigned XSPC = (cwin->w - 2 * BARSIZ - 2 * BOXSIZ - 6) / 3; + const unsigned XFORE = XSPC; + const unsigned XBACK = 2 * XSPC + BOXSIZ + XOFST + BARSIZ; + enum { YPOS, XPOS, NBPOS }; + unsigned i; + int pos[SIZE][NBPOS]; + short colr_fore, colr_back; + int colr[SIZE] = { + COLR_RED, COLR_GREEN, COLR_YELLOW, COLR_BLUE, + COLR_MAGENTA, COLR_CYAN, COLR_DEFAULT, + COLR_RED, COLR_GREEN, COLR_YELLOW, COLR_BLUE, + COLR_MAGENTA, COLR_CYAN, COLR_DEFAULT + }; + + for (i = 0; i < NBUSERCOLORS + 1; i++) { + pos[i][YPOS] = Y + YSPC * (i + 1); + pos[NBUSERCOLORS + i + 1][YPOS] = Y + YSPC * (i + 1); + pos[i][XPOS] = XFORE; + pos[NBUSERCOLORS + i + 1][XPOS] = XBACK; + } + + if (colorize) { + if (theme_changed) { + pair_content(colr[*mark_fore], &colr_fore, 0L); + if (colr_fore == 255) + colr_fore = -1; + pair_content(colr[*mark_back], &colr_back, 0L); + if (colr_back == 255) + colr_back = -1; + init_pair(COLR_CUSTOM, colr_fore, colr_back); + } else { + /* Retrieve the actual color theme. */ + pair_content(COLR_CUSTOM, &colr_fore, &colr_back); + + if ((colr_fore == DEFAULTCOLOR) + || (colr_fore == DEFAULTCOLOR_EXT)) { + *mark_fore = NBUSERCOLORS; + } else { + for (i = 0; i < NBUSERCOLORS + 1; i++) + if (colr_fore == colr[i]) + *mark_fore = i; + } + + if ((colr_back == DEFAULTCOLOR) + || (colr_back == DEFAULTCOLOR_EXT)) { + *mark_back = SIZE - 1; + } else { + for (i = 0; i < NBUSERCOLORS + 1; i++) + if (colr_back == + colr[NBUSERCOLORS + 1 + i]) + *mark_back = + NBUSERCOLORS + 1 + i; + } + } + } + + /* color boxes */ + for (i = 0; i < SIZE - 1; i++) { + mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS], box); + wattron(cwin->p, COLOR_PAIR(colr[i]) | A_REVERSE); + mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS] + XOFST, + bar); + wattroff(cwin->p, COLOR_PAIR(colr[i]) | A_REVERSE); + } + + /* Terminal's default color */ + i = SIZE - 1; + mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS], box); + wattron(cwin->p, COLOR_PAIR(colr[i])); + mvwaddstr(cwin->p, pos[i][YPOS], pos[i][XPOS] + XOFST, bar); + wattroff(cwin->p, COLOR_PAIR(colr[i])); + mvwaddstr(cwin->p, pos[NBUSERCOLORS][YPOS] + 1, + pos[NBUSERCOLORS][XPOS] + XOFST, default_txt); + mvwaddstr(cwin->p, pos[SIZE - 1][YPOS] + 1, + pos[SIZE - 1][XPOS] + XOFST, default_txt); + + custom_apply_attr(cwin->p, ATTR_HIGHEST); + mvwaddstr(cwin->p, Y, XFORE + XOFST, fore_txt); + mvwaddstr(cwin->p, Y, XBACK + XOFST, back_txt); + custom_remove_attr(cwin->p, ATTR_HIGHEST); + + if (colorize) { + mvwaddch(cwin->p, pos[*mark_fore][YPOS], + pos[*mark_fore][XPOS] + 1, MARK); + mvwaddch(cwin->p, pos[*mark_back][YPOS], + pos[*mark_back][XPOS] + 1, MARK); + } + + mvwaddch(cwin->p, pos[cursor][YPOS], pos[cursor][XPOS] + 1, + CURSOR); + color_selection_bar(); + wnoutrefresh(win[STA].p); + wnoutrefresh(cwin->p); + wins_doupdate(); + if (notify_bar()) + notify_update_bar(); } /* Color theme configuration. */ void custom_color_config(void) { - struct window conf_win; - int ch, cursor, need_reset, theme_changed; - int mark_fore, mark_back; - const char *label = _("color theme"); - - conf_win.p = 0; - custom_confwin_init(&conf_win, label); - mark_fore = NBUSERCOLORS; - mark_back = SIZE - 1; - cursor = 0; - theme_changed = 0; - display_color_config(&conf_win, &mark_fore, &mark_back, cursor, - theme_changed); - clear(); - - while ((ch = keys_getch(win[KEY].p, NULL, NULL)) != KEY_GENERIC_QUIT) { - need_reset = 0; - theme_changed = 0; - - switch (ch) { - case KEY_GENERIC_SELECT: - colorize = 1; - need_reset = 1; - theme_changed = 1; - if (cursor > NBUSERCOLORS) - mark_back = cursor; - else - mark_fore = cursor; - break; - - case KEY_MOVE_DOWN: - if (cursor < SIZE - 1) - ++cursor; - break; - - case KEY_MOVE_UP: - if (cursor > 0) - --cursor; - break; - - case KEY_MOVE_LEFT: - if (cursor > NBUSERCOLORS) - cursor -= (NBUSERCOLORS + 1); - break; - - case KEY_MOVE_RIGHT: - if (cursor <= NBUSERCOLORS) - cursor += (NBUSERCOLORS + 1); - break; - - case KEY_GENERIC_CANCEL: - colorize = 0; - need_reset = 1; - break; - } - - if (resize) { - resize = 0; - endwin(); - wins_refresh(); - curs_set(0); - need_reset = 1; - } - - if (need_reset) - custom_confwin_init(&conf_win, label); - - display_color_config(&conf_win, &mark_fore, &mark_back, cursor, - theme_changed); - } - delwin(conf_win.p); + struct window conf_win; + int ch, cursor, need_reset, theme_changed; + int mark_fore, mark_back; + const char *label = _("color theme"); + + conf_win.p = 0; + custom_confwin_init(&conf_win, label); + mark_fore = NBUSERCOLORS; + mark_back = SIZE - 1; + cursor = 0; + theme_changed = 0; + display_color_config(&conf_win, &mark_fore, &mark_back, cursor, + theme_changed); + clear(); + + while ((ch = + keys_getch(win[KEY].p, NULL, NULL)) != KEY_GENERIC_QUIT) { + need_reset = 0; + theme_changed = 0; + + switch (ch) { + case KEY_GENERIC_SELECT: + colorize = 1; + need_reset = 1; + theme_changed = 1; + if (cursor > NBUSERCOLORS) + mark_back = cursor; + else + mark_fore = cursor; + break; + + case KEY_MOVE_DOWN: + if (cursor < SIZE - 1) + ++cursor; + break; + + case KEY_MOVE_UP: + if (cursor > 0) + --cursor; + break; + + case KEY_MOVE_LEFT: + if (cursor > NBUSERCOLORS) + cursor -= (NBUSERCOLORS + 1); + break; + + case KEY_MOVE_RIGHT: + if (cursor <= NBUSERCOLORS) + cursor += (NBUSERCOLORS + 1); + break; + + case KEY_GENERIC_CANCEL: + colorize = 0; + need_reset = 1; + break; + } + + if (resize) { + resize = 0; + endwin(); + wins_refresh(); + curs_set(0); + need_reset = 1; + } + + if (need_reset) + custom_confwin_init(&conf_win, label); + + display_color_config(&conf_win, &mark_fore, &mark_back, + cursor, theme_changed); + } + delwin(conf_win.p); } /* Prints the general options. */ static int print_general_options(WINDOW * win) { - enum { - AUTO_SAVE, - AUTO_GC, - PERIODIC_SAVE, - CONFIRM_QUIT, - CONFIRM_DELETE, - SYSTEM_DIAGS, - PROGRESS_BAR, - FIRST_DAY_OF_WEEK, - OUTPUT_DATE_FMT, - INPUT_DATE_FMT, - NB_OPTIONS - }; - const int XPOS = 1; - const int YOFF = 3; - int y; - char *opt[NB_OPTIONS] = { - "general.autosave = ", - "general.autogc = ", - "general.periodicsave = ", - "general.confirmquit = ", - "general.confirmdelete = ", - "general.systemdialogs = ", - "general.progressbar = ", - "general.firstdayofweek = ", - "format.outputdate = ", - "format.inputdate = " - }; - - y = 0; - mvwprintw(win, y, XPOS, "[1] %s ", opt[AUTO_SAVE]); - print_bool_option_incolor(win, conf.auto_save, y, - XPOS + 4 + strlen(opt[AUTO_SAVE])); - mvwaddstr(win, y + 1, XPOS, - _("(if set to YES, automatic save is done when quitting)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[2] %s ", opt[AUTO_GC]); - print_bool_option_incolor(win, conf.auto_gc, y, - XPOS + 4 + strlen(opt[AUTO_GC])); - mvwaddstr(win, y + 1, XPOS, _("(run the garbage collector when quitting)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[3] %s ", opt[PERIODIC_SAVE]); - custom_apply_attr(win, ATTR_HIGHEST); - mvwprintw(win, y, XPOS + 4 + strlen(opt[PERIODIC_SAVE]), "%d", - conf.periodic_save); - custom_remove_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y + 1, XPOS, - _("(if not null, automatically save data every 'periodic_save' " - "minutes)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[4] %s ", opt[CONFIRM_QUIT]); - print_bool_option_incolor(win, conf.confirm_quit, y, - XPOS + 4 + strlen(opt[CONFIRM_QUIT])); - mvwaddstr(win, y + 1, XPOS, - _("(if set to YES, confirmation is required before quitting)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[5] %s ", opt[CONFIRM_DELETE]); - print_bool_option_incolor(win, conf.confirm_delete, y, - XPOS + 4 + strlen(opt[CONFIRM_DELETE])); - mvwaddstr(win, y + 1, XPOS, - _("(if set to YES, confirmation is required " - "before deleting an event)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[6] %s ", opt[SYSTEM_DIAGS]); - print_bool_option_incolor(win, conf.system_dialogs, y, - XPOS + 4 + strlen(opt[SYSTEM_DIAGS])); - mvwaddstr(win, y + 1, XPOS, - _("(if set to YES, messages about loaded " - "and saved data will be displayed)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[7] %s ", opt[PROGRESS_BAR]); - print_bool_option_incolor(win, conf.progress_bar, y, - XPOS + 4 + strlen(opt[PROGRESS_BAR])); - mvwaddstr(win, y + 1, XPOS, - _("(if set to YES, progress bar will be displayed " - "when saving data)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[8] %s ", opt[FIRST_DAY_OF_WEEK]); - custom_apply_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y, XPOS + 4 + strlen(opt[FIRST_DAY_OF_WEEK]), - ui_calendar_week_begins_on_monday()? _("Monday") : _("Sunday")); - custom_remove_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y + 1, XPOS, - _("(specifies the first day of week in the calendar view)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[9] %s ", opt[OUTPUT_DATE_FMT]); - custom_apply_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y, XPOS + 4 + strlen(opt[OUTPUT_DATE_FMT]), - conf.output_datefmt); - custom_remove_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y + 1, XPOS, - _("(Format of the date to be displayed in non-interactive mode)")); - y += YOFF; - mvwprintw(win, y, XPOS, "[0] %s ", opt[INPUT_DATE_FMT]); - custom_apply_attr(win, ATTR_HIGHEST); - mvwprintw(win, y, XPOS + 4 + strlen(opt[INPUT_DATE_FMT]), "%d", - conf.input_datefmt); - custom_remove_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y + 1, XPOS, _("(Format to be used when entering a date: ")); - mvwprintw(win, y + 2, XPOS, " (1) %s, (2) %s, (3) %s, (4) %s)", - datefmt_str[0], datefmt_str[1], datefmt_str[2], datefmt_str[3]); - - return y + YOFF; + enum { + AUTO_SAVE, + AUTO_GC, + PERIODIC_SAVE, + CONFIRM_QUIT, + CONFIRM_DELETE, + SYSTEM_DIAGS, + PROGRESS_BAR, + FIRST_DAY_OF_WEEK, + OUTPUT_DATE_FMT, + INPUT_DATE_FMT, + NB_OPTIONS + }; + const int XPOS = 1; + const int YOFF = 3; + int y; + char *opt[NB_OPTIONS] = { + "general.autosave = ", + "general.autogc = ", + "general.periodicsave = ", + "general.confirmquit = ", + "general.confirmdelete = ", + "general.systemdialogs = ", + "general.progressbar = ", + "general.firstdayofweek = ", + "format.outputdate = ", + "format.inputdate = " + }; + + y = 0; + mvwprintw(win, y, XPOS, "[1] %s ", opt[AUTO_SAVE]); + print_bool_option_incolor(win, conf.auto_save, y, + XPOS + 4 + strlen(opt[AUTO_SAVE])); + mvwaddstr(win, y + 1, XPOS, + _("(if set to YES, automatic save is done when quitting)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[2] %s ", opt[AUTO_GC]); + print_bool_option_incolor(win, conf.auto_gc, y, + XPOS + 4 + strlen(opt[AUTO_GC])); + mvwaddstr(win, y + 1, XPOS, + _("(run the garbage collector when quitting)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[3] %s ", opt[PERIODIC_SAVE]); + custom_apply_attr(win, ATTR_HIGHEST); + mvwprintw(win, y, XPOS + 4 + strlen(opt[PERIODIC_SAVE]), "%d", + conf.periodic_save); + custom_remove_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y + 1, XPOS, + _("(if not null, automatically save data every 'periodic_save' " + "minutes)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[4] %s ", opt[CONFIRM_QUIT]); + print_bool_option_incolor(win, conf.confirm_quit, y, + XPOS + 4 + strlen(opt[CONFIRM_QUIT])); + mvwaddstr(win, y + 1, XPOS, + _("(if set to YES, confirmation is required before quitting)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[5] %s ", opt[CONFIRM_DELETE]); + print_bool_option_incolor(win, conf.confirm_delete, y, + XPOS + 4 + strlen(opt[CONFIRM_DELETE])); + mvwaddstr(win, y + 1, XPOS, + _("(if set to YES, confirmation is required " + "before deleting an event)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[6] %s ", opt[SYSTEM_DIAGS]); + print_bool_option_incolor(win, conf.system_dialogs, y, + XPOS + 4 + strlen(opt[SYSTEM_DIAGS])); + mvwaddstr(win, y + 1, XPOS, + _("(if set to YES, messages about loaded " + "and saved data will be displayed)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[7] %s ", opt[PROGRESS_BAR]); + print_bool_option_incolor(win, conf.progress_bar, y, + XPOS + 4 + strlen(opt[PROGRESS_BAR])); + mvwaddstr(win, y + 1, XPOS, + _("(if set to YES, progress bar will be displayed " + "when saving data)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[8] %s ", opt[FIRST_DAY_OF_WEEK]); + custom_apply_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y, XPOS + 4 + strlen(opt[FIRST_DAY_OF_WEEK]), + ui_calendar_week_begins_on_monday()? _("Monday") : + _("Sunday")); + custom_remove_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y + 1, XPOS, + _("(specifies the first day of week in the calendar view)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[9] %s ", opt[OUTPUT_DATE_FMT]); + custom_apply_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y, XPOS + 4 + strlen(opt[OUTPUT_DATE_FMT]), + conf.output_datefmt); + custom_remove_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y + 1, XPOS, + _("(Format of the date to be displayed in non-interactive mode)")); + y += YOFF; + mvwprintw(win, y, XPOS, "[0] %s ", opt[INPUT_DATE_FMT]); + custom_apply_attr(win, ATTR_HIGHEST); + mvwprintw(win, y, XPOS + 4 + strlen(opt[INPUT_DATE_FMT]), "%d", + conf.input_datefmt); + custom_remove_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y + 1, XPOS, + _("(Format to be used when entering a date: ")); + mvwprintw(win, y + 2, XPOS, " (1) %s, (2) %s, (3) %s, (4) %s)", + datefmt_str[0], datefmt_str[1], datefmt_str[2], + datefmt_str[3]); + + return y + YOFF; } void custom_set_swsiz(struct scrollwin *sw) { - sw->win.x = 0; - sw->win.y = 0; - sw->win.h = (notify_bar())? row - 3 : row - 2; - sw->win.w = col; - - sw->pad.x = 1; - sw->pad.y = 3; - sw->pad.h = BUFSIZ; - sw->pad.w = col - 2 * sw->pad.x - 1; + sw->win.x = 0; + sw->win.y = 0; + sw->win.h = (notify_bar())? row - 3 : row - 2; + sw->win.w = col; + + sw->pad.x = 1; + sw->pad.y = 3; + sw->pad.h = BUFSIZ; + sw->pad.w = col - 2 * sw->pad.x - 1; } /* General configuration. */ void custom_general_config(void) { - struct scrollwin cwin; - const char *number_str = _("Enter an option number to change its value"); - const char *keys = _("(Press '^P' or '^N' to move up or down, 'Q' to quit)"); - const char *output_datefmt_str = - _("Enter the date format (see 'man 3 strftime' for possible formats) "); - const char *input_datefmt_prefix = _("Enter the date format: "); - const char *periodic_save_str = - _("Enter the delay, in minutes, between automatic saves (0 to disable) "); - int ch; - int val; - char *buf; - - clear(); - custom_set_swsiz(&cwin); - cwin.label = _("general options"); - wins_scrollwin_init(&cwin); - wins_show(cwin.win.p, cwin.label); - status_mesg(number_str, keys); - cwin.total_lines = print_general_options(cwin.pad.p); - wins_scrollwin_display(&cwin); - - buf = mem_malloc(BUFSIZ); - while ((ch = wgetch(win[KEY].p)) != 'q') { - buf[0] = '\0'; - - switch (ch) { - case CTRL('N'): - wins_scrollwin_down(&cwin, 1); - break; - case CTRL('P'): - wins_scrollwin_up(&cwin, 1); - break; - case '1': - conf.auto_save = !conf.auto_save; - break; - case '2': - conf.auto_gc = !conf.auto_gc; - break; - case '3': - status_mesg(periodic_save_str, ""); - if (updatestring(win[STA].p, &buf, 0, 1) == 0) { - val = atoi(buf); - if (val >= 0) - conf.periodic_save = val; - if (conf.periodic_save > 0) - io_start_psave_thread(); - else if (conf.periodic_save == 0) - io_stop_psave_thread(); - } - status_mesg(number_str, keys); - break; - case '4': - conf.confirm_quit = !conf.confirm_quit; - break; - case '5': - conf.confirm_delete = !conf.confirm_delete; - break; - case '6': - conf.system_dialogs = !conf.system_dialogs; - break; - case '7': - conf.progress_bar = !conf.progress_bar; - break; - case '8': - ui_calendar_change_first_day_of_week(); - break; - case '9': - status_mesg(output_datefmt_str, ""); - strncpy(buf, conf.output_datefmt, strlen(conf.output_datefmt) + 1); - if (updatestring(win[STA].p, &buf, 0, 1) == 0) { - strncpy(conf.output_datefmt, buf, strlen(buf) + 1); - } - status_mesg(number_str, keys); - break; - case '0': - val = status_ask_simplechoice(input_datefmt_prefix, - datefmt_str, DATE_FORMATS); - if (val != -1) - conf.input_datefmt = val; - break; - } - - if (resize) { - resize = 0; - wins_reset(); - wins_scrollwin_delete(&cwin); - custom_set_swsiz(&cwin); - wins_scrollwin_init(&cwin); - wins_show(cwin.win.p, cwin.label); - cwin.first_visible_line = 0; - delwin(win[STA].p); - win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - keypad(win[STA].p, TRUE); - if (notify_bar()) { - notify_reinit_bar(); - notify_update_bar(); - } - } - - status_mesg(number_str, keys); - cwin.total_lines = print_general_options(cwin.pad.p); - wins_scrollwin_display(&cwin); - } - mem_free(buf); - wins_scrollwin_delete(&cwin); + struct scrollwin cwin; + const char *number_str = + _("Enter an option number to change its value"); + const char *keys = + _("(Press '^P' or '^N' to move up or down, 'Q' to quit)"); + const char *output_datefmt_str = + _("Enter the date format (see 'man 3 strftime' for possible formats) "); + const char *input_datefmt_prefix = _("Enter the date format: "); + const char *periodic_save_str = + _("Enter the delay, in minutes, between automatic saves (0 to disable) "); + int ch; + int val; + char *buf; + + clear(); + custom_set_swsiz(&cwin); + cwin.label = _("general options"); + wins_scrollwin_init(&cwin); + wins_show(cwin.win.p, cwin.label); + status_mesg(number_str, keys); + cwin.total_lines = print_general_options(cwin.pad.p); + wins_scrollwin_display(&cwin); + + buf = mem_malloc(BUFSIZ); + while ((ch = wgetch(win[KEY].p)) != 'q') { + buf[0] = '\0'; + + switch (ch) { + case CTRL('N'): + wins_scrollwin_down(&cwin, 1); + break; + case CTRL('P'): + wins_scrollwin_up(&cwin, 1); + break; + case '1': + conf.auto_save = !conf.auto_save; + break; + case '2': + conf.auto_gc = !conf.auto_gc; + break; + case '3': + status_mesg(periodic_save_str, ""); + if (updatestring(win[STA].p, &buf, 0, 1) == 0) { + val = atoi(buf); + if (val >= 0) + conf.periodic_save = val; + if (conf.periodic_save > 0) + io_start_psave_thread(); + else if (conf.periodic_save == 0) + io_stop_psave_thread(); + } + status_mesg(number_str, keys); + break; + case '4': + conf.confirm_quit = !conf.confirm_quit; + break; + case '5': + conf.confirm_delete = !conf.confirm_delete; + break; + case '6': + conf.system_dialogs = !conf.system_dialogs; + break; + case '7': + conf.progress_bar = !conf.progress_bar; + break; + case '8': + ui_calendar_change_first_day_of_week(); + break; + case '9': + status_mesg(output_datefmt_str, ""); + strncpy(buf, conf.output_datefmt, + strlen(conf.output_datefmt) + 1); + if (updatestring(win[STA].p, &buf, 0, 1) == 0) { + strncpy(conf.output_datefmt, buf, + strlen(buf) + 1); + } + status_mesg(number_str, keys); + break; + case '0': + val = status_ask_simplechoice(input_datefmt_prefix, + datefmt_str, + DATE_FORMATS); + if (val != -1) + conf.input_datefmt = val; + break; + } + + if (resize) { + resize = 0; + wins_reset(); + wins_scrollwin_delete(&cwin); + custom_set_swsiz(&cwin); + wins_scrollwin_init(&cwin); + wins_show(cwin.win.p, cwin.label); + cwin.first_visible_line = 0; + delwin(win[STA].p); + win[STA].p = + newwin(win[STA].h, win[STA].w, win[STA].y, + win[STA].x); + keypad(win[STA].p, TRUE); + if (notify_bar()) { + notify_reinit_bar(); + notify_update_bar(); + } + } + + status_mesg(number_str, keys); + cwin.total_lines = print_general_options(cwin.pad.p); + wins_scrollwin_display(&cwin); + } + mem_free(buf); + wins_scrollwin_delete(&cwin); } static void print_key_incolor(WINDOW * win, const char *option, int pos_y, int pos_x) { - const int color = ATTR_HIGHEST; + const int color = ATTR_HIGHEST; - RETURN_IF(!option, _("Undefined option!")); - custom_apply_attr(win, color); - mvwprintw(win, pos_y, pos_x, "%s ", option); - custom_remove_attr(win, color); + RETURN_IF(!option, _("Undefined option!")); + custom_apply_attr(win, color); + mvwprintw(win, pos_y, pos_x, "%s ", option); + custom_remove_attr(win, color); } static int -print_keys_bindings(WINDOW * win, int selected_row, int selected_elm, int yoff) +print_keys_bindings(WINDOW * win, int selected_row, int selected_elm, + int yoff) { - const int XPOS = 1; - const int EQUALPOS = 23; - const int KEYPOS = 25; - int noelm, action, y; - - noelm = y = 0; - for (action = 0; action < NBKEYS; action++) { - char actionstr[BUFSIZ]; - int nbkeys; - - nbkeys = keys_action_count_keys(action); - snprintf(actionstr, BUFSIZ, "%s", keys_get_label(action)); - if (action == selected_row) - custom_apply_attr(win, ATTR_HIGHEST); - mvwprintw(win, y, XPOS, "%s ", actionstr); - mvwaddstr(win, y, EQUALPOS, "="); - if (nbkeys == 0) - mvwaddstr(win, y, KEYPOS, _("undefined")); - if (action == selected_row) - custom_remove_attr(win, ATTR_HIGHEST); - if (nbkeys > 0) { - if (action == selected_row) { - const char *key; - int pos; - - pos = KEYPOS; - while ((key = keys_action_nkey(action, noelm)) != NULL) { - if (noelm == selected_elm) - print_key_incolor(win, key, y, pos); - else - mvwprintw(win, y, pos, "%s ", key); - noelm++; - pos += strlen(key) + 1; - } - } else { - mvwaddstr(win, y, KEYPOS, keys_action_allkeys(action)); - } - } - y += yoff; - } - - return noelm; + const int XPOS = 1; + const int EQUALPOS = 23; + const int KEYPOS = 25; + int noelm, action, y; + + noelm = y = 0; + for (action = 0; action < NBKEYS; action++) { + char actionstr[BUFSIZ]; + int nbkeys; + + nbkeys = keys_action_count_keys(action); + snprintf(actionstr, BUFSIZ, "%s", keys_get_label(action)); + if (action == selected_row) + custom_apply_attr(win, ATTR_HIGHEST); + mvwprintw(win, y, XPOS, "%s ", actionstr); + mvwaddstr(win, y, EQUALPOS, "="); + if (nbkeys == 0) + mvwaddstr(win, y, KEYPOS, _("undefined")); + if (action == selected_row) + custom_remove_attr(win, ATTR_HIGHEST); + if (nbkeys > 0) { + if (action == selected_row) { + const char *key; + int pos; + + pos = KEYPOS; + while ((key = + keys_action_nkey(action, + noelm)) != NULL) { + if (noelm == selected_elm) + print_key_incolor(win, key, + y, pos); + else + mvwprintw(win, y, pos, + "%s ", key); + noelm++; + pos += strlen(key) + 1; + } + } else { + mvwaddstr(win, y, KEYPOS, + keys_action_allkeys(action)); + } + } + y += yoff; + } + + return noelm; } static void custom_keys_config_bar(void) { - struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; - struct binding info = { _("Key info"), KEY_GENERIC_HELP }; - struct binding add = { _("Add key"), KEY_ADD_ITEM }; - struct binding del = { _("Del key"), KEY_DEL_ITEM }; - struct binding up = { _("Up"), KEY_MOVE_UP }; - struct binding down = { _("Down"), KEY_MOVE_DOWN }; - struct binding left = { _("Prev Key"), KEY_MOVE_LEFT }; - struct binding right = { _("Next Key"), KEY_MOVE_RIGHT }; - - struct binding *bindings[] = { - &quit, &info, &add, &del, &up, &down, &left, &right - }; - int bindings_size = sizeof(bindings) / sizeof(bindings[0]); - - keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, - bindings_size, NULL); + struct binding quit = { _("Exit"), KEY_GENERIC_QUIT }; + struct binding info = { _("Key info"), KEY_GENERIC_HELP }; + struct binding add = { _("Add key"), KEY_ADD_ITEM }; + struct binding del = { _("Del key"), KEY_DEL_ITEM }; + struct binding up = { _("Up"), KEY_MOVE_UP }; + struct binding down = { _("Down"), KEY_MOVE_DOWN }; + struct binding left = { _("Prev Key"), KEY_MOVE_LEFT }; + struct binding right = { _("Next Key"), KEY_MOVE_RIGHT }; + + struct binding *bindings[] = { + &quit, &info, &add, &del, &up, &down, &left, &right + }; + int bindings_size = sizeof(bindings) / sizeof(bindings[0]); + + keys_display_bindings_bar(win[STA].p, bindings, bindings_size, 0, + bindings_size, NULL); } void custom_keys_config(void) { - struct scrollwin kwin; - int selrow, selelm, firstrow, lastrow, nbrowelm, nbdisplayed; - int keyval, used, not_recognized; - const char *keystr; - WINDOW *grabwin; - const int LINESPERKEY = 2; - const int LABELLINES = 3; - - clear(); - custom_set_swsiz(&kwin); - nbdisplayed = (kwin.win.h - LABELLINES) / LINESPERKEY; - kwin.label = _("keys configuration"); - wins_scrollwin_init(&kwin); - wins_show(kwin.win.p, kwin.label); - custom_keys_config_bar(); - selrow = selelm = 0; - nbrowelm = print_keys_bindings(kwin.pad.p, selrow, selelm, LINESPERKEY); - kwin.total_lines = NBKEYS * LINESPERKEY; - wins_scrollwin_display(&kwin); - firstrow = 0; - lastrow = firstrow + nbdisplayed - 1; - for (;;) { - int ch; - - ch = keys_getch(win[KEY].p, NULL, NULL); - switch (ch) { - case KEY_MOVE_UP: - if (selrow > 0) { - selrow--; - selelm = 0; - if (selrow == firstrow) { - firstrow--; - lastrow--; - wins_scrollwin_up(&kwin, LINESPERKEY); - } - } - break; - case KEY_MOVE_DOWN: - if (selrow < NBKEYS - 1) { - selrow++; - selelm = 0; - if (selrow == lastrow) { - firstrow++; - lastrow++; - wins_scrollwin_down(&kwin, LINESPERKEY); - } - } - break; - case KEY_MOVE_LEFT: - if (selelm > 0) - selelm--; - break; - case KEY_MOVE_RIGHT: - if (selelm < nbrowelm - 1) - selelm++; - break; - case KEY_GENERIC_HELP: - keys_popup_info(selrow); - break; - case KEY_ADD_ITEM: + struct scrollwin kwin; + int selrow, selelm, firstrow, lastrow, nbrowelm, nbdisplayed; + int keyval, used, not_recognized; + const char *keystr; + WINDOW *grabwin; + const int LINESPERKEY = 2; + const int LABELLINES = 3; + + clear(); + custom_set_swsiz(&kwin); + nbdisplayed = (kwin.win.h - LABELLINES) / LINESPERKEY; + kwin.label = _("keys configuration"); + wins_scrollwin_init(&kwin); + wins_show(kwin.win.p, kwin.label); + custom_keys_config_bar(); + selrow = selelm = 0; + nbrowelm = + print_keys_bindings(kwin.pad.p, selrow, selelm, LINESPERKEY); + kwin.total_lines = NBKEYS * LINESPERKEY; + wins_scrollwin_display(&kwin); + firstrow = 0; + lastrow = firstrow + nbdisplayed - 1; + for (;;) { + int ch; + + ch = keys_getch(win[KEY].p, NULL, NULL); + switch (ch) { + case KEY_MOVE_UP: + if (selrow > 0) { + selrow--; + selelm = 0; + if (selrow == firstrow) { + firstrow--; + lastrow--; + wins_scrollwin_up(&kwin, + LINESPERKEY); + } + } + break; + case KEY_MOVE_DOWN: + if (selrow < NBKEYS - 1) { + selrow++; + selelm = 0; + if (selrow == lastrow) { + firstrow++; + lastrow++; + wins_scrollwin_down(&kwin, + LINESPERKEY); + } + } + break; + case KEY_MOVE_LEFT: + if (selelm > 0) + selelm--; + break; + case KEY_MOVE_RIGHT: + if (selelm < nbrowelm - 1) + selelm++; + break; + case KEY_GENERIC_HELP: + keys_popup_info(selrow); + break; + case KEY_ADD_ITEM: #define WINROW 10 #define WINCOL 50 - do { - used = 0; - grabwin = popup(WINROW, WINCOL, (row - WINROW) / 2, - (col - WINCOL) / 2, - _("Press the key you want to assign to:"), - keys_get_label(selrow), 0); - keyval = wgetch(grabwin); - - /* First check if this key would be recognized by calcurse. */ - if (keys_str2int(keys_int2str(keyval)) == -1) { - not_recognized = 1; - WARN_MSG(_("This key is not yet recognized by calcurse, " - "please choose another one.")); - werase(kwin.pad.p); - nbrowelm = print_keys_bindings(kwin.pad.p, selrow, selelm, - LINESPERKEY); - wins_scrollwin_display(&kwin); - continue; - } else { - not_recognized = 0; - } - - /* Is the binding used by this action already? If so, just end the reassignment */ - if (selrow == keys_get_action(keyval)) { - delwin(grabwin); - break; - } - - used = keys_assign_binding(keyval, selrow); - if (used) { - enum key action; - - action = keys_get_action(keyval); - WARN_MSG(_("This key is already in use for %s, " - "please choose another one."), keys_get_label(action)); - werase(kwin.pad.p); - nbrowelm = print_keys_bindings(kwin.pad.p, selrow, selelm, - LINESPERKEY); - wins_scrollwin_display(&kwin); - } - delwin(grabwin); - } - while (used || not_recognized); - nbrowelm++; - if (selelm < nbrowelm - 1) - selelm++; + do { + used = 0; + grabwin = + popup(WINROW, WINCOL, + (row - WINROW) / 2, + (col - WINCOL) / 2, + _("Press the key you want to assign to:"), + keys_get_label(selrow), 0); + keyval = wgetch(grabwin); + + /* First check if this key would be recognized by calcurse. */ + if (keys_str2int(keys_int2str(keyval)) == + -1) { + not_recognized = 1; + WARN_MSG(_("This key is not yet recognized by calcurse, " + "please choose another one.")); + werase(kwin.pad.p); + nbrowelm = + print_keys_bindings(kwin.pad.p, + selrow, + selelm, + LINESPERKEY); + wins_scrollwin_display(&kwin); + continue; + } else { + not_recognized = 0; + } + + /* Is the binding used by this action already? If so, just end the reassignment */ + if (selrow == keys_get_action(keyval)) { + delwin(grabwin); + break; + } + + used = keys_assign_binding(keyval, selrow); + if (used) { + enum key action; + + action = keys_get_action(keyval); + WARN_MSG(_("This key is already in use for %s, " + "please choose another one."), + keys_get_label(action)); + werase(kwin.pad.p); + nbrowelm = + print_keys_bindings(kwin.pad.p, + selrow, + selelm, + LINESPERKEY); + wins_scrollwin_display(&kwin); + } + delwin(grabwin); + } + while (used || not_recognized); + nbrowelm++; + if (selelm < nbrowelm - 1) + selelm++; #undef WINROW #undef WINCOL - break; - case KEY_DEL_ITEM: - keystr = keys_action_nkey(selrow, selelm); - keyval = keys_str2int(keystr); - keys_remove_binding(keyval, selrow); - nbrowelm--; - if (selelm > 0 && selelm <= nbrowelm) - selelm--; - break; - case KEY_GENERIC_QUIT: - if (keys_check_missing_bindings() != 0) { - WARN_MSG(_("Some actions do not have any associated " "key bindings!")); - } - wins_scrollwin_delete(&kwin); - return; - } - custom_keys_config_bar(); - werase(kwin.pad.p); - nbrowelm = print_keys_bindings(kwin.pad.p, selrow, selelm, LINESPERKEY); - wins_scrollwin_display(&kwin); - } + break; + case KEY_DEL_ITEM: + keystr = keys_action_nkey(selrow, selelm); + keyval = keys_str2int(keystr); + keys_remove_binding(keyval, selrow); + nbrowelm--; + if (selelm > 0 && selelm <= nbrowelm) + selelm--; + break; + case KEY_GENERIC_QUIT: + if (keys_check_missing_bindings() != 0) { + WARN_MSG(_("Some actions do not have any associated " + "key bindings!")); + } + wins_scrollwin_delete(&kwin); + return; + } + custom_keys_config_bar(); + werase(kwin.pad.p); + nbrowelm = + print_keys_bindings(kwin.pad.p, selrow, selelm, + LINESPERKEY); + wins_scrollwin_display(&kwin); + } } void custom_config_main(void) { - const char *no_color_support = - _("Sorry, colors are not supported by your terminal\n" - "(Press [ENTER] to continue)"); - int ch; - int old_layout; - - custom_config_bar(); - while ((ch = wgetch(win[KEY].p)) != 'q') { - switch (ch) { - case 'C': - case 'c': - if (has_colors()) { - custom_color_config(); - } else { - colorize = 0; - wins_erase_status_bar(); - mvwaddstr(win[STA].p, 0, 0, no_color_support); - wgetch(win[KEY].p); - } - break; - case 'L': - case 'l': - old_layout = wins_layout(); - custom_layout_config(); - if (wins_layout() != old_layout) - wins_reset(); - break; - case 'G': - case 'g': - custom_general_config(); - 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; - default: - continue; - } - wins_update(FLAG_ALL); - wins_erase_status_bar(); - custom_config_bar(); - } + const char *no_color_support = + _("Sorry, colors are not supported by your terminal\n" + "(Press [ENTER] to continue)"); + int ch; + int old_layout; + + custom_config_bar(); + while ((ch = wgetch(win[KEY].p)) != 'q') { + switch (ch) { + case 'C': + case 'c': + if (has_colors()) { + custom_color_config(); + } else { + colorize = 0; + wins_erase_status_bar(); + mvwaddstr(win[STA].p, 0, 0, + no_color_support); + wgetch(win[KEY].p); + } + break; + case 'L': + case 'l': + old_layout = wins_layout(); + custom_layout_config(); + if (wins_layout() != old_layout) + wins_reset(); + break; + case 'G': + case 'g': + custom_general_config(); + 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; + default: + continue; + } + wins_update(FLAG_ALL); + wins_erase_status_bar(); + custom_config_bar(); + } } @@ -46,12 +46,12 @@ static llist_t day_items; static void day_free(struct day_item *day) { - mem_free(day); + mem_free(day); } static void day_init_list(void) { - LLIST_INIT(&day_items); + LLIST_INIT(&day_items); } /* @@ -61,148 +61,149 @@ static void day_init_list(void) */ void day_free_list(void) { - LLIST_FREE_INNER(&day_items, day_free); - LLIST_FREE(&day_items); + LLIST_FREE_INNER(&day_items, day_free); + LLIST_FREE(&day_items); } static int day_cmp_start(struct day_item *a, struct day_item *b) { - if (a->type <= EVNT) { - if (b->type <= EVNT) - return 0; - else - return -1; - } else if (b->type <= EVNT) { - return 1; - } else { - return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1); - } + if (a->type <= EVNT) { + if (b->type <= EVNT) + return 0; + else + return -1; + } else if (b->type <= EVNT) { + return 1; + } else { + return a->start < b->start ? -1 : (a->start == + b->start ? 0 : 1); + } } /* Add an item to the current day list. */ static void day_add_item(int type, long start, union aptev_ptr item) { - struct day_item *day = mem_malloc(sizeof(struct day_item)); - day->type = type; - day->start = start; - day->item = item; + struct day_item *day = mem_malloc(sizeof(struct day_item)); + day->type = type; + day->start = start; + day->item = item; - LLIST_ADD_SORTED(&day_items, day, day_cmp_start); + LLIST_ADD_SORTED(&day_items, day, day_cmp_start); } /* Get the message of an item. */ char *day_item_get_mesg(struct day_item *day) { - switch (day->type) { - case APPT: - return day->item.apt->mesg; - case EVNT: - return day->item.ev->mesg; - case RECUR_APPT: - return day->item.rapt->mesg; - case RECUR_EVNT: - return day->item.rev->mesg; - default: - return NULL; - } + switch (day->type) { + case APPT: + return day->item.apt->mesg; + case EVNT: + return day->item.ev->mesg; + case RECUR_APPT: + return day->item.rapt->mesg; + case RECUR_EVNT: + return day->item.rev->mesg; + default: + return NULL; + } } /* Get the note attached to an item. */ char *day_item_get_note(struct day_item *day) { - switch (day->type) { - case APPT: - return day->item.apt->note; - case EVNT: - return day->item.ev->note; - case RECUR_APPT: - return day->item.rapt->note; - case RECUR_EVNT: - return day->item.rev->note; - default: - return NULL; - } + switch (day->type) { + case APPT: + return day->item.apt->note; + case EVNT: + return day->item.ev->note; + case RECUR_APPT: + return day->item.rapt->note; + case RECUR_EVNT: + return day->item.rev->note; + default: + return NULL; + } } /* Get the note attached to an item. */ void day_item_erase_note(struct day_item *day) { - switch (day->type) { - case APPT: - erase_note(&day->item.apt->note); - break; - case EVNT: - erase_note(&day->item.ev->note); - break; - case RECUR_APPT: - erase_note(&day->item.rapt->note); - break; - case RECUR_EVNT: - erase_note(&day->item.rev->note); - break; - } + switch (day->type) { + case APPT: + erase_note(&day->item.apt->note); + break; + case EVNT: + erase_note(&day->item.ev->note); + break; + case RECUR_APPT: + erase_note(&day->item.rapt->note); + break; + case RECUR_EVNT: + erase_note(&day->item.rev->note); + break; + } } /* Get the duration of an item. */ long day_item_get_duration(struct day_item *day) { - switch (day->type) { - case APPT: - return day->item.apt->dur; - case RECUR_APPT: - return day->item.rapt->dur; - default: - return 0; - } + switch (day->type) { + case APPT: + return day->item.apt->dur; + case RECUR_APPT: + return day->item.rapt->dur; + default: + return 0; + } } /* Get the notification state of an item. */ int day_item_get_state(struct day_item *day) { - switch (day->type) { - case APPT: - return day->item.apt->state; - case RECUR_APPT: - return day->item.rapt->state; - default: - return APOINT_NULL; - } + switch (day->type) { + case APPT: + return day->item.apt->state; + case RECUR_APPT: + return day->item.rapt->state; + default: + return APOINT_NULL; + } } /* Add an exception to an item. */ void day_item_add_exc(struct day_item *day, long date) { - switch (day->type) { - case RECUR_EVNT: - recur_event_add_exc(day->item.rev, date); - case RECUR_APPT: - recur_apoint_add_exc(day->item.rapt, date); - } + switch (day->type) { + case RECUR_EVNT: + recur_event_add_exc(day->item.rev, date); + case RECUR_APPT: + recur_apoint_add_exc(day->item.rapt, date); + } } /* Clone the actual item. */ void day_item_fork(struct day_item *day_in, struct day_item *day_out) { - day_out->type = day_in->type; - day_out->start = day_in->start; - - switch (day_in->type) { - case APPT: - day_out->item.apt = apoint_dup(day_in->item.apt); - break; - case EVNT: - day_out->item.ev = event_dup(day_in->item.ev); - break; - case RECUR_APPT: - day_out->item.rapt = recur_apoint_dup(day_in->item.rapt); - break; - case RECUR_EVNT: - day_out->item.rev = recur_event_dup(day_in->item.rev); - break; - default: - EXIT(_("unknown item type")); - /* NOTREACHED */ - } + day_out->type = day_in->type; + day_out->start = day_in->start; + + switch (day_in->type) { + case APPT: + day_out->item.apt = apoint_dup(day_in->item.apt); + break; + case EVNT: + day_out->item.ev = event_dup(day_in->item.ev); + break; + case RECUR_APPT: + day_out->item.rapt = recur_apoint_dup(day_in->item.rapt); + break; + case RECUR_EVNT: + day_out->item.rev = recur_event_dup(day_in->item.rev); + break; + default: + EXIT(_("unknown item type")); + /* NOTREACHED */ + } } /* @@ -212,24 +213,24 @@ void day_item_fork(struct day_item *day_in, struct day_item *day_out) * dedicated to the selected day. * Returns the number of events for the selected day. */ -static int day_store_events(long date, regex_t *regex) +static int day_store_events(long date, regex_t * regex) { - llist_item_t *i; - union aptev_ptr p; - int e_nb = 0; + llist_item_t *i; + union aptev_ptr p; + int e_nb = 0; - LLIST_FIND_FOREACH_CONT(&eventlist, &date, event_inday, i) { - struct event *ev = LLIST_TS_GET_DATA(i); + LLIST_FIND_FOREACH_CONT(&eventlist, &date, event_inday, i) { + struct event *ev = LLIST_TS_GET_DATA(i); - if (regex && regexec(regex, ev->mesg, 0, 0, 0) != 0) - continue; + if (regex && regexec(regex, ev->mesg, 0, 0, 0) != 0) + continue; - p.ev = ev; - day_add_item(EVNT, ev->day, p); - e_nb++; - } + p.ev = ev; + day_add_item(EVNT, ev->day, p); + e_nb++; + } - return e_nb; + return e_nb; } /* @@ -239,24 +240,24 @@ static int day_store_events(long date, regex_t *regex) * dedicated to the selected day. * Returns the number of recurrent events for the selected day. */ -static int day_store_recur_events(long date, regex_t *regex) +static int day_store_recur_events(long date, regex_t * regex) { - llist_item_t *i; - union aptev_ptr p; - int e_nb = 0; + llist_item_t *i; + union aptev_ptr p; + int e_nb = 0; - LLIST_FIND_FOREACH(&recur_elist, &date, recur_event_inday, i) { - struct recur_event *rev = LLIST_TS_GET_DATA(i); + LLIST_FIND_FOREACH(&recur_elist, &date, recur_event_inday, i) { + struct recur_event *rev = LLIST_TS_GET_DATA(i); - if (regex && regexec(regex, rev->mesg, 0, 0, 0) != 0) - continue; + if (regex && regexec(regex, rev->mesg, 0, 0, 0) != 0) + continue; - p.rev = rev; - day_add_item(RECUR_EVNT, rev->day, p); - e_nb++; - } + p.rev = rev; + day_add_item(RECUR_EVNT, rev->day, p); + e_nb++; + } - return e_nb; + return e_nb; } /* @@ -266,30 +267,30 @@ static int day_store_recur_events(long date, regex_t *regex) * structure dedicated to the selected day. * Returns the number of appointments for the selected day. */ -static int day_store_apoints(long date, regex_t *regex) +static int day_store_apoints(long date, regex_t * regex) { - llist_item_t *i; - union aptev_ptr p; - int a_nb = 0; + llist_item_t *i; + union aptev_ptr p; + int a_nb = 0; - LLIST_TS_LOCK(&alist_p); - LLIST_TS_FIND_FOREACH(&alist_p, &date, apoint_inday, i) { - struct apoint *apt = LLIST_TS_GET_DATA(i); + LLIST_TS_LOCK(&alist_p); + LLIST_TS_FIND_FOREACH(&alist_p, &date, apoint_inday, i) { + struct apoint *apt = LLIST_TS_GET_DATA(i); - if (regex && regexec(regex, apt->mesg, 0, 0, 0) != 0) - continue; + if (regex && regexec(regex, apt->mesg, 0, 0, 0) != 0) + continue; - p.apt = apt; + p.apt = apt; - if (apt->start >= date + DAYINSEC) - break; + if (apt->start >= date + DAYINSEC) + break; - day_add_item(APPT, apt->start, p); - a_nb++; - } - LLIST_TS_UNLOCK(&alist_p); + day_add_item(APPT, apt->start, p); + a_nb++; + } + LLIST_TS_UNLOCK(&alist_p); - return a_nb; + return a_nb; } /* @@ -299,30 +300,30 @@ static int day_store_apoints(long date, regex_t *regex) * structure dedicated to the selected day. * Returns the number of recurrent appointments for the selected day. */ -static int day_store_recur_apoints(long date, regex_t *regex) +static int day_store_recur_apoints(long date, regex_t * regex) { - llist_item_t *i; - union aptev_ptr p; - int a_nb = 0; + llist_item_t *i; + union aptev_ptr p; + int a_nb = 0; - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_FIND_FOREACH(&recur_alist_p, &date, recur_apoint_inday, i) { - struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_FIND_FOREACH(&recur_alist_p, &date, recur_apoint_inday, i) { + struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); - if (regex && regexec(regex, rapt->mesg, 0, 0, 0) != 0) - continue; + if (regex && regexec(regex, rapt->mesg, 0, 0, 0) != 0) + continue; - p.rapt = rapt; + p.rapt = rapt; - unsigned real_start; - if (recur_apoint_find_occurrence(rapt, date, &real_start)) { - day_add_item(RECUR_APPT, real_start, p); - a_nb++; - } - } - LLIST_TS_UNLOCK(&recur_alist_p); + unsigned real_start; + if (recur_apoint_find_occurrence(rapt, date, &real_start)) { + day_add_item(RECUR_APPT, real_start, p); + a_nb++; + } + } + LLIST_TS_UNLOCK(&recur_alist_p); - return a_nb; + return a_nb; } /* @@ -335,25 +336,25 @@ static int day_store_recur_apoints(long date, regex_t *regex) */ int day_store_items(long date, unsigned *pnb_events, unsigned *pnb_apoints, - regex_t *regex) + regex_t * regex) { - int nb_events, nb_recur_events; - int nb_apoints, nb_recur_apoints; + int nb_events, nb_recur_events; + int nb_apoints, nb_recur_apoints; - day_free_list(); - day_init_list(); + day_free_list(); + day_init_list(); - nb_recur_events = day_store_recur_events(date, regex); - nb_events = day_store_events(date, regex); - nb_recur_apoints = day_store_recur_apoints(date, regex); - nb_apoints = day_store_apoints(date, regex); + nb_recur_events = day_store_recur_events(date, regex); + nb_events = day_store_events(date, regex); + nb_recur_apoints = day_store_recur_apoints(date, regex); + nb_apoints = day_store_apoints(date, regex); - if (pnb_apoints) - *pnb_apoints = nb_apoints + nb_recur_apoints; - if (pnb_events) - *pnb_events = nb_events + nb_recur_events; + if (pnb_apoints) + *pnb_apoints = nb_apoints + nb_recur_apoints; + if (pnb_events) + *pnb_events = nb_events + nb_recur_events; - return nb_events + nb_recur_events + nb_apoints + nb_recur_apoints; + return nb_events + nb_recur_events + nb_apoints + nb_recur_apoints; } /* @@ -362,68 +363,69 @@ day_store_items(long date, unsigned *pnb_events, unsigned *pnb_apoints, * day. This is useful to speed up the appointment panel update. */ struct day_items_nb day_process_storage(struct date *slctd_date, - unsigned day_changed) + unsigned day_changed) { - long date; - struct date day; - struct day_items_nb inday; + long date; + struct date day; + struct day_items_nb inday; - if (slctd_date) - day = *slctd_date; - else - ui_calendar_store_current_date(&day); + if (slctd_date) + day = *slctd_date; + else + ui_calendar_store_current_date(&day); - date = date2sec(day, 0, 0); + date = date2sec(day, 0, 0); - /* Inits */ - if (apad.length != 0) - delwin(apad.ptrwin); + /* Inits */ + if (apad.length != 0) + delwin(apad.ptrwin); - /* Store the events and appointments (recursive and normal items). */ - day_store_items(date, &inday.nb_events, &inday.nb_apoints, NULL); - apad.length = (inday.nb_events + 1 + 3 * inday.nb_apoints); + /* Store the events and appointments (recursive and normal items). */ + day_store_items(date, &inday.nb_events, &inday.nb_apoints, NULL); + apad.length = (inday.nb_events + 1 + 3 * inday.nb_apoints); - /* Create the new pad with its new length. */ - if (day_changed) - apad.first_onscreen = 0; - apad.ptrwin = newpad(apad.length, apad.width); + /* Create the new pad with its new length. */ + if (day_changed) + apad.first_onscreen = 0; + apad.ptrwin = newpad(apad.length, apad.width); - return inday; + return inday; } /* * Print an item date in the appointment panel. */ static void -display_item_date(struct day_item *day, int incolor, long date, int y, int x) -{ - WINDOW *win; - char a_st[100], a_end[100]; - - /* FIXME: Redesign apoint_sec2str() and remove the need for a temporary - * appointment item here. */ - struct apoint apt_tmp; - apt_tmp.start = day->start; - apt_tmp.dur = day_item_get_duration(day); - - win = apad.ptrwin; - apoint_sec2str(&apt_tmp, date, a_st, a_end); - if (incolor == 0) - custom_apply_attr(win, ATTR_HIGHEST); - - if (day->type == RECUR_EVNT || day->type == RECUR_APPT) { - if (day_item_get_state(day) & APOINT_NOTIFY) - mvwprintw(win, y, x, " *!%s -> %s", a_st, a_end); - else - mvwprintw(win, y, x, " * %s -> %s", a_st, a_end); - } else if (day_item_get_state(day) & APOINT_NOTIFY) { - mvwprintw(win, y, x, " -!%s -> %s", a_st, a_end); - } else { - mvwprintw(win, y, x, " - %s -> %s", a_st, a_end); - } - - if (incolor == 0) - custom_remove_attr(win, ATTR_HIGHEST); +display_item_date(struct day_item *day, int incolor, long date, int y, + int x) +{ + WINDOW *win; + char a_st[100], a_end[100]; + + /* FIXME: Redesign apoint_sec2str() and remove the need for a temporary + * appointment item here. */ + struct apoint apt_tmp; + apt_tmp.start = day->start; + apt_tmp.dur = day_item_get_duration(day); + + win = apad.ptrwin; + apoint_sec2str(&apt_tmp, date, a_st, a_end); + if (incolor == 0) + custom_apply_attr(win, ATTR_HIGHEST); + + if (day->type == RECUR_EVNT || day->type == RECUR_APPT) { + if (day_item_get_state(day) & APOINT_NOTIFY) + mvwprintw(win, y, x, " *!%s -> %s", a_st, a_end); + else + mvwprintw(win, y, x, " * %s -> %s", a_st, a_end); + } else if (day_item_get_state(day) & APOINT_NOTIFY) { + mvwprintw(win, y, x, " -!%s -> %s", a_st, a_end); + } else { + mvwprintw(win, y, x, " - %s -> %s", a_st, a_end); + } + + if (incolor == 0) + custom_remove_attr(win, ATTR_HIGHEST); } /* @@ -432,37 +434,38 @@ display_item_date(struct day_item *day, int incolor, long date, int y, int x) static void display_item(struct day_item *day, int incolor, int width, int y, int x) { - WINDOW *win; - int ch_recur, ch_note; - char buf[width * UTF8_MAXLEN]; - int i; - - if (width <= 0) - return; - - char *mesg = day_item_get_mesg(day); - - win = apad.ptrwin; - ch_recur = (day->type == RECUR_EVNT || day->type == RECUR_APPT) ? '*' : ' '; - ch_note = day_item_get_note(day) ? '>' : ' '; - if (incolor == 0) - custom_apply_attr(win, ATTR_HIGHEST); - if (utf8_strwidth(mesg) < width) { - mvwprintw(win, y, x, " %c%c%s", ch_recur, ch_note, mesg); - } else { - for (i = 0; mesg[i] && width > 0; i++) { - if (!UTF8_ISCONT(mesg[i])) - width -= utf8_width(&mesg[i]); - buf[i] = mesg[i]; - } - if (i) - buf[i - 1] = 0; - else - buf[0] = 0; - mvwprintw(win, y, x, " %c%c%s...", ch_recur, ch_note, buf); - } - if (incolor == 0) - custom_remove_attr(win, ATTR_HIGHEST); + WINDOW *win; + int ch_recur, ch_note; + char buf[width * UTF8_MAXLEN]; + int i; + + if (width <= 0) + return; + + char *mesg = day_item_get_mesg(day); + + win = apad.ptrwin; + ch_recur = (day->type == RECUR_EVNT + || day->type == RECUR_APPT) ? '*' : ' '; + ch_note = day_item_get_note(day) ? '>' : ' '; + if (incolor == 0) + custom_apply_attr(win, ATTR_HIGHEST); + if (utf8_strwidth(mesg) < width) { + mvwprintw(win, y, x, " %c%c%s", ch_recur, ch_note, mesg); + } else { + for (i = 0; mesg[i] && width > 0; i++) { + if (!UTF8_ISCONT(mesg[i])) + width -= utf8_width(&mesg[i]); + buf[i] = mesg[i]; + } + if (i) + buf[i - 1] = 0; + else + buf[0] = 0; + mvwprintw(win, y, x, " %c%c%s...", ch_recur, ch_note, buf); + } + if (incolor == 0) + custom_remove_attr(win, ATTR_HIGHEST); } /* @@ -472,87 +475,94 @@ display_item(struct day_item *day, int incolor, int width, int y, int x) */ void day_write_pad(long date, int width, int length, int incolor) { - llist_item_t *i; - int line, item_number; - const int x_pos = 0; - unsigned draw_line = 0; - - line = item_number = 0; - - LLIST_FOREACH(&day_items, i) { - struct day_item *day = LLIST_TS_GET_DATA(i); - - /* First print the events for current day. */ - if (day->type < RECUR_APPT) { - item_number++; - display_item(day, item_number - incolor, width - 7, line, x_pos); - line++; - draw_line = 1; - } else { - /* Draw a line between events and appointments. */ - if (line > 0 && draw_line) { - wmove(apad.ptrwin, line, 0); - whline(apad.ptrwin, 0, width); - draw_line = 0; - } - /* Last print the appointments for current day. */ - item_number++; - display_item_date(day, item_number - incolor, date, line + 1, x_pos); - display_item(day, item_number - incolor, width - 7, line + 2, x_pos); - line += 3; - } - } + llist_item_t *i; + int line, item_number; + const int x_pos = 0; + unsigned draw_line = 0; + + line = item_number = 0; + + LLIST_FOREACH(&day_items, i) { + struct day_item *day = LLIST_TS_GET_DATA(i); + + /* First print the events for current day. */ + if (day->type < RECUR_APPT) { + item_number++; + display_item(day, item_number - incolor, width - 7, + line, x_pos); + line++; + draw_line = 1; + } else { + /* Draw a line between events and appointments. */ + if (line > 0 && draw_line) { + wmove(apad.ptrwin, line, 0); + whline(apad.ptrwin, 0, width); + draw_line = 0; + } + /* Last print the appointments for current day. */ + item_number++; + display_item_date(day, item_number - incolor, date, + line + 1, x_pos); + display_item(day, item_number - incolor, width - 7, + line + 2, x_pos); + line += 3; + } + } } /* Write the appointments and events for the selected day to stdout. */ void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt, - const char *fmt_ev, const char *fmt_rev) -{ - llist_item_t *i; - - LLIST_FOREACH(&day_items, i) { - struct day_item *day = LLIST_TS_GET_DATA(i); - - switch (day->type) { - case APPT: - print_apoint(fmt_apt, date, day->item.apt); - break; - case EVNT: - print_event(fmt_ev, date, day->item.ev); - break; - case RECUR_APPT: - print_recur_apoint(fmt_rapt, date, day->start, day->item.rapt); - break; - case RECUR_EVNT: - print_recur_event(fmt_rev, date, day->item.rev); - break; - default: - EXIT(_("unknown item type")); - /* NOTREACHED */ - } - } + const char *fmt_ev, const char *fmt_rev) +{ + llist_item_t *i; + + LLIST_FOREACH(&day_items, i) { + struct day_item *day = LLIST_TS_GET_DATA(i); + + switch (day->type) { + case APPT: + print_apoint(fmt_apt, date, day->item.apt); + break; + case EVNT: + print_event(fmt_ev, date, day->item.ev); + break; + case RECUR_APPT: + print_recur_apoint(fmt_rapt, date, day->start, + day->item.rapt); + break; + case RECUR_EVNT: + print_recur_event(fmt_rev, date, day->item.rev); + break; + default: + EXIT(_("unknown item type")); + /* NOTREACHED */ + } + } } /* Display an item inside a popup window. */ void day_popup_item(struct day_item *day) { - if (day->type == EVNT || day->type == RECUR_EVNT) { - item_in_popup(NULL, NULL, day_item_get_mesg(day), _("Event :")); - } else if (day->type == APPT || day->type == RECUR_APPT) { - char a_st[100], a_end[100]; + if (day->type == EVNT || day->type == RECUR_EVNT) { + item_in_popup(NULL, NULL, day_item_get_mesg(day), + _("Event :")); + } else if (day->type == APPT || day->type == RECUR_APPT) { + char a_st[100], a_end[100]; - /* FIXME: Redesign apoint_sec2str() and remove the need for a temporary - * appointment item here. */ - struct apoint apt_tmp; - apt_tmp.start = day->start; - apt_tmp.dur = day_item_get_duration(day); - apoint_sec2str(&apt_tmp, ui_calendar_get_slctd_day_sec(), a_st, a_end); + /* FIXME: Redesign apoint_sec2str() and remove the need for a temporary + * appointment item here. */ + struct apoint apt_tmp; + apt_tmp.start = day->start; + apt_tmp.dur = day_item_get_duration(day); + apoint_sec2str(&apt_tmp, ui_calendar_get_slctd_day_sec(), + a_st, a_end); - item_in_popup(a_st, a_end, day_item_get_mesg(day), _("Appointment :")); - } else { - EXIT(_("unknown item type")); - /* NOTREACHED */ - } + item_in_popup(a_st, a_end, day_item_get_mesg(day), + _("Appointment :")); + } else { + EXIT(_("unknown item type")); + /* NOTREACHED */ + } } /* @@ -561,45 +571,47 @@ void day_popup_item(struct day_item *day) */ int day_check_if_item(struct date day) { - const long date = date2sec(day, 0, 0); + const long date = date2sec(day, 0, 0); - if (LLIST_FIND_FIRST(&recur_elist, (long *)&date, recur_event_inday)) - return 1; + if (LLIST_FIND_FIRST + (&recur_elist, (long *)&date, recur_event_inday)) + return 1; - LLIST_TS_LOCK(&recur_alist_p); - if (LLIST_TS_FIND_FIRST(&recur_alist_p, (long *)&date, recur_apoint_inday)) { - LLIST_TS_UNLOCK(&recur_alist_p); - return 1; - } - LLIST_TS_UNLOCK(&recur_alist_p); + LLIST_TS_LOCK(&recur_alist_p); + if (LLIST_TS_FIND_FIRST + (&recur_alist_p, (long *)&date, recur_apoint_inday)) { + LLIST_TS_UNLOCK(&recur_alist_p); + return 1; + } + LLIST_TS_UNLOCK(&recur_alist_p); - if (LLIST_FIND_FIRST(&eventlist, (long *)&date, event_inday)) - return 1; + if (LLIST_FIND_FIRST(&eventlist, (long *)&date, event_inday)) + return 1; - LLIST_TS_LOCK(&alist_p); - if (LLIST_TS_FIND_FIRST(&alist_p, (long *)&date, apoint_inday)) { - LLIST_TS_UNLOCK(&alist_p); - return 1; - } - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_LOCK(&alist_p); + if (LLIST_TS_FIND_FIRST(&alist_p, (long *)&date, apoint_inday)) { + LLIST_TS_UNLOCK(&alist_p); + return 1; + } + LLIST_TS_UNLOCK(&alist_p); - return 0; + return 0; } static unsigned fill_slices(int *slices, int slicesno, int first, int last) { - int i; + int i; - if (first < 0 || last < first) - return 0; + if (first < 0 || last < first) + return 0; - if (last >= slicesno) - last = slicesno - 1; /* Appointment spanning more than one day. */ + if (last >= slicesno) + last = slicesno - 1; /* Appointment spanning more than one day. */ - for (i = first; i <= last; i++) - slices[i] = 1; + for (i = first; i <= last; i++) + slices[i] = 1; - return 1; + return 1; } /* @@ -609,153 +621,156 @@ static unsigned fill_slices(int *slices, int slicesno, int first, int last) */ unsigned day_chk_busy_slices(struct date day, int slicesno, int *slices) { - llist_item_t *i; - int slicelen; - const long date = date2sec(day, 0, 0); + llist_item_t *i; + int slicelen; + const long date = date2sec(day, 0, 0); - slicelen = DAYINSEC / slicesno; + slicelen = DAYINSEC / slicesno; #define SLICENUM(tsec) ((tsec) / slicelen % slicesno) - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_FIND_FOREACH(&recur_alist_p, (long *)&date, recur_apoint_inday, i) { - struct apoint *rapt = LLIST_TS_GET_DATA(i); - long start = get_item_time(rapt->start); - long end = get_item_time(rapt->start + rapt->dur); - - if (rapt->start < date) - start = 0; - if (rapt->start + rapt->dur >= date + DAYINSEC) - end = DAYINSEC - 1; - - if (!fill_slices(slices, slicesno, SLICENUM(start), SLICENUM(end))) { - LLIST_TS_UNLOCK(&recur_alist_p); - return 0; - } - } - LLIST_TS_UNLOCK(&recur_alist_p); - - LLIST_TS_LOCK(&alist_p); - LLIST_TS_FIND_FOREACH(&alist_p, (long *)&date, apoint_inday, i) { - struct apoint *apt = LLIST_TS_GET_DATA(i); - long start = get_item_time(apt->start); - long end = get_item_time(apt->start + apt->dur); - - if (apt->start >= date + DAYINSEC) - break; - if (apt->start < date) - start = 0; - if (apt->start + apt->dur >= date + DAYINSEC) - end = DAYINSEC - 1; - - if (!fill_slices(slices, slicesno, SLICENUM(start), SLICENUM(end))) { - LLIST_TS_UNLOCK(&alist_p); - return 0; - } - } - LLIST_TS_UNLOCK(&alist_p); + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_FIND_FOREACH(&recur_alist_p, (long *)&date, + recur_apoint_inday, i) { + struct apoint *rapt = LLIST_TS_GET_DATA(i); + long start = get_item_time(rapt->start); + long end = get_item_time(rapt->start + rapt->dur); + + if (rapt->start < date) + start = 0; + if (rapt->start + rapt->dur >= date + DAYINSEC) + end = DAYINSEC - 1; + + if (!fill_slices + (slices, slicesno, SLICENUM(start), SLICENUM(end))) { + LLIST_TS_UNLOCK(&recur_alist_p); + return 0; + } + } + LLIST_TS_UNLOCK(&recur_alist_p); + + LLIST_TS_LOCK(&alist_p); + LLIST_TS_FIND_FOREACH(&alist_p, (long *)&date, apoint_inday, i) { + struct apoint *apt = LLIST_TS_GET_DATA(i); + long start = get_item_time(apt->start); + long end = get_item_time(apt->start + apt->dur); + + if (apt->start >= date + DAYINSEC) + break; + if (apt->start < date) + start = 0; + if (apt->start + apt->dur >= date + DAYINSEC) + end = DAYINSEC - 1; + + if (!fill_slices + (slices, slicesno, SLICENUM(start), SLICENUM(end))) { + LLIST_TS_UNLOCK(&alist_p); + return 0; + } + } + LLIST_TS_UNLOCK(&alist_p); #undef SLICENUM - return 1; + return 1; } /* Cut an item so it can be pasted somewhere else later. */ struct day_item *day_cut_item(long date, int item_number) { - struct day_item *p = day_get_item(item_number); - - switch (p->type) { - case EVNT: - event_delete(p->item.ev); - break; - case RECUR_EVNT: - recur_event_erase(p->item.rev); - break; - case APPT: - apoint_delete(p->item.apt); - break; - case RECUR_APPT: - recur_apoint_erase(p->item.rapt); - break; - default: - EXIT(_("unknwon type")); - /* NOTREACHED */ - } - - return p; + struct day_item *p = day_get_item(item_number); + + switch (p->type) { + case EVNT: + event_delete(p->item.ev); + break; + case RECUR_EVNT: + recur_event_erase(p->item.rev); + break; + case APPT: + apoint_delete(p->item.apt); + break; + case RECUR_APPT: + recur_apoint_erase(p->item.rapt); + break; + default: + EXIT(_("unknwon type")); + /* NOTREACHED */ + } + + return p; } /* Paste a previously cut item. */ int day_paste_item(struct day_item *p, long date) { - switch (p->type) { - case 0: - return 0; - case EVNT: - event_paste_item(p->item.ev, date); - break; - case RECUR_EVNT: - recur_event_paste_item(p->item.rev, date); - break; - case APPT: - apoint_paste_item(p->item.apt, date); - break; - case RECUR_APPT: - recur_apoint_paste_item(p->item.rapt, date); - break; - default: - EXIT(_("unknwon type")); - /* NOTREACHED */ - } - - return p->type; + switch (p->type) { + case 0: + return 0; + case EVNT: + event_paste_item(p->item.ev, date); + break; + case RECUR_EVNT: + recur_event_paste_item(p->item.rev, date); + break; + case APPT: + apoint_paste_item(p->item.apt, date); + break; + case RECUR_APPT: + recur_apoint_paste_item(p->item.rapt, date); + break; + default: + EXIT(_("unknwon type")); + /* NOTREACHED */ + } + + return p->type; } /* Returns a structure containing the selected item. */ struct day_item *day_get_item(int item_number) { - return LLIST_GET_DATA(LLIST_NTH(&day_items, item_number - 1)); + return LLIST_GET_DATA(LLIST_NTH(&day_items, item_number - 1)); } /* Attach a note to an appointment or event. */ void day_edit_note(struct day_item *p, const char *editor) { - char *note; + char *note; - note = day_item_get_note(p); - edit_note(¬e, editor); + note = day_item_get_note(p); + edit_note(¬e, editor); - switch (p->type) { - case RECUR_EVNT: - p->item.rev->note = note; - break; - case EVNT: - p->item.ev->note = note; - break; - case RECUR_APPT: - p->item.rapt->note = note; - break; - case APPT: - p->item.apt->note = note; - break; - } + switch (p->type) { + case RECUR_EVNT: + p->item.rev->note = note; + break; + case EVNT: + p->item.ev->note = note; + break; + case RECUR_APPT: + p->item.rapt->note = note; + break; + case APPT: + p->item.apt->note = note; + break; + } } /* View a note previously attached to an appointment or event */ void day_view_note(struct day_item *p, const char *pager) { - view_note(day_item_get_note(p), pager); + view_note(day_item_get_note(p), pager); } /* Switch notification state for an item. */ void day_item_switch_notify(struct day_item *p) { - switch (p->type) { - case RECUR_APPT: - recur_apoint_switch_notify(p->item.rapt); - break; - case APPT: - apoint_switch_notify(p->item.apt); - break; - } + switch (p->type) { + case RECUR_APPT: + recur_apoint_switch_notify(p->item.rapt); + break; + case APPT: + apoint_switch_notify(p->item.apt); + break; + } } @@ -66,124 +66,130 @@ static unsigned data_loaded; static void dmon_sigs_hdlr(int sig) { - if (data_loaded) - free_user_data(); + if (data_loaded) + free_user_data(); - DMON_LOG(_("terminated at %s with signal %d\n"), nowstr(), sig); + DMON_LOG(_("terminated at %s with signal %d\n"), nowstr(), sig); - if (unlink(path_dpid) != 0) { - DMON_LOG(_("Could not remove daemon lock file: %s\n"), strerror(errno)); - exit(EXIT_FAILURE); - } + if (unlink(path_dpid) != 0) { + DMON_LOG(_("Could not remove daemon lock file: %s\n"), + strerror(errno)); + exit(EXIT_FAILURE); + } - exit(EXIT_SUCCESS); + exit(EXIT_SUCCESS); } static unsigned daemonize(int status) { - int fd; - - /* - * Operate in the background: Daemonizing. - * - * First need to fork in order to become a child of the init process, - * once the father exits. - */ - switch (fork()) { - case -1: /* fork error */ - EXIT(_("Could not fork: %s\n"), strerror(errno)); - break; - case 0: /* child */ - break; - default: /* parent */ - exit(status); - } - - /* - * Process independency. - * - * Obtain a new process group and session in order to get detached from the - * controlling terminal. - */ - if (setsid() == -1) { - DMON_LOG(_("Could not detach from the controlling terminal: %s\n"), - strerror(errno)); - return 0; - } - - /* - * Change working directory to root directory, - * to prevent filesystem unmounts. - */ - if (chdir("/") == -1) { - DMON_LOG(_("Could not change working directory: %s\n"), strerror(errno)); - return 0; - } - - /* Redirect standard file descriptors to /dev/null. */ - if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { - dup2(fd, STDIN_FILENO); - dup2(fd, STDOUT_FILENO); - dup2(fd, STDERR_FILENO); - if (fd > 2) - close(fd); - } - - /* Write access for the owner only. */ - umask(0022); - - if (!sigs_set_hdlr(SIGINT, dmon_sigs_hdlr) - || !sigs_set_hdlr(SIGTERM, dmon_sigs_hdlr) - || !sigs_set_hdlr(SIGALRM, dmon_sigs_hdlr) - || !sigs_set_hdlr(SIGQUIT, dmon_sigs_hdlr) - || !sigs_set_hdlr(SIGCHLD, SIG_IGN)) - return 0; - - return 1; + int fd; + + /* + * Operate in the background: Daemonizing. + * + * First need to fork in order to become a child of the init process, + * once the father exits. + */ + switch (fork()) { + case -1: /* fork error */ + EXIT(_("Could not fork: %s\n"), strerror(errno)); + break; + case 0: /* child */ + break; + default: /* parent */ + exit(status); + } + + /* + * Process independency. + * + * Obtain a new process group and session in order to get detached from the + * controlling terminal. + */ + if (setsid() == -1) { + DMON_LOG(_("Could not detach from the controlling terminal: %s\n"), + strerror(errno)); + return 0; + } + + /* + * Change working directory to root directory, + * to prevent filesystem unmounts. + */ + if (chdir("/") == -1) { + DMON_LOG(_("Could not change working directory: %s\n"), + strerror(errno)); + return 0; + } + + /* Redirect standard file descriptors to /dev/null. */ + if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > 2) + close(fd); + } + + /* Write access for the owner only. */ + umask(0022); + + if (!sigs_set_hdlr(SIGINT, dmon_sigs_hdlr) + || !sigs_set_hdlr(SIGTERM, dmon_sigs_hdlr) + || !sigs_set_hdlr(SIGALRM, dmon_sigs_hdlr) + || !sigs_set_hdlr(SIGQUIT, dmon_sigs_hdlr) + || !sigs_set_hdlr(SIGCHLD, SIG_IGN)) + return 0; + + return 1; } void dmon_start(int parent_exit_status) { - if (!daemonize(parent_exit_status)) - DMON_ABRT(_("Cannot daemonize, aborting\n")); - - if (!io_dump_pid(path_dpid)) - DMON_ABRT(_("Could not set lock file\n")); - - if (!io_file_exist(path_conf)) - DMON_ABRT(_("Could not access \"%s\": %s\n"), path_conf, strerror(errno)); - config_load(); - - if (!io_file_exist(path_apts)) - DMON_ABRT(_("Could not access \"%s\": %s\n"), path_apts, strerror(errno)); - apoint_llist_init(); - recur_apoint_llist_init(); - event_llist_init(); - todo_init_list(); - io_load_app(); - data_loaded = 1; - - DMON_LOG(_("started at %s\n"), nowstr()); - for (;;) { - int left; - - if (!notify_get_next_bkgd()) - DMON_ABRT(_("error loading next appointment\n")); - - left = notify_time_left(); - if (left > 0 && left < nbar.cntdwn && notify_needs_reminder()) { - DMON_LOG(_("launching notification at %s for: \"%s\"\n"), - nowstr(), notify_app_txt()); - if (!notify_launch_cmd()) - DMON_LOG(_("error while sending notification\n")); - } - - DMON_LOG(ngettext("sleeping at %s for %d second\n", - "sleeping at %s for %d seconds\n", - DMON_SLEEP_TIME), nowstr(), DMON_SLEEP_TIME); - psleep(DMON_SLEEP_TIME); - DMON_LOG(_("awakened at %s\n"), nowstr()); - } + if (!daemonize(parent_exit_status)) + DMON_ABRT(_("Cannot daemonize, aborting\n")); + + if (!io_dump_pid(path_dpid)) + DMON_ABRT(_("Could not set lock file\n")); + + if (!io_file_exist(path_conf)) + DMON_ABRT(_("Could not access \"%s\": %s\n"), path_conf, + strerror(errno)); + config_load(); + + if (!io_file_exist(path_apts)) + DMON_ABRT(_("Could not access \"%s\": %s\n"), path_apts, + strerror(errno)); + apoint_llist_init(); + recur_apoint_llist_init(); + event_llist_init(); + todo_init_list(); + io_load_app(); + data_loaded = 1; + + DMON_LOG(_("started at %s\n"), nowstr()); + for (;;) { + int left; + + if (!notify_get_next_bkgd()) + DMON_ABRT(_("error loading next appointment\n")); + + left = notify_time_left(); + if (left > 0 && left < nbar.cntdwn + && notify_needs_reminder()) { + DMON_LOG(_("launching notification at %s for: \"%s\"\n"), + nowstr(), notify_app_txt()); + if (!notify_launch_cmd()) + DMON_LOG(_("error while sending notification\n")); + } + + DMON_LOG(ngettext("sleeping at %s for %d second\n", + "sleeping at %s for %d seconds\n", + DMON_SLEEP_TIME), nowstr(), + DMON_SLEEP_TIME); + psleep(DMON_SLEEP_TIME); + DMON_LOG(_("awakened at %s\n"), nowstr()); + } } /* @@ -192,12 +198,13 @@ void dmon_start(int parent_exit_status) */ void dmon_stop(void) { - int dpid; + int dpid; - dpid = io_get_pid(path_dpid); - if (!dpid) - return; + dpid = io_get_pid(path_dpid); + if (!dpid) + return; - if (kill((pid_t) dpid, SIGINT) < 0 && errno != ESRCH) - EXIT(_("Could not stop calcurse daemon: %s\n"), strerror(errno)); + if (kill((pid_t) dpid, SIGINT) < 0 && errno != ESRCH) + EXIT(_("Could not stop calcurse daemon: %s\n"), + strerror(errno)); } diff --git a/src/event.c b/src/event.c index 637dd6d..38305b8 100644 --- a/src/event.c +++ b/src/event.c @@ -45,124 +45,124 @@ llist_t eventlist; void event_free(struct event *ev) { - mem_free(ev->mesg); - erase_note(&ev->note); - mem_free(ev); + mem_free(ev->mesg); + erase_note(&ev->note); + mem_free(ev); } struct event *event_dup(struct event *in) { - EXIT_IF(!in, _("null pointer")); - - struct event *ev = mem_malloc(sizeof(struct event)); - ev->id = in->id; - ev->day = in->day; - ev->mesg = mem_strdup(in->mesg); - if (in->note) - ev->note = mem_strdup(in->note); - else - ev->note = NULL; - - return ev; + EXIT_IF(!in, _("null pointer")); + + struct event *ev = mem_malloc(sizeof(struct event)); + ev->id = in->id; + ev->day = in->day; + ev->mesg = mem_strdup(in->mesg); + if (in->note) + ev->note = mem_strdup(in->note); + else + ev->note = NULL; + + return ev; } void event_llist_init(void) { - LLIST_INIT(&eventlist); + LLIST_INIT(&eventlist); } void event_llist_free(void) { - LLIST_FREE_INNER(&eventlist, event_free); - LLIST_FREE(&eventlist); + LLIST_FREE_INNER(&eventlist, event_free); + LLIST_FREE(&eventlist); } static int event_cmp_day(struct event *a, struct event *b) { - return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1); + return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1); } /* Create a new event */ struct event *event_new(char *mesg, char *note, long day, int id) { - struct event *ev; + struct event *ev; - ev = mem_malloc(sizeof(struct event)); - ev->mesg = mem_strdup(mesg); - ev->day = day; - ev->id = id; - ev->note = (note != NULL) ? mem_strdup(note) : NULL; + ev = mem_malloc(sizeof(struct event)); + ev->mesg = mem_strdup(mesg); + ev->day = day; + ev->id = id; + ev->note = (note != NULL) ? mem_strdup(note) : NULL; - LLIST_ADD_SORTED(&eventlist, ev, event_cmp_day); + LLIST_ADD_SORTED(&eventlist, ev, event_cmp_day); - return ev; + return ev; } /* Check if the event belongs to the selected day */ unsigned event_inday(struct event *i, long *start) { - return (i->day < *start + DAYINSEC && i->day >= *start); + return (i->day < *start + DAYINSEC && i->day >= *start); } /* Write to file the event in user-friendly format */ void event_write(struct event *o, FILE * f) { - struct tm lt; - time_t t; - - t = o->day; - localtime_r(&t, <); - fprintf(f, "%02u/%02u/%04u [%d] ", lt.tm_mon + 1, lt.tm_mday, - 1900 + lt.tm_year, o->id); - if (o->note != NULL) - fprintf(f, ">%s ", o->note); - fprintf(f, "%s\n", o->mesg); + struct tm lt; + time_t t; + + t = o->day; + localtime_r(&t, <); + fprintf(f, "%02u/%02u/%04u [%d] ", lt.tm_mon + 1, lt.tm_mday, + 1900 + lt.tm_year, o->id); + if (o->note != NULL) + fprintf(f, ">%s ", o->note); + fprintf(f, "%s\n", o->mesg); } /* Load the events from file */ struct event *event_scan(FILE * f, struct tm start, int id, char *note) { - char buf[BUFSIZ], *nl; - time_t tstart; - - EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || - !check_time(start.tm_hour, start.tm_min), - _("date error in event")); - - /* Read the event description */ - if (!fgets(buf, sizeof buf, f)) - return NULL; - - nl = strchr(buf, '\n'); - if (nl) { - *nl = '\0'; - } - start.tm_hour = 0; - start.tm_min = 0; - start.tm_sec = 0; - start.tm_isdst = -1; - start.tm_year -= 1900; - start.tm_mon--; - - tstart = mktime(&start); - EXIT_IF(tstart == -1, _("date error in the event\n")); - - return event_new(buf, note, tstart, id); + char buf[BUFSIZ], *nl; + time_t tstart; + + EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || + !check_time(start.tm_hour, start.tm_min), + _("date error in event")); + + /* Read the event description */ + if (!fgets(buf, sizeof buf, f)) + return NULL; + + nl = strchr(buf, '\n'); + if (nl) { + *nl = '\0'; + } + start.tm_hour = 0; + start.tm_min = 0; + start.tm_sec = 0; + start.tm_isdst = -1; + start.tm_year -= 1900; + start.tm_mon--; + + tstart = mktime(&start); + EXIT_IF(tstart == -1, _("date error in the event\n")); + + return event_new(buf, note, tstart, id); } /* Delete an event from the list. */ void event_delete(struct event *ev) { - llist_item_t *i = LLIST_FIND_FIRST(&eventlist, ev, NULL); + llist_item_t *i = LLIST_FIND_FIRST(&eventlist, ev, NULL); - if (!i) - EXIT(_("no such appointment")); + if (!i) + EXIT(_("no such appointment")); - LLIST_REMOVE(&eventlist, i); + LLIST_REMOVE(&eventlist, i); } void event_paste_item(struct event *ev, long date) { - ev->day = date; - LLIST_ADD_SORTED(&eventlist, ev, event_cmp_day); + ev->day = date; + LLIST_ADD_SORTED(&eventlist, ev, event_cmp_day); } diff --git a/src/getstring.c b/src/getstring.c index aedd842..513ad67 100644 --- a/src/getstring.c +++ b/src/getstring.c @@ -37,126 +37,134 @@ #include "calcurse.h" struct getstr_charinfo { - unsigned int offset, dpyoff; + unsigned int offset, dpyoff; }; struct getstr_status { - char *s; - struct getstr_charinfo *ci; - int pos, len; - int scrpos; + char *s; + struct getstr_charinfo *ci; + int pos, len; + int scrpos; }; /* Print the string at the desired position. */ -static void getstr_print(WINDOW * win, int x, int y, struct getstr_status *st) +static void getstr_print(WINDOW * win, int x, int y, + struct getstr_status *st) { - char c = 0; - - /* print string */ - mvwaddnstr(win, y, x, &st->s[st->ci[st->scrpos].offset], -1); - wclrtoeol(win); - - /* print scrolling indicator */ - if (st->scrpos > 0 && st->ci[st->len].dpyoff - - st->ci[st->scrpos].dpyoff > col - 2) - c = '*'; - else if (st->scrpos > 0) - c = '<'; - else if (st->ci[st->len].dpyoff - st->ci[st->scrpos].dpyoff > col - 2) - c = '>'; - mvwprintw(win, y, col - 2, " %c", c); - - /* print cursor */ - wmove(win, y, st->ci[st->pos].dpyoff - st->ci[st->scrpos].dpyoff); - wchgat(win, 1, A_REVERSE, COLR_CUSTOM, NULL); + char c = 0; + + /* print string */ + mvwaddnstr(win, y, x, &st->s[st->ci[st->scrpos].offset], -1); + wclrtoeol(win); + + /* print scrolling indicator */ + if (st->scrpos > 0 && st->ci[st->len].dpyoff - + st->ci[st->scrpos].dpyoff > col - 2) + c = '*'; + else if (st->scrpos > 0) + c = '<'; + else if (st->ci[st->len].dpyoff - st->ci[st->scrpos].dpyoff > + col - 2) + c = '>'; + mvwprintw(win, y, col - 2, " %c", c); + + /* print cursor */ + wmove(win, y, st->ci[st->pos].dpyoff - st->ci[st->scrpos].dpyoff); + wchgat(win, 1, A_REVERSE, COLR_CUSTOM, NULL); } /* Delete a character at the given position in string. */ static void getstr_del_char(struct getstr_status *st) { - char *str = st->s + st->ci[st->pos].offset; - int cl = st->ci[st->pos + 1].offset - st->ci[st->pos].offset; - int cw = st->ci[st->pos + 1].dpyoff - st->ci[st->pos].dpyoff; - int i; - - memmove(str, str + cl, strlen(str) + 1); - - st->len--; - for (i = st->pos; i <= st->len; i++) { - st->ci[i].offset = st->ci[i + 1].offset - cl; - st->ci[i].dpyoff = st->ci[i + 1].dpyoff - cw; - } + char *str = st->s + st->ci[st->pos].offset; + int cl = st->ci[st->pos + 1].offset - st->ci[st->pos].offset; + int cw = st->ci[st->pos + 1].dpyoff - st->ci[st->pos].dpyoff; + int i; + + memmove(str, str + cl, strlen(str) + 1); + + st->len--; + for (i = st->pos; i <= st->len; i++) { + st->ci[i].offset = st->ci[i + 1].offset - cl; + st->ci[i].dpyoff = st->ci[i + 1].dpyoff - cw; + } } /* Add a character at the given position in string. */ static void getstr_ins_char(struct getstr_status *st, char *c) { - char *str = st->s + st->ci[st->pos].offset; - int cl = UTF8_LENGTH(c[0]); - int cw = utf8_width(c); - int i; - - memmove(str + cl, str, strlen(str) + 1); - for (i = 0; i < cl; i++, str++) - *str = c[i]; - - for (i = st->len; i >= st->pos; i--) { - st->ci[i + 1].offset = st->ci[i].offset + cl; - st->ci[i + 1].dpyoff = st->ci[i].dpyoff + cw; - } - st->len++; + char *str = st->s + st->ci[st->pos].offset; + int cl = UTF8_LENGTH(c[0]); + int cw = utf8_width(c); + int i; + + memmove(str + cl, str, strlen(str) + 1); + for (i = 0; i < cl; i++, str++) + *str = c[i]; + + for (i = st->len; i >= st->pos; i--) { + st->ci[i + 1].offset = st->ci[i].offset + cl; + st->ci[i + 1].dpyoff = st->ci[i].dpyoff + cw; + } + st->len++; } static void bell(void) { - putchar('\a'); + putchar('\a'); } /* Initialize getstring data structure. */ static void -getstr_init(struct getstr_status *st, char *str, struct getstr_charinfo *ci) +getstr_init(struct getstr_status *st, char *str, + struct getstr_charinfo *ci) { - int width; + int width; - st->s = str; - st->ci = ci; + st->s = str; + st->ci = ci; - st->len = width = 0; - while (*str) { - st->ci[st->len].offset = str - st->s; - st->ci[st->len].dpyoff = width; + st->len = width = 0; + while (*str) { + st->ci[st->len].offset = str - st->s; + st->ci[st->len].dpyoff = width; - st->len++; - width += utf8_width(str); - str += UTF8_LENGTH(*str); - } - st->ci[st->len].offset = str - st->s; - st->ci[st->len].dpyoff = width; + st->len++; + width += utf8_width(str); + str += UTF8_LENGTH(*str); + } + st->ci[st->len].offset = str - st->s; + st->ci[st->len].dpyoff = width; - st->pos = st->len; - st->scrpos = 0; + st->pos = st->len; + st->scrpos = 0; } /* Scroll left/right if the cursor moves outside the window range. */ static void getstr_fixscr(struct getstr_status *st) { - const int pgsize = col / 3; - int pgskip; - - while (st->pos < st->scrpos) { - pgskip = 0; - while (pgskip < pgsize && st->scrpos > 0) { - st->scrpos--; - pgskip += st->ci[st->scrpos + 1].dpyoff - st->ci[st->scrpos].dpyoff; - } - } - while (st->ci[st->pos].dpyoff - st->ci[st->scrpos].dpyoff > col - 2) { - pgskip = 0; - while (pgskip < pgsize && st->scrpos < st->len) { - pgskip += st->ci[st->scrpos + 1].dpyoff - st->ci[st->scrpos].dpyoff; - st->scrpos++; - } - } + const int pgsize = col / 3; + int pgskip; + + while (st->pos < st->scrpos) { + pgskip = 0; + while (pgskip < pgsize && st->scrpos > 0) { + st->scrpos--; + pgskip += + st->ci[st->scrpos + 1].dpyoff - + st->ci[st->scrpos].dpyoff; + } + } + while (st->ci[st->pos].dpyoff - st->ci[st->scrpos].dpyoff > + col - 2) { + pgskip = 0; + while (pgskip < pgsize && st->scrpos < st->len) { + pgskip += + st->ci[st->scrpos + 1].dpyoff - + st->ci[st->scrpos].dpyoff; + st->scrpos++; + } + } } /* @@ -169,114 +177,119 @@ static void getstr_fixscr(struct getstr_status *st) */ enum getstr getstring(WINDOW * win, char *str, int l, int x, int y) { - struct getstr_status st; - struct getstr_charinfo ci[l + 1]; - - int ch, k; - char c[UTF8_MAXLEN]; - - getstr_init(&st, str, ci); - custom_apply_attr(win, ATTR_HIGHEST); - - for (;;) { - getstr_fixscr(&st); - getstr_print(win, x, y, &st); - wins_doupdate(); - - if ((ch = wgetch(win)) == '\n') - break; - switch (ch) { - case KEY_BACKSPACE: /* delete one character */ - case 330: - case 127: - case CTRL('H'): - if (st.pos > 0) { - st.pos--; - getstr_del_char(&st); - } else { - bell(); - } - break; - case CTRL('D'): /* delete next character */ - if (st.pos < st.len) - getstr_del_char(&st); - else - bell(); - break; - case CTRL('W'): /* delete a word */ - if (st.pos > 0) { - while (st.pos && st.s[st.ci[st.pos - 1].offset] == ' ') { - st.pos--; - getstr_del_char(&st); - } - while (st.pos && st.s[st.ci[st.pos - 1].offset] != ' ') { - st.pos--; - getstr_del_char(&st); - } - } else { - bell(); - } - break; - case CTRL('K'): /* delete to end-of-line */ - st.s[st.ci[st.pos].offset] = 0; - st.len = st.pos; - break; - case CTRL('A'): /* go to begginning of string */ - st.pos = 0; - break; - case CTRL('E'): /* go to end of string */ - st.pos = st.len; - break; - case KEY_LEFT: /* move one char backward */ - case CTRL('B'): - if (st.pos > 0) - st.pos--; - break; - case KEY_RIGHT: /* move one char forward */ - case CTRL('F'): - if (st.pos < st.len) - st.pos++; - break; - case ESCAPE: /* cancel editing */ - return GETSTRING_ESC; - break; - default: /* insert one character */ - c[0] = ch; - for (k = 1; k < MIN(UTF8_LENGTH(c[0]), UTF8_MAXLEN); k++) - c[k] = (unsigned char)wgetch(win); - if (st.ci[st.len].offset + k < l) { - getstr_ins_char(&st, c); - st.pos++; - } - } - } - - custom_remove_attr(win, ATTR_HIGHEST); - - return st.len == 0 ? GETSTRING_RET : GETSTRING_VALID; + struct getstr_status st; + struct getstr_charinfo ci[l + 1]; + + int ch, k; + char c[UTF8_MAXLEN]; + + getstr_init(&st, str, ci); + custom_apply_attr(win, ATTR_HIGHEST); + + for (;;) { + getstr_fixscr(&st); + getstr_print(win, x, y, &st); + wins_doupdate(); + + if ((ch = wgetch(win)) == '\n') + break; + switch (ch) { + case KEY_BACKSPACE: /* delete one character */ + case 330: + case 127: + case CTRL('H'): + if (st.pos > 0) { + st.pos--; + getstr_del_char(&st); + } else { + bell(); + } + break; + case CTRL('D'): /* delete next character */ + if (st.pos < st.len) + getstr_del_char(&st); + else + bell(); + break; + case CTRL('W'): /* delete a word */ + if (st.pos > 0) { + while (st.pos + && st.s[st.ci[st.pos - 1].offset] == + ' ') { + st.pos--; + getstr_del_char(&st); + } + while (st.pos + && st.s[st.ci[st.pos - 1].offset] != + ' ') { + st.pos--; + getstr_del_char(&st); + } + } else { + bell(); + } + break; + case CTRL('K'): /* delete to end-of-line */ + st.s[st.ci[st.pos].offset] = 0; + st.len = st.pos; + break; + case CTRL('A'): /* go to begginning of string */ + st.pos = 0; + break; + case CTRL('E'): /* go to end of string */ + st.pos = st.len; + break; + case KEY_LEFT: /* move one char backward */ + case CTRL('B'): + if (st.pos > 0) + st.pos--; + break; + case KEY_RIGHT: /* move one char forward */ + case CTRL('F'): + if (st.pos < st.len) + st.pos++; + break; + case ESCAPE: /* cancel editing */ + return GETSTRING_ESC; + break; + default: /* insert one character */ + c[0] = ch; + for (k = 1; + k < MIN(UTF8_LENGTH(c[0]), UTF8_MAXLEN); k++) + c[k] = (unsigned char)wgetch(win); + if (st.ci[st.len].offset + k < l) { + getstr_ins_char(&st, c); + st.pos++; + } + } + } + + custom_remove_attr(win, ATTR_HIGHEST); + + return st.len == 0 ? GETSTRING_RET : GETSTRING_VALID; } /* Update an already existing string. */ int updatestring(WINDOW * win, char **str, int x, int y) { - int len = strlen(*str); - char *buf; - enum getstr ret; + int len = strlen(*str); + char *buf; + enum getstr ret; - EXIT_IF(len + 1 > BUFSIZ, _("Internal error: line too long")); + EXIT_IF(len + 1 > BUFSIZ, _("Internal error: line too long")); - buf = mem_malloc(BUFSIZ); - memcpy(buf, *str, len + 1); + buf = mem_malloc(BUFSIZ); + memcpy(buf, *str, len + 1); - ret = getstring(win, buf, BUFSIZ, x, y); + ret = getstring(win, buf, BUFSIZ, x, y); - if (ret == GETSTRING_VALID) { - len = strlen(buf); - *str = mem_realloc(*str, len + 1, 1); - EXIT_IF(*str == NULL, _("out of memory")); - memcpy(*str, buf, len + 1); - } + if (ret == GETSTRING_VALID) { + len = strlen(buf); + *str = mem_realloc(*str, len + 1, 1); + EXIT_IF(*str == NULL, _("out of memory")); + memcpy(*str, buf, len + 1); + } - mem_free(buf); - return ret; + mem_free(buf); + return ret; } @@ -44,48 +44,48 @@ #define HELPTEXTSIZ 4096 typedef struct { - char *title; - char text[HELPTEXTSIZ]; + char *title; + char text[HELPTEXTSIZ]; } help_page_t; typedef enum { - HELP_MAIN, - HELP_SAVE, - HELP_IMPORT, - HELP_EXPORT, - HELP_DISPLACEMENT, - HELP_VIEW, - HELP_PIPE, - HELP_TAB, - HELP_GOTO, - HELP_DELETE, - HELP_ADD, - HELP_COPY_PASTE, - HELP_EDIT, - HELP_ENOTE, - HELP_VNOTE, - HELP_PRIORITY, - HELP_REPEAT, - HELP_FLAG, - HELP_CONFIG, - HELP_GENERAL, - HELP_OTHER, - HELP_CREDITS, - HELPSCREENS, - NOPAGE + HELP_MAIN, + HELP_SAVE, + HELP_IMPORT, + HELP_EXPORT, + HELP_DISPLACEMENT, + HELP_VIEW, + HELP_PIPE, + HELP_TAB, + HELP_GOTO, + HELP_DELETE, + HELP_ADD, + HELP_COPY_PASTE, + HELP_EDIT, + HELP_ENOTE, + HELP_VNOTE, + HELP_PRIORITY, + HELP_REPEAT, + HELP_FLAG, + HELP_CONFIG, + HELP_GENERAL, + HELP_OTHER, + HELP_CREDITS, + HELPSCREENS, + NOPAGE } help_pages_e; /* Returns the number of lines in an help text. */ static int get_help_lines(char *text) { - int i, newline; - - newline = 0; - for (i = 0; text[i]; i++) { - if (text[i] == '\n') - newline++; - } - return newline + 1; + int i, newline; + + newline = 0; + for (i = 0; text[i]; i++) { + if (text[i] == '\n') + newline++; + } + return newline + 1; } /* @@ -93,57 +93,61 @@ static int get_help_lines(char *text) * of lines that were written. */ static int -help_write_pad(struct window *win, char *title, char *text, enum key action) +help_write_pad(struct window *win, char *title, char *text, + enum key action) { - int colnum, rownum; - const char *bindings_title = _("key bindings: %s"); - char *bindings; - - colnum = 0; - rownum = 0; - erase_window_part(win->p, rownum, colnum, BUFSIZ, win->w); - custom_apply_attr(win->p, ATTR_HIGHEST); - mvwaddstr(win->p, rownum, colnum, title); - if ((int)action != KEY_RESIZE && action < NBKEYS) { - switch (action) { - 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: - case KEY_GENERIC_HELP: - case KEY_GENERIC_REDRAW: - case KEY_GENERIC_ADD_APPT: - case KEY_GENERIC_ADD_TODO: - case KEY_GENERIC_PREV_DAY: - case KEY_GENERIC_NEXT_DAY: - case KEY_GENERIC_PREV_WEEK: - case KEY_GENERIC_NEXT_WEEK: - case KEY_GENERIC_PREV_MONTH: - case KEY_GENERIC_NEXT_MONTH: - case KEY_GENERIC_PREV_YEAR: - case KEY_GENERIC_NEXT_YEAR: - case KEY_GENERIC_GOTO_TODAY: - case KEY_GENERIC_CREDITS: - case KEY_GENERIC_COPY: - case KEY_GENERIC_PASTE: - break; - default: - bindings = keys_action_allkeys(action); - - if (bindings) { - colnum = win->w - strlen(bindings_title) - strlen(bindings); - mvwprintw(win->p, rownum, colnum, bindings_title, bindings); - } - } - } - colnum = 0; - rownum += get_help_lines(title); - custom_remove_attr(win->p, ATTR_HIGHEST); - mvwaddstr(win->p, rownum, colnum, text); - rownum += get_help_lines(text); - return rownum; + int colnum, rownum; + const char *bindings_title = _("key bindings: %s"); + char *bindings; + + colnum = 0; + rownum = 0; + erase_window_part(win->p, rownum, colnum, BUFSIZ, win->w); + custom_apply_attr(win->p, ATTR_HIGHEST); + mvwaddstr(win->p, rownum, colnum, title); + if ((int)action != KEY_RESIZE && action < NBKEYS) { + switch (action) { + 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: + case KEY_GENERIC_HELP: + case KEY_GENERIC_REDRAW: + case KEY_GENERIC_ADD_APPT: + case KEY_GENERIC_ADD_TODO: + case KEY_GENERIC_PREV_DAY: + case KEY_GENERIC_NEXT_DAY: + case KEY_GENERIC_PREV_WEEK: + case KEY_GENERIC_NEXT_WEEK: + case KEY_GENERIC_PREV_MONTH: + case KEY_GENERIC_NEXT_MONTH: + case KEY_GENERIC_PREV_YEAR: + case KEY_GENERIC_NEXT_YEAR: + case KEY_GENERIC_GOTO_TODAY: + case KEY_GENERIC_CREDITS: + case KEY_GENERIC_COPY: + case KEY_GENERIC_PASTE: + break; + default: + bindings = keys_action_allkeys(action); + + if (bindings) { + colnum = + win->w - strlen(bindings_title) - + strlen(bindings); + mvwprintw(win->p, rownum, colnum, + bindings_title, bindings); + } + } + } + colnum = 0; + rownum += get_help_lines(title); + custom_remove_attr(win->p, ATTR_HIGHEST); + mvwaddstr(win->p, rownum, colnum, text); + rownum += get_help_lines(text); + return rownum; } /* @@ -152,22 +156,22 @@ help_write_pad(struct window *win, char *title, char *text, enum key action) */ void help_wins_init(struct scrollwin *hwin, int x, int y, int h, int w) { - const int PADOFFSET = 4; - const int TITLELINES = 3; - - hwin->win.x = x; - hwin->win.y = y; - hwin->win.h = h; - hwin->win.w = w; - - hwin->pad.x = PADOFFSET; - hwin->pad.y = TITLELINES; - hwin->pad.h = BUFSIZ; - hwin->pad.w = hwin->win.w - 2 * PADOFFSET + 1; - - hwin->label = _("Calcurse help"); - wins_scrollwin_init(hwin); - wins_show(hwin->win.p, hwin->label); + const int PADOFFSET = 4; + const int TITLELINES = 3; + + hwin->win.x = x; + hwin->win.y = y; + hwin->win.h = h; + hwin->win.w = w; + + hwin->pad.x = PADOFFSET; + hwin->pad.y = TITLELINES; + hwin->pad.h = BUFSIZ; + hwin->pad.w = hwin->win.w - 2 * PADOFFSET + 1; + + hwin->label = _("Calcurse help"); + wins_scrollwin_init(hwin); + wins_show(hwin->win.p, hwin->label); } /* @@ -176,626 +180,625 @@ void help_wins_init(struct scrollwin *hwin, int x, int y, int h, int w) */ static void help_wins_reinit(struct scrollwin *hwin) { - wins_scrollwin_delete(hwin); - wins_get_config(); - help_wins_init(hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col); + wins_scrollwin_delete(hwin); + wins_get_config(); + help_wins_init(hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col); } /* Reset the screen, needed when resizing terminal for example. */ static void help_wins_reset(struct scrollwin *hwin) { - endwin(); - wins_refresh(); - curs_set(0); - delwin(win[STA].p); - help_wins_reinit(hwin); - win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - keypad(win[STA].p, TRUE); - if (notify_bar()) - notify_reinit_bar(); - wins_status_bar(); - if (notify_bar()) - notify_update_bar(); + endwin(); + wins_refresh(); + curs_set(0); + delwin(win[STA].p); + help_wins_reinit(hwin); + win[STA].p = + newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); + keypad(win[STA].p, TRUE); + if (notify_bar()) + notify_reinit_bar(); + wins_status_bar(); + if (notify_bar()) + notify_update_bar(); } /* Association between a key pressed and its corresponding help page. */ static int wanted_page(int ch) { - int page; - - switch (ch) { - - case KEY_GENERIC_HELP: - page = HELP_MAIN; - break; - - case KEY_FLAG_ITEM: - page = HELP_FLAG; - break; - - case KEY_GENERIC_REDRAW: - case KEY_GENERIC_ADD_APPT: - case KEY_GENERIC_ADD_TODO: - case KEY_GENERIC_PREV_DAY: - case KEY_GENERIC_NEXT_DAY: - case KEY_GENERIC_PREV_WEEK: - case KEY_GENERIC_NEXT_WEEK: - case KEY_GENERIC_PREV_MONTH: - case KEY_GENERIC_NEXT_MONTH: - case KEY_GENERIC_PREV_YEAR: - case KEY_GENERIC_NEXT_YEAR: - case KEY_GENERIC_GOTO_TODAY: - page = HELP_GENERAL; - break; - - case KEY_GENERIC_SAVE: - page = HELP_SAVE; - break; - - case KEY_GENERIC_IMPORT: - page = HELP_IMPORT; - break; - - case KEY_GENERIC_EXPORT: - page = HELP_EXPORT; - break; - - 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 KEY_ADD_ITEM: - page = HELP_ADD; - break; - - case KEY_GENERIC_GOTO: - page = HELP_GOTO; - break; - - case KEY_DEL_ITEM: - page = HELP_DELETE; - break; - - case KEY_GENERIC_COPY: - case KEY_GENERIC_PASTE: - page = HELP_COPY_PASTE; - break; - - case KEY_EDIT_ITEM: - page = HELP_EDIT; - break; - - case KEY_EDIT_NOTE: - page = HELP_ENOTE; - break; - - case KEY_VIEW_NOTE: - page = HELP_VNOTE; - break; - - case KEY_GENERIC_CONFIG_MENU: - page = HELP_CONFIG; - break; - - case KEY_GENERIC_OTHER_CMD: - page = HELP_OTHER; - break; - - case KEY_REPEAT_ITEM: - page = HELP_REPEAT; - break; - - case KEY_VIEW_ITEM: - page = HELP_VIEW; - break; - - case KEY_PIPE_ITEM: - page = HELP_PIPE; - break; - - case KEY_RAISE_PRIORITY: - case KEY_LOWER_PRIORITY: - page = HELP_PRIORITY; - break; - - case KEY_GENERIC_CHANGE_VIEW: - page = HELP_TAB; - break; - - case KEY_GENERIC_CREDITS: - page = HELP_CREDITS; - break; - - default: - page = NOPAGE; - break; - } - - return page; + int page; + + switch (ch) { + + case KEY_GENERIC_HELP: + page = HELP_MAIN; + break; + + case KEY_FLAG_ITEM: + page = HELP_FLAG; + break; + + case KEY_GENERIC_REDRAW: + case KEY_GENERIC_ADD_APPT: + case KEY_GENERIC_ADD_TODO: + case KEY_GENERIC_PREV_DAY: + case KEY_GENERIC_NEXT_DAY: + case KEY_GENERIC_PREV_WEEK: + case KEY_GENERIC_NEXT_WEEK: + case KEY_GENERIC_PREV_MONTH: + case KEY_GENERIC_NEXT_MONTH: + case KEY_GENERIC_PREV_YEAR: + case KEY_GENERIC_NEXT_YEAR: + case KEY_GENERIC_GOTO_TODAY: + page = HELP_GENERAL; + break; + + case KEY_GENERIC_SAVE: + page = HELP_SAVE; + break; + + case KEY_GENERIC_IMPORT: + page = HELP_IMPORT; + break; + + case KEY_GENERIC_EXPORT: + page = HELP_EXPORT; + break; + + 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 KEY_ADD_ITEM: + page = HELP_ADD; + break; + + case KEY_GENERIC_GOTO: + page = HELP_GOTO; + break; + + case KEY_DEL_ITEM: + page = HELP_DELETE; + break; + + case KEY_GENERIC_COPY: + case KEY_GENERIC_PASTE: + page = HELP_COPY_PASTE; + break; + + case KEY_EDIT_ITEM: + page = HELP_EDIT; + break; + + case KEY_EDIT_NOTE: + page = HELP_ENOTE; + break; + + case KEY_VIEW_NOTE: + page = HELP_VNOTE; + break; + + case KEY_GENERIC_CONFIG_MENU: + page = HELP_CONFIG; + break; + + case KEY_GENERIC_OTHER_CMD: + page = HELP_OTHER; + break; + + case KEY_REPEAT_ITEM: + page = HELP_REPEAT; + break; + + case KEY_VIEW_ITEM: + page = HELP_VIEW; + break; + + case KEY_PIPE_ITEM: + page = HELP_PIPE; + break; + + case KEY_RAISE_PRIORITY: + case KEY_LOWER_PRIORITY: + page = HELP_PRIORITY; + break; + + case KEY_GENERIC_CHANGE_VIEW: + page = HELP_TAB; + break; + + case KEY_GENERIC_CREDITS: + page = HELP_CREDITS; + break; + + default: + page = NOPAGE; + break; + } + + return page; } /* Draws the help screen */ void help_screen(void) { - enum { - MOVE_UP, - MOVE_DOWN, - MOVE_LEFT, - MOVE_RIGHT, - DIRECTIONS - }; - struct scrollwin hwin; - int need_resize; - enum key ch = KEY_GENERIC_HELP; - int page, oldpage; - help_page_t hscr[HELPSCREENS]; - char keystr[DIRECTIONS][BUFSIZ]; - - hscr[HELP_MAIN].title = - _(" Welcome to Calcurse. This is the main help screen.\n"); - snprintf(hscr[HELP_MAIN].text, HELPTEXTSIZ, - _ - ("Moving around: Press '%s' or '%s' to scroll text upward or downward\n" - " inside help screens, if necessary.\n\n" - " Exit help: When finished, press '%s' to exit help and go back to\n" - " the main Calcurse screen.\n\n" - " Help topic: At the bottom of this screen you can see a panel with\n" - " different fields, represented by a letter and a short\n" - " title. This panel contains all the available actions\n" - " you can perform when using Calcurse.\n" - " By pressing one of the letters appearing in this\n" - " panel, you will be shown a short description of the\n" - " corresponding action. At the top right side of the\n" - " description screen are indicated the user-defined key\n" - " bindings that lead to the action.\n\n" - " Credits: Press '%s' for credits."), - keys_action_firstkey(KEY_GENERIC_SCROLL_UP), - keys_action_firstkey(KEY_GENERIC_SCROLL_DOWN), - keys_action_firstkey(KEY_GENERIC_QUIT), - keys_action_firstkey(KEY_GENERIC_CREDITS)); - - hscr[HELP_SAVE].title = _("Save\n"); - snprintf(hscr[HELP_SAVE].text, HELPTEXTSIZ, - _("Save calcurse data.\n" - "Data are splitted into four different files which contain :" - "\n\n" - " / ~/.calcurse/conf -> user configuration\n" - " | (layout, color, general options)\n" - " | ~/.calcurse/apts -> data related to the appointments\n" - " | ~/.calcurse/todo -> data related to the todo list\n" - " \\ ~/.calcurse/keys -> user-defined key bindings\n" - "\nIn the config menu, you can choose to save the Calcurse data\n" - "automatically before quitting.")); - - hscr[HELP_IMPORT].title = _("Import\n"); - snprintf(hscr[HELP_IMPORT].text, HELPTEXTSIZ, - _("Import data from an icalendar file.\n" - "You will be asked to enter the file name from which to load ical\n" - "items. At the end of the import process, and if the general option\n" - "'system_dialogs' is set to 'yes', a report indicating how many items\n" - "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"); - snprintf(hscr[HELP_EXPORT].text, HELPTEXTSIZ, - _("Export calcurse data (appointments, events and todos).\n" - "This leads to the export submenu, from which you can choose between\n" - "two different export formats: 'ical' and 'pcal'. Choosing one of\n" - "those formats lets you export calcurse data to icalendar or pcal\n" - "format.\n\n" - "You first need to specify the file to which the data will be exported.\n" - "By default, this file is:\n\n" - " ~/calcurse.ics\n\n" - "for an ical export, and:\n\n" - " ~/calcurse.txt\n\n" - "for a pcal export.\n\n" - "Calcurse data are exported in the following order:\n" - " events, appointments, todos.\n")); - - strncpy(keystr[MOVE_UP], keys_action_allkeys(KEY_MOVE_UP), BUFSIZ); - strncpy(keystr[MOVE_DOWN], keys_action_allkeys(KEY_MOVE_DOWN), BUFSIZ); - strncpy(keystr[MOVE_LEFT], keys_action_allkeys(KEY_MOVE_LEFT), BUFSIZ); - strncpy(keystr[MOVE_RIGHT], keys_action_allkeys(KEY_MOVE_RIGHT), BUFSIZ); - hscr[HELP_DISPLACEMENT].title = _("Displacement keys\n"); - snprintf(hscr[HELP_DISPLACEMENT].text, HELPTEXTSIZ, - _("Move around inside calcurse screens.\n" - "The following scheme summarizes how to get around:\n\n" - " move up\n" - " move to previous week\n" - "\n" - " %s\n" - " move left ^ \n" - " move to previous day |\n" - " %s\n" - " <-- + -->\n" - " %s\n" - " | move right\n" - " v move to next day\n" - " %s\n" - "\n" - " move to next week\n" - " move down\n" - "\nMoreover, while inside the calendar panel, the '%s' key moves\n" - "to the first day of the week, and the '%s' key selects the last day of\n" - "the week.\n"), - keystr[MOVE_UP], keystr[MOVE_LEFT], - keystr[MOVE_RIGHT], keystr[MOVE_DOWN], - keys_action_firstkey(KEY_START_OF_WEEK), - keys_action_firstkey(KEY_END_OF_WEEK)); - - hscr[HELP_VIEW].title = _("View\n"); - snprintf(hscr[HELP_VIEW].text, HELPTEXTSIZ, - _ - ("View the item you select in either the Todo or Appointment panel.\n" - "\nThis is usefull when an event description is longer than the " - "available\nspace to display it. " - "If that is the case, the description will be\n" - "shortened and its end replaced by '...'. To be able to read the entire\n" - "description, just press '%s' and a popup window will appear, containing\n" - "the whole event.\n" - "\nPress any key to close the popup window and go back to the main\n" - "Calcurse screen."), keys_action_firstkey(KEY_VIEW_ITEM)); - - hscr[HELP_PIPE].title = _("Pipe\n"); - snprintf(hscr[HELP_PIPE].text, HELPTEXTSIZ, - _("Pipe the selected item to an external program.\n" - "\nPress the '%s' key to pipe the currently selected appointment or\n" - "todo entry to an external program.\n" - "\nYou will be driven back to calcurse as soon as the program exits.\n"), - keys_action_firstkey(KEY_PIPE_ITEM)); - - hscr[HELP_TAB].title = _("Tab\n"); - snprintf(hscr[HELP_TAB].text, HELPTEXTSIZ, - _("Switch between panels.\n" - "The panel currently in use has its border colorized.\n" - "\nSome actions are possible only if the right panel is selected.\n" - "For example, if you want to add a task in the TODO list, you need first" - "\nto press the '%s' key to get the TODO panel selected. Then you can\n" - "press '%s' to add your item.\n" - "\nNotice that at the bottom of the screen the list of possible actions\n" - "change while pressing '%s', so you always know what action can be\n" - "performed on the selected panel."), - keys_action_firstkey(KEY_GENERIC_CHANGE_VIEW), - keys_action_firstkey(KEY_ADD_ITEM), - keys_action_firstkey(KEY_GENERIC_CHANGE_VIEW)); - - hscr[HELP_GOTO].title = _("Goto\n"); - snprintf(hscr[HELP_GOTO].text, HELPTEXTSIZ, - _("Jump to a specific day in the calendar.\n" - "\nUsing this command, you do not need to travel to that day using\n" - "the displacement keys inside the calendar panel.\n" - "If you hit [ENTER] without specifying any date, Calcurse checks the\n" - "system current date and you will be taken to that date.\n" - "\nNotice that pressing '%s', whatever panel is\n" - "selected, will select current day in the calendar."), - keys_action_firstkey(KEY_GENERIC_GOTO_TODAY)); - - hscr[HELP_DELETE].title = _("Delete\n"); - snprintf(hscr[HELP_DELETE].text, HELPTEXTSIZ, - _("Delete an element in the ToDo or Appointment list.\n" - "\nDepending on which panel is selected when you press the delete key,\n" - "the hilighted item of either the ToDo or Appointment list will be \n" - "removed from this list.\n" - "\nIf the item to be deleted is recurrent, you will be asked if you\n" - "wish to suppress all of the item occurences or just the one you\n" - "selected.\n" - "\nIf the general option 'confirm_delete' is set to 'YES', then you will" - "\nbe asked for confirmation before deleting the selected event.\n" - "Do not forget to save the calendar data to retrieve the modifications\n" - "next time you launch Calcurse.")); - - hscr[HELP_ADD].title = _("Add\n"); - snprintf(hscr[HELP_ADD].text, HELPTEXTSIZ, - _ - ("Add an item in either the ToDo or Appointment list, depending on which\n" - "panel is selected when you press '%s'.\n" - "\nTo enter a new item in the TODO list, you will need first to enter the" - "\ndescription of this new item. Then you will be asked to specify the " - "todo\npriority. This priority is represented by a number going from 9 " - "for the\nlowest priority, to 1 for the highest one. It is still " - "possible to\nchange the item priority afterwards, by using the '%s' and " - "'%s' keys\ninside the todo panel.\n" - "\nIf the APPOINTMENT panel is selected while pressing '%s', you will be\n" - "able to enter either a new appointment or a new all-day long event.\n" - "To enter a new event, press [ENTER] instead of the item start time, " - "and\njust fill in the event description.\n" - "To enter a new appointment to be added in the APPOINTMENT list, you\n" - "will need to enter successively the time at which the appointment\n" - "begins, the appointment length (either by specifying the end time in\n" - "[hh:mm] or the duration in [+hh:mm], [+xxdxxhxxm] or [+mm] format), \n" - "and the description of the event.\n" - "\nThe day at which occurs the event or appointment is the day currently" - "\nselected in the calendar, so you need to move to the desired day " - "before\npressing '%s'.\n" "\nNotes:\n" - " o if an appointment lasts for such a long time that it continues\n" - " on the next days, this event will be indicated on all the\n" - " corresponding days, and the beginning or ending hour will be\n" - " replaced by '..' if the event does not begin or end on the day.\n" - " o if you only press [ENTER] at the APPOINTMENT or TODO event\n" - " description prompt, without any description, no item will be\n" - " added.\n" - " o do not forget to save the calendar data to retrieve the new\n" - " event next time you launch Calcurse."), - keys_action_firstkey(KEY_ADD_ITEM), - keys_action_firstkey(KEY_RAISE_PRIORITY), - keys_action_firstkey(KEY_LOWER_PRIORITY), - keys_action_firstkey(KEY_ADD_ITEM), - keys_action_firstkey(KEY_ADD_ITEM)); - - hscr[HELP_COPY_PASTE].title = _("Copy and Paste\n"); - snprintf(hscr[HELP_COPY_PASTE].text, HELPTEXTSIZ, - _ - ( - "Copy and paste the currently selected item. This is useful to quickly\n" - "copy an item from one date to another. To do so, one must first\n" - "highlight the item that needs to be copied, then press '%s' to copy.\n" - "Once the new date is chosen in the calendar, the appointment panel must\n" - "be selected and the '%s' key must be pressed to paste the item. The item\n" - "will appear in the appointment panel, assigned to the newly selected\n" - "date.\n\n"), - keys_action_firstkey(KEY_GENERIC_COPY), - keys_action_firstkey(KEY_GENERIC_PASTE)); - - hscr[HELP_EDIT].title = _("Edit Item\n"); - snprintf(hscr[HELP_EDIT].text, HELPTEXTSIZ, - _("Edit the item which is currently selected.\n" - "Depending on the item type (appointment, event, or todo), and if it is\n" - "repeated or not, you will be asked to choose one of the item properties" - "\nto modify. An item property is one of the following: the start time, " - "the\nend time, the description, or the item repetition.\n" - "Once you have chosen the property you want to modify, you will be shown" - "\nits actual value, and you will be able to change it as you like.\n" - "\nNotes:\n" - " o if you choose to edit the item repetition properties, you will\n" - " be asked to re-enter all of the repetition characteristics\n" - " (repetition type, frequence, and ending date). Moreover, the\n" - " previous data concerning the deleted occurences will be lost.\n" - " o do not forget to save the calendar data to retrieve the\n" - " modified properties next time you launch Calcurse.")); - - hscr[HELP_ENOTE].title = _("EditNote\n"); - snprintf(hscr[HELP_ENOTE].text, HELPTEXTSIZ, - _ - ("Attach a note to any type of item, or edit an already existing note.\n" - "This feature is useful if you do not have enough space to store all\n" - "of your item description, or if you would like to add sub-tasks to an\n" - "already existing todo item for example.\n" - "Before pressing the '%s' key, you first need to highlight the item you\n" - "want the note to be attached to. Then you will be driven to an\n" - "external editor to edit your note. This editor is chosen the following\n" - "way:\n" - " o if the 'VISUAL' environment variable is set, then this will be\n" - " the default editor to be called.\n" - " o if 'VISUAL' is not set, then the 'EDITOR' environment variable\n" - " will be used as the default editor.\n" - " o if none of the above environment variables is set, then\n" - " '/usr/bin/vi' will be used.\n" - "\nOnce the item note is edited and saved, quit your favorite editor.\n" - "You will then go back to Calcurse, and the '>' sign will appear in front" - "\nof the highlighted item, meaning there is a note attached to it."), - keys_action_firstkey(KEY_EDIT_NOTE)); - - hscr[HELP_VNOTE].title = _("ViewNote\n"); - snprintf(hscr[HELP_VNOTE].text, HELPTEXTSIZ, - _ - ("View a note which was previously attached to an item (an item which\n" - "owns a note has a '>' sign in front of it).\n" - "This command only permits to view the note, not to edit it (to do so,\n" - "use the 'EditNote' command, by pressing the '%s' key).\n" - "Once you highlighted an item with a note attached to it, and the '%s' key" - "\nwas pressed, you will be driven to an external pager to view that " - "note.\n" "The default pager is chosen the following way:\n" - " o if the 'PAGER' environment variable is set, then this will be\n" - " the default viewer to be called.\n" - " o if the above environment variable is not set, then\n" - " '/usr/bin/less' will be used.\n" - "As for editing a note, quit the pager and you will be driven back to\n" - "Calcurse."), keys_action_firstkey(KEY_EDIT_NOTE), - keys_action_firstkey(KEY_VIEW_NOTE)); - - hscr[HELP_PRIORITY].title = _("Priority\n"); - snprintf(hscr[HELP_PRIORITY].text, HELPTEXTSIZ, - _ - ("Change the priority of the currently selected item in the ToDo list.\n" - "Priorities are represented by the number appearing in front of the\n" - "todo description. This number goes from 9 for the lowest priority to\n" - "1 for the highest priority.\n" - "Todo having higher priorities are placed first (at the top) inside the\n" - "todo panel.\n\n" - "If you want to raise the priority of a todo item, you need to press " - "'%s'.\n" - "In doing so, the number in front of this item will decrease, " - "meaning its\npriority increases. The item position inside the todo " - "panel may change,\ndepending on the priority of the items above it.\n\n" - "At the opposite, to lower a todo priority, press '%s'. The todo position" - "\nmay also change depending on the priority of the items below."), - keys_action_firstkey(KEY_RAISE_PRIORITY), - keys_action_firstkey(KEY_LOWER_PRIORITY)); - - hscr[HELP_REPEAT].title = _("Repeat\n"); - snprintf(hscr[HELP_REPEAT].text, HELPTEXTSIZ, - _("Repeat an event or an appointment.\n" - "You must first select the item to be repeated by moving inside the\n" - "appointment panel. Then pressing '%s' will lead you to a set of three\n" - "questions, with which you will be able to specify the repetition\n" - "characteristics:\n\n" - " o type: you can choose between a daily, weekly, monthly or\n" - " yearly repetition by pressing 'D', 'W', 'M' or 'Y'\n" - " respectively.\n\n" - " o frequence: this indicates how often the item shall be repeated.\n" - " For example, if you want to remember an anniversary,\n" - " choose a 'yearly' repetition with a frequence of '1',\n" - " which means it must be repeated every year. Another\n" - " example: if you go to the restaurant every two days,\n" - " choose a 'daily' repetition with a frequence of '2'.\n\n" - " o ending date: this specifies when to stop repeating the selected\n" - " event or appointment. To indicate an endless \n" - " repetition, enter '0' and the item will be repeated\n" - " forever.\n" "\nNotes:\n" - " o repeated items are marked with an '*' inside the appointment\n" - " panel, to be easily recognizable from non-repeated ones.\n" - " o the 'Repeat' and 'Delete' command can be mixed to create\n" - " complicated configurations, as it is possible to delete only\n" - " one occurence of a repeated item."), - keys_action_firstkey(KEY_REPEAT_ITEM)); - - hscr[HELP_FLAG].title = _("Flag Item\n"); - snprintf(hscr[HELP_FLAG].text, HELPTEXTSIZ, - _ - ("Toggle an appointment's 'important' flag or a todo's 'completed' flag.\n" - "If a todo is flagged as completed, its priority number will be replaced\n" - "by an 'X' sign. Completed tasks will no longer appear in exported data\n" - "or when using the '-t' command line flag (unless specifying '0' as the\n" - "priority number, in which case only completed tasks will be shown).\n\n" - "If an appointment is flagged as important, an exclamation mark appears\n" - "in front of it, and you will be warned if time gets closed to the\n" - "appointment start time.\n" - "To customize the way one gets notified, the configuration submenu lets\n" - "you choose the command launched to warn user of an upcoming appointment," - "\nand how long before it he gets notified.")); - - hscr[HELP_CONFIG].title = _("Config\n"); - snprintf(hscr[HELP_CONFIG].text, HELPTEXTSIZ, - _("Open the configuration submenu.\n" - "From this submenu, you can select between color, layout, notification\n" - "and general options, and you can also configure your keybindings.\n" - "\nThe color submenu lets you choose the color theme.\n" - "The layout submenu lets you choose the Calcurse screen layout, in other" - "\nwords where to place the three different panels on the screen.\n" - "The general options submenu brings a screen with the different options" - "\nwhich modifies the way Calcurse interacts with the user.\n" - "The notify submenu allows you to change the notify-bar settings.\n" - "The keys submenu lets you define your own key bindings.\n" - "\nDo not forget to save the calendar data to retrieve your configuration" - "\nnext time you launch Calcurse.")); - - hscr[HELP_GENERAL].title = _("Generic keybindings\n"); - snprintf(hscr[HELP_GENERAL].text, HELPTEXTSIZ, - _ - ("Some of the keybindings apply whatever panel is selected. They are\n" - "called generic keybinding.\n" - "Here is the list of all the generic key bindings, together with their\n" - "corresponding action:\n\n" - " '%s' : Redraw function -> redraws calcurse panels, this is useful if\n" - " you resize your terminal screen or when\n" - " garbage appears inside the display\n" - " '%s' : Add Appointment -> add an appointment or an event\n" - " '%s' : Add ToDo -> add a todo\n" - " '%s' : -1 Day -> move to previous day\n" - " '%s' : +1 Day -> move to next day\n" - " '%s' : -1 Week -> move to previous week\n" - " '%s' : +1 Week -> move to next week\n" - " '%s' : -1 Month -> move to previous month\n" - " '%s' : +1 Month -> move to next month\n" - " '%s' : -1 Year -> move to previous year\n" - " '%s' : +1 Year -> move to next year\n" - " '%s' : Goto today -> move to current day\n" - "\nThe '%s' and '%s' keys are used to scroll text upward or downward\n" - "when inside specific screens such the help screens for example.\n" - "They are also used when the calendar screen is selected to switch\n" - "between the available views (monthly and weekly calendar views)."), - keys_action_firstkey(KEY_GENERIC_REDRAW), - keys_action_firstkey(KEY_GENERIC_ADD_APPT), - keys_action_firstkey(KEY_GENERIC_ADD_TODO), - keys_action_firstkey(KEY_GENERIC_PREV_DAY), - keys_action_firstkey(KEY_GENERIC_NEXT_DAY), - keys_action_firstkey(KEY_GENERIC_PREV_WEEK), - keys_action_firstkey(KEY_GENERIC_NEXT_WEEK), - keys_action_firstkey(KEY_GENERIC_PREV_MONTH), - keys_action_firstkey(KEY_GENERIC_NEXT_MONTH), - keys_action_firstkey(KEY_GENERIC_PREV_YEAR), - keys_action_firstkey(KEY_GENERIC_NEXT_YEAR), - keys_action_firstkey(KEY_GENERIC_GOTO_TODAY), - keys_action_firstkey(KEY_GENERIC_SCROLL_UP), - keys_action_firstkey(KEY_GENERIC_SCROLL_DOWN)); - - hscr[HELP_OTHER].title = _("OtherCmd\n"); - snprintf(hscr[HELP_OTHER].text, HELPTEXTSIZ, - _("Switch between status bar help pages.\n" - "Because the terminal screen is too narrow to display all of the\n" - "available commands, you need to press '%s' to see the next set of\n" - "commands together with their keybindings.\n" - "Once the last status bar page is reached, pressing '%s' another time\n" - "leads you back to the first page."), - keys_action_firstkey(KEY_GENERIC_OTHER_CMD), - keys_action_firstkey(KEY_GENERIC_OTHER_CMD)); - - hscr[HELP_CREDITS].title = _("Calcurse - text-based organizer"); - snprintf(hscr[HELP_CREDITS].text, HELPTEXTSIZ, - _("\nCopyright (c) 2004-2013 calcurse Development Team\n" - "All rights reserved.\n" - "\n" - "Redistribution and use in source and binary forms, with or without\n" - "modification, are permitted provided that the following conditions\n" - "are met:\n" - "\n" - "\t- Redistributions of source code must retain the above\n" - "\t copyright notice, this list of conditions and the\n" - "\t following disclaimer.\n" - "\n" - "\t- Redistributions in binary form must reproduce the above\n" - "\t copyright notice, this list of conditions and the\n" - "\t following disclaimer in the documentation and/or other\n" - "\t materials provided with the distribution.\n" - "\n\n" - "Send your feedback or comments to : misc@calcurse.org\n" - "Calcurse home page : http://calcurse.org")); - - help_wins_init(&hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col); - oldpage = HELP_MAIN; - need_resize = 0; - - /* Display the help screen related to user input. */ - while (ch != KEY_GENERIC_QUIT) { - erase_window_part(hwin.win.p, 1, hwin.pad.y, col - 2, hwin.win.h - 2); - - switch (ch) { - case KEY_GENERIC_SCROLL_DOWN: - wins_scrollwin_down(&hwin, 1); - break; - - case KEY_GENERIC_SCROLL_UP: - wins_scrollwin_up(&hwin, 1); - break; - - default: - page = wanted_page(ch); - if (page != NOPAGE) { - hwin.first_visible_line = 0; - hwin.total_lines = help_write_pad(&hwin.pad, hscr[page].title, - hscr[page].text, ch); - oldpage = page; - } - } - - if (resize) { - resize = 0; - wins_get_config(); - help_wins_reset(&hwin); - hwin.first_visible_line = 0; - hwin.total_lines = help_write_pad(&hwin.pad, hscr[oldpage].title, - hscr[oldpage].text, ch); - need_resize = 1; - } - - wins_scrollwin_display(&hwin); - ch = keys_getch(win[KEY].p, NULL, NULL); - } - wins_scrollwin_delete(&hwin); - if (need_resize) - wins_reset(); + enum { + MOVE_UP, + MOVE_DOWN, + MOVE_LEFT, + MOVE_RIGHT, + DIRECTIONS + }; + struct scrollwin hwin; + int need_resize; + enum key ch = KEY_GENERIC_HELP; + int page, oldpage; + help_page_t hscr[HELPSCREENS]; + char keystr[DIRECTIONS][BUFSIZ]; + + hscr[HELP_MAIN].title = + _(" Welcome to Calcurse. This is the main help screen.\n"); + snprintf(hscr[HELP_MAIN].text, HELPTEXTSIZ, + _("Moving around: Press '%s' or '%s' to scroll text upward or downward\n" + " inside help screens, if necessary.\n\n" + " Exit help: When finished, press '%s' to exit help and go back to\n" + " the main Calcurse screen.\n\n" + " Help topic: At the bottom of this screen you can see a panel with\n" + " different fields, represented by a letter and a short\n" + " title. This panel contains all the available actions\n" + " you can perform when using Calcurse.\n" + " By pressing one of the letters appearing in this\n" + " panel, you will be shown a short description of the\n" + " corresponding action. At the top right side of the\n" + " description screen are indicated the user-defined key\n" + " bindings that lead to the action.\n\n" + " Credits: Press '%s' for credits."), + keys_action_firstkey(KEY_GENERIC_SCROLL_UP), + keys_action_firstkey(KEY_GENERIC_SCROLL_DOWN), + keys_action_firstkey(KEY_GENERIC_QUIT), + keys_action_firstkey(KEY_GENERIC_CREDITS)); + + hscr[HELP_SAVE].title = _("Save\n"); + snprintf(hscr[HELP_SAVE].text, HELPTEXTSIZ, + _("Save calcurse data.\n" + "Data are splitted into four different files which contain :" + "\n\n" + " / ~/.calcurse/conf -> user configuration\n" + " | (layout, color, general options)\n" + " | ~/.calcurse/apts -> data related to the appointments\n" + " | ~/.calcurse/todo -> data related to the todo list\n" + " \\ ~/.calcurse/keys -> user-defined key bindings\n" + "\nIn the config menu, you can choose to save the Calcurse data\n" + "automatically before quitting.")); + + hscr[HELP_IMPORT].title = _("Import\n"); + snprintf(hscr[HELP_IMPORT].text, HELPTEXTSIZ, + _("Import data from an icalendar file.\n" + "You will be asked to enter the file name from which to load ical\n" + "items. At the end of the import process, and if the general option\n" + "'system_dialogs' is set to 'yes', a report indicating how many items\n" + "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"); + snprintf(hscr[HELP_EXPORT].text, HELPTEXTSIZ, + _("Export calcurse data (appointments, events and todos).\n" + "This leads to the export submenu, from which you can choose between\n" + "two different export formats: 'ical' and 'pcal'. Choosing one of\n" + "those formats lets you export calcurse data to icalendar or pcal\n" + "format.\n\n" + "You first need to specify the file to which the data will be exported.\n" + "By default, this file is:\n\n" " ~/calcurse.ics\n\n" + "for an ical export, and:\n\n" " ~/calcurse.txt\n\n" + "for a pcal export.\n\n" + "Calcurse data are exported in the following order:\n" + " events, appointments, todos.\n")); + + strncpy(keystr[MOVE_UP], keys_action_allkeys(KEY_MOVE_UP), BUFSIZ); + strncpy(keystr[MOVE_DOWN], keys_action_allkeys(KEY_MOVE_DOWN), + BUFSIZ); + strncpy(keystr[MOVE_LEFT], keys_action_allkeys(KEY_MOVE_LEFT), + BUFSIZ); + strncpy(keystr[MOVE_RIGHT], keys_action_allkeys(KEY_MOVE_RIGHT), + BUFSIZ); + hscr[HELP_DISPLACEMENT].title = _("Displacement keys\n"); + snprintf(hscr[HELP_DISPLACEMENT].text, HELPTEXTSIZ, + _("Move around inside calcurse screens.\n" + "The following scheme summarizes how to get around:\n\n" + " move up\n" + " move to previous week\n" + "\n" + " %s\n" + " move left ^ \n" + " move to previous day |\n" + " %s\n" + " <-- + -->\n" + " %s\n" + " | move right\n" + " v move to next day\n" + " %s\n" + "\n" + " move to next week\n" + " move down\n" + "\nMoreover, while inside the calendar panel, the '%s' key moves\n" + "to the first day of the week, and the '%s' key selects the last day of\n" + "the week.\n"), + keystr[MOVE_UP], keystr[MOVE_LEFT], + keystr[MOVE_RIGHT], keystr[MOVE_DOWN], + keys_action_firstkey(KEY_START_OF_WEEK), + keys_action_firstkey(KEY_END_OF_WEEK)); + + hscr[HELP_VIEW].title = _("View\n"); + snprintf(hscr[HELP_VIEW].text, HELPTEXTSIZ, + _("View the item you select in either the Todo or Appointment panel.\n" + "\nThis is usefull when an event description is longer than the " + "available\nspace to display it. " + "If that is the case, the description will be\n" + "shortened and its end replaced by '...'. To be able to read the entire\n" + "description, just press '%s' and a popup window will appear, containing\n" + "the whole event.\n" + "\nPress any key to close the popup window and go back to the main\n" + "Calcurse screen."), + keys_action_firstkey(KEY_VIEW_ITEM)); + + hscr[HELP_PIPE].title = _("Pipe\n"); + snprintf(hscr[HELP_PIPE].text, HELPTEXTSIZ, + _("Pipe the selected item to an external program.\n" + "\nPress the '%s' key to pipe the currently selected appointment or\n" + "todo entry to an external program.\n" + "\nYou will be driven back to calcurse as soon as the program exits.\n"), + keys_action_firstkey(KEY_PIPE_ITEM)); + + hscr[HELP_TAB].title = _("Tab\n"); + snprintf(hscr[HELP_TAB].text, HELPTEXTSIZ, + _("Switch between panels.\n" + "The panel currently in use has its border colorized.\n" + "\nSome actions are possible only if the right panel is selected.\n" + "For example, if you want to add a task in the TODO list, you need first" + "\nto press the '%s' key to get the TODO panel selected. Then you can\n" + "press '%s' to add your item.\n" + "\nNotice that at the bottom of the screen the list of possible actions\n" + "change while pressing '%s', so you always know what action can be\n" + "performed on the selected panel."), + keys_action_firstkey(KEY_GENERIC_CHANGE_VIEW), + keys_action_firstkey(KEY_ADD_ITEM), + keys_action_firstkey(KEY_GENERIC_CHANGE_VIEW)); + + hscr[HELP_GOTO].title = _("Goto\n"); + snprintf(hscr[HELP_GOTO].text, HELPTEXTSIZ, + _("Jump to a specific day in the calendar.\n" + "\nUsing this command, you do not need to travel to that day using\n" + "the displacement keys inside the calendar panel.\n" + "If you hit [ENTER] without specifying any date, Calcurse checks the\n" + "system current date and you will be taken to that date.\n" + "\nNotice that pressing '%s', whatever panel is\n" + "selected, will select current day in the calendar."), + keys_action_firstkey(KEY_GENERIC_GOTO_TODAY)); + + hscr[HELP_DELETE].title = _("Delete\n"); + snprintf(hscr[HELP_DELETE].text, HELPTEXTSIZ, + _("Delete an element in the ToDo or Appointment list.\n" + "\nDepending on which panel is selected when you press the delete key,\n" + "the hilighted item of either the ToDo or Appointment list will be \n" + "removed from this list.\n" + "\nIf the item to be deleted is recurrent, you will be asked if you\n" + "wish to suppress all of the item occurences or just the one you\n" + "selected.\n" + "\nIf the general option 'confirm_delete' is set to 'YES', then you will" + "\nbe asked for confirmation before deleting the selected event.\n" + "Do not forget to save the calendar data to retrieve the modifications\n" + "next time you launch Calcurse.")); + + hscr[HELP_ADD].title = _("Add\n"); + snprintf(hscr[HELP_ADD].text, HELPTEXTSIZ, + _("Add an item in either the ToDo or Appointment list, depending on which\n" + "panel is selected when you press '%s'.\n" + "\nTo enter a new item in the TODO list, you will need first to enter the" + "\ndescription of this new item. Then you will be asked to specify the " + "todo\npriority. This priority is represented by a number going from 9 " + "for the\nlowest priority, to 1 for the highest one. It is still " + "possible to\nchange the item priority afterwards, by using the '%s' and " + "'%s' keys\ninside the todo panel.\n" + "\nIf the APPOINTMENT panel is selected while pressing '%s', you will be\n" + "able to enter either a new appointment or a new all-day long event.\n" + "To enter a new event, press [ENTER] instead of the item start time, " + "and\njust fill in the event description.\n" + "To enter a new appointment to be added in the APPOINTMENT list, you\n" + "will need to enter successively the time at which the appointment\n" + "begins, the appointment length (either by specifying the end time in\n" + "[hh:mm] or the duration in [+hh:mm], [+xxdxxhxxm] or [+mm] format), \n" + "and the description of the event.\n" + "\nThe day at which occurs the event or appointment is the day currently" + "\nselected in the calendar, so you need to move to the desired day " + "before\npressing '%s'.\n" "\nNotes:\n" + " o if an appointment lasts for such a long time that it continues\n" + " on the next days, this event will be indicated on all the\n" + " corresponding days, and the beginning or ending hour will be\n" + " replaced by '..' if the event does not begin or end on the day.\n" + " o if you only press [ENTER] at the APPOINTMENT or TODO event\n" + " description prompt, without any description, no item will be\n" + " added.\n" + " o do not forget to save the calendar data to retrieve the new\n" + " event next time you launch Calcurse."), + keys_action_firstkey(KEY_ADD_ITEM), + keys_action_firstkey(KEY_RAISE_PRIORITY), + keys_action_firstkey(KEY_LOWER_PRIORITY), + keys_action_firstkey(KEY_ADD_ITEM), + keys_action_firstkey(KEY_ADD_ITEM)); + + hscr[HELP_COPY_PASTE].title = _("Copy and Paste\n"); + snprintf(hscr[HELP_COPY_PASTE].text, HELPTEXTSIZ, + _("Copy and paste the currently selected item. This is useful to quickly\n" + "copy an item from one date to another. To do so, one must first\n" + "highlight the item that needs to be copied, then press '%s' to copy.\n" + "Once the new date is chosen in the calendar, the appointment panel must\n" + "be selected and the '%s' key must be pressed to paste the item. The item\n" + "will appear in the appointment panel, assigned to the newly selected\n" + "date.\n\n"), + keys_action_firstkey(KEY_GENERIC_COPY), + keys_action_firstkey(KEY_GENERIC_PASTE)); + + hscr[HELP_EDIT].title = _("Edit Item\n"); + snprintf(hscr[HELP_EDIT].text, HELPTEXTSIZ, + _("Edit the item which is currently selected.\n" + "Depending on the item type (appointment, event, or todo), and if it is\n" + "repeated or not, you will be asked to choose one of the item properties" + "\nto modify. An item property is one of the following: the start time, " + "the\nend time, the description, or the item repetition.\n" + "Once you have chosen the property you want to modify, you will be shown" + "\nits actual value, and you will be able to change it as you like.\n" + "\nNotes:\n" + " o if you choose to edit the item repetition properties, you will\n" + " be asked to re-enter all of the repetition characteristics\n" + " (repetition type, frequence, and ending date). Moreover, the\n" + " previous data concerning the deleted occurences will be lost.\n" + " o do not forget to save the calendar data to retrieve the\n" + " modified properties next time you launch Calcurse.")); + + hscr[HELP_ENOTE].title = _("EditNote\n"); + snprintf(hscr[HELP_ENOTE].text, HELPTEXTSIZ, + _("Attach a note to any type of item, or edit an already existing note.\n" + "This feature is useful if you do not have enough space to store all\n" + "of your item description, or if you would like to add sub-tasks to an\n" + "already existing todo item for example.\n" + "Before pressing the '%s' key, you first need to highlight the item you\n" + "want the note to be attached to. Then you will be driven to an\n" + "external editor to edit your note. This editor is chosen the following\n" + "way:\n" + " o if the 'VISUAL' environment variable is set, then this will be\n" + " the default editor to be called.\n" + " o if 'VISUAL' is not set, then the 'EDITOR' environment variable\n" + " will be used as the default editor.\n" + " o if none of the above environment variables is set, then\n" + " '/usr/bin/vi' will be used.\n" + "\nOnce the item note is edited and saved, quit your favorite editor.\n" + "You will then go back to Calcurse, and the '>' sign will appear in front" + "\nof the highlighted item, meaning there is a note attached to it."), + keys_action_firstkey(KEY_EDIT_NOTE)); + + hscr[HELP_VNOTE].title = _("ViewNote\n"); + snprintf(hscr[HELP_VNOTE].text, HELPTEXTSIZ, + _("View a note which was previously attached to an item (an item which\n" + "owns a note has a '>' sign in front of it).\n" + "This command only permits to view the note, not to edit it (to do so,\n" + "use the 'EditNote' command, by pressing the '%s' key).\n" + "Once you highlighted an item with a note attached to it, and the '%s' key" + "\nwas pressed, you will be driven to an external pager to view that " + "note.\n" + "The default pager is chosen the following way:\n" + " o if the 'PAGER' environment variable is set, then this will be\n" + " the default viewer to be called.\n" + " o if the above environment variable is not set, then\n" + " '/usr/bin/less' will be used.\n" + "As for editing a note, quit the pager and you will be driven back to\n" + "Calcurse."), keys_action_firstkey(KEY_EDIT_NOTE), + keys_action_firstkey(KEY_VIEW_NOTE)); + + hscr[HELP_PRIORITY].title = _("Priority\n"); + snprintf(hscr[HELP_PRIORITY].text, HELPTEXTSIZ, + _("Change the priority of the currently selected item in the ToDo list.\n" + "Priorities are represented by the number appearing in front of the\n" + "todo description. This number goes from 9 for the lowest priority to\n" + "1 for the highest priority.\n" + "Todo having higher priorities are placed first (at the top) inside the\n" + "todo panel.\n\n" + "If you want to raise the priority of a todo item, you need to press " + "'%s'.\n" + "In doing so, the number in front of this item will decrease, " + "meaning its\npriority increases. The item position inside the todo " + "panel may change,\ndepending on the priority of the items above it.\n\n" + "At the opposite, to lower a todo priority, press '%s'. The todo position" + "\nmay also change depending on the priority of the items below."), + keys_action_firstkey(KEY_RAISE_PRIORITY), + keys_action_firstkey(KEY_LOWER_PRIORITY)); + + hscr[HELP_REPEAT].title = _("Repeat\n"); + snprintf(hscr[HELP_REPEAT].text, HELPTEXTSIZ, + _("Repeat an event or an appointment.\n" + "You must first select the item to be repeated by moving inside the\n" + "appointment panel. Then pressing '%s' will lead you to a set of three\n" + "questions, with which you will be able to specify the repetition\n" + "characteristics:\n\n" + " o type: you can choose between a daily, weekly, monthly or\n" + " yearly repetition by pressing 'D', 'W', 'M' or 'Y'\n" + " respectively.\n\n" + " o frequence: this indicates how often the item shall be repeated.\n" + " For example, if you want to remember an anniversary,\n" + " choose a 'yearly' repetition with a frequence of '1',\n" + " which means it must be repeated every year. Another\n" + " example: if you go to the restaurant every two days,\n" + " choose a 'daily' repetition with a frequence of '2'.\n\n" + " o ending date: this specifies when to stop repeating the selected\n" + " event or appointment. To indicate an endless \n" + " repetition, enter '0' and the item will be repeated\n" + " forever.\n" "\nNotes:\n" + " o repeated items are marked with an '*' inside the appointment\n" + " panel, to be easily recognizable from non-repeated ones.\n" + " o the 'Repeat' and 'Delete' command can be mixed to create\n" + " complicated configurations, as it is possible to delete only\n" + " one occurence of a repeated item."), + keys_action_firstkey(KEY_REPEAT_ITEM)); + + hscr[HELP_FLAG].title = _("Flag Item\n"); + snprintf(hscr[HELP_FLAG].text, HELPTEXTSIZ, + _("Toggle an appointment's 'important' flag or a todo's 'completed' flag.\n" + "If a todo is flagged as completed, its priority number will be replaced\n" + "by an 'X' sign. Completed tasks will no longer appear in exported data\n" + "or when using the '-t' command line flag (unless specifying '0' as the\n" + "priority number, in which case only completed tasks will be shown).\n\n" + "If an appointment is flagged as important, an exclamation mark appears\n" + "in front of it, and you will be warned if time gets closed to the\n" + "appointment start time.\n" + "To customize the way one gets notified, the configuration submenu lets\n" + "you choose the command launched to warn user of an upcoming appointment," + "\nand how long before it he gets notified.")); + + hscr[HELP_CONFIG].title = _("Config\n"); + snprintf(hscr[HELP_CONFIG].text, HELPTEXTSIZ, + _("Open the configuration submenu.\n" + "From this submenu, you can select between color, layout, notification\n" + "and general options, and you can also configure your keybindings.\n" + "\nThe color submenu lets you choose the color theme.\n" + "The layout submenu lets you choose the Calcurse screen layout, in other" + "\nwords where to place the three different panels on the screen.\n" + "The general options submenu brings a screen with the different options" + "\nwhich modifies the way Calcurse interacts with the user.\n" + "The notify submenu allows you to change the notify-bar settings.\n" + "The keys submenu lets you define your own key bindings.\n" + "\nDo not forget to save the calendar data to retrieve your configuration" + "\nnext time you launch Calcurse.")); + + hscr[HELP_GENERAL].title = _("Generic keybindings\n"); + snprintf(hscr[HELP_GENERAL].text, HELPTEXTSIZ, + _("Some of the keybindings apply whatever panel is selected. They are\n" + "called generic keybinding.\n" + "Here is the list of all the generic key bindings, together with their\n" + "corresponding action:\n\n" + " '%s' : Redraw function -> redraws calcurse panels, this is useful if\n" + " you resize your terminal screen or when\n" + " garbage appears inside the display\n" + " '%s' : Add Appointment -> add an appointment or an event\n" + " '%s' : Add ToDo -> add a todo\n" + " '%s' : -1 Day -> move to previous day\n" + " '%s' : +1 Day -> move to next day\n" + " '%s' : -1 Week -> move to previous week\n" + " '%s' : +1 Week -> move to next week\n" + " '%s' : -1 Month -> move to previous month\n" + " '%s' : +1 Month -> move to next month\n" + " '%s' : -1 Year -> move to previous year\n" + " '%s' : +1 Year -> move to next year\n" + " '%s' : Goto today -> move to current day\n" + "\nThe '%s' and '%s' keys are used to scroll text upward or downward\n" + "when inside specific screens such the help screens for example.\n" + "They are also used when the calendar screen is selected to switch\n" + "between the available views (monthly and weekly calendar views)."), + keys_action_firstkey(KEY_GENERIC_REDRAW), + keys_action_firstkey(KEY_GENERIC_ADD_APPT), + keys_action_firstkey(KEY_GENERIC_ADD_TODO), + keys_action_firstkey(KEY_GENERIC_PREV_DAY), + keys_action_firstkey(KEY_GENERIC_NEXT_DAY), + keys_action_firstkey(KEY_GENERIC_PREV_WEEK), + keys_action_firstkey(KEY_GENERIC_NEXT_WEEK), + keys_action_firstkey(KEY_GENERIC_PREV_MONTH), + keys_action_firstkey(KEY_GENERIC_NEXT_MONTH), + keys_action_firstkey(KEY_GENERIC_PREV_YEAR), + keys_action_firstkey(KEY_GENERIC_NEXT_YEAR), + keys_action_firstkey(KEY_GENERIC_GOTO_TODAY), + keys_action_firstkey(KEY_GENERIC_SCROLL_UP), + keys_action_firstkey(KEY_GENERIC_SCROLL_DOWN)); + + hscr[HELP_OTHER].title = _("OtherCmd\n"); + snprintf(hscr[HELP_OTHER].text, HELPTEXTSIZ, + _("Switch between status bar help pages.\n" + "Because the terminal screen is too narrow to display all of the\n" + "available commands, you need to press '%s' to see the next set of\n" + "commands together with their keybindings.\n" + "Once the last status bar page is reached, pressing '%s' another time\n" + "leads you back to the first page."), + keys_action_firstkey(KEY_GENERIC_OTHER_CMD), + keys_action_firstkey(KEY_GENERIC_OTHER_CMD)); + + hscr[HELP_CREDITS].title = _("Calcurse - text-based organizer"); + snprintf(hscr[HELP_CREDITS].text, HELPTEXTSIZ, + _("\nCopyright (c) 2004-2013 calcurse Development Team\n" + "All rights reserved.\n" + "\n" + "Redistribution and use in source and binary forms, with or without\n" + "modification, are permitted provided that the following conditions\n" + "are met:\n" + "\n" + "\t- Redistributions of source code must retain the above\n" + "\t copyright notice, this list of conditions and the\n" + "\t following disclaimer.\n" + "\n" + "\t- Redistributions in binary form must reproduce the above\n" + "\t copyright notice, this list of conditions and the\n" + "\t following disclaimer in the documentation and/or other\n" + "\t materials provided with the distribution.\n" + "\n\n" + "Send your feedback or comments to : misc@calcurse.org\n" + "Calcurse home page : http://calcurse.org")); + + help_wins_init(&hwin, 0, 0, (notify_bar())? row - 3 : row - 2, + col); + oldpage = HELP_MAIN; + need_resize = 0; + + /* Display the help screen related to user input. */ + while (ch != KEY_GENERIC_QUIT) { + erase_window_part(hwin.win.p, 1, hwin.pad.y, col - 2, + hwin.win.h - 2); + + switch (ch) { + case KEY_GENERIC_SCROLL_DOWN: + wins_scrollwin_down(&hwin, 1); + break; + + case KEY_GENERIC_SCROLL_UP: + wins_scrollwin_up(&hwin, 1); + break; + + default: + page = wanted_page(ch); + if (page != NOPAGE) { + hwin.first_visible_line = 0; + hwin.total_lines = + help_write_pad(&hwin.pad, + hscr[page].title, + hscr[page].text, ch); + oldpage = page; + } + } + + if (resize) { + resize = 0; + wins_get_config(); + help_wins_reset(&hwin); + hwin.first_visible_line = 0; + hwin.total_lines = + help_write_pad(&hwin.pad, hscr[oldpage].title, + hscr[oldpage].text, ch); + need_resize = 1; + } + + wins_scrollwin_display(&hwin); + ch = keys_getch(win[KEY].p, NULL, NULL); + } + wins_scrollwin_delete(&hwin); + if (need_resize) + wins_reset(); } diff --git a/src/htable.h b/src/htable.h index a9317e0..445f6fb 100644 --- a/src/htable.h +++ b/src/htable.h @@ -69,7 +69,7 @@ struct name { \ } #define HTABLE_ENTRY(type) \ -struct type *next /* To build the bucket chain list. */ +struct type *next /* To build the bucket chain list. */ #define HTABLE_SIZE(head) \ (sizeof (*(head)->bkts) ? sizeof ((head)->bkts) / sizeof (*(head)->bkts) : 0) @@ -43,22 +43,22 @@ #define ICALDATETIMEFMT "%Y%m%dT%H%M%S" typedef enum { - ICAL_VEVENT, - ICAL_VTODO, - ICAL_TYPES + ICAL_VEVENT, + ICAL_VTODO, + ICAL_TYPES } ical_types_e; typedef enum { - UNDEFINED, - APPOINTMENT, - EVENT + UNDEFINED, + APPOINTMENT, + EVENT } ical_vevent_e; typedef struct { - enum recur_type type; - int freq; - long until; - unsigned count; + enum recur_type type; + int freq; + long until; + unsigned count; } ical_rpt_t; static void ical_export_header(FILE *); @@ -75,191 +75,198 @@ static const char *ical_recur_type[RECUR_TYPES] = /* iCal alarm notification. */ static void ical_export_valarm(FILE * stream) { - fputs("BEGIN:VALARM\n", stream); - pthread_mutex_lock(&nbar.mutex); - fprintf(stream, "TRIGGER:-P%dS\n", nbar.cntdwn); - pthread_mutex_unlock(&nbar.mutex); - fputs("ACTION:DISPLAY\n", stream); - fputs("END:VALARM\n", stream); + fputs("BEGIN:VALARM\n", stream); + pthread_mutex_lock(&nbar.mutex); + fprintf(stream, "TRIGGER:-P%dS\n", nbar.cntdwn); + pthread_mutex_unlock(&nbar.mutex); + fputs("ACTION:DISPLAY\n", stream); + fputs("END:VALARM\n", stream); } /* Export header. */ static void ical_export_header(FILE * stream) { - fputs("BEGIN:VCALENDAR\n", stream); - fprintf(stream, "PRODID:-//calcurse//NONSGML v%s//EN\n", VERSION); - fputs("VERSION:2.0\n", stream); + fputs("BEGIN:VCALENDAR\n", stream); + fprintf(stream, "PRODID:-//calcurse//NONSGML v%s//EN\n", VERSION); + fputs("VERSION:2.0\n", stream); } /* Export footer. */ static void ical_export_footer(FILE * stream) { - fputs("END:VCALENDAR\n", stream); + fputs("END:VCALENDAR\n", stream); } /* Export recurrent events. */ static void ical_export_recur_events(FILE * stream) { - llist_item_t *i, *j; - char ical_date[BUFSIZ]; - - LLIST_FOREACH(&recur_elist, i) { - struct recur_event *rev = LLIST_GET_DATA(i); - date_sec2date_fmt(rev->day, ICALDATEFMT, ical_date); - fputs("BEGIN:VEVENT\n", stream); - fprintf(stream, "DTSTART:%s\n", ical_date); - fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d", - ical_recur_type[rev->rpt->type], rev->rpt->freq); - - if (rev->rpt->until != 0) { - date_sec2date_fmt(rev->rpt->until, ICALDATEFMT, ical_date); - fprintf(stream, ";UNTIL=%s\n", ical_date); - } else { - fputc('\n', stream); - } - - if (LLIST_FIRST(&rev->exc)) { - fputs("EXDATE:", stream); - LLIST_FOREACH(&rev->exc, j) { - struct excp *exc = LLIST_GET_DATA(j); - date_sec2date_fmt(exc->st, ICALDATEFMT, ical_date); - fprintf(stream, "%s", ical_date); - if (LLIST_NEXT(j)) - fputc(',', stream); - else - fputc('\n', stream); - } - } - - fprintf(stream, "SUMMARY:%s\n", rev->mesg); - fputs("END:VEVENT\n", stream); - } + llist_item_t *i, *j; + char ical_date[BUFSIZ]; + + LLIST_FOREACH(&recur_elist, i) { + struct recur_event *rev = LLIST_GET_DATA(i); + date_sec2date_fmt(rev->day, ICALDATEFMT, ical_date); + fputs("BEGIN:VEVENT\n", stream); + fprintf(stream, "DTSTART:%s\n", ical_date); + fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d", + ical_recur_type[rev->rpt->type], rev->rpt->freq); + + if (rev->rpt->until != 0) { + date_sec2date_fmt(rev->rpt->until, ICALDATEFMT, + ical_date); + fprintf(stream, ";UNTIL=%s\n", ical_date); + } else { + fputc('\n', stream); + } + + if (LLIST_FIRST(&rev->exc)) { + fputs("EXDATE:", stream); + LLIST_FOREACH(&rev->exc, j) { + struct excp *exc = LLIST_GET_DATA(j); + date_sec2date_fmt(exc->st, ICALDATEFMT, + ical_date); + fprintf(stream, "%s", ical_date); + if (LLIST_NEXT(j)) + fputc(',', stream); + else + fputc('\n', stream); + } + } + + fprintf(stream, "SUMMARY:%s\n", rev->mesg); + fputs("END:VEVENT\n", stream); + } } /* Export events. */ static void ical_export_events(FILE * stream) { - llist_item_t *i; - char ical_date[BUFSIZ]; - - LLIST_FOREACH(&eventlist, i) { - struct event *ev = LLIST_TS_GET_DATA(i); - date_sec2date_fmt(ev->day, ICALDATEFMT, ical_date); - fputs("BEGIN:VEVENT\n", stream); - fprintf(stream, "DTSTART:%s\n", ical_date); - fprintf(stream, "SUMMARY:%s\n", ev->mesg); - fputs("END:VEVENT\n", stream); - } + llist_item_t *i; + char ical_date[BUFSIZ]; + + LLIST_FOREACH(&eventlist, i) { + struct event *ev = LLIST_TS_GET_DATA(i); + date_sec2date_fmt(ev->day, ICALDATEFMT, ical_date); + fputs("BEGIN:VEVENT\n", stream); + fprintf(stream, "DTSTART:%s\n", ical_date); + fprintf(stream, "SUMMARY:%s\n", ev->mesg); + fputs("END:VEVENT\n", stream); + } } /* Export recurrent appointments. */ static void ical_export_recur_apoints(FILE * stream) { - llist_item_t *i, *j; - char ical_datetime[BUFSIZ]; - char ical_date[BUFSIZ]; - - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_FOREACH(&recur_alist_p, i) { - struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); - - date_sec2date_fmt(rapt->start, ICALDATETIMEFMT, ical_datetime); - fputs("BEGIN:VEVENT\n", stream); - fprintf(stream, "DTSTART:%s\n", ical_datetime); - fprintf(stream, "DURATION:PT0H0M%ldS\n", rapt->dur); - fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d", - ical_recur_type[rapt->rpt->type], rapt->rpt->freq); - - if (rapt->rpt->until != 0) { - date_sec2date_fmt(rapt->rpt->until + HOURINSEC, ICALDATEFMT, ical_date); - fprintf(stream, ";UNTIL=%s\n", ical_date); - } else { - fputc('\n', stream); - } - - if (LLIST_FIRST(&rapt->exc)) { - fputs("EXDATE:", stream); - LLIST_FOREACH(&rapt->exc, j) { - struct excp *exc = LLIST_GET_DATA(j); - date_sec2date_fmt(exc->st, ICALDATEFMT, ical_date); - fprintf(stream, "%s", ical_date); - if (LLIST_NEXT(j)) - fputc(',', stream); - else - fputc('\n', stream); - } - } - - fprintf(stream, "SUMMARY:%s\n", rapt->mesg); - if (rapt->state & APOINT_NOTIFY) - ical_export_valarm(stream); - fputs("END:VEVENT\n", stream); - } - LLIST_TS_UNLOCK(&recur_alist_p); + llist_item_t *i, *j; + char ical_datetime[BUFSIZ]; + char ical_date[BUFSIZ]; + + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_FOREACH(&recur_alist_p, i) { + struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); + + date_sec2date_fmt(rapt->start, ICALDATETIMEFMT, + ical_datetime); + fputs("BEGIN:VEVENT\n", stream); + fprintf(stream, "DTSTART:%s\n", ical_datetime); + fprintf(stream, "DURATION:PT0H0M%ldS\n", rapt->dur); + fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d", + ical_recur_type[rapt->rpt->type], rapt->rpt->freq); + + if (rapt->rpt->until != 0) { + date_sec2date_fmt(rapt->rpt->until + HOURINSEC, + ICALDATEFMT, ical_date); + fprintf(stream, ";UNTIL=%s\n", ical_date); + } else { + fputc('\n', stream); + } + + if (LLIST_FIRST(&rapt->exc)) { + fputs("EXDATE:", stream); + LLIST_FOREACH(&rapt->exc, j) { + struct excp *exc = LLIST_GET_DATA(j); + date_sec2date_fmt(exc->st, ICALDATEFMT, + ical_date); + fprintf(stream, "%s", ical_date); + if (LLIST_NEXT(j)) + fputc(',', stream); + else + fputc('\n', stream); + } + } + + fprintf(stream, "SUMMARY:%s\n", rapt->mesg); + if (rapt->state & APOINT_NOTIFY) + ical_export_valarm(stream); + fputs("END:VEVENT\n", stream); + } + LLIST_TS_UNLOCK(&recur_alist_p); } /* Export appointments. */ static void ical_export_apoints(FILE * stream) { - llist_item_t *i; - char ical_datetime[BUFSIZ]; - - LLIST_TS_LOCK(&alist_p); - LLIST_TS_FOREACH(&alist_p, i) { - struct apoint *apt = LLIST_TS_GET_DATA(i); - date_sec2date_fmt(apt->start, ICALDATETIMEFMT, ical_datetime); - fputs("BEGIN:VEVENT\n", stream); - fprintf(stream, "DTSTART:%s\n", ical_datetime); - fprintf(stream, "DURATION:P%ldDT%ldH%ldM%ldS\n", - apt->dur / DAYINSEC, - (apt->dur / HOURINSEC) % DAYINHOURS, - (apt->dur / MININSEC) % HOURINMIN, apt->dur % MININSEC); - fprintf(stream, "SUMMARY:%s\n", apt->mesg); - if (apt->state & APOINT_NOTIFY) - ical_export_valarm(stream); - fputs("END:VEVENT\n", stream); - } - LLIST_TS_UNLOCK(&alist_p); + llist_item_t *i; + char ical_datetime[BUFSIZ]; + + LLIST_TS_LOCK(&alist_p); + LLIST_TS_FOREACH(&alist_p, i) { + struct apoint *apt = LLIST_TS_GET_DATA(i); + date_sec2date_fmt(apt->start, ICALDATETIMEFMT, + ical_datetime); + fputs("BEGIN:VEVENT\n", stream); + fprintf(stream, "DTSTART:%s\n", ical_datetime); + fprintf(stream, "DURATION:P%ldDT%ldH%ldM%ldS\n", + apt->dur / DAYINSEC, + (apt->dur / HOURINSEC) % DAYINHOURS, + (apt->dur / MININSEC) % HOURINMIN, + apt->dur % MININSEC); + fprintf(stream, "SUMMARY:%s\n", apt->mesg); + if (apt->state & APOINT_NOTIFY) + ical_export_valarm(stream); + fputs("END:VEVENT\n", stream); + } + LLIST_TS_UNLOCK(&alist_p); } /* Export todo items. */ static void ical_export_todo(FILE * stream) { - llist_item_t *i; - - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_TS_GET_DATA(i); - if (todo->id < 0) /* completed items */ - continue; - - fputs("BEGIN:VTODO\n", stream); - fprintf(stream, "PRIORITY:%d\n", todo->id); - fprintf(stream, "SUMMARY:%s\n", todo->mesg); - fputs("END:VTODO\n", stream); - } + llist_item_t *i; + + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_TS_GET_DATA(i); + if (todo->id < 0) /* completed items */ + continue; + + fputs("BEGIN:VTODO\n", stream); + fprintf(stream, "PRIORITY:%d\n", todo->id); + fprintf(stream, "SUMMARY:%s\n", todo->mesg); + fputs("END:VTODO\n", stream); + } } /* Print a header to describe import log report format. */ static void ical_log_init(FILE * log, int major, int minor) { - const char *header = - "+-------------------------------------------------------------------+\n" - "| Calcurse icalendar import log. |\n" - "| |\n" - "| Items imported from icalendar file, version %d.%d |\n" - "| Some items could not be imported, they are described hereafter. |\n" - "| The log line format is as follows: |\n" - "| |\n" - "| TYPE [LINE]: DESCRIPTION |\n" - "| |\n" - "| where: |\n" - "| * TYPE represents the item type ('VEVENT' or 'VTODO') |\n" - "| * LINE is the line in the input stream at which this item begins |\n" - "| * DESCRIPTION indicates why the item could not be imported |\n" - "+-------------------------------------------------------------------+\n\n"; - - if (log) - fprintf(log, header, major, minor); + const char *header = + "+-------------------------------------------------------------------+\n" + "| Calcurse icalendar import log. |\n" + "| |\n" + "| Items imported from icalendar file, version %d.%d |\n" + "| Some items could not be imported, they are described hereafter. |\n" + "| The log line format is as follows: |\n" + "| |\n" + "| TYPE [LINE]: DESCRIPTION |\n" + "| |\n" + "| where: |\n" + "| * TYPE represents the item type ('VEVENT' or 'VTODO') |\n" + "| * LINE is the line in the input stream at which this item begins |\n" + "| * DESCRIPTION indicates why the item could not be imported |\n" + "+-------------------------------------------------------------------+\n\n"; + + if (log) + fprintf(log, header, major, minor); } /* @@ -268,66 +275,67 @@ static void ical_log_init(FILE * log, int major, int minor) * first line inside the icalendar file), together with a message describing the * problem. */ -static void ical_log(FILE * log, ical_types_e type, unsigned lineno, char *msg) +static void ical_log(FILE * log, ical_types_e type, unsigned lineno, + char *msg) { - const char *typestr[ICAL_TYPES] = { "VEVENT", "VTODO" }; + const char *typestr[ICAL_TYPES] = { "VEVENT", "VTODO" }; - RETURN_IF(type < 0 || type >= ICAL_TYPES, _("unknown ical type")); - if (log) - fprintf(log, "%s [%d]: %s\n", typestr[type], lineno, msg); + RETURN_IF(type < 0 || type >= ICAL_TYPES, _("unknown ical type")); + if (log) + fprintf(log, "%s [%d]: %s\n", typestr[type], lineno, msg); } static void ical_store_todo(int priority, char *mesg, char *note) { - todo_add(mesg, priority, note); - mem_free(mesg); - erase_note(¬e); + todo_add(mesg, priority, note); + mem_free(mesg); + erase_note(¬e); } static void -ical_store_event(char *mesg, char *note, long day, long end, ical_rpt_t * rpt, - llist_t * exc) +ical_store_event(char *mesg, char *note, long day, long end, + ical_rpt_t * rpt, llist_t * exc) { - const int EVENTID = 1; - - if (rpt) { - recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq, - rpt->until, exc); - mem_free(rpt); - } else if (end && end != day) { - /* Here we have an event that spans over several days. */ - rpt = mem_malloc(sizeof(ical_rpt_t)); - rpt->type = RECUR_DAILY; - rpt->freq = 1; - rpt->count = 0; - rpt->until = end; - recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq, - rpt->until, exc); - mem_free(rpt); - } else { - event_new(mesg, note, day, EVENTID); - } - mem_free(mesg); - erase_note(¬e); + const int EVENTID = 1; + + if (rpt) { + recur_event_new(mesg, note, day, EVENTID, rpt->type, + rpt->freq, rpt->until, exc); + mem_free(rpt); + } else if (end && end != day) { + /* Here we have an event that spans over several days. */ + rpt = mem_malloc(sizeof(ical_rpt_t)); + rpt->type = RECUR_DAILY; + rpt->freq = 1; + rpt->count = 0; + rpt->until = end; + recur_event_new(mesg, note, day, EVENTID, rpt->type, + rpt->freq, rpt->until, exc); + mem_free(rpt); + } else { + event_new(mesg, note, day, EVENTID); + } + mem_free(mesg); + erase_note(¬e); } static void ical_store_apoint(char *mesg, char *note, long start, long dur, - ical_rpt_t * rpt, llist_t * exc, int has_alarm) + ical_rpt_t * rpt, llist_t * exc, int has_alarm) { - char state = 0L; - - if (has_alarm) - state |= APOINT_NOTIFY; - if (rpt) { - recur_apoint_new(mesg, note, start, dur, state, rpt->type, rpt->freq, - rpt->until, exc); - mem_free(rpt); - } else { - apoint_new(mesg, note, start, dur, state); - } - mem_free(mesg); - erase_note(¬e); + char state = 0L; + + if (has_alarm) + state |= APOINT_NOTIFY; + if (rpt) { + recur_apoint_new(mesg, note, start, dur, state, rpt->type, + rpt->freq, rpt->until, exc); + mem_free(rpt); + } else { + apoint_new(mesg, note, start, dur, state); + } + mem_free(mesg); + erase_note(¬e); } /* @@ -345,101 +353,101 @@ ical_store_apoint(char *mesg, char *note, long start, long dur, */ static char *ical_unformat_line(char *line) { - char *p, uline[BUFSIZ]; - int len; - - if (strlen(line) >= BUFSIZ) - return NULL; - - memset(uline, 0, BUFSIZ); - for (len = 0, p = line; *p; p++) { - switch (*p) { - case '\\': - switch (*(p + 1)) { - case 'n': - uline[len++] = '\n'; - p++; - break; - case 't': - uline[len++] = '\t'; - p++; - break; - case ';': - case ':': - case ',': - uline[len++] = *(p + 1); - p++; - break; - default: - uline[len++] = *p; - break; - } - break; - default: - uline[len++] = *p; - break; - } - } - - return mem_strdup(uline); + char *p, uline[BUFSIZ]; + int len; + + if (strlen(line) >= BUFSIZ) + return NULL; + + memset(uline, 0, BUFSIZ); + for (len = 0, p = line; *p; p++) { + switch (*p) { + case '\\': + switch (*(p + 1)) { + case 'n': + uline[len++] = '\n'; + p++; + break; + case 't': + uline[len++] = '\t'; + p++; + break; + case ';': + case ':': + case ',': + uline[len++] = *(p + 1); + p++; + break; + default: + uline[len++] = *p; + break; + } + break; + default: + uline[len++] = *p; + break; + } + } + + return mem_strdup(uline); } static void ical_readline_init(FILE * fdi, char *buf, char *lstore, unsigned *ln) { - char *eol; - - *buf = *lstore = '\0'; - if (fgets(lstore, BUFSIZ, fdi)) { - if ((eol = strchr(lstore, '\n')) != NULL) - *eol = '\0'; - (*ln)++; - } + char *eol; + + *buf = *lstore = '\0'; + if (fgets(lstore, BUFSIZ, fdi)) { + if ((eol = strchr(lstore, '\n')) != NULL) + *eol = '\0'; + (*ln)++; + } } static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln) { - char *eol; - - strncpy(buf, lstore, BUFSIZ); - (*ln)++; - - while (fgets(lstore, BUFSIZ, fdi) != NULL) { - if ((eol = strchr(lstore, '\n')) != NULL) - *eol = '\0'; - if (*lstore != SPACE && *lstore != TAB) - break; - strncat(buf, lstore + 1, BUFSIZ - strlen(buf) - 1); - (*ln)++; - } - - if (feof(fdi)) { - *lstore = '\0'; - if (*buf == '\0') - return 0; - } - - return 1; + char *eol; + + strncpy(buf, lstore, BUFSIZ); + (*ln)++; + + while (fgets(lstore, BUFSIZ, fdi) != NULL) { + if ((eol = strchr(lstore, '\n')) != NULL) + *eol = '\0'; + if (*lstore != SPACE && *lstore != TAB) + break; + strncat(buf, lstore + 1, BUFSIZ - strlen(buf) - 1); + (*ln)++; + } + + if (feof(fdi)) { + *lstore = '\0'; + if (*buf == '\0') + return 0; + } + + return 1; } static int ical_chk_header(FILE * fd, char *buf, char *lstore, unsigned *lineno, - int *major, int *minor) + int *major, int *minor) { - const char icalheader[] = "BEGIN:VCALENDAR"; + const char icalheader[] = "BEGIN:VCALENDAR"; - if (!ical_readline(fd, buf, lstore, lineno)) - return 0; + if (!ical_readline(fd, buf, lstore, lineno)) + return 0; - if (strncasecmp(buf, icalheader, sizeof(icalheader) - 1) != 0) - return 0; + if (strncasecmp(buf, icalheader, sizeof(icalheader) - 1) != 0) + return 0; - while (!sscanf(buf, "VERSION:%d.%d", major, minor)) { - if (!ical_readline(fd, buf, lstore, lineno)) - return 0; - } + while (!sscanf(buf, "VERSION:%d.%d", major, minor)) { + if (!ical_readline(fd, buf, lstore, lineno)) + return 0; + } - return 1; + return 1; } /* @@ -456,50 +464,54 @@ ical_chk_header(FILE * fd, char *buf, char *lstore, unsigned *lineno, */ static long ical_datetime2long(char *datestr, ical_vevent_e * type) { - const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 5; - struct date date; - unsigned hour, min; - long datelong; - int format; - - format = sscanf(datestr, "%04u%02u%02uT%02u%02u", - &date.yyyy, &date.mm, &date.dd, &hour, &min); - if (format == FORMAT_DATE) { - if (type) - *type = EVENT; - datelong = date2sec(date, 0, 0); - } else if (format == FORMAT_DATETIME) { - if (type) - *type = APPOINTMENT; - datelong = date2sec(date, hour, min); - } else { - datelong = NOTFOUND; - } - return datelong; + const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 5; + struct date date; + unsigned hour, min; + long datelong; + int format; + + format = sscanf(datestr, "%04u%02u%02uT%02u%02u", + &date.yyyy, &date.mm, &date.dd, &hour, &min); + if (format == FORMAT_DATE) { + if (type) + *type = EVENT; + datelong = date2sec(date, 0, 0); + } else if (format == FORMAT_DATETIME) { + if (type) + *type = APPOINTMENT; + datelong = date2sec(date, hour, min); + } else { + datelong = NOTFOUND; + } + return datelong; } static long ical_durtime2long(char *timestr) { - long timelong; - char *p; - - if ((p = strchr(timestr, 'T')) == NULL) { - timelong = 0; - } else { - int nbmatch; - struct { - unsigned hour, min, sec; - } time; - - p++; - memset(&time, 0, sizeof time); - nbmatch = sscanf(p, "%uH%uM%uS", &time.hour, &time.min, &time.sec); - if (nbmatch < 1 || nbmatch > 3) - timelong = 0; - else - timelong = time.hour * HOURINSEC + time.min * MININSEC + time.sec; - } - return timelong; + long timelong; + char *p; + + if ((p = strchr(timestr, 'T')) == NULL) { + timelong = 0; + } else { + int nbmatch; + struct { + unsigned hour, min, sec; + } time; + + p++; + memset(&time, 0, sizeof time); + nbmatch = + sscanf(p, "%uH%uM%uS", &time.hour, &time.min, + &time.sec); + if (nbmatch < 1 || nbmatch > 3) + timelong = 0; + else + timelong = + time.hour * HOURINSEC + time.min * MININSEC + + time.sec; + } + return timelong; } /* @@ -529,44 +541,45 @@ static long ical_durtime2long(char *timestr) */ static long ical_dur2long(char *durstr) { - const int NOTFOUND = -1; - long durlong; - char *p; - struct { - unsigned week, day; - } date; - - memset(&date, 0, sizeof date); - if ((p = strchr(durstr, 'P')) == NULL) { - durlong = NOTFOUND; - } else { - p++; - if (*p == '-') - return NOTFOUND; - else if (*p == '+') - p++; - - if (*p == 'T') { /* dur-time */ - durlong = ical_durtime2long(p); - } else if (strchr(p, 'W')) { /* dur-week */ - if (sscanf(p, "%u", &date.week) == 1) - durlong = date.week * WEEKINDAYS * DAYINSEC; - else - durlong = NOTFOUND; - } else { - if (strchr(p, 'D')) { /* dur-date */ - if (sscanf(p, "%uD", &date.day) == 1) { - durlong = date.day * DAYINSEC; - durlong += ical_durtime2long(p); - } else { - durlong = NOTFOUND; - } - } else { - durlong = NOTFOUND; - } - } - } - return durlong; + const int NOTFOUND = -1; + long durlong; + char *p; + struct { + unsigned week, day; + } date; + + memset(&date, 0, sizeof date); + if ((p = strchr(durstr, 'P')) == NULL) { + durlong = NOTFOUND; + } else { + p++; + if (*p == '-') + return NOTFOUND; + else if (*p == '+') + p++; + + if (*p == 'T') { /* dur-time */ + durlong = ical_durtime2long(p); + } else if (strchr(p, 'W')) { /* dur-week */ + if (sscanf(p, "%u", &date.week) == 1) + durlong = + date.week * WEEKINDAYS * DAYINSEC; + else + durlong = NOTFOUND; + } else { + if (strchr(p, 'D')) { /* dur-date */ + if (sscanf(p, "%uD", &date.day) == 1) { + durlong = date.day * DAYINSEC; + durlong += ical_durtime2long(p); + } else { + durlong = NOTFOUND; + } + } else { + durlong = NOTFOUND; + } + } + } + return durlong; } /* @@ -579,28 +592,35 @@ static long ical_dur2long(char *durstr) */ static long ical_compute_rpt_until(long start, ical_rpt_t * rpt) { - long until; - - switch (rpt->type) { - case RECUR_DAILY: - until = date_sec_change(start, 0, rpt->freq * (rpt->count - 1)); - break; - case RECUR_WEEKLY: - until = date_sec_change(start, 0, - rpt->freq * WEEKINDAYS * (rpt->count - 1)); - break; - case RECUR_MONTHLY: - until = date_sec_change(start, rpt->freq * (rpt->count - 1), 0); - break; - case RECUR_YEARLY: - until = date_sec_change(start, rpt->freq * 12 * (rpt->count - 1), 0); - break; - default: - until = 0; - break; - /* NOTREACHED */ - } - return until; + long until; + + switch (rpt->type) { + case RECUR_DAILY: + until = + date_sec_change(start, 0, + rpt->freq * (rpt->count - 1)); + break; + case RECUR_WEEKLY: + until = date_sec_change(start, 0, + rpt->freq * WEEKINDAYS * + (rpt->count - 1)); + break; + case RECUR_MONTHLY: + until = + date_sec_change(start, rpt->freq * (rpt->count - 1), + 0); + break; + case RECUR_YEARLY: + until = + date_sec_change(start, + rpt->freq * 12 * (rpt->count - 1), 0); + break; + default: + until = 0; + break; + /* NOTREACHED */ + } + return until; } /* @@ -641,106 +661,117 @@ static long ical_compute_rpt_until(long start, ical_rpt_t * rpt) * ) */ static ical_rpt_t *ical_read_rrule(FILE * log, char *rrulestr, - unsigned *noskipped, const int itemline) + unsigned *noskipped, const int itemline) { - const char daily[] = "DAILY"; - const char weekly[] = "WEEKLY"; - const char monthly[] = "MONTHLY"; - const char yearly[] = "YEARLY"; - const char count[] = "COUNT="; - const char interv[] = "INTERVAL="; - unsigned interval; - ical_rpt_t *rpt; - char *p; - - rpt = NULL; - if ((p = strchr(rrulestr, ':')) != NULL) { - char freqstr[BUFSIZ]; - - p++; - rpt = mem_malloc(sizeof(ical_rpt_t)); - memset(rpt, 0, sizeof(ical_rpt_t)); - if (sscanf(p, "FREQ=%s", freqstr) != 1) { - ical_log(log, ICAL_VEVENT, itemline, - _("recurrence frequence not found.")); - (*noskipped)++; - mem_free(rpt); - return NULL; - } else { - if (strncmp(freqstr, daily, sizeof(daily) - 1) == 0) { - rpt->type = RECUR_DAILY; - } else if (strncmp(freqstr, weekly, sizeof(weekly) - 1) == 0) { - rpt->type = RECUR_WEEKLY; - } else if (strncmp(freqstr, monthly, sizeof(monthly) - 1) == 0) { - rpt->type = RECUR_MONTHLY; - } else if (strncmp(freqstr, yearly, sizeof(yearly) - 1) == 0) { - rpt->type = RECUR_YEARLY; - } else { - ical_log(log, ICAL_VEVENT, itemline, - _("recurrence frequence not recognized.")); - (*noskipped)++; - mem_free(rpt); - return NULL; - } - } - /* - The UNTIL rule part defines a date-time value which bounds the - recurrence rule in an inclusive manner. If not present, and the - COUNT rule part is also not present, the RRULE is considered to - repeat forever. - - The COUNT rule part defines the number of occurrences at which to - range-bound the recurrence. The "DTSTART" property value, if - specified, counts as the first occurrence. - */ - if ((p = strstr(rrulestr, "UNTIL")) != NULL) { - char *untilstr; - - untilstr = strchr(p, '='); - rpt->until = ical_datetime2long(++untilstr, NULL); - } else { - unsigned cnt; - char *countstr; - - if ((countstr = strstr(rrulestr, count)) != NULL) { - countstr += sizeof(count) - 1; - if (sscanf(countstr, "%u", &cnt) != 1) { - rpt->until = 0; - /* endless repetition */ - } else { - rpt->count = cnt; - } - } else { - rpt->until = 0; - } - } - - if ((p = strstr(rrulestr, interv)) != NULL) { - p += sizeof(interv) - 1; - if (sscanf(p, "%u", &interval) != 1) { - rpt->freq = 1; - /* default frequence if none specified */ - } else { - rpt->freq = interval; - } - } else { - rpt->freq = 1; - } - } else { - ical_log(log, ICAL_VEVENT, itemline, _("recurrence rule malformed.")); - (*noskipped)++; - } - return rpt; + const char daily[] = "DAILY"; + const char weekly[] = "WEEKLY"; + const char monthly[] = "MONTHLY"; + const char yearly[] = "YEARLY"; + const char count[] = "COUNT="; + const char interv[] = "INTERVAL="; + unsigned interval; + ical_rpt_t *rpt; + char *p; + + rpt = NULL; + if ((p = strchr(rrulestr, ':')) != NULL) { + char freqstr[BUFSIZ]; + + p++; + rpt = mem_malloc(sizeof(ical_rpt_t)); + memset(rpt, 0, sizeof(ical_rpt_t)); + if (sscanf(p, "FREQ=%s", freqstr) != 1) { + ical_log(log, ICAL_VEVENT, itemline, + _("recurrence frequence not found.")); + (*noskipped)++; + mem_free(rpt); + return NULL; + } else { + if (strncmp(freqstr, daily, sizeof(daily) - 1) == + 0) { + rpt->type = RECUR_DAILY; + } else + if (strncmp + (freqstr, weekly, + sizeof(weekly) - 1) == 0) { + rpt->type = RECUR_WEEKLY; + } else + if (strncmp + (freqstr, monthly, + sizeof(monthly) - 1) == 0) { + rpt->type = RECUR_MONTHLY; + } else + if (strncmp + (freqstr, yearly, + sizeof(yearly) - 1) == 0) { + rpt->type = RECUR_YEARLY; + } else { + ical_log(log, ICAL_VEVENT, itemline, + _("recurrence frequence not recognized.")); + (*noskipped)++; + mem_free(rpt); + return NULL; + } + } + /* + The UNTIL rule part defines a date-time value which bounds the + recurrence rule in an inclusive manner. If not present, and the + COUNT rule part is also not present, the RRULE is considered to + repeat forever. + + The COUNT rule part defines the number of occurrences at which to + range-bound the recurrence. The "DTSTART" property value, if + specified, counts as the first occurrence. + */ + if ((p = strstr(rrulestr, "UNTIL")) != NULL) { + char *untilstr; + + untilstr = strchr(p, '='); + rpt->until = ical_datetime2long(++untilstr, NULL); + } else { + unsigned cnt; + char *countstr; + + if ((countstr = strstr(rrulestr, count)) != NULL) { + countstr += sizeof(count) - 1; + if (sscanf(countstr, "%u", &cnt) != 1) { + rpt->until = 0; + /* endless repetition */ + } else { + rpt->count = cnt; + } + } else { + rpt->until = 0; + } + } + + if ((p = strstr(rrulestr, interv)) != NULL) { + p += sizeof(interv) - 1; + if (sscanf(p, "%u", &interval) != 1) { + rpt->freq = 1; + /* default frequence if none specified */ + } else { + rpt->freq = interval; + } + } else { + rpt->freq = 1; + } + } else { + ical_log(log, ICAL_VEVENT, itemline, + _("recurrence rule malformed.")); + (*noskipped)++; + } + return rpt; } static void ical_add_exc(llist_t * exc_head, long date) { - if (date != 0) { - struct excp *exc = mem_malloc(sizeof(struct excp)); - exc->st = date; + if (date != 0) { + struct excp *exc = mem_malloc(sizeof(struct excp)); + exc->st = date; - LLIST_ADD(exc_head, exc); - } + LLIST_ADD(exc_head, exc); + } } /* @@ -748,340 +779,417 @@ static void ical_add_exc(llist_t * exc_head, long date) * recurring calendar component. */ static void -ical_read_exdate(llist_t * exc, FILE * log, char *exstr, unsigned *noskipped, - const int itemline) +ical_read_exdate(llist_t * exc, FILE * log, char *exstr, + unsigned *noskipped, const int itemline) { - char *p, *q; - long date; - - LLIST_INIT(exc); - if ((p = strchr(exstr, ':')) != NULL) { - p++; - while ((q = strchr(p, ',')) != NULL) { - char buf[BUFSIZ]; - const int buflen = q - p; - - strncpy(buf, p, buflen); - buf[buflen] = '\0'; - date = ical_datetime2long(buf, NULL); - ical_add_exc(exc, date); - p = ++q; - } - date = ical_datetime2long(p, NULL); - ical_add_exc(exc, date); - } else { - ical_log(log, ICAL_VEVENT, itemline, - _("recurrence exception dates malformed.")); - (*noskipped)++; - } + char *p, *q; + long date; + + LLIST_INIT(exc); + if ((p = strchr(exstr, ':')) != NULL) { + p++; + while ((q = strchr(p, ',')) != NULL) { + char buf[BUFSIZ]; + const int buflen = q - p; + + strncpy(buf, p, buflen); + buf[buflen] = '\0'; + date = ical_datetime2long(buf, NULL); + ical_add_exc(exc, date); + p = ++q; + } + date = ical_datetime2long(p, NULL); + ical_add_exc(exc, date); + } else { + ical_log(log, ICAL_VEVENT, itemline, + _("recurrence exception dates malformed.")); + (*noskipped)++; + } } /* Return an allocated string containing the name of the newly created note. */ static char *ical_read_note(char *line, unsigned *noskipped, - ical_types_e item_type, const int itemline, - FILE * log) + ical_types_e item_type, const int itemline, + FILE * log) { - char *p, *notestr, *note; - - if ((p = strchr(line, ':')) != NULL) { - p++; - notestr = ical_unformat_line(p); - if (notestr == NULL) { - ical_log(log, item_type, itemline, - _("could not get entire item description.")); - (*noskipped)++; - return NULL; - } else if (strlen(notestr) == 0) { - mem_free(notestr); - return NULL; - } else { - note = generate_note(notestr); - mem_free(notestr); - return note; - } - } else { - ical_log(log, item_type, itemline, _("description malformed.")); - (*noskipped)++; - return NULL; - } + char *p, *notestr, *note; + + if ((p = strchr(line, ':')) != NULL) { + p++; + notestr = ical_unformat_line(p); + if (notestr == NULL) { + ical_log(log, item_type, itemline, + _("could not get entire item description.")); + (*noskipped)++; + return NULL; + } else if (strlen(notestr) == 0) { + mem_free(notestr); + return NULL; + } else { + note = generate_note(notestr); + mem_free(notestr); + return note; + } + } else { + ical_log(log, item_type, itemline, + _("description malformed.")); + (*noskipped)++; + return NULL; + } } /* Returns an allocated string containing the ical item summary. */ static char *ical_read_summary(char *line) { - char *p, *summary; - - if ((p = strchr(line, ':')) != NULL) { - p++; - summary = ical_unformat_line(p); - return summary; - } else { - return NULL; - } + char *p, *summary; + + if ((p = strchr(line, ':')) != NULL) { + p++; + summary = ical_unformat_line(p); + return summary; + } else { + return NULL; + } } static void -ical_read_event(FILE * fdi, FILE * log, unsigned *noevents, unsigned *noapoints, - unsigned *noskipped, char *buf, char *lstore, unsigned *lineno) +ical_read_event(FILE * fdi, FILE * log, unsigned *noevents, + unsigned *noapoints, unsigned *noskipped, char *buf, + char *lstore, unsigned *lineno) { - const int ITEMLINE = *lineno; - const char endevent[] = "END:VEVENT"; - const char summary[] = "SUMMARY"; - const char dtstart[] = "DTSTART"; - const char dtend[] = "DTEND"; - const char duration[] = "DURATION"; - const char rrule[] = "RRULE"; - const char exdate[] = "EXDATE"; - const char alarm[] = "BEGIN:VALARM"; - const char endalarm[] = "END:VALARM"; - const char desc[] = "DESCRIPTION"; - ical_vevent_e vevent_type; - char *p; - struct { - llist_t exc; - ical_rpt_t *rpt; - char *mesg, *note; - long start, end, dur; - int has_alarm; - } vevent; - int skip_alarm; - - vevent_type = UNDEFINED; - memset(&vevent, 0, sizeof vevent); - skip_alarm = 0; - while (ical_readline(fdi, buf, lstore, lineno)) { - if (skip_alarm) { - /* Need to skip VALARM properties because some keywords could - interfere, such as DURATION, SUMMARY,.. */ - if (strncasecmp(buf, endalarm, sizeof(endalarm) - 1) == 0) - skip_alarm = 0; - continue; - } - if (strncasecmp(buf, endevent, sizeof(endevent) - 1) == 0) { - if (vevent.mesg) { - if (vevent.rpt && vevent.rpt->count) - vevent.rpt->until = ical_compute_rpt_until(vevent.start, vevent.rpt); - - switch (vevent_type) { - case APPOINTMENT: - if (vevent.start == 0) { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("appointment has no start time.")); - goto cleanup; - } - if (vevent.dur == 0) { - if (vevent.end == 0) { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("could not compute duration " "(no end time).")); - goto cleanup; - } else if (vevent.start == vevent.end) { - vevent_type = EVENT; - vevent.end = 0L; - ical_store_event(vevent.mesg, vevent.note, - vevent.start, vevent.end, - vevent.rpt, &vevent.exc); - (*noevents)++; - return; - } else { - vevent.dur = vevent.end - vevent.start; - if (vevent.dur < 0) { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("item has a negative duration.")); - goto cleanup; - } - } - } - ical_store_apoint(vevent.mesg, vevent.note, vevent.start, - vevent.dur, vevent.rpt, &vevent.exc, - vevent.has_alarm); - (*noapoints)++; - break; - case EVENT: - if (vevent.start == 0) { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("event date is not defined.")); - goto cleanup; - } - ical_store_event(vevent.mesg, vevent.note, vevent.start, - vevent.end, vevent.rpt, &vevent.exc); - (*noevents)++; - break; - case UNDEFINED: - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("item could not be identified.")); - goto cleanup; - break; - } - } else { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("could not retrieve item summary.")); - goto cleanup; - } - return; - } else { - if (strncasecmp(buf, dtstart, sizeof(dtstart) - 1) == 0) { - if ((p = strchr(buf, ':')) != NULL) - vevent.start = ical_datetime2long(++p, &vevent_type); - if (!vevent.start) { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("could not retrieve event start time.")); - goto cleanup; - } - } else if (strncasecmp(buf, dtend, sizeof(dtend) - 1) == 0) { - if ((p = strchr(buf, ':')) != NULL) - vevent.end = ical_datetime2long(++p, &vevent_type); - if (!vevent.end) { - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("could not retrieve event end time.")); - goto cleanup; - } - } else if (strncasecmp(buf, duration, sizeof(duration) - 1) == 0) { - if ((vevent.dur = ical_dur2long(buf)) <= 0) { - ical_log(log, ICAL_VEVENT, ITEMLINE, _("item duration malformed.")); - goto cleanup; - } - } else if (strncasecmp(buf, rrule, sizeof(rrule) - 1) == 0) { - vevent.rpt = ical_read_rrule(log, buf, noskipped, ITEMLINE); - } else if (strncasecmp(buf, exdate, sizeof(exdate) - 1) == 0) { - ical_read_exdate(&vevent.exc, log, buf, noskipped, ITEMLINE); - } else if (strncasecmp(buf, summary, sizeof(summary) - 1) == 0) { - vevent.mesg = ical_read_summary(buf); - } else if (strncasecmp(buf, alarm, sizeof(alarm) - 1) == 0) { - skip_alarm = 1; - vevent.has_alarm = 1; - } else if (strncasecmp(buf, desc, sizeof(desc) - 1) == 0) { - vevent.note = ical_read_note(buf, noskipped, ICAL_VEVENT, - ITEMLINE, log); - } - } - } - ical_log(log, ICAL_VEVENT, ITEMLINE, - _("The ical file seems to be malformed. " - "The end of item was not found.")); + const int ITEMLINE = *lineno; + const char endevent[] = "END:VEVENT"; + const char summary[] = "SUMMARY"; + const char dtstart[] = "DTSTART"; + const char dtend[] = "DTEND"; + const char duration[] = "DURATION"; + const char rrule[] = "RRULE"; + const char exdate[] = "EXDATE"; + const char alarm[] = "BEGIN:VALARM"; + const char endalarm[] = "END:VALARM"; + const char desc[] = "DESCRIPTION"; + ical_vevent_e vevent_type; + char *p; + struct { + llist_t exc; + ical_rpt_t *rpt; + char *mesg, *note; + long start, end, dur; + int has_alarm; + } vevent; + int skip_alarm; + + vevent_type = UNDEFINED; + memset(&vevent, 0, sizeof vevent); + skip_alarm = 0; + while (ical_readline(fdi, buf, lstore, lineno)) { + if (skip_alarm) { + /* Need to skip VALARM properties because some keywords could + interfere, such as DURATION, SUMMARY,.. */ + if (strncasecmp + (buf, endalarm, sizeof(endalarm) - 1) == 0) + skip_alarm = 0; + continue; + } + if (strncasecmp(buf, endevent, sizeof(endevent) - 1) == 0) { + if (vevent.mesg) { + if (vevent.rpt && vevent.rpt->count) + vevent.rpt->until = + ical_compute_rpt_until(vevent. + start, + vevent. + rpt); + + switch (vevent_type) { + case APPOINTMENT: + if (vevent.start == 0) { + ical_log(log, ICAL_VEVENT, + ITEMLINE, + _("appointment has no start time.")); + goto cleanup; + } + if (vevent.dur == 0) { + if (vevent.end == 0) { + ical_log(log, + ICAL_VEVENT, + ITEMLINE, + _("could not compute duration " + "(no end time).")); + goto cleanup; + } else if (vevent.start == + vevent.end) { + vevent_type = + EVENT; + vevent.end = 0L; + ical_store_event + (vevent.mesg, + vevent.note, + vevent.start, + vevent.end, + vevent.rpt, + &vevent.exc); + (*noevents)++; + return; + } else { + vevent.dur = + vevent.end - + vevent.start; + if (vevent.dur < 0) { + ical_log + (log, + ICAL_VEVENT, + ITEMLINE, + _("item has a negative duration.")); + goto cleanup; + } + } + } + ical_store_apoint(vevent.mesg, + vevent.note, + vevent.start, + vevent.dur, + vevent.rpt, + &vevent.exc, + vevent. + has_alarm); + (*noapoints)++; + break; + case EVENT: + if (vevent.start == 0) { + ical_log(log, ICAL_VEVENT, + ITEMLINE, + _("event date is not defined.")); + goto cleanup; + } + ical_store_event(vevent.mesg, + vevent.note, + vevent.start, + vevent.end, + vevent.rpt, + &vevent.exc); + (*noevents)++; + break; + case UNDEFINED: + ical_log(log, ICAL_VEVENT, + ITEMLINE, + _("item could not be identified.")); + goto cleanup; + break; + } + } else { + ical_log(log, ICAL_VEVENT, ITEMLINE, + _("could not retrieve item summary.")); + goto cleanup; + } + return; + } else { + if (strncasecmp(buf, dtstart, sizeof(dtstart) - 1) + == 0) { + if ((p = strchr(buf, ':')) != NULL) + vevent.start = + ical_datetime2long(++p, + &vevent_type); + if (!vevent.start) { + ical_log(log, ICAL_VEVENT, + ITEMLINE, + _("could not retrieve event start time.")); + goto cleanup; + } + } else + if (strncasecmp(buf, dtend, sizeof(dtend) - 1) + == 0) { + if ((p = strchr(buf, ':')) != NULL) + vevent.end = + ical_datetime2long(++p, + &vevent_type); + if (!vevent.end) { + ical_log(log, ICAL_VEVENT, + ITEMLINE, + _("could not retrieve event end time.")); + goto cleanup; + } + } else + if (strncasecmp + (buf, duration, + sizeof(duration) - 1) == 0) { + if ((vevent.dur = ical_dur2long(buf)) <= 0) { + ical_log(log, ICAL_VEVENT, + ITEMLINE, + _("item duration malformed.")); + goto cleanup; + } + } else + if (strncasecmp(buf, rrule, sizeof(rrule) - 1) + == 0) { + vevent.rpt = + ical_read_rrule(log, buf, noskipped, + ITEMLINE); + } else + if (strncasecmp + (buf, exdate, sizeof(exdate) - 1) == 0) { + ical_read_exdate(&vevent.exc, log, buf, + noskipped, ITEMLINE); + } else + if (strncasecmp + (buf, summary, sizeof(summary) - 1) == 0) { + vevent.mesg = ical_read_summary(buf); + } else + if (strncasecmp(buf, alarm, sizeof(alarm) - 1) + == 0) { + skip_alarm = 1; + vevent.has_alarm = 1; + } else if (strncasecmp(buf, desc, sizeof(desc) - 1) + == 0) { + vevent.note = + ical_read_note(buf, noskipped, + ICAL_VEVENT, ITEMLINE, + log); + } + } + } + ical_log(log, ICAL_VEVENT, ITEMLINE, + _("The ical file seems to be malformed. " + "The end of item was not found.")); cleanup: - if (vevent.note) - mem_free(vevent.note); - if (vevent.mesg) - mem_free(vevent.mesg); - if (vevent.rpt) - mem_free(vevent.rpt); - LLIST_FREE(&vevent.exc); - (*noskipped)++; + if (vevent.note) + mem_free(vevent.note); + if (vevent.mesg) + mem_free(vevent.mesg); + if (vevent.rpt) + mem_free(vevent.rpt); + LLIST_FREE(&vevent.exc); + (*noskipped)++; } static void -ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped, - char *buf, char *lstore, unsigned *lineno) +ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, + unsigned *noskipped, char *buf, char *lstore, + unsigned *lineno) { - const char endtodo[] = "END:VTODO"; - const char summary[] = "SUMMARY"; - const char alarm[] = "BEGIN:VALARM"; - const char endalarm[] = "END:VALARM"; - const char desc[] = "DESCRIPTION"; - const int LOWEST = 9; - const int ITEMLINE = *lineno; - struct { - char *mesg, *note; - int has_priority, priority; - } vtodo; - int skip_alarm; - - memset(&vtodo, 0, sizeof vtodo); - skip_alarm = 0; - while (ical_readline(fdi, buf, lstore, lineno)) { - if (skip_alarm) { - /* Need to skip VALARM properties because some keywords could - interfere, such as DURATION, SUMMARY,.. */ - if (strncasecmp(buf, endalarm, sizeof(endalarm) - 1) == 0) - skip_alarm = 0; - continue; - } - if (strncasecmp(buf, endtodo, sizeof(endtodo) - 1) == 0) { - if (!vtodo.has_priority) - vtodo.priority = LOWEST; - if (vtodo.mesg) { - ical_store_todo(vtodo.priority, vtodo.mesg, vtodo.note); - (*notodos)++; - } else { - ical_log(log, ICAL_VTODO, ITEMLINE, - _("could not retrieve item summary.")); - goto cleanup; - } - return; - } else { - int tmpint; - - if (strncasecmp(buf, "PRIORITY:", sizeof("PRIORITY:") - 1) == 0) { - sscanf(buf, "%d", &tmpint); - if (tmpint <= 9 && tmpint >= 1) { - vtodo.priority = tmpint; - vtodo.has_priority = 1; - } else { - ical_log(log, ICAL_VTODO, ITEMLINE, - _("item priority is not acceptable " - "(must be between 1 and 9).")); - vtodo.priority = LOWEST; - } - } else if (strncasecmp(buf, summary, sizeof(summary) - 1) == 0) { - vtodo.mesg = ical_read_summary(buf); - } else if (strncasecmp(buf, alarm, sizeof(alarm) - 1) == 0) { - skip_alarm = 1; - } else if (strncasecmp(buf, desc, sizeof(desc) - 1) == 0) { - vtodo.note = ical_read_note(buf, noskipped, ICAL_VTODO, ITEMLINE, log); - } - } - } - ical_log(log, ICAL_VTODO, ITEMLINE, - _("The ical file seems to be malformed. " - "The end of item was not found.")); + const char endtodo[] = "END:VTODO"; + const char summary[] = "SUMMARY"; + const char alarm[] = "BEGIN:VALARM"; + const char endalarm[] = "END:VALARM"; + const char desc[] = "DESCRIPTION"; + const int LOWEST = 9; + const int ITEMLINE = *lineno; + struct { + char *mesg, *note; + int has_priority, priority; + } vtodo; + int skip_alarm; + + memset(&vtodo, 0, sizeof vtodo); + skip_alarm = 0; + while (ical_readline(fdi, buf, lstore, lineno)) { + if (skip_alarm) { + /* Need to skip VALARM properties because some keywords could + interfere, such as DURATION, SUMMARY,.. */ + if (strncasecmp + (buf, endalarm, sizeof(endalarm) - 1) == 0) + skip_alarm = 0; + continue; + } + if (strncasecmp(buf, endtodo, sizeof(endtodo) - 1) == 0) { + if (!vtodo.has_priority) + vtodo.priority = LOWEST; + if (vtodo.mesg) { + ical_store_todo(vtodo.priority, vtodo.mesg, + vtodo.note); + (*notodos)++; + } else { + ical_log(log, ICAL_VTODO, ITEMLINE, + _("could not retrieve item summary.")); + goto cleanup; + } + return; + } else { + int tmpint; + + if (strncasecmp + (buf, "PRIORITY:", + sizeof("PRIORITY:") - 1) == 0) { + sscanf(buf, "%d", &tmpint); + if (tmpint <= 9 && tmpint >= 1) { + vtodo.priority = tmpint; + vtodo.has_priority = 1; + } else { + ical_log(log, ICAL_VTODO, ITEMLINE, + _("item priority is not acceptable " + "(must be between 1 and 9).")); + vtodo.priority = LOWEST; + } + } else + if (strncasecmp + (buf, summary, sizeof(summary) - 1) == 0) { + vtodo.mesg = ical_read_summary(buf); + } else + if (strncasecmp(buf, alarm, sizeof(alarm) - 1) + == 0) { + skip_alarm = 1; + } else if (strncasecmp(buf, desc, sizeof(desc) - 1) + == 0) { + vtodo.note = + ical_read_note(buf, noskipped, + ICAL_VTODO, ITEMLINE, + log); + } + } + } + ical_log(log, ICAL_VTODO, ITEMLINE, + _("The ical file seems to be malformed. " + "The end of item was not found.")); cleanup: - if (vtodo.note) - mem_free(vtodo.note); - if (vtodo.mesg) - mem_free(vtodo.mesg); - (*noskipped)++; + if (vtodo.note) + mem_free(vtodo.note); + if (vtodo.mesg) + mem_free(vtodo.mesg); + (*noskipped)++; } /* Import calcurse data. */ void -ical_import_data(FILE * stream, FILE * log, unsigned *events, unsigned *apoints, - unsigned *todos, unsigned *lines, unsigned *skipped) +ical_import_data(FILE * stream, FILE * log, unsigned *events, + unsigned *apoints, unsigned *todos, unsigned *lines, + unsigned *skipped) { - const char vevent[] = "BEGIN:VEVENT"; - const char vtodo[] = "BEGIN:VTODO"; - char buf[BUFSIZ], lstore[BUFSIZ]; - int major, minor; - - ical_readline_init(stream, buf, lstore, lines); - RETURN_IF(!ical_chk_header(stream, buf, lstore, lines, &major, &minor), - _("Warning: ical header malformed or wrong version number. " - "Aborting...")); - - ical_log_init(log, major, minor); - - while (ical_readline(stream, buf, lstore, lines)) { - (*lines)++; - if (strncasecmp(buf, vevent, sizeof(vevent) - 1) == 0) { - ical_read_event(stream, log, events, apoints, skipped, buf, lstore, - lines); - } else if (strncasecmp(buf, vtodo, sizeof(vtodo) - 1) == 0) { - ical_read_todo(stream, log, todos, skipped, buf, lstore, lines); - } - } + const char vevent[] = "BEGIN:VEVENT"; + const char vtodo[] = "BEGIN:VTODO"; + char buf[BUFSIZ], lstore[BUFSIZ]; + int major, minor; + + ical_readline_init(stream, buf, lstore, lines); + RETURN_IF(!ical_chk_header + (stream, buf, lstore, lines, &major, &minor), + _("Warning: ical header malformed or wrong version number. " + "Aborting...")); + + ical_log_init(log, major, minor); + + while (ical_readline(stream, buf, lstore, lines)) { + (*lines)++; + if (strncasecmp(buf, vevent, sizeof(vevent) - 1) == 0) { + ical_read_event(stream, log, events, apoints, + skipped, buf, lstore, lines); + } else if (strncasecmp(buf, vtodo, sizeof(vtodo) - 1) == 0) { + ical_read_todo(stream, log, todos, skipped, buf, + lstore, lines); + } + } } /* Export calcurse data. */ void ical_export_data(FILE * stream) { - ical_export_header(stream); - ical_export_recur_events(stream); - ical_export_events(stream); - ical_export_recur_apoints(stream); - ical_export_apoints(stream); - ical_export_todo(stream); - ical_export_footer(stream); + ical_export_header(stream); + ical_export_recur_events(stream); + ical_export_events(stream); + ical_export_recur_apoints(stream); + ical_export_apoints(stream); + ical_export_todo(stream); + ical_export_footer(stream); } @@ -48,40 +48,40 @@ #include "sha1.h" typedef enum { - PROGRESS_BAR_SAVE, - PROGRESS_BAR_LOAD, - PROGRESS_BAR_EXPORT + PROGRESS_BAR_SAVE, + PROGRESS_BAR_LOAD, + PROGRESS_BAR_EXPORT } progress_bar_t; enum { - PROGRESS_BAR_CONF, - PROGRESS_BAR_TODO, - PROGRESS_BAR_APTS, - PROGRESS_BAR_KEYS + PROGRESS_BAR_CONF, + PROGRESS_BAR_TODO, + PROGRESS_BAR_APTS, + PROGRESS_BAR_KEYS }; enum { - PROGRESS_BAR_EXPORT_EVENTS, - PROGRESS_BAR_EXPORT_APOINTS, - PROGRESS_BAR_EXPORT_TODO + PROGRESS_BAR_EXPORT_EVENTS, + PROGRESS_BAR_EXPORT_APOINTS, + PROGRESS_BAR_EXPORT_TODO }; struct ht_keybindings_s { - const char *label; - enum key key; - HTABLE_ENTRY(ht_keybindings_s); + const char *label; + enum key key; + HTABLE_ENTRY(ht_keybindings_s); }; static void load_keys_ht_getkey(struct ht_keybindings_s *, const char **, - int *); + int *); static int load_keys_ht_compare(struct ht_keybindings_s *, - struct ht_keybindings_s *); + struct ht_keybindings_s *); #define HSIZE 256 HTABLE_HEAD(ht_keybindings, HSIZE, ht_keybindings_s); HTABLE_PROTOTYPE(ht_keybindings, ht_keybindings_s) HTABLE_GENERATE(ht_keybindings, ht_keybindings_s, load_keys_ht_getkey, - load_keys_ht_compare) + load_keys_ht_compare) /* Draw a progress bar while saving, loading or exporting data. */ static void progress_bar(progress_bar_t type, int progress) @@ -89,59 +89,63 @@ static void progress_bar(progress_bar_t type, int progress) #define NBFILES 4 #define NBEXPORTED 3 #define LABELENGTH 15 - int i, step, steps; - const char *mesg_sav = _("Saving..."); - const char *mesg_load = _("Loading..."); - const char *mesg_export = _("Exporting..."); - const char *error_msg = _("Internal error while displaying progress bar"); - const char *barchar = "|"; - const char *file[NBFILES] = { - "[ conf ]", - "[ todo ]", - "[ apts ]", - "[ keys ]" - }; - const char *data[NBEXPORTED] = { - "[ events ]", - "[appointments]", - "[ todo ]" - }; - int ipos = LABELENGTH + 2; - int epos[NBFILES]; - - /* progress bar length init. */ - ipos = LABELENGTH + 2; - steps = (type == PROGRESS_BAR_EXPORT) ? NBEXPORTED : NBFILES; - step = floor(col / (steps + 1)); - for (i = 0; i < steps - 1; i++) - epos[i] = (i + 2) * step; - epos[steps - 1] = col - 2; - - switch (type) { - case PROGRESS_BAR_SAVE: - EXIT_IF(progress < 0 || progress > PROGRESS_BAR_KEYS, "%s", error_msg); - status_mesg(mesg_sav, file[progress]); - break; - case PROGRESS_BAR_LOAD: - EXIT_IF(progress < 0 || progress > PROGRESS_BAR_KEYS, "%s", error_msg); - status_mesg(mesg_load, file[progress]); - break; - case PROGRESS_BAR_EXPORT: - EXIT_IF(progress < 0 - || progress > PROGRESS_BAR_EXPORT_TODO, "%s", error_msg); - status_mesg(mesg_export, data[progress]); - break; - } - - /* Draw the progress bar. */ - mvwaddstr(win[STA].p, 1, ipos, barchar); - mvwaddstr(win[STA].p, 1, epos[steps - 1], barchar); - custom_apply_attr(win[STA].p, ATTR_HIGHEST); - for (i = ipos + 1; i < epos[progress]; i++) - mvwaddch(win[STA].p, 1, i, ' ' | A_REVERSE); - custom_remove_attr(win[STA].p, ATTR_HIGHEST); - wmove(win[STA].p, 0, 0); - wins_wrefresh(win[STA].p); + int i, step, steps; + const char *mesg_sav = _("Saving..."); + const char *mesg_load = _("Loading..."); + const char *mesg_export = _("Exporting..."); + const char *error_msg = + _("Internal error while displaying progress bar"); + const char *barchar = "|"; + const char *file[NBFILES] = { + "[ conf ]", + "[ todo ]", + "[ apts ]", + "[ keys ]" + }; + const char *data[NBEXPORTED] = { + "[ events ]", + "[appointments]", + "[ todo ]" + }; + int ipos = LABELENGTH + 2; + int epos[NBFILES]; + + /* progress bar length init. */ + ipos = LABELENGTH + 2; + steps = (type == PROGRESS_BAR_EXPORT) ? NBEXPORTED : NBFILES; + step = floor(col / (steps + 1)); + for (i = 0; i < steps - 1; i++) + epos[i] = (i + 2) * step; + epos[steps - 1] = col - 2; + + switch (type) { + case PROGRESS_BAR_SAVE: + EXIT_IF(progress < 0 + || progress > PROGRESS_BAR_KEYS, "%s", error_msg); + status_mesg(mesg_sav, file[progress]); + break; + case PROGRESS_BAR_LOAD: + EXIT_IF(progress < 0 + || progress > PROGRESS_BAR_KEYS, "%s", error_msg); + status_mesg(mesg_load, file[progress]); + break; + case PROGRESS_BAR_EXPORT: + EXIT_IF(progress < 0 + || progress > PROGRESS_BAR_EXPORT_TODO, "%s", + error_msg); + status_mesg(mesg_export, data[progress]); + break; + } + + /* Draw the progress bar. */ + mvwaddstr(win[STA].p, 1, ipos, barchar); + mvwaddstr(win[STA].p, 1, epos[steps - 1], barchar); + custom_apply_attr(win[STA].p, ATTR_HIGHEST); + for (i = ipos + 1; i < epos[progress]; i++) + mvwaddch(win[STA].p, 1, i, ' ' | A_REVERSE); + custom_remove_attr(win[STA].p, ATTR_HIGHEST); + wmove(win[STA].p, 0, 0); + wins_wrefresh(win[STA].p); #undef NBFILES #undef NBEXPORTED #undef LABELENGTH @@ -150,63 +154,66 @@ static void progress_bar(progress_bar_t type, int progress) /* Ask user for a file name to export data to. */ static FILE *get_export_stream(enum export_type type) { - FILE *stream; - char *home, *stream_name; - const char *question = _("Choose the file used to export calcurse data:"); - const char *wrong_name = - _("The file cannot be accessed, please enter another file name."); - const char *press_enter = _("Press [ENTER] to continue."); - const char *file_ext[IO_EXPORT_NBTYPES] = { "ical", "txt" }; - - stream = NULL; - stream_name = (char *)mem_malloc(BUFSIZ); - if ((home = getenv("HOME")) != NULL) - snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", home, file_ext[type]); - else - snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", get_tempdir(), - file_ext[type]); - - while (stream == NULL) { - status_mesg(question, ""); - if (updatestring(win[STA].p, &stream_name, 0, 1)) { - mem_free(stream_name); - return NULL; - } - stream = fopen(stream_name, "w"); - if (stream == NULL) { - status_mesg(wrong_name, press_enter); - wgetch(win[KEY].p); - } - } - mem_free(stream_name); - - return stream; + FILE *stream; + char *home, *stream_name; + const char *question = + _("Choose the file used to export calcurse data:"); + const char *wrong_name = + _("The file cannot be accessed, please enter another file name."); + const char *press_enter = _("Press [ENTER] to continue."); + const char *file_ext[IO_EXPORT_NBTYPES] = { "ical", "txt" }; + + stream = NULL; + stream_name = (char *)mem_malloc(BUFSIZ); + if ((home = getenv("HOME")) != NULL) + snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", home, + file_ext[type]); + else + snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", + get_tempdir(), file_ext[type]); + + while (stream == NULL) { + status_mesg(question, ""); + if (updatestring(win[STA].p, &stream_name, 0, 1)) { + mem_free(stream_name); + return NULL; + } + stream = fopen(stream_name, "w"); + if (stream == NULL) { + status_mesg(wrong_name, press_enter); + wgetch(win[KEY].p); + } + } + mem_free(stream_name); + + return stream; } /* Append a line to a file. */ unsigned io_fprintln(const char *fname, const char *fmt, ...) { - FILE *fp; - va_list ap; - char buf[BUFSIZ]; - int ret; + FILE *fp; + va_list ap; + char buf[BUFSIZ]; + int ret; - fp = fopen(fname, "a"); - RETVAL_IF(!fp, 0, _("Failed to open \"%s\", - %s\n"), fname, strerror(errno)); + fp = fopen(fname, "a"); + RETVAL_IF(!fp, 0, _("Failed to open \"%s\", - %s\n"), fname, + strerror(errno)); - va_start(ap, fmt); - ret = vsnprintf(buf, sizeof buf, fmt, ap); - RETVAL_IF(ret < 0, 0, _("Failed to build message\n")); - va_end(ap); + va_start(ap, fmt); + ret = vsnprintf(buf, sizeof buf, fmt, ap); + RETVAL_IF(ret < 0, 0, _("Failed to build message\n")); + va_end(ap); - ret = fprintf(fp, "%s", buf); - RETVAL_IF(ret < 0, 0, _("Failed to print message \"%s\"\n"), buf); + ret = fprintf(fp, "%s", buf); + RETVAL_IF(ret < 0, 0, _("Failed to print message \"%s\"\n"), buf); - ret = fclose(fp); - RETVAL_IF(ret != 0, 0, _("Failed to close \"%s\" - %s\n"), - fname, strerror(errno)); + ret = fclose(fp); + RETVAL_IF(ret != 0, 0, _("Failed to close \"%s\" - %s\n"), + fname, strerror(errno)); - return 1; + return 1; } /* @@ -218,90 +225,94 @@ unsigned io_fprintln(const char *fname, const char *fmt, ...) */ void io_init(const char *cfile, const char *datadir) { - FILE *data_file; - const char *home; - char apts_file[BUFSIZ] = ""; - int ch; - - if (datadir != NULL) { - home = datadir; - snprintf(path_dir, BUFSIZ, "%s", home); - snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH_NAME, home); - snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH_NAME, home); - snprintf(path_notes, BUFSIZ, "%s/" NOTES_DIR_NAME, home); - snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH_NAME, home); - snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH_NAME, home); - snprintf(path_dpid, BUFSIZ, "%s/" DPID_PATH_NAME, home); - snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH_NAME, home); - } else { - home = getenv("HOME"); - if (home == NULL) { - home = "."; - } - snprintf(path_dir, BUFSIZ, "%s/" DIR_NAME, home); - snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH, home); - snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH, home); - snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH, home); - snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH, home); - snprintf(path_dpid, BUFSIZ, "%s/" DPID_PATH, home); - snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH, home); - snprintf(path_notes, BUFSIZ, "%s/" NOTES_DIR, home); - } - - if (cfile == NULL) { - if (datadir != NULL) { - snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH_NAME, home); - } else { - snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH, home); - } - } else { - snprintf(apts_file, BUFSIZ, "%s", cfile); - strncpy(path_apts, apts_file, BUFSIZ); - /* check if the file exists, otherwise create it */ - data_file = fopen(path_apts, "r"); - if (data_file == NULL) { - printf(_("%s does not exist, create it now [y or n] ? "), path_apts); - ch = getchar(); - switch (ch) { - case 'N': - case 'n': - puts(_("aborting...\n")); - exit_calcurse(EXIT_FAILURE); - break; - - case 'Y': - case 'y': - data_file = fopen(path_apts, "w"); - if (data_file == NULL) { - perror(path_apts); - exit_calcurse(EXIT_FAILURE); - } else { - printf(_("%s successfully created\n"), path_apts); - puts(_("starting interactive mode...\n")); - } - break; - - default: - puts(_("aborting...\n")); - exit_calcurse(EXIT_FAILURE); - break; - } - } - file_close(data_file, __FILE_POS__); - } + FILE *data_file; + const char *home; + char apts_file[BUFSIZ] = ""; + int ch; + + if (datadir != NULL) { + home = datadir; + snprintf(path_dir, BUFSIZ, "%s", home); + snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH_NAME, home); + snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH_NAME, home); + snprintf(path_notes, BUFSIZ, "%s/" NOTES_DIR_NAME, home); + snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH_NAME, home); + snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH_NAME, home); + snprintf(path_dpid, BUFSIZ, "%s/" DPID_PATH_NAME, home); + snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH_NAME, + home); + } else { + home = getenv("HOME"); + if (home == NULL) { + home = "."; + } + snprintf(path_dir, BUFSIZ, "%s/" DIR_NAME, home); + snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH, home); + snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH, home); + snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH, home); + snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH, home); + snprintf(path_dpid, BUFSIZ, "%s/" DPID_PATH, home); + snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH, home); + snprintf(path_notes, BUFSIZ, "%s/" NOTES_DIR, home); + } + + if (cfile == NULL) { + if (datadir != NULL) { + snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH_NAME, + home); + } else { + snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH, home); + } + } else { + snprintf(apts_file, BUFSIZ, "%s", cfile); + strncpy(path_apts, apts_file, BUFSIZ); + /* check if the file exists, otherwise create it */ + data_file = fopen(path_apts, "r"); + if (data_file == NULL) { + printf(_("%s does not exist, create it now [y or n] ? "), + path_apts); + ch = getchar(); + switch (ch) { + case 'N': + case 'n': + puts(_("aborting...\n")); + exit_calcurse(EXIT_FAILURE); + break; + + case 'Y': + case 'y': + data_file = fopen(path_apts, "w"); + if (data_file == NULL) { + perror(path_apts); + exit_calcurse(EXIT_FAILURE); + } else { + printf(_("%s successfully created\n"), + path_apts); + puts(_("starting interactive mode...\n")); + } + break; + + default: + puts(_("aborting...\n")); + exit_calcurse(EXIT_FAILURE); + break; + } + } + file_close(data_file, __FILE_POS__); + } } void io_extract_data(char *dst_data, const char *org, int len) { - int i; - - for (; *org == ' ' || *org == '\t'; org++) ; - for (i = 0; i < len - 1; i++) { - if (*org == '\n' || *org == '\0' || *org == '#') - break; - *dst_data++ = *org++; - } - *dst_data = '\0'; + int i; + + for (; *org == ' ' || *org == '\t'; org++) ; + for (i = 0; i < len - 1; i++) { + if (*org == '\n' || *org == '\0' || *org == '#') + break; + *dst_data++ = *org++; + } + *dst_data = '\0'; } static pthread_mutex_t io_save_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -313,124 +324,125 @@ static pthread_mutex_t io_save_mutex = PTHREAD_MUTEX_INITIALIZER; */ unsigned io_save_apts(void) { - llist_item_t *i; - FILE *fp; + llist_item_t *i; + FILE *fp; - if (read_only) - return 1; + if (read_only) + return 1; - if ((fp = fopen(path_apts, "w")) == NULL) - return 0; + if ((fp = fopen(path_apts, "w")) == NULL) + return 0; - recur_save_data(fp); + recur_save_data(fp); - if (ui_mode == UI_CURSES) - LLIST_TS_LOCK(&alist_p); - LLIST_TS_FOREACH(&alist_p, i) { - struct apoint *apt = LLIST_TS_GET_DATA(i); - apoint_write(apt, fp); - } - if (ui_mode == UI_CURSES) - LLIST_TS_UNLOCK(&alist_p); + if (ui_mode == UI_CURSES) + LLIST_TS_LOCK(&alist_p); + LLIST_TS_FOREACH(&alist_p, i) { + struct apoint *apt = LLIST_TS_GET_DATA(i); + apoint_write(apt, fp); + } + if (ui_mode == UI_CURSES) + LLIST_TS_UNLOCK(&alist_p); - LLIST_FOREACH(&eventlist, i) { - struct event *ev = LLIST_TS_GET_DATA(i); - event_write(ev, fp); - } - file_close(fp, __FILE_POS__); + LLIST_FOREACH(&eventlist, i) { + struct event *ev = LLIST_TS_GET_DATA(i); + event_write(ev, fp); + } + file_close(fp, __FILE_POS__); - return 1; + return 1; } /* Save the todo data file. */ unsigned io_save_todo(void) { - llist_item_t *i; - FILE *fp; + llist_item_t *i; + FILE *fp; - if (read_only) - return 1; + if (read_only) + return 1; - if ((fp = fopen(path_todo, "w")) == NULL) - return 0; + if ((fp = fopen(path_todo, "w")) == NULL) + return 0; - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_TS_GET_DATA(i); - todo_write(todo, fp); - } - file_close(fp, __FILE_POS__); + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_TS_GET_DATA(i); + todo_write(todo, fp); + } + file_close(fp, __FILE_POS__); - return 1; + return 1; } /* Save user-defined keys */ unsigned io_save_keys(void) { - FILE *fp; + FILE *fp; - if (read_only) - return 1; + if (read_only) + return 1; - if ((fp = fopen(path_keys, "w")) == NULL) - return 0; + if ((fp = fopen(path_keys, "w")) == NULL) + return 0; - keys_save_bindings(fp); - file_close(fp, __FILE_POS__); + keys_save_bindings(fp); + file_close(fp, __FILE_POS__); - return 1; + return 1; } /* Save the calendar data */ void io_save_cal(enum save_display display) { - const char *access_pb = _("Problems accessing data file ..."); - const char *save_success = _("The data files were successfully saved"); - const char *enter = _("Press [ENTER] to continue"); - int show_bar; - - if (read_only) - return; - - pthread_mutex_lock(&io_save_mutex); - - show_bar = 0; - if (ui_mode == UI_CURSES && display == IO_SAVE_DISPLAY_BAR - && conf.progress_bar) - show_bar = 1; - - if (show_bar) - progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_CONF); - if (!config_save()) - ERROR_MSG("%s", access_pb); - - if (show_bar) - progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_TODO); - if (!io_save_todo()) - ERROR_MSG("%s", access_pb); - - if (show_bar) - progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_APTS); - if (!io_save_apts()) - ERROR_MSG("%s", access_pb); - - if (show_bar) - progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_KEYS); - if (!io_save_keys()) - ERROR_MSG("%s", access_pb); - - /* Print a message telling data were saved */ - if (ui_mode == UI_CURSES && conf.system_dialogs) { - status_mesg(save_success, enter); - wgetch(win[KEY].p); - } - - pthread_mutex_unlock(&io_save_mutex); + const char *access_pb = _("Problems accessing data file ..."); + const char *save_success = + _("The data files were successfully saved"); + const char *enter = _("Press [ENTER] to continue"); + int show_bar; + + if (read_only) + return; + + pthread_mutex_lock(&io_save_mutex); + + show_bar = 0; + if (ui_mode == UI_CURSES && display == IO_SAVE_DISPLAY_BAR + && conf.progress_bar) + show_bar = 1; + + if (show_bar) + progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_CONF); + if (!config_save()) + ERROR_MSG("%s", access_pb); + + if (show_bar) + progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_TODO); + if (!io_save_todo()) + ERROR_MSG("%s", access_pb); + + if (show_bar) + progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_APTS); + if (!io_save_apts()) + ERROR_MSG("%s", access_pb); + + if (show_bar) + progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_KEYS); + if (!io_save_keys()) + ERROR_MSG("%s", access_pb); + + /* Print a message telling data were saved */ + if (ui_mode == UI_CURSES && conf.system_dialogs) { + status_mesg(save_success, enter); + wgetch(win[KEY].p); + } + + pthread_mutex_unlock(&io_save_mutex); } static void io_load_error(const char *filename, unsigned line, - const char *mesg) + const char *mesg) { - EXIT("%s:%u: %s", filename, line, mesg); + EXIT("%s:%u: %s", filename, line, mesg); } /* @@ -440,230 +452,252 @@ static void io_load_error(const char *filename, unsigned line, */ void io_load_app(void) { - FILE *data_file; - int c, is_appointment, is_event, is_recursive; - struct tm start, end, until, lt; - llist_t exc; - time_t t; - int id = 0; - int freq; - char type, state = 0L; - char note[MAX_NOTESIZ + 1], *notep; - unsigned line = 0; - - t = time(NULL); - localtime_r(&t, <); - start = end = until = lt; - - data_file = fopen(path_apts, "r"); - EXIT_IF(data_file == NULL, _("failed to open appointment file")); - - for (;;) { - LLIST_INIT(&exc); - is_appointment = is_event = is_recursive = 0; - line++; - c = getc(data_file); - if (c == EOF) - break; - ungetc(c, data_file); - - /* Read the date first: it is common to both events - * and appointments. - */ - if (fscanf(data_file, "%d / %d / %d ", - &start.tm_mon, &start.tm_mday, &start.tm_year) != 3) - io_load_error(path_apts, line, _("syntax error in the item date")); - - /* Read the next character : if it is an '@' then we have - * an appointment, else if it is an '[' we have en event. - */ - c = getc(data_file); - - if (c == '@') - is_appointment = 1; - else if (c == '[') - is_event = 1; - else - io_load_error(path_apts, line, _("no event nor appointment found")); - - /* Read the remaining informations. */ - if (is_appointment) { - if (fscanf(data_file, " %d : %d -> %d / %d / %d @ %d : %d ", - &start.tm_hour, &start.tm_min, - &end.tm_mon, &end.tm_mday, &end.tm_year, - &end.tm_hour, &end.tm_min) != 7) - io_load_error(path_apts, line, - _("syntax error in item time or duration")); - } else if (is_event) { - if (fscanf(data_file, " %d ", &id) != 1 || getc(data_file) != ']') - io_load_error(path_apts, line, _("syntax error in item identifier")); - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else { - io_load_error(path_apts, line, - _("wrong format in the appointment or event")); - /* NOTREACHED */ - } - - /* Check if we have a recursive item. */ - c = getc(data_file); - - if (c == '{') { - is_recursive = 1; - if (fscanf(data_file, " %d%c ", &freq, &type) != 2) - io_load_error(path_apts, line, _("syntax error in item repetition")); - - c = getc(data_file); - if (c == '}') { /* endless recurrent item */ - until.tm_year = 0; - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else if (c == '-' && getc(data_file) == '>') { - if (fscanf(data_file, " %d / %d / %d ", &until.tm_mon, - &until.tm_mday, &until.tm_year) != 3) - io_load_error(path_apts, line, _("syntax error in item repetition")); - c = getc(data_file); - if (c == '!') { - ungetc(c, data_file); - recur_exc_scan(&exc, data_file); - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else if (c == '}') { - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else { - io_load_error(path_apts, line, _("syntax error in item repetition")); - } - } else if (c == '!') { /* endless item with exceptions */ - ungetc(c, data_file); - recur_exc_scan(&exc, data_file); - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - until.tm_year = 0; - } else { - io_load_error(path_apts, line, - _("wrong format in the appointment or event")); - /* NOTREACHED */ - } - } else { - ungetc(c, data_file); - } - - /* Check if a note is attached to the item. */ - c = getc(data_file); - if (c == '>') { - note_read(note, data_file); - notep = note; - } else { - notep = NULL; - ungetc(c, data_file); - } - - /* - * Last: read the item description and load it into its - * corresponding linked list, depending on the item type. - */ - if (is_appointment) { - c = getc(data_file); - if (c == '!') { - state |= APOINT_NOTIFY; - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else if (c == '|') { - state = 0L; - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else { - io_load_error(path_apts, line, _("syntax error in item repetition")); - } - if (is_recursive) { - recur_apoint_scan(data_file, start, end, - type, freq, until, notep, &exc, state); - } else { - apoint_scan(data_file, start, end, state, notep); - } - } else if (is_event) { - if (is_recursive) { - recur_event_scan(data_file, start, id, type, freq, until, notep, &exc); - } else { - event_scan(data_file, start, id, notep); - } - } else { - io_load_error(path_apts, line, - _("wrong format in the appointment or event")); - /* NOTREACHED */ - } - } - file_close(data_file, __FILE_POS__); + FILE *data_file; + int c, is_appointment, is_event, is_recursive; + struct tm start, end, until, lt; + llist_t exc; + time_t t; + int id = 0; + int freq; + char type, state = 0L; + char note[MAX_NOTESIZ + 1], *notep; + unsigned line = 0; + + t = time(NULL); + localtime_r(&t, <); + start = end = until = lt; + + data_file = fopen(path_apts, "r"); + EXIT_IF(data_file == NULL, _("failed to open appointment file")); + + for (;;) { + LLIST_INIT(&exc); + is_appointment = is_event = is_recursive = 0; + line++; + c = getc(data_file); + if (c == EOF) + break; + ungetc(c, data_file); + + /* Read the date first: it is common to both events + * and appointments. + */ + if (fscanf(data_file, "%d / %d / %d ", + &start.tm_mon, &start.tm_mday, + &start.tm_year) != 3) + io_load_error(path_apts, line, + _("syntax error in the item date")); + + /* Read the next character : if it is an '@' then we have + * an appointment, else if it is an '[' we have en event. + */ + c = getc(data_file); + + if (c == '@') + is_appointment = 1; + else if (c == '[') + is_event = 1; + else + io_load_error(path_apts, line, + _("no event nor appointment found")); + + /* Read the remaining informations. */ + if (is_appointment) { + if (fscanf + (data_file, + " %d : %d -> %d / %d / %d @ %d : %d ", + &start.tm_hour, &start.tm_min, &end.tm_mon, + &end.tm_mday, &end.tm_year, &end.tm_hour, + &end.tm_min) != 7) + io_load_error(path_apts, line, + _("syntax error in item time or duration")); + } else if (is_event) { + if (fscanf(data_file, " %d ", &id) != 1 + || getc(data_file) != ']') + io_load_error(path_apts, line, + _("syntax error in item identifier")); + while ((c = getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else { + io_load_error(path_apts, line, + _("wrong format in the appointment or event")); + /* NOTREACHED */ + } + + /* Check if we have a recursive item. */ + c = getc(data_file); + + if (c == '{') { + is_recursive = 1; + if (fscanf(data_file, " %d%c ", &freq, &type) != 2) + io_load_error(path_apts, line, + _("syntax error in item repetition")); + + c = getc(data_file); + if (c == '}') { /* endless recurrent item */ + until.tm_year = 0; + while ((c = getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else if (c == '-' && getc(data_file) == '>') { + if (fscanf + (data_file, " %d / %d / %d ", + &until.tm_mon, &until.tm_mday, + &until.tm_year) != 3) + io_load_error(path_apts, line, + _("syntax error in item repetition")); + c = getc(data_file); + if (c == '!') { + ungetc(c, data_file); + recur_exc_scan(&exc, data_file); + while ((c = + getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else if (c == '}') { + while ((c = + getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else { + io_load_error(path_apts, line, + _("syntax error in item repetition")); + } + } else if (c == '!') { /* endless item with exceptions */ + ungetc(c, data_file); + recur_exc_scan(&exc, data_file); + while ((c = getc(data_file)) == ' ') ; + ungetc(c, data_file); + until.tm_year = 0; + } else { + io_load_error(path_apts, line, + _("wrong format in the appointment or event")); + /* NOTREACHED */ + } + } else { + ungetc(c, data_file); + } + + /* Check if a note is attached to the item. */ + c = getc(data_file); + if (c == '>') { + note_read(note, data_file); + notep = note; + } else { + notep = NULL; + ungetc(c, data_file); + } + + /* + * Last: read the item description and load it into its + * corresponding linked list, depending on the item type. + */ + if (is_appointment) { + c = getc(data_file); + if (c == '!') { + state |= APOINT_NOTIFY; + while ((c = getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else if (c == '|') { + state = 0L; + while ((c = getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else { + io_load_error(path_apts, line, + _("syntax error in item repetition")); + } + if (is_recursive) { + recur_apoint_scan(data_file, start, end, + type, freq, until, notep, + &exc, state); + } else { + apoint_scan(data_file, start, end, state, + notep); + } + } else if (is_event) { + if (is_recursive) { + recur_event_scan(data_file, start, id, + type, freq, until, notep, + &exc); + } else { + event_scan(data_file, start, id, notep); + } + } else { + io_load_error(path_apts, line, + _("wrong format in the appointment or event")); + /* NOTREACHED */ + } + } + file_close(data_file, __FILE_POS__); } /* Load the todo data */ void io_load_todo(void) { - FILE *data_file; - char *newline; - int nb_tod = 0; - int c, id; - char buf[BUFSIZ], e_todo[BUFSIZ], note[MAX_NOTESIZ + 1]; - unsigned line = 0; - - data_file = fopen(path_todo, "r"); - EXIT_IF(data_file == NULL, _("failed to open todo file")); - - for (;;) { - line++; - c = getc(data_file); - if (c == EOF) { - break; - } else if (c == '[') { /* new style with id */ - if (fscanf(data_file, " %d ", &id) != 1 || getc(data_file) != ']') - io_load_error(path_todo, line, _("syntax error in item identifier")); - while ((c = getc(data_file)) == ' ') ; - ungetc(c, data_file); - } else { - id = 9; - ungetc(c, data_file); - } - /* Now read the attached note, if any. */ - c = getc(data_file); - if (c == '>') { - note_read(note, data_file); - } else { - note[0] = '\0'; - ungetc(c, data_file); - } - /* Then read todo description. */ - if (!fgets(buf, sizeof buf, data_file)) - buf[0] = '\0'; - newline = strchr(buf, '\n'); - if (newline) - *newline = '\0'; - io_extract_data(e_todo, buf, sizeof buf); - todo_add(e_todo, id, note); - ++nb_tod; - } - file_close(data_file, __FILE_POS__); - ui_todo_set_nb(nb_tod); + FILE *data_file; + char *newline; + int nb_tod = 0; + int c, id; + char buf[BUFSIZ], e_todo[BUFSIZ], note[MAX_NOTESIZ + 1]; + unsigned line = 0; + + data_file = fopen(path_todo, "r"); + EXIT_IF(data_file == NULL, _("failed to open todo file")); + + for (;;) { + line++; + c = getc(data_file); + if (c == EOF) { + break; + } else if (c == '[') { /* new style with id */ + if (fscanf(data_file, " %d ", &id) != 1 + || getc(data_file) != ']') + io_load_error(path_todo, line, + _("syntax error in item identifier")); + while ((c = getc(data_file)) == ' ') ; + ungetc(c, data_file); + } else { + id = 9; + ungetc(c, data_file); + } + /* Now read the attached note, if any. */ + c = getc(data_file); + if (c == '>') { + note_read(note, data_file); + } else { + note[0] = '\0'; + ungetc(c, data_file); + } + /* Then read todo description. */ + if (!fgets(buf, sizeof buf, data_file)) + buf[0] = '\0'; + newline = strchr(buf, '\n'); + if (newline) + *newline = '\0'; + io_extract_data(e_todo, buf, sizeof buf); + todo_add(e_todo, id, note); + ++nb_tod; + } + file_close(data_file, __FILE_POS__); + ui_todo_set_nb(nb_tod); } static void -load_keys_ht_getkey(struct ht_keybindings_s *data, const char **key, int *len) +load_keys_ht_getkey(struct ht_keybindings_s *data, const char **key, + int *len) { - *key = data->label; - *len = strlen(data->label); + *key = data->label; + *len = strlen(data->label); } static int load_keys_ht_compare(struct ht_keybindings_s *data1, - struct ht_keybindings_s *data2) + struct ht_keybindings_s *data2) { - const int KEYLEN = strlen(data1->label); + const int KEYLEN = strlen(data1->label); - if (strlen(data2->label) == KEYLEN - && !memcmp(data1->label, data2->label, KEYLEN)) - return 0; - else - return 1; + if (strlen(data2->label) == KEYLEN + && !memcmp(data1->label, data2->label, KEYLEN)) + return 0; + else + return 1; } /* @@ -673,7 +707,7 @@ load_keys_ht_compare(struct ht_keybindings_s *data1, */ static int is_blank(int c) { - return c == ' ' || c == '\t'; + return c == ' ' || c == '\t'; } /* @@ -685,176 +719,192 @@ static int is_blank(int c) */ void io_load_keys(const char *pager) { - struct ht_keybindings_s keys[NBKEYS]; - FILE *keyfp; - char buf[BUFSIZ]; - struct io_file *log; - int i, skipped, loaded, line; - const int MAX_ERRORS = 5; - - keys_init(); - - struct ht_keybindings ht_keys = HTABLE_INITIALIZER(&ht_keys); - - for (i = 0; i < NBKEYS; i++) { - keys[i].key = (enum key)i; - keys[i].label = keys_get_label((enum key)i); - HTABLE_INSERT(ht_keybindings, &ht_keys, &keys[i]); - } - - keyfp = fopen(path_keys, "r"); - EXIT_IF(keyfp == NULL, _("failed to open key file")); - - log = io_log_init(); - skipped = loaded = line = 0; - while (fgets(buf, BUFSIZ, keyfp) != NULL) { - char key_label[BUFSIZ], *p; - struct ht_keybindings_s *ht_elm, ht_entry; - const int AWAITED = 1; - int assigned; - - line++; - if (skipped > MAX_ERRORS) { - const char *too_many = - _("\nToo many errors while reading configuration file!\n" - "Please backup your keys file, remove it from directory, " - "and launch calcurse again.\n"); - - io_log_print(log, line, too_many); - break; - } - for (p = buf; is_blank((int)*p); p++) ; - if (p != buf) - memmove(buf, p, strlen(p)); - if (buf[0] == '#' || buf[0] == '\n') - continue; - - if (sscanf(buf, "%s", key_label) != AWAITED) { - skipped++; - io_log_print(log, line, _("Could not read key label")); - continue; - } - - /* Skip legacy entries. */ - if (strcmp(key_label, "generic-cut") == 0) - continue; - - ht_entry.label = key_label; - p = buf + strlen(key_label) + 1; - ht_elm = HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry); - if (!ht_elm) { - skipped++; - io_log_print(log, line, _("Key label not recognized")); - continue; - } - assigned = 0; - for (;;) { - char key_ch[BUFSIZ], tmpbuf[BUFSIZ]; - - while (*p == ' ') - p++; - (void)strncpy(tmpbuf, p, BUFSIZ); - if (sscanf(tmpbuf, "%s", key_ch) == AWAITED) { - int ch; - - if ((ch = keys_str2int(key_ch)) < 0) { - char unknown_key[BUFSIZ]; - - skipped++; - (void)snprintf(unknown_key, BUFSIZ, - _("Error reading key: \"%s\""), key_ch); - io_log_print(log, line, unknown_key); - } else { - int used; - - used = keys_assign_binding(ch, ht_elm->key); - if (used) { - char already_assigned[BUFSIZ]; - - skipped++; - (void)snprintf(already_assigned, BUFSIZ, - _("\"%s\" assigned multiple times!"), key_ch); - io_log_print(log, line, already_assigned); - } else { - assigned++; - } - } - p += strlen(key_ch) + 1; - } else { - if (assigned) - loaded++; - break; - } - } - } - file_close(keyfp, __FILE_POS__); - file_close(log->fd, __FILE_POS__); - if (skipped > 0) { - const char *view_log = - _("There were some errors when loading keys file, see log file ?"); - - io_log_display(log, view_log, pager); - } - io_log_free(log); - EXIT_IF(skipped > MAX_ERRORS, - _("Too many errors while reading keys file, aborting...")); - if (loaded < NBKEYS) - keys_fill_missing(); - if (keys_check_missing_bindings()) - WARN_MSG(_("Some actions do not have any associated key bindings!")); + struct ht_keybindings_s keys[NBKEYS]; + FILE *keyfp; + char buf[BUFSIZ]; + struct io_file *log; + int i, skipped, loaded, line; + const int MAX_ERRORS = 5; + + keys_init(); + + struct ht_keybindings ht_keys = HTABLE_INITIALIZER(&ht_keys); + + for (i = 0; i < NBKEYS; i++) { + keys[i].key = (enum key)i; + keys[i].label = keys_get_label((enum key)i); + HTABLE_INSERT(ht_keybindings, &ht_keys, &keys[i]); + } + + keyfp = fopen(path_keys, "r"); + EXIT_IF(keyfp == NULL, _("failed to open key file")); + + log = io_log_init(); + skipped = loaded = line = 0; + while (fgets(buf, BUFSIZ, keyfp) != NULL) { + char key_label[BUFSIZ], *p; + struct ht_keybindings_s *ht_elm, ht_entry; + const int AWAITED = 1; + int assigned; + + line++; + if (skipped > MAX_ERRORS) { + const char *too_many = + _("\nToo many errors while reading configuration file!\n" + "Please backup your keys file, remove it from directory, " + "and launch calcurse again.\n"); + + io_log_print(log, line, too_many); + break; + } + for (p = buf; is_blank((int)*p); p++) ; + if (p != buf) + memmove(buf, p, strlen(p)); + if (buf[0] == '#' || buf[0] == '\n') + continue; + + if (sscanf(buf, "%s", key_label) != AWAITED) { + skipped++; + io_log_print(log, line, + _("Could not read key label")); + continue; + } + + /* Skip legacy entries. */ + if (strcmp(key_label, "generic-cut") == 0) + continue; + + ht_entry.label = key_label; + p = buf + strlen(key_label) + 1; + ht_elm = + HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry); + if (!ht_elm) { + skipped++; + io_log_print(log, line, + _("Key label not recognized")); + continue; + } + assigned = 0; + for (;;) { + char key_ch[BUFSIZ], tmpbuf[BUFSIZ]; + + while (*p == ' ') + p++; + (void)strncpy(tmpbuf, p, BUFSIZ); + if (sscanf(tmpbuf, "%s", key_ch) == AWAITED) { + int ch; + + if ((ch = keys_str2int(key_ch)) < 0) { + char unknown_key[BUFSIZ]; + + skipped++; + (void)snprintf(unknown_key, BUFSIZ, + _("Error reading key: \"%s\""), + key_ch); + io_log_print(log, line, + unknown_key); + } else { + int used; + + used = + keys_assign_binding(ch, + ht_elm-> + key); + if (used) { + char already_assigned + [BUFSIZ]; + + skipped++; + (void) + snprintf + (already_assigned, + BUFSIZ, + _("\"%s\" assigned multiple times!"), + key_ch); + io_log_print(log, line, + already_assigned); + } else { + assigned++; + } + } + p += strlen(key_ch) + 1; + } else { + if (assigned) + loaded++; + break; + } + } + } + file_close(keyfp, __FILE_POS__); + file_close(log->fd, __FILE_POS__); + if (skipped > 0) { + const char *view_log = + _("There were some errors when loading keys file, see log file ?"); + + io_log_display(log, view_log, pager); + } + io_log_free(log); + EXIT_IF(skipped > MAX_ERRORS, + _("Too many errors while reading keys file, aborting...")); + if (loaded < NBKEYS) + keys_fill_missing(); + if (keys_check_missing_bindings()) + WARN_MSG(_("Some actions do not have any associated key bindings!")); } int io_check_dir(const char *dir) { - if (read_only) - return -1; - - errno = 0; - if (mkdir(dir, 0700) != 0) { - if (errno != EEXIST) { - fprintf(stderr, _("FATAL ERROR: could not create %s: %s\n"), dir, - strerror(errno)); - exit_calcurse(EXIT_FAILURE); - } else { - return 1; - } - } else { - return 0; - } + if (read_only) + return -1; + + errno = 0; + if (mkdir(dir, 0700) != 0) { + if (errno != EEXIST) { + fprintf(stderr, + _("FATAL ERROR: could not create %s: %s\n"), + dir, strerror(errno)); + exit_calcurse(EXIT_FAILURE); + } else { + return 1; + } + } else { + return 0; + } } unsigned io_file_exist(const char *file) { - FILE *fd; - - if (file && (fd = fopen(file, "r")) != NULL) { - fclose(fd); - return 1; - } else { - return 0; - } + FILE *fd; + + if (file && (fd = fopen(file, "r")) != NULL) { + fclose(fd); + return 1; + } else { + return 0; + } } int io_check_file(const char *file) { - if (read_only) - return -1; - - errno = 0; - if (io_file_exist(file)) { - return 1; - } else { - FILE *fd; - - if ((fd = fopen(file, "w")) == NULL) { - fprintf(stderr, _("FATAL ERROR: could not create %s: %s\n"), file, - strerror(errno)); - exit_calcurse(EXIT_FAILURE); - } - file_close(fd, __FILE_POS__); - - return 0; - } + if (read_only) + return -1; + + errno = 0; + if (io_file_exist(file)) { + return 1; + } else { + FILE *fd; + + if ((fd = fopen(file, "w")) == NULL) { + fprintf(stderr, + _("FATAL ERROR: could not create %s: %s\n"), + file, strerror(errno)); + exit_calcurse(EXIT_FAILURE); + } + file_close(fd, __FILE_POS__); + + return 0; + } } /* @@ -871,98 +921,100 @@ int io_check_file(const char *file) */ int io_check_data_files(void) { - int missing = 0; + int missing = 0; - missing += io_check_dir(path_dir) ? 0 : 1; - missing += io_check_dir(path_notes) ? 0 : 1; - missing += io_check_file(path_todo) ? 0 : 1; - missing += io_check_file(path_apts) ? 0 : 1; - missing += io_check_file(path_conf) ? 0 : 1; + missing += io_check_dir(path_dir) ? 0 : 1; + missing += io_check_dir(path_notes) ? 0 : 1; + missing += io_check_file(path_todo) ? 0 : 1; + missing += io_check_file(path_apts) ? 0 : 1; + missing += io_check_file(path_conf) ? 0 : 1; - if (!io_check_file(path_keys)) { - missing++; - keys_dump_defaults(path_keys); - } + if (!io_check_file(path_keys)) { + missing++; + keys_dump_defaults(path_keys); + } - return missing; + return missing; } /* Draw the startup screen */ void io_startup_screen(int no_data_file) { - const char *enter = _("Press [ENTER] to continue"); + const char *enter = _("Press [ENTER] to continue"); - if (no_data_file) - status_mesg(_("Welcome to Calcurse. Missing data files were created."), - enter); - else - status_mesg(_("Data files found. Data will be loaded now."), enter); + if (no_data_file) + status_mesg(_("Welcome to Calcurse. Missing data files were created."), + enter); + else + status_mesg(_("Data files found. Data will be loaded now."), + enter); - wgetch(win[KEY].p); + wgetch(win[KEY].p); } /* Export calcurse data. */ void io_export_data(enum export_type type) { - FILE *stream = NULL; - const char *success = _("The data were successfully exported"); - const char *enter = _("Press [ENTER] to continue"); - - if (type < IO_EXPORT_ICAL || type >= IO_EXPORT_NBTYPES) - EXIT(_("unknown export type")); - - switch (ui_mode) { - case UI_CMDLINE: - stream = stdout; - break; - case UI_CURSES: - stream = get_export_stream(type); - break; - default: - EXIT(_("wrong export mode")); - /* NOTREACHED */ - } - - if (stream == NULL) - return; - - if (type == IO_EXPORT_ICAL) - ical_export_data(stream); - else if (type == IO_EXPORT_PCAL) - pcal_export_data(stream); - - if (conf.system_dialogs && ui_mode == UI_CURSES) { - status_mesg(success, enter); - wgetch(win[KEY].p); - } + FILE *stream = NULL; + const char *success = _("The data were successfully exported"); + const char *enter = _("Press [ENTER] to continue"); + + if (type < IO_EXPORT_ICAL || type >= IO_EXPORT_NBTYPES) + EXIT(_("unknown export type")); + + switch (ui_mode) { + case UI_CMDLINE: + stream = stdout; + break; + case UI_CURSES: + stream = get_export_stream(type); + break; + default: + EXIT(_("wrong export mode")); + /* NOTREACHED */ + } + + if (stream == NULL) + return; + + if (type == IO_EXPORT_ICAL) + ical_export_data(stream); + else if (type == IO_EXPORT_PCAL) + pcal_export_data(stream); + + if (conf.system_dialogs && ui_mode == UI_CURSES) { + status_mesg(success, enter); + wgetch(win[KEY].p); + } } static FILE *get_import_stream(enum import_type type) { - FILE *stream = NULL; - char *stream_name; - const char *ask_fname = _("Enter the file name to import data from:"); - const char *wrong_file = - _("The file cannot be accessed, please enter another file name."); - const char *press_enter = _("Press [ENTER] to continue."); - - stream_name = mem_malloc(BUFSIZ); - memset(stream_name, 0, BUFSIZ); - while (stream == NULL) { - status_mesg(ask_fname, ""); - if (updatestring(win[STA].p, &stream_name, 0, 1)) { - mem_free(stream_name); - return NULL; - } - stream = fopen(stream_name, "r"); - if (stream == NULL) { - status_mesg(wrong_file, press_enter); - wgetch(win[KEY].p); - } - } - mem_free(stream_name); - - return stream; + FILE *stream = NULL; + char *stream_name; + const char *ask_fname = + _("Enter the file name to import data from:"); + const char *wrong_file = + _("The file cannot be accessed, please enter another file name."); + const char *press_enter = _("Press [ENTER] to continue."); + + stream_name = mem_malloc(BUFSIZ); + memset(stream_name, 0, BUFSIZ); + while (stream == NULL) { + status_mesg(ask_fname, ""); + if (updatestring(win[STA].p, &stream_name, 0, 1)) { + mem_free(stream_name); + return NULL; + } + stream = fopen(stream_name, "r"); + if (stream == NULL) { + status_mesg(wrong_file, press_enter); + wgetch(win[KEY].p); + } + } + mem_free(stream_name); + + return stream; } /* @@ -973,146 +1025,153 @@ static FILE *get_import_stream(enum import_type type) */ void io_import_data(enum import_type type, const char *stream_name) { - const char *proc_report = _("Import process report: %04d lines read "); - char stats_str[4][BUFSIZ]; - FILE *stream = NULL; - struct io_file *log; - struct { - unsigned events, apoints, todos, lines, skipped; - } stats; - - EXIT_IF(type < 0 || type >= IO_IMPORT_NBTYPES, _("unknown import type")); - switch (ui_mode) { - case UI_CMDLINE: - stream = fopen(stream_name, "r"); - EXIT_IF(stream == NULL, - _("FATAL ERROR: the input file cannot be accessed, " - "Aborting...")); - break; - case UI_CURSES: - stream = get_import_stream(type); - break; - default: - EXIT(_("FATAL ERROR: wrong import mode")); - /* NOTREACHED */ - } - - if (stream == NULL) - return; - - memset(&stats, 0, sizeof stats); - - log = io_log_init(); - if (log == NULL) { - if (stream != stdin) - file_close(stream, __FILE_POS__); - return; - } - - if (type == IO_IMPORT_ICAL) - ical_import_data(stream, log->fd, &stats.events, &stats.apoints, - &stats.todos, &stats.lines, &stats.skipped); - - if (stream != stdin) - file_close(stream, __FILE_POS__); - - snprintf(stats_str[0], BUFSIZ, - ngettext("%d app", "%d apps", stats.apoints), stats.apoints); - snprintf(stats_str[1], BUFSIZ, - ngettext("%d event", "%d events", stats.events), stats.events); - snprintf(stats_str[2], BUFSIZ, - ngettext("%d todo", "%d todos", stats.todos), stats.todos); - snprintf(stats_str[3], BUFSIZ, _("%d skipped"), stats.skipped); - - /* Update the number of todo items. */ - ui_todo_set_nb(ui_todo_nb() + stats.todos); - - if (ui_mode == UI_CURSES && conf.system_dialogs) { - char read[BUFSIZ], stat[BUFSIZ]; - - snprintf(read, BUFSIZ, proc_report, stats.lines); - snprintf(stat, BUFSIZ, "%s / %s / %s / %s (%s)", stats_str[0], - stats_str[1], stats_str[2], stats_str[3], - _("Press [ENTER] to continue")); - status_mesg(read, stat); - wgetch(win[KEY].p); - } else if (ui_mode == UI_CMDLINE) { - printf(proc_report, stats.lines); - printf("\n%s / %s / %s / %s\n", stats_str[0], stats_str[1], - stats_str[2], stats_str[3]); - } - - /* User has the choice to look at the log file if some items could not be - imported. - */ - file_close(log->fd, __FILE_POS__); - if (stats.skipped > 0) { - const char *view_log = - _("Some items could not be imported, see log file ?"); - - io_log_display(log, view_log, conf.pager); - } - io_log_free(log); + const char *proc_report = + _("Import process report: %04d lines read "); + char stats_str[4][BUFSIZ]; + FILE *stream = NULL; + struct io_file *log; + struct { + unsigned events, apoints, todos, lines, skipped; + } stats; + + EXIT_IF(type < 0 + || type >= IO_IMPORT_NBTYPES, _("unknown import type")); + switch (ui_mode) { + case UI_CMDLINE: + stream = fopen(stream_name, "r"); + EXIT_IF(stream == NULL, + _("FATAL ERROR: the input file cannot be accessed, " + "Aborting...")); + break; + case UI_CURSES: + stream = get_import_stream(type); + break; + default: + EXIT(_("FATAL ERROR: wrong import mode")); + /* NOTREACHED */ + } + + if (stream == NULL) + return; + + memset(&stats, 0, sizeof stats); + + log = io_log_init(); + if (log == NULL) { + if (stream != stdin) + file_close(stream, __FILE_POS__); + return; + } + + if (type == IO_IMPORT_ICAL) + ical_import_data(stream, log->fd, &stats.events, + &stats.apoints, &stats.todos, + &stats.lines, &stats.skipped); + + if (stream != stdin) + file_close(stream, __FILE_POS__); + + snprintf(stats_str[0], BUFSIZ, + ngettext("%d app", "%d apps", stats.apoints), + stats.apoints); + snprintf(stats_str[1], BUFSIZ, + ngettext("%d event", "%d events", stats.events), + stats.events); + snprintf(stats_str[2], BUFSIZ, + ngettext("%d todo", "%d todos", stats.todos), + stats.todos); + snprintf(stats_str[3], BUFSIZ, _("%d skipped"), stats.skipped); + + /* Update the number of todo items. */ + ui_todo_set_nb(ui_todo_nb() + stats.todos); + + if (ui_mode == UI_CURSES && conf.system_dialogs) { + char read[BUFSIZ], stat[BUFSIZ]; + + snprintf(read, BUFSIZ, proc_report, stats.lines); + snprintf(stat, BUFSIZ, "%s / %s / %s / %s (%s)", + stats_str[0], stats_str[1], stats_str[2], + stats_str[3], _("Press [ENTER] to continue")); + status_mesg(read, stat); + wgetch(win[KEY].p); + } else if (ui_mode == UI_CMDLINE) { + printf(proc_report, stats.lines); + printf("\n%s / %s / %s / %s\n", stats_str[0], stats_str[1], + stats_str[2], stats_str[3]); + } + + /* User has the choice to look at the log file if some items could not be + imported. + */ + file_close(log->fd, __FILE_POS__); + if (stats.skipped > 0) { + const char *view_log = + _("Some items could not be imported, see log file ?"); + + io_log_display(log, view_log, conf.pager); + } + io_log_free(log); } struct io_file *io_log_init(void) { - char logprefix[BUFSIZ]; - char *logname; - struct io_file *log; - - snprintf(logprefix, BUFSIZ, "%s/calcurse_log.", get_tempdir()); - logname = new_tempfile(logprefix, TMPEXTSIZ); - RETVAL_IF(logname == NULL, 0, - _("Warning: could not create temporary log file, Aborting...")); - log = mem_malloc(sizeof(struct io_file)); - RETVAL_IF(log == NULL, 0, - _("Warning: could not open temporary log file, Aborting...")); - snprintf(log->name, sizeof(log->name), "%s%s", logprefix, logname); - mem_free(logname); - log->fd = fopen(log->name, "w"); - if (log->fd == NULL) { - ERROR_MSG(_("Warning: could not open temporary log file, Aborting...")); - mem_free(log); - return 0; - } - - return log; + char logprefix[BUFSIZ]; + char *logname; + struct io_file *log; + + snprintf(logprefix, BUFSIZ, "%s/calcurse_log.", get_tempdir()); + logname = new_tempfile(logprefix, TMPEXTSIZ); + RETVAL_IF(logname == NULL, 0, + _("Warning: could not create temporary log file, Aborting...")); + log = mem_malloc(sizeof(struct io_file)); + RETVAL_IF(log == NULL, 0, + _("Warning: could not open temporary log file, Aborting...")); + snprintf(log->name, sizeof(log->name), "%s%s", logprefix, logname); + mem_free(logname); + log->fd = fopen(log->name, "w"); + if (log->fd == NULL) { + ERROR_MSG(_("Warning: could not open temporary log file, Aborting...")); + mem_free(log); + return 0; + } + + return log; } void io_log_print(struct io_file *log, int line, const char *msg) { - if (log && log->fd) - fprintf(log->fd, "line %d: %s\n", line, msg); + if (log && log->fd) + fprintf(log->fd, "line %d: %s\n", line, msg); } -void io_log_display(struct io_file *log, const char *msg, const char *pager) +void io_log_display(struct io_file *log, const char *msg, + const char *pager) { - RETURN_IF(log == NULL, _("No log file to display!")); - if (ui_mode == UI_CMDLINE) { - printf("\n%s [y/n] ", msg); - if (fgetc(stdin) == 'y') { - const char *arg[] = { pager, log->name, NULL }; - int pid; - - if ((pid = fork_exec(NULL, NULL, pager, arg))) - child_wait(NULL, NULL, pid); - } - } else { - if (status_ask_bool(msg) == 1) - wins_launch_external(log->name, pager); - wins_erase_status_bar(); - } + RETURN_IF(log == NULL, _("No log file to display!")); + if (ui_mode == UI_CMDLINE) { + printf("\n%s [y/n] ", msg); + if (fgetc(stdin) == 'y') { + const char *arg[] = { pager, log->name, NULL }; + int pid; + + if ((pid = fork_exec(NULL, NULL, pager, arg))) + child_wait(NULL, NULL, pid); + } + } else { + if (status_ask_bool(msg) == 1) + wins_launch_external(log->name, pager); + wins_erase_status_bar(); + } } void io_log_free(struct io_file *log) { - if (!log) - return; - EXIT_IF(unlink(log->name) != 0, - _("Warning: could not erase temporary log file %s, Aborting..."), - log->name); - mem_free(log); + if (!log) + return; + EXIT_IF(unlink(log->name) != 0, + _("Warning: could not erase temporary log file %s, Aborting..."), + log->name); + mem_free(log); } static pthread_t io_t_psave; @@ -1120,28 +1179,28 @@ static pthread_t io_t_psave; /* Thread used to periodically save data. */ static void *io_psave_thread(void *arg) { - int delay = conf.periodic_save; - EXIT_IF(delay < 0, _("Invalid delay")); + int delay = conf.periodic_save; + EXIT_IF(delay < 0, _("Invalid delay")); - for (;;) { - sleep(delay * MININSEC); - io_save_cal(IO_SAVE_DISPLAY_NONE); - } + for (;;) { + sleep(delay * MININSEC); + io_save_cal(IO_SAVE_DISPLAY_NONE); + } } /* Launch the thread which handles periodic saves. */ void io_start_psave_thread(void) { - pthread_create(&io_t_psave, NULL, io_psave_thread, NULL); + pthread_create(&io_t_psave, NULL, io_psave_thread, NULL); } /* Stop periodic data saves. */ void io_stop_psave_thread(void) { - if (io_t_psave) { - pthread_cancel(io_t_psave); - pthread_join(io_t_psave, NULL); - } + if (io_t_psave) { + pthread_cancel(io_t_psave); + pthread_join(io_t_psave, NULL); + } } /* @@ -1157,32 +1216,33 @@ void io_stop_psave_thread(void) */ void io_set_lock(void) { - FILE *lock = fopen(path_cpid, "r"); - int pid; - - if (lock != NULL) { - /* If there is a lock file, check whether the process exists. */ - if (fscanf(lock, "%d", &pid) == 1) { - fclose(lock); - if (kill(pid, 0) != 0 && errno == ESRCH) - lock = NULL; - } else { - fclose(lock); - } - } - - if (lock != NULL) { - fprintf(stderr, - _("\nWARNING: it seems that another calcurse instance is " - "already running.\n" - "If this is not the case, please remove the following " - "lock file: \n\"%s\"\n" "and restart calcurse.\n"), path_cpid); - exit(EXIT_FAILURE); - } else { - if (!io_dump_pid(path_cpid)) - EXIT(_("FATAL ERROR: could not create %s: %s\n"), - path_cpid, strerror(errno)); - } + FILE *lock = fopen(path_cpid, "r"); + int pid; + + if (lock != NULL) { + /* If there is a lock file, check whether the process exists. */ + if (fscanf(lock, "%d", &pid) == 1) { + fclose(lock); + if (kill(pid, 0) != 0 && errno == ESRCH) + lock = NULL; + } else { + fclose(lock); + } + } + + if (lock != NULL) { + fprintf(stderr, + _("\nWARNING: it seems that another calcurse instance is " + "already running.\n" + "If this is not the case, please remove the following " + "lock file: \n\"%s\"\n" + "and restart calcurse.\n"), path_cpid); + exit(EXIT_FAILURE); + } else { + if (!io_dump_pid(path_cpid)) + EXIT(_("FATAL ERROR: could not create %s: %s\n"), + path_cpid, strerror(errno)); + } } /* @@ -1191,18 +1251,18 @@ void io_set_lock(void) */ unsigned io_dump_pid(char *file) { - pid_t pid; - FILE *fp; + pid_t pid; + FILE *fp; - if (!file) - return 0; + if (!file) + return 0; - pid = getpid(); - if (!(fp = fopen(file, "w")) - || fprintf(fp, "%ld\n", (long)pid) < 0 || fclose(fp) != 0) - return 0; + pid = getpid(); + if (!(fp = fopen(file, "w")) + || fprintf(fp, "%ld\n", (long)pid) < 0 || fclose(fp) != 0) + return 0; - return 1; + return 1; } /* @@ -1212,21 +1272,21 @@ unsigned io_dump_pid(char *file) */ unsigned io_get_pid(char *file) { - FILE *fp; - unsigned pid; + FILE *fp; + unsigned pid; - if (!file) - return 0; + if (!file) + return 0; - if ((fp = fopen(file, "r")) == NULL) - return 0; + if ((fp = fopen(file, "r")) == NULL) + return 0; - if (fscanf(fp, "%u", &pid) != 1) - return 0; + if (fscanf(fp, "%u", &pid) != 1) + return 0; - fclose(fp); + fclose(fp); - return pid; + return pid; } /* @@ -1234,19 +1294,19 @@ unsigned io_get_pid(char *file) */ int io_file_is_empty(char *file) { - FILE *fp; - - if (file && (fp = fopen(file, "r"))) { - if ((fgetc(fp) == '\n' && fgetc(fp) == EOF) || feof(fp)) { - fclose(fp); - return 1; - } else { - fclose(fp); - return 0; - } - } - - return -1; + FILE *fp; + + if (file && (fp = fopen(file, "r"))) { + if ((fgetc(fp) == '\n' && fgetc(fp) == EOF) || feof(fp)) { + fclose(fp); + return 1; + } else { + fclose(fp); + return 0; + } + } + + return -1; } /* @@ -1254,27 +1314,28 @@ int io_file_is_empty(char *file) */ int io_file_cp(const char *src, const char *dst) { - FILE *fp_src, *fp_dst; - char *buffer[BUFSIZ]; - unsigned int bytes_read; - - if (!(fp_src = fopen(src, "rb"))) - return 0; - if (!(fp_dst = fopen(dst, "wb"))) - return 0; - - while (!feof(fp_src)) { - bytes_read = fread(buffer, 1, BUFSIZ, fp_src); - if (bytes_read > 0) { - if (fwrite(buffer, 1, bytes_read, fp_dst) != bytes_read) - return 0; - } else { - return 0; - } - } - - fclose(fp_dst); - fclose(fp_src); - - return 1; + FILE *fp_src, *fp_dst; + char *buffer[BUFSIZ]; + unsigned int bytes_read; + + if (!(fp_src = fopen(src, "rb"))) + return 0; + if (!(fp_dst = fopen(dst, "wb"))) + return 0; + + while (!feof(fp_src)) { + bytes_read = fread(buffer, 1, BUFSIZ, fp_src); + if (bytes_read > 0) { + if (fwrite(buffer, 1, bytes_read, fp_dst) != + bytes_read) + return 0; + } else { + return 0; + } + } + + fclose(fp_dst); + fclose(fp_src); + + return 1; } @@ -39,406 +39,416 @@ #include "calcurse.h" -#define MAXKEYVAL KEY_MAX /* ncurses defines KEY_MAX as maximum key value */ +#define MAXKEYVAL KEY_MAX /* ncurses defines KEY_MAX as maximum key value */ struct keydef_s { - const char *label; - const char *binding; + const char *label; + const char *binding; }; static llist_t keys[NBKEYS]; static enum key actions[MAXKEYVAL]; static struct keydef_s keydef[NBKEYS] = { - {"generic-cancel", "ESC"}, - {"generic-select", "SPC"}, - {"generic-credits", "@"}, - {"generic-help", "?"}, - {"generic-quit", "q Q"}, - {"generic-save", "s S C-s"}, - {"generic-copy", "c"}, - {"generic-paste", "p C-v"}, - {"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"}, - {"generic-redraw", "C-r"}, - {"generic-add-appt", "C-a"}, - {"generic-add-todo", "C-t"}, - {"generic-prev-day", "T C-h"}, - {"generic-next-day", "t C-l"}, - {"generic-prev-week", "W C-k"}, - {"generic-next-week", "w C-j"}, - {"generic-prev-month", "M"}, - {"generic-next-month", "m"}, - {"generic-prev-year", "Y"}, - {"generic-next-year", "y"}, - {"generic-scroll-down", "C-n"}, - {"generic-scroll-up", "C-p"}, - {"generic-goto-today", "C-g"}, - - {"move-right", "l L RGT"}, - {"move-left", "h H LFT"}, - {"move-down", "j J DWN"}, - {"move-up", "k K UP"}, - {"start-of-week", "0"}, - {"end-of-week", "$"}, - {"add-item", "a A"}, - {"del-item", "d D"}, - {"edit-item", "e E"}, - {"view-item", "v V"}, - {"pipe-item", "|"}, - {"flag-item", "!"}, - {"repeat", "r R"}, - {"edit-note", "n N"}, - {"view-note", ">"}, - {"raise-priority", "+"}, - {"lower-priority", "-"}, + {"generic-cancel", "ESC"}, + {"generic-select", "SPC"}, + {"generic-credits", "@"}, + {"generic-help", "?"}, + {"generic-quit", "q Q"}, + {"generic-save", "s S C-s"}, + {"generic-copy", "c"}, + {"generic-paste", "p C-v"}, + {"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"}, + {"generic-redraw", "C-r"}, + {"generic-add-appt", "C-a"}, + {"generic-add-todo", "C-t"}, + {"generic-prev-day", "T C-h"}, + {"generic-next-day", "t C-l"}, + {"generic-prev-week", "W C-k"}, + {"generic-next-week", "w C-j"}, + {"generic-prev-month", "M"}, + {"generic-next-month", "m"}, + {"generic-prev-year", "Y"}, + {"generic-next-year", "y"}, + {"generic-scroll-down", "C-n"}, + {"generic-scroll-up", "C-p"}, + {"generic-goto-today", "C-g"}, + + {"move-right", "l L RGT"}, + {"move-left", "h H LFT"}, + {"move-down", "j J DWN"}, + {"move-up", "k K UP"}, + {"start-of-week", "0"}, + {"end-of-week", "$"}, + {"add-item", "a A"}, + {"del-item", "d D"}, + {"edit-item", "e E"}, + {"view-item", "v V"}, + {"pipe-item", "|"}, + {"flag-item", "!"}, + {"repeat", "r R"}, + {"edit-note", "n N"}, + {"view-note", ">"}, + {"raise-priority", "+"}, + {"lower-priority", "-"}, }; static void dump_intro(FILE * fd) { - const 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, space bar and horizontal Tab key can be specified using\n" - "# the 'ESC', 'SPC' and 'TAB' keyword, respectively.\n" - "# Arrow keys can also be specified with the UP, DWN, LFT, RGT keywords.\n" - "# Last, Home and End keys can be assigned using 'KEY_HOME' and 'KEY_END'\n" - "# keywords." - "\n#\n" - "# A description of what each ACTION keyword is used for is available\n" - "# from calcurse online configuration menu.\n"); - - fprintf(fd, "%s\n", intro); + const 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, space bar and horizontal Tab key can be specified using\n" + "# the 'ESC', 'SPC' and 'TAB' keyword, respectively.\n" + "# Arrow keys can also be specified with the UP, DWN, LFT, RGT keywords.\n" + "# Last, Home and End keys can be assigned using 'KEY_HOME' and 'KEY_END'\n" + "# keywords." + "\n#\n" + "# A description of what each ACTION keyword is used for is available\n" + "# from calcurse online configuration menu.\n"); + + fprintf(fd, "%s\n", intro); } void keys_init(void) { - int i; + int i; - for (i = 0; i < MAXKEYVAL; i++) - actions[i] = KEY_UNDEF; - for (i = 0; i < NBKEYS; i++) - LLIST_INIT(&keys[i]); + for (i = 0; i < MAXKEYVAL; i++) + actions[i] = KEY_UNDEF; + for (i = 0; i < NBKEYS; i++) + LLIST_INIT(&keys[i]); } static void key_free(char *s) { - mem_free(s); + mem_free(s); } void keys_free(void) { - int i; + int i; - for (i = 0; i < NBKEYS; i++) { - LLIST_FREE_INNER(&keys[i], key_free); - LLIST_FREE(&keys[i]); - } + for (i = 0; i < NBKEYS; i++) { + LLIST_FREE_INNER(&keys[i], key_free); + LLIST_FREE(&keys[i]); + } } void keys_dump_defaults(char *file) { - FILE *fd; - int i; - - fd = fopen(file, "w"); - EXIT_IF(fd == NULL, _("FATAL ERROR: 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); - file_close(fd, __FILE_POS__); + FILE *fd; + int i; + + fd = fopen(file, "w"); + EXIT_IF(fd == NULL, + _("FATAL ERROR: 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); + file_close(fd, __FILE_POS__); } const char *keys_get_label(enum key key) { - EXIT_IF(key < 0 || key > NBKEYS, _("FATAL ERROR: key value out of bounds")); + EXIT_IF(key < 0 + || key > NBKEYS, + _("FATAL ERROR: key value out of bounds")); - return keydef[key].label; + return keydef[key].label; } enum key keys_get_action(int pressed) { - if (pressed < 0 || pressed > MAXKEYVAL) - return -1; - else - return actions[pressed]; + if (pressed < 0 || pressed > MAXKEYVAL) + return -1; + else + return actions[pressed]; } enum key keys_getch(WINDOW * win, int *count, int *reg) { - int ch = '0'; - - if (count && reg) { - *count = 0; - *reg = 0; - do { - *count = *count * 10 + ch - '0'; - ch = wgetch(win); - } - while ((ch == '0' && *count > 0) || (ch >= '1' && ch <= '9')); - - if (*count == 0) - *count = 1; - - if (ch == '"') { - ch = wgetch(win); - if (ch >= '1' && ch <= '9') { - *reg = ch - '1' + 1; - } else if (ch >= 'a' && ch <= 'z') { - *reg = ch - 'a' + 10; - } else if (ch == '_') { - *reg = REG_BLACK_HOLE; - } - ch = wgetch(win); - } - } else { - ch = wgetch(win); - } - - switch (ch) { - case KEY_RESIZE: - return KEY_RESIZE; - default: - return keys_get_action(ch); - } + int ch = '0'; + + if (count && reg) { + *count = 0; + *reg = 0; + do { + *count = *count * 10 + ch - '0'; + ch = wgetch(win); + } + while ((ch == '0' && *count > 0) + || (ch >= '1' && ch <= '9')); + + if (*count == 0) + *count = 1; + + if (ch == '"') { + ch = wgetch(win); + if (ch >= '1' && ch <= '9') { + *reg = ch - '1' + 1; + } else if (ch >= 'a' && ch <= 'z') { + *reg = ch - 'a' + 10; + } else if (ch == '_') { + *reg = REG_BLACK_HOLE; + } + ch = wgetch(win); + } + } else { + ch = wgetch(win); + } + + switch (ch) { + case KEY_RESIZE: + return KEY_RESIZE; + default: + return keys_get_action(ch); + } } static void add_key_str(enum key action, int key) { - if (action > NBKEYS) - return; + if (action > NBKEYS) + return; - LLIST_ADD(&keys[action], mem_strdup(keys_int2str(key))); + LLIST_ADD(&keys[action], mem_strdup(keys_int2str(key))); } int keys_assign_binding(int key, enum key action) { - if (key < 0 || key > MAXKEYVAL || actions[key] != KEY_UNDEF) { - return 1; - } else { - actions[key] = action; - add_key_str(action, key); - } - - return 0; + 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(enum key action, int key) { - llist_item_t *i; - char oldstr[BUFSIZ]; + llist_item_t *i; + char oldstr[BUFSIZ]; - if (action > NBKEYS) - return; + if (action > NBKEYS) + return; - strncpy(oldstr, keys_int2str(key), BUFSIZ); + strncpy(oldstr, keys_int2str(key), BUFSIZ); - LLIST_FOREACH(&keys[action], i) { - if (strcmp(LLIST_GET_DATA(i), oldstr) == 0) { - LLIST_REMOVE(&keys[action], i); - return; - } - } + LLIST_FOREACH(&keys[action], i) { + if (strcmp(LLIST_GET_DATA(i), oldstr) == 0) { + LLIST_REMOVE(&keys[action], i); + return; + } + } } void keys_remove_binding(int key, enum key action) { - if (key >= 0 && key <= MAXKEYVAL) { - actions[key] = KEY_UNDEF; - del_key_str(action, key); - } + if (key >= 0 && key <= MAXKEYVAL) { + actions[key] = KEY_UNDEF; + del_key_str(action, key); + } } int keys_str2int(const char *key) { - const char CONTROL_KEY[] = "C-"; - const char TAB_KEY[] = "TAB"; - const char SPACE_KEY[] = "SPC"; - const char ESCAPE_KEY[] = "ESC"; - const char CURSES_KEY_UP[] = "UP"; - const char CURSES_KEY_DOWN[] = "DWN"; - const char CURSES_KEY_LEFT[] = "LFT"; - const char CURSES_KEY_RIGHT[] = "RGT"; - const char CURSES_KEY_HOME[] = "KEY_HOME"; - const char CURSES_KEY_END[] = "KEY_END"; - - if (!key) - return -1; - if (strlen(key) == 1) { - return (int)key[0]; - } else { - if (key[0] == '^') - return CTRL((int)key[1]); - else if (!strncmp(key, CONTROL_KEY, sizeof(CONTROL_KEY) - 1)) - return CTRL((int)key[sizeof(CONTROL_KEY) - 1]); - else if (!strcmp(key, TAB_KEY)) - return TAB; - else if (!strcmp(key, ESCAPE_KEY)) - return ESCAPE; - else if (!strcmp(key, SPACE_KEY)) - return SPACE; - else if (!strcmp(key, CURSES_KEY_UP)) - return KEY_UP; - else if (!strcmp(key, CURSES_KEY_DOWN)) - return KEY_DOWN; - else if (!strcmp(key, CURSES_KEY_LEFT)) - return KEY_LEFT; - else if (!strcmp(key, CURSES_KEY_RIGHT)) - return KEY_RIGHT; - else if (!strcmp(key, CURSES_KEY_HOME)) - return KEY_HOME; - else if (!strcmp(key, CURSES_KEY_END)) - return KEY_END; - else - return -1; - } + const char CONTROL_KEY[] = "C-"; + const char TAB_KEY[] = "TAB"; + const char SPACE_KEY[] = "SPC"; + const char ESCAPE_KEY[] = "ESC"; + const char CURSES_KEY_UP[] = "UP"; + const char CURSES_KEY_DOWN[] = "DWN"; + const char CURSES_KEY_LEFT[] = "LFT"; + const char CURSES_KEY_RIGHT[] = "RGT"; + const char CURSES_KEY_HOME[] = "KEY_HOME"; + const char CURSES_KEY_END[] = "KEY_END"; + + if (!key) + return -1; + if (strlen(key) == 1) { + return (int)key[0]; + } else { + if (key[0] == '^') + return CTRL((int)key[1]); + else if (!strncmp + (key, CONTROL_KEY, sizeof(CONTROL_KEY) - 1)) + return CTRL((int)key[sizeof(CONTROL_KEY) - 1]); + else if (!strcmp(key, TAB_KEY)) + return TAB; + else if (!strcmp(key, ESCAPE_KEY)) + return ESCAPE; + else if (!strcmp(key, SPACE_KEY)) + return SPACE; + else if (!strcmp(key, CURSES_KEY_UP)) + return KEY_UP; + else if (!strcmp(key, CURSES_KEY_DOWN)) + return KEY_DOWN; + else if (!strcmp(key, CURSES_KEY_LEFT)) + return KEY_LEFT; + else if (!strcmp(key, CURSES_KEY_RIGHT)) + return KEY_RIGHT; + else if (!strcmp(key, CURSES_KEY_HOME)) + return KEY_HOME; + else if (!strcmp(key, CURSES_KEY_END)) + return KEY_END; + else + return -1; + } } const char *keys_int2str(int key) { - switch (key) { - case TAB: - return "TAB"; - case SPACE: - return "SPC"; - case ESCAPE: - return "ESC"; - case KEY_UP: - return "UP"; - case KEY_DOWN: - return "DWN"; - case KEY_LEFT: - return "LFT"; - case KEY_RIGHT: - return "RGT"; - case KEY_HOME: - return "KEY_HOME"; - case KEY_END: - return "KEY_END"; - default: - return (char *)keyname(key); - } + switch (key) { + case TAB: + return "TAB"; + case SPACE: + return "SPC"; + case ESCAPE: + return "ESC"; + case KEY_UP: + return "UP"; + case KEY_DOWN: + return "DWN"; + case KEY_LEFT: + return "LFT"; + case KEY_RIGHT: + return "RGT"; + case KEY_HOME: + return "KEY_HOME"; + case KEY_END: + return "KEY_END"; + default: + return (char *)keyname(key); + } } int keys_action_count_keys(enum key action) { - llist_item_t *i; - int n = 0; + llist_item_t *i; + int n = 0; - LLIST_FOREACH(&keys[action], i) - n++; + LLIST_FOREACH(&keys[action], i) + n++; - return n; + return n; } const char *keys_action_firstkey(enum key action) { - const char *s = LLIST_GET_DATA(LLIST_FIRST(&keys[action])); - return (s != NULL) ? s : "XXX"; + const char *s = LLIST_GET_DATA(LLIST_FIRST(&keys[action])); + return (s != NULL) ? s : "XXX"; } const char *keys_action_nkey(enum key action, int keynum) { - return LLIST_GET_DATA(LLIST_NTH(&keys[action], keynum)); + return LLIST_GET_DATA(LLIST_NTH(&keys[action], keynum)); } char *keys_action_allkeys(enum key action) { - llist_item_t *i; - static char keystr[BUFSIZ]; - const char *CHAR_SPACE = " "; + llist_item_t *i; + static char keystr[BUFSIZ]; + const char *CHAR_SPACE = " "; - if (!LLIST_FIRST(&keys[action])) - return NULL; + if (!LLIST_FIRST(&keys[action])) + return NULL; - keystr[0] = '\0'; - LLIST_FOREACH(&keys[action], i) { - const int MAXLEN = sizeof(keystr) - 1 - strlen(keystr); - strncat(keystr, LLIST_GET_DATA(i), MAXLEN - 1); - strncat(keystr, CHAR_SPACE, 1); - } + keystr[0] = '\0'; + LLIST_FOREACH(&keys[action], i) { + const int MAXLEN = sizeof(keystr) - 1 - strlen(keystr); + strncat(keystr, LLIST_GET_DATA(i), MAXLEN - 1); + strncat(keystr, CHAR_SPACE, 1); + } - return keystr; + return keystr; } /* Need this to display keys properly inside status bar. */ static char *keys_format_label(char *key, int keylen) { - static char fmtkey[BUFSIZ]; - const int len = strlen(key); - const char dot = '.'; - int i; - - if (keylen > BUFSIZ) - return NULL; - - memset(fmtkey, 0, sizeof(fmtkey)); - if (len == 0) { - strncpy(fmtkey, "?", sizeof(fmtkey)); - } else if (len <= keylen) { - for (i = 0; i < keylen - len; i++) - fmtkey[i] = ' '; - strncat(fmtkey, key, keylen); - } else { - for (i = 0; i < keylen - 1; i++) - fmtkey[i] = key[i]; - fmtkey[keylen - 1] = dot; - } - return fmtkey; + static char fmtkey[BUFSIZ]; + const int len = strlen(key); + const char dot = '.'; + int i; + + if (keylen > BUFSIZ) + return NULL; + + memset(fmtkey, 0, sizeof(fmtkey)); + if (len == 0) { + strncpy(fmtkey, "?", sizeof(fmtkey)); + } else if (len <= keylen) { + for (i = 0; i < keylen - len; i++) + fmtkey[i] = ' '; + strncat(fmtkey, key, keylen); + } else { + for (i = 0; i < keylen - 1; i++) + fmtkey[i] = key[i]; + fmtkey[keylen - 1] = dot; + } + return fmtkey; } void -keys_display_bindings_bar(WINDOW * win, struct binding *bindings[], int count, - int page_base, int page_size, struct binding *more) +keys_display_bindings_bar(WINDOW * win, struct binding *bindings[], + int count, int page_base, int page_size, + struct binding *more) { - /* Padding between two key bindings. */ - const int padding = (col * 2) / page_size - (KEYS_KEYLEN + KEYS_LABELEN + 1); - /* Total length of a key binding (including padding). */ - const int cmd_len = KEYS_KEYLEN + KEYS_LABELEN + 1 + padding; - - int i; - - wins_erase_status_bar(); - for (i = 0; i < page_size && page_base + i < count; i++) { - /* Location of key and label. */ - const int key_pos_x = (i / 2) * cmd_len; - const int key_pos_y = i % 2; - const int label_pos_x = key_pos_x + KEYS_KEYLEN + 1; - const int label_pos_y = key_pos_y; - - struct binding *binding; - char key[KEYS_KEYLEN + 1], *fmtkey; - - if (!more || i < page_size - 1 || page_base + i == count - 1) - binding = bindings[page_base + i]; - else - binding = more; - - strncpy(key, keys_action_firstkey(binding->action), KEYS_KEYLEN); - key[KEYS_KEYLEN] = '\0'; - fmtkey = keys_format_label(key, KEYS_KEYLEN); - - custom_apply_attr(win, ATTR_HIGHEST); - mvwaddstr(win, key_pos_y, key_pos_x, fmtkey); - custom_remove_attr(win, ATTR_HIGHEST); - mvwaddstr(win, label_pos_y, label_pos_x, binding->label); - } - wnoutrefresh(win); + /* Padding between two key bindings. */ + const int padding = + (col * 2) / page_size - (KEYS_KEYLEN + KEYS_LABELEN + 1); + /* Total length of a key binding (including padding). */ + const int cmd_len = KEYS_KEYLEN + KEYS_LABELEN + 1 + padding; + + int i; + + wins_erase_status_bar(); + for (i = 0; i < page_size && page_base + i < count; i++) { + /* Location of key and label. */ + const int key_pos_x = (i / 2) * cmd_len; + const int key_pos_y = i % 2; + const int label_pos_x = key_pos_x + KEYS_KEYLEN + 1; + const int label_pos_y = key_pos_y; + + struct binding *binding; + char key[KEYS_KEYLEN + 1], *fmtkey; + + if (!more || i < page_size - 1 + || page_base + i == count - 1) + binding = bindings[page_base + i]; + else + binding = more; + + strncpy(key, keys_action_firstkey(binding->action), + KEYS_KEYLEN); + key[KEYS_KEYLEN] = '\0'; + fmtkey = keys_format_label(key, KEYS_KEYLEN); + + custom_apply_attr(win, ATTR_HIGHEST); + mvwaddstr(win, key_pos_y, key_pos_x, fmtkey); + custom_remove_attr(win, ATTR_HIGHEST); + mvwaddstr(win, label_pos_y, label_pos_x, binding->label); + } + wnoutrefresh(win); } /* @@ -447,155 +457,161 @@ keys_display_bindings_bar(WINDOW * win, struct binding *bindings[], int count, */ void keys_popup_info(enum key key) { - char *info[NBKEYS]; - WINDOW *infowin; - - info[KEY_GENERIC_CANCEL] = _("Cancel the ongoing action."); - info[KEY_GENERIC_SELECT] = _("Select the highlighted item."); - info[KEY_GENERIC_CREDITS] = - _("Print general information about calcurse's authors, license, etc."); - info[KEY_GENERIC_HELP] = - _("Display hints whenever some help screens are available."); - info[KEY_GENERIC_QUIT] = _("Exit from the current menu, or quit calcurse."); - info[KEY_GENERIC_SAVE] = _("Save calcurse data."); - info[KEY_GENERIC_COPY] = _("Copy the item that is currently selected."); - info[KEY_GENERIC_PASTE] = _("Paste an item at the current position."); - info[KEY_GENERIC_CHANGE_VIEW] = - _("Select next panel in calcurse main screen."); - info[KEY_GENERIC_IMPORT] = _("Import data from an external file."); - info[KEY_GENERIC_EXPORT] = _("Export data to a new file format."); - info[KEY_GENERIC_GOTO] = _("Select the day to go to."); - info[KEY_GENERIC_OTHER_CMD] = - _("Show next possible actions inside status bar."); - info[KEY_GENERIC_CONFIG_MENU] = _("Enter the configuration menu."); - info[KEY_GENERIC_REDRAW] = _("Redraw calcurse's screen."); - info[KEY_GENERIC_ADD_APPT] = - _("Add an appointment, whichever panel is currently selected."); - info[KEY_GENERIC_ADD_TODO] = - _("Add a todo item, whichever panel is currently selected."); - info[KEY_GENERIC_PREV_DAY] = - _("Move to previous day in calendar, whichever panel is currently " - "selected."); - info[KEY_GENERIC_NEXT_DAY] = - _("Move to next day in calendar, whichever panel is currently selected."); - info[KEY_GENERIC_PREV_WEEK] = - _("Move to previous week in calendar, whichever panel is currently " - "selected"); - info[KEY_GENERIC_NEXT_WEEK] = - _ - ("Move to next week in calendar, whichever panel is currently selected."); - info[KEY_GENERIC_PREV_MONTH] = - _("Move to previous month in calendar, whichever panel is currently " - "selected"); - info[KEY_GENERIC_NEXT_MONTH] = - _ - ("Move to next month in calendar, whichever panel is currently " - "selected."); - info[KEY_GENERIC_PREV_YEAR] = - _("Move to previous year in calendar, whichever panel is currently " - "selected"); - info[KEY_GENERIC_NEXT_YEAR] = - _ - ("Move to next year in calendar, whichever panel is currently selected."); - info[KEY_GENERIC_SCROLL_DOWN] = - _ - ("Scroll window down (e.g. when displaying text inside a popup window)."); - info[KEY_GENERIC_SCROLL_UP] = - _("Scroll window up (e.g. when displaying text inside a popup window)."); - info[KEY_GENERIC_GOTO_TODAY] = _("Go to today, whichever panel is selected."); - info[KEY_MOVE_RIGHT] = _("Move to the right."); - info[KEY_MOVE_LEFT] = _("Move to the left."); - info[KEY_MOVE_DOWN] = _("Move down."); - info[KEY_MOVE_UP] = _("Move up."); - info[KEY_START_OF_WEEK] = - _("Select the first day of the current week when inside the calendar " - "panel."); - info[KEY_END_OF_WEEK] = - _("Select the last day of the current week when inside the calendar " - "panel."); - info[KEY_ADD_ITEM] = _("Add an item to the currently selected panel."); - info[KEY_DEL_ITEM] = _("Delete the currently selected item."); - info[KEY_EDIT_ITEM] = _("Edit the currently seleted item."); - info[KEY_VIEW_ITEM] = - _("Display the currently selected item inside a popup window."); - info[KEY_FLAG_ITEM] = _("Flag the currently selected item as important."); - info[KEY_REPEAT_ITEM] = _("Repeat an item"); - info[KEY_PIPE_ITEM] = - _("Pipe the currently selected item to an external program."); - info[KEY_EDIT_NOTE] = - _("Attach (or edit if one exists) a note to the currently selected item"); - info[KEY_VIEW_NOTE] = - _("View the note attached to the currently selected item."); - info[KEY_RAISE_PRIORITY] = _("Raise a task priority inside the todo panel."); - info[KEY_LOWER_PRIORITY] = _("Lower a task priority inside the todo panel."); - - if (key > NBKEYS) - return; + char *info[NBKEYS]; + WINDOW *infowin; + + info[KEY_GENERIC_CANCEL] = _("Cancel the ongoing action."); + info[KEY_GENERIC_SELECT] = _("Select the highlighted item."); + info[KEY_GENERIC_CREDITS] = + _("Print general information about calcurse's authors, license, etc."); + info[KEY_GENERIC_HELP] = + _("Display hints whenever some help screens are available."); + info[KEY_GENERIC_QUIT] = + _("Exit from the current menu, or quit calcurse."); + info[KEY_GENERIC_SAVE] = _("Save calcurse data."); + info[KEY_GENERIC_COPY] = + _("Copy the item that is currently selected."); + info[KEY_GENERIC_PASTE] = + _("Paste an item at the current position."); + info[KEY_GENERIC_CHANGE_VIEW] = + _("Select next panel in calcurse main screen."); + info[KEY_GENERIC_IMPORT] = _("Import data from an external file."); + info[KEY_GENERIC_EXPORT] = _("Export data to a new file format."); + info[KEY_GENERIC_GOTO] = _("Select the day to go to."); + info[KEY_GENERIC_OTHER_CMD] = + _("Show next possible actions inside status bar."); + info[KEY_GENERIC_CONFIG_MENU] = _("Enter the configuration menu."); + info[KEY_GENERIC_REDRAW] = _("Redraw calcurse's screen."); + info[KEY_GENERIC_ADD_APPT] = + _("Add an appointment, whichever panel is currently selected."); + info[KEY_GENERIC_ADD_TODO] = + _("Add a todo item, whichever panel is currently selected."); + info[KEY_GENERIC_PREV_DAY] = + _("Move to previous day in calendar, whichever panel is currently " + "selected."); + info[KEY_GENERIC_NEXT_DAY] = + _("Move to next day in calendar, whichever panel is currently selected."); + info[KEY_GENERIC_PREV_WEEK] = + _("Move to previous week in calendar, whichever panel is currently " + "selected"); + info[KEY_GENERIC_NEXT_WEEK] = + _("Move to next week in calendar, whichever panel is currently selected."); + info[KEY_GENERIC_PREV_MONTH] = + _("Move to previous month in calendar, whichever panel is currently " + "selected"); + info[KEY_GENERIC_NEXT_MONTH] = + _("Move to next month in calendar, whichever panel is currently " + "selected."); + info[KEY_GENERIC_PREV_YEAR] = + _("Move to previous year in calendar, whichever panel is currently " + "selected"); + info[KEY_GENERIC_NEXT_YEAR] = + _("Move to next year in calendar, whichever panel is currently selected."); + info[KEY_GENERIC_SCROLL_DOWN] = + _("Scroll window down (e.g. when displaying text inside a popup window)."); + info[KEY_GENERIC_SCROLL_UP] = + _("Scroll window up (e.g. when displaying text inside a popup window)."); + info[KEY_GENERIC_GOTO_TODAY] = + _("Go to today, whichever panel is selected."); + info[KEY_MOVE_RIGHT] = _("Move to the right."); + info[KEY_MOVE_LEFT] = _("Move to the left."); + info[KEY_MOVE_DOWN] = _("Move down."); + info[KEY_MOVE_UP] = _("Move up."); + info[KEY_START_OF_WEEK] = + _("Select the first day of the current week when inside the calendar " + "panel."); + info[KEY_END_OF_WEEK] = + _("Select the last day of the current week when inside the calendar " + "panel."); + info[KEY_ADD_ITEM] = + _("Add an item to the currently selected panel."); + info[KEY_DEL_ITEM] = _("Delete the currently selected item."); + info[KEY_EDIT_ITEM] = _("Edit the currently seleted item."); + info[KEY_VIEW_ITEM] = + _("Display the currently selected item inside a popup window."); + info[KEY_FLAG_ITEM] = + _("Flag the currently selected item as important."); + info[KEY_REPEAT_ITEM] = _("Repeat an item"); + info[KEY_PIPE_ITEM] = + _("Pipe the currently selected item to an external program."); + info[KEY_EDIT_NOTE] = + _("Attach (or edit if one exists) a note to the currently selected item"); + info[KEY_VIEW_NOTE] = + _("View the note attached to the currently selected item."); + info[KEY_RAISE_PRIORITY] = + _("Raise a task priority inside the todo panel."); + info[KEY_LOWER_PRIORITY] = + _("Lower a task priority inside the todo panel."); + + if (key > NBKEYS) + return; #define WINROW 10 #define WINCOL (col - 4) - infowin = popup(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2, - keydef[key].label, info[key], 1); - keys_getch(infowin, NULL, NULL); - delwin(infowin); + infowin = + popup(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2, + keydef[key].label, info[key], 1); + keys_getch(infowin, NULL, NULL); + delwin(infowin); #undef WINROW #undef WINCOL } void keys_save_bindings(FILE * fd) { - int i; - char *action; - - EXIT_IF(fd == NULL, _("FATAL ERROR: null file pointer.")); - dump_intro(fd); - for (i = 0; i < NBKEYS; i++) { - action = keys_action_allkeys(i); - if (action) - fprintf(fd, "%s %s\n", keydef[i].label, action); - } + int i; + char *action; + + EXIT_IF(fd == NULL, _("FATAL ERROR: null file pointer.")); + dump_intro(fd); + for (i = 0; i < NBKEYS; i++) { + action = keys_action_allkeys(i); + if (action) + fprintf(fd, "%s %s\n", keydef[i].label, action); + } } int keys_check_missing_bindings(void) { - int i; + int i; - for (i = 0; i < NBKEYS; i++) { - if (!LLIST_FIRST(&keys[i])) - return 1; - } - return 0; + for (i = 0; i < NBKEYS; i++) { + if (!LLIST_FIRST(&keys[i])) + return 1; + } + return 0; } void keys_fill_missing(void) { - int i; - - for (i = 0; i < NBKEYS; i++) { - if (!LLIST_FIRST(&keys[i])) { - char *p, tmpbuf[BUFSIZ]; - - strncpy(tmpbuf, keydef[i].binding, BUFSIZ); - p = tmpbuf; - for (;;) { - char key_ch[BUFSIZ]; - - while (*p == ' ') - p++; - if (sscanf(p, "%s", key_ch) == 1) { - int ch, used; - - ch = keys_str2int(key_ch); - used = keys_assign_binding(ch, i); - if (used) - WARN_MSG(_("When adding default key for \"%s\", " - "\"%s\" was already assigned!"), - keydef[i].label, key_ch); - p += strlen(key_ch) + 1; - } else { - break; - } - } - } - } + int i; + + for (i = 0; i < NBKEYS; i++) { + if (!LLIST_FIRST(&keys[i])) { + char *p, tmpbuf[BUFSIZ]; + + strncpy(tmpbuf, keydef[i].binding, BUFSIZ); + p = tmpbuf; + for (;;) { + char key_ch[BUFSIZ]; + + while (*p == ' ') + p++; + if (sscanf(p, "%s", key_ch) == 1) { + int ch, used; + + ch = keys_str2int(key_ch); + used = keys_assign_binding(ch, i); + if (used) + WARN_MSG(_("When adding default key for \"%s\", " + "\"%s\" was already assigned!"), + keydef[i].label, + key_ch); + p += strlen(key_ch) + 1; + } else { + break; + } + } + } + } } diff --git a/src/llist.c b/src/llist.c index 97e57f2..72d1849 100644 --- a/src/llist.c +++ b/src/llist.c @@ -41,8 +41,8 @@ */ void llist_init(llist_t * l) { - l->head = NULL; - l->tail = NULL; + l->head = NULL; + l->tail = NULL; } /* @@ -50,15 +50,15 @@ void llist_init(llist_t * l) */ void llist_free(llist_t * l) { - llist_item_t *i, *t; + llist_item_t *i, *t; - for (i = l->head; i; i = t) { - t = i->next; - mem_free(i); - } + for (i = l->head; i; i = t) { + t = i->next; + mem_free(i); + } - l->head = NULL; - l->tail = NULL; + l->head = NULL; + l->tail = NULL; } /* @@ -66,14 +66,14 @@ void llist_free(llist_t * l) */ void llist_free_inner(llist_t * l, llist_fn_free_t fn_free) { - llist_item_t *i; - - for (i = l->head; i; i = i->next) { - if (i->data) { - fn_free(i->data); - i->data = NULL; - } - } + llist_item_t *i; + + for (i = l->head; i; i = i->next) { + if (i->data) { + fn_free(i->data); + i->data = NULL; + } + } } /* @@ -81,7 +81,7 @@ void llist_free_inner(llist_t * l, llist_fn_free_t fn_free) */ llist_item_t *llist_first(llist_t * l) { - return l->head; + return l->head; } /* @@ -89,15 +89,15 @@ llist_item_t *llist_first(llist_t * l) */ llist_item_t *llist_nth(llist_t * l, int n) { - llist_item_t *i; + llist_item_t *i; - if (n < 0) - return NULL; + if (n < 0) + return NULL; - for (i = l->head; i && n != 0; n--) - i = i->next; + for (i = l->head; i && n != 0; n--) + i = i->next; - return i; + return i; } /* @@ -105,7 +105,7 @@ llist_item_t *llist_nth(llist_t * l, int n) */ llist_item_t *llist_next(llist_item_t * i) { - return i ? i->next : NULL; + return i ? i->next : NULL; } /* @@ -113,12 +113,12 @@ llist_item_t *llist_next(llist_item_t * i) * callback. Return NULL otherwise. */ llist_item_t *llist_next_filter(llist_item_t * i, void *data, - llist_fn_match_t fn_match) + llist_fn_match_t fn_match) { - if (i && i->next && fn_match(i->next->data, data)) - return i->next; - else - return NULL; + if (i && i->next && fn_match(i->next->data, data)) + return i->next; + else + return NULL; } /* @@ -126,7 +126,7 @@ llist_item_t *llist_next_filter(llist_item_t * i, void *data, */ void *llist_get_data(llist_item_t * i) { - return i ? i->data : NULL; + return i ? i->data : NULL; } /* @@ -134,19 +134,19 @@ void *llist_get_data(llist_item_t * i) */ void llist_add(llist_t * l, void *data) { - llist_item_t *o = mem_malloc(sizeof(llist_item_t)); - - if (o) { - o->data = data; - o->next = NULL; - - if (!l->head) { - l->head = l->tail = o; - } else { - l->tail->next = o; - l->tail = o; - } - } + llist_item_t *o = mem_malloc(sizeof(llist_item_t)); + + if (o) { + o->data = data; + o->next = NULL; + + if (!l->head) { + l->head = l->tail = o; + } else { + l->tail->next = o; + l->tail = o; + } + } } /* @@ -154,29 +154,30 @@ void llist_add(llist_t * l, void *data) */ void llist_add_sorted(llist_t * l, void *data, llist_fn_cmp_t fn_cmp) { - llist_item_t *o = mem_malloc(sizeof(llist_item_t)); - llist_item_t *i; - - if (o) { - o->data = data; - o->next = NULL; - - if (!l->head) { - l->head = l->tail = o; - } else if (fn_cmp(o->data, l->tail->data) >= 0) { - l->tail->next = o; - l->tail = o; - } else if (fn_cmp(o->data, l->head->data) < 0) { - o->next = l->head; - l->head = o; - } else { - i = l->head; - while (i->next && fn_cmp(o->data, i->next->data) >= 0) - i = i->next; - o->next = i->next; - i->next = o; - } - } + llist_item_t *o = mem_malloc(sizeof(llist_item_t)); + llist_item_t *i; + + if (o) { + o->data = data; + o->next = NULL; + + if (!l->head) { + l->head = l->tail = o; + } else if (fn_cmp(o->data, l->tail->data) >= 0) { + l->tail->next = o; + l->tail = o; + } else if (fn_cmp(o->data, l->head->data) < 0) { + o->next = l->head; + l->head = o; + } else { + i = l->head; + while (i->next + && fn_cmp(o->data, i->next->data) >= 0) + i = i->next; + o->next = i->next; + i->next = o; + } + } } /* @@ -184,93 +185,93 @@ void llist_add_sorted(llist_t * l, void *data, llist_fn_cmp_t fn_cmp) */ void llist_remove(llist_t * l, llist_item_t * i) { - llist_item_t *j = NULL; - - if (l->head && i == l->head) { - l->head = i->next; - } else { - for (j = l->head; j && j->next != i; j = j->next) ; - } - - if (i) { - if (j) - j->next = i->next; - if (i == l->tail) - l->tail = j; - - mem_free(i); - } + llist_item_t *j = NULL; + + if (l->head && i == l->head) { + l->head = i->next; + } else { + for (j = l->head; j && j->next != i; j = j->next) ; + } + + if (i) { + if (j) + j->next = i->next; + if (i == l->tail) + l->tail = j; + + mem_free(i); + } } /* * Find the first item matched by some filter callback. */ llist_item_t *llist_find_first(llist_t * l, void *data, - llist_fn_match_t fn_match) + llist_fn_match_t fn_match) { - llist_item_t *i; - - if (fn_match) { - for (i = l->head; i; i = i->next) { - if (fn_match(i->data, data)) - return i; - } - } else { - for (i = l->head; i; i = i->next) { - if (i->data == data) - return i; - } - } - - return NULL; + llist_item_t *i; + + if (fn_match) { + for (i = l->head; i; i = i->next) { + if (fn_match(i->data, data)) + return i; + } + } else { + for (i = l->head; i; i = i->next) { + if (i->data == data) + return i; + } + } + + return NULL; } /* * Find the next item matched by some filter callback. */ llist_item_t *llist_find_next(llist_item_t * i, void *data, - llist_fn_match_t fn_match) + llist_fn_match_t fn_match) { - if (i) { - i = i->next; - if (fn_match) { - for (; i; i = i->next) { - if (fn_match(i->data, data)) - return i; - } - } else { - for (; i; i = i->next) { - if (i->data == data) - return i; - } - } - } - - return NULL; + if (i) { + i = i->next; + if (fn_match) { + for (; i; i = i->next) { + if (fn_match(i->data, data)) + return i; + } + } else { + for (; i; i = i->next) { + if (i->data == data) + return i; + } + } + } + + return NULL; } /* * Find the nth item matched by some filter callback. */ llist_item_t *llist_find_nth(llist_t * l, int n, void *data, - llist_fn_match_t fn_match) + llist_fn_match_t fn_match) { - llist_item_t *i; - - if (n < 0) - return NULL; - - if (fn_match) { - for (i = l->head; i; i = i->next) { - if (fn_match(i->data, data) && (n-- == 0)) - return i; - } - } else { - for (i = l->head; i; i = i->next) { - if ((i->data == data) && (n-- == 0)) - return i; - } - } - - return NULL; + llist_item_t *i; + + if (n < 0) + return NULL; + + if (fn_match) { + for (i = l->head; i; i = i->next) { + if (fn_match(i->data, data) && (n-- == 0)) + return i; + } + } else { + for (i = l->head; i; i = i->next) { + if ((i->data == data) && (n-- == 0)) + return i; + } + } + + return NULL; } diff --git a/src/llist.h b/src/llist.h index 7c4d590..9b3a952 100644 --- a/src/llist.h +++ b/src/llist.h @@ -37,14 +37,14 @@ /* Linked lists. */ typedef struct llist_item llist_item_t; struct llist_item { - struct llist_item *next; - void *data; + struct llist_item *next; + void *data; }; typedef struct llist llist_t; struct llist { - struct llist_item *head; - struct llist_item *tail; + struct llist_item *head; + struct llist_item *tail; }; typedef int (*llist_fn_cmp_t) (void *, void *); diff --git a/src/llist_ts.h b/src/llist_ts.h index 7663a2d..2c015f1 100644 --- a/src/llist_ts.h +++ b/src/llist_ts.h @@ -37,9 +37,9 @@ /* Thread-safe linked lists. */ typedef struct llist_ts llist_ts_t; struct llist_ts { - llist_item_t *head; - llist_item_t *tail; - pthread_mutex_t mutex; + llist_item_t *head; + llist_item_t *tail; + pthread_mutex_t mutex; }; /* Initialization and deallocation. */ @@ -44,10 +44,10 @@ #ifdef CALCURSE_MEMORY_DEBUG enum { - BLK_STATE, - BLK_SIZE, - BLK_ID, - EXTRA_SPACE_START + BLK_STATE, + BLK_SIZE, + BLK_ID, + EXTRA_SPACE_START }; #define EXTRA_SPACE_END 1 @@ -57,14 +57,14 @@ enum { #define MAGIC_FREE 0xdf struct mem_blk { - unsigned id, size; - const char *pos; - struct mem_blk *next; + unsigned id, size; + const char *pos; + struct mem_blk *next; }; struct mem_stats { - unsigned ncall, nalloc, nfree; - struct mem_blk *blk; + unsigned ncall, nalloc, nfree; + struct mem_blk *blk; }; static struct mem_stats mstats; @@ -73,229 +73,232 @@ static struct mem_stats mstats; void *xmalloc(size_t size) { - void *p; + void *p; - EXIT_IF(size == 0, _("xmalloc: zero size")); - p = malloc(size); - EXIT_IF(p == NULL, _("xmalloc: out of memory")); + EXIT_IF(size == 0, _("xmalloc: zero size")); + p = malloc(size); + EXIT_IF(p == NULL, _("xmalloc: out of memory")); - return p; + return p; } void *xcalloc(size_t nmemb, size_t size) { - void *p; + void *p; - EXIT_IF(nmemb == 0 || size == 0, _("xcalloc: zero size")); - EXIT_IF(SIZE_MAX / nmemb < size, _("xcalloc: overflow")); - p = calloc(nmemb, size); - EXIT_IF(p == NULL, _("xcalloc: out of memory")); + EXIT_IF(nmemb == 0 || size == 0, _("xcalloc: zero size")); + EXIT_IF(SIZE_MAX / nmemb < size, _("xcalloc: overflow")); + p = calloc(nmemb, size); + EXIT_IF(p == NULL, _("xcalloc: out of memory")); - return p; + return p; } void *xrealloc(void *ptr, size_t nmemb, size_t size) { - void *new_ptr; - size_t new_size; + void *new_ptr; + size_t new_size; - new_size = nmemb * size; - EXIT_IF(new_size == 0, _("xrealloc: zero size")); - EXIT_IF(SIZE_MAX / nmemb < size, _("xrealloc: overflow")); - new_ptr = realloc(ptr, new_size); - EXIT_IF(new_ptr == NULL, _("xrealloc: out of memory")); + new_size = nmemb * size; + EXIT_IF(new_size == 0, _("xrealloc: zero size")); + EXIT_IF(SIZE_MAX / nmemb < size, _("xrealloc: overflow")); + new_ptr = realloc(ptr, new_size); + EXIT_IF(new_ptr == NULL, _("xrealloc: out of memory")); - return new_ptr; + return new_ptr; } char *xstrdup(const char *str) { - size_t len; - char *cp; + size_t len; + char *cp; - len = strlen(str) + 1; - cp = xmalloc(len); + len = strlen(str) + 1; + cp = xmalloc(len); - return strncpy(cp, str, len); + return strncpy(cp, str, len); } void xfree(void *p) { - EXIT_IF(p == NULL, _("xfree: null pointer")); - free(p); + EXIT_IF(p == NULL, _("xfree: null pointer")); + free(p); } #ifdef CALCURSE_MEMORY_DEBUG static unsigned stats_add_blk(size_t size, const char *pos) { - struct mem_blk *o, **i; + struct mem_blk *o, **i; - o = malloc(sizeof(*o)); - EXIT_IF(o == NULL, _("could not allocate memory to store block info")); + o = malloc(sizeof(*o)); + EXIT_IF(o == NULL, + _("could not allocate memory to store block info")); - mstats.ncall++; + mstats.ncall++; - o->pos = pos; - o->size = (unsigned)size; - o->next = 0; + o->pos = pos; + o->size = (unsigned)size; + o->next = 0; - for (i = &mstats.blk; *i; i = &(*i)->next) ; - o->id = mstats.ncall; - *i = o; + for (i = &mstats.blk; *i; i = &(*i)->next) ; + o->id = mstats.ncall; + *i = o; - return o->id; + return o->id; } static void stats_del_blk(unsigned id) { - struct mem_blk *o, **i; - - i = &mstats.blk; - for (o = mstats.blk; o; o = o->next) { - if (o->id == id) { - *i = o->next; - free(o); - return; - } - i = &o->next; - } - - EXIT(_("Block not found")); - /* NOTREACHED */ + struct mem_blk *o, **i; + + i = &mstats.blk; + for (o = mstats.blk; o; o = o->next) { + if (o->id == id) { + *i = o->next; + free(o); + return; + } + i = &o->next; + } + + EXIT(_("Block not found")); + /* NOTREACHED */ } void *dbg_malloc(size_t size, const char *pos) { - unsigned *buf; + unsigned *buf; - if (size == 0) - return NULL; + if (size == 0) + return NULL; - size = EXTRA_SPACE + (size + sizeof(unsigned) - 1) / sizeof(unsigned); - buf = xmalloc(size * sizeof(unsigned)); + size = + EXTRA_SPACE + (size + sizeof(unsigned) - 1) / sizeof(unsigned); + buf = xmalloc(size * sizeof(unsigned)); - buf[BLK_STATE] = MAGIC_ALLOC; /* state of the block */ - buf[BLK_SIZE] = size; /* size of the block */ - buf[BLK_ID] = stats_add_blk(size, pos); /* identify a block by its id */ - buf[size - 1] = buf[BLK_ID]; /* mark at end of block */ + buf[BLK_STATE] = MAGIC_ALLOC; /* state of the block */ + buf[BLK_SIZE] = size; /* size of the block */ + buf[BLK_ID] = stats_add_blk(size, pos); /* identify a block by its id */ + buf[size - 1] = buf[BLK_ID]; /* mark at end of block */ - mstats.nalloc += size; + mstats.nalloc += size; - return (void *)(buf + EXTRA_SPACE_START); + return (void *)(buf + EXTRA_SPACE_START); } void *dbg_calloc(size_t nmemb, size_t size, const char *pos) { - void *buf; + void *buf; - if (!nmemb || !size) - return NULL; + if (!nmemb || !size) + return NULL; - EXIT_IF(nmemb > SIZE_MAX / size, _("overflow at %s"), pos); + EXIT_IF(nmemb > SIZE_MAX / size, _("overflow at %s"), pos); - size *= nmemb; - if ((buf = dbg_malloc(size, pos)) == NULL) - return NULL; + size *= nmemb; + if ((buf = dbg_malloc(size, pos)) == NULL) + return NULL; - memset(buf, 0, size); + memset(buf, 0, size); - return buf; + return buf; } void *dbg_realloc(void *ptr, size_t nmemb, size_t size, const char *pos) { - unsigned *buf, old_size, new_size, cpy_size; + unsigned *buf, old_size, new_size, cpy_size; - if (ptr == NULL) - return NULL; + if (ptr == NULL) + return NULL; - new_size = nmemb * size; - if (new_size == 0) - return NULL; + new_size = nmemb * size; + if (new_size == 0) + return NULL; - EXIT_IF(nmemb > SIZE_MAX / size, _("overflow at %s"), pos); + EXIT_IF(nmemb > SIZE_MAX / size, _("overflow at %s"), pos); - if ((buf = dbg_malloc(new_size, pos)) == NULL) - return NULL; + if ((buf = dbg_malloc(new_size, pos)) == NULL) + return NULL; - old_size = *((unsigned *)ptr - EXTRA_SPACE_START + BLK_SIZE); - cpy_size = (old_size > new_size) ? new_size : old_size; - memmove(buf, ptr, cpy_size); + old_size = *((unsigned *)ptr - EXTRA_SPACE_START + BLK_SIZE); + cpy_size = (old_size > new_size) ? new_size : old_size; + memmove(buf, ptr, cpy_size); - mem_free(ptr); + mem_free(ptr); - return (void *)buf; + return (void *)buf; } char *dbg_strdup(const char *s, const char *pos) { - size_t size; - char *buf; + size_t size; + char *buf; - if (s == NULL) - return NULL; + if (s == NULL) + return NULL; - size = strlen(s); - if ((buf = dbg_malloc(size + 1, pos)) == NULL) - return NULL; + size = strlen(s); + if ((buf = dbg_malloc(size + 1, pos)) == NULL) + return NULL; - return strncpy(buf, s, size + 1); + return strncpy(buf, s, size + 1); } void dbg_free(void *ptr, const char *pos) { - unsigned *buf, size; + unsigned *buf, size; - EXIT_IF(ptr == NULL, _("dbg_free: null pointer at %s"), pos); + EXIT_IF(ptr == NULL, _("dbg_free: null pointer at %s"), pos); - buf = (unsigned *)ptr - EXTRA_SPACE_START; - size = buf[BLK_SIZE]; + buf = (unsigned *)ptr - EXTRA_SPACE_START; + size = buf[BLK_SIZE]; - EXIT_IF(buf[BLK_STATE] == MAGIC_FREE, - _("block seems already freed at %s"), pos); - EXIT_IF(buf[BLK_STATE] != MAGIC_ALLOC, _("corrupt block header at %s"), pos); - EXIT_IF(buf[size - 1] != buf[BLK_ID], - _("corrupt block end at %s, (end = %u, should be %d)"), pos, - buf[size - 1], buf[BLK_ID]); + EXIT_IF(buf[BLK_STATE] == MAGIC_FREE, + _("block seems already freed at %s"), pos); + EXIT_IF(buf[BLK_STATE] != MAGIC_ALLOC, + _("corrupt block header at %s"), pos); + EXIT_IF(buf[size - 1] != buf[BLK_ID], + _("corrupt block end at %s, (end = %u, should be %d)"), + pos, buf[size - 1], buf[BLK_ID]); - buf[0] = MAGIC_FREE; + buf[0] = MAGIC_FREE; - stats_del_blk(buf[BLK_ID]); + stats_del_blk(buf[BLK_ID]); - free(buf); - mstats.nfree += size; + free(buf); + mstats.nfree += size; } static void dump_block_info(struct mem_blk *blk) { - if (blk == NULL) - return; - - puts(_("---==== MEMORY BLOCK ====----------------\n")); - printf(_(" id: %u\n"), blk->id); - printf(_(" size: %u\n"), blk->size); - printf(_(" allocated in: %s\n"), blk->pos); - puts(_("-----------------------------------------\n")); + if (blk == NULL) + return; + + puts(_("---==== MEMORY BLOCK ====----------------\n")); + printf(_(" id: %u\n"), blk->id); + printf(_(" size: %u\n"), blk->size); + printf(_(" allocated in: %s\n"), blk->pos); + puts(_("-----------------------------------------\n")); } void mem_stats(void) { - putchar('\n'); - puts(_("+------------------------------+\n")); - puts(_("| calcurse memory usage report |\n")); - puts(_("+------------------------------+\n")); - printf(_(" number of calls: %u\n"), mstats.ncall); - printf(_(" allocated blocks: %u\n"), mstats.nalloc); - printf(_(" unfreed blocks: %u\n"), mstats.nalloc - mstats.nfree); - putchar('\n'); - - if (mstats.nfree < mstats.nalloc) { - struct mem_blk *blk; - - for (blk = mstats.blk; blk; blk = blk->next) - dump_block_info(blk); - } + putchar('\n'); + puts(_("+------------------------------+\n")); + puts(_("| calcurse memory usage report |\n")); + puts(_("+------------------------------+\n")); + printf(_(" number of calls: %u\n"), mstats.ncall); + printf(_(" allocated blocks: %u\n"), mstats.nalloc); + printf(_(" unfreed blocks: %u\n"), mstats.nalloc - mstats.nfree); + putchar('\n'); + + if (mstats.nfree < mstats.nalloc) { + struct mem_blk *blk; + + for (blk = mstats.blk; blk; blk = blk->next) + dump_block_info(blk); + } } #endif /* CALCURSE_MEMORY_DEBUG */ @@ -41,12 +41,13 @@ #include "sha1.h" struct note_gc_hash { - char *hash; - char buf[MAX_NOTESIZ + 1]; - HTABLE_ENTRY(note_gc_hash); + char *hash; + char buf[MAX_NOTESIZ + 1]; + HTABLE_ENTRY(note_gc_hash); }; -static void note_gc_extract_key(struct note_gc_hash *, const char **, int *); +static void note_gc_extract_key(struct note_gc_hash *, const char **, + int *); static int note_gc_cmp(struct note_gc_hash *, struct note_gc_hash *); HTABLE_HEAD(htp, NOTE_GC_HSIZE, note_gc_hash); @@ -57,179 +58,180 @@ HTABLE_PROTOTYPE(htp, note_gc_hash) * contains its name. */ char *generate_note(const char *str) { - char *sha1 = mem_malloc(SHA1_DIGESTLEN * 2 + 1); - char notepath[BUFSIZ]; - FILE *fp; - - sha1_digest(str, sha1); - snprintf(notepath, BUFSIZ, "%s%s", path_notes, sha1); - fp = fopen(notepath, "w"); - EXIT_IF(fp == NULL, _("Warning: could not open %s, Aborting..."), notepath); - fputs(str, fp); - file_close(fp, __FILE_POS__); - - return sha1; + char *sha1 = mem_malloc(SHA1_DIGESTLEN * 2 + 1); + char notepath[BUFSIZ]; + FILE *fp; + + sha1_digest(str, sha1); + snprintf(notepath, BUFSIZ, "%s%s", path_notes, sha1); + fp = fopen(notepath, "w"); + EXIT_IF(fp == NULL, _("Warning: could not open %s, Aborting..."), + notepath); + fputs(str, fp); + file_close(fp, __FILE_POS__); + + return sha1; } /* Edit a note with an external editor. */ void edit_note(char **note, const char *editor) { - char tmppath[BUFSIZ]; - char *tmpext; - char notepath[BUFSIZ]; - char *sha1 = mem_malloc(SHA1_DIGESTLEN * 2 + 1); - FILE *fp; - - strncpy(tmppath, get_tempdir(), BUFSIZ); - strncat(tmppath, "/calcurse-note.", BUFSIZ - strlen(tmppath) - 1); - if ((tmpext = new_tempfile(tmppath, TMPEXTSIZ)) == NULL) - return; - strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1); - mem_free(tmpext); - - if (*note != NULL) { - snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note); - io_file_cp(notepath, tmppath); - } - - wins_launch_external(tmppath, editor); - - if (io_file_is_empty(tmppath) > 0) { - erase_note(note); - } else if ((fp = fopen(tmppath, "r"))) { - sha1_stream(fp, sha1); - fclose(fp); - *note = sha1; - - snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note); - io_file_cp(tmppath, notepath); - } - - unlink(tmppath); + char tmppath[BUFSIZ]; + char *tmpext; + char notepath[BUFSIZ]; + char *sha1 = mem_malloc(SHA1_DIGESTLEN * 2 + 1); + FILE *fp; + + strncpy(tmppath, get_tempdir(), BUFSIZ); + strncat(tmppath, "/calcurse-note.", BUFSIZ - strlen(tmppath) - 1); + if ((tmpext = new_tempfile(tmppath, TMPEXTSIZ)) == NULL) + return; + strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1); + mem_free(tmpext); + + if (*note != NULL) { + snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note); + io_file_cp(notepath, tmppath); + } + + wins_launch_external(tmppath, editor); + + if (io_file_is_empty(tmppath) > 0) { + erase_note(note); + } else if ((fp = fopen(tmppath, "r"))) { + sha1_stream(fp, sha1); + fclose(fp); + *note = sha1; + + snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note); + io_file_cp(tmppath, notepath); + } + + unlink(tmppath); } /* View a note in an external pager. */ void view_note(const char *note, const char *pager) { - char fullname[BUFSIZ]; + char fullname[BUFSIZ]; - if (note == NULL) - return; - snprintf(fullname, BUFSIZ, "%s%s", path_notes, note); - wins_launch_external(fullname, pager); + if (note == NULL) + return; + snprintf(fullname, BUFSIZ, "%s%s", path_notes, note); + wins_launch_external(fullname, pager); } /* Erase a note previously attached to an item. */ void erase_note(char **note) { - if (*note == NULL) - return; - mem_free(*note); - *note = NULL; + if (*note == NULL) + return; + mem_free(*note); + *note = NULL; } /* Read a serialized note file name from a stream and deserialize it. */ void note_read(char *buffer, FILE * fp) { - int i; - - for (i = 0; i < MAX_NOTESIZ; i++) { - buffer[i] = getc(fp); - if (buffer[i] == ' ') { - buffer[i] = '\0'; - return; - } - } - - while (getc(fp) != ' ') ; - buffer[MAX_NOTESIZ] = '\0'; + int i; + + for (i = 0; i < MAX_NOTESIZ; i++) { + buffer[i] = getc(fp); + if (buffer[i] == ' ') { + buffer[i] = '\0'; + return; + } + } + + while (getc(fp) != ' ') ; + buffer[MAX_NOTESIZ] = '\0'; } static void note_gc_extract_key(struct note_gc_hash *data, const char **key, int *len) { - *key = data->hash; - *len = strlen(data->hash); + *key = data->hash; + *len = strlen(data->hash); } static int note_gc_cmp(struct note_gc_hash *a, struct note_gc_hash *b) { - return strcmp(a->hash, b->hash); + return strcmp(a->hash, b->hash); } /* Spot and unlink unused note files. */ void note_gc(void) { - struct htp gc_htable = HTABLE_INITIALIZER(&gc_htable); - struct note_gc_hash *hp; - DIR *dirp; - struct dirent *dp; - llist_item_t *i; - struct note_gc_hash tmph; - char notepath[BUFSIZ]; - - if (!(dirp = opendir(path_notes))) - return; - - /* Insert all note file names into a hash table. */ - do { - if ((dp = readdir(dirp)) && *(dp->d_name) != '.') { - hp = mem_malloc(sizeof(struct note_gc_hash)); - - strncpy(hp->buf, dp->d_name, MAX_NOTESIZ + 1); - hp->hash = hp->buf; - - HTABLE_INSERT(htp, &gc_htable, hp); - } - } - while (dp); - - closedir(dirp); - - /* Remove hashes that are actually in use. */ - LLIST_TS_FOREACH(&alist_p, i) { - struct apoint *apt = LLIST_GET_DATA(i); - if (apt->note) { - tmph.hash = apt->note; - free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); - } - } - - LLIST_FOREACH(&eventlist, i) { - struct event *ev = LLIST_GET_DATA(i); - if (ev->note) { - tmph.hash = ev->note; - free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); - } - } - - LLIST_TS_FOREACH(&recur_alist_p, i) { - struct recur_apoint *rapt = LLIST_GET_DATA(i); - if (rapt->note) { - tmph.hash = rapt->note; - free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); - } - } - - LLIST_FOREACH(&recur_elist, i) { - struct recur_event *rev = LLIST_GET_DATA(i); - if (rev->note) { - tmph.hash = rev->note; - free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); - } - } - - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_GET_DATA(i); - if (todo->note) { - tmph.hash = todo->note; - free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); - } - } - - /* Unlink unused note files. */ - HTABLE_FOREACH(hp, htp, &gc_htable) { - snprintf(notepath, BUFSIZ, "%s%s", path_notes, hp->hash); - unlink(notepath); - } + struct htp gc_htable = HTABLE_INITIALIZER(&gc_htable); + struct note_gc_hash *hp; + DIR *dirp; + struct dirent *dp; + llist_item_t *i; + struct note_gc_hash tmph; + char notepath[BUFSIZ]; + + if (!(dirp = opendir(path_notes))) + return; + + /* Insert all note file names into a hash table. */ + do { + if ((dp = readdir(dirp)) && *(dp->d_name) != '.') { + hp = mem_malloc(sizeof(struct note_gc_hash)); + + strncpy(hp->buf, dp->d_name, MAX_NOTESIZ + 1); + hp->hash = hp->buf; + + HTABLE_INSERT(htp, &gc_htable, hp); + } + } + while (dp); + + closedir(dirp); + + /* Remove hashes that are actually in use. */ + LLIST_TS_FOREACH(&alist_p, i) { + struct apoint *apt = LLIST_GET_DATA(i); + if (apt->note) { + tmph.hash = apt->note; + free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); + } + } + + LLIST_FOREACH(&eventlist, i) { + struct event *ev = LLIST_GET_DATA(i); + if (ev->note) { + tmph.hash = ev->note; + free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); + } + } + + LLIST_TS_FOREACH(&recur_alist_p, i) { + struct recur_apoint *rapt = LLIST_GET_DATA(i); + if (rapt->note) { + tmph.hash = rapt->note; + free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); + } + } + + LLIST_FOREACH(&recur_elist, i) { + struct recur_event *rev = LLIST_GET_DATA(i); + if (rev->note) { + tmph.hash = rev->note; + free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); + } + } + + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_GET_DATA(i); + if (todo->note) { + tmph.hash = todo->note; + free(HTABLE_REMOVE(htp, &gc_htable, &tmph)); + } + } + + /* Unlink unused note files. */ + HTABLE_FOREACH(hp, htp, &gc_htable) { + snprintf(notepath, BUFSIZ, "%s%s", path_notes, hp->hash); + unlink(notepath); + } } diff --git a/src/notify.c b/src/notify.c index 36aad5a..816da3c 100644 --- a/src/notify.c +++ b/src/notify.c @@ -44,11 +44,11 @@ #define NOTIFY_FIELD_LENGTH 25 struct notify_vars { - WINDOW *win; - char *apts_file; - char time[NOTIFY_FIELD_LENGTH]; - char date[NOTIFY_FIELD_LENGTH]; - pthread_mutex_t mutex; + WINDOW *win; + char *apts_file; + char time[NOTIFY_FIELD_LENGTH]; + char date[NOTIFY_FIELD_LENGTH]; + pthread_mutex_t mutex; }; static struct notify_vars notify; @@ -62,13 +62,13 @@ static pthread_t notify_t_main; */ int notify_time_left(void) { - time_t ntimer; - int left; + time_t ntimer; + int left; - ntimer = time(NULL); - left = notify_app.time - ntimer; + ntimer = time(NULL); + left = notify_app.time - ntimer; - return left > 0 ? left : 0; + return left > 0 ? left : 0; } /* @@ -77,12 +77,12 @@ int notify_time_left(void) */ unsigned notify_needs_reminder(void) { - if (notify_app.got_app - && (((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) || - (!(notify_app.state & APOINT_NOTIFY) && nbar.notify_all)) - && !(notify_app.state & APOINT_NOTIFIED)) - return 1; - return 0; + if (notify_app.got_app + && (((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) || + (!(notify_app.state & APOINT_NOTIFY) && nbar.notify_all)) + && !(notify_app.state & APOINT_NOTIFIED)) + return 1; + return 0; } /* @@ -92,60 +92,61 @@ unsigned notify_needs_reminder(void) */ void notify_update_app(long start, char state, char *msg) { - notify_free_app(); - notify_app.got_app = 1; - notify_app.time = start; - notify_app.state = state; - notify_app.txt = mem_strdup(msg); + notify_free_app(); + notify_app.got_app = 1; + notify_app.time = start; + notify_app.state = state; + notify_app.txt = mem_strdup(msg); } /* Return 1 if we need to display the notify-bar, else 0. */ int notify_bar(void) { - int display_bar = 0; + int display_bar = 0; - pthread_mutex_lock(&nbar.mutex); - display_bar = (nbar.show) ? 1 : 0; - pthread_mutex_unlock(&nbar.mutex); + pthread_mutex_lock(&nbar.mutex); + display_bar = (nbar.show) ? 1 : 0; + pthread_mutex_unlock(&nbar.mutex); - return display_bar; + return display_bar; } /* Initialize the nbar variable used to store notification options. */ void notify_init_vars(void) { - const char *time_format = "%T"; - const char *date_format = "%a %F"; - const char *cmd = "printf '\\a'"; + const char *time_format = "%T"; + const char *date_format = "%a %F"; + const char *cmd = "printf '\\a'"; - pthread_mutex_init(&nbar.mutex, NULL); - nbar.show = 1; - nbar.cntdwn = 300; - strncpy(nbar.datefmt, date_format, strlen(date_format) + 1); - strncpy(nbar.timefmt, time_format, strlen(time_format) + 1); - strncpy(nbar.cmd, cmd, strlen(cmd) + 1); + pthread_mutex_init(&nbar.mutex, NULL); + nbar.show = 1; + nbar.cntdwn = 300; + strncpy(nbar.datefmt, date_format, strlen(date_format) + 1); + strncpy(nbar.timefmt, time_format, strlen(time_format) + 1); + strncpy(nbar.cmd, cmd, strlen(cmd) + 1); - if ((nbar.shell = getenv("SHELL")) == NULL) - nbar.shell = "/bin/sh"; + if ((nbar.shell = getenv("SHELL")) == NULL) + nbar.shell = "/bin/sh"; - nbar.notify_all = 0; + nbar.notify_all = 0; - pthread_attr_init(&detached_thread_attr); - pthread_attr_setdetachstate(&detached_thread_attr, PTHREAD_CREATE_DETACHED); + pthread_attr_init(&detached_thread_attr); + pthread_attr_setdetachstate(&detached_thread_attr, + PTHREAD_CREATE_DETACHED); } /* Extract the appointment file name from the complete file path. */ static void extract_aptsfile(void) { - char *file; - - file = strrchr(path_apts, '/'); - if (!file) { - notify.apts_file = path_apts; - } else { - notify.apts_file = file; - notify.apts_file++; - } + char *file; + + file = strrchr(path_apts, '/'); + if (!file) { + notify.apts_file = path_apts; + } else { + notify.apts_file = file; + notify.apts_file++; + } } /* @@ -155,12 +156,13 @@ static void extract_aptsfile(void) */ void notify_init_bar(void) { - pthread_mutex_init(¬ify.mutex, NULL); - pthread_mutex_init(¬ify_app.mutex, NULL); - notify_app.got_app = 0; - notify_app.txt = 0; - notify.win = newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x); - extract_aptsfile(); + pthread_mutex_init(¬ify.mutex, NULL); + pthread_mutex_init(¬ify_app.mutex, NULL); + notify_app.got_app = 0; + notify_app.txt = 0; + notify.win = + newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x); + extract_aptsfile(); } /* @@ -168,21 +170,21 @@ void notify_init_bar(void) */ void notify_free_app(void) { - notify_app.time = 0; - notify_app.got_app = 0; - notify_app.state = APOINT_NULL; - if (notify_app.txt) - mem_free(notify_app.txt); - notify_app.txt = 0; + notify_app.time = 0; + notify_app.got_app = 0; + notify_app.state = APOINT_NULL; + if (notify_app.txt) + mem_free(notify_app.txt); + notify_app.txt = 0; } /* Stop the notify-bar main thread. */ void notify_stop_main_thread(void) { - if (notify_t_main) { - pthread_cancel(notify_t_main); - pthread_join(notify_t_main, NULL); - } + if (notify_t_main) { + pthread_cancel(notify_t_main); + pthread_join(notify_t_main, NULL); + } } /* @@ -191,35 +193,37 @@ void notify_stop_main_thread(void) */ void notify_reinit_bar(void) { - delwin(notify.win); - notify.win = newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x); + delwin(notify.win); + notify.win = + newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x); } /* Launch user defined command as a notification. */ unsigned notify_launch_cmd(void) { - int pid; + int pid; - if (notify_app.state & APOINT_NOTIFIED) - return 1; + if (notify_app.state & APOINT_NOTIFIED) + return 1; - notify_app.state |= APOINT_NOTIFIED; + notify_app.state |= APOINT_NOTIFIED; - pid = fork(); + pid = fork(); - if (pid < 0) { - ERROR_MSG(_("error while launching command: could not fork")); - return 0; - } else if (pid == 0) { - /* Child: launch user defined command */ - if (execlp(nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) < 0) { - ERROR_MSG(_("error while launching command")); - _exit(1); - } - _exit(0); - } + if (pid < 0) { + ERROR_MSG(_("error while launching command: could not fork")); + return 0; + } else if (pid == 0) { + /* Child: launch user defined command */ + if (execlp(nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) < + 0) { + ERROR_MSG(_("error while launching command")); + _exit(1); + } + _exit(0); + } - return 1; + return 1; } /* @@ -228,141 +232,152 @@ unsigned notify_launch_cmd(void) */ void notify_update_bar(void) { - const int space = 3; - int file_pos, date_pos, app_pos, txt_max_len, too_long = 0; - int time_left, blinking; - char buf[BUFSIZ]; - - date_pos = space; - pthread_mutex_lock(¬ify.mutex); - - file_pos = strlen(notify.date) + strlen(notify.time) + 7 + 2 * space; - app_pos = file_pos + strlen(notify.apts_file) + 2 + space; - txt_max_len = col - (app_pos + 12 + space); - - WINS_NBAR_LOCK; - custom_apply_attr(notify.win, ATTR_HIGHEST); - wattron(notify.win, A_UNDERLINE | A_REVERSE); - mvwhline(notify.win, 0, 0, ACS_HLINE, col); - mvwprintw(notify.win, 0, date_pos, "[ %s | %s ]", notify.date, notify.time); - mvwprintw(notify.win, 0, file_pos, "(%s)", notify.apts_file); - WINS_NBAR_UNLOCK; - - pthread_mutex_lock(¬ify_app.mutex); - if (notify_app.got_app) { - if (strlen(notify_app.txt) > txt_max_len) { - int shrink_len; - - too_long = 1; - shrink_len = txt_max_len > 3 ? txt_max_len - 3 : 1; - strncpy(buf, notify_app.txt, shrink_len); - buf[shrink_len] = '\0'; - } - time_left = notify_time_left(); - if (time_left > 0) { - int hours_left, minutes_left; - - hours_left = (time_left / HOURINSEC); - minutes_left = (time_left - hours_left * HOURINSEC) / MININSEC; - pthread_mutex_lock(&nbar.mutex); - - if (time_left < nbar.cntdwn && - (((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) || - (!(notify_app.state & APOINT_NOTIFY) && nbar.notify_all))) - blinking = 1; - else - blinking = 0; - - WINS_NBAR_LOCK; - if (blinking) - wattron(notify.win, A_BLINK); - if (too_long) - mvwprintw(notify.win, 0, app_pos, "> %02d:%02d :: %s.. <", - hours_left, minutes_left, buf); - else - mvwprintw(notify.win, 0, app_pos, "> %02d:%02d :: %s <", - hours_left, minutes_left, notify_app.txt); - if (blinking) - wattroff(notify.win, A_BLINK); - WINS_NBAR_UNLOCK; - - if (blinking) - notify_launch_cmd(); - pthread_mutex_unlock(&nbar.mutex); - } else { - notify_app.got_app = 0; - pthread_mutex_unlock(¬ify_app.mutex); - pthread_mutex_unlock(¬ify.mutex); - notify_check_next_app(0); - return; - } - } - pthread_mutex_unlock(¬ify_app.mutex); - - WINS_NBAR_LOCK; - wattroff(notify.win, A_UNDERLINE | A_REVERSE); - custom_remove_attr(notify.win, ATTR_HIGHEST); - WINS_NBAR_UNLOCK; - wins_wrefresh(notify.win); - - pthread_mutex_unlock(¬ify.mutex); + const int space = 3; + int file_pos, date_pos, app_pos, txt_max_len, too_long = 0; + int time_left, blinking; + char buf[BUFSIZ]; + + date_pos = space; + pthread_mutex_lock(¬ify.mutex); + + file_pos = + strlen(notify.date) + strlen(notify.time) + 7 + 2 * space; + app_pos = file_pos + strlen(notify.apts_file) + 2 + space; + txt_max_len = col - (app_pos + 12 + space); + + WINS_NBAR_LOCK; + custom_apply_attr(notify.win, ATTR_HIGHEST); + wattron(notify.win, A_UNDERLINE | A_REVERSE); + mvwhline(notify.win, 0, 0, ACS_HLINE, col); + mvwprintw(notify.win, 0, date_pos, "[ %s | %s ]", notify.date, + notify.time); + mvwprintw(notify.win, 0, file_pos, "(%s)", notify.apts_file); + WINS_NBAR_UNLOCK; + + pthread_mutex_lock(¬ify_app.mutex); + if (notify_app.got_app) { + if (strlen(notify_app.txt) > txt_max_len) { + int shrink_len; + + too_long = 1; + shrink_len = txt_max_len > 3 ? txt_max_len - 3 : 1; + strncpy(buf, notify_app.txt, shrink_len); + buf[shrink_len] = '\0'; + } + time_left = notify_time_left(); + if (time_left > 0) { + int hours_left, minutes_left; + + hours_left = (time_left / HOURINSEC); + minutes_left = + (time_left - + hours_left * HOURINSEC) / MININSEC; + pthread_mutex_lock(&nbar.mutex); + + if (time_left < nbar.cntdwn && + (((notify_app.state & APOINT_NOTIFY) + && !nbar.notify_all) + || (!(notify_app.state & APOINT_NOTIFY) + && nbar.notify_all))) + blinking = 1; + else + blinking = 0; + + WINS_NBAR_LOCK; + if (blinking) + wattron(notify.win, A_BLINK); + if (too_long) + mvwprintw(notify.win, 0, app_pos, + "> %02d:%02d :: %s.. <", + hours_left, minutes_left, buf); + else + mvwprintw(notify.win, 0, app_pos, + "> %02d:%02d :: %s <", + hours_left, minutes_left, + notify_app.txt); + if (blinking) + wattroff(notify.win, A_BLINK); + WINS_NBAR_UNLOCK; + + if (blinking) + notify_launch_cmd(); + pthread_mutex_unlock(&nbar.mutex); + } else { + notify_app.got_app = 0; + pthread_mutex_unlock(¬ify_app.mutex); + pthread_mutex_unlock(¬ify.mutex); + notify_check_next_app(0); + return; + } + } + pthread_mutex_unlock(¬ify_app.mutex); + + WINS_NBAR_LOCK; + wattroff(notify.win, A_UNDERLINE | A_REVERSE); + custom_remove_attr(notify.win, ATTR_HIGHEST); + WINS_NBAR_UNLOCK; + wins_wrefresh(notify.win); + + pthread_mutex_unlock(¬ify.mutex); } /* Update the notication bar content */ /* ARGSUSED0 */ static void *notify_main_thread(void *arg) { - const unsigned thread_sleep = 1; - const unsigned check_app = MININSEC; - int elapse = 0; - int got_app; - struct tm ntime; - time_t ntimer; - - elapse = 0; - - for (;;) { - ntimer = time(NULL); - localtime_r(&ntimer, &ntime); - pthread_mutex_lock(¬ify.mutex); - pthread_mutex_lock(&nbar.mutex); - strftime(notify.time, NOTIFY_FIELD_LENGTH, nbar.timefmt, &ntime); - strftime(notify.date, NOTIFY_FIELD_LENGTH, nbar.datefmt, &ntime); - pthread_mutex_unlock(&nbar.mutex); - pthread_mutex_unlock(¬ify.mutex); - notify_update_bar(); - psleep(thread_sleep); - elapse += thread_sleep; - if (elapse >= check_app) { - elapse = 0; - pthread_mutex_lock(¬ify_app.mutex); - got_app = notify_app.got_app; - pthread_mutex_unlock(¬ify_app.mutex); - if (!got_app) - notify_check_next_app(0); - } - } - pthread_exit(NULL); + const unsigned thread_sleep = 1; + const unsigned check_app = MININSEC; + int elapse = 0; + int got_app; + struct tm ntime; + time_t ntimer; + + elapse = 0; + + for (;;) { + ntimer = time(NULL); + localtime_r(&ntimer, &ntime); + pthread_mutex_lock(¬ify.mutex); + pthread_mutex_lock(&nbar.mutex); + strftime(notify.time, NOTIFY_FIELD_LENGTH, nbar.timefmt, + &ntime); + strftime(notify.date, NOTIFY_FIELD_LENGTH, nbar.datefmt, + &ntime); + pthread_mutex_unlock(&nbar.mutex); + pthread_mutex_unlock(¬ify.mutex); + notify_update_bar(); + psleep(thread_sleep); + elapse += thread_sleep; + if (elapse >= check_app) { + elapse = 0; + pthread_mutex_lock(¬ify_app.mutex); + got_app = notify_app.got_app; + pthread_mutex_unlock(¬ify_app.mutex); + if (!got_app) + notify_check_next_app(0); + } + } + pthread_exit(NULL); } /* Fill the given structure with information about next appointment. */ unsigned notify_get_next(struct notify_app *a) { - time_t current_time; + time_t current_time; - if (!a) - return 0; + if (!a) + return 0; - current_time = time(NULL); + current_time = time(NULL); - a->time = current_time + DAYINSEC; - a->got_app = 0; - a->state = 0; - a->txt = NULL; - recur_apoint_check_next(a, current_time, get_today()); - apoint_check_next(a, current_time); + a->time = current_time + DAYINSEC; + a->got_app = 0; + a->state = 0; + a->txt = NULL; + recur_apoint_check_next(a, current_time, get_today()); + apoint_check_next(a, current_time); - return 1; + return 1; } /* @@ -371,162 +386,166 @@ unsigned notify_get_next(struct notify_app *a) */ unsigned notify_get_next_bkgd(void) { - struct notify_app a; + struct notify_app a; - a.txt = NULL; - if (!notify_get_next(&a)) - return 0; + a.txt = NULL; + if (!notify_get_next(&a)) + return 0; - if (!a.got_app) { - /* No next appointment, reset the previous notified one. */ - notify_app.got_app = 0; - return 1; - } else { - if (!notify_same_item(a.time)) - notify_update_app(a.time, a.state, a.txt); - } + if (!a.got_app) { + /* No next appointment, reset the previous notified one. */ + notify_app.got_app = 0; + return 1; + } else { + if (!notify_same_item(a.time)) + notify_update_app(a.time, a.state, a.txt); + } - if (a.txt) - mem_free(a.txt); + if (a.txt) + mem_free(a.txt); - return 1; + return 1; } /* Return the description of next appointment to be notified. */ char *notify_app_txt(void) { - if (notify_app.got_app) - return notify_app.txt; - else - return NULL; + if (notify_app.got_app) + return notify_app.txt; + else + return NULL; } /* Look for the next appointment within the next 24 hours. */ /* ARGSUSED0 */ static void *notify_thread_app(void *arg) { - struct notify_app tmp_app; - int force = (arg ? 1 : 0); - - if (!notify_get_next(&tmp_app)) - pthread_exit(NULL); - - if (!tmp_app.got_app) { - pthread_mutex_lock(¬ify_app.mutex); - notify_free_app(); - pthread_mutex_unlock(¬ify_app.mutex); - } else { - if (force || !notify_same_item(tmp_app.time)) { - pthread_mutex_lock(¬ify_app.mutex); - notify_update_app(tmp_app.time, tmp_app.state, tmp_app.txt); - pthread_mutex_unlock(¬ify_app.mutex); - } - } - - if (tmp_app.txt) - mem_free(tmp_app.txt); - notify_update_bar(); - - pthread_exit(NULL); + struct notify_app tmp_app; + int force = (arg ? 1 : 0); + + if (!notify_get_next(&tmp_app)) + pthread_exit(NULL); + + if (!tmp_app.got_app) { + pthread_mutex_lock(¬ify_app.mutex); + notify_free_app(); + pthread_mutex_unlock(¬ify_app.mutex); + } else { + if (force || !notify_same_item(tmp_app.time)) { + pthread_mutex_lock(¬ify_app.mutex); + notify_update_app(tmp_app.time, tmp_app.state, + tmp_app.txt); + pthread_mutex_unlock(¬ify_app.mutex); + } + } + + if (tmp_app.txt) + mem_free(tmp_app.txt); + notify_update_bar(); + + pthread_exit(NULL); } /* Launch the thread notify_thread_app to look for next appointment. */ void notify_check_next_app(int force) { - pthread_t notify_t_app; - void *arg = (force ? (void *)1 : NULL); + pthread_t notify_t_app; + void *arg = (force ? (void *)1 : NULL); - pthread_create(¬ify_t_app, &detached_thread_attr, notify_thread_app, arg); - return; + pthread_create(¬ify_t_app, &detached_thread_attr, + notify_thread_app, arg); + return; } /* Check if the newly created appointment is to be notified. */ void notify_check_added(char *mesg, long start, char state) { - time_t current_time; - int update_notify = 0; - long gap; - - current_time = time(NULL); - pthread_mutex_lock(¬ify_app.mutex); - if (!notify_app.got_app) { - gap = start - current_time; - if (gap >= 0 && gap <= DAYINSEC) - update_notify = 1; - } else if (start < notify_app.time && start >= current_time) { - update_notify = 1; - } else if (start == notify_app.time && state != notify_app.state) { - update_notify = 1; - } - - if (update_notify) { - notify_update_app(start, state, mesg); - } - pthread_mutex_unlock(¬ify_app.mutex); - notify_update_bar(); + time_t current_time; + int update_notify = 0; + long gap; + + current_time = time(NULL); + pthread_mutex_lock(¬ify_app.mutex); + if (!notify_app.got_app) { + gap = start - current_time; + if (gap >= 0 && gap <= DAYINSEC) + update_notify = 1; + } else if (start < notify_app.time && start >= current_time) { + update_notify = 1; + } else if (start == notify_app.time && state != notify_app.state) { + update_notify = 1; + } + + if (update_notify) { + notify_update_app(start, state, mesg); + } + pthread_mutex_unlock(¬ify_app.mutex); + notify_update_bar(); } /* Check if the newly repeated appointment is to be notified. */ void notify_check_repeated(struct recur_apoint *i) { - unsigned real_app_time; - int update_notify = 0; - time_t current_time; - - current_time = time(NULL); - pthread_mutex_lock(¬ify_app.mutex); - if (recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type, - i->rpt->freq, i->rpt->until, get_today(), - &real_app_time)) { - if (!notify_app.got_app) { - if (real_app_time - current_time <= DAYINSEC) - update_notify = 1; - } else if (real_app_time < notify_app.time && real_app_time >= current_time) { - update_notify = 1; - } else if (real_app_time == notify_app.time && i->state != notify_app.state) { - update_notify = 1; - } - } - if (update_notify) { - notify_update_app(real_app_time, i->state, i->mesg); - } - pthread_mutex_unlock(¬ify_app.mutex); - notify_update_bar(); + unsigned real_app_time; + int update_notify = 0; + time_t current_time; + + current_time = time(NULL); + pthread_mutex_lock(¬ify_app.mutex); + if (recur_item_find_occurrence + (i->start, i->dur, &i->exc, i->rpt->type, i->rpt->freq, + i->rpt->until, get_today(), &real_app_time)) { + if (!notify_app.got_app) { + if (real_app_time - current_time <= DAYINSEC) + update_notify = 1; + } else if (real_app_time < notify_app.time + && real_app_time >= current_time) { + update_notify = 1; + } else if (real_app_time == notify_app.time + && i->state != notify_app.state) { + update_notify = 1; + } + } + if (update_notify) { + notify_update_app(real_app_time, i->state, i->mesg); + } + pthread_mutex_unlock(¬ify_app.mutex); + notify_update_bar(); } int notify_same_item(long time) { - int same = 0; + int same = 0; - pthread_mutex_lock(&(notify_app.mutex)); - if (notify_app.got_app && notify_app.time == time) - same = 1; - pthread_mutex_unlock(&(notify_app.mutex)); + pthread_mutex_lock(&(notify_app.mutex)); + if (notify_app.got_app && notify_app.time == time) + same = 1; + pthread_mutex_unlock(&(notify_app.mutex)); - return same; + return same; } int notify_same_recur_item(struct recur_apoint *i) { - int same = 0; - unsigned item_start = 0; - - recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type, - i->rpt->freq, i->rpt->until, get_today(), - &item_start); - pthread_mutex_lock(¬ify_app.mutex); - if (notify_app.got_app && item_start == notify_app.time) - same = 1; - pthread_mutex_unlock(&(notify_app.mutex)); - - return same; + int same = 0; + unsigned item_start = 0; + + recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type, + i->rpt->freq, i->rpt->until, + get_today(), &item_start); + pthread_mutex_lock(¬ify_app.mutex); + if (notify_app.got_app && item_start == notify_app.time) + same = 1; + pthread_mutex_unlock(&(notify_app.mutex)); + + return same; } /* Launch the notify-bar main thread. */ void notify_start_main_thread(void) { - pthread_create(¬ify_t_main, NULL, notify_main_thread, NULL); - notify_check_next_app(0); + pthread_create(¬ify_t_main, NULL, notify_main_thread, NULL); + notify_check_next_app(0); } /* @@ -536,248 +555,263 @@ void notify_start_main_thread(void) */ static void print_option(WINDOW * win, unsigned x, unsigned y, char *name, - char *valstr, unsigned valbool, char *desc, unsigned num) + char *valstr, unsigned valbool, char *desc, unsigned num) { - const int XOFF = 4; - const int MAXCOL = col - 3; - int x_opt, len; - - x_opt = x + XOFF + strlen(name); - mvwprintw(win, y, x, "[%u] %s", num, name); - erase_window_part(win, x_opt, y, MAXCOL, y); - if ((len = strlen(valstr)) != 0) { - unsigned maxlen; - - maxlen = MAXCOL - x_opt - 2; - custom_apply_attr(win, ATTR_HIGHEST); - if (len < maxlen) { - mvwaddstr(win, y, x_opt, valstr); - } else { - char buf[BUFSIZ]; - - strncpy(buf, valstr, maxlen - 1); - buf[maxlen - 1] = '\0'; - mvwprintw(win, y, x_opt, "%s...", buf); - } - custom_remove_attr(win, ATTR_HIGHEST); - } else { - print_bool_option_incolor(win, valbool, y, x_opt); - } - mvwaddstr(win, y + 1, x, desc); + const int XOFF = 4; + const int MAXCOL = col - 3; + int x_opt, len; + + x_opt = x + XOFF + strlen(name); + mvwprintw(win, y, x, "[%u] %s", num, name); + erase_window_part(win, x_opt, y, MAXCOL, y); + if ((len = strlen(valstr)) != 0) { + unsigned maxlen; + + maxlen = MAXCOL - x_opt - 2; + custom_apply_attr(win, ATTR_HIGHEST); + if (len < maxlen) { + mvwaddstr(win, y, x_opt, valstr); + } else { + char buf[BUFSIZ]; + + strncpy(buf, valstr, maxlen - 1); + buf[maxlen - 1] = '\0'; + mvwprintw(win, y, x_opt, "%s...", buf); + } + custom_remove_attr(win, ATTR_HIGHEST); + } else { + print_bool_option_incolor(win, valbool, y, x_opt); + } + mvwaddstr(win, y + 1, x, desc); } /* Print options related to the notify-bar. */ static unsigned print_config_options(WINDOW * optwin) { - const int XORIG = 3; - const int YORIG = 0; - const int YOFF = 3; + const int XORIG = 3; + const int YORIG = 0; + const int YOFF = 3; - enum { SHOW, DATE, CLOCK, WARN, CMD, NOTIFY_ALL, DMON, DMON_LOG, NB_OPT }; + enum { SHOW, DATE, CLOCK, WARN, CMD, NOTIFY_ALL, DMON, DMON_LOG, + NB_OPT }; - struct opt_s { - char *name; - char *desc; - char valstr[BUFSIZ]; - unsigned valnum; - } opt[NB_OPT]; + struct opt_s { + char *name; + char *desc; + char valstr[BUFSIZ]; + unsigned valnum; + } opt[NB_OPT]; - int i; + int i; - opt[SHOW].name = "appearance.notifybar = "; - opt[SHOW].desc = _("(if set to YES, notify-bar will be displayed)"); + opt[SHOW].name = "appearance.notifybar = "; + opt[SHOW].desc = + _("(if set to YES, notify-bar will be displayed)"); - opt[DATE].name = "format.notifydate = "; - opt[DATE].desc = _("(Format of the date to be displayed inside notify-bar)"); + opt[DATE].name = "format.notifydate = "; + opt[DATE].desc = + _("(Format of the date to be displayed inside notify-bar)"); - opt[CLOCK].name = "format.notifytime = "; - opt[CLOCK].desc = _("(Format of the time to be displayed inside notify-bar)"); + opt[CLOCK].name = "format.notifytime = "; + opt[CLOCK].desc = + _("(Format of the time to be displayed inside notify-bar)"); - opt[WARN].name = "notification.warning = "; - opt[WARN].desc = _("(Warn user if an appointment is within next " - "'notify-bar_warning' seconds)"); + opt[WARN].name = "notification.warning = "; + opt[WARN].desc = _("(Warn user if an appointment is within next " + "'notify-bar_warning' seconds)"); - opt[CMD].name = "notification.command = "; - opt[CMD].desc = _("(Command used to notify user of an upcoming appointment)"); + opt[CMD].name = "notification.command = "; + opt[CMD].desc = + _("(Command used to notify user of an upcoming appointment)"); - opt[NOTIFY_ALL].name = "notification.notifyall = "; - opt[NOTIFY_ALL].desc = - _("(Notify all appointments instead of flagged ones only)"); + opt[NOTIFY_ALL].name = "notification.notifyall = "; + opt[NOTIFY_ALL].desc = + _("(Notify all appointments instead of flagged ones only)"); - opt[DMON].name = "daemon.enable = "; - opt[DMON].desc = _("(Run in background to get notifications after exiting)"); + opt[DMON].name = "daemon.enable = "; + opt[DMON].desc = + _("(Run in background to get notifications after exiting)"); - opt[DMON_LOG].name = "daemon.log = "; - opt[DMON_LOG].desc = _("(Log activity when running in background)"); + opt[DMON_LOG].name = "daemon.log = "; + opt[DMON_LOG].desc = + _("(Log activity when running in background)"); - pthread_mutex_lock(&nbar.mutex); + pthread_mutex_lock(&nbar.mutex); - /* String value options */ - strncpy(opt[DATE].valstr, nbar.datefmt, BUFSIZ); - strncpy(opt[CLOCK].valstr, nbar.timefmt, BUFSIZ); - snprintf(opt[WARN].valstr, BUFSIZ, "%d", nbar.cntdwn); - strncpy(opt[CMD].valstr, nbar.cmd, BUFSIZ); + /* String value options */ + strncpy(opt[DATE].valstr, nbar.datefmt, BUFSIZ); + strncpy(opt[CLOCK].valstr, nbar.timefmt, BUFSIZ); + snprintf(opt[WARN].valstr, BUFSIZ, "%d", nbar.cntdwn); + strncpy(opt[CMD].valstr, nbar.cmd, BUFSIZ); - /* Boolean options */ - opt[SHOW].valnum = nbar.show; - opt[NOTIFY_ALL].valnum = nbar.notify_all; - pthread_mutex_unlock(&nbar.mutex); + /* Boolean options */ + opt[SHOW].valnum = nbar.show; + opt[NOTIFY_ALL].valnum = nbar.notify_all; + pthread_mutex_unlock(&nbar.mutex); - opt[DMON].valnum = dmon.enable; - opt[DMON_LOG].valnum = dmon.log; + opt[DMON].valnum = dmon.enable; + opt[DMON_LOG].valnum = dmon.log; - opt[SHOW].valstr[0] = opt[NOTIFY_ALL].valstr[0] = opt[DMON].valstr[0] = - opt[DMON_LOG].valstr[0] = '\0'; + opt[SHOW].valstr[0] = opt[NOTIFY_ALL].valstr[0] = + opt[DMON].valstr[0] = opt[DMON_LOG].valstr[0] = '\0'; - for (i = 0; i < NB_OPT; i++) { - int y; + for (i = 0; i < NB_OPT; i++) { + int y; - y = YORIG + i * YOFF; - print_option(optwin, XORIG, y, opt[i].name, opt[i].valstr, - opt[i].valnum, opt[i].desc, i + 1); - } + y = YORIG + i * YOFF; + print_option(optwin, XORIG, y, opt[i].name, opt[i].valstr, + opt[i].valnum, opt[i].desc, i + 1); + } - return YORIG + NB_OPT * YOFF; + return YORIG + NB_OPT * YOFF; } static void reinit_conf_win(struct scrollwin *win) { - unsigned first_line; - - first_line = win->first_visible_line; - wins_scrollwin_delete(win); - custom_set_swsiz(win); - wins_scrollwin_init(win); - wins_show(win->win.p, win->label); - win->first_visible_line = first_line; + unsigned first_line; + + first_line = win->first_visible_line; + wins_scrollwin_delete(win); + custom_set_swsiz(win); + wins_scrollwin_init(win); + wins_show(win->win.p, win->label); + win->first_visible_line = first_line; } /* Notify-bar configuration. */ void notify_config_bar(void) { - struct scrollwin cwin; - char *buf; - const char *number_str = _("Enter an option number to change its value"); - const char *keys = _("(Press '^P' or '^N' to move up or down, 'Q' to quit)"); - const char *date_str = - _("Enter the date format (see 'man 3 strftime' for possible formats) "); - const char *time_str = - _("Enter the time format (see 'man 3 strftime' for possible formats) "); - const char *count_str = - _ - ("Enter the number of seconds (0 not to be warned before an appointment)"); - const char *cmd_str = _("Enter the notification command "); - int ch; - - clear(); - custom_set_swsiz(&cwin); - cwin.label = _("notification options"); - wins_scrollwin_init(&cwin); - wins_show(cwin.win.p, cwin.label); - status_mesg(number_str, keys); - cwin.total_lines = print_config_options(cwin.pad.p); - wins_scrollwin_display(&cwin); - - buf = mem_malloc(BUFSIZ); - while ((ch = wgetch(win[KEY].p)) != 'q') { - buf[0] = '\0'; - - switch (ch) { - case CTRL('N'): - wins_scrollwin_down(&cwin, 1); - break; - case CTRL('P'): - wins_scrollwin_up(&cwin, 1); - break; - case '1': - pthread_mutex_lock(&nbar.mutex); - nbar.show = !nbar.show; - pthread_mutex_unlock(&nbar.mutex); - if (notify_bar()) - notify_start_main_thread(); - else - notify_stop_main_thread(); - wins_scrollwin_delete(&cwin); - reinit_conf_win(&cwin); - break; - case '2': - status_mesg(date_str, ""); - pthread_mutex_lock(&nbar.mutex); - strncpy(buf, nbar.datefmt, strlen(nbar.datefmt) + 1); - pthread_mutex_unlock(&nbar.mutex); - if (updatestring(win[STA].p, &buf, 0, 1) == 0) { - pthread_mutex_lock(&nbar.mutex); - strncpy(nbar.datefmt, buf, strlen(buf) + 1); - pthread_mutex_unlock(&nbar.mutex); - } - break; - case '3': - status_mesg(time_str, ""); - pthread_mutex_lock(&nbar.mutex); - strncpy(buf, nbar.timefmt, strlen(nbar.timefmt) + 1); - pthread_mutex_unlock(&nbar.mutex); - if (updatestring(win[STA].p, &buf, 0, 1) == 0) { - pthread_mutex_lock(&nbar.mutex); - strncpy(nbar.timefmt, buf, strlen(buf) + 1); - pthread_mutex_unlock(&nbar.mutex); - } - break; - case '4': - status_mesg(count_str, ""); - pthread_mutex_lock(&nbar.mutex); - snprintf(buf, BUFSIZ, "%d", nbar.cntdwn); - pthread_mutex_unlock(&nbar.mutex); - if (updatestring(win[STA].p, &buf, 0, 1) == 0 && - is_all_digit(buf) && atoi(buf) >= 0 && atoi(buf) <= DAYINSEC) { - pthread_mutex_lock(&nbar.mutex); - nbar.cntdwn = atoi(buf); - pthread_mutex_unlock(&nbar.mutex); - } - break; - case '5': - status_mesg(cmd_str, ""); - pthread_mutex_lock(&nbar.mutex); - strncpy(buf, nbar.cmd, strlen(nbar.cmd) + 1); - pthread_mutex_unlock(&nbar.mutex); - if (updatestring(win[STA].p, &buf, 0, 1) == 0) { - pthread_mutex_lock(&nbar.mutex); - strncpy(nbar.cmd, buf, strlen(buf) + 1); - pthread_mutex_unlock(&nbar.mutex); - } - break; - case '6': - pthread_mutex_lock(&nbar.mutex); - nbar.notify_all = !nbar.notify_all; - pthread_mutex_unlock(&nbar.mutex); - notify_check_next_app(1); - break; - case '7': - dmon.enable = !dmon.enable; - break; - case '8': - dmon.log = !dmon.log; - break; - } - - if (resize) { - resize = 0; - wins_get_config(); - wins_reset(); - reinit_conf_win(&cwin); - delwin(win[STA].p); - win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - keypad(win[STA].p, TRUE); - if (notify_bar()) { - notify_reinit_bar(); - notify_update_bar(); - } - clearok(curscr, TRUE); - } - - status_mesg(number_str, keys); - cwin.total_lines = print_config_options(cwin.pad.p); - wins_scrollwin_display(&cwin); - } - mem_free(buf); - wins_scrollwin_delete(&cwin); + struct scrollwin cwin; + char *buf; + const char *number_str = + _("Enter an option number to change its value"); + const char *keys = + _("(Press '^P' or '^N' to move up or down, 'Q' to quit)"); + const char *date_str = + _("Enter the date format (see 'man 3 strftime' for possible formats) "); + const char *time_str = + _("Enter the time format (see 'man 3 strftime' for possible formats) "); + const char *count_str = + _("Enter the number of seconds (0 not to be warned before an appointment)"); + const char *cmd_str = _("Enter the notification command "); + int ch; + + clear(); + custom_set_swsiz(&cwin); + cwin.label = _("notification options"); + wins_scrollwin_init(&cwin); + wins_show(cwin.win.p, cwin.label); + status_mesg(number_str, keys); + cwin.total_lines = print_config_options(cwin.pad.p); + wins_scrollwin_display(&cwin); + + buf = mem_malloc(BUFSIZ); + while ((ch = wgetch(win[KEY].p)) != 'q') { + buf[0] = '\0'; + + switch (ch) { + case CTRL('N'): + wins_scrollwin_down(&cwin, 1); + break; + case CTRL('P'): + wins_scrollwin_up(&cwin, 1); + break; + case '1': + pthread_mutex_lock(&nbar.mutex); + nbar.show = !nbar.show; + pthread_mutex_unlock(&nbar.mutex); + if (notify_bar()) + notify_start_main_thread(); + else + notify_stop_main_thread(); + wins_scrollwin_delete(&cwin); + reinit_conf_win(&cwin); + break; + case '2': + status_mesg(date_str, ""); + pthread_mutex_lock(&nbar.mutex); + strncpy(buf, nbar.datefmt, + strlen(nbar.datefmt) + 1); + pthread_mutex_unlock(&nbar.mutex); + if (updatestring(win[STA].p, &buf, 0, 1) == 0) { + pthread_mutex_lock(&nbar.mutex); + strncpy(nbar.datefmt, buf, + strlen(buf) + 1); + pthread_mutex_unlock(&nbar.mutex); + } + break; + case '3': + status_mesg(time_str, ""); + pthread_mutex_lock(&nbar.mutex); + strncpy(buf, nbar.timefmt, + strlen(nbar.timefmt) + 1); + pthread_mutex_unlock(&nbar.mutex); + if (updatestring(win[STA].p, &buf, 0, 1) == 0) { + pthread_mutex_lock(&nbar.mutex); + strncpy(nbar.timefmt, buf, + strlen(buf) + 1); + pthread_mutex_unlock(&nbar.mutex); + } + break; + case '4': + status_mesg(count_str, ""); + pthread_mutex_lock(&nbar.mutex); + snprintf(buf, BUFSIZ, "%d", nbar.cntdwn); + pthread_mutex_unlock(&nbar.mutex); + if (updatestring(win[STA].p, &buf, 0, 1) == 0 && + is_all_digit(buf) && atoi(buf) >= 0 + && atoi(buf) <= DAYINSEC) { + pthread_mutex_lock(&nbar.mutex); + nbar.cntdwn = atoi(buf); + pthread_mutex_unlock(&nbar.mutex); + } + break; + case '5': + status_mesg(cmd_str, ""); + pthread_mutex_lock(&nbar.mutex); + strncpy(buf, nbar.cmd, strlen(nbar.cmd) + 1); + pthread_mutex_unlock(&nbar.mutex); + if (updatestring(win[STA].p, &buf, 0, 1) == 0) { + pthread_mutex_lock(&nbar.mutex); + strncpy(nbar.cmd, buf, strlen(buf) + 1); + pthread_mutex_unlock(&nbar.mutex); + } + break; + case '6': + pthread_mutex_lock(&nbar.mutex); + nbar.notify_all = !nbar.notify_all; + pthread_mutex_unlock(&nbar.mutex); + notify_check_next_app(1); + break; + case '7': + dmon.enable = !dmon.enable; + break; + case '8': + dmon.log = !dmon.log; + break; + } + + if (resize) { + resize = 0; + wins_get_config(); + wins_reset(); + reinit_conf_win(&cwin); + delwin(win[STA].p); + win[STA].p = + newwin(win[STA].h, win[STA].w, win[STA].y, + win[STA].x); + keypad(win[STA].p, TRUE); + if (notify_bar()) { + notify_reinit_bar(); + notify_update_bar(); + } + clearok(curscr, TRUE); + } + + status_mesg(number_str, keys); + cwin.total_lines = print_config_options(cwin.pad.p); + wins_scrollwin_display(&cwin); + } + mem_free(buf); + wins_scrollwin_delete(&cwin); } @@ -56,55 +56,60 @@ typedef void (*cb_dump_t) (FILE *, long, long, char *); */ static void foreach_date_dump(const long date_end, struct rpt *rpt, llist_t * exc, - long item_first_date, long item_dur, char *item_mesg, - cb_dump_t cb_dump, FILE * stream) + long item_first_date, long item_dur, char *item_mesg, + cb_dump_t cb_dump, FILE * stream) { - long date, item_time; - struct tm lt; - time_t t; + long date, item_time; + struct tm lt; + time_t t; - t = item_first_date; - localtime_r(&t, <); - lt.tm_hour = lt.tm_min = lt.tm_sec = 0; - lt.tm_isdst = -1; - date = mktime(<); - item_time = item_first_date - date; + t = item_first_date; + localtime_r(&t, <); + lt.tm_hour = lt.tm_min = lt.tm_sec = 0; + lt.tm_isdst = -1; + date = mktime(<); + item_time = item_first_date - date; - while (date <= date_end && date <= rpt->until) { - if (recur_item_inday(item_first_date, item_dur, exc, rpt->type, - rpt->freq, rpt->until, date)) { - (*cb_dump) (stream, date + item_time, item_dur, item_mesg); - } - switch (rpt->type) { - case RECUR_DAILY: - date = date_sec_change(date, 0, rpt->freq); - break; - case RECUR_WEEKLY: - date = date_sec_change(date, 0, rpt->freq * WEEKINDAYS); - break; - case RECUR_MONTHLY: - date = date_sec_change(date, rpt->freq, 0); - break; - case RECUR_YEARLY: - date = date_sec_change(date, rpt->freq * 12, 0); - break; - default: - EXIT(_("incoherent repetition type")); - /* NOTREACHED */ - break; - } - } + while (date <= date_end && date <= rpt->until) { + if (recur_item_inday + (item_first_date, item_dur, exc, rpt->type, rpt->freq, + rpt->until, date)) { + (*cb_dump) (stream, date + item_time, item_dur, + item_mesg); + } + switch (rpt->type) { + case RECUR_DAILY: + date = date_sec_change(date, 0, rpt->freq); + break; + case RECUR_WEEKLY: + date = + date_sec_change(date, 0, + rpt->freq * WEEKINDAYS); + break; + case RECUR_MONTHLY: + date = date_sec_change(date, rpt->freq, 0); + break; + case RECUR_YEARLY: + date = date_sec_change(date, rpt->freq * 12, 0); + break; + default: + EXIT(_("incoherent repetition type")); + /* NOTREACHED */ + break; + } + } } static void pcal_export_header(FILE * stream) { - fputs("# calcurse pcal export\n", stream); - fputs("\n# =======\n# options\n# =======\n", stream); - fprintf(stream, "opt -A -K -l -m -F %s\n", - ui_calendar_week_begins_on_monday()? "Monday" : "Sunday"); - fputs("# Display week number (i.e. 1-52) on every Monday\n", stream); - fprintf(stream, "all monday in all week %%w\n"); - fputc('\n', stream); + fputs("# calcurse pcal export\n", stream); + fputs("\n# =======\n# options\n# =======\n", stream); + fprintf(stream, "opt -A -K -l -m -F %s\n", + ui_calendar_week_begins_on_monday()? "Monday" : "Sunday"); + fputs("# Display week number (i.e. 1-52) on every Monday\n", + stream); + fprintf(stream, "all monday in all week %%w\n"); + fputc('\n', stream); } static void pcal_export_footer(FILE * stream) @@ -114,178 +119,215 @@ static void pcal_export_footer(FILE * stream) /* Format and dump event data to a pcal formatted file. */ static void pcal_dump_event(FILE * stream, long event_date, long event_dur, - char *event_mesg) + char *event_mesg) { - char pcal_date[BUFSIZ]; + char pcal_date[BUFSIZ]; - date_sec2date_fmt(event_date, "%b %d", pcal_date); - fprintf(stream, "%s %s\n", pcal_date, event_mesg); + date_sec2date_fmt(event_date, "%b %d", pcal_date); + fprintf(stream, "%s %s\n", pcal_date, event_mesg); } /* Format and dump appointment data to a pcal formatted file. */ static void pcal_dump_apoint(FILE * stream, long apoint_date, long apoint_dur, - char *apoint_mesg) + char *apoint_mesg) { - char pcal_date[BUFSIZ], pcal_beg[BUFSIZ], pcal_end[BUFSIZ]; + char pcal_date[BUFSIZ], pcal_beg[BUFSIZ], pcal_end[BUFSIZ]; - date_sec2date_fmt(apoint_date, "%b %d", pcal_date); - date_sec2date_fmt(apoint_date, "%R", pcal_beg); - date_sec2date_fmt(apoint_date + apoint_dur, "%R", pcal_end); - fprintf(stream, "%s ", pcal_date); - fprintf(stream, "(%s -> %s) %s\n", pcal_beg, pcal_end, apoint_mesg); + date_sec2date_fmt(apoint_date, "%b %d", pcal_date); + date_sec2date_fmt(apoint_date, "%R", pcal_beg); + date_sec2date_fmt(apoint_date + apoint_dur, "%R", pcal_end); + fprintf(stream, "%s ", pcal_date); + fprintf(stream, "(%s -> %s) %s\n", pcal_beg, pcal_end, + apoint_mesg); } static void pcal_export_recur_events(FILE * stream) { - llist_item_t *i; - char pcal_date[BUFSIZ]; + llist_item_t *i; + char pcal_date[BUFSIZ]; - fputs("\n# =============", stream); - fputs("\n# Recur. Events", stream); - fputs("\n# =============\n", stream); - fputs("# (pcal does not support from..until dates specification\n", stream); + fputs("\n# =============", stream); + fputs("\n# Recur. Events", stream); + fputs("\n# =============\n", stream); + fputs("# (pcal does not support from..until dates specification\n", + stream); - LLIST_FOREACH(&recur_elist, i) { - struct recur_event *rev = LLIST_GET_DATA(i); - if (rev->rpt->until == 0 && rev->rpt->freq == 1) { - switch (rev->rpt->type) { - case RECUR_DAILY: - date_sec2date_fmt(rev->day, "%b %d", pcal_date); - fprintf(stream, "all day on_or_after %s %s\n", pcal_date, rev->mesg); - break; - case RECUR_WEEKLY: - date_sec2date_fmt(rev->day, "%a", pcal_date); - fprintf(stream, "all %s on_or_after ", pcal_date); - date_sec2date_fmt(rev->day, "%b %d", pcal_date); - fprintf(stream, "%s %s\n", pcal_date, rev->mesg); - break; - case RECUR_MONTHLY: - date_sec2date_fmt(rev->day, "%d", pcal_date); - fprintf(stream, "day on all %s %s\n", pcal_date, rev->mesg); - break; - case RECUR_YEARLY: - date_sec2date_fmt(rev->day, "%b %d", pcal_date); - fprintf(stream, "%s %s\n", pcal_date, rev->mesg); - break; - default: - EXIT(_("incoherent repetition type")); - } - } else { - const long YEAR_START = ui_calendar_start_of_year(); - const long YEAR_END = ui_calendar_end_of_year(); + LLIST_FOREACH(&recur_elist, i) { + struct recur_event *rev = LLIST_GET_DATA(i); + if (rev->rpt->until == 0 && rev->rpt->freq == 1) { + switch (rev->rpt->type) { + case RECUR_DAILY: + date_sec2date_fmt(rev->day, "%b %d", + pcal_date); + fprintf(stream, + "all day on_or_after %s %s\n", + pcal_date, rev->mesg); + break; + case RECUR_WEEKLY: + date_sec2date_fmt(rev->day, "%a", + pcal_date); + fprintf(stream, "all %s on_or_after ", + pcal_date); + date_sec2date_fmt(rev->day, "%b %d", + pcal_date); + fprintf(stream, "%s %s\n", pcal_date, + rev->mesg); + break; + case RECUR_MONTHLY: + date_sec2date_fmt(rev->day, "%d", + pcal_date); + fprintf(stream, "day on all %s %s\n", + pcal_date, rev->mesg); + break; + case RECUR_YEARLY: + date_sec2date_fmt(rev->day, "%b %d", + pcal_date); + fprintf(stream, "%s %s\n", pcal_date, + rev->mesg); + break; + default: + EXIT(_("incoherent repetition type")); + } + } else { + const long YEAR_START = + ui_calendar_start_of_year(); + const long YEAR_END = ui_calendar_end_of_year(); - if (rev->day < YEAR_END && rev->day > YEAR_START) - foreach_date_dump(YEAR_END, rev->rpt, &rev->exc, rev->day, 0, - rev->mesg, (cb_dump_t) pcal_dump_event, stream); - } - } + if (rev->day < YEAR_END && rev->day > YEAR_START) + foreach_date_dump(YEAR_END, rev->rpt, + &rev->exc, rev->day, 0, + rev->mesg, + (cb_dump_t) + pcal_dump_event, stream); + } + } } static void pcal_export_events(FILE * stream) { - llist_item_t *i; + llist_item_t *i; - fputs("\n# ======\n# Events\n# ======\n", stream); - LLIST_FOREACH(&eventlist, i) { - struct event *ev = LLIST_TS_GET_DATA(i); - pcal_dump_event(stream, ev->day, 0, ev->mesg); - } - fputc('\n', stream); + fputs("\n# ======\n# Events\n# ======\n", stream); + LLIST_FOREACH(&eventlist, i) { + struct event *ev = LLIST_TS_GET_DATA(i); + pcal_dump_event(stream, ev->day, 0, ev->mesg); + } + fputc('\n', stream); } static void pcal_export_recur_apoints(FILE * stream) { - llist_item_t *i; - char pcal_date[BUFSIZ], pcal_beg[BUFSIZ], pcal_end[BUFSIZ]; + llist_item_t *i; + char pcal_date[BUFSIZ], pcal_beg[BUFSIZ], pcal_end[BUFSIZ]; - fputs("\n# ==============", stream); - fputs("\n# Recur. Apoints", stream); - fputs("\n# ==============\n", stream); - fputs("# (pcal does not support from..until dates specification\n", stream); + fputs("\n# ==============", stream); + fputs("\n# Recur. Apoints", stream); + fputs("\n# ==============\n", stream); + fputs("# (pcal does not support from..until dates specification\n", + stream); - LLIST_TS_FOREACH(&recur_alist_p, i) { - struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); + LLIST_TS_FOREACH(&recur_alist_p, i) { + struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); - if (rapt->rpt->until == 0 && rapt->rpt->freq == 1) { - date_sec2date_fmt(rapt->start, "%R", pcal_beg); - date_sec2date_fmt(rapt->start + rapt->dur, "%R", pcal_end); - switch (rapt->rpt->type) { - case RECUR_DAILY: - date_sec2date_fmt(rapt->start, "%b %d", pcal_date); - fprintf(stream, "all day on_or_after %s (%s -> %s) %s\n", - pcal_date, pcal_beg, pcal_end, rapt->mesg); - break; - case RECUR_WEEKLY: - date_sec2date_fmt(rapt->start, "%a", pcal_date); - fprintf(stream, "all %s on_or_after ", pcal_date); - date_sec2date_fmt(rapt->start, "%b %d", pcal_date); - fprintf(stream, "%s (%s -> %s) %s\n", pcal_date, pcal_beg, - pcal_end, rapt->mesg); - break; - case RECUR_MONTHLY: - date_sec2date_fmt(rapt->start, "%d", pcal_date); - fprintf(stream, "day on all %s (%s -> %s) %s\n", pcal_date, - pcal_beg, pcal_end, rapt->mesg); - break; - case RECUR_YEARLY: - date_sec2date_fmt(rapt->start, "%b %d", pcal_date); - fprintf(stream, "%s (%s -> %s) %s\n", pcal_date, pcal_beg, - pcal_end, rapt->mesg); - break; - default: - EXIT(_("incoherent repetition type")); - } - } else { - const long YEAR_START = ui_calendar_start_of_year(); - const long YEAR_END = ui_calendar_end_of_year(); + if (rapt->rpt->until == 0 && rapt->rpt->freq == 1) { + date_sec2date_fmt(rapt->start, "%R", pcal_beg); + date_sec2date_fmt(rapt->start + rapt->dur, "%R", + pcal_end); + switch (rapt->rpt->type) { + case RECUR_DAILY: + date_sec2date_fmt(rapt->start, "%b %d", + pcal_date); + fprintf(stream, + "all day on_or_after %s (%s -> %s) %s\n", + pcal_date, pcal_beg, pcal_end, + rapt->mesg); + break; + case RECUR_WEEKLY: + date_sec2date_fmt(rapt->start, "%a", + pcal_date); + fprintf(stream, "all %s on_or_after ", + pcal_date); + date_sec2date_fmt(rapt->start, "%b %d", + pcal_date); + fprintf(stream, "%s (%s -> %s) %s\n", + pcal_date, pcal_beg, pcal_end, + rapt->mesg); + break; + case RECUR_MONTHLY: + date_sec2date_fmt(rapt->start, "%d", + pcal_date); + fprintf(stream, + "day on all %s (%s -> %s) %s\n", + pcal_date, pcal_beg, pcal_end, + rapt->mesg); + break; + case RECUR_YEARLY: + date_sec2date_fmt(rapt->start, "%b %d", + pcal_date); + fprintf(stream, "%s (%s -> %s) %s\n", + pcal_date, pcal_beg, pcal_end, + rapt->mesg); + break; + default: + EXIT(_("incoherent repetition type")); + } + } else { + const long YEAR_START = + ui_calendar_start_of_year(); + const long YEAR_END = ui_calendar_end_of_year(); - if (rapt->start < YEAR_END && rapt->start > YEAR_START) - foreach_date_dump(YEAR_END, rapt->rpt, &rapt->exc, rapt->start, - rapt->dur, rapt->mesg, - (cb_dump_t) pcal_dump_apoint, stream); - } - } + if (rapt->start < YEAR_END + && rapt->start > YEAR_START) + foreach_date_dump(YEAR_END, rapt->rpt, + &rapt->exc, rapt->start, + rapt->dur, rapt->mesg, + (cb_dump_t) + pcal_dump_apoint, + stream); + } + } } static void pcal_export_apoints(FILE * stream) { - llist_item_t *i; + llist_item_t *i; - fputs("\n# ============\n# Appointments\n# ============\n", stream); - LLIST_TS_LOCK(&alist_p); - LLIST_TS_FOREACH(&alist_p, i) { - struct apoint *apt = LLIST_TS_GET_DATA(i); - pcal_dump_apoint(stream, apt->start, apt->dur, apt->mesg); - } - LLIST_TS_UNLOCK(&alist_p); - fputc('\n', stream); + fputs("\n# ============\n# Appointments\n# ============\n", + stream); + LLIST_TS_LOCK(&alist_p); + LLIST_TS_FOREACH(&alist_p, i) { + struct apoint *apt = LLIST_TS_GET_DATA(i); + pcal_dump_apoint(stream, apt->start, apt->dur, apt->mesg); + } + LLIST_TS_UNLOCK(&alist_p); + fputc('\n', stream); } static void pcal_export_todo(FILE * stream) { - llist_item_t *i; + llist_item_t *i; - fputs("#\n# Todos\n#\n", stream); - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_TS_GET_DATA(i); - if (todo->id < 0) /* completed items */ - continue; + fputs("#\n# Todos\n#\n", stream); + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_TS_GET_DATA(i); + if (todo->id < 0) /* completed items */ + continue; - fputs("note all ", stream); - fprintf(stream, "%d. %s\n", todo->id, todo->mesg); - } - fputc('\n', stream); + fputs("note all ", stream); + fprintf(stream, "%d. %s\n", todo->id, todo->mesg); + } + fputc('\n', stream); } /* Export calcurse data. */ void pcal_export_data(FILE * stream) { - pcal_export_header(stream); - pcal_export_recur_events(stream); - pcal_export_events(stream); - pcal_export_recur_apoints(stream); - pcal_export_apoints(stream); - pcal_export_todo(stream); - pcal_export_footer(stream); + pcal_export_header(stream); + pcal_export_recur_events(stream); + pcal_export_events(stream); + pcal_export_recur_apoints(stream); + pcal_export_apoints(stream); + pcal_export_todo(stream); + pcal_export_footer(stream); } diff --git a/src/recur.c b/src/recur.c index 8a2f79f..9ac0363 100644 --- a/src/recur.c +++ b/src/recur.c @@ -47,198 +47,202 @@ llist_t recur_elist; static void free_exc(struct excp *exc) { - mem_free(exc); + mem_free(exc); } static void free_exc_list(llist_t * exc) { - LLIST_FREE_INNER(exc, free_exc); - LLIST_FREE(exc); + LLIST_FREE_INNER(exc, free_exc); + LLIST_FREE(exc); } static int exc_cmp_day(struct excp *a, struct excp *b) { - return a->st < b->st ? -1 : (a->st == b->st ? 0 : 1); + return a->st < b->st ? -1 : (a->st == b->st ? 0 : 1); } static void recur_add_exc(llist_t * exc, long day) { - struct excp *o = mem_malloc(sizeof(struct excp)); - o->st = day; + struct excp *o = mem_malloc(sizeof(struct excp)); + o->st = day; - LLIST_ADD_SORTED(exc, o, exc_cmp_day); + LLIST_ADD_SORTED(exc, o, exc_cmp_day); } static void exc_dup(llist_t * in, llist_t * exc) { - llist_item_t *i; + llist_item_t *i; - LLIST_INIT(in); + LLIST_INIT(in); - if (exc) { - LLIST_FOREACH(exc, i) { - struct excp *p = LLIST_GET_DATA(i); - recur_add_exc(in, p->st); - } - } + if (exc) { + LLIST_FOREACH(exc, i) { + struct excp *p = LLIST_GET_DATA(i); + recur_add_exc(in, p->st); + } + } } struct recur_event *recur_event_dup(struct recur_event *in) { - EXIT_IF(!in, _("null pointer")); + EXIT_IF(!in, _("null pointer")); - struct recur_event *rev = mem_malloc(sizeof(struct recur_event)); + struct recur_event *rev = mem_malloc(sizeof(struct recur_event)); - rev->id = in->id; - rev->day = in->day; - rev->mesg = mem_strdup(in->mesg); + rev->id = in->id; + rev->day = in->day; + rev->mesg = mem_strdup(in->mesg); - rev->rpt = mem_malloc(sizeof(struct rpt)); - rev->rpt->type = in->rpt->type; - rev->rpt->freq = in->rpt->freq; - rev->rpt->until = in->rpt->until; + rev->rpt = mem_malloc(sizeof(struct rpt)); + rev->rpt->type = in->rpt->type; + rev->rpt->freq = in->rpt->freq; + rev->rpt->until = in->rpt->until; - exc_dup(&rev->exc, &in->exc); + exc_dup(&rev->exc, &in->exc); - if (in->note) - rev->note = mem_strdup(in->note); - else - rev->note = NULL; + if (in->note) + rev->note = mem_strdup(in->note); + else + rev->note = NULL; - return rev; + return rev; } struct recur_apoint *recur_apoint_dup(struct recur_apoint *in) { - EXIT_IF(!in, _("null pointer")); + EXIT_IF(!in, _("null pointer")); - struct recur_apoint *rapt = mem_malloc(sizeof(struct recur_apoint)); + struct recur_apoint *rapt = + mem_malloc(sizeof(struct recur_apoint)); - rapt->start = in->start; - rapt->dur = in->dur; - rapt->state = in->state; - rapt->mesg = mem_strdup(in->mesg); + rapt->start = in->start; + rapt->dur = in->dur; + rapt->state = in->state; + rapt->mesg = mem_strdup(in->mesg); - rapt->rpt = mem_malloc(sizeof(struct rpt)); - rapt->rpt->type = in->rpt->type; - rapt->rpt->freq = in->rpt->freq; - rapt->rpt->until = in->rpt->until; + rapt->rpt = mem_malloc(sizeof(struct rpt)); + rapt->rpt->type = in->rpt->type; + rapt->rpt->freq = in->rpt->freq; + rapt->rpt->until = in->rpt->until; - exc_dup(&rapt->exc, &in->exc); + exc_dup(&rapt->exc, &in->exc); - if (in->note) - rapt->note = mem_strdup(in->note); - else - rapt->note = NULL; + if (in->note) + rapt->note = mem_strdup(in->note); + else + rapt->note = NULL; - return rapt; + return rapt; } void recur_apoint_llist_init(void) { - LLIST_TS_INIT(&recur_alist_p); + LLIST_TS_INIT(&recur_alist_p); } void recur_apoint_free(struct recur_apoint *rapt) { - mem_free(rapt->mesg); - if (rapt->note) - mem_free(rapt->note); - if (rapt->rpt) - mem_free(rapt->rpt); - free_exc_list(&rapt->exc); - mem_free(rapt); + mem_free(rapt->mesg); + if (rapt->note) + mem_free(rapt->note); + if (rapt->rpt) + mem_free(rapt->rpt); + free_exc_list(&rapt->exc); + mem_free(rapt); } void recur_event_free(struct recur_event *rev) { - mem_free(rev->mesg); - if (rev->note) - mem_free(rev->note); - if (rev->rpt) - mem_free(rev->rpt); - free_exc_list(&rev->exc); - mem_free(rev); + mem_free(rev->mesg); + if (rev->note) + mem_free(rev->note); + if (rev->rpt) + mem_free(rev->rpt); + free_exc_list(&rev->exc); + mem_free(rev); } void recur_apoint_llist_free(void) { - LLIST_TS_FREE_INNER(&recur_alist_p, recur_apoint_free); - LLIST_TS_FREE(&recur_alist_p); + LLIST_TS_FREE_INNER(&recur_alist_p, recur_apoint_free); + LLIST_TS_FREE(&recur_alist_p); } void recur_event_llist_free(void) { - LLIST_FREE_INNER(&recur_elist, recur_event_free); - LLIST_FREE(&recur_elist); + LLIST_FREE_INNER(&recur_elist, recur_event_free); + LLIST_FREE(&recur_elist); } static int recur_apoint_cmp_start(struct recur_apoint *a, struct recur_apoint *b) { - return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1); + return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1); } -static int recur_event_cmp_day(struct recur_event *a, struct recur_event *b) +static int recur_event_cmp_day(struct recur_event *a, + struct recur_event *b) { - return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1); + return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1); } /* Insert a new recursive appointment in the general linked list */ struct recur_apoint *recur_apoint_new(char *mesg, char *note, long start, - long dur, char state, int type, int freq, - long until, llist_t * except) -{ - struct recur_apoint *rapt = mem_malloc(sizeof(struct recur_apoint)); - - rapt->rpt = mem_malloc(sizeof(struct rpt)); - rapt->mesg = mem_strdup(mesg); - rapt->note = (note != NULL) ? mem_strdup(note) : 0; - rapt->start = start; - rapt->state = state; - rapt->dur = dur; - rapt->rpt->type = type; - rapt->rpt->freq = freq; - rapt->rpt->until = until; - if (except) { - exc_dup(&rapt->exc, except); - free_exc_list(except); - } else { - LLIST_INIT(&rapt->exc); - } - - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_ADD_SORTED(&recur_alist_p, rapt, recur_apoint_cmp_start); - LLIST_TS_UNLOCK(&recur_alist_p); - - return rapt; + long dur, char state, int type, + int freq, long until, + llist_t * except) +{ + struct recur_apoint *rapt = + mem_malloc(sizeof(struct recur_apoint)); + + rapt->rpt = mem_malloc(sizeof(struct rpt)); + rapt->mesg = mem_strdup(mesg); + rapt->note = (note != NULL) ? mem_strdup(note) : 0; + rapt->start = start; + rapt->state = state; + rapt->dur = dur; + rapt->rpt->type = type; + rapt->rpt->freq = freq; + rapt->rpt->until = until; + if (except) { + exc_dup(&rapt->exc, except); + free_exc_list(except); + } else { + LLIST_INIT(&rapt->exc); + } + + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_ADD_SORTED(&recur_alist_p, rapt, recur_apoint_cmp_start); + LLIST_TS_UNLOCK(&recur_alist_p); + + return rapt; } /* Insert a new recursive event in the general linked list */ -struct recur_event *recur_event_new(char *mesg, char *note, long day, int id, - int type, int freq, long until, - llist_t * except) +struct recur_event *recur_event_new(char *mesg, char *note, long day, + int id, int type, int freq, long until, + llist_t * except) { - struct recur_event *rev = mem_malloc(sizeof(struct recur_event)); + struct recur_event *rev = mem_malloc(sizeof(struct recur_event)); - rev->rpt = mem_malloc(sizeof(struct rpt)); - rev->mesg = mem_strdup(mesg); - rev->note = (note != NULL) ? mem_strdup(note) : 0; - rev->day = day; - rev->id = id; - rev->rpt->type = type; - rev->rpt->freq = freq; - rev->rpt->until = until; - if (except) { - exc_dup(&rev->exc, except); - free_exc_list(except); - } else { - LLIST_INIT(&rev->exc); - } + rev->rpt = mem_malloc(sizeof(struct rpt)); + rev->mesg = mem_strdup(mesg); + rev->note = (note != NULL) ? mem_strdup(note) : 0; + rev->day = day; + rev->id = id; + rev->rpt->type = type; + rev->rpt->freq = freq; + rev->rpt->until = until; + if (except) { + exc_dup(&rev->exc, except); + free_exc_list(except); + } else { + LLIST_INIT(&rev->exc); + } - LLIST_ADD_SORTED(&recur_elist, rev, recur_event_cmp_day); + LLIST_ADD_SORTED(&recur_elist, rev, recur_event_cmp_day); - return rev; + return rev; } /* @@ -247,27 +251,27 @@ struct recur_event *recur_event_new(char *mesg, char *note, long day, int id, */ char recur_def2char(enum recur_type define) { - char recur_char; - - switch (define) { - case RECUR_DAILY: - recur_char = 'D'; - break; - case RECUR_WEEKLY: - recur_char = 'W'; - break; - case RECUR_MONTHLY: - recur_char = 'M'; - break; - case RECUR_YEARLY: - recur_char = 'Y'; - break; - default: - EXIT(_("unknown repetition type")); - return 0; - } - - return recur_char; + char recur_char; + + switch (define) { + case RECUR_DAILY: + recur_char = 'D'; + break; + case RECUR_WEEKLY: + recur_char = 'W'; + break; + case RECUR_MONTHLY: + recur_char = 'M'; + break; + case RECUR_YEARLY: + recur_char = 'Y'; + break; + default: + EXIT(_("unknown repetition type")); + return 0; + } + + return recur_char; } /* @@ -276,225 +280,230 @@ char recur_def2char(enum recur_type define) */ int recur_char2def(char type) { - int recur_def; - - switch (type) { - case 'D': - recur_def = RECUR_DAILY; - break; - case 'W': - recur_def = RECUR_WEEKLY; - break; - case 'M': - recur_def = RECUR_MONTHLY; - break; - case 'Y': - recur_def = RECUR_YEARLY; - break; - default: - EXIT(_("unknown character")); - return 0; - } - return recur_def; + int recur_def; + + switch (type) { + case 'D': + recur_def = RECUR_DAILY; + break; + case 'W': + recur_def = RECUR_WEEKLY; + break; + case 'M': + recur_def = RECUR_MONTHLY; + break; + case 'Y': + recur_def = RECUR_YEARLY; + break; + default: + EXIT(_("unknown character")); + return 0; + } + return recur_def; } /* Write days for which recurrent items should not be repeated. */ static void recur_write_exc(llist_t * lexc, FILE * f) { - llist_item_t *i; - struct tm lt; - time_t t; - int st_mon, st_day, st_year; + llist_item_t *i; + struct tm lt; + time_t t; + int st_mon, st_day, st_year; - LLIST_FOREACH(lexc, i) { - struct excp *exc = LLIST_GET_DATA(i); - t = exc->st; - localtime_r(&t, <); - st_mon = lt.tm_mon + 1; - st_day = lt.tm_mday; - st_year = lt.tm_year + 1900; - fprintf(f, " !%02u/%02u/%04u", st_mon, st_day, st_year); - } + LLIST_FOREACH(lexc, i) { + struct excp *exc = LLIST_GET_DATA(i); + t = exc->st; + localtime_r(&t, <); + st_mon = lt.tm_mon + 1; + st_day = lt.tm_mday; + st_year = lt.tm_year + 1900; + fprintf(f, " !%02u/%02u/%04u", st_mon, st_day, st_year); + } } /* Load the recursive appointment description */ -struct recur_apoint *recur_apoint_scan(FILE * f, struct tm start, struct tm end, - char type, int freq, struct tm until, - char *note, llist_t * exc, char state) -{ - char buf[BUFSIZ], *nl; - time_t tstart, tend, tuntil; - - EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || - !check_date(end.tm_year, end.tm_mon, end.tm_mday) || - !check_time(start.tm_hour, start.tm_min) || - !check_time(end.tm_hour, end.tm_min) || - (until.tm_year != 0 && !check_date(until.tm_year, until.tm_mon, - until.tm_mday)), - _("date error in appointment")); - - /* Read the appointment description */ - if (!fgets(buf, sizeof buf, f)) - return NULL; - - nl = strchr(buf, '\n'); - if (nl) { - *nl = '\0'; - } - start.tm_sec = end.tm_sec = 0; - start.tm_isdst = end.tm_isdst = -1; - start.tm_year -= 1900; - start.tm_mon--; - end.tm_year -= 1900; - end.tm_mon--; - tstart = mktime(&start); - tend = mktime(&end); - - if (until.tm_year != 0) { - until.tm_hour = 23; - until.tm_min = 59; - until.tm_sec = 0; - until.tm_isdst = -1; - until.tm_year -= 1900; - until.tm_mon--; - tuntil = mktime(&until); - } else { - tuntil = 0; - } - EXIT_IF(tstart == -1 || tend == -1 || tstart > tend || tuntil == -1, - _("date error in appointment")); - - return recur_apoint_new(buf, note, tstart, tend - tstart, state, - recur_char2def(type), freq, tuntil, exc); +struct recur_apoint *recur_apoint_scan(FILE * f, struct tm start, + struct tm end, char type, int freq, + struct tm until, char *note, + llist_t * exc, char state) +{ + char buf[BUFSIZ], *nl; + time_t tstart, tend, tuntil; + + EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || + !check_date(end.tm_year, end.tm_mon, end.tm_mday) || + !check_time(start.tm_hour, start.tm_min) || + !check_time(end.tm_hour, end.tm_min) || + (until.tm_year != 0 + && !check_date(until.tm_year, until.tm_mon, + until.tm_mday)), + _("date error in appointment")); + + /* Read the appointment description */ + if (!fgets(buf, sizeof buf, f)) + return NULL; + + nl = strchr(buf, '\n'); + if (nl) { + *nl = '\0'; + } + start.tm_sec = end.tm_sec = 0; + start.tm_isdst = end.tm_isdst = -1; + start.tm_year -= 1900; + start.tm_mon--; + end.tm_year -= 1900; + end.tm_mon--; + tstart = mktime(&start); + tend = mktime(&end); + + if (until.tm_year != 0) { + until.tm_hour = 23; + until.tm_min = 59; + until.tm_sec = 0; + until.tm_isdst = -1; + until.tm_year -= 1900; + until.tm_mon--; + tuntil = mktime(&until); + } else { + tuntil = 0; + } + EXIT_IF(tstart == -1 || tend == -1 || tstart > tend + || tuntil == -1, _("date error in appointment")); + + return recur_apoint_new(buf, note, tstart, tend - tstart, state, + recur_char2def(type), freq, tuntil, exc); } /* Load the recursive events from file */ struct recur_event *recur_event_scan(FILE * f, struct tm start, int id, - char type, int freq, struct tm until, - char *note, llist_t * exc) -{ - char buf[BUFSIZ], *nl; - time_t tstart, tuntil; - - EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || - !check_time(start.tm_hour, start.tm_min) || - (until.tm_year != 0 && !check_date(until.tm_year, until.tm_mon, - until.tm_mday)), - _("date error in event")); - - /* Read the event description */ - if (!fgets(buf, sizeof buf, f)) - return NULL; - - nl = strchr(buf, '\n'); - if (nl) { - *nl = '\0'; - } - start.tm_hour = until.tm_hour = 0; - start.tm_min = until.tm_min = 0; - start.tm_sec = until.tm_sec = 0; - start.tm_isdst = until.tm_isdst = -1; - start.tm_year -= 1900; - start.tm_mon--; - if (until.tm_year != 0) { - until.tm_year -= 1900; - until.tm_mon--; - tuntil = mktime(&until); - } else { - tuntil = 0; - } - tstart = mktime(&start); - EXIT_IF(tstart == -1 || tuntil == -1, _("date error in event")); - - return recur_event_new(buf, note, tstart, id, recur_char2def(type), freq, - tuntil, exc); + char type, int freq, struct tm until, + char *note, llist_t * exc) +{ + char buf[BUFSIZ], *nl; + time_t tstart, tuntil; + + EXIT_IF(!check_date(start.tm_year, start.tm_mon, start.tm_mday) || + !check_time(start.tm_hour, start.tm_min) || + (until.tm_year != 0 + && !check_date(until.tm_year, until.tm_mon, + until.tm_mday)), _("date error in event")); + + /* Read the event description */ + if (!fgets(buf, sizeof buf, f)) + return NULL; + + nl = strchr(buf, '\n'); + if (nl) { + *nl = '\0'; + } + start.tm_hour = until.tm_hour = 0; + start.tm_min = until.tm_min = 0; + start.tm_sec = until.tm_sec = 0; + start.tm_isdst = until.tm_isdst = -1; + start.tm_year -= 1900; + start.tm_mon--; + if (until.tm_year != 0) { + until.tm_year -= 1900; + until.tm_mon--; + tuntil = mktime(&until); + } else { + tuntil = 0; + } + tstart = mktime(&start); + EXIT_IF(tstart == -1 || tuntil == -1, _("date error in event")); + + return recur_event_new(buf, note, tstart, id, recur_char2def(type), + freq, tuntil, exc); } /* Writting of a recursive appointment into file. */ void recur_apoint_write(struct recur_apoint *o, FILE * f) { - struct tm lt; - time_t t; - - t = o->start; - localtime_r(&t, <); - fprintf(f, "%02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, lt.tm_mday, - 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); - - t = o->start + o->dur; - localtime_r(&t, <); - fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, lt.tm_mday, - 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); - - t = o->rpt->until; - if (t == 0) { /* We have an endless recurrent appointment. */ - fprintf(f, " {%d%c", o->rpt->freq, recur_def2char(o->rpt->type)); - } else { - localtime_r(&t, <); - fprintf(f, " {%d%c -> %02u/%02u/%04u", o->rpt->freq, - recur_def2char(o->rpt->type), lt.tm_mon + 1, lt.tm_mday, - 1900 + lt.tm_year); - } - recur_write_exc(&o->exc, f); - fputs("} ", f); - if (o->note != NULL) - fprintf(f, ">%s ", o->note); - if (o->state & APOINT_NOTIFY) - fputc('!', f); - else - fputc('|', f); - fprintf(f, "%s\n", o->mesg); + struct tm lt; + time_t t; + + t = o->start; + localtime_r(&t, <); + fprintf(f, "%02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, lt.tm_mday, + 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); + + t = o->start + o->dur; + localtime_r(&t, <); + fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, + lt.tm_mday, 1900 + lt.tm_year, lt.tm_hour, lt.tm_min); + + t = o->rpt->until; + if (t == 0) { /* We have an endless recurrent appointment. */ + fprintf(f, " {%d%c", o->rpt->freq, + recur_def2char(o->rpt->type)); + } else { + localtime_r(&t, <); + fprintf(f, " {%d%c -> %02u/%02u/%04u", o->rpt->freq, + recur_def2char(o->rpt->type), lt.tm_mon + 1, + lt.tm_mday, 1900 + lt.tm_year); + } + recur_write_exc(&o->exc, f); + fputs("} ", f); + if (o->note != NULL) + fprintf(f, ">%s ", o->note); + if (o->state & APOINT_NOTIFY) + fputc('!', f); + else + fputc('|', f); + fprintf(f, "%s\n", o->mesg); } /* Writting of a recursive event into file. */ void recur_event_write(struct recur_event *o, FILE * f) { - struct tm lt; - time_t t; - int st_mon, st_day, st_year; - int end_mon, end_day, end_year; - - t = o->day; - localtime_r(&t, <); - st_mon = lt.tm_mon + 1; - st_day = lt.tm_mday; - st_year = lt.tm_year + 1900; - t = o->rpt->until; - if (t == 0) { /* We have an endless recurrent event. */ - fprintf(f, "%02u/%02u/%04u [%d] {%d%c", st_mon, st_day, st_year, o->id, - o->rpt->freq, recur_def2char(o->rpt->type)); - } else { - localtime_r(&t, <); - end_mon = lt.tm_mon + 1; - end_day = lt.tm_mday; - end_year = lt.tm_year + 1900; - fprintf(f, "%02u/%02u/%04u [%d] {%d%c -> %02u/%02u/%04u", st_mon, - st_day, st_year, o->id, o->rpt->freq, - recur_def2char(o->rpt->type), end_mon, end_day, end_year); - } - recur_write_exc(&o->exc, f); - fputs("} ", f); - if (o->note != NULL) - fprintf(f, ">%s ", o->note); - fprintf(f, "%s\n", o->mesg); + struct tm lt; + time_t t; + int st_mon, st_day, st_year; + int end_mon, end_day, end_year; + + t = o->day; + localtime_r(&t, <); + st_mon = lt.tm_mon + 1; + st_day = lt.tm_mday; + st_year = lt.tm_year + 1900; + t = o->rpt->until; + if (t == 0) { /* We have an endless recurrent event. */ + fprintf(f, "%02u/%02u/%04u [%d] {%d%c", st_mon, st_day, + st_year, o->id, o->rpt->freq, + recur_def2char(o->rpt->type)); + } else { + localtime_r(&t, <); + end_mon = lt.tm_mon + 1; + end_day = lt.tm_mday; + end_year = lt.tm_year + 1900; + fprintf(f, "%02u/%02u/%04u [%d] {%d%c -> %02u/%02u/%04u", + st_mon, st_day, st_year, o->id, o->rpt->freq, + recur_def2char(o->rpt->type), end_mon, end_day, + end_year); + } + recur_write_exc(&o->exc, f); + fputs("} ", f); + if (o->note != NULL) + fprintf(f, ">%s ", o->note); + fprintf(f, "%s\n", o->mesg); } /* Write recursive items to file. */ void recur_save_data(FILE * f) { - llist_item_t *i; + llist_item_t *i; - LLIST_FOREACH(&recur_elist, i) { - struct recur_event *rev = LLIST_GET_DATA(i); - recur_event_write(rev, f); - } + LLIST_FOREACH(&recur_elist, i) { + struct recur_event *rev = LLIST_GET_DATA(i); + recur_event_write(rev, f); + } - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_FOREACH(&recur_alist_p, i) { - struct recur_apoint *rapt = LLIST_GET_DATA(i); - recur_apoint_write(rapt, f); - } - LLIST_TS_UNLOCK(&recur_alist_p); + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_FOREACH(&recur_alist_p, i) { + struct recur_apoint *rapt = LLIST_GET_DATA(i); + recur_apoint_write(rapt, f); + } + LLIST_TS_UNLOCK(&recur_alist_p); } /* @@ -512,45 +521,45 @@ void recur_save_data(FILE * f) /* Calculate the difference in days between two dates. */ static long diff_days(struct tm lt_start, struct tm lt_end) { - long diff; + long diff; - if (lt_end.tm_year < lt_start.tm_year) - return 0; + if (lt_end.tm_year < lt_start.tm_year) + return 0; - diff = lt_end.tm_yday - lt_start.tm_yday; + diff = lt_end.tm_yday - lt_start.tm_yday; - if (lt_end.tm_year > lt_start.tm_year) { - diff += (lt_end.tm_year - lt_start.tm_year) * YEARINDAYS; - diff += LEAPCOUNT(lt_start.tm_year + TM_YEAR_BASE, - lt_end.tm_year + TM_YEAR_BASE - 1); - } + if (lt_end.tm_year > lt_start.tm_year) { + diff += (lt_end.tm_year - lt_start.tm_year) * YEARINDAYS; + diff += LEAPCOUNT(lt_start.tm_year + TM_YEAR_BASE, + lt_end.tm_year + TM_YEAR_BASE - 1); + } - return diff; + return diff; } /* Calculate the difference in months between two dates. */ static long diff_months(struct tm lt_start, struct tm lt_end) { - long diff; + long diff; - if (lt_end.tm_year < lt_start.tm_year) - return 0; + if (lt_end.tm_year < lt_start.tm_year) + return 0; - diff = lt_end.tm_mon - lt_start.tm_mon; - diff += (lt_end.tm_year - lt_start.tm_year) * YEARINMONTHS; + diff = lt_end.tm_mon - lt_start.tm_mon; + diff += (lt_end.tm_year - lt_start.tm_year) * YEARINMONTHS; - return diff; + return diff; } /* Calculate the difference in years between two dates. */ static long diff_years(struct tm lt_start, struct tm lt_end) { - return lt_end.tm_year - lt_start.tm_year; + return lt_end.tm_year - lt_start.tm_year; } static int exc_inday(struct excp *exc, long *day_start) { - return (exc->st >= *day_start && exc->st < *day_start + DAYINSEC); + return (exc->st >= *day_start && exc->st < *day_start + DAYINSEC); } /* @@ -563,189 +572,198 @@ static int exc_inday(struct excp *exc, long *day_start) * calculation of recurrent dates after a turn of years. */ unsigned -recur_item_find_occurrence(long item_start, long item_dur, llist_t * item_exc, - int rpt_type, int rpt_freq, long rpt_until, - long day_start, unsigned *occurrence) -{ - struct date start_date; - long diff, span; - struct tm lt_day, lt_item, lt_item_day; - time_t t; - - if (day_start < item_start - DAYINSEC + 1) - return 0; - - if (rpt_until != 0 && day_start >= rpt_until + item_dur) - return 0; - - t = day_start; - localtime_r(&t, <_day); - - t = item_start; - localtime_r(&t, <_item); - - lt_item_day = lt_item; - lt_item_day.tm_sec = lt_item_day.tm_min = lt_item_day.tm_hour = 0; - - span = (item_start - mktime(<_item_day) + item_dur - 1) / DAYINSEC; - - switch (rpt_type) { - case RECUR_DAILY: - diff = diff_days(lt_item_day, lt_day) % rpt_freq; - lt_item_day.tm_mday = lt_day.tm_mday - diff; - lt_item_day.tm_mon = lt_day.tm_mon; - lt_item_day.tm_year = lt_day.tm_year; - break; - case RECUR_WEEKLY: - diff = diff_days(lt_item_day, lt_day) % (rpt_freq * WEEKINDAYS); - lt_item_day.tm_mday = lt_day.tm_mday - diff; - lt_item_day.tm_mon = lt_day.tm_mon; - lt_item_day.tm_year = lt_day.tm_year; - break; - case RECUR_MONTHLY: - diff = diff_months(lt_item_day, lt_day) % rpt_freq; - if (lt_day.tm_mday < lt_item_day.tm_mday) - diff++; - lt_item_day.tm_mon = lt_day.tm_mon - diff; - lt_item_day.tm_year = lt_day.tm_year; - break; - case RECUR_YEARLY: - diff = diff_years(lt_item_day, lt_day) % rpt_freq; - if (lt_day.tm_mon < lt_item_day.tm_mon || - (lt_day.tm_mon == lt_item_day.tm_mon && - lt_day.tm_mday < lt_item_day.tm_mday)) - diff++; - lt_item_day.tm_year = lt_day.tm_year - diff; - break; - default: - EXIT(_("unknown item type")); - } - - lt_item_day.tm_isdst = lt_day.tm_isdst; - t = mktime(<_item_day); - - if (LLIST_FIND_FIRST(item_exc, &t, exc_inday)) - return 0; - - if (rpt_until != 0 && t > rpt_until) - return 0; - - localtime_r(&t, <_item_day); - diff = diff_days(lt_item_day, lt_day); - - if (diff <= span) { - if (occurrence) { - start_date.dd = lt_item_day.tm_mday; - start_date.mm = lt_item_day.tm_mon + 1; - start_date.yyyy = lt_item_day.tm_year + 1900; - - *occurrence = date2sec(start_date, lt_item.tm_hour, lt_item.tm_min); - } - - return 1; - } else { - return 0; - } +recur_item_find_occurrence(long item_start, long item_dur, + llist_t * item_exc, int rpt_type, int rpt_freq, + long rpt_until, long day_start, + unsigned *occurrence) +{ + struct date start_date; + long diff, span; + struct tm lt_day, lt_item, lt_item_day; + time_t t; + + if (day_start < item_start - DAYINSEC + 1) + return 0; + + if (rpt_until != 0 && day_start >= rpt_until + item_dur) + return 0; + + t = day_start; + localtime_r(&t, <_day); + + t = item_start; + localtime_r(&t, <_item); + + lt_item_day = lt_item; + lt_item_day.tm_sec = lt_item_day.tm_min = lt_item_day.tm_hour = 0; + + span = + (item_start - mktime(<_item_day) + item_dur - 1) / DAYINSEC; + + switch (rpt_type) { + case RECUR_DAILY: + diff = diff_days(lt_item_day, lt_day) % rpt_freq; + lt_item_day.tm_mday = lt_day.tm_mday - diff; + lt_item_day.tm_mon = lt_day.tm_mon; + lt_item_day.tm_year = lt_day.tm_year; + break; + case RECUR_WEEKLY: + diff = + diff_days(lt_item_day, + lt_day) % (rpt_freq * WEEKINDAYS); + lt_item_day.tm_mday = lt_day.tm_mday - diff; + lt_item_day.tm_mon = lt_day.tm_mon; + lt_item_day.tm_year = lt_day.tm_year; + break; + case RECUR_MONTHLY: + diff = diff_months(lt_item_day, lt_day) % rpt_freq; + if (lt_day.tm_mday < lt_item_day.tm_mday) + diff++; + lt_item_day.tm_mon = lt_day.tm_mon - diff; + lt_item_day.tm_year = lt_day.tm_year; + break; + case RECUR_YEARLY: + diff = diff_years(lt_item_day, lt_day) % rpt_freq; + if (lt_day.tm_mon < lt_item_day.tm_mon || + (lt_day.tm_mon == lt_item_day.tm_mon && + lt_day.tm_mday < lt_item_day.tm_mday)) + diff++; + lt_item_day.tm_year = lt_day.tm_year - diff; + break; + default: + EXIT(_("unknown item type")); + } + + lt_item_day.tm_isdst = lt_day.tm_isdst; + t = mktime(<_item_day); + + if (LLIST_FIND_FIRST(item_exc, &t, exc_inday)) + return 0; + + if (rpt_until != 0 && t > rpt_until) + return 0; + + localtime_r(&t, <_item_day); + diff = diff_days(lt_item_day, lt_day); + + if (diff <= span) { + if (occurrence) { + start_date.dd = lt_item_day.tm_mday; + start_date.mm = lt_item_day.tm_mon + 1; + start_date.yyyy = lt_item_day.tm_year + 1900; + + *occurrence = + date2sec(start_date, lt_item.tm_hour, + lt_item.tm_min); + } + + return 1; + } else { + return 0; + } } unsigned recur_apoint_find_occurrence(struct recur_apoint *rapt, long day_start, - unsigned *occurrence) + unsigned *occurrence) { - return recur_item_find_occurrence(rapt->start, rapt->dur, &rapt->exc, - rapt->rpt->type, rapt->rpt->freq, - rapt->rpt->until, day_start, occurrence); + return recur_item_find_occurrence(rapt->start, rapt->dur, + &rapt->exc, rapt->rpt->type, + rapt->rpt->freq, + rapt->rpt->until, day_start, + occurrence); } unsigned recur_event_find_occurrence(struct recur_event *rev, long day_start, - unsigned *occurrence) + unsigned *occurrence) { - return recur_item_find_occurrence(rev->day, DAYINSEC, &rev->exc, - rev->rpt->type, rev->rpt->freq, - rev->rpt->until, day_start, occurrence); + return recur_item_find_occurrence(rev->day, DAYINSEC, &rev->exc, + rev->rpt->type, rev->rpt->freq, + rev->rpt->until, day_start, + occurrence); } /* Check if a recurrent item belongs to the selected day. */ unsigned recur_item_inday(long item_start, long item_dur, llist_t * item_exc, - int rpt_type, int rpt_freq, long rpt_until, long day_start) + int rpt_type, int rpt_freq, long rpt_until, + long day_start) { - /* We do not need the (real) start time of the occurrence here, so just - * ignore the buffer. */ - return recur_item_find_occurrence(item_start, item_dur, item_exc, rpt_type, - rpt_freq, rpt_until, day_start, NULL); + /* We do not need the (real) start time of the occurrence here, so just + * ignore the buffer. */ + return recur_item_find_occurrence(item_start, item_dur, item_exc, + rpt_type, rpt_freq, rpt_until, + day_start, NULL); } unsigned recur_apoint_inday(struct recur_apoint *rapt, long *day_start) { - return recur_item_inday(rapt->start, rapt->dur, &rapt->exc, rapt->rpt->type, - rapt->rpt->freq, rapt->rpt->until, *day_start); + return recur_item_inday(rapt->start, rapt->dur, &rapt->exc, + rapt->rpt->type, rapt->rpt->freq, + rapt->rpt->until, *day_start); } unsigned recur_event_inday(struct recur_event *rev, long *day_start) { - return recur_item_inday(rev->day, DAYINSEC, &rev->exc, rev->rpt->type, - rev->rpt->freq, rev->rpt->until, *day_start); + return recur_item_inday(rev->day, DAYINSEC, &rev->exc, + rev->rpt->type, rev->rpt->freq, + rev->rpt->until, *day_start); } /* Add an exception to a recurrent event. */ -void -recur_event_add_exc(struct recur_event *rev, long date) +void recur_event_add_exc(struct recur_event *rev, long date) { - recur_add_exc(&rev->exc, date); + recur_add_exc(&rev->exc, date); } /* Add an exception to a recurrent appointment. */ -void -recur_apoint_add_exc(struct recur_apoint *rapt, long date) +void recur_apoint_add_exc(struct recur_apoint *rapt, long date) { - int need_check_notify = 0; + int need_check_notify = 0; - if (notify_bar()) - need_check_notify = notify_same_recur_item(rapt); - recur_add_exc(&rapt->exc, date); - if (need_check_notify) - notify_check_next_app(0); + if (notify_bar()) + need_check_notify = notify_same_recur_item(rapt); + recur_add_exc(&rapt->exc, date); + if (need_check_notify) + notify_check_next_app(0); } /* * Delete a recurrent event from the list (if delete_whole is not null), * or delete only one occurence of the recurrent event. */ -void -recur_event_erase(struct recur_event *rev) +void recur_event_erase(struct recur_event *rev) { - llist_item_t *i = LLIST_FIND_FIRST(&recur_elist, rev, NULL); + llist_item_t *i = LLIST_FIND_FIRST(&recur_elist, rev, NULL); - if (!i) - EXIT(_("event not found")); + if (!i) + EXIT(_("event not found")); - LLIST_REMOVE(&recur_elist, i); + LLIST_REMOVE(&recur_elist, i); } /* * Delete a recurrent appointment from the list (if delete_whole is not null), * or delete only one occurence of the recurrent appointment. */ -void -recur_apoint_erase(struct recur_apoint *rapt) +void recur_apoint_erase(struct recur_apoint *rapt) { - LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_LOCK(&recur_alist_p); - llist_item_t *i = LLIST_TS_FIND_FIRST(&recur_alist_p, rapt, NULL); - int need_check_notify = 0; + llist_item_t *i = LLIST_TS_FIND_FIRST(&recur_alist_p, rapt, NULL); + int need_check_notify = 0; - if (!i) - EXIT(_("appointment not found")); + if (!i) + EXIT(_("appointment not found")); - if (notify_bar()) - need_check_notify = notify_same_recur_item(rapt); - LLIST_TS_REMOVE(&recur_alist_p, i); - if (need_check_notify) - notify_check_next_app(0); + if (notify_bar()) + need_check_notify = notify_same_recur_item(rapt); + LLIST_TS_REMOVE(&recur_alist_p, i); + if (need_check_notify) + notify_check_next_app(0); - LLIST_TS_UNLOCK(&recur_alist_p); + LLIST_TS_UNLOCK(&recur_alist_p); } /* @@ -754,116 +772,117 @@ recur_apoint_erase(struct recur_apoint *rapt) */ void recur_exc_scan(llist_t * lexc, FILE * data_file) { - int c = 0; - struct tm day; + int c = 0; + struct tm day; - LLIST_INIT(lexc); - while ((c = getc(data_file)) == '!') { - ungetc(c, data_file); - if (fscanf(data_file, "!%d / %d / %d ", - &day.tm_mon, &day.tm_mday, &day.tm_year) != 3) { - EXIT(_("syntax error in item date")); - } + LLIST_INIT(lexc); + while ((c = getc(data_file)) == '!') { + ungetc(c, data_file); + if (fscanf(data_file, "!%d / %d / %d ", + &day.tm_mon, &day.tm_mday, &day.tm_year) != 3) { + EXIT(_("syntax error in item date")); + } - EXIT_IF(!check_date(day.tm_year, day.tm_mon, day.tm_mday) || - !check_time(day.tm_hour, day.tm_min), - _("date error in item exception")); + EXIT_IF(!check_date(day.tm_year, day.tm_mon, day.tm_mday) + || !check_time(day.tm_hour, day.tm_min), + _("date error in item exception")); - day.tm_hour = 0; - day.tm_min = day.tm_sec = 0; - day.tm_isdst = -1; - day.tm_year -= 1900; - day.tm_mon--; - struct excp *exc = mem_malloc(sizeof(struct excp)); - exc->st = mktime(&day); - LLIST_ADD(lexc, exc); - } + day.tm_hour = 0; + day.tm_min = day.tm_sec = 0; + day.tm_isdst = -1; + day.tm_year -= 1900; + day.tm_mon--; + struct excp *exc = mem_malloc(sizeof(struct excp)); + exc->st = mktime(&day); + LLIST_ADD(lexc, exc); + } } static int recur_apoint_starts_before(struct recur_apoint *rapt, long time) { - return rapt->start < time; + return rapt->start < time; } /* * Look in the appointment list if we have an item which starts before the item * stored in the notify_app structure (which is the next item to be notified). */ -struct notify_app *recur_apoint_check_next(struct notify_app *app, long start, - long day) +struct notify_app *recur_apoint_check_next(struct notify_app *app, + long start, long day) { - llist_item_t *i; - unsigned real_recur_start_time; + llist_item_t *i; + unsigned real_recur_start_time; - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_FIND_FOREACH(&recur_alist_p, &app->time, recur_apoint_starts_before, - i) { - struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_FIND_FOREACH(&recur_alist_p, &app->time, + recur_apoint_starts_before, i) { + struct recur_apoint *rapt = LLIST_TS_GET_DATA(i); - if (recur_apoint_find_occurrence(rapt, day, &real_recur_start_time) && - real_recur_start_time > start) { - app->time = real_recur_start_time; - app->txt = mem_strdup(rapt->mesg); - app->state = rapt->state; - app->got_app = 1; - } - } - LLIST_TS_UNLOCK(&recur_alist_p); + if (recur_apoint_find_occurrence + (rapt, day, &real_recur_start_time) + && real_recur_start_time > start) { + app->time = real_recur_start_time; + app->txt = mem_strdup(rapt->mesg); + app->state = rapt->state; + app->got_app = 1; + } + } + LLIST_TS_UNLOCK(&recur_alist_p); - return app; + return app; } /* Switch recurrent item notification state. */ void recur_apoint_switch_notify(struct recur_apoint *rapt) { - LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_LOCK(&recur_alist_p); - rapt->state ^= APOINT_NOTIFY; - if (notify_bar()) - notify_check_repeated(rapt); + rapt->state ^= APOINT_NOTIFY; + if (notify_bar()) + notify_check_repeated(rapt); - LLIST_TS_UNLOCK(&recur_alist_p); + LLIST_TS_UNLOCK(&recur_alist_p); } void recur_event_paste_item(struct recur_event *rev, long date) { - long time_shift; - llist_item_t *i; + long time_shift; + llist_item_t *i; - time_shift = date - rev->day; - rev->day += time_shift; + time_shift = date - rev->day; + rev->day += time_shift; - if (rev->rpt->until != 0) - rev->rpt->until += time_shift; + if (rev->rpt->until != 0) + rev->rpt->until += time_shift; - LLIST_FOREACH(&rev->exc, i) { - struct excp *exc = LLIST_GET_DATA(i); - exc->st += time_shift; - } + LLIST_FOREACH(&rev->exc, i) { + struct excp *exc = LLIST_GET_DATA(i); + exc->st += time_shift; + } - LLIST_ADD_SORTED(&recur_elist, rev, recur_event_cmp_day); + LLIST_ADD_SORTED(&recur_elist, rev, recur_event_cmp_day); } void recur_apoint_paste_item(struct recur_apoint *rapt, long date) { - long time_shift; - llist_item_t *i; + long time_shift; + llist_item_t *i; - time_shift = (date + get_item_time(rapt->start)) - rapt->start; - rapt->start += time_shift; + time_shift = (date + get_item_time(rapt->start)) - rapt->start; + rapt->start += time_shift; - if (rapt->rpt->until != 0) - rapt->rpt->until += time_shift; + if (rapt->rpt->until != 0) + rapt->rpt->until += time_shift; - LLIST_FOREACH(&rapt->exc, i) { - struct excp *exc = LLIST_GET_DATA(i); - exc->st += time_shift; - } + LLIST_FOREACH(&rapt->exc, i) { + struct excp *exc = LLIST_GET_DATA(i); + exc->st += time_shift; + } - LLIST_TS_LOCK(&recur_alist_p); - LLIST_TS_ADD_SORTED(&recur_alist_p, rapt, recur_apoint_cmp_start); - LLIST_TS_UNLOCK(&recur_alist_p); + LLIST_TS_LOCK(&recur_alist_p); + LLIST_TS_ADD_SORTED(&recur_alist_p, rapt, recur_apoint_cmp_start); + LLIST_TS_UNLOCK(&recur_alist_p); - if (notify_bar()) - notify_check_repeated(rapt); + if (notify_bar()) + notify_check_repeated(rapt); } @@ -69,200 +69,203 @@ static void sha1_transform(uint32_t state[5], const uint8_t buffer[64]) { - typedef union { - uint8_t c[64]; - uint32_t l[16]; - } b64_t; + typedef union { + uint8_t c[64]; + uint32_t l[16]; + } b64_t; - b64_t *block = (b64_t *) buffer; - uint32_t a = state[0]; - uint32_t b = state[1]; - uint32_t c = state[2]; - uint32_t d = state[3]; - uint32_t e = state[4]; + b64_t *block = (b64_t *) buffer; + uint32_t a = state[0]; + uint32_t b = state[1]; + uint32_t c = state[2]; + uint32_t d = state[3]; + uint32_t e = state[4]; - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); + R0(a, b, c, d, e, 0); + R0(e, a, b, c, d, 1); + R0(d, e, a, b, c, 2); + R0(c, d, e, a, b, 3); + R0(b, c, d, e, a, 4); + R0(a, b, c, d, e, 5); + R0(e, a, b, c, d, 6); + R0(d, e, a, b, c, 7); + R0(c, d, e, a, b, 8); + R0(b, c, d, e, a, 9); + R0(a, b, c, d, e, 10); + R0(e, a, b, c, d, 11); + R0(d, e, a, b, c, 12); + R0(c, d, e, a, b, 13); + R0(b, c, d, e, a, 14); + R0(a, b, c, d, e, 15); + R1(e, a, b, c, d, 16); + R1(d, e, a, b, c, 17); + R1(c, d, e, a, b, 18); + R1(b, c, d, e, a, 19); + R2(a, b, c, d, e, 20); + R2(e, a, b, c, d, 21); + R2(d, e, a, b, c, 22); + R2(c, d, e, a, b, 23); + R2(b, c, d, e, a, 24); + R2(a, b, c, d, e, 25); + R2(e, a, b, c, d, 26); + R2(d, e, a, b, c, 27); + R2(c, d, e, a, b, 28); + R2(b, c, d, e, a, 29); + R2(a, b, c, d, e, 30); + R2(e, a, b, c, d, 31); + R2(d, e, a, b, c, 32); + R2(c, d, e, a, b, 33); + R2(b, c, d, e, a, 34); + R2(a, b, c, d, e, 35); + R2(e, a, b, c, d, 36); + R2(d, e, a, b, c, 37); + R2(c, d, e, a, b, 38); + R2(b, c, d, e, a, 39); + R3(a, b, c, d, e, 40); + R3(e, a, b, c, d, 41); + R3(d, e, a, b, c, 42); + R3(c, d, e, a, b, 43); + R3(b, c, d, e, a, 44); + R3(a, b, c, d, e, 45); + R3(e, a, b, c, d, 46); + R3(d, e, a, b, c, 47); + R3(c, d, e, a, b, 48); + R3(b, c, d, e, a, 49); + R3(a, b, c, d, e, 50); + R3(e, a, b, c, d, 51); + R3(d, e, a, b, c, 52); + R3(c, d, e, a, b, 53); + R3(b, c, d, e, a, 54); + R3(a, b, c, d, e, 55); + R3(e, a, b, c, d, 56); + R3(d, e, a, b, c, 57); + R3(c, d, e, a, b, 58); + R3(b, c, d, e, a, 59); + R4(a, b, c, d, e, 60); + R4(e, a, b, c, d, 61); + R4(d, e, a, b, c, 62); + R4(c, d, e, a, b, 63); + R4(b, c, d, e, a, 64); + R4(a, b, c, d, e, 65); + R4(e, a, b, c, d, 66); + R4(d, e, a, b, c, 67); + R4(c, d, e, a, b, 68); + R4(b, c, d, e, a, 69); + R4(a, b, c, d, e, 70); + R4(e, a, b, c, d, 71); + R4(d, e, a, b, c, 72); + R4(c, d, e, a, b, 73); + R4(b, c, d, e, a, 74); + R4(a, b, c, d, e, 75); + R4(e, a, b, c, d, 76); + R4(d, e, a, b, c, 77); + R4(c, d, e, a, b, 78); + R4(b, c, d, e, a, 79); - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; - a = b = c = d = e = 0; + a = b = c = d = e = 0; } void sha1_init(sha1_ctx_t * ctx) { - ctx->state[0] = 0x67452301; - ctx->state[1] = 0xEFCDAB89; - ctx->state[2] = 0x98BADCFE; - ctx->state[3] = 0x10325476; - ctx->state[4] = 0xC3D2E1F0; + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; + ctx->state[4] = 0xC3D2E1F0; - ctx->count[0] = ctx->count[1] = 0; + ctx->count[0] = ctx->count[1] = 0; } void sha1_update(sha1_ctx_t * ctx, const uint8_t * data, unsigned int len) { - unsigned int i, j; + unsigned int i, j; - j = (ctx->count[0] >> 3) & 63; - if ((ctx->count[0] += len << 3) < (len << 3)) - ctx->count[1]++; - ctx->count[1] += (len >> 29); + j = (ctx->count[0] >> 3) & 63; + if ((ctx->count[0] += len << 3) < (len << 3)) + ctx->count[1]++; + ctx->count[1] += (len >> 29); - if (j + len > 63) { - memcpy(&ctx->buffer[j], data, (i = 64 - j)); - sha1_transform(ctx->state, ctx->buffer); - for (; i + 63 < len; i += 64) - sha1_transform(ctx->state, &data[i]); - j = 0; - } else { - i = 0; - } - memcpy(&ctx->buffer[j], &data[i], len - i); + if (j + len > 63) { + memcpy(&ctx->buffer[j], data, (i = 64 - j)); + sha1_transform(ctx->state, ctx->buffer); + for (; i + 63 < len; i += 64) + sha1_transform(ctx->state, &data[i]); + j = 0; + } else { + i = 0; + } + memcpy(&ctx->buffer[j], &data[i], len - i); } void sha1_final(sha1_ctx_t * ctx, uint8_t digest[SHA1_DIGESTLEN]) { - uint32_t i, j; - uint8_t finalcount[8]; + uint32_t i, j; + uint8_t finalcount[8]; - for (i = 0; i < 8; i++) { - finalcount[i] = (uint8_t) ((ctx->count[(i >= 4 ? 0 : 1)] >> - ((3 - (i & 3)) * 8)) & 255); - } + for (i = 0; i < 8; i++) { + finalcount[i] = (uint8_t) ((ctx->count[(i >= 4 ? 0 : 1)] >> + ((3 - (i & 3)) * 8)) & 255); + } - sha1_update(ctx, (uint8_t *) "\200", 1); - while ((ctx->count[0] & 504) != 448) - sha1_update(ctx, (uint8_t *) "\0", 1); + sha1_update(ctx, (uint8_t *) "\200", 1); + while ((ctx->count[0] & 504) != 448) + sha1_update(ctx, (uint8_t *) "\0", 1); - sha1_update(ctx, finalcount, 8); - for (i = 0; i < SHA1_DIGESTLEN; i++) - digest[i] = (uint8_t) ((ctx->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); + sha1_update(ctx, finalcount, 8); + for (i = 0; i < SHA1_DIGESTLEN; i++) + digest[i] = + (uint8_t) ((ctx-> + state[i >> 2] >> ((3 - (i & 3)) * + 8)) & 255); - i = j = 0; - memset(ctx->buffer, 0, SHA1_BLOCKLEN); - memset(ctx->state, 0, SHA1_DIGESTLEN); - memset(ctx->count, 0, 8); - memset(&finalcount, 0, 8); + i = j = 0; + memset(ctx->buffer, 0, SHA1_BLOCKLEN); + memset(ctx->state, 0, SHA1_DIGESTLEN); + memset(ctx->count, 0, 8); + memset(&finalcount, 0, 8); } void sha1_digest(const char *data, char *buffer) { - sha1_ctx_t ctx; - uint8_t digest[SHA1_DIGESTLEN]; - int i; + sha1_ctx_t ctx; + uint8_t digest[SHA1_DIGESTLEN]; + int i; - sha1_init(&ctx); - sha1_update(&ctx, (const uint8_t *)data, strlen(data)); - sha1_final(&ctx, (uint8_t *) digest); + sha1_init(&ctx); + sha1_update(&ctx, (const uint8_t *)data, strlen(data)); + sha1_final(&ctx, (uint8_t *) digest); - for (i = 0; i < SHA1_DIGESTLEN; i++) { - snprintf(buffer, 3, "%02x", digest[i]); - buffer += sizeof(char) * 2; - } + for (i = 0; i < SHA1_DIGESTLEN; i++) { + snprintf(buffer, 3, "%02x", digest[i]); + buffer += sizeof(char) * 2; + } } void sha1_stream(FILE * fp, char *buffer) { - sha1_ctx_t ctx; - uint8_t data[BUFSIZ]; - size_t bytes_read; - uint8_t digest[SHA1_DIGESTLEN]; - int i; + sha1_ctx_t ctx; + uint8_t data[BUFSIZ]; + size_t bytes_read; + uint8_t digest[SHA1_DIGESTLEN]; + int i; - sha1_init(&ctx); + sha1_init(&ctx); - while (!feof(fp)) { - bytes_read = fread(data, 1, BUFSIZ, fp); - sha1_update(&ctx, data, bytes_read); - } + while (!feof(fp)) { + bytes_read = fread(data, 1, BUFSIZ, fp); + sha1_update(&ctx, data, bytes_read); + } - sha1_final(&ctx, (uint8_t *) digest); + sha1_final(&ctx, (uint8_t *) digest); - for (i = 0; i < SHA1_DIGESTLEN; i++) { - snprintf(buffer, 3, "%02x", digest[i]); - buffer += sizeof(char) * 2; - } + for (i = 0; i < SHA1_DIGESTLEN; i++) { + snprintf(buffer, 3, "%02x", digest[i]); + buffer += sizeof(char) * 2; + } } @@ -45,9 +45,9 @@ #define SHA1_DIGESTLEN 20 typedef struct { - uint32_t state[5]; - uint32_t count[2]; - uint8_t buffer[SHA1_BLOCKLEN]; + uint32_t state[5]; + uint32_t count[2]; + uint8_t buffer[SHA1_BLOCKLEN]; } sha1_ctx_t; void sha1_init(sha1_ctx_t *); @@ -65,60 +65,62 @@ */ static void generic_hdlr(int sig) { - switch (sig) { - case SIGCHLD: - while (waitpid(WAIT_MYPGRP, NULL, WNOHANG) > 0) ; - break; - case SIGWINCH: - resize = 1; - clearok(curscr, TRUE); - ungetch(KEY_RESIZE); - break; - case SIGTERM: - if (unlink(path_cpid) != 0) { - EXIT(_("Could not remove calcurse lock file: %s\n"), strerror(errno)); - } - exit(EXIT_SUCCESS); - break; - } + switch (sig) { + case SIGCHLD: + while (waitpid(WAIT_MYPGRP, NULL, WNOHANG) > 0) ; + break; + case SIGWINCH: + resize = 1; + clearok(curscr, TRUE); + ungetch(KEY_RESIZE); + break; + case SIGTERM: + if (unlink(path_cpid) != 0) { + EXIT(_("Could not remove calcurse lock file: %s\n"), + strerror(errno)); + } + exit(EXIT_SUCCESS); + break; + } } unsigned sigs_set_hdlr(int sig, void (*handler) (int)) { - struct sigaction sa; + struct sigaction sa; - memset(&sa, 0, sizeof sa); - sigemptyset(&sa.sa_mask); - sa.sa_handler = handler; - sa.sa_flags = 0; - if (sigaction(sig, &sa, NULL) == -1) { - ERROR_MSG(_("Error setting signal #%d : %s\n"), sig, strerror(errno)); - return 0; - } + memset(&sa, 0, sizeof sa); + sigemptyset(&sa.sa_mask); + sa.sa_handler = handler; + sa.sa_flags = 0; + if (sigaction(sig, &sa, NULL) == -1) { + ERROR_MSG(_("Error setting signal #%d : %s\n"), sig, + strerror(errno)); + return 0; + } - return 1; + return 1; } /* Signal handling init. */ void sigs_init() { - if (!sigs_set_hdlr(SIGCHLD, generic_hdlr) - || !sigs_set_hdlr(SIGWINCH, generic_hdlr) - || !sigs_set_hdlr(SIGTERM, generic_hdlr) - || !sigs_set_hdlr(SIGINT, SIG_IGN)) - exit_calcurse(1); + if (!sigs_set_hdlr(SIGCHLD, generic_hdlr) + || !sigs_set_hdlr(SIGWINCH, generic_hdlr) + || !sigs_set_hdlr(SIGTERM, generic_hdlr) + || !sigs_set_hdlr(SIGINT, SIG_IGN)) + exit_calcurse(1); } /* Ignore SIGWINCH and SIGTERM signals. */ void sigs_ignore(void) { - sigs_set_hdlr(SIGWINCH, SIG_IGN); - sigs_set_hdlr(SIGTERM, SIG_IGN); + sigs_set_hdlr(SIGWINCH, SIG_IGN); + sigs_set_hdlr(SIGTERM, SIG_IGN); } /* No longer ignore SIGWINCH and SIGTERM signals. */ void sigs_unignore(void) { - sigs_set_hdlr(SIGWINCH, generic_hdlr); - sigs_set_hdlr(SIGTERM, generic_hdlr); + sigs_set_hdlr(SIGWINCH, generic_hdlr); + sigs_set_hdlr(SIGTERM, generic_hdlr); } @@ -45,20 +45,20 @@ llist_t todolist; /* Returns a structure containing the selected item. */ struct todo *todo_get_item(int item_number) { - return LLIST_GET_DATA(LLIST_NTH(&todolist, item_number - 1)); + return LLIST_GET_DATA(LLIST_NTH(&todolist, item_number - 1)); } static int todo_cmp_id(struct todo *a, struct todo *b) { - /* - * As of version 2.6, todo items can have a negative id, which means they - * were completed. To keep them sorted, we need to consider the absolute id - * value. - */ - int abs_a = abs(a->id); - int abs_b = abs(b->id); - - return abs_a < abs_b ? -1 : (abs_a == abs_b ? 0 : 1); + /* + * As of version 2.6, todo items can have a negative id, which means they + * were completed. To keep them sorted, we need to consider the absolute id + * value. + */ + int abs_a = abs(a->id); + int abs_b = abs(b->id); + + return abs_a < abs_b ? -1 : (abs_a == abs_b ? 0 : 1); } /* @@ -66,46 +66,48 @@ static int todo_cmp_id(struct todo *a, struct todo *b) */ struct todo *todo_add(char *mesg, int id, char *note) { - struct todo *todo; + struct todo *todo; - todo = mem_malloc(sizeof(struct todo)); - todo->mesg = mem_strdup(mesg); - todo->id = id; - todo->note = (note != NULL && note[0] != '\0') ? mem_strdup(note) : NULL; + todo = mem_malloc(sizeof(struct todo)); + todo->mesg = mem_strdup(mesg); + todo->id = id; + todo->note = (note != NULL + && note[0] != '\0') ? mem_strdup(note) : NULL; - LLIST_ADD_SORTED(&todolist, todo, todo_cmp_id); + LLIST_ADD_SORTED(&todolist, todo, todo_cmp_id); - return todo; + return todo; } void todo_write(struct todo *todo, FILE * f) { - if (todo->note) - fprintf(f, "[%d]>%s %s\n", todo->id, todo->note, todo->mesg); - else - fprintf(f, "[%d] %s\n", todo->id, todo->mesg); + if (todo->note) + fprintf(f, "[%d]>%s %s\n", todo->id, todo->note, + todo->mesg); + else + fprintf(f, "[%d] %s\n", todo->id, todo->mesg); } /* Delete a note previously attached to a todo item. */ void todo_delete_note(struct todo *todo) { - if (!todo->note) - EXIT(_("no note attached")); - erase_note(&todo->note); + if (!todo->note) + EXIT(_("no note attached")); + erase_note(&todo->note); } /* Delete an item from the todo linked list. */ void todo_delete(struct todo *todo) { - llist_item_t *i = LLIST_FIND_FIRST(&todolist, todo, NULL); + llist_item_t *i = LLIST_FIND_FIRST(&todolist, todo, NULL); - if (!i) - EXIT(_("no such todo")); + if (!i) + EXIT(_("no such todo")); - LLIST_REMOVE(&todolist, i); - mem_free(todo->mesg); - erase_note(&todo->note); - mem_free(todo); + LLIST_REMOVE(&todolist, i); + mem_free(todo->mesg); + erase_note(&todo->note); + mem_free(todo); } /* @@ -116,7 +118,7 @@ void todo_delete(struct todo *todo) */ void todo_flag(struct todo *t) { - t->id = -t->id; + t->id = -t->id; } /* @@ -125,45 +127,45 @@ void todo_flag(struct todo *t) */ int todo_get_position(struct todo *needle) { - llist_item_t *i; - int n = 0; + llist_item_t *i; + int n = 0; - LLIST_FOREACH(&todolist, i) { - n++; - if (LLIST_TS_GET_DATA(i) == needle) - return n; - } + LLIST_FOREACH(&todolist, i) { + n++; + if (LLIST_TS_GET_DATA(i) == needle) + return n; + } - EXIT(_("todo not found")); - return -1; /* avoid compiler warnings */ + EXIT(_("todo not found")); + return -1; /* avoid compiler warnings */ } /* Attach a note to a todo */ void todo_edit_note(struct todo *i, const char *editor) { - edit_note(&i->note, editor); + edit_note(&i->note, editor); } /* View a note previously attached to a todo */ void todo_view_note(struct todo *i, const char *pager) { - view_note(i->note, pager); + view_note(i->note, pager); } void todo_free(struct todo *todo) { - mem_free(todo->mesg); - erase_note(&todo->note); - mem_free(todo); + mem_free(todo->mesg); + erase_note(&todo->note); + mem_free(todo); } void todo_init_list(void) { - LLIST_INIT(&todolist); + LLIST_INIT(&todolist); } void todo_free_list(void) { - LLIST_FREE_INNER(&todolist, todo_free); - LLIST_FREE(&todolist); + LLIST_FREE_INNER(&todolist, todo_free); + LLIST_FREE(&todolist); } diff --git a/src/ui-calendar.c b/src/ui-calendar.c index a312a99..f23d578 100644 --- a/src/ui-calendar.c +++ b/src/ui-calendar.c @@ -48,22 +48,22 @@ #endif #define EPOCH 90 -#define EPSILONg 279.403303 /* solar ecliptic long at EPOCH */ -#define RHOg 282.768422 /* solar ecliptic long of perigee at EPOCH */ -#define ECCEN 0.016713 /* solar orbit eccentricity */ -#define lzero 318.351648 /* lunar mean long at EPOCH */ -#define Pzero 36.340410 /* lunar mean long of perigee at EPOCH */ -#define Nzero 318.510107 /* lunar mean long of node at EPOCH */ +#define EPSILONg 279.403303 /* solar ecliptic long at EPOCH */ +#define RHOg 282.768422 /* solar ecliptic long of perigee at EPOCH */ +#define ECCEN 0.016713 /* solar orbit eccentricity */ +#define lzero 318.351648 /* lunar mean long at EPOCH */ +#define Pzero 36.340410 /* lunar mean long of perigee at EPOCH */ +#define Nzero 318.510107 /* lunar mean long of node at EPOCH */ #define ISLEAP(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) enum pom { - NO_POM, - FIRST_QUARTER, - FULL_MOON, - LAST_QUARTER, - NEW_MOON, - MOON_PHASES + NO_POM, + FIRST_QUARTER, + FULL_MOON, + LAST_QUARTER, + NEW_MOON, + MOON_PHASES }; static struct date today, slctd_day; @@ -74,7 +74,7 @@ static pthread_t ui_calendar_t_date; static void draw_monthly_view(struct window *, struct date *, unsigned); static void draw_weekly_view(struct window *, struct date *, unsigned); static void (*draw_calendar[CAL_VIEWS]) (struct window *, struct date *, - unsigned) = { + unsigned) = { draw_monthly_view, draw_weekly_view}; static int monthly_view_cache[MAXDAYSPERMONTH]; @@ -84,168 +84,170 @@ static int monthly_view_cache_month = 0; /* Switch between calendar views (monthly view is selected by default). */ void ui_calendar_view_next(void) { - ui_calendar_view++; - if (ui_calendar_view == CAL_VIEWS) - ui_calendar_view = 0; + ui_calendar_view++; + if (ui_calendar_view == CAL_VIEWS) + ui_calendar_view = 0; } void ui_calendar_view_prev(void) { - if (ui_calendar_view == 0) - ui_calendar_view = CAL_VIEWS; - ui_calendar_view--; + if (ui_calendar_view == 0) + ui_calendar_view = CAL_VIEWS; + ui_calendar_view--; } void ui_calendar_set_view(int view) { - ui_calendar_view = (view < 0 || view >= CAL_VIEWS) ? CAL_MONTH_VIEW : view; + ui_calendar_view = (view < 0 + || view >= CAL_VIEWS) ? CAL_MONTH_VIEW : view; } int ui_calendar_get_view(void) { - return (int)ui_calendar_view; + return (int)ui_calendar_view; } /* Thread needed to update current date in calendar. */ /* ARGSUSED0 */ static void *ui_calendar_date_thread(void *arg) { - time_t actual, tomorrow; + time_t actual, tomorrow; - for (;;) { - tomorrow = (time_t) (get_today() + DAYINSEC); + for (;;) { + tomorrow = (time_t) (get_today() + DAYINSEC); - while ((actual = time(NULL)) < tomorrow) - sleep(tomorrow - actual); + while ((actual = time(NULL)) < tomorrow) + sleep(tomorrow - actual); - ui_calendar_set_current_date(); - ui_calendar_update_panel(&win[CAL]); - } + ui_calendar_set_current_date(); + ui_calendar_update_panel(&win[CAL]); + } - return NULL; + return NULL; } /* Launch the calendar date thread. */ void ui_calendar_start_date_thread(void) { - pthread_create(&ui_calendar_t_date, NULL, ui_calendar_date_thread, NULL); + pthread_create(&ui_calendar_t_date, NULL, ui_calendar_date_thread, + NULL); } /* Stop the calendar date thread. */ void ui_calendar_stop_date_thread(void) { - if (ui_calendar_t_date) { - pthread_cancel(ui_calendar_t_date); - pthread_join(ui_calendar_t_date, NULL); - } + if (ui_calendar_t_date) { + pthread_cancel(ui_calendar_t_date); + pthread_join(ui_calendar_t_date, NULL); + } } /* Set static variable today to current date */ void ui_calendar_set_current_date(void) { - time_t timer; - struct tm tm; + time_t timer; + struct tm tm; - timer = time(NULL); - localtime_r(&timer, &tm); + timer = time(NULL); + localtime_r(&timer, &tm); - pthread_mutex_lock(&date_thread_mutex); - today.dd = tm.tm_mday; - today.mm = tm.tm_mon + 1; - today.yyyy = tm.tm_year + 1900; - pthread_mutex_unlock(&date_thread_mutex); + pthread_mutex_lock(&date_thread_mutex); + today.dd = tm.tm_mday; + today.mm = tm.tm_mon + 1; + today.yyyy = tm.tm_year + 1900; + pthread_mutex_unlock(&date_thread_mutex); } /* Needed to display sunday or monday as the first day of week in calendar. */ void ui_calendar_set_first_day_of_week(enum wday first_day) { - switch (first_day) { - case SUNDAY: - week_begins_on_monday = 0; - break; - case MONDAY: - week_begins_on_monday = 1; - break; - default: - ERROR_MSG(_("ERROR setting first day of week")); - week_begins_on_monday = 0; - /* NOTREACHED */ - } + switch (first_day) { + case SUNDAY: + week_begins_on_monday = 0; + break; + case MONDAY: + week_begins_on_monday = 1; + break; + default: + ERROR_MSG(_("ERROR setting first day of week")); + week_begins_on_monday = 0; + /* NOTREACHED */ + } } /* Swap first day of week in calendar. */ void ui_calendar_change_first_day_of_week(void) { - week_begins_on_monday = !week_begins_on_monday; + week_begins_on_monday = !week_begins_on_monday; } /* Return 1 if week begins on monday, 0 otherwise. */ unsigned ui_calendar_week_begins_on_monday(void) { - return week_begins_on_monday; + return week_begins_on_monday; } /* Fill in the given variable with the current date. */ void ui_calendar_store_current_date(struct date *date) { - pthread_mutex_lock(&date_thread_mutex); - *date = today; - pthread_mutex_unlock(&date_thread_mutex); + pthread_mutex_lock(&date_thread_mutex); + *date = today; + pthread_mutex_unlock(&date_thread_mutex); } /* This is to start at the current date in calendar. */ void ui_calendar_init_slctd_day(void) { - ui_calendar_store_current_date(&slctd_day); + ui_calendar_store_current_date(&slctd_day); } /* Return the selected day in calendar */ struct date *ui_calendar_get_slctd_day(void) { - return &slctd_day; + return &slctd_day; } /* Returned value represents the selected day in calendar (in seconds) */ long ui_calendar_get_slctd_day_sec(void) { - return date2sec(slctd_day, 0, 0); + return date2sec(slctd_day, 0, 0); } static int ui_calendar_get_wday(struct date *date) { - struct tm t; + struct tm t; - memset(&t, 0, sizeof(struct tm)); - t.tm_mday = date->dd; - t.tm_mon = date->mm - 1; - t.tm_year = date->yyyy - 1900; + memset(&t, 0, sizeof(struct tm)); + t.tm_mday = date->dd; + t.tm_mon = date->mm - 1; + t.tm_year = date->yyyy - 1900; - mktime(&t); + mktime(&t); - return t.tm_wday; + return t.tm_wday; } static unsigned months_to_days(unsigned month) { - return (month * 3057 - 3007) / 100; + return (month * 3057 - 3007) / 100; } static long years_to_days(unsigned year) { - return year * 365L + year / 4 - year / 100 + year / 400; + return year * 365L + year / 4 - year / 100 + year / 400; } static long ymd_to_scalar(unsigned year, unsigned month, unsigned day) { - long scalar; + long scalar; - scalar = day + months_to_days(month); - if (month > 2) - scalar -= ISLEAP(year) ? 1 : 2; - year--; - scalar += years_to_days(year); + scalar = day + months_to_days(month); + if (month > 2) + scalar -= ISLEAP(year) ? 1 : 2; + year--; + scalar += years_to_days(year); - return scalar; + return scalar; } /* @@ -254,149 +256,156 @@ static long ymd_to_scalar(unsigned year, unsigned month, unsigned day) */ static int date_change(struct tm *date, int delta_month, int delta_day) { - struct tm t; + struct tm t; - t = *date; - t.tm_mon += delta_month; - t.tm_mday += delta_day; + t = *date; + t.tm_mon += delta_month; + t.tm_mday += delta_day; - if (mktime(&t) == -1) { - return 1; - } else { - *date = t; - return 0; - } + if (mktime(&t) == -1) { + return 1; + } else { + *date = t; + return 0; + } } void ui_calendar_monthly_view_cache_set_invalid(void) { - monthly_view_cache_valid = 0; + monthly_view_cache_valid = 0; } /* Draw the monthly view inside calendar panel. */ static void draw_monthly_view(struct window *cwin, struct date *current_day, - unsigned sunday_first) -{ - const int OFFY = CALHEIGHT / 2 - (conf.compact_panels ? 3 : 1); - struct date check_day; - int c_day, c_day_1, day_1_sav, numdays, j; - unsigned yr, mo; - int OFFX, SBAR_WIDTH, ofs_x, ofs_y; - int item_this_day = 0; - - mo = slctd_day.mm; - yr = slctd_day.yyyy; - - /* offset for centering calendar in window */ - SBAR_WIDTH = wins_sbar_width(); - OFFX = (SBAR_WIDTH - 27) / 2; - ofs_y = OFFY; - ofs_x = OFFX; - - /* checking the number of days in february */ - numdays = days[mo - 1]; - if (2 == mo && ISLEAP(yr)) - ++numdays; - - /* - * the first calendar day will be monday or sunday, depending on - * 'week_begins_on_monday' value - */ - c_day_1 = (int)((ymd_to_scalar(yr, mo, 1 + sunday_first) - (long)1) % 7L); - - /* Write the current month and year on top of the calendar */ - WINS_CALENDAR_LOCK; - custom_apply_attr(cwin->p, ATTR_HIGHEST); - mvwprintw(cwin->p, ofs_y, - (SBAR_WIDTH - (strlen(_(monthnames[mo - 1])) + 5)) / 2, - "%s %d", _(monthnames[mo - 1]), slctd_day.yyyy); - custom_remove_attr(cwin->p, ATTR_HIGHEST); - ++ofs_y; - - /* print the days, with regards to the first day of the week */ - custom_apply_attr(cwin->p, ATTR_HIGHEST); - for (j = 0; j < WEEKINDAYS; j++) { - mvwaddstr(cwin->p, ofs_y, ofs_x + 4 * j, _(daynames[1 + j - sunday_first])); - } - custom_remove_attr(cwin->p, ATTR_HIGHEST); - WINS_CALENDAR_UNLOCK; - - day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7; - - /* invalidate cache if a new month is selected */ - if (yr * YEARINMONTHS + mo != monthly_view_cache_month) { - monthly_view_cache_month = yr * YEARINMONTHS + mo; - monthly_view_cache_valid = 0; - } - - for (c_day = 1; c_day <= numdays; ++c_day, ++c_day_1, c_day_1 %= 7) { - check_day.dd = c_day; - check_day.mm = slctd_day.mm; - check_day.yyyy = slctd_day.yyyy; - - /* check if the day contains an event or an appointment */ - if (monthly_view_cache_valid) { - item_this_day = monthly_view_cache[c_day - 1]; - } else { - item_this_day = monthly_view_cache[c_day - 1] = - day_check_if_item(check_day); - } - - /* Go to next line, the week is over. */ - if (!c_day_1 && 1 != c_day) { - ofs_y++; - ofs_x = OFFX - day_1_sav - 4 * c_day; - } - - WINS_CALENDAR_LOCK; - if (c_day == current_day->dd - && current_day->mm == slctd_day.mm - && current_day->yyyy == slctd_day.yyyy - && current_day->dd != slctd_day.dd) { - /* This is today, so print it in yellow. */ - custom_apply_attr(cwin->p, ATTR_LOWEST); - mvwprintw(cwin->p, ofs_y + 1, - ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day); - custom_remove_attr(cwin->p, ATTR_LOWEST); - } else if (c_day == slctd_day.dd) { - /* This is the selected day, print it according to user's theme. */ - custom_apply_attr(cwin->p, ATTR_HIGHEST); - mvwprintw(cwin->p, ofs_y + 1, - ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day); - custom_remove_attr(cwin->p, ATTR_HIGHEST); - } else if (item_this_day) { - custom_apply_attr(cwin->p, ATTR_LOW); - mvwprintw(cwin->p, ofs_y + 1, - ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day); - custom_remove_attr(cwin->p, ATTR_LOW); - } else { - /* otherwise, print normal days in black */ - mvwprintw(cwin->p, ofs_y + 1, - ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day); - } - WINS_CALENDAR_UNLOCK; - } - - monthly_view_cache_valid = 1; + unsigned sunday_first) +{ + const int OFFY = CALHEIGHT / 2 - (conf.compact_panels ? 3 : 1); + struct date check_day; + int c_day, c_day_1, day_1_sav, numdays, j; + unsigned yr, mo; + int OFFX, SBAR_WIDTH, ofs_x, ofs_y; + int item_this_day = 0; + + mo = slctd_day.mm; + yr = slctd_day.yyyy; + + /* offset for centering calendar in window */ + SBAR_WIDTH = wins_sbar_width(); + OFFX = (SBAR_WIDTH - 27) / 2; + ofs_y = OFFY; + ofs_x = OFFX; + + /* checking the number of days in february */ + numdays = days[mo - 1]; + if (2 == mo && ISLEAP(yr)) + ++numdays; + + /* + * the first calendar day will be monday or sunday, depending on + * 'week_begins_on_monday' value + */ + c_day_1 = + (int)((ymd_to_scalar(yr, mo, 1 + sunday_first) - + (long)1) % 7L); + + /* Write the current month and year on top of the calendar */ + WINS_CALENDAR_LOCK; + custom_apply_attr(cwin->p, ATTR_HIGHEST); + mvwprintw(cwin->p, ofs_y, + (SBAR_WIDTH - (strlen(_(monthnames[mo - 1])) + 5)) / 2, + "%s %d", _(monthnames[mo - 1]), slctd_day.yyyy); + custom_remove_attr(cwin->p, ATTR_HIGHEST); + ++ofs_y; + + /* print the days, with regards to the first day of the week */ + custom_apply_attr(cwin->p, ATTR_HIGHEST); + for (j = 0; j < WEEKINDAYS; j++) { + mvwaddstr(cwin->p, ofs_y, ofs_x + 4 * j, + _(daynames[1 + j - sunday_first])); + } + custom_remove_attr(cwin->p, ATTR_HIGHEST); + WINS_CALENDAR_UNLOCK; + + day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7; + + /* invalidate cache if a new month is selected */ + if (yr * YEARINMONTHS + mo != monthly_view_cache_month) { + monthly_view_cache_month = yr * YEARINMONTHS + mo; + monthly_view_cache_valid = 0; + } + + for (c_day = 1; c_day <= numdays; ++c_day, ++c_day_1, c_day_1 %= 7) { + check_day.dd = c_day; + check_day.mm = slctd_day.mm; + check_day.yyyy = slctd_day.yyyy; + + /* check if the day contains an event or an appointment */ + if (monthly_view_cache_valid) { + item_this_day = monthly_view_cache[c_day - 1]; + } else { + item_this_day = monthly_view_cache[c_day - 1] = + day_check_if_item(check_day); + } + + /* Go to next line, the week is over. */ + if (!c_day_1 && 1 != c_day) { + ofs_y++; + ofs_x = OFFX - day_1_sav - 4 * c_day; + } + + WINS_CALENDAR_LOCK; + if (c_day == current_day->dd + && current_day->mm == slctd_day.mm + && current_day->yyyy == slctd_day.yyyy + && current_day->dd != slctd_day.dd) { + /* This is today, so print it in yellow. */ + custom_apply_attr(cwin->p, ATTR_LOWEST); + mvwprintw(cwin->p, ofs_y + 1, + ofs_x + day_1_sav + 4 * c_day + 1, "%2d", + c_day); + custom_remove_attr(cwin->p, ATTR_LOWEST); + } else if (c_day == slctd_day.dd) { + /* This is the selected day, print it according to user's theme. */ + custom_apply_attr(cwin->p, ATTR_HIGHEST); + mvwprintw(cwin->p, ofs_y + 1, + ofs_x + day_1_sav + 4 * c_day + 1, "%2d", + c_day); + custom_remove_attr(cwin->p, ATTR_HIGHEST); + } else if (item_this_day) { + custom_apply_attr(cwin->p, ATTR_LOW); + mvwprintw(cwin->p, ofs_y + 1, + ofs_x + day_1_sav + 4 * c_day + 1, "%2d", + c_day); + custom_remove_attr(cwin->p, ATTR_LOW); + } else { + /* otherwise, print normal days in black */ + mvwprintw(cwin->p, ofs_y + 1, + ofs_x + day_1_sav + 4 * c_day + 1, "%2d", + c_day); + } + WINS_CALENDAR_UNLOCK; + } + + monthly_view_cache_valid = 1; } static int weeknum(const struct tm *t, int firstweekday) { - int wday, wnum; + int wday, wnum; - wday = t->tm_wday; - if (firstweekday == MONDAY) { - if (wday == SUNDAY) - wday = 6; - else - wday--; - } - wnum = ((t->tm_yday + WEEKINDAYS - wday) / WEEKINDAYS); - if (wnum < 0) - wnum = 0; + wday = t->tm_wday; + if (firstweekday == MONDAY) { + if (wday == SUNDAY) + wday = 6; + else + wday--; + } + wnum = ((t->tm_yday + WEEKINDAYS - wday) / WEEKINDAYS); + if (wnum < 0) + wnum = 0; - return wnum; + return wnum; } /* @@ -404,167 +413,180 @@ static int weeknum(const struct tm *t, int firstweekday) */ static int ISO8601weeknum(const struct tm *t) { - int wnum, jan1day; - - wnum = weeknum(t, MONDAY); - - jan1day = t->tm_wday - (t->tm_yday % WEEKINDAYS); - if (jan1day < 0) - jan1day += WEEKINDAYS; - - switch (jan1day) { - case MONDAY: - break; - case TUESDAY: - case WEDNESDAY: - case THURSDAY: - wnum++; - break; - case FRIDAY: - case SATURDAY: - case SUNDAY: - if (wnum == 0) { - /* Get week number of last week of last year. */ - struct tm dec31ly; /* 12/31 last year */ - - dec31ly = *t; - dec31ly.tm_year--; - dec31ly.tm_mon = 11; - dec31ly.tm_mday = 31; - dec31ly.tm_wday = (jan1day == SUNDAY) ? 6 : jan1day - 1; - dec31ly.tm_yday = 364 + ISLEAP(dec31ly.tm_year + 1900); - wnum = ISO8601weeknum(&dec31ly); - } - break; - } - - if (t->tm_mon == 11) { - int wday, mday; - - wday = t->tm_wday; - mday = t->tm_mday; - if ((wday == MONDAY && (mday >= 29 && mday <= 31)) - || (wday == TUESDAY && (mday == 30 || mday == 31)) - || (wday == WEDNESDAY && mday == 31)) - wnum = 1; - } - - return wnum; + int wnum, jan1day; + + wnum = weeknum(t, MONDAY); + + jan1day = t->tm_wday - (t->tm_yday % WEEKINDAYS); + if (jan1day < 0) + jan1day += WEEKINDAYS; + + switch (jan1day) { + case MONDAY: + break; + case TUESDAY: + case WEDNESDAY: + case THURSDAY: + wnum++; + break; + case FRIDAY: + case SATURDAY: + case SUNDAY: + if (wnum == 0) { + /* Get week number of last week of last year. */ + struct tm dec31ly; /* 12/31 last year */ + + dec31ly = *t; + dec31ly.tm_year--; + dec31ly.tm_mon = 11; + dec31ly.tm_mday = 31; + dec31ly.tm_wday = + (jan1day == SUNDAY) ? 6 : jan1day - 1; + dec31ly.tm_yday = + 364 + ISLEAP(dec31ly.tm_year + 1900); + wnum = ISO8601weeknum(&dec31ly); + } + break; + } + + if (t->tm_mon == 11) { + int wday, mday; + + wday = t->tm_wday; + mday = t->tm_mday; + if ((wday == MONDAY && (mday >= 29 && mday <= 31)) + || (wday == TUESDAY && (mday == 30 || mday == 31)) + || (wday == WEDNESDAY && mday == 31)) + wnum = 1; + } + + return wnum; } /* Draw the weekly view inside calendar panel. */ static void draw_weekly_view(struct window *cwin, struct date *current_day, - unsigned sunday_first) + unsigned sunday_first) { #define DAYSLICESNO 6 - const int WCALWIDTH = 30; - const int OFFY = CALHEIGHT / 2 - (conf.compact_panels ? 3 : 1); - struct tm t; - int OFFX, j, c_wday, days_to_remove, weeknum; - - OFFX = (wins_sbar_width() - WCALWIDTH) / 2 + 1; - - /* Fill in a tm structure with the first day of the selected week. */ - c_wday = ui_calendar_get_wday(&slctd_day); - if (sunday_first) - days_to_remove = c_wday; - else - days_to_remove = c_wday == 0 ? WEEKINDAYS - 1 : c_wday - 1; - - memset(&t, 0, sizeof(struct tm)); - t.tm_mday = slctd_day.dd; - t.tm_mon = slctd_day.mm - 1; - t.tm_year = slctd_day.yyyy - 1900; - mktime(&t); - date_change(&t, 0, -days_to_remove); - - /* Print the week number. */ - weeknum = ISO8601weeknum(&t); - WINS_CALENDAR_LOCK; - custom_apply_attr(cwin->p, ATTR_HIGHEST); - mvwprintw(cwin->p, conf.compact_panels ? 0 : 2, cwin->w - 9, "(# %02d)", - weeknum); - custom_remove_attr(cwin->p, ATTR_HIGHEST); - WINS_CALENDAR_UNLOCK; - - /* Now draw calendar view. */ - for (j = 0; j < WEEKINDAYS; j++) { - struct date date; - unsigned attr, item_this_day; - int i, slices[DAYSLICESNO]; - - /* print the day names, with regards to the first day of the week */ - custom_apply_attr(cwin->p, ATTR_HIGHEST); - mvwaddstr(cwin->p, OFFY, OFFX + 4 * j, _(daynames[1 + j - sunday_first])); - custom_remove_attr(cwin->p, ATTR_HIGHEST); - - /* Check if the day to be printed has an item or not. */ - date.dd = t.tm_mday; - date.mm = t.tm_mon + 1; - date.yyyy = t.tm_year + 1900; - item_this_day = day_check_if_item(date); - - /* Print the day numbers with appropriate decoration. */ - if (t.tm_mday == current_day->dd - && current_day->mm == slctd_day.mm - && current_day->yyyy == slctd_day.yyyy - && current_day->dd != slctd_day.dd) - attr = ATTR_LOWEST; /* today, but not selected */ - else if (t.tm_mday == slctd_day.dd) - attr = ATTR_HIGHEST; /* selected day */ - else if (item_this_day) - attr = ATTR_LOW; - else - attr = 0; - - WINS_CALENDAR_LOCK; - if (attr) - custom_apply_attr(cwin->p, attr); - mvwprintw(cwin->p, OFFY + 1, OFFX + 1 + 4 * j, "%02d", t.tm_mday); - if (attr) - custom_remove_attr(cwin->p, attr); - WINS_CALENDAR_UNLOCK; - - /* Draw slices indicating appointment times. */ - memset(slices, 0, DAYSLICESNO * sizeof *slices); - if (day_chk_busy_slices(date, DAYSLICESNO, slices)) { - for (i = 0; i < DAYSLICESNO; i++) { - if (j != WEEKINDAYS - 1 && i != DAYSLICESNO - 1) { - WINS_CALENDAR_LOCK; - mvwhline(cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2); - WINS_CALENDAR_UNLOCK; - } - if (slices[i]) { - int highlight; - - highlight = (t.tm_mday == slctd_day.dd) ? 1 : 0; - WINS_CALENDAR_LOCK; - if (highlight) - custom_apply_attr(cwin->p, attr); - wattron(cwin->p, A_REVERSE); - mvwaddstr(cwin->p, OFFY + 2 + i, OFFX + 1 + 4 * j, " "); - mvwaddstr(cwin->p, OFFY + 2 + i, OFFX + 2 + 4 * j, " "); - wattroff(cwin->p, A_REVERSE); - if (highlight) - custom_remove_attr(cwin->p, attr); - WINS_CALENDAR_UNLOCK; - } - } - } - - /* get next day */ - date_change(&t, 0, 1); - } - - /* Draw marks to indicate midday on the sides of the calendar. */ - WINS_CALENDAR_LOCK; - custom_apply_attr(cwin->p, ATTR_HIGHEST); - mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1); - mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, - OFFX + WCALWIDTH - 3, ACS_S9, 1); - custom_remove_attr(cwin->p, ATTR_HIGHEST); - WINS_CALENDAR_UNLOCK; + const int WCALWIDTH = 30; + const int OFFY = CALHEIGHT / 2 - (conf.compact_panels ? 3 : 1); + struct tm t; + int OFFX, j, c_wday, days_to_remove, weeknum; + + OFFX = (wins_sbar_width() - WCALWIDTH) / 2 + 1; + + /* Fill in a tm structure with the first day of the selected week. */ + c_wday = ui_calendar_get_wday(&slctd_day); + if (sunday_first) + days_to_remove = c_wday; + else + days_to_remove = c_wday == 0 ? WEEKINDAYS - 1 : c_wday - 1; + + memset(&t, 0, sizeof(struct tm)); + t.tm_mday = slctd_day.dd; + t.tm_mon = slctd_day.mm - 1; + t.tm_year = slctd_day.yyyy - 1900; + mktime(&t); + date_change(&t, 0, -days_to_remove); + + /* Print the week number. */ + weeknum = ISO8601weeknum(&t); + WINS_CALENDAR_LOCK; + custom_apply_attr(cwin->p, ATTR_HIGHEST); + mvwprintw(cwin->p, conf.compact_panels ? 0 : 2, cwin->w - 9, + "(# %02d)", weeknum); + custom_remove_attr(cwin->p, ATTR_HIGHEST); + WINS_CALENDAR_UNLOCK; + + /* Now draw calendar view. */ + for (j = 0; j < WEEKINDAYS; j++) { + struct date date; + unsigned attr, item_this_day; + int i, slices[DAYSLICESNO]; + + /* print the day names, with regards to the first day of the week */ + custom_apply_attr(cwin->p, ATTR_HIGHEST); + mvwaddstr(cwin->p, OFFY, OFFX + 4 * j, + _(daynames[1 + j - sunday_first])); + custom_remove_attr(cwin->p, ATTR_HIGHEST); + + /* Check if the day to be printed has an item or not. */ + date.dd = t.tm_mday; + date.mm = t.tm_mon + 1; + date.yyyy = t.tm_year + 1900; + item_this_day = day_check_if_item(date); + + /* Print the day numbers with appropriate decoration. */ + if (t.tm_mday == current_day->dd + && current_day->mm == slctd_day.mm + && current_day->yyyy == slctd_day.yyyy + && current_day->dd != slctd_day.dd) + attr = ATTR_LOWEST; /* today, but not selected */ + else if (t.tm_mday == slctd_day.dd) + attr = ATTR_HIGHEST; /* selected day */ + else if (item_this_day) + attr = ATTR_LOW; + else + attr = 0; + + WINS_CALENDAR_LOCK; + if (attr) + custom_apply_attr(cwin->p, attr); + mvwprintw(cwin->p, OFFY + 1, OFFX + 1 + 4 * j, "%02d", + t.tm_mday); + if (attr) + custom_remove_attr(cwin->p, attr); + WINS_CALENDAR_UNLOCK; + + /* Draw slices indicating appointment times. */ + memset(slices, 0, DAYSLICESNO * sizeof *slices); + if (day_chk_busy_slices(date, DAYSLICESNO, slices)) { + for (i = 0; i < DAYSLICESNO; i++) { + if (j != WEEKINDAYS - 1 + && i != DAYSLICESNO - 1) { + WINS_CALENDAR_LOCK; + mvwhline(cwin->p, OFFY + 2 + i, + OFFX + 3 + 4 * j, ACS_S9, + 2); + WINS_CALENDAR_UNLOCK; + } + if (slices[i]) { + int highlight; + + highlight = + (t.tm_mday == + slctd_day.dd) ? 1 : 0; + WINS_CALENDAR_LOCK; + if (highlight) + custom_apply_attr(cwin->p, + attr); + wattron(cwin->p, A_REVERSE); + mvwaddstr(cwin->p, OFFY + 2 + i, + OFFX + 1 + 4 * j, " "); + mvwaddstr(cwin->p, OFFY + 2 + i, + OFFX + 2 + 4 * j, " "); + wattroff(cwin->p, A_REVERSE); + if (highlight) + custom_remove_attr(cwin->p, + attr); + WINS_CALENDAR_UNLOCK; + } + } + } + + /* get next day */ + date_change(&t, 0, 1); + } + + /* Draw marks to indicate midday on the sides of the calendar. */ + WINS_CALENDAR_LOCK; + custom_apply_attr(cwin->p, ATTR_HIGHEST); + mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1); + mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, + OFFX + WCALWIDTH - 3, ACS_S9, 1); + custom_remove_attr(cwin->p, ATTR_HIGHEST); + WINS_CALENDAR_UNLOCK; #undef DAYSLICESNO } @@ -572,34 +594,34 @@ draw_weekly_view(struct window *cwin, struct date *current_day, /* Function used to display the calendar panel. */ void ui_calendar_update_panel(struct window *cwin) { - struct date current_day; - unsigned sunday_first; + struct date current_day; + unsigned sunday_first; - ui_calendar_store_current_date(¤t_day); + ui_calendar_store_current_date(¤t_day); - WINS_CALENDAR_LOCK; - erase_window_part(cwin->p, 1, conf.compact_panels ? 1 : 3, cwin->w - 2, - cwin->h - 2); - if (!conf.compact_panels) - mvwhline(cwin->p, 2, 1, ACS_HLINE, cwin->w - 2); - WINS_CALENDAR_UNLOCK; + WINS_CALENDAR_LOCK; + erase_window_part(cwin->p, 1, conf.compact_panels ? 1 : 3, + cwin->w - 2, cwin->h - 2); + if (!conf.compact_panels) + mvwhline(cwin->p, 2, 1, ACS_HLINE, cwin->w - 2); + WINS_CALENDAR_UNLOCK; - sunday_first = ui_calendar_week_begins_on_monday()? 0 : 1; + sunday_first = ui_calendar_week_begins_on_monday()? 0 : 1; - draw_calendar[ui_calendar_view] (cwin, ¤t_day, sunday_first); + draw_calendar[ui_calendar_view] (cwin, ¤t_day, sunday_first); - wnoutrefresh(cwin->p); + wnoutrefresh(cwin->p); } /* Set the selected day in calendar to current day. */ void ui_calendar_goto_today(void) { - struct date today; + struct date today; - ui_calendar_store_current_date(&today); - slctd_day.dd = today.dd; - slctd_day.mm = today.mm; - slctd_day.yyyy = today.yyyy; + ui_calendar_store_current_date(&today); + slctd_day.dd = today.dd; + slctd_day.mm = today.mm; + slctd_day.yyyy = today.yyyy; } /* @@ -611,154 +633,165 @@ void ui_calendar_goto_today(void) void ui_calendar_change_day(int datefmt) { #define LDAY 11 - char selected_day[LDAY] = ""; - char outstr[BUFSIZ]; - int dday, dmonth, dyear; - int wrong_day = 1; - const char *mesg_line1 = - _("The day you entered is not valid " - "(should be between 01/01/1902 and 12/31/2037)"); - const char *mesg_line2 = _("Press [ENTER] to continue"); - const char *request_date = _("Enter the day to go to [ENTER for today] : %s"); - - while (wrong_day) { - snprintf(outstr, BUFSIZ, request_date, DATEFMT_DESC(datefmt)); - status_mesg(outstr, ""); - if (getstring(win[STA].p, selected_day, LDAY, 0, 1) == GETSTRING_ESC) { - return; - } else { - if (strlen(selected_day) == 0) { - wrong_day = 0; - ui_calendar_goto_today(); - } else if (parse_date(selected_day, datefmt, &dyear, &dmonth, &dday, - ui_calendar_get_slctd_day())) { - wrong_day = 0; - /* go to chosen day */ - slctd_day.dd = dday; - slctd_day.mm = dmonth; - slctd_day.yyyy = dyear; - } - if (wrong_day) { - status_mesg(mesg_line1, mesg_line2); - wgetch(win[KEY].p); - } - } - } - - return; + char selected_day[LDAY] = ""; + char outstr[BUFSIZ]; + int dday, dmonth, dyear; + int wrong_day = 1; + const char *mesg_line1 = + _("The day you entered is not valid " + "(should be between 01/01/1902 and 12/31/2037)"); + const char *mesg_line2 = _("Press [ENTER] to continue"); + const char *request_date = + _("Enter the day to go to [ENTER for today] : %s"); + + while (wrong_day) { + snprintf(outstr, BUFSIZ, request_date, + DATEFMT_DESC(datefmt)); + status_mesg(outstr, ""); + if (getstring(win[STA].p, selected_day, LDAY, 0, 1) == + GETSTRING_ESC) { + return; + } else { + if (strlen(selected_day) == 0) { + wrong_day = 0; + ui_calendar_goto_today(); + } else + if (parse_date + (selected_day, datefmt, &dyear, &dmonth, + &dday, ui_calendar_get_slctd_day())) { + wrong_day = 0; + /* go to chosen day */ + slctd_day.dd = dday; + slctd_day.mm = dmonth; + slctd_day.yyyy = dyear; + } + if (wrong_day) { + status_mesg(mesg_line1, mesg_line2); + wgetch(win[KEY].p); + } + } + } + + return; } void ui_calendar_move(enum move move, int count) { - int ret, days_to_remove, days_to_add; - struct tm t; - - memset(&t, 0, sizeof(struct tm)); - t.tm_mday = slctd_day.dd; - t.tm_mon = slctd_day.mm - 1; - t.tm_year = slctd_day.yyyy - 1900; - - switch (move) { - case DAY_PREV: - ret = date_change(&t, 0, -count); - break; - case DAY_NEXT: - ret = date_change(&t, 0, count); - break; - case WEEK_PREV: - ret = date_change(&t, 0, -count * WEEKINDAYS); - break; - case WEEK_NEXT: - ret = date_change(&t, 0, count * WEEKINDAYS); - break; - case MONTH_PREV: - ret = date_change(&t, -count, 0); - break; - case MONTH_NEXT: - ret = date_change(&t, count, 0); - break; - case YEAR_PREV: - ret = date_change(&t, -count * YEARINMONTHS, 0); - break; - case YEAR_NEXT: - ret = date_change(&t, count * YEARINMONTHS, 0); - break; - case WEEK_START: - /* Normalize struct tm to get week day number. */ - mktime(&t); - if (ui_calendar_week_begins_on_monday()) - days_to_remove = ((t.tm_wday == 0) ? WEEKINDAYS - 1 : t.tm_wday - 1); - else - days_to_remove = ((t.tm_wday == 0) ? 0 : t.tm_wday); - days_to_remove += (count - 1) * WEEKINDAYS; - ret = date_change(&t, 0, -days_to_remove); - break; - case WEEK_END: - mktime(&t); - if (ui_calendar_week_begins_on_monday()) - days_to_add = ((t.tm_wday == 0) ? 0 : WEEKINDAYS - t.tm_wday); - else - days_to_add = ((t.tm_wday == 0) ? - WEEKINDAYS - 1 : WEEKINDAYS - 1 - t.tm_wday); - days_to_add += (count - 1) * WEEKINDAYS; - ret = date_change(&t, 0, days_to_add); - break; - default: - ret = 1; - /* NOTREACHED */ - } - - if (ret == 0) { - if (t.tm_year < 2) { - t.tm_mday = 1; - t.tm_mon = 0; - t.tm_year = 2; - } else if (t.tm_year > 137) { - t.tm_mday = 31; - t.tm_mon = 11; - t.tm_year = 137; - } - - slctd_day.dd = t.tm_mday; - slctd_day.mm = t.tm_mon + 1; - slctd_day.yyyy = t.tm_year + 1900; - } + int ret, days_to_remove, days_to_add; + struct tm t; + + memset(&t, 0, sizeof(struct tm)); + t.tm_mday = slctd_day.dd; + t.tm_mon = slctd_day.mm - 1; + t.tm_year = slctd_day.yyyy - 1900; + + switch (move) { + case DAY_PREV: + ret = date_change(&t, 0, -count); + break; + case DAY_NEXT: + ret = date_change(&t, 0, count); + break; + case WEEK_PREV: + ret = date_change(&t, 0, -count * WEEKINDAYS); + break; + case WEEK_NEXT: + ret = date_change(&t, 0, count * WEEKINDAYS); + break; + case MONTH_PREV: + ret = date_change(&t, -count, 0); + break; + case MONTH_NEXT: + ret = date_change(&t, count, 0); + break; + case YEAR_PREV: + ret = date_change(&t, -count * YEARINMONTHS, 0); + break; + case YEAR_NEXT: + ret = date_change(&t, count * YEARINMONTHS, 0); + break; + case WEEK_START: + /* Normalize struct tm to get week day number. */ + mktime(&t); + if (ui_calendar_week_begins_on_monday()) + days_to_remove = + ((t.tm_wday == + 0) ? WEEKINDAYS - 1 : t.tm_wday - 1); + else + days_to_remove = + ((t.tm_wday == 0) ? 0 : t.tm_wday); + days_to_remove += (count - 1) * WEEKINDAYS; + ret = date_change(&t, 0, -days_to_remove); + break; + case WEEK_END: + mktime(&t); + if (ui_calendar_week_begins_on_monday()) + days_to_add = + ((t.tm_wday == + 0) ? 0 : WEEKINDAYS - t.tm_wday); + else + days_to_add = ((t.tm_wday == 0) ? + WEEKINDAYS - 1 : WEEKINDAYS - 1 - + t.tm_wday); + days_to_add += (count - 1) * WEEKINDAYS; + ret = date_change(&t, 0, days_to_add); + break; + default: + ret = 1; + /* NOTREACHED */ + } + + if (ret == 0) { + if (t.tm_year < 2) { + t.tm_mday = 1; + t.tm_mon = 0; + t.tm_year = 2; + } else if (t.tm_year > 137) { + t.tm_mday = 31; + t.tm_mon = 11; + t.tm_year = 137; + } + + slctd_day.dd = t.tm_mday; + slctd_day.mm = t.tm_mon + 1; + slctd_day.yyyy = t.tm_year + 1900; + } } /* Returns the beginning of current year as a long. */ long ui_calendar_start_of_year(void) { - time_t timer; - struct tm tm; + time_t timer; + struct tm tm; - timer = time(NULL); - localtime_r(&timer, &tm); - tm.tm_mon = 0; - tm.tm_mday = 1; - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - timer = mktime(&tm); + timer = time(NULL); + localtime_r(&timer, &tm); + tm.tm_mon = 0; + tm.tm_mday = 1; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + timer = mktime(&tm); - return (long)timer; + return (long)timer; } long ui_calendar_end_of_year(void) { - time_t timer; - struct tm tm; + time_t timer; + struct tm tm; - timer = time(NULL); - localtime_r(&timer, &tm); - tm.tm_mon = 0; - tm.tm_mday = 1; - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_year++; - timer = mktime(&tm); + timer = time(NULL); + localtime_r(&timer, &tm); + tm.tm_mon = 0; + tm.tm_mday = 1; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_year++; + timer = mktime(&tm); - return (long)(timer - 1); + return (long)(timer - 1); } /* @@ -804,7 +837,7 @@ long ui_calendar_end_of_year(void) */ static double dtor(double deg) { - return deg * M_PI / 180; + return deg * M_PI / 180; } /* @@ -813,13 +846,13 @@ static double dtor(double deg) */ static void adj360(double *deg) { - for (;;) - if (*deg < 0.0) - *deg += 360.0; - else if (*deg > 360.0) - *deg -= 360.0; - else - break; + for (;;) + if (*deg < 0.0) + *deg += 360.0; + else if (*deg > 360.0) + *deg -= 360.0; + else + break; } /* @@ -828,33 +861,33 @@ static void adj360(double *deg) */ static double potm(double days) { - double N, Msol, Ec, LambdaSol, l, Mm, Ev, Ac, A3, Mmprime; - double A4, lprime, V, ldprime, D, Nm; - - N = 360.0 * days / 365.242191; /* sec 46 #3 */ - adj360(&N); - Msol = N + EPSILONg - RHOg; /* sec 46 #4 */ - adj360(&Msol); - Ec = 360 / M_PI * ECCEN * sin(dtor(Msol)); /* sec 46 #5 */ - LambdaSol = N + Ec + EPSILONg; /* sec 46 #6 */ - adj360(&LambdaSol); - l = 13.1763966 * days + lzero; /* sec 65 #4 */ - adj360(&l); - Mm = l - (0.1114041 * days) - Pzero; /* sec 65 #5 */ - adj360(&Mm); - Nm = Nzero - (0.0529539 * days); /* sec 65 #6 */ - adj360(&Nm); - Ev = 1.2739 * sin(dtor(2 * (l - LambdaSol) - Mm)); /* sec 65 #7 */ - Ac = 0.1858 * sin(dtor(Msol)); /* sec 65 #8 */ - A3 = 0.37 * sin(dtor(Msol)); - Mmprime = Mm + Ev - Ac - A3; /* sec 65 #9 */ - Ec = 6.2886 * sin(dtor(Mmprime)); /* sec 65 #10 */ - A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 65 #11 */ - lprime = l + Ev + Ec - Ac + A4; /* sec 65 #12 */ - V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 65 #13 */ - ldprime = lprime + V; /* sec 65 #14 */ - D = ldprime - LambdaSol; /* sec 67 #2 */ - return 50.0 * (1 - cos(dtor(D))); /* sec 67 #3 */ + double N, Msol, Ec, LambdaSol, l, Mm, Ev, Ac, A3, Mmprime; + double A4, lprime, V, ldprime, D, Nm; + + N = 360.0 * days / 365.242191; /* sec 46 #3 */ + adj360(&N); + Msol = N + EPSILONg - RHOg; /* sec 46 #4 */ + adj360(&Msol); + Ec = 360 / M_PI * ECCEN * sin(dtor(Msol)); /* sec 46 #5 */ + LambdaSol = N + Ec + EPSILONg; /* sec 46 #6 */ + adj360(&LambdaSol); + l = 13.1763966 * days + lzero; /* sec 65 #4 */ + adj360(&l); + Mm = l - (0.1114041 * days) - Pzero; /* sec 65 #5 */ + adj360(&Mm); + Nm = Nzero - (0.0529539 * days); /* sec 65 #6 */ + adj360(&Nm); + Ev = 1.2739 * sin(dtor(2 * (l - LambdaSol) - Mm)); /* sec 65 #7 */ + Ac = 0.1858 * sin(dtor(Msol)); /* sec 65 #8 */ + A3 = 0.37 * sin(dtor(Msol)); + Mmprime = Mm + Ev - Ac - A3; /* sec 65 #9 */ + Ec = 6.2886 * sin(dtor(Mmprime)); /* sec 65 #10 */ + A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 65 #11 */ + lprime = l + Ev + Ec - Ac + A4; /* sec 65 #12 */ + V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 65 #13 */ + ldprime = lprime + V; /* sec 65 #14 */ + D = ldprime - LambdaSol; /* sec 67 #2 */ + return 50.0 * (1 - cos(dtor(D))); /* sec 67 #3 */ } /* @@ -870,20 +903,20 @@ static double potm(double days) */ static double pom(time_t tmpt) { - struct tm *GMT; - double days; - int cnt; + struct tm *GMT; + double days; + int cnt; - GMT = gmtime(&tmpt); - days = (GMT->tm_yday + 1) + ((GMT->tm_hour + (GMT->tm_min / 60.0) + - (GMT->tm_sec / 3600.0)) / 24.0); - for (cnt = EPOCH; cnt < GMT->tm_year; ++cnt) - days += ISLEAP(cnt + TM_YEAR_BASE) ? 366 : 365; - /* Selected time could be before EPOCH */ - for (cnt = GMT->tm_year; cnt < EPOCH; ++cnt) - days -= ISLEAP(cnt + TM_YEAR_BASE) ? 366 : 365; + GMT = gmtime(&tmpt); + days = (GMT->tm_yday + 1) + ((GMT->tm_hour + (GMT->tm_min / 60.0) + + (GMT->tm_sec / 3600.0)) / 24.0); + for (cnt = EPOCH; cnt < GMT->tm_year; ++cnt) + days += ISLEAP(cnt + TM_YEAR_BASE) ? 366 : 365; + /* Selected time could be before EPOCH */ + for (cnt = GMT->tm_year; cnt < EPOCH; ++cnt) + days -= ISLEAP(cnt + TM_YEAR_BASE) ? 366 : 365; - return potm(days); + return potm(days); } /* @@ -893,22 +926,25 @@ static double pom(time_t tmpt) */ const char *ui_calendar_get_pom(time_t date) { - const char *pom_pict[MOON_PHASES] = { " ", "|) ", "(|)", "(| ", " | " }; - enum pom phase = NO_POM; - double pom_today, relative_pom, pom_yesterday, pom_tomorrow; - const double half = 50.0; - - pom_yesterday = pom(date); - pom_today = pom(date + DAYINSEC); - relative_pom = abs(pom_today - half); - pom_tomorrow = pom(date + 2 * DAYINSEC); - if (pom_today > pom_yesterday && pom_today > pom_tomorrow) - phase = FULL_MOON; - else if (pom_today < pom_yesterday && pom_today < pom_tomorrow) - phase = NEW_MOON; - else if (relative_pom < abs(pom_yesterday - half) - && relative_pom < abs(pom_tomorrow - half)) - phase = (pom_tomorrow > pom_today) ? FIRST_QUARTER : LAST_QUARTER; - - return pom_pict[phase]; + const char *pom_pict[MOON_PHASES] = + { " ", "|) ", "(|)", "(| ", " | " }; + enum pom phase = NO_POM; + double pom_today, relative_pom, pom_yesterday, pom_tomorrow; + const double half = 50.0; + + pom_yesterday = pom(date); + pom_today = pom(date + DAYINSEC); + relative_pom = abs(pom_today - half); + pom_tomorrow = pom(date + 2 * DAYINSEC); + if (pom_today > pom_yesterday && pom_today > pom_tomorrow) + phase = FULL_MOON; + else if (pom_today < pom_yesterday && pom_today < pom_tomorrow) + phase = NEW_MOON; + else if (relative_pom < abs(pom_yesterday - half) + && relative_pom < abs(pom_tomorrow - half)) + phase = + (pom_tomorrow > + pom_today) ? FIRST_QUARTER : LAST_QUARTER; + + return pom_pict[phase]; } diff --git a/src/ui-day.c b/src/ui-day.c index 3638c6e..647d038 100644 --- a/src/ui-day.c +++ b/src/ui-day.c @@ -37,366 +37,389 @@ #include "calcurse.h" static int hilt; -struct day_item day_cut[38] = { { 0, 0, { NULL } } }; +struct day_item day_cut[38] = { {0, 0, {NULL}} }; /* Request the user to enter a new time. */ -static int day_edit_time(int time, unsigned *new_hour, unsigned *new_minute) +static int day_edit_time(int time, unsigned *new_hour, + unsigned *new_minute) { - char *timestr = date_sec2date_str(time, "%H:%M"); - const char *msg_time = _("Enter the new time ([hh:mm] or [hhmm]) : "); - const char *enter_str = _("Press [Enter] to continue"); - const char *fmt_msg = _("You entered an invalid time, should be [hh:mm] or [hhmm]"); - - for (;;) { - status_mesg(msg_time, ""); - if (updatestring(win[STA].p, ×tr, 0, 1) != GETSTRING_VALID) - return 0; - if (parse_time(timestr, new_hour, new_minute) == 1) { - mem_free(timestr); - return 1; - } else { - status_mesg(fmt_msg, enter_str); - wgetch(win[KEY].p); - } - } + char *timestr = date_sec2date_str(time, "%H:%M"); + const char *msg_time = + _("Enter the new time ([hh:mm] or [hhmm]) : "); + const char *enter_str = _("Press [Enter] to continue"); + const char *fmt_msg = + _("You entered an invalid time, should be [hh:mm] or [hhmm]"); + + for (;;) { + status_mesg(msg_time, ""); + if (updatestring(win[STA].p, ×tr, 0, 1) != + GETSTRING_VALID) + return 0; + if (parse_time(timestr, new_hour, new_minute) == 1) { + mem_free(timestr); + return 1; + } else { + status_mesg(fmt_msg, enter_str); + wgetch(win[KEY].p); + } + } } /* Request the user to enter a new time or duration. */ static int day_edit_duration(int start, int dur, unsigned *new_duration) { - char *timestr = date_sec2date_str(start + dur, "%H:%M"); - const char *msg_time = - _ - ("Enter new end time ([hh:mm], [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); - const char *enter_str = _("Press [Enter] to continue"); - const char *fmt_msg = _("You entered an invalid time, should be [hh:mm] or [hhmm]"); - long newtime; - unsigned hr, mn; - - for (;;) { - status_mesg(msg_time, ""); - if (updatestring(win[STA].p, ×tr, 0, 1) != GETSTRING_VALID) - return 0; - if (*timestr == '+' && parse_duration(timestr + 1, new_duration) == 1) { - *new_duration *= MININSEC; - break; - } else if (parse_time(timestr, &hr, &mn) == 1) { - newtime = update_time_in_date(start + dur, hr, mn); - *new_duration = (newtime > start) ? newtime - start : - DAYINSEC + newtime - start; - break; - } else { - status_mesg(fmt_msg, enter_str); - wgetch(win[KEY].p); - } - } - - mem_free(timestr); - return 1; + char *timestr = date_sec2date_str(start + dur, "%H:%M"); + const char *msg_time = + _("Enter new end time ([hh:mm], [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); + const char *enter_str = _("Press [Enter] to continue"); + const char *fmt_msg = + _("You entered an invalid time, should be [hh:mm] or [hhmm]"); + long newtime; + unsigned hr, mn; + + for (;;) { + status_mesg(msg_time, ""); + if (updatestring(win[STA].p, ×tr, 0, 1) != + GETSTRING_VALID) + return 0; + if (*timestr == '+' + && parse_duration(timestr + 1, new_duration) == 1) { + *new_duration *= MININSEC; + break; + } else if (parse_time(timestr, &hr, &mn) == 1) { + newtime = update_time_in_date(start + dur, hr, mn); + *new_duration = + (newtime > + start) ? newtime - start : DAYINSEC + + newtime - start; + break; + } else { + status_mesg(fmt_msg, enter_str); + wgetch(win[KEY].p); + } + } + + mem_free(timestr); + return 1; } /* Request the user to enter a new end time or duration. */ static void update_start_time(long *start, long *dur) { - long newtime; - unsigned hr, mn; - int valid_date; - const char *msg_wrong_time = - _("Invalid time: start time must be before end time!"); - const char *msg_enter = _("Press [Enter] to continue"); - - do { - if (!day_edit_time(*start, &hr, &mn)) - break; - newtime = update_time_in_date(*start, hr, mn); - if (newtime < *start + *dur) { - *dur -= (newtime - *start); - *start = newtime; - valid_date = 1; - } else { - status_mesg(msg_wrong_time, msg_enter); - wgetch(win[KEY].p); - valid_date = 0; - } - } - while (valid_date == 0); + long newtime; + unsigned hr, mn; + int valid_date; + const char *msg_wrong_time = + _("Invalid time: start time must be before end time!"); + const char *msg_enter = _("Press [Enter] to continue"); + + do { + if (!day_edit_time(*start, &hr, &mn)) + break; + newtime = update_time_in_date(*start, hr, mn); + if (newtime < *start + *dur) { + *dur -= (newtime - *start); + *start = newtime; + valid_date = 1; + } else { + status_mesg(msg_wrong_time, msg_enter); + wgetch(win[KEY].p); + valid_date = 0; + } + } + while (valid_date == 0); } static void update_duration(long *start, long *dur) { - unsigned newdur; + unsigned newdur; - if (day_edit_duration(*start, *dur, &newdur)) - *dur = newdur; + if (day_edit_duration(*start, *dur, &newdur)) + *dur = newdur; } static void update_desc(char **desc) { - status_mesg(_("Enter the new item description:"), ""); - updatestring(win[STA].p, desc, 0, 1); + status_mesg(_("Enter the new item description:"), ""); + updatestring(win[STA].p, desc, 0, 1); } static void update_rept(struct rpt **rpt, const long start) { - int newtype, newfreq; - long newuntil; - char outstr[BUFSIZ]; - char *freqstr, *timstr; - const char *msg_rpt_prefix = _("Enter the new repetition type:"); - const char *msg_rpt_daily = _("(d)aily"); - const char *msg_rpt_weekly = _("(w)eekly"); - const char *msg_rpt_monthly = _("(m)onthly"); - const char *msg_rpt_yearly = _("(y)early"); - - /* Find the current repetition type. */ - const char *rpt_current; - char msg_rpt_current[BUFSIZ]; - switch (recur_def2char((*rpt)->type)) { - case 'D': - rpt_current = msg_rpt_daily; - break; - case 'W': - rpt_current = msg_rpt_weekly; - break; - case 'M': - rpt_current = msg_rpt_monthly; - break; - case 'Y': - rpt_current = msg_rpt_yearly; - break; - default: - /* NOTREACHED, but makes the compiler happier. */ - rpt_current = msg_rpt_daily; - } - - snprintf(msg_rpt_current, BUFSIZ, _("(currently using %s)"), rpt_current); - - char msg_rpt_asktype[BUFSIZ]; - snprintf(msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s", - msg_rpt_prefix, - msg_rpt_daily, - msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly, msg_rpt_current); - - const char *msg_rpt_choice = _("[dwmy]"); - const char *msg_wrong_freq = _("The frequence you entered is not valid."); - const char *msg_wrong_time = - _("Invalid time: start time must be before end time!"); - const char *msg_wrong_date = _("The entered date is not valid."); - const char *msg_fmts = - _("Possible formats are [%s] or '0' for an endless repetition."); - const char *msg_enter = _("Press [Enter] to continue"); - - switch (status_ask_choice(msg_rpt_asktype, msg_rpt_choice, 4)) { - case 1: - newtype = 'D'; - break; - case 2: - newtype = 'W'; - break; - case 3: - newtype = 'M'; - break; - case 4: - newtype = 'Y'; - break; - default: - return; - } - - do { - status_mesg(_("Enter the new repetition frequence:"), ""); - freqstr = mem_malloc(BUFSIZ); - snprintf(freqstr, BUFSIZ, "%d", (*rpt)->freq); - if (updatestring(win[STA].p, &freqstr, 0, 1) != GETSTRING_VALID) { - mem_free(freqstr); - return; - } - newfreq = atoi(freqstr); - mem_free(freqstr); - if (newfreq == 0) { - status_mesg(msg_wrong_freq, msg_enter); - wgetch(win[KEY].p); - } - } - while (newfreq == 0); - - for (;;) { - struct tm lt; - time_t t; - struct date new_date; - int newmonth, newday, newyear; - - snprintf(outstr, BUFSIZ, _("Enter the new ending date: [%s] or '0'"), - DATEFMT_DESC(conf.input_datefmt)); - status_mesg(outstr, ""); - timstr = date_sec2date_str((*rpt)->until, DATEFMT(conf.input_datefmt)); - if (updatestring(win[STA].p, &timstr, 0, 1) != GETSTRING_VALID) { - mem_free(timstr); - return; - } - if (strcmp(timstr, "0") == 0) { - newuntil = 0; - break; - } - if (!parse_date(timstr, conf.input_datefmt, &newyear, &newmonth, - &newday, ui_calendar_get_slctd_day())) { - snprintf(outstr, BUFSIZ, msg_fmts, DATEFMT_DESC(conf.input_datefmt)); - status_mesg(msg_wrong_date, outstr); - wgetch(win[KEY].p); - continue; - } - t = start; - localtime_r(&t, <); - new_date.dd = newday; - new_date.mm = newmonth; - new_date.yyyy = newyear; - newuntil = date2sec(new_date, lt.tm_hour, lt.tm_min); - if (newuntil >= start) - break; - status_mesg(msg_wrong_time, msg_enter); - wgetch(win[KEY].p); - } - - mem_free(timstr); - (*rpt)->type = recur_char2def(newtype); - (*rpt)->freq = newfreq; - (*rpt)->until = newuntil; + int newtype, newfreq; + long newuntil; + char outstr[BUFSIZ]; + char *freqstr, *timstr; + const char *msg_rpt_prefix = _("Enter the new repetition type:"); + const char *msg_rpt_daily = _("(d)aily"); + const char *msg_rpt_weekly = _("(w)eekly"); + const char *msg_rpt_monthly = _("(m)onthly"); + const char *msg_rpt_yearly = _("(y)early"); + + /* Find the current repetition type. */ + const char *rpt_current; + char msg_rpt_current[BUFSIZ]; + switch (recur_def2char((*rpt)->type)) { + case 'D': + rpt_current = msg_rpt_daily; + break; + case 'W': + rpt_current = msg_rpt_weekly; + break; + case 'M': + rpt_current = msg_rpt_monthly; + break; + case 'Y': + rpt_current = msg_rpt_yearly; + break; + default: + /* NOTREACHED, but makes the compiler happier. */ + rpt_current = msg_rpt_daily; + } + + snprintf(msg_rpt_current, BUFSIZ, _("(currently using %s)"), + rpt_current); + + char msg_rpt_asktype[BUFSIZ]; + snprintf(msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s", + msg_rpt_prefix, + msg_rpt_daily, + msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly, + msg_rpt_current); + + const char *msg_rpt_choice = _("[dwmy]"); + const char *msg_wrong_freq = + _("The frequence you entered is not valid."); + const char *msg_wrong_time = + _("Invalid time: start time must be before end time!"); + const char *msg_wrong_date = _("The entered date is not valid."); + const char *msg_fmts = + _("Possible formats are [%s] or '0' for an endless repetition."); + const char *msg_enter = _("Press [Enter] to continue"); + + switch (status_ask_choice(msg_rpt_asktype, msg_rpt_choice, 4)) { + case 1: + newtype = 'D'; + break; + case 2: + newtype = 'W'; + break; + case 3: + newtype = 'M'; + break; + case 4: + newtype = 'Y'; + break; + default: + return; + } + + do { + status_mesg(_("Enter the new repetition frequence:"), ""); + freqstr = mem_malloc(BUFSIZ); + snprintf(freqstr, BUFSIZ, "%d", (*rpt)->freq); + if (updatestring(win[STA].p, &freqstr, 0, 1) != + GETSTRING_VALID) { + mem_free(freqstr); + return; + } + newfreq = atoi(freqstr); + mem_free(freqstr); + if (newfreq == 0) { + status_mesg(msg_wrong_freq, msg_enter); + wgetch(win[KEY].p); + } + } + while (newfreq == 0); + + for (;;) { + struct tm lt; + time_t t; + struct date new_date; + int newmonth, newday, newyear; + + snprintf(outstr, BUFSIZ, + _("Enter the new ending date: [%s] or '0'"), + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(outstr, ""); + timstr = + date_sec2date_str((*rpt)->until, + DATEFMT(conf.input_datefmt)); + if (updatestring(win[STA].p, &timstr, 0, 1) != + GETSTRING_VALID) { + mem_free(timstr); + return; + } + if (strcmp(timstr, "0") == 0) { + newuntil = 0; + break; + } + if (!parse_date + (timstr, conf.input_datefmt, &newyear, &newmonth, + &newday, ui_calendar_get_slctd_day())) { + snprintf(outstr, BUFSIZ, msg_fmts, + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(msg_wrong_date, outstr); + wgetch(win[KEY].p); + continue; + } + t = start; + localtime_r(&t, <); + new_date.dd = newday; + new_date.mm = newmonth; + new_date.yyyy = newyear; + newuntil = date2sec(new_date, lt.tm_hour, lt.tm_min); + if (newuntil >= start) + break; + status_mesg(msg_wrong_time, msg_enter); + wgetch(win[KEY].p); + } + + mem_free(timstr); + (*rpt)->type = recur_char2def(newtype); + (*rpt)->freq = newfreq; + (*rpt)->until = newuntil; } /* Edit an already existing item. */ void ui_day_item_edit(void) { - struct day_item *p; - struct recur_event *re; - struct event *e; - struct recur_apoint *ra; - struct apoint *a; - int need_check_notify = 0; - - p = day_get_item(ui_day_hilt()); - - switch (p->type) { - case RECUR_EVNT: - re = p->item.rev; - const char *choice_recur_evnt[2] = { - _("Description"), - _("Repetition"), - }; - switch (status_ask_simplechoice(_("Edit: "), choice_recur_evnt, 2)) { - case 1: - update_desc(&re->mesg); - break; - case 2: - update_rept(&re->rpt, re->day); - break; - default: - return; - } - break; - case EVNT: - e = p->item.ev; - update_desc(&e->mesg); - break; - case RECUR_APPT: - ra = p->item.rapt; - const char *choice_recur_appt[4] = { - _("Start time"), - _("End time"), - _("Description"), - _("Repetition"), - }; - switch (status_ask_simplechoice(_("Edit: "), choice_recur_appt, 4)) { - case 1: - need_check_notify = 1; - update_start_time(&ra->start, &ra->dur); - break; - case 2: - update_duration(&ra->start, &ra->dur); - break; - case 3: - if (notify_bar()) - need_check_notify = notify_same_recur_item(ra); - update_desc(&ra->mesg); - break; - case 4: - need_check_notify = 1; - update_rept(&ra->rpt, ra->start); - break; - default: - return; - } - break; - case APPT: - a = p->item.apt; - const char *choice_appt[3] = { - _("Start time"), - _("End time"), - _("Description"), - }; - switch (status_ask_simplechoice(_("Edit: "), choice_appt, 3)) { - case 1: - need_check_notify = 1; - update_start_time(&a->start, &a->dur); - break; - case 2: - update_duration(&a->start, &a->dur); - break; - case 3: - if (notify_bar()) - need_check_notify = notify_same_item(a->start); - update_desc(&a->mesg); - break; - default: - return; - } - break; - } - - ui_calendar_monthly_view_cache_set_invalid(); - - if (need_check_notify) - notify_check_next_app(1); + struct day_item *p; + struct recur_event *re; + struct event *e; + struct recur_apoint *ra; + struct apoint *a; + int need_check_notify = 0; + + p = day_get_item(ui_day_hilt()); + + switch (p->type) { + case RECUR_EVNT: + re = p->item.rev; + const char *choice_recur_evnt[2] = { + _("Description"), + _("Repetition"), + }; + switch (status_ask_simplechoice + (_("Edit: "), choice_recur_evnt, 2)) { + case 1: + update_desc(&re->mesg); + break; + case 2: + update_rept(&re->rpt, re->day); + break; + default: + return; + } + break; + case EVNT: + e = p->item.ev; + update_desc(&e->mesg); + break; + case RECUR_APPT: + ra = p->item.rapt; + const char *choice_recur_appt[4] = { + _("Start time"), + _("End time"), + _("Description"), + _("Repetition"), + }; + switch (status_ask_simplechoice + (_("Edit: "), choice_recur_appt, 4)) { + case 1: + need_check_notify = 1; + update_start_time(&ra->start, &ra->dur); + break; + case 2: + update_duration(&ra->start, &ra->dur); + break; + case 3: + if (notify_bar()) + need_check_notify = + notify_same_recur_item(ra); + update_desc(&ra->mesg); + break; + case 4: + need_check_notify = 1; + update_rept(&ra->rpt, ra->start); + break; + default: + return; + } + break; + case APPT: + a = p->item.apt; + const char *choice_appt[3] = { + _("Start time"), + _("End time"), + _("Description"), + }; + switch (status_ask_simplechoice + (_("Edit: "), choice_appt, 3)) { + case 1: + need_check_notify = 1; + update_start_time(&a->start, &a->dur); + break; + case 2: + update_duration(&a->start, &a->dur); + break; + case 3: + if (notify_bar()) + need_check_notify = + notify_same_item(a->start); + update_desc(&a->mesg); + break; + default: + return; + } + break; + } + + ui_calendar_monthly_view_cache_set_invalid(); + + if (need_check_notify) + notify_check_next_app(1); } /* Pipe an appointment or event to an external program. */ void ui_day_item_pipe(void) { - char cmd[BUFSIZ] = ""; - char const *arg[] = { cmd, NULL }; - int pout; - int pid; - FILE *fpout; - struct day_item *p; - - status_mesg(_("Pipe item to external command:"), ""); - if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - - wins_prepare_external(); - if ((pid = shell_exec(NULL, &pout, *arg, arg))) { - fpout = fdopen(pout, "w"); - - p = day_get_item(ui_day_hilt()); - switch (p->type) { - case RECUR_EVNT: - recur_event_write(p->item.rev, fpout); - break; - case EVNT: - event_write(p->item.ev, fpout); - break; - case RECUR_APPT: - recur_apoint_write(p->item.rapt, fpout); - break; - case APPT: - apoint_write(p->item.apt, fpout); - break; - } - - fclose(fpout); - child_wait(NULL, &pout, pid); - press_any_key(); - } - wins_unprepare_external(); + char cmd[BUFSIZ] = ""; + char const *arg[] = { cmd, NULL }; + int pout; + int pid; + FILE *fpout; + struct day_item *p; + + status_mesg(_("Pipe item to external command:"), ""); + if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) + return; + + wins_prepare_external(); + if ((pid = shell_exec(NULL, &pout, *arg, arg))) { + fpout = fdopen(pout, "w"); + + p = day_get_item(ui_day_hilt()); + switch (p->type) { + case RECUR_EVNT: + recur_event_write(p->item.rev, fpout); + break; + case EVNT: + event_write(p->item.ev, fpout); + break; + case RECUR_APPT: + recur_apoint_write(p->item.rapt, fpout); + break; + case APPT: + apoint_write(p->item.apt, fpout); + break; + } + + fclose(fpout); + child_wait(NULL, &pout, pid); + press_any_key(); + } + wins_unprepare_external(); } /* @@ -407,177 +430,194 @@ void ui_day_item_add(void) { #define LTIME 6 #define LDUR 12 - const char *mesg_1 = - _("Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event : "); - const char *mesg_2 = - _ - ("Enter end time ([hh:mm] or [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); - const char *mesg_3 = _("Enter description :"); - const char *format_message_1 = - _("You entered an invalid start time, should be [hh:mm] or [hhmm]"); - const char *format_message_2 = - _ - ("Invalid end time/duration, should be [hh:mm], [hhmm], [+hh:mm], [+xxxdxxhxxm] or [+mm]"); - const char *enter_str = _("Press [Enter] to continue"); - char item_time[LDUR] = ""; - char item_mesg[BUFSIZ] = ""; - long apoint_start; - unsigned heures, minutes; - unsigned apoint_duration; - unsigned end_h, end_m; - int is_appointment = 1; - - /* Get the starting time */ - for (;;) { - status_mesg(mesg_1, ""); - if (getstring(win[STA].p, item_time, LTIME, 0, 1) == GETSTRING_ESC) - return; - if (strlen(item_time) == 0) { - is_appointment = 0; - break; - } - if (parse_time(item_time, &heures, &minutes) == 1) - break; - status_mesg(format_message_1, enter_str); - wgetch(win[KEY].p); - } - - /* - * Check if an event or appointment is entered, - * depending on the starting time, and record the - * corresponding item. - */ - if (is_appointment) { /* Get the appointment duration */ - item_time[0] = '\0'; - for (;;) { - status_mesg(mesg_2, ""); - if (getstring(win[STA].p, item_time, LDUR, 0, 1) == GETSTRING_ESC) - return; - if (*item_time == '+' && parse_duration(item_time + 1, - &apoint_duration) == 1) - break; - if (parse_time(item_time, &end_h, &end_m) == 1) { - if (end_h < heures || ((end_h == heures) && (end_m < minutes))) { - apoint_duration = MININSEC - minutes + end_m - + (24 + end_h - (heures + 1)) * MININSEC; - } else { - apoint_duration = MININSEC - minutes - + end_m + (end_h - (heures + 1)) * MININSEC; - } - break; - } - status_mesg(format_message_2, enter_str); - wgetch(win[KEY].p); - } - } - - status_mesg(mesg_3, ""); - if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) == GETSTRING_VALID) { - if (is_appointment) { - apoint_start = date2sec(*ui_calendar_get_slctd_day(), heures, minutes); - apoint_new(item_mesg, 0L, apoint_start, min2sec(apoint_duration), 0L); - if (notify_bar()) - notify_check_added(item_mesg, apoint_start, 0L); - } else { - event_new(item_mesg, 0L, date2sec(*ui_calendar_get_slctd_day(), 0, 0), 1); - } - - if (ui_day_hilt() == 0) - ui_day_hilt_increase(1); - } - - ui_calendar_monthly_view_cache_set_invalid(); - - wins_erase_status_bar(); + const char *mesg_1 = + _("Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event : "); + const char *mesg_2 = + _("Enter end time ([hh:mm] or [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); + const char *mesg_3 = _("Enter description :"); + const char *format_message_1 = + _("You entered an invalid start time, should be [hh:mm] or [hhmm]"); + const char *format_message_2 = + _("Invalid end time/duration, should be [hh:mm], [hhmm], [+hh:mm], [+xxxdxxhxxm] or [+mm]"); + const char *enter_str = _("Press [Enter] to continue"); + char item_time[LDUR] = ""; + char item_mesg[BUFSIZ] = ""; + long apoint_start; + unsigned heures, minutes; + unsigned apoint_duration; + unsigned end_h, end_m; + int is_appointment = 1; + + /* Get the starting time */ + for (;;) { + status_mesg(mesg_1, ""); + if (getstring(win[STA].p, item_time, LTIME, 0, 1) == + GETSTRING_ESC) + return; + if (strlen(item_time) == 0) { + is_appointment = 0; + break; + } + if (parse_time(item_time, &heures, &minutes) == 1) + break; + status_mesg(format_message_1, enter_str); + wgetch(win[KEY].p); + } + + /* + * Check if an event or appointment is entered, + * depending on the starting time, and record the + * corresponding item. + */ + if (is_appointment) { /* Get the appointment duration */ + item_time[0] = '\0'; + for (;;) { + status_mesg(mesg_2, ""); + if (getstring(win[STA].p, item_time, LDUR, 0, 1) == + GETSTRING_ESC) + return; + if (*item_time == '+' + && parse_duration(item_time + 1, + &apoint_duration) == 1) + break; + if (parse_time(item_time, &end_h, &end_m) == 1) { + if (end_h < heures + || ((end_h == heures) + && (end_m < minutes))) { + apoint_duration = + MININSEC - minutes + end_m + + (24 + end_h - + (heures + 1)) * MININSEC; + } else { + apoint_duration = + MININSEC - minutes + end_m + + (end_h - + (heures + 1)) * MININSEC; + } + break; + } + status_mesg(format_message_2, enter_str); + wgetch(win[KEY].p); + } + } + + status_mesg(mesg_3, ""); + if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) == + GETSTRING_VALID) { + if (is_appointment) { + apoint_start = + date2sec(*ui_calendar_get_slctd_day(), heures, + minutes); + apoint_new(item_mesg, 0L, apoint_start, + min2sec(apoint_duration), 0L); + if (notify_bar()) + notify_check_added(item_mesg, apoint_start, + 0L); + } else { + event_new(item_mesg, 0L, + date2sec(*ui_calendar_get_slctd_day(), 0, + 0), 1); + } + + if (ui_day_hilt() == 0) + ui_day_hilt_increase(1); + } + + ui_calendar_monthly_view_cache_set_invalid(); + + wins_erase_status_bar(); } /* Delete an item from the appointment list. */ void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) + unsigned reg) { - const char *del_app_str = _("Do you really want to delete this item ?"); - - const char *erase_warning = - _("This item is recurrent. " - "Delete (a)ll occurences or just this (o)ne ?"); - const char *erase_choices = _("[ao]"); - const int nb_erase_choices = 2; - - const char *note_warning = - _("This item has a note attached to it. " - "Delete (i)tem or just its (n)ote ?"); - const char *note_choices = _("[in]"); - const int nb_note_choices = 2; - - long date = ui_calendar_get_slctd_day_sec(); - int nb_items = *nb_apoints + *nb_events; - int to_be_removed = 0; - - if (nb_items == 0) - return; - - struct day_item *p = day_get_item(ui_day_hilt()); - - if (conf.confirm_delete) { - if (status_ask_bool(del_app_str) != 1) { - wins_erase_status_bar(); - return; - } - } - - if (day_item_get_note(p)) { - switch (status_ask_choice(note_warning, note_choices, nb_note_choices)) { - case 1: - break; - case 2: - day_item_erase_note(p); - return; - default: /* User escaped */ - return; - } - } - - if (p->type == RECUR_EVNT || p->type == RECUR_APPT) { - switch (status_ask_choice(erase_warning, erase_choices, nb_erase_choices)) { - case 1: - break; - case 2: - day_item_add_exc(p, date); - return; - default: - return; - } - } - - ui_day_item_cut_free(reg); - p = day_cut_item(date, ui_day_hilt()); - day_cut[reg].type = p->type; - day_cut[reg].item = p->item; - - switch (p->type) { - case EVNT: - case RECUR_EVNT: - (*nb_events)--; - to_be_removed = 1; - break; - case APPT: - case RECUR_APPT: - (*nb_apoints)--; - to_be_removed = 3; - break; - default: - EXIT(_("no such type")); - /* NOTREACHED */ - } - - ui_calendar_monthly_view_cache_set_invalid(); - - if (ui_day_hilt() > 1) - ui_day_hilt_decrease(1); - if (apad.first_onscreen >= to_be_removed) - apad.first_onscreen = apad.first_onscreen - to_be_removed; - if (nb_items == 1) - ui_day_hilt_set(0); + const char *del_app_str = + _("Do you really want to delete this item ?"); + + const char *erase_warning = + _("This item is recurrent. " + "Delete (a)ll occurences or just this (o)ne ?"); + const char *erase_choices = _("[ao]"); + const int nb_erase_choices = 2; + + const char *note_warning = + _("This item has a note attached to it. " + "Delete (i)tem or just its (n)ote ?"); + const char *note_choices = _("[in]"); + const int nb_note_choices = 2; + + long date = ui_calendar_get_slctd_day_sec(); + int nb_items = *nb_apoints + *nb_events; + int to_be_removed = 0; + + if (nb_items == 0) + return; + + struct day_item *p = day_get_item(ui_day_hilt()); + + if (conf.confirm_delete) { + if (status_ask_bool(del_app_str) != 1) { + wins_erase_status_bar(); + return; + } + } + + if (day_item_get_note(p)) { + switch (status_ask_choice + (note_warning, note_choices, nb_note_choices)) { + case 1: + break; + case 2: + day_item_erase_note(p); + return; + default: /* User escaped */ + return; + } + } + + if (p->type == RECUR_EVNT || p->type == RECUR_APPT) { + switch (status_ask_choice + (erase_warning, erase_choices, nb_erase_choices)) { + case 1: + break; + case 2: + day_item_add_exc(p, date); + return; + default: + return; + } + } + + ui_day_item_cut_free(reg); + p = day_cut_item(date, ui_day_hilt()); + day_cut[reg].type = p->type; + day_cut[reg].item = p->item; + + switch (p->type) { + case EVNT: + case RECUR_EVNT: + (*nb_events)--; + to_be_removed = 1; + break; + case APPT: + case RECUR_APPT: + (*nb_apoints)--; + to_be_removed = 3; + break; + default: + EXIT(_("no such type")); + /* NOTREACHED */ + } + + ui_calendar_monthly_view_cache_set_invalid(); + + if (ui_day_hilt() > 1) + ui_day_hilt_decrease(1); + if (apad.first_onscreen >= to_be_removed) + apad.first_onscreen = apad.first_onscreen - to_be_removed; + if (nb_items == 1) + ui_day_hilt_set(0); } /* @@ -589,211 +629,222 @@ void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, */ void ui_day_item_repeat(void) { - struct tm lt; - time_t t; - int year = 0, month = 0, day = 0; - struct date until_date; - char outstr[BUFSIZ]; - char user_input[BUFSIZ] = ""; - const char *msg_rpt_prefix = _("Enter the repetition type:"); - const char *msg_rpt_daily = _("(d)aily"); - const char *msg_rpt_weekly = _("(w)eekly"); - const char *msg_rpt_monthly = _("(m)onthly"); - const char *msg_rpt_yearly = _("(y)early"); - const char *msg_type_choice = _("[dwmy]"); - const char *mesg_freq_1 = _("Enter the repetition frequence:"); - const char *mesg_wrong_freq = _("The frequence you entered is not valid."); - const char *mesg_until_1 = - _("Enter the ending date: [%s] or '0' for an endless repetition"); - const char *mesg_wrong_1 = _("The entered date is not valid."); - const char *mesg_wrong_2 = - _("Possible formats are [%s] or '0' for an endless repetition"); - const char *wrong_type_1 = _("This item is already a repeated one."); - const char *wrong_type_2 = _("Press [ENTER] to continue."); - const char *mesg_older = - _("Sorry, the date you entered is older than the item start time."); - - char msg_asktype[BUFSIZ]; - snprintf(msg_asktype, BUFSIZ, "%s %s, %s, %s, %s", - msg_rpt_prefix, - msg_rpt_daily, msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly); - - int type = 0, freq = 0; - int item_nb; - struct day_item *p; - struct recur_apoint *ra; - long until, date; - - item_nb = ui_day_hilt(); - p = day_get_item(item_nb); - if (p->type != APPT && p->type != EVNT) { - status_mesg(wrong_type_1, wrong_type_2); - wgetch(win[KEY].p); - return; - } - - switch (status_ask_choice(msg_asktype, msg_type_choice, 4)) { - case 1: - type = RECUR_DAILY; - break; - case 2: - type = RECUR_WEEKLY; - break; - case 3: - type = RECUR_MONTHLY; - break; - case 4: - type = RECUR_YEARLY; - break; - default: - return; - } - - while (freq == 0) { - status_mesg(mesg_freq_1, ""); - if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - freq = atoi(user_input); - if (freq == 0) { - status_mesg(mesg_wrong_freq, wrong_type_2); - wgetch(win[KEY].p); - } - user_input[0] = '\0'; - } - - for (;;) { - snprintf(outstr, BUFSIZ, mesg_until_1, DATEFMT_DESC(conf.input_datefmt)); - status_mesg(outstr, ""); - if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - if (strlen(user_input) == 1 && strcmp(user_input, "0") == 0) { - until = 0; - break; - } - if (parse_date(user_input, conf.input_datefmt, - &year, &month, &day, ui_calendar_get_slctd_day())) { - t = p->start; - localtime_r(&t, <); - until_date.dd = day; - until_date.mm = month; - until_date.yyyy = year; - until = date2sec(until_date, lt.tm_hour, lt.tm_min); - if (until >= p->start) - break; - status_mesg(mesg_older, wrong_type_2); - wgetch(win[KEY].p); - } else { - snprintf(outstr, BUFSIZ, mesg_wrong_2, DATEFMT_DESC(conf.input_datefmt)); - status_mesg(mesg_wrong_1, outstr); - wgetch(win[KEY].p); - } - } - - date = ui_calendar_get_slctd_day_sec(); - if (p->type == EVNT) { - struct event *ev = p->item.ev; - recur_event_new(ev->mesg, ev->note, ev->day, ev->id, type, freq, until, - NULL); - } else if (p->type == APPT) { - struct apoint *apt = p->item.apt; - ra = recur_apoint_new(apt->mesg, apt->note, apt->start, apt->dur, - apt->state, type, freq, until, NULL); - if (notify_bar()) - notify_check_repeated(ra); - } else { - EXIT(_("wrong item type")); - /* NOTREACHED */ - } - - ui_day_item_cut_free(REG_BLACK_HOLE); - p = day_cut_item(date, item_nb); - day_cut[REG_BLACK_HOLE].type = p->type; - day_cut[REG_BLACK_HOLE].item = p->item; - - ui_calendar_monthly_view_cache_set_invalid(); + struct tm lt; + time_t t; + int year = 0, month = 0, day = 0; + struct date until_date; + char outstr[BUFSIZ]; + char user_input[BUFSIZ] = ""; + const char *msg_rpt_prefix = _("Enter the repetition type:"); + const char *msg_rpt_daily = _("(d)aily"); + const char *msg_rpt_weekly = _("(w)eekly"); + const char *msg_rpt_monthly = _("(m)onthly"); + const char *msg_rpt_yearly = _("(y)early"); + const char *msg_type_choice = _("[dwmy]"); + const char *mesg_freq_1 = _("Enter the repetition frequence:"); + const char *mesg_wrong_freq = + _("The frequence you entered is not valid."); + const char *mesg_until_1 = + _("Enter the ending date: [%s] or '0' for an endless repetition"); + const char *mesg_wrong_1 = _("The entered date is not valid."); + const char *mesg_wrong_2 = + _("Possible formats are [%s] or '0' for an endless repetition"); + const char *wrong_type_1 = + _("This item is already a repeated one."); + const char *wrong_type_2 = _("Press [ENTER] to continue."); + const char *mesg_older = + _("Sorry, the date you entered is older than the item start time."); + + char msg_asktype[BUFSIZ]; + snprintf(msg_asktype, BUFSIZ, "%s %s, %s, %s, %s", + msg_rpt_prefix, + msg_rpt_daily, msg_rpt_weekly, msg_rpt_monthly, + msg_rpt_yearly); + + int type = 0, freq = 0; + int item_nb; + struct day_item *p; + struct recur_apoint *ra; + long until, date; + + item_nb = ui_day_hilt(); + p = day_get_item(item_nb); + if (p->type != APPT && p->type != EVNT) { + status_mesg(wrong_type_1, wrong_type_2); + wgetch(win[KEY].p); + return; + } + + switch (status_ask_choice(msg_asktype, msg_type_choice, 4)) { + case 1: + type = RECUR_DAILY; + break; + case 2: + type = RECUR_WEEKLY; + break; + case 3: + type = RECUR_MONTHLY; + break; + case 4: + type = RECUR_YEARLY; + break; + default: + return; + } + + while (freq == 0) { + status_mesg(mesg_freq_1, ""); + if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != + GETSTRING_VALID) + return; + freq = atoi(user_input); + if (freq == 0) { + status_mesg(mesg_wrong_freq, wrong_type_2); + wgetch(win[KEY].p); + } + user_input[0] = '\0'; + } + + for (;;) { + snprintf(outstr, BUFSIZ, mesg_until_1, + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(outstr, ""); + if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != + GETSTRING_VALID) + return; + if (strlen(user_input) == 1 + && strcmp(user_input, "0") == 0) { + until = 0; + break; + } + if (parse_date(user_input, conf.input_datefmt, + &year, &month, &day, + ui_calendar_get_slctd_day())) { + t = p->start; + localtime_r(&t, <); + until_date.dd = day; + until_date.mm = month; + until_date.yyyy = year; + until = + date2sec(until_date, lt.tm_hour, lt.tm_min); + if (until >= p->start) + break; + status_mesg(mesg_older, wrong_type_2); + wgetch(win[KEY].p); + } else { + snprintf(outstr, BUFSIZ, mesg_wrong_2, + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(mesg_wrong_1, outstr); + wgetch(win[KEY].p); + } + } + + date = ui_calendar_get_slctd_day_sec(); + if (p->type == EVNT) { + struct event *ev = p->item.ev; + recur_event_new(ev->mesg, ev->note, ev->day, ev->id, type, + freq, until, NULL); + } else if (p->type == APPT) { + struct apoint *apt = p->item.apt; + ra = recur_apoint_new(apt->mesg, apt->note, apt->start, + apt->dur, apt->state, type, freq, + until, NULL); + if (notify_bar()) + notify_check_repeated(ra); + } else { + EXIT(_("wrong item type")); + /* NOTREACHED */ + } + + ui_day_item_cut_free(REG_BLACK_HOLE); + p = day_cut_item(date, item_nb); + day_cut[REG_BLACK_HOLE].type = p->type; + day_cut[REG_BLACK_HOLE].item = p->item; + + ui_calendar_monthly_view_cache_set_invalid(); } /* Free the current cut item, if any. */ void ui_day_item_cut_free(unsigned reg) { - switch (day_cut[reg].type) { - case 0: - /* No previous item, don't free anything. */ - break; - case APPT: - apoint_free(day_cut[reg].item.apt); - break; - case EVNT: - event_free(day_cut[reg].item.ev); - break; - case RECUR_APPT: - recur_apoint_free(day_cut[reg].item.rapt); - break; - case RECUR_EVNT: - recur_event_free(day_cut[reg].item.rev); - break; - } + switch (day_cut[reg].type) { + case 0: + /* No previous item, don't free anything. */ + break; + case APPT: + apoint_free(day_cut[reg].item.apt); + break; + case EVNT: + event_free(day_cut[reg].item.ev); + break; + case RECUR_APPT: + recur_apoint_free(day_cut[reg].item.rapt); + break; + case RECUR_EVNT: + recur_event_free(day_cut[reg].item.rev); + break; + } } /* Copy an item, so that it can be pasted somewhere else later. */ void ui_day_item_copy(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) + unsigned reg) { - const int NBITEMS = *nb_apoints + *nb_events; + const int NBITEMS = *nb_apoints + *nb_events; - if (NBITEMS == 0 || reg == REG_BLACK_HOLE) - return; + if (NBITEMS == 0 || reg == REG_BLACK_HOLE) + return; - ui_day_item_cut_free(reg); - day_item_fork(day_get_item(ui_day_hilt()), &day_cut[reg]); + ui_day_item_cut_free(reg); + day_item_fork(day_get_item(ui_day_hilt()), &day_cut[reg]); } /* Paste a previously cut item. */ void ui_day_item_paste(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) + unsigned reg) { - int item_type; - struct day_item day; + int item_type; + struct day_item day; - if (reg == REG_BLACK_HOLE || !day_cut[reg].type) - return; + if (reg == REG_BLACK_HOLE || !day_cut[reg].type) + return; - day_item_fork(&day_cut[reg], &day); - item_type = day_paste_item(&day, ui_calendar_get_slctd_day_sec()); + day_item_fork(&day_cut[reg], &day); + item_type = day_paste_item(&day, ui_calendar_get_slctd_day_sec()); - ui_calendar_monthly_view_cache_set_invalid(); + ui_calendar_monthly_view_cache_set_invalid(); - if (item_type == EVNT || item_type == RECUR_EVNT) - (*nb_events)++; - else if (item_type == APPT || item_type == RECUR_APPT) - (*nb_apoints)++; - else - return; + if (item_type == EVNT || item_type == RECUR_EVNT) + (*nb_events)++; + else if (item_type == APPT || item_type == RECUR_APPT) + (*nb_apoints)++; + else + return; - if (ui_day_hilt() == 0) - ui_day_hilt_increase(1); + if (ui_day_hilt() == 0) + ui_day_hilt_increase(1); } /* Sets which appointment is highlighted. */ void ui_day_hilt_set(int highlighted) { - hilt = highlighted; + hilt = highlighted; } void ui_day_hilt_decrease(int n) { - hilt -= n; + hilt -= n; } void ui_day_hilt_increase(int n) { - hilt += n; + hilt += n; } /* Return which appointment is highlighted. */ int ui_day_hilt(void) { - return hilt; + return hilt; } /* @@ -803,15 +854,15 @@ int ui_day_hilt(void) */ static int get_item_line(int item_nb, int nb_events_inday) { - int separator = 2; - int line = 0; - - if (item_nb <= nb_events_inday) - line = item_nb - 1; - else - line = nb_events_inday + separator - + (item_nb - (nb_events_inday + 1)) * 3 - 1; - return line; + int separator = 2; + int line = 0; + + if (item_nb <= nb_events_inday) + line = item_nb - 1; + else + line = nb_events_inday + separator + + (item_nb - (nb_events_inday + 1)) * 3 - 1; + return line; } /* @@ -820,19 +871,19 @@ static int get_item_line(int item_nb, int nb_events_inday) */ void ui_day_scroll_pad_down(int nb_events_inday, int win_length) { - int pad_last_line = 0; - int item_first_line = 0, item_last_line = 0; - int borders = 6; - int awin_length = win_length - borders; - - item_first_line = get_item_line(hilt, nb_events_inday); - if (hilt < nb_events_inday) - item_last_line = item_first_line; - else - item_last_line = item_first_line + 1; - pad_last_line = apad.first_onscreen + awin_length; - if (item_last_line >= pad_last_line) - apad.first_onscreen = item_last_line - awin_length; + int pad_last_line = 0; + int item_first_line = 0, item_last_line = 0; + int borders = 6; + int awin_length = win_length - borders; + + item_first_line = get_item_line(hilt, nb_events_inday); + if (hilt < nb_events_inday) + item_last_line = item_first_line; + else + item_last_line = item_first_line + 1; + pad_last_line = apad.first_onscreen + awin_length; + if (item_last_line >= pad_last_line) + apad.first_onscreen = item_last_line - awin_length; } /* @@ -841,56 +892,62 @@ void ui_day_scroll_pad_down(int nb_events_inday, int win_length) */ void ui_day_scroll_pad_up(int nb_events_inday) { - int item_first_line = 0; + int item_first_line = 0; - item_first_line = get_item_line(hilt, nb_events_inday); - if (item_first_line < apad.first_onscreen) - apad.first_onscreen = item_first_line; + item_first_line = get_item_line(hilt, nb_events_inday); + if (item_first_line < apad.first_onscreen) + apad.first_onscreen = item_first_line; } /* Updates the Appointment panel */ void ui_day_update_panel(int which_pan) { - int title_xpos; - int bordr = 1; - int title_lines = conf.compact_panels ? 1 : 3; - int app_width = win[APP].w - bordr; - int app_length = win[APP].h - bordr - title_lines; - long date; - struct date slctd_date; - - /* variable inits */ - slctd_date = *ui_calendar_get_slctd_day(); - title_xpos = win[APP].w - (strlen(_(monthnames[slctd_date.mm - 1])) + 16); - if (slctd_date.dd < 10) - title_xpos++; - date = date2sec(slctd_date, 0, 0); - day_write_pad(date, app_width, app_length, (which_pan == APP) ? hilt : 0); - - /* Print current date in the top right window corner. */ - erase_window_part(win[APP].p, 1, title_lines, win[APP].w - 2, win[APP].h - 2); - custom_apply_attr(win[APP].p, ATTR_HIGHEST); - mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d", - ui_calendar_get_pom(date), _(monthnames[slctd_date.mm - 1]), - slctd_date.dd, slctd_date.yyyy); - custom_remove_attr(win[APP].p, ATTR_HIGHEST); - - /* Draw the scrollbar if necessary. */ - if ((apad.length >= app_length) || (apad.first_onscreen > 0)) { - int sbar_length = app_length * app_length / apad.length; - int highend = app_length * apad.first_onscreen / apad.length; - unsigned hilt_bar = (which_pan == APP) ? 1 : 0; - int sbar_top = highend + title_lines + 1; - - if ((sbar_top + sbar_length) > win[APP].h - 1) - sbar_length = win[APP].h - 1 - sbar_top; - draw_scrollbar(win[APP].p, sbar_top, win[APP].w - 2, sbar_length, - title_lines + 1, win[APP].h - 1, hilt_bar); - } - - wnoutrefresh(win[APP].p); - pnoutrefresh(apad.ptrwin, apad.first_onscreen, 0, - win[APP].y + title_lines + 1, win[APP].x + bordr, - win[APP].y + win[APP].h - 2 * bordr, - win[APP].x + win[APP].w - 3 * bordr); + int title_xpos; + int bordr = 1; + int title_lines = conf.compact_panels ? 1 : 3; + int app_width = win[APP].w - bordr; + int app_length = win[APP].h - bordr - title_lines; + long date; + struct date slctd_date; + + /* variable inits */ + slctd_date = *ui_calendar_get_slctd_day(); + title_xpos = + win[APP].w - (strlen(_(monthnames[slctd_date.mm - 1])) + 16); + if (slctd_date.dd < 10) + title_xpos++; + date = date2sec(slctd_date, 0, 0); + day_write_pad(date, app_width, app_length, + (which_pan == APP) ? hilt : 0); + + /* Print current date in the top right window corner. */ + erase_window_part(win[APP].p, 1, title_lines, win[APP].w - 2, + win[APP].h - 2); + custom_apply_attr(win[APP].p, ATTR_HIGHEST); + mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d", + ui_calendar_get_pom(date), + _(monthnames[slctd_date.mm - 1]), slctd_date.dd, + slctd_date.yyyy); + custom_remove_attr(win[APP].p, ATTR_HIGHEST); + + /* Draw the scrollbar if necessary. */ + if ((apad.length >= app_length) || (apad.first_onscreen > 0)) { + int sbar_length = app_length * app_length / apad.length; + int highend = + app_length * apad.first_onscreen / apad.length; + unsigned hilt_bar = (which_pan == APP) ? 1 : 0; + int sbar_top = highend + title_lines + 1; + + if ((sbar_top + sbar_length) > win[APP].h - 1) + sbar_length = win[APP].h - 1 - sbar_top; + draw_scrollbar(win[APP].p, sbar_top, win[APP].w - 2, + sbar_length, title_lines + 1, + win[APP].h - 1, hilt_bar); + } + + wnoutrefresh(win[APP].p); + pnoutrefresh(apad.ptrwin, apad.first_onscreen, 0, + win[APP].y + title_lines + 1, win[APP].x + bordr, + win[APP].y + win[APP].h - 2 * bordr, + win[APP].x + win[APP].w - 3 * bordr); } diff --git a/src/ui-todo.c b/src/ui-todo.c index baecff8..0e3852c 100644 --- a/src/ui-todo.c +++ b/src/ui-todo.c @@ -44,147 +44,152 @@ static char *msgsav; /* Request user to enter a new todo item. */ void ui_todo_add(void) { - int ch = 0; - const char *mesg = _("Enter the new ToDo item : "); - const char *mesg_id = - _("Enter the ToDo priority [1 (highest) - 9 (lowest)] :"); - char todo_input[BUFSIZ] = ""; - - status_mesg(mesg, ""); - if (getstring(win[STA].p, todo_input, BUFSIZ, 0, 1) == GETSTRING_VALID) { - while ((ch < '1') || (ch > '9')) { - status_mesg(mesg_id, ""); - ch = wgetch(win[KEY].p); - } - todo_add(todo_input, ch - '0', NULL); - ui_todo_set_nb(ui_todo_nb() + 1); - } + int ch = 0; + const char *mesg = _("Enter the new ToDo item : "); + const char *mesg_id = + _("Enter the ToDo priority [1 (highest) - 9 (lowest)] :"); + char todo_input[BUFSIZ] = ""; + + status_mesg(mesg, ""); + if (getstring(win[STA].p, todo_input, BUFSIZ, 0, 1) == + GETSTRING_VALID) { + while ((ch < '1') || (ch > '9')) { + status_mesg(mesg_id, ""); + ch = wgetch(win[KEY].p); + } + todo_add(todo_input, ch - '0', NULL); + ui_todo_set_nb(ui_todo_nb() + 1); + } } /* Delete an item from the ToDo list. */ void ui_todo_delete(void) { - const char *del_todo_str = _("Do you really want to delete this task ?"); - const char *erase_warning = - _("This item has a note attached to it. " - "Delete (t)odo or just its (n)ote ?"); - const char *erase_choice = _("[tn]"); - const int nb_erase_choice = 2; - int answer; - - if ((ui_todo_nb() <= 0) || - (conf.confirm_delete && (status_ask_bool(del_todo_str) != 1))) { - wins_erase_status_bar(); - return; - } - - /* This todo item doesn't have any note associated. */ - if (todo_get_item(ui_todo_hilt())->note == NULL) - answer = 1; - else - answer = status_ask_choice(erase_warning, erase_choice, nb_erase_choice); - - switch (answer) { - case 1: - todo_delete(todo_get_item(ui_todo_hilt())); - ui_todo_set_nb(ui_todo_nb() - 1); - if (ui_todo_hilt() > 1) - ui_todo_hilt_decrease(1); - if (ui_todo_nb() == 0) - ui_todo_hilt_set(0); - if (ui_todo_hilt_pos() < 0) - ui_todo_first_decrease(1); - break; - case 2: - todo_delete_note(todo_get_item(ui_todo_hilt())); - break; - default: - wins_erase_status_bar(); - return; - } + const char *del_todo_str = + _("Do you really want to delete this task ?"); + const char *erase_warning = + _("This item has a note attached to it. " + "Delete (t)odo or just its (n)ote ?"); + const char *erase_choice = _("[tn]"); + const int nb_erase_choice = 2; + int answer; + + if ((ui_todo_nb() <= 0) || + (conf.confirm_delete + && (status_ask_bool(del_todo_str) != 1))) { + wins_erase_status_bar(); + return; + } + + /* This todo item doesn't have any note associated. */ + if (todo_get_item(ui_todo_hilt())->note == NULL) + answer = 1; + else + answer = + status_ask_choice(erase_warning, erase_choice, + nb_erase_choice); + + switch (answer) { + case 1: + todo_delete(todo_get_item(ui_todo_hilt())); + ui_todo_set_nb(ui_todo_nb() - 1); + if (ui_todo_hilt() > 1) + ui_todo_hilt_decrease(1); + if (ui_todo_nb() == 0) + ui_todo_hilt_set(0); + if (ui_todo_hilt_pos() < 0) + ui_todo_first_decrease(1); + break; + case 2: + todo_delete_note(todo_get_item(ui_todo_hilt())); + break; + default: + wins_erase_status_bar(); + return; + } } /* Edit the description of an already existing todo item. */ void ui_todo_edit(void) { - struct todo *i; - const char *mesg = _("Enter the new ToDo description :"); + struct todo *i; + const char *mesg = _("Enter the new ToDo description :"); - status_mesg(mesg, ""); - i = todo_get_item(ui_todo_hilt()); - updatestring(win[STA].p, &i->mesg, 0, 1); + status_mesg(mesg, ""); + i = todo_get_item(ui_todo_hilt()); + updatestring(win[STA].p, &i->mesg, 0, 1); } /* Pipe a todo item to an external program. */ void ui_todo_pipe(void) { - char cmd[BUFSIZ] = ""; - char const *arg[] = { cmd, NULL }; - int pout; - int pid; - FILE *fpout; - struct todo *todo; - - status_mesg(_("Pipe item to external command:"), ""); - if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - - wins_prepare_external(); - if ((pid = shell_exec(NULL, &pout, *arg, arg))) { - fpout = fdopen(pout, "w"); - - todo = todo_get_item(ui_todo_hilt()); - todo_write(todo, fpout); - - fclose(fpout); - child_wait(NULL, &pout, pid); - press_any_key(); - } - wins_unprepare_external(); + char cmd[BUFSIZ] = ""; + char const *arg[] = { cmd, NULL }; + int pout; + int pid; + FILE *fpout; + struct todo *todo; + + status_mesg(_("Pipe item to external command:"), ""); + if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) + return; + + wins_prepare_external(); + if ((pid = shell_exec(NULL, &pout, *arg, arg))) { + fpout = fdopen(pout, "w"); + + todo = todo_get_item(ui_todo_hilt()); + todo_write(todo, fpout); + + fclose(fpout); + child_wait(NULL, &pout, pid); + press_any_key(); + } + wins_unprepare_external(); } /* Sets which todo is highlighted. */ void ui_todo_hilt_set(int highlighted) { - hilt = highlighted; + hilt = highlighted; } void ui_todo_hilt_decrease(int n) { - hilt -= n; + hilt -= n; } void ui_todo_hilt_increase(int n) { - hilt += n; + hilt += n; } /* Return which todo is highlighted. */ int ui_todo_hilt(void) { - return hilt; + return hilt; } /* Set the number of todos. */ void ui_todo_set_nb(int nb) { - todos = nb; + todos = nb; } /* Set which one is the first todo to be displayed. */ void ui_todo_set_first(int nb) { - first = nb; + first = nb; } void ui_todo_first_increase(int n) { - first += n; + first += n; } void ui_todo_first_decrease(int n) { - first -= n; + first -= n; } /* @@ -193,118 +198,121 @@ void ui_todo_first_decrease(int n) */ int ui_todo_hilt_pos(void) { - return hilt - first; + return hilt - first; } /* Return the number of todos. */ int ui_todo_nb(void) { - return todos; + return todos; } /* Return the last visited todo. */ char *ui_todo_saved_mesg(void) { - return msgsav; + return msgsav; } /* Display todo items in the corresponding panel. */ static void -display_todo_item(int incolor, char *msg, int prio, int note, int width, int y, - int x) +display_todo_item(int incolor, char *msg, int prio, int note, int width, + int y, int x) { - WINDOW *w; - int ch_note; - char buf[width * UTF8_MAXLEN], priostr[2]; - int i; - - w = win[TOD].p; - ch_note = (note) ? '>' : '.'; - if (prio > 0) - snprintf(priostr, sizeof priostr, "%d", prio); - else - strncpy(priostr, "X", sizeof priostr); - - if (incolor == 0) - custom_apply_attr(w, ATTR_HIGHEST); - if (utf8_strwidth(msg) < width) { - mvwprintw(w, y, x, "%s%c %s", priostr, ch_note, msg); - } else { - for (i = 0; msg[i] && width > 0; i++) { - if (!UTF8_ISCONT(msg[i])) - width -= utf8_width(&msg[i]); - buf[i] = msg[i]; - } - if (i) - buf[i - 1] = 0; - else - buf[0] = 0; - mvwprintw(w, y, x, "%s%c %s...", priostr, ch_note, buf); - } - if (incolor == 0) - custom_remove_attr(w, ATTR_HIGHEST); + WINDOW *w; + int ch_note; + char buf[width * UTF8_MAXLEN], priostr[2]; + int i; + + w = win[TOD].p; + ch_note = (note) ? '>' : '.'; + if (prio > 0) + snprintf(priostr, sizeof priostr, "%d", prio); + else + strncpy(priostr, "X", sizeof priostr); + + if (incolor == 0) + custom_apply_attr(w, ATTR_HIGHEST); + if (utf8_strwidth(msg) < width) { + mvwprintw(w, y, x, "%s%c %s", priostr, ch_note, msg); + } else { + for (i = 0; msg[i] && width > 0; i++) { + if (!UTF8_ISCONT(msg[i])) + width -= utf8_width(&msg[i]); + buf[i] = msg[i]; + } + if (i) + buf[i - 1] = 0; + else + buf[0] = 0; + mvwprintw(w, y, x, "%s%c %s...", priostr, ch_note, buf); + } + if (incolor == 0) + custom_remove_attr(w, ATTR_HIGHEST); } /* Updates the ToDo panel. */ void ui_todo_update_panel(int which_pan) { - llist_item_t *i; - int len = win[TOD].w - 8; - int num_todo = 0; - int title_lines = conf.compact_panels ? 1 : 3; - int y_offset = title_lines, x_offset = 1; - int t_realpos = -1; - int todo_lines = 1; - int max_items = win[TOD].h - 4; - int incolor = -1; - - if ((int)win[TOD].h < 4) - return; - - /* Print todo item in the panel. */ - erase_window_part(win[TOD].p, 1, title_lines, win[TOD].w - 2, win[TOD].h - 2); - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_TS_GET_DATA(i); - num_todo++; - t_realpos = num_todo - first; - incolor = (which_pan == TOD) ? num_todo - hilt : num_todo; - if (incolor == 0) - msgsav = todo->mesg; - if (t_realpos >= 0 && t_realpos < max_items) { - display_todo_item(incolor, todo->mesg, todo->id, - (todo->note != NULL) ? 1 : 0, len, y_offset, x_offset); - y_offset = y_offset + todo_lines; - } - } - - /* Draw the scrollbar if necessary. */ - if (todos > max_items) { - int sbar_length = max_items * (max_items + 1) / todos; - int highend = max_items * first / todos; - unsigned hilt_bar = (which_pan == TOD) ? 1 : 0; - int sbar_top = highend + title_lines; - - if ((sbar_top + sbar_length) > win[TOD].h - 1) - sbar_length = win[TOD].h - 1 - sbar_top; - draw_scrollbar(win[TOD].p, sbar_top, win[TOD].w - 2, - sbar_length, title_lines, win[TOD].h - 1, hilt_bar); - } - - wnoutrefresh(win[TOD].p); + llist_item_t *i; + int len = win[TOD].w - 8; + int num_todo = 0; + int title_lines = conf.compact_panels ? 1 : 3; + int y_offset = title_lines, x_offset = 1; + int t_realpos = -1; + int todo_lines = 1; + int max_items = win[TOD].h - 4; + int incolor = -1; + + if ((int)win[TOD].h < 4) + return; + + /* Print todo item in the panel. */ + erase_window_part(win[TOD].p, 1, title_lines, win[TOD].w - 2, + win[TOD].h - 2); + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_TS_GET_DATA(i); + num_todo++; + t_realpos = num_todo - first; + incolor = (which_pan == TOD) ? num_todo - hilt : num_todo; + if (incolor == 0) + msgsav = todo->mesg; + if (t_realpos >= 0 && t_realpos < max_items) { + display_todo_item(incolor, todo->mesg, todo->id, + (todo->note != NULL) ? 1 : 0, + len, y_offset, x_offset); + y_offset = y_offset + todo_lines; + } + } + + /* Draw the scrollbar if necessary. */ + if (todos > max_items) { + int sbar_length = max_items * (max_items + 1) / todos; + int highend = max_items * first / todos; + unsigned hilt_bar = (which_pan == TOD) ? 1 : 0; + int sbar_top = highend + title_lines; + + if ((sbar_top + sbar_length) > win[TOD].h - 1) + sbar_length = win[TOD].h - 1 - sbar_top; + draw_scrollbar(win[TOD].p, sbar_top, win[TOD].w - 2, + sbar_length, title_lines, win[TOD].h - 1, + hilt_bar); + } + + wnoutrefresh(win[TOD].p); } /* Change an item priority by pressing '+' or '-' inside TODO panel. */ void ui_todo_chg_priority(struct todo *todo, int diff) { - int id = todo->id + diff; - struct todo *todo_new; + int id = todo->id + diff; + struct todo *todo_new; - if (id < 1) - id = 1; - else if (id > 9) - id = 9; + if (id < 1) + id = 1; + else if (id > 9) + id = 9; - todo_new = todo_add(todo->mesg, id, todo->note); - todo_delete(todo); - hilt = todo_get_position(todo_new); + todo_new = todo_add(todo->mesg, id, todo->note); + todo_delete(todo); + hilt = todo_get_position(todo_new); } @@ -37,300 +37,302 @@ #include "calcurse.h" struct utf8_range { - int min, max, width; + int min, max, width; }; static const struct utf8_range utf8_widthtab[] = { - {0x00300, 0x0036f, 0}, - {0x00483, 0x00489, 0}, - {0x00591, 0x005bd, 0}, - {0x005bf, 0x005bf, 0}, - {0x005c1, 0x005c2, 0}, - {0x005c4, 0x005c5, 0}, - {0x005c7, 0x005c7, 0}, - {0x00610, 0x0061a, 0}, - {0x0064b, 0x0065e, 0}, - {0x00670, 0x00670, 0}, - {0x006d6, 0x006dc, 0}, - {0x006de, 0x006e4, 0}, - {0x006e7, 0x006e8, 0}, - {0x006ea, 0x006ed, 0}, - {0x00711, 0x00711, 0}, - {0x00730, 0x0074a, 0}, - {0x007a6, 0x007b0, 0}, - {0x007eb, 0x007f3, 0}, - {0x00816, 0x00819, 0}, - {0x0081b, 0x00823, 0}, - {0x00825, 0x00827, 0}, - {0x00829, 0x0082d, 0}, - {0x00900, 0x00903, 0}, - {0x0093c, 0x0093c, 0}, - {0x0093e, 0x0094e, 0}, - {0x00951, 0x00955, 0}, - {0x00962, 0x00963, 0}, - {0x00981, 0x00983, 0}, - {0x009bc, 0x009bc, 0}, - {0x009be, 0x009c4, 0}, - {0x009c7, 0x009c8, 0}, - {0x009cb, 0x009cd, 0}, - {0x009d7, 0x009d7, 0}, - {0x009e2, 0x009e3, 0}, - {0x00a01, 0x00a03, 0}, - {0x00a3c, 0x00a3c, 0}, - {0x00a3e, 0x00a42, 0}, - {0x00a47, 0x00a48, 0}, - {0x00a4b, 0x00a4d, 0}, - {0x00a51, 0x00a51, 0}, - {0x00a70, 0x00a71, 0}, - {0x00a75, 0x00a75, 0}, - {0x00a81, 0x00a83, 0}, - {0x00abc, 0x00abc, 0}, - {0x00abe, 0x00ac5, 0}, - {0x00ac7, 0x00ac9, 0}, - {0x00acb, 0x00acd, 0}, - {0x00ae2, 0x00ae3, 0}, - {0x00b01, 0x00b03, 0}, - {0x00b3c, 0x00b3c, 0}, - {0x00b3e, 0x00b44, 0}, - {0x00b47, 0x00b48, 0}, - {0x00b4b, 0x00b4d, 0}, - {0x00b56, 0x00b57, 0}, - {0x00b62, 0x00b63, 0}, - {0x00b82, 0x00b82, 0}, - {0x00bbe, 0x00bc2, 0}, - {0x00bc6, 0x00bc8, 0}, - {0x00bca, 0x00bcd, 0}, - {0x00bd7, 0x00bd7, 0}, - {0x00c01, 0x00c03, 0}, - {0x00c3e, 0x00c44, 0}, - {0x00c46, 0x00c48, 0}, - {0x00c4a, 0x00c4d, 0}, - {0x00c55, 0x00c56, 0}, - {0x00c62, 0x00c63, 0}, - {0x00c82, 0x00c83, 0}, - {0x00cbc, 0x00cbc, 0}, - {0x00cbe, 0x00cc4, 0}, - {0x00cc6, 0x00cc8, 0}, - {0x00cca, 0x00ccd, 0}, - {0x00cd5, 0x00cd6, 0}, - {0x00ce2, 0x00ce3, 0}, - {0x00d02, 0x00d03, 0}, - {0x00d3e, 0x00d44, 0}, - {0x00d46, 0x00d48, 0}, - {0x00d4a, 0x00d4d, 0}, - {0x00d57, 0x00d57, 0}, - {0x00d62, 0x00d63, 0}, - {0x00d82, 0x00d83, 0}, - {0x00dca, 0x00dca, 0}, - {0x00dcf, 0x00dd4, 0}, - {0x00dd6, 0x00dd6, 0}, - {0x00dd8, 0x00ddf, 0}, - {0x00df2, 0x00df3, 0}, - {0x00e31, 0x00e31, 0}, - {0x00e34, 0x00e3a, 0}, - {0x00e47, 0x00e4e, 0}, - {0x00eb1, 0x00eb1, 0}, - {0x00eb4, 0x00eb9, 0}, - {0x00ebb, 0x00ebc, 0}, - {0x00ec8, 0x00ecd, 0}, - {0x00f18, 0x00f19, 0}, - {0x00f35, 0x00f35, 0}, - {0x00f37, 0x00f37, 0}, - {0x00f39, 0x00f39, 0}, - {0x00f3e, 0x00f3f, 0}, - {0x00f71, 0x00f84, 0}, - {0x00f86, 0x00f87, 0}, - {0x00f90, 0x00f97, 0}, - {0x00f99, 0x00fbc, 0}, - {0x00fc6, 0x00fc6, 0}, - {0x0102b, 0x0103e, 0}, - {0x01056, 0x01059, 0}, - {0x0105e, 0x01060, 0}, - {0x01062, 0x01064, 0}, - {0x01067, 0x0106d, 0}, - {0x01071, 0x01074, 0}, - {0x01082, 0x0108d, 0}, - {0x0108f, 0x0108f, 0}, - {0x0109a, 0x0109d, 0}, - {0x01100, 0x0115f, 2}, - {0x011a3, 0x011a7, 2}, - {0x011fa, 0x011ff, 2}, - {0x0135f, 0x0135f, 0}, - {0x01712, 0x01714, 0}, - {0x01732, 0x01734, 0}, - {0x01752, 0x01753, 0}, - {0x01772, 0x01773, 0}, - {0x017b6, 0x017d3, 0}, - {0x017dd, 0x017dd, 0}, - {0x0180b, 0x0180d, 0}, - {0x018a9, 0x018a9, 0}, - {0x01920, 0x0192b, 0}, - {0x01930, 0x0193b, 0}, - {0x019b0, 0x019c0, 0}, - {0x019c8, 0x019c9, 0}, - {0x01a17, 0x01a1b, 0}, - {0x01a55, 0x01a5e, 0}, - {0x01a60, 0x01a7c, 0}, - {0x01a7f, 0x01a7f, 0}, - {0x01b00, 0x01b04, 0}, - {0x01b34, 0x01b44, 0}, - {0x01b6b, 0x01b73, 0}, - {0x01b80, 0x01b82, 0}, - {0x01ba1, 0x01baa, 0}, - {0x01c24, 0x01c37, 0}, - {0x01cd0, 0x01cd2, 0}, - {0x01cd4, 0x01ce8, 0}, - {0x01ced, 0x01ced, 0}, - {0x01cf2, 0x01cf2, 0}, - {0x01dc0, 0x01de6, 0}, - {0x01dfd, 0x01dff, 0}, - {0x020d0, 0x020f0, 0}, - {0x02329, 0x0232a, 2}, - {0x02cef, 0x02cf1, 0}, - {0x02de0, 0x02dff, 0}, - {0x02e80, 0x02e99, 2}, - {0x02e9b, 0x02ef3, 2}, - {0x02f00, 0x02fd5, 2}, - {0x02ff0, 0x02ffb, 2}, - {0x03000, 0x03029, 2}, - {0x0302a, 0x0302f, 0}, - {0x03030, 0x0303e, 2}, - {0x03041, 0x03096, 2}, - {0x03099, 0x0309a, 0}, - {0x0309b, 0x030ff, 2}, - {0x03105, 0x0312d, 2}, - {0x03131, 0x0318e, 2}, - {0x03190, 0x031b7, 2}, - {0x031c0, 0x031e3, 2}, - {0x031f0, 0x0321e, 2}, - {0x03220, 0x03247, 2}, - {0x03250, 0x032fe, 2}, - {0x03300, 0x04dbf, 2}, - {0x04e00, 0x0a48c, 2}, - {0x0a490, 0x0a4c6, 2}, - {0x0a66f, 0x0a672, 0}, - {0x0a67c, 0x0a67d, 0}, - {0x0a6f0, 0x0a6f1, 0}, - {0x0a802, 0x0a802, 0}, - {0x0a806, 0x0a806, 0}, - {0x0a80b, 0x0a80b, 0}, - {0x0a823, 0x0a827, 0}, - {0x0a880, 0x0a881, 0}, - {0x0a8b4, 0x0a8c4, 0}, - {0x0a8e0, 0x0a8f1, 0}, - {0x0a926, 0x0a92d, 0}, - {0x0a947, 0x0a953, 0}, - {0x0a960, 0x0a97c, 2}, - {0x0a980, 0x0a983, 0}, - {0x0a9b3, 0x0a9c0, 0}, - {0x0aa29, 0x0aa36, 0}, - {0x0aa43, 0x0aa43, 0}, - {0x0aa4c, 0x0aa4d, 0}, - {0x0aa7b, 0x0aa7b, 0}, - {0x0aab0, 0x0aab0, 0}, - {0x0aab2, 0x0aab4, 0}, - {0x0aab7, 0x0aab8, 0}, - {0x0aabe, 0x0aabf, 0}, - {0x0aac1, 0x0aac1, 0}, - {0x0abe3, 0x0abea, 0}, - {0x0abec, 0x0abed, 0}, - {0x0ac00, 0x0d7a3, 2}, - {0x0d7b0, 0x0d7c6, 2}, - {0x0d7cb, 0x0d7fb, 2}, - {0x0f900, 0x0faff, 2}, - {0x0fb1e, 0x0fb1e, 0}, - {0x0fe00, 0x0fe0f, 0}, - {0x0fe10, 0x0fe19, 2}, - {0x0fe20, 0x0fe26, 0}, - {0x0fe30, 0x0fe52, 2}, - {0x0fe54, 0x0fe66, 2}, - {0x0fe68, 0x0fe6b, 2}, - {0x0ff01, 0x0ff60, 2}, - {0x0ffe0, 0x0ffe6, 2}, - {0x101fd, 0x101fd, 0}, - {0x10a01, 0x10a03, 0}, - {0x10a05, 0x10a06, 0}, - {0x10a0c, 0x10a0f, 0}, - {0x10a38, 0x10a3a, 0}, - {0x10a3f, 0x10a3f, 0}, - {0x11080, 0x11082, 0}, - {0x110b0, 0x110ba, 0}, - {0x1d165, 0x1d169, 0}, - {0x1d16d, 0x1d172, 0}, - {0x1d17b, 0x1d182, 0}, - {0x1d185, 0x1d18b, 0}, - {0x1d1aa, 0x1d1ad, 0}, - {0x1d242, 0x1d244, 0}, - {0x1f200, 0x1f200, 2}, - {0x1f210, 0x1f231, 2}, - {0x1f240, 0x1f248, 2}, - {0x20000, 0x2fffd, 2}, - {0x30000, 0x3fffd, 2}, - {0xe0100, 0xe01ef, 0} + {0x00300, 0x0036f, 0}, + {0x00483, 0x00489, 0}, + {0x00591, 0x005bd, 0}, + {0x005bf, 0x005bf, 0}, + {0x005c1, 0x005c2, 0}, + {0x005c4, 0x005c5, 0}, + {0x005c7, 0x005c7, 0}, + {0x00610, 0x0061a, 0}, + {0x0064b, 0x0065e, 0}, + {0x00670, 0x00670, 0}, + {0x006d6, 0x006dc, 0}, + {0x006de, 0x006e4, 0}, + {0x006e7, 0x006e8, 0}, + {0x006ea, 0x006ed, 0}, + {0x00711, 0x00711, 0}, + {0x00730, 0x0074a, 0}, + {0x007a6, 0x007b0, 0}, + {0x007eb, 0x007f3, 0}, + {0x00816, 0x00819, 0}, + {0x0081b, 0x00823, 0}, + {0x00825, 0x00827, 0}, + {0x00829, 0x0082d, 0}, + {0x00900, 0x00903, 0}, + {0x0093c, 0x0093c, 0}, + {0x0093e, 0x0094e, 0}, + {0x00951, 0x00955, 0}, + {0x00962, 0x00963, 0}, + {0x00981, 0x00983, 0}, + {0x009bc, 0x009bc, 0}, + {0x009be, 0x009c4, 0}, + {0x009c7, 0x009c8, 0}, + {0x009cb, 0x009cd, 0}, + {0x009d7, 0x009d7, 0}, + {0x009e2, 0x009e3, 0}, + {0x00a01, 0x00a03, 0}, + {0x00a3c, 0x00a3c, 0}, + {0x00a3e, 0x00a42, 0}, + {0x00a47, 0x00a48, 0}, + {0x00a4b, 0x00a4d, 0}, + {0x00a51, 0x00a51, 0}, + {0x00a70, 0x00a71, 0}, + {0x00a75, 0x00a75, 0}, + {0x00a81, 0x00a83, 0}, + {0x00abc, 0x00abc, 0}, + {0x00abe, 0x00ac5, 0}, + {0x00ac7, 0x00ac9, 0}, + {0x00acb, 0x00acd, 0}, + {0x00ae2, 0x00ae3, 0}, + {0x00b01, 0x00b03, 0}, + {0x00b3c, 0x00b3c, 0}, + {0x00b3e, 0x00b44, 0}, + {0x00b47, 0x00b48, 0}, + {0x00b4b, 0x00b4d, 0}, + {0x00b56, 0x00b57, 0}, + {0x00b62, 0x00b63, 0}, + {0x00b82, 0x00b82, 0}, + {0x00bbe, 0x00bc2, 0}, + {0x00bc6, 0x00bc8, 0}, + {0x00bca, 0x00bcd, 0}, + {0x00bd7, 0x00bd7, 0}, + {0x00c01, 0x00c03, 0}, + {0x00c3e, 0x00c44, 0}, + {0x00c46, 0x00c48, 0}, + {0x00c4a, 0x00c4d, 0}, + {0x00c55, 0x00c56, 0}, + {0x00c62, 0x00c63, 0}, + {0x00c82, 0x00c83, 0}, + {0x00cbc, 0x00cbc, 0}, + {0x00cbe, 0x00cc4, 0}, + {0x00cc6, 0x00cc8, 0}, + {0x00cca, 0x00ccd, 0}, + {0x00cd5, 0x00cd6, 0}, + {0x00ce2, 0x00ce3, 0}, + {0x00d02, 0x00d03, 0}, + {0x00d3e, 0x00d44, 0}, + {0x00d46, 0x00d48, 0}, + {0x00d4a, 0x00d4d, 0}, + {0x00d57, 0x00d57, 0}, + {0x00d62, 0x00d63, 0}, + {0x00d82, 0x00d83, 0}, + {0x00dca, 0x00dca, 0}, + {0x00dcf, 0x00dd4, 0}, + {0x00dd6, 0x00dd6, 0}, + {0x00dd8, 0x00ddf, 0}, + {0x00df2, 0x00df3, 0}, + {0x00e31, 0x00e31, 0}, + {0x00e34, 0x00e3a, 0}, + {0x00e47, 0x00e4e, 0}, + {0x00eb1, 0x00eb1, 0}, + {0x00eb4, 0x00eb9, 0}, + {0x00ebb, 0x00ebc, 0}, + {0x00ec8, 0x00ecd, 0}, + {0x00f18, 0x00f19, 0}, + {0x00f35, 0x00f35, 0}, + {0x00f37, 0x00f37, 0}, + {0x00f39, 0x00f39, 0}, + {0x00f3e, 0x00f3f, 0}, + {0x00f71, 0x00f84, 0}, + {0x00f86, 0x00f87, 0}, + {0x00f90, 0x00f97, 0}, + {0x00f99, 0x00fbc, 0}, + {0x00fc6, 0x00fc6, 0}, + {0x0102b, 0x0103e, 0}, + {0x01056, 0x01059, 0}, + {0x0105e, 0x01060, 0}, + {0x01062, 0x01064, 0}, + {0x01067, 0x0106d, 0}, + {0x01071, 0x01074, 0}, + {0x01082, 0x0108d, 0}, + {0x0108f, 0x0108f, 0}, + {0x0109a, 0x0109d, 0}, + {0x01100, 0x0115f, 2}, + {0x011a3, 0x011a7, 2}, + {0x011fa, 0x011ff, 2}, + {0x0135f, 0x0135f, 0}, + {0x01712, 0x01714, 0}, + {0x01732, 0x01734, 0}, + {0x01752, 0x01753, 0}, + {0x01772, 0x01773, 0}, + {0x017b6, 0x017d3, 0}, + {0x017dd, 0x017dd, 0}, + {0x0180b, 0x0180d, 0}, + {0x018a9, 0x018a9, 0}, + {0x01920, 0x0192b, 0}, + {0x01930, 0x0193b, 0}, + {0x019b0, 0x019c0, 0}, + {0x019c8, 0x019c9, 0}, + {0x01a17, 0x01a1b, 0}, + {0x01a55, 0x01a5e, 0}, + {0x01a60, 0x01a7c, 0}, + {0x01a7f, 0x01a7f, 0}, + {0x01b00, 0x01b04, 0}, + {0x01b34, 0x01b44, 0}, + {0x01b6b, 0x01b73, 0}, + {0x01b80, 0x01b82, 0}, + {0x01ba1, 0x01baa, 0}, + {0x01c24, 0x01c37, 0}, + {0x01cd0, 0x01cd2, 0}, + {0x01cd4, 0x01ce8, 0}, + {0x01ced, 0x01ced, 0}, + {0x01cf2, 0x01cf2, 0}, + {0x01dc0, 0x01de6, 0}, + {0x01dfd, 0x01dff, 0}, + {0x020d0, 0x020f0, 0}, + {0x02329, 0x0232a, 2}, + {0x02cef, 0x02cf1, 0}, + {0x02de0, 0x02dff, 0}, + {0x02e80, 0x02e99, 2}, + {0x02e9b, 0x02ef3, 2}, + {0x02f00, 0x02fd5, 2}, + {0x02ff0, 0x02ffb, 2}, + {0x03000, 0x03029, 2}, + {0x0302a, 0x0302f, 0}, + {0x03030, 0x0303e, 2}, + {0x03041, 0x03096, 2}, + {0x03099, 0x0309a, 0}, + {0x0309b, 0x030ff, 2}, + {0x03105, 0x0312d, 2}, + {0x03131, 0x0318e, 2}, + {0x03190, 0x031b7, 2}, + {0x031c0, 0x031e3, 2}, + {0x031f0, 0x0321e, 2}, + {0x03220, 0x03247, 2}, + {0x03250, 0x032fe, 2}, + {0x03300, 0x04dbf, 2}, + {0x04e00, 0x0a48c, 2}, + {0x0a490, 0x0a4c6, 2}, + {0x0a66f, 0x0a672, 0}, + {0x0a67c, 0x0a67d, 0}, + {0x0a6f0, 0x0a6f1, 0}, + {0x0a802, 0x0a802, 0}, + {0x0a806, 0x0a806, 0}, + {0x0a80b, 0x0a80b, 0}, + {0x0a823, 0x0a827, 0}, + {0x0a880, 0x0a881, 0}, + {0x0a8b4, 0x0a8c4, 0}, + {0x0a8e0, 0x0a8f1, 0}, + {0x0a926, 0x0a92d, 0}, + {0x0a947, 0x0a953, 0}, + {0x0a960, 0x0a97c, 2}, + {0x0a980, 0x0a983, 0}, + {0x0a9b3, 0x0a9c0, 0}, + {0x0aa29, 0x0aa36, 0}, + {0x0aa43, 0x0aa43, 0}, + {0x0aa4c, 0x0aa4d, 0}, + {0x0aa7b, 0x0aa7b, 0}, + {0x0aab0, 0x0aab0, 0}, + {0x0aab2, 0x0aab4, 0}, + {0x0aab7, 0x0aab8, 0}, + {0x0aabe, 0x0aabf, 0}, + {0x0aac1, 0x0aac1, 0}, + {0x0abe3, 0x0abea, 0}, + {0x0abec, 0x0abed, 0}, + {0x0ac00, 0x0d7a3, 2}, + {0x0d7b0, 0x0d7c6, 2}, + {0x0d7cb, 0x0d7fb, 2}, + {0x0f900, 0x0faff, 2}, + {0x0fb1e, 0x0fb1e, 0}, + {0x0fe00, 0x0fe0f, 0}, + {0x0fe10, 0x0fe19, 2}, + {0x0fe20, 0x0fe26, 0}, + {0x0fe30, 0x0fe52, 2}, + {0x0fe54, 0x0fe66, 2}, + {0x0fe68, 0x0fe6b, 2}, + {0x0ff01, 0x0ff60, 2}, + {0x0ffe0, 0x0ffe6, 2}, + {0x101fd, 0x101fd, 0}, + {0x10a01, 0x10a03, 0}, + {0x10a05, 0x10a06, 0}, + {0x10a0c, 0x10a0f, 0}, + {0x10a38, 0x10a3a, 0}, + {0x10a3f, 0x10a3f, 0}, + {0x11080, 0x11082, 0}, + {0x110b0, 0x110ba, 0}, + {0x1d165, 0x1d169, 0}, + {0x1d16d, 0x1d172, 0}, + {0x1d17b, 0x1d182, 0}, + {0x1d185, 0x1d18b, 0}, + {0x1d1aa, 0x1d1ad, 0}, + {0x1d242, 0x1d244, 0}, + {0x1f200, 0x1f200, 2}, + {0x1f210, 0x1f231, 2}, + {0x1f240, 0x1f248, 2}, + {0x20000, 0x2fffd, 2}, + {0x30000, 0x3fffd, 2}, + {0xe0100, 0xe01ef, 0} }; /* Get the width of a UTF-8 character. */ int utf8_width(char *s) { - int val, low, high, cur; + int val, low, high, cur; - if (UTF8_ISCONT(*s)) - return 0; + if (UTF8_ISCONT(*s)) + return 0; - switch (UTF8_LENGTH(*s)) { - case 1: - val = s[0]; - break; - case 2: - val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6; - break; - case 3: - val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) | (s[0] & 0x0f) << 12; - break; - case 4: - val = (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) | - (s[1] & 0x3f) << 12) | (s[0] & 0x3f) << 18; - break; - case 5: - val = ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) | - (s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) | (s[0] & 0x3f) << 24; - break; - case 6: - val = (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) | - (s[3] & 0x3f) << 12) | (s[2] & 0x3f) << 18) | - (s[1] & 0x3f) << 24) | (s[0] & 0x3f) << 30; - break; - default: - return 0; - } + switch (UTF8_LENGTH(*s)) { + case 1: + val = s[0]; + break; + case 2: + val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6; + break; + case 3: + val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) | + (s[0] & 0x0f) << 12; + break; + case 4: + val = (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) | + (s[1] & 0x3f) << 12) | (s[0] & 0x3f) << 18; + break; + case 5: + val = ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) | + (s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) | + (s[0] & 0x3f) << 24; + break; + case 6: + val = (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) | + (s[3] & 0x3f) << 12) | (s[2] & 0x3f) << 18) | + (s[1] & 0x3f) << 24) | (s[0] & 0x3f) << 30; + break; + default: + return 0; + } - low = 0; - high = sizeof(utf8_widthtab) / sizeof(utf8_widthtab[0]); - do { - cur = (low + high) / 2; - if (val >= utf8_widthtab[cur].min) { - if (val <= utf8_widthtab[cur].max) - return utf8_widthtab[cur].width; - else - low = cur + 1; - } else { - high = cur - 1; - } - } - while (low <= high); + low = 0; + high = sizeof(utf8_widthtab) / sizeof(utf8_widthtab[0]); + do { + cur = (low + high) / 2; + if (val >= utf8_widthtab[cur].min) { + if (val <= utf8_widthtab[cur].max) + return utf8_widthtab[cur].width; + else + low = cur + 1; + } else { + high = cur - 1; + } + } + while (low <= high); - return 1; + return 1; } /* Get the width of a UTF-8 string. */ int utf8_strwidth(char *s) { - int width = 0; + int width = 0; - for (; s && *s; s++) { - if (!UTF8_ISCONT(*s)) - width += utf8_width(s); - } + for (; s && *s; s++) { + if (!UTF8_ISCONT(*s)) + width += utf8_width(s); + } - return width; + return width; } diff --git a/src/utils.c b/src/utils.c index 03cf7d6..d61c2e7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -53,115 +53,118 @@ #define FS_EXT_MAXLEN 64 enum format_specifier { - FS_STARTDATE, - FS_DURATION, - FS_ENDDATE, - FS_MESSAGE, - FS_NOTE, - FS_NOTEFILE, - FS_PRIORITY, - FS_PSIGN, - FS_EOF, - FS_UNKNOWN + FS_STARTDATE, + FS_DURATION, + FS_ENDDATE, + FS_MESSAGE, + FS_NOTE, + FS_NOTEFILE, + FS_PRIORITY, + FS_PSIGN, + FS_EOF, + FS_UNKNOWN }; /* General routine to exit calcurse properly. */ void exit_calcurse(int status) { - int was_interactive; - - if (ui_mode == UI_CURSES) { - notify_stop_main_thread(); - clear(); - wins_refresh(); - endwin(); - ui_mode = UI_CMDLINE; - was_interactive = 1; - } else { - was_interactive = 0; - } - - ui_calendar_stop_date_thread(); - io_stop_psave_thread(); - free_user_data(); - keys_free(); - mem_stats(); - if (was_interactive) { - if (unlink(path_cpid) != 0) - EXIT(_("Could not remove calcurse lock file: %s\n"), strerror(errno)); - if (dmon.enable) - dmon_start(status); - } - - exit(status); + int was_interactive; + + if (ui_mode == UI_CURSES) { + notify_stop_main_thread(); + clear(); + wins_refresh(); + endwin(); + ui_mode = UI_CMDLINE; + was_interactive = 1; + } else { + was_interactive = 0; + } + + ui_calendar_stop_date_thread(); + io_stop_psave_thread(); + free_user_data(); + keys_free(); + mem_stats(); + if (was_interactive) { + if (unlink(path_cpid) != 0) + EXIT(_("Could not remove calcurse lock file: %s\n"), + strerror(errno)); + if (dmon.enable) + dmon_start(status); + } + + exit(status); } void free_user_data(void) { - unsigned i; - - day_free_list(); - event_llist_free(); - apoint_llist_free(); - recur_apoint_llist_free(); - recur_event_llist_free(); - for (i = 0; i <= 37; i++) - ui_day_item_cut_free(i); - todo_free_list(); - notify_free_app(); + unsigned i; + + day_free_list(); + event_llist_free(); + apoint_llist_free(); + recur_apoint_llist_free(); + recur_event_llist_free(); + for (i = 0; i <= 37; i++) + ui_day_item_cut_free(i); + todo_free_list(); + notify_free_app(); } /* Function to exit on internal error. */ void fatalbox(const char *errmsg) { - WINDOW *errwin; - const char *label = _("/!\\ INTERNAL ERROR /!\\"); - const char *reportmsg = _("Please report the following bug:"); - const int WINROW = 10; - const int WINCOL = col - 2; - const int MSGLEN = WINCOL - 2; - char msg[MSGLEN]; - - if (errmsg == NULL) - return; - - strncpy(msg, errmsg, MSGLEN); - errwin = newwin(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2); - custom_apply_attr(errwin, ATTR_HIGHEST); - box(errwin, 0, 0); - wins_show(errwin, label); - mvwaddstr(errwin, 3, 1, reportmsg); - mvwaddstr(errwin, 5, (WINCOL - strlen(msg)) / 2, msg); - custom_remove_attr(errwin, ATTR_HIGHEST); - wins_wrefresh(errwin); - wgetch(errwin); - delwin(errwin); - wins_doupdate(); + WINDOW *errwin; + const char *label = _("/!\\ INTERNAL ERROR /!\\"); + const char *reportmsg = _("Please report the following bug:"); + const int WINROW = 10; + const int WINCOL = col - 2; + const int MSGLEN = WINCOL - 2; + char msg[MSGLEN]; + + if (errmsg == NULL) + return; + + strncpy(msg, errmsg, MSGLEN); + errwin = + newwin(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2); + custom_apply_attr(errwin, ATTR_HIGHEST); + box(errwin, 0, 0); + wins_show(errwin, label); + mvwaddstr(errwin, 3, 1, reportmsg); + mvwaddstr(errwin, 5, (WINCOL - strlen(msg)) / 2, msg); + custom_remove_attr(errwin, ATTR_HIGHEST); + wins_wrefresh(errwin); + wgetch(errwin); + delwin(errwin); + wins_doupdate(); } void warnbox(const char *msg) { - WINDOW *warnwin; - const char *label = "/!\\"; - const int WINROW = 10; - const int WINCOL = col - 2; - const int MSGLEN = WINCOL - 2; - char displmsg[MSGLEN]; - - if (msg == NULL) - return; - - strncpy(displmsg, msg, MSGLEN); - warnwin = newwin(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2); - custom_apply_attr(warnwin, ATTR_HIGHEST); - box(warnwin, 0, 0); - wins_show(warnwin, label); - mvwaddstr(warnwin, 5, (WINCOL - strlen(displmsg)) / 2, displmsg); - custom_remove_attr(warnwin, ATTR_HIGHEST); - wins_wrefresh(warnwin); - wgetch(warnwin); - delwin(warnwin); - wins_doupdate(); + WINDOW *warnwin; + const char *label = "/!\\"; + const int WINROW = 10; + const int WINCOL = col - 2; + const int MSGLEN = WINCOL - 2; + char displmsg[MSGLEN]; + + if (msg == NULL) + return; + + strncpy(displmsg, msg, MSGLEN); + warnwin = + newwin(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2); + custom_apply_attr(warnwin, ATTR_HIGHEST); + box(warnwin, 0, 0); + wins_show(warnwin, label); + mvwaddstr(warnwin, 5, (WINCOL - strlen(displmsg)) / 2, displmsg); + custom_remove_attr(warnwin, ATTR_HIGHEST); + wins_wrefresh(warnwin); + wgetch(warnwin); + delwin(warnwin); + wins_doupdate(); } /* @@ -170,12 +173,12 @@ void warnbox(const char *msg) */ void status_mesg(const char *msg1, const char *msg2) { - wins_erase_status_bar(); - custom_apply_attr(win[STA].p, ATTR_HIGHEST); - mvwaddstr(win[STA].p, 0, 0, msg1); - mvwaddstr(win[STA].p, 1, 0, msg2); - custom_remove_attr(win[STA].p, ATTR_HIGHEST); - wins_wrefresh(win[STA].p); + wins_erase_status_bar(); + custom_apply_attr(win[STA].p, ATTR_HIGHEST); + mvwaddstr(win[STA].p, 0, 0, msg1); + mvwaddstr(win[STA].p, 1, 0, msg2); + custom_remove_attr(win[STA].p, ATTR_HIGHEST); + wins_wrefresh(win[STA].p); } /* @@ -189,36 +192,38 @@ void status_mesg(const char *msg1, const char *msg2) * Returns the index of the key pressed by the user (starting from 1), * or -1 if the user doesn't want to answer (e.g. by escaping). */ -int status_ask_choice(const char *message, const char choice[], int nb_choice) +int status_ask_choice(const char *message, const char choice[], + int nb_choice) { - int i, ch; - char tmp[BUFSIZ]; - /* "[4/2/f/t/w/.../Z] " */ - char avail_choice[2 * nb_choice + 3]; - - avail_choice[0] = '['; - avail_choice[1] = '\0'; - - for (i = 1; i <= nb_choice; i++) { - snprintf(tmp, BUFSIZ, (i == nb_choice) ? "%c] " : "%c/", choice[i]); - strcat(avail_choice, tmp); - } - - status_mesg(message, avail_choice); - - for (;;) { - ch = wgetch(win[KEY].p); - for (i = 1; i <= nb_choice; i++) - if (ch == choice[i]) - return i; - if (ch == ESCAPE) - return (-1); - if (resize) { - resize = 0; - wins_reset(); - status_mesg(message, avail_choice); - } - } + int i, ch; + char tmp[BUFSIZ]; + /* "[4/2/f/t/w/.../Z] " */ + char avail_choice[2 * nb_choice + 3]; + + avail_choice[0] = '['; + avail_choice[1] = '\0'; + + for (i = 1; i <= nb_choice; i++) { + snprintf(tmp, BUFSIZ, (i == nb_choice) ? "%c] " : "%c/", + choice[i]); + strcat(avail_choice, tmp); + } + + status_mesg(message, avail_choice); + + for (;;) { + ch = wgetch(win[KEY].p); + for (i = 1; i <= nb_choice; i++) + if (ch == choice[i]) + return i; + if (ch == ESCAPE) + return (-1); + if (resize) { + resize = 0; + wins_reset(); + status_mesg(message, avail_choice); + } + } } /* @@ -228,7 +233,7 @@ int status_ask_choice(const char *message, const char choice[], int nb_choice) */ int status_ask_bool(const char *msg) { - return (status_ask_choice(msg, _("[yn]"), 2)); + return (status_ask_choice(msg, _("[yn]"), 2)); } /* @@ -238,174 +243,178 @@ int status_ask_bool(const char *msg) * the user doesn't want to answer. */ int -status_ask_simplechoice(const char *prefix, const char *choice[], int nb_choice) +status_ask_simplechoice(const char *prefix, const char *choice[], + int nb_choice) { - int i; - char tmp[BUFSIZ]; - /* "(1) Choice1, (2) Choice2, (3) Choice3?" */ - char choicestr[BUFSIZ]; - /* Holds the characters to choose from ('1', '2', etc) */ - char char_choice[nb_choice + 2]; - - /* No need to initialize first and last char. */ - for (i = 1; i <= nb_choice; i++) - char_choice[i] = '0' + i; - - strcpy(choicestr, prefix); - - for (i = 0; i < nb_choice; i++) { - snprintf(tmp, BUFSIZ, ((i + 1) == nb_choice) ? "(%d) %s?" : "(%d) %s, ", - (i + 1), choice[i]); - strcat(choicestr, tmp); - } - - return (status_ask_choice(choicestr, char_choice, nb_choice)); + int i; + char tmp[BUFSIZ]; + /* "(1) Choice1, (2) Choice2, (3) Choice3?" */ + char choicestr[BUFSIZ]; + /* Holds the characters to choose from ('1', '2', etc) */ + char char_choice[nb_choice + 2]; + + /* No need to initialize first and last char. */ + for (i = 1; i <= nb_choice; i++) + char_choice[i] = '0' + i; + + strcpy(choicestr, prefix); + + for (i = 0; i < nb_choice; i++) { + snprintf(tmp, BUFSIZ, + ((i + 1) == nb_choice) ? "(%d) %s?" : "(%d) %s, ", + (i + 1), choice[i]); + strcat(choicestr, tmp); + } + + return (status_ask_choice(choicestr, char_choice, nb_choice)); } /* Erase part of a window. */ void erase_window_part(WINDOW * win, int first_col, int first_row, int last_col, - int last_row) + int last_row) { - int c, r; + int c, r; - for (r = first_row; r <= last_row; r++) { - for (c = first_col; c <= last_col; c++) - mvwaddstr(win, r, c, " "); - } + for (r = first_row; r <= last_row; r++) { + for (c = first_col; c <= last_col; c++) + mvwaddstr(win, r, c, " "); + } } /* draws a popup window */ -WINDOW *popup(int pop_row, int pop_col, int pop_y, int pop_x, const char *title, - const char *msg, int hint) +WINDOW *popup(int pop_row, int pop_col, int pop_y, int pop_x, + const char *title, const char *msg, int hint) { - const char *any_key = _("Press any key to continue..."); - WINDOW *popup_win; - const int MSGXPOS = 5; - - popup_win = newwin(pop_row, pop_col, pop_y, pop_x); - keypad(popup_win, TRUE); - if (msg) - mvwaddstr(popup_win, MSGXPOS, (pop_col - strlen(msg)) / 2, msg); - custom_apply_attr(popup_win, ATTR_HIGHEST); - box(popup_win, 0, 0); - wins_show(popup_win, title); - if (hint) - mvwaddstr(popup_win, pop_row - 2, pop_col - (strlen(any_key) + 1), any_key); - custom_remove_attr(popup_win, ATTR_HIGHEST); - wins_wrefresh(popup_win); - - return popup_win; + const char *any_key = _("Press any key to continue..."); + WINDOW *popup_win; + const int MSGXPOS = 5; + + popup_win = newwin(pop_row, pop_col, pop_y, pop_x); + keypad(popup_win, TRUE); + if (msg) + mvwaddstr(popup_win, MSGXPOS, (pop_col - strlen(msg)) / 2, + msg); + custom_apply_attr(popup_win, ATTR_HIGHEST); + box(popup_win, 0, 0); + wins_show(popup_win, title); + if (hint) + mvwaddstr(popup_win, pop_row - 2, + pop_col - (strlen(any_key) + 1), any_key); + custom_remove_attr(popup_win, ATTR_HIGHEST); + wins_wrefresh(popup_win); + + return popup_win; } /* prints in middle of a panel */ void print_in_middle(WINDOW * win, int starty, int startx, int width, - const char *string) + const char *string) { - int len = strlen(string); - int x, y; + int len = strlen(string); + int x, y; - win = win ? win : stdscr; - getyx(win, y, x); - x = startx ? startx : x; - y = starty ? starty : y; - width = width ? width : 80; + win = win ? win : stdscr; + getyx(win, y, x); + x = startx ? startx : x; + y = starty ? starty : y; + width = width ? width : 80; - x += (width - len) / 2; + x += (width - len) / 2; - custom_apply_attr(win, ATTR_HIGHEST); - mvwaddstr(win, y, x, string); - custom_remove_attr(win, ATTR_HIGHEST); + custom_apply_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y, x, string); + custom_remove_attr(win, ATTR_HIGHEST); } /* checks if a string is only made of digits */ int is_all_digit(const char *string) { - for (; *string; string++) { - if (!isdigit((int)*string)) - return 0; - } + for (; *string; string++) { + if (!isdigit((int)*string)) + return 0; + } - return 1; + return 1; } /* Given an item date expressed in seconds, return its start time in seconds. */ long get_item_time(long date) { - return (long)(get_item_hour(date) * HOURINSEC + - get_item_min(date) * MININSEC); + return (long)(get_item_hour(date) * HOURINSEC + + get_item_min(date) * MININSEC); } int get_item_hour(long date) { - struct tm lt; + struct tm lt; - localtime_r((time_t *)&date, <); - return lt.tm_hour; + localtime_r((time_t *) & date, <); + return lt.tm_hour; } int get_item_min(long date) { - struct tm lt; + struct tm lt; - localtime_r((time_t *)&date, <); - return lt.tm_min; + localtime_r((time_t *) & date, <); + return lt.tm_min; } long date2sec(struct date day, unsigned hour, unsigned min) { - time_t t = now(); - struct tm start; + time_t t = now(); + struct tm start; - localtime_r(&t, &start); + localtime_r(&t, &start); - start.tm_mon = day.mm - 1; - start.tm_mday = day.dd; - start.tm_year = day.yyyy - 1900; - start.tm_hour = hour; - start.tm_min = min; - start.tm_sec = 0; - start.tm_isdst = -1; + start.tm_mon = day.mm - 1; + start.tm_mday = day.dd; + start.tm_year = day.yyyy - 1900; + start.tm_hour = hour; + start.tm_min = min; + start.tm_sec = 0; + start.tm_isdst = -1; - t = mktime(&start); - EXIT_IF(t == -1, _("failure in mktime")); + t = mktime(&start); + EXIT_IF(t == -1, _("failure in mktime")); - return t; + return t; } /* Return a string containing the date, given a date in seconds. */ char *date_sec2date_str(long sec, const char *datefmt) { - struct tm lt; - char *datestr = (char *)mem_calloc(BUFSIZ, sizeof(char)); + struct tm lt; + char *datestr = (char *)mem_calloc(BUFSIZ, sizeof(char)); - if (sec == 0) { - strncpy(datestr, "0", BUFSIZ); - } else { - localtime_r((time_t *)&sec, <); - strftime(datestr, BUFSIZ, datefmt, <); - } + if (sec == 0) { + strncpy(datestr, "0", BUFSIZ); + } else { + localtime_r((time_t *) & sec, <); + strftime(datestr, BUFSIZ, datefmt, <); + } - return datestr; + return datestr; } /* Generic function to format date. */ void date_sec2date_fmt(long sec, const char *fmt, char *datef) { #if ENABLE_NLS - /* TODO: Find a better way to deal with localization and strftime(). */ - char *locale_old = mem_strdup (setlocale (LC_ALL, NULL)); - setlocale (LC_ALL, "C"); + /* TODO: Find a better way to deal with localization and strftime(). */ + char *locale_old = mem_strdup(setlocale(LC_ALL, NULL)); + setlocale(LC_ALL, "C"); #endif - struct tm lt; - localtime_r((time_t *)&sec, <); - strftime(datef, BUFSIZ, fmt, <); + struct tm lt; + localtime_r((time_t *) & sec, <); + strftime(datef, BUFSIZ, fmt, <); #if ENABLE_NLS - setlocale (LC_ALL, locale_old); - mem_free (locale_old); + setlocale(LC_ALL, locale_old); + mem_free(locale_old); #endif } @@ -414,18 +423,18 @@ void date_sec2date_fmt(long sec, const char *fmt, char *datef) */ long date_sec_change(long date, int delta_month, int delta_day) { - struct tm lt; - time_t t; - - t = date; - localtime_r(&t, <); - lt.tm_mon += delta_month; - lt.tm_mday += delta_day; - lt.tm_isdst = -1; - t = mktime(<); - EXIT_IF(t == -1, _("failure in mktime")); - - return t; + struct tm lt; + time_t t; + + t = date; + localtime_r(&t, <); + lt.tm_mon += delta_month; + lt.tm_mday += delta_day; + lt.tm_isdst = -1; + t = mktime(<); + EXIT_IF(t == -1, _("failure in mktime")); + + return t; } /* @@ -434,17 +443,17 @@ long date_sec_change(long date, int delta_month, int delta_day) */ long update_time_in_date(long date, unsigned hr, unsigned mn) { - struct tm lt; - time_t t, new_date; + struct tm lt; + time_t t, new_date; - t = date; - localtime_r(&t, <); - lt.tm_hour = hr; - lt.tm_min = mn; - new_date = mktime(<); - EXIT_IF(new_date == -1, _("error in mktime")); + t = date; + localtime_r(&t, <); + lt.tm_hour = hr; + lt.tm_min = mn; + new_date = mktime(<); + EXIT_IF(new_date == -1, _("error in mktime")); - return new_date; + return new_date; } /* @@ -453,30 +462,32 @@ long update_time_in_date(long date, unsigned hr, unsigned mn) */ long get_sec_date(struct date date) { - struct tm ptrtime; - time_t timer; - long long_date; - char current_day[] = "dd "; - char current_month[] = "mm "; - char current_year[] = "yyyy "; - - if (date.yyyy == 0 && date.mm == 0 && date.dd == 0) { - timer = time(NULL); - localtime_r(&timer, &ptrtime); - strftime(current_day, strlen(current_day), "%d", &ptrtime); - strftime(current_month, strlen(current_month), "%m", &ptrtime); - strftime(current_year, strlen(current_year), "%Y", &ptrtime); - date.mm = atoi(current_month); - date.dd = atoi(current_day); - date.yyyy = atoi(current_year); - } - long_date = date2sec(date, 0, 0); - return long_date; + struct tm ptrtime; + time_t timer; + long long_date; + char current_day[] = "dd "; + char current_month[] = "mm "; + char current_year[] = "yyyy "; + + if (date.yyyy == 0 && date.mm == 0 && date.dd == 0) { + timer = time(NULL); + localtime_r(&timer, &ptrtime); + strftime(current_day, strlen(current_day), "%d", &ptrtime); + strftime(current_month, strlen(current_month), "%m", + &ptrtime); + strftime(current_year, strlen(current_year), "%Y", + &ptrtime); + date.mm = atoi(current_month); + date.dd = atoi(current_day); + date.yyyy = atoi(current_year); + } + long_date = date2sec(date, 0, 0); + return long_date; } long min2sec(unsigned minutes) { - return minutes * MININSEC; + return minutes * MININSEC; } /* @@ -485,16 +496,16 @@ long min2sec(unsigned minutes) */ void draw_scrollbar(WINDOW * win, int y, int x, int length, - int bar_top, int bar_bottom, unsigned hilt) + int bar_top, int bar_bottom, unsigned hilt) { - mvwvline(win, bar_top, x, ACS_VLINE, bar_bottom - bar_top); - if (hilt) - custom_apply_attr(win, ATTR_HIGHEST); - wattron(win, A_REVERSE); - mvwvline(win, y, x, ' ', length); - wattroff(win, A_REVERSE); - if (hilt) - custom_remove_attr(win, ATTR_HIGHEST); + mvwvline(win, bar_top, x, ACS_VLINE, bar_bottom - bar_top); + if (hilt) + custom_apply_attr(win, ATTR_HIGHEST); + wattron(win, A_REVERSE); + mvwvline(win, y, x, ' ', length); + wattroff(win, A_REVERSE); + if (hilt) + custom_remove_attr(win, ATTR_HIGHEST); } /* @@ -504,86 +515,87 @@ draw_scrollbar(WINDOW * win, int y, int x, int length, */ void item_in_popup(const char *a_start, const char *a_end, const char *msg, - const char *pop_title) + const char *pop_title) { - WINDOW *popup_win, *pad; - const int margin_left = 4, margin_top = 4; - const int winl = row - 5, winw = col - margin_left; - const int padl = winl - 2, padw = winw - margin_left; - - pad = newpad(padl, padw); - popup_win = popup(winl, winw, 1, 2, pop_title, NULL, 1); - if (a_start && a_end) { - mvwprintw(popup_win, margin_top, margin_left, "- %s -> %s", a_start, - a_end); - } - mvwaddstr(pad, 0, margin_left, msg); - wmove(win[STA].p, 0, 0); - pnoutrefresh(pad, 0, 0, margin_top + 2, margin_left, padl, winw); - wins_doupdate(); - wgetch(popup_win); - delwin(pad); - delwin(popup_win); + WINDOW *popup_win, *pad; + const int margin_left = 4, margin_top = 4; + const int winl = row - 5, winw = col - margin_left; + const int padl = winl - 2, padw = winw - margin_left; + + pad = newpad(padl, padw); + popup_win = popup(winl, winw, 1, 2, pop_title, NULL, 1); + if (a_start && a_end) { + mvwprintw(popup_win, margin_top, margin_left, "- %s -> %s", + a_start, a_end); + } + mvwaddstr(pad, 0, margin_left, msg); + wmove(win[STA].p, 0, 0); + pnoutrefresh(pad, 0, 0, margin_top + 2, margin_left, padl, winw); + wins_doupdate(); + wgetch(popup_win); + delwin(pad); + delwin(popup_win); } /* Returns the beginning of current day in seconds from 1900. */ long get_today(void) { - struct tm lt; - time_t current_time; - long current_day; - struct date day; - - current_time = time(NULL); - localtime_r(¤t_time, <); - day.mm = lt.tm_mon + 1; - day.dd = lt.tm_mday; - day.yyyy = lt.tm_year + 1900; - current_day = date2sec(day, 0, 0); - - return current_day; + struct tm lt; + time_t current_time; + long current_day; + struct date day; + + current_time = time(NULL); + localtime_r(¤t_time, <); + day.mm = lt.tm_mon + 1; + day.dd = lt.tm_mday; + day.yyyy = lt.tm_year + 1900; + current_day = date2sec(day, 0, 0); + + return current_day; } /* Returns the current time in seconds. */ long now(void) { - return (long)time(NULL); + return (long)time(NULL); } char *nowstr(void) { - struct tm lt; - static char buf[BUFSIZ]; - time_t t = now(); + struct tm lt; + static char buf[BUFSIZ]; + time_t t = now(); - localtime_r(&t, <); - strftime(buf, sizeof buf, "%a %b %d %T %Y", <); + localtime_r(&t, <); + strftime(buf, sizeof buf, "%a %b %d %T %Y", <); - return buf; + return buf; } /* Print the given option value with appropriate color. */ void -print_bool_option_incolor(WINDOW * win, unsigned option, int pos_y, int pos_x) +print_bool_option_incolor(WINDOW * win, unsigned option, int pos_y, + int pos_x) { - int color = 0; - const char *option_value; - - if (option == 1) { - color = ATTR_TRUE; - option_value = _("yes"); - } else if (option == 0) { - color = ATTR_FALSE; - option_value = _("no"); - } else { - EXIT(_("option not defined")); - } - - custom_apply_attr(win, color); - mvwaddstr(win, pos_y, pos_x, option_value); - custom_remove_attr(win, color); - wnoutrefresh(win); - wins_doupdate(); + int color = 0; + const char *option_value; + + if (option == 1) { + color = ATTR_TRUE; + option_value = _("yes"); + } else if (option == 0) { + color = ATTR_FALSE; + option_value = _("no"); + } else { + EXIT(_("option not defined")); + } + + custom_apply_attr(win, color); + mvwaddstr(win, pos_y, pos_x, option_value); + custom_remove_attr(win, color); + wnoutrefresh(win); + wins_doupdate(); } /* @@ -591,14 +603,14 @@ print_bool_option_incolor(WINDOW * win, unsigned option, int pos_y, int pos_x) */ const char *get_tempdir(void) { - if (getenv("TMPDIR")) - return getenv("TMPDIR"); + if (getenv("TMPDIR")) + return getenv("TMPDIR"); #ifdef P_tmpdir - else if (P_tmpdir) - return P_tmpdir; + else if (P_tmpdir) + return P_tmpdir; #endif - else - return "/tmp"; + else + return "/tmp"; } /* @@ -607,41 +619,43 @@ const char *get_tempdir(void) */ char *new_tempfile(const char *prefix, int trailing_len) { - char fullname[BUFSIZ]; - int prefix_len, fd; - FILE *file; - - if (prefix == NULL) - return NULL; - - prefix_len = strlen(prefix); - if (prefix_len + trailing_len >= BUFSIZ) - return NULL; - memcpy(fullname, prefix, prefix_len); - memset(fullname + prefix_len, 'X', trailing_len); - fullname[prefix_len + trailing_len] = '\0'; - if ((fd = mkstemp(fullname)) == -1 || (file = fdopen(fd, "w+")) == NULL) { - if (fd != -1) { - unlink(fullname); - close(fd); - } - ERROR_MSG(_("temporary file \"%s\" could not be created"), fullname); - return NULL; - } - fclose(file); - - return mem_strdup(fullname + prefix_len); + char fullname[BUFSIZ]; + int prefix_len, fd; + FILE *file; + + if (prefix == NULL) + return NULL; + + prefix_len = strlen(prefix); + if (prefix_len + trailing_len >= BUFSIZ) + return NULL; + memcpy(fullname, prefix, prefix_len); + memset(fullname + prefix_len, 'X', trailing_len); + fullname[prefix_len + trailing_len] = '\0'; + if ((fd = mkstemp(fullname)) == -1 + || (file = fdopen(fd, "w+")) == NULL) { + if (fd != -1) { + unlink(fullname); + close(fd); + } + ERROR_MSG(_("temporary file \"%s\" could not be created"), + fullname); + return NULL; + } + fclose(file); + + return mem_strdup(fullname + prefix_len); } /* * Check if a date is valid. */ -int -check_date(unsigned year, unsigned month, unsigned day) +int check_date(unsigned year, unsigned month, unsigned day) { - return (year >= 1902 && year <= 2037 && month >= 1 && month <= 12 && - day >= 1 && day <= days[month - 1] + (month == 2 && - ISLEAP(year)) ? 1 : 0); + return (year >= 1902 && year <= 2037 && month >= 1 && month <= 12 + && day >= 1 && day <= days[month - 1] + (month == 2 + && ISLEAP(year)) ? + 1 : 0); } /* @@ -658,89 +672,87 @@ check_date(unsigned year, unsigned month, unsigned day) */ int parse_date(const char *date_string, enum datefmt datefmt, int *year, - int *month, int *day, struct date *slctd_date) + int *month, int *day, struct date *slctd_date) { - const char sep = (datefmt == DATEFMT_ISO) ? '-' : '/'; - const char *p; - int in[3] = { 0, 0, 0 }, n = 0; - int d, m, y; - - if (!date_string) - return 0; - - /* parse string into in[], read up to three integers */ - for (p = date_string; *p; p++) { - if (*p == sep) { - if ((++n) > 2) - return 0; - } else if ((*p >= '0') && (*p <= '9')) { - in[n] = in[n] * 10 + (int)(*p - '0'); - } else { - return 0; - } - } - - if ((!slctd_date && n < 2) || in[n] == 0) - return 0; - - /* convert into day, month and year, depending on the date format */ - switch (datefmt) { - case DATEFMT_MMDDYYYY: - m = (n >= 1) ? in[0] : 0; - d = (n >= 1) ? in[1] : in[0]; - y = in[2]; - break; - case DATEFMT_DDMMYYYY: - d = in[0]; - m = in[1]; - y = in[2]; - break; - case DATEFMT_YYYYMMDD: - case DATEFMT_ISO: - y = (n >= 2) ? in[n - 2] : 0; - m = (n >= 1) ? in[n - 1] : 0; - d = in[n]; - break; - default: - return 0; - } - - if (slctd_date) { - if (y > 0 && y < 100) { - /* convert "YY" format into "YYYY" */ - y += slctd_date->yyyy - slctd_date->yyyy % 100; - } else if (n < 2) { - /* set year and, optionally, month if short from is used */ - y = slctd_date->yyyy; - if (n < 1) - m = slctd_date->mm; - } - } - - /* check if date is valid, take leap years into account */ - if (!check_date(y, m, d)) - return 0; - - if (year) - *year = y; - if (month) - *month = m; - if (day) - *day = d; - - return 1; + const char sep = (datefmt == DATEFMT_ISO) ? '-' : '/'; + const char *p; + int in[3] = { 0, 0, 0 }, n = 0; + int d, m, y; + + if (!date_string) + return 0; + + /* parse string into in[], read up to three integers */ + for (p = date_string; *p; p++) { + if (*p == sep) { + if ((++n) > 2) + return 0; + } else if ((*p >= '0') && (*p <= '9')) { + in[n] = in[n] * 10 + (int)(*p - '0'); + } else { + return 0; + } + } + + if ((!slctd_date && n < 2) || in[n] == 0) + return 0; + + /* convert into day, month and year, depending on the date format */ + switch (datefmt) { + case DATEFMT_MMDDYYYY: + m = (n >= 1) ? in[0] : 0; + d = (n >= 1) ? in[1] : in[0]; + y = in[2]; + break; + case DATEFMT_DDMMYYYY: + d = in[0]; + m = in[1]; + y = in[2]; + break; + case DATEFMT_YYYYMMDD: + case DATEFMT_ISO: + y = (n >= 2) ? in[n - 2] : 0; + m = (n >= 1) ? in[n - 1] : 0; + d = in[n]; + break; + default: + return 0; + } + + if (slctd_date) { + if (y > 0 && y < 100) { + /* convert "YY" format into "YYYY" */ + y += slctd_date->yyyy - slctd_date->yyyy % 100; + } else if (n < 2) { + /* set year and, optionally, month if short from is used */ + y = slctd_date->yyyy; + if (n < 1) + m = slctd_date->mm; + } + } + + /* check if date is valid, take leap years into account */ + if (!check_date(y, m, d)) + return 0; + + if (year) + *year = y; + if (month) + *month = m; + if (day) + *day = d; + + return 1; } /* * Check if time is valid. */ -int -check_time(unsigned hours, unsigned minutes) +int check_time(unsigned hours, unsigned minutes) { - return (hours < DAYINHOURS && minutes < HOURINMIN); + return (hours < DAYINHOURS && minutes < HOURINMIN); } - /* * Converts a time string into hours and minutes. Short forms like "23:" * (23:00) or ":45" (0:45) are allowed. @@ -749,32 +761,32 @@ check_time(unsigned hours, unsigned minutes) */ int parse_time(const char *string, unsigned *hour, unsigned *minute) { - const char *p; - unsigned in[2] = { 0, 0 }, n = 0; - - if (!string) - return 0; - - /* parse string into in[], read up to two integers */ - for (p = string; *p; p++) { - if (*p == ':') { - if ((++n) > 1) - return 0; - } else if ((*p >= '0') && (*p <= '9')) { - if ((n == 0) && (p == (string + 2)) && *(p + 1)) - n++; - in[n] = in[n] * 10 + (int)(*p - '0'); - } else { - return 0; - } - } - - if (n != 1 || !check_time(in[0], in[1])) - return 0; - - *hour = in[0]; - *minute = in[1]; - return 1; + const char *p; + unsigned in[2] = { 0, 0 }, n = 0; + + if (!string) + return 0; + + /* parse string into in[], read up to two integers */ + for (p = string; *p; p++) { + if (*p == ':') { + if ((++n) > 1) + return 0; + } else if ((*p >= '0') && (*p <= '9')) { + if ((n == 0) && (p == (string + 2)) && *(p + 1)) + n++; + in[n] = in[n] * 10 + (int)(*p - '0'); + } else { + return 0; + } + } + + if (n != 1 || !check_time(in[0], in[1])) + return 0; + + *hour = in[0]; + *minute = in[1]; + return 1; } /* @@ -792,87 +804,88 @@ int parse_time(const char *string, unsigned *hour, unsigned *minute) */ int parse_duration(const char *string, unsigned *duration) { - enum { - STATE_INITIAL, - STATE_HHMM_MM, - STATE_DDHHMM_HH, - STATE_DDHHMM_MM, - STATE_DONE - } state = STATE_INITIAL; - - const char *p; - unsigned in = 0; - unsigned dur = 0; - - if (!string || *string == '\0') - return 0; - - /* parse string using a simple state machine */ - for (p = string; *p; p++) { - if (state == STATE_DONE) { - return 0; - } else if ((*p >= '0') && (*p <= '9')) { - in = in * 10 + (int)(*p - '0'); - } else { - switch (state) { - case STATE_INITIAL: - if (*p == ':') { - dur += in * HOURINMIN; - state = STATE_HHMM_MM; - } else if (*p == 'd') { - dur += in * DAYINMIN; - state = STATE_DDHHMM_HH; - } else if (*p == 'h') { - dur += in * HOURINMIN; - state = STATE_DDHHMM_MM; - } else if (*p == 'm') { - dur += in; - state = STATE_DONE; - } else { - return 0; - } - break; - case STATE_DDHHMM_HH: - if (*p == 'h') { - dur += in * HOURINMIN; - state = STATE_DDHHMM_MM; - } else if (*p == 'm') { - dur += in; - state = STATE_DONE; - } else { - return 0; - } - break; - case STATE_DDHHMM_MM: - if (*p == 'm') { - dur += in; - state = STATE_DONE; - } else { - return 0; - } - break; - case STATE_HHMM_MM: - return 0; - break; - } - - in = 0; - } - } - - if ((state == STATE_HHMM_MM && in >= HOURINMIN) || - ((state == STATE_DDHHMM_HH || state == STATE_DDHHMM_MM) && in > 0)) - return 0; - - dur += in; - *duration = dur; - - return 1; + enum { + STATE_INITIAL, + STATE_HHMM_MM, + STATE_DDHHMM_HH, + STATE_DDHHMM_MM, + STATE_DONE + } state = STATE_INITIAL; + + const char *p; + unsigned in = 0; + unsigned dur = 0; + + if (!string || *string == '\0') + return 0; + + /* parse string using a simple state machine */ + for (p = string; *p; p++) { + if (state == STATE_DONE) { + return 0; + } else if ((*p >= '0') && (*p <= '9')) { + in = in * 10 + (int)(*p - '0'); + } else { + switch (state) { + case STATE_INITIAL: + if (*p == ':') { + dur += in * HOURINMIN; + state = STATE_HHMM_MM; + } else if (*p == 'd') { + dur += in * DAYINMIN; + state = STATE_DDHHMM_HH; + } else if (*p == 'h') { + dur += in * HOURINMIN; + state = STATE_DDHHMM_MM; + } else if (*p == 'm') { + dur += in; + state = STATE_DONE; + } else { + return 0; + } + break; + case STATE_DDHHMM_HH: + if (*p == 'h') { + dur += in * HOURINMIN; + state = STATE_DDHHMM_MM; + } else if (*p == 'm') { + dur += in; + state = STATE_DONE; + } else { + return 0; + } + break; + case STATE_DDHHMM_MM: + if (*p == 'm') { + dur += in; + state = STATE_DONE; + } else { + return 0; + } + break; + case STATE_HHMM_MM: + return 0; + break; + } + + in = 0; + } + } + + if ((state == STATE_HHMM_MM && in >= HOURINMIN) || + ((state == STATE_DDHHMM_HH || state == STATE_DDHHMM_MM) + && in > 0)) + return 0; + + dur += in; + *duration = dur; + + return 1; } void file_close(FILE * f, const char *pos) { - EXIT_IF((fclose(f)) != 0, _("Error when closing file at %s"), pos); + EXIT_IF((fclose(f)) != 0, _("Error when closing file at %s"), pos); } /* @@ -882,9 +895,9 @@ void file_close(FILE * f, const char *pos) */ void psleep(unsigned secs) { - unsigned unslept; + unsigned unslept; - for (unslept = sleep(secs); unslept; unslept = sleep(unslept)) ; + for (unslept = sleep(secs); unslept; unslept = sleep(unslept)) ; } /* @@ -893,132 +906,134 @@ void psleep(unsigned secs) * If pfdin and/or pfdout point to a valid address, a pipe is created and the * appropriate file descriptors are written to pfdin/pfdout. */ -int fork_exec(int *pfdin, int *pfdout, const char *path, const char *const *arg) +int fork_exec(int *pfdin, int *pfdout, const char *path, + const char *const *arg) { - int pin[2], pout[2]; - int pid; - - if (pfdin && (pipe(pin) == -1)) - return 0; - if (pfdout && (pipe(pout) == -1)) - return 0; - - if ((pid = fork()) == 0) { - if (pfdout) { - if (dup2(pout[0], STDIN_FILENO) < 0) - _exit(127); - close(pout[0]); - close(pout[1]); - } - - if (pfdin) { - if (dup2(pin[1], STDOUT_FILENO) < 0) - _exit(127); - close(pin[0]); - close(pin[1]); - } - - execvp(path, (char *const *)arg); - _exit(127); - } else { - if (pfdin) - close(pin[1]); - if (pfdout) - close(pout[0]); - - if (pid > 0) { - if (pfdin) { - fcntl(pin[0], F_SETFD, FD_CLOEXEC); - *pfdin = pin[0]; - } - if (pfdout) { - fcntl(pout[1], F_SETFD, FD_CLOEXEC); - *pfdout = pout[1]; - } - } else { - if (pfdin) - close(pin[0]); - if (pfdout) - close(pout[1]); - return 0; - } - } - return pid; + int pin[2], pout[2]; + int pid; + + if (pfdin && (pipe(pin) == -1)) + return 0; + if (pfdout && (pipe(pout) == -1)) + return 0; + + if ((pid = fork()) == 0) { + if (pfdout) { + if (dup2(pout[0], STDIN_FILENO) < 0) + _exit(127); + close(pout[0]); + close(pout[1]); + } + + if (pfdin) { + if (dup2(pin[1], STDOUT_FILENO) < 0) + _exit(127); + close(pin[0]); + close(pin[1]); + } + + execvp(path, (char *const *)arg); + _exit(127); + } else { + if (pfdin) + close(pin[1]); + if (pfdout) + close(pout[0]); + + if (pid > 0) { + if (pfdin) { + fcntl(pin[0], F_SETFD, FD_CLOEXEC); + *pfdin = pin[0]; + } + if (pfdout) { + fcntl(pout[1], F_SETFD, FD_CLOEXEC); + *pfdout = pout[1]; + } + } else { + if (pfdin) + close(pin[0]); + if (pfdout) + close(pout[1]); + return 0; + } + } + return pid; } /* Execute an external program in a shell. */ int -shell_exec(int *pfdin, int *pfdout, const char *path, const char *const *arg) +shell_exec(int *pfdin, int *pfdout, const char *path, + const char *const *arg) { - int argc, i; - const char **narg; - char *arg0 = NULL; - int ret; + int argc, i; + const char **narg; + char *arg0 = NULL; + int ret; - for (argc = 0; arg[argc]; argc++) ; + for (argc = 0; arg[argc]; argc++) ; - if (argc < 1) - return -1; + if (argc < 1) + return -1; - narg = mem_calloc(argc + 4, sizeof(const char *)); + narg = mem_calloc(argc + 4, sizeof(const char *)); - narg[0] = "sh"; - narg[1] = "-c"; + narg[0] = "sh"; + narg[1] = "-c"; - if (argc > 1) { - arg0 = mem_malloc(strlen(path) + 6); - sprintf(arg0, "%s \"$@\"", path); - narg[2] = arg0; + if (argc > 1) { + arg0 = mem_malloc(strlen(path) + 6); + sprintf(arg0, "%s \"$@\"", path); + narg[2] = arg0; - for (i = 0; i < argc; i++) - narg[i + 3] = arg[i]; - narg[argc + 3] = NULL; - } else { - narg[2] = path; - narg[3] = NULL; - } + for (i = 0; i < argc; i++) + narg[i + 3] = arg[i]; + narg[argc + 3] = NULL; + } else { + narg[2] = path; + narg[3] = NULL; + } - ret = fork_exec(pfdin, pfdout, *narg, narg); + ret = fork_exec(pfdin, pfdout, *narg, narg); - if (arg0) - mem_free(arg0); - mem_free(narg); + if (arg0) + mem_free(arg0); + mem_free(narg); - return ret; + return ret; } /* Wait for a child process to terminate. */ int child_wait(int *pfdin, int *pfdout, int pid) { - int stat; + int stat; - if (pfdin) - close(*pfdin); - if (pfdout) - close(*pfdout); + if (pfdin) + close(*pfdin); + if (pfdout) + close(*pfdout); - waitpid(pid, &stat, 0); - return stat; + waitpid(pid, &stat, 0); + return stat; } /* Display "Press any key to continue..." and wait for a key press. */ void press_any_key(void) { - struct termios t_attr_old, t_attr; + struct termios t_attr_old, t_attr; - tcgetattr(STDIN_FILENO, &t_attr_old); - memcpy(&t_attr, &t_attr_old, sizeof(struct termios)); - t_attr.c_lflag &= ~(ICANON | ECHO | ECHONL); - tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_attr); + tcgetattr(STDIN_FILENO, &t_attr_old); + memcpy(&t_attr, &t_attr_old, sizeof(struct termios)); + t_attr.c_lflag &= ~(ICANON | ECHO | ECHONL); + tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_attr); - fflush(stdout); - fputs(_("Press any key to continue..."), stdout); - fflush(stdout); - fgetc(stdin); - fflush(stdin); - fputs("\r\n", stdout); + fflush(stdout); + fputs(_("Press any key to continue..."), stdout); + fflush(stdout); + fgetc(stdin); + fflush(stdin); + fputs("\r\n", stdout); - tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_attr_old); + tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_attr_old); } /* @@ -1031,337 +1046,341 @@ void press_any_key(void) */ static void print_notefile(FILE * out, const char *filename, int nbtab) { - char path_to_notefile[BUFSIZ]; - FILE *notefile; - char linestarter[BUFSIZ]; - char buffer[BUFSIZ]; - int i; - int printlinestarter = 1; - - if (nbtab < BUFSIZ) { - for (i = 0; i < nbtab; i++) - linestarter[i] = '\t'; - linestarter[nbtab] = '\0'; - } else { - linestarter[0] = '\0'; - } - - snprintf(path_to_notefile, BUFSIZ, "%s/%s", path_notes, filename); - notefile = fopen(path_to_notefile, "r"); - if (notefile) { - while (fgets(buffer, BUFSIZ, notefile) != 0) { - if (printlinestarter) { - fputs(linestarter, out); - printlinestarter = 0; - } - fputs(buffer, out); - if (buffer[strlen(buffer) - 1] == '\n') - printlinestarter = 1; - } - fputs("\n", out); - file_close(notefile, __FILE_POS__); - } else { - fputs(linestarter, out); - fputs(_("No note file found\n"), out); - } + char path_to_notefile[BUFSIZ]; + FILE *notefile; + char linestarter[BUFSIZ]; + char buffer[BUFSIZ]; + int i; + int printlinestarter = 1; + + if (nbtab < BUFSIZ) { + for (i = 0; i < nbtab; i++) + linestarter[i] = '\t'; + linestarter[nbtab] = '\0'; + } else { + linestarter[0] = '\0'; + } + + snprintf(path_to_notefile, BUFSIZ, "%s/%s", path_notes, filename); + notefile = fopen(path_to_notefile, "r"); + if (notefile) { + while (fgets(buffer, BUFSIZ, notefile) != 0) { + if (printlinestarter) { + fputs(linestarter, out); + printlinestarter = 0; + } + fputs(buffer, out); + if (buffer[strlen(buffer) - 1] == '\n') + printlinestarter = 1; + } + fputs("\n", out); + file_close(notefile, __FILE_POS__); + } else { + fputs(linestarter, out); + fputs(_("No note file found\n"), out); + } } /* Print an escape sequence and return its length. */ static int print_escape(const char *s) { - switch (*(s + 1)) { - case 'a': - putchar('\a'); - return 1; - case 'b': - putchar('\b'); - return 1; - case 'f': - putchar('\f'); - return 1; - case 'n': - putchar('\n'); - return 1; - case 'r': - putchar('\r'); - return 1; - case 't': - putchar('\t'); - return 1; - case 'v': - putchar('\v'); - return 1; - case '0': - putchar('\0'); - return 1; - case '\'': - putchar('\''); - return 1; - case '"': - putchar('"'); - return 1; - case '\?': - putchar('?'); - return 1; - case '\\': - putchar('\\'); - return 1; - case '\0': - return 0; - default: - return 1; - } + switch (*(s + 1)) { + case 'a': + putchar('\a'); + return 1; + case 'b': + putchar('\b'); + return 1; + case 'f': + putchar('\f'); + return 1; + case 'n': + putchar('\n'); + return 1; + case 'r': + putchar('\r'); + return 1; + case 't': + putchar('\t'); + return 1; + case 'v': + putchar('\v'); + return 1; + case '0': + putchar('\0'); + return 1; + case '\'': + putchar('\''); + return 1; + case '"': + putchar('"'); + return 1; + case '\?': + putchar('?'); + return 1; + case '\\': + putchar('\\'); + return 1; + case '\0': + return 0; + default: + return 1; + } } /* Parse a format specifier. */ static enum format_specifier parse_fs(const char **s, char *extformat) { - char buf[FS_EXT_MAXLEN]; - int i; - - extformat[0] = '\0'; - - switch (**s) { - case 's': - strcpy(extformat, "epoch"); - return FS_STARTDATE; - case 'S': - return FS_STARTDATE; - case 'd': - return FS_DURATION; - case 'e': - strcpy(extformat, "epoch"); - return FS_ENDDATE; - case 'E': - return FS_ENDDATE; - case 'm': - return FS_MESSAGE; - case 'n': - return FS_NOTE; - case 'N': - return FS_NOTEFILE; - case 'p': - return FS_PRIORITY; - case '(': - /* Long format specifier. */ - for ((*s)++, i = 0; **s != ':' && **s != ')'; (*s)++, i++) { - if (**s == '\0') - return FS_EOF; - - if (i < FS_EXT_MAXLEN) - buf[i] = **s; - } - - buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0'; - - if (**s == ':') { - for ((*s)++, i = 0; **s != ')'; (*s)++, i++) { - if (**s == '\0') - return FS_EOF; - - if (i < FS_EXT_MAXLEN) - extformat[i] = **s; - } - - extformat[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0'; - } - - if (!strcmp(buf, "start")) - return FS_STARTDATE; - else if (!strcmp(buf, "duration")) - return FS_DURATION; - else if (!strcmp(buf, "end")) - return FS_ENDDATE; - else if (!strcmp(buf, "message")) - return FS_MESSAGE; - else if (!strcmp(buf, "noteid")) - return FS_NOTE; - else if (!strcmp(buf, "note")) - return FS_NOTEFILE; - else if (!strcmp(buf, "priority")) - return FS_PRIORITY; - else - return FS_UNKNOWN; - case '%': - return FS_PSIGN; - case '\0': - return FS_EOF; - default: - return FS_UNKNOWN; - } + char buf[FS_EXT_MAXLEN]; + int i; + + extformat[0] = '\0'; + + switch (**s) { + case 's': + strcpy(extformat, "epoch"); + return FS_STARTDATE; + case 'S': + return FS_STARTDATE; + case 'd': + return FS_DURATION; + case 'e': + strcpy(extformat, "epoch"); + return FS_ENDDATE; + case 'E': + return FS_ENDDATE; + case 'm': + return FS_MESSAGE; + case 'n': + return FS_NOTE; + case 'N': + return FS_NOTEFILE; + case 'p': + return FS_PRIORITY; + case '(': + /* Long format specifier. */ + for ((*s)++, i = 0; **s != ':' && **s != ')'; (*s)++, i++) { + if (**s == '\0') + return FS_EOF; + + if (i < FS_EXT_MAXLEN) + buf[i] = **s; + } + + buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0'; + + if (**s == ':') { + for ((*s)++, i = 0; **s != ')'; (*s)++, i++) { + if (**s == '\0') + return FS_EOF; + + if (i < FS_EXT_MAXLEN) + extformat[i] = **s; + } + + extformat[(i < + FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - + 1] = '\0'; + } + + if (!strcmp(buf, "start")) + return FS_STARTDATE; + else if (!strcmp(buf, "duration")) + return FS_DURATION; + else if (!strcmp(buf, "end")) + return FS_ENDDATE; + else if (!strcmp(buf, "message")) + return FS_MESSAGE; + else if (!strcmp(buf, "noteid")) + return FS_NOTE; + else if (!strcmp(buf, "note")) + return FS_NOTEFILE; + else if (!strcmp(buf, "priority")) + return FS_PRIORITY; + else + return FS_UNKNOWN; + case '%': + return FS_PSIGN; + case '\0': + return FS_EOF; + default: + return FS_UNKNOWN; + } } /* Print a formatted date to stdout. */ static void print_date(long date, long day, const char *extformat) { - char buf[BUFSIZ]; - - if (!strcmp(extformat, "epoch")) { - printf("%ld", date); - } else { - time_t t = date; - struct tm lt; - - localtime_r((time_t *)&t, <); - - if (extformat[0] == '\0' || !strcmp(extformat, "default")) { - if (date >= day && date <= day + DAYINSEC) - strftime(buf, BUFSIZ, "%H:%M", <); - else - strftime(buf, BUFSIZ, "..:..", <); - } else { - strftime(buf, BUFSIZ, extformat, <); - } - - printf("%s", buf); - } + char buf[BUFSIZ]; + + if (!strcmp(extformat, "epoch")) { + printf("%ld", date); + } else { + time_t t = date; + struct tm lt; + + localtime_r((time_t *) & t, <); + + if (extformat[0] == '\0' || !strcmp(extformat, "default")) { + if (date >= day && date <= day + DAYINSEC) + strftime(buf, BUFSIZ, "%H:%M", <); + else + strftime(buf, BUFSIZ, "..:..", <); + } else { + strftime(buf, BUFSIZ, extformat, <); + } + + printf("%s", buf); + } } /* Print a formatted appointment to stdout. */ void print_apoint(const char *format, long day, struct apoint *apt) { - const char *p; - char extformat[FS_EXT_MAXLEN]; - - for (p = format; *p; p++) { - if (*p == '%') { - p++; - switch (parse_fs(&p, extformat)) { - case FS_STARTDATE: - print_date(apt->start, day, extformat); - break; - case FS_DURATION: - printf("%ld", apt->dur); - break; - case FS_ENDDATE: - print_date(apt->start + apt->dur, day, extformat); - break; - case FS_MESSAGE: - printf("%s", apt->mesg); - break; - case FS_NOTE: - printf("%s", apt->note); - break; - case FS_NOTEFILE: - print_notefile(stdout, apt->note, 1); - break; - case FS_PSIGN: - putchar('%'); - break; - case FS_EOF: - return; - break; - default: - putchar('?'); - break; - } - } else if (*p == '\\') { - p += print_escape(p); - } else { - putchar(*p); - } - } + const char *p; + char extformat[FS_EXT_MAXLEN]; + + for (p = format; *p; p++) { + if (*p == '%') { + p++; + switch (parse_fs(&p, extformat)) { + case FS_STARTDATE: + print_date(apt->start, day, extformat); + break; + case FS_DURATION: + printf("%ld", apt->dur); + break; + case FS_ENDDATE: + print_date(apt->start + apt->dur, day, + extformat); + break; + case FS_MESSAGE: + printf("%s", apt->mesg); + break; + case FS_NOTE: + printf("%s", apt->note); + break; + case FS_NOTEFILE: + print_notefile(stdout, apt->note, 1); + break; + case FS_PSIGN: + putchar('%'); + break; + case FS_EOF: + return; + break; + default: + putchar('?'); + break; + } + } else if (*p == '\\') { + p += print_escape(p); + } else { + putchar(*p); + } + } } /* Print a formatted event to stdout. */ void print_event(const char *format, long day, struct event *ev) { - const char *p; - char extformat[FS_EXT_MAXLEN]; - - for (p = format; *p; p++) { - if (*p == '%') { - p++; - switch (parse_fs(&p, extformat)) { - case FS_MESSAGE: - printf("%s", ev->mesg); - break; - case FS_NOTE: - printf("%s", ev->note); - break; - case FS_NOTEFILE: - print_notefile(stdout, ev->note, 1); - break; - case FS_PSIGN: - putchar('%'); - break; - case FS_EOF: - return; - break; - default: - putchar('?'); - break; - } - } else if (*p == '\\') { - p += print_escape(p); - } else { - putchar(*p); - } - } + const char *p; + char extformat[FS_EXT_MAXLEN]; + + for (p = format; *p; p++) { + if (*p == '%') { + p++; + switch (parse_fs(&p, extformat)) { + case FS_MESSAGE: + printf("%s", ev->mesg); + break; + case FS_NOTE: + printf("%s", ev->note); + break; + case FS_NOTEFILE: + print_notefile(stdout, ev->note, 1); + break; + case FS_PSIGN: + putchar('%'); + break; + case FS_EOF: + return; + break; + default: + putchar('?'); + break; + } + } else if (*p == '\\') { + p += print_escape(p); + } else { + putchar(*p); + } + } } /* Print a formatted recurrent appointment to stdout. */ void print_recur_apoint(const char *format, long day, unsigned occurrence, - struct recur_apoint *rapt) + struct recur_apoint *rapt) { - struct apoint apt; + struct apoint apt; - apt.start = occurrence; - apt.dur = rapt->dur; - apt.mesg = rapt->mesg; - apt.note = rapt->note; + apt.start = occurrence; + apt.dur = rapt->dur; + apt.mesg = rapt->mesg; + apt.note = rapt->note; - print_apoint(format, day, &apt); + print_apoint(format, day, &apt); } /* Print a formatted recurrent event to stdout. */ -void print_recur_event(const char *format, long day, struct recur_event *rev) +void print_recur_event(const char *format, long day, + struct recur_event *rev) { - struct event ev; + struct event ev; - ev.mesg = rev->mesg; - ev.note = rev->note; + ev.mesg = rev->mesg; + ev.note = rev->note; - print_event(format, day, &ev); + print_event(format, day, &ev); } /* Print a formatted todo item to stdout. */ void print_todo(const char *format, struct todo *todo) { - const char *p; - char extformat[FS_EXT_MAXLEN]; - - for (p = format; *p; p++) { - if (*p == '%') { - p++; - switch (parse_fs(&p, extformat)) { - case FS_PRIORITY: - printf("%d", abs(todo->id)); - break; - case FS_MESSAGE: - printf("%s", todo->mesg); - break; - case FS_NOTE: - printf("%s", todo->note); - break; - case FS_NOTEFILE: - print_notefile(stdout, todo->note, 1); - break; - case FS_PSIGN: - putchar('%'); - break; - case FS_EOF: - return; - break; - default: - putchar('?'); - break; - } - } else if (*p == '\\') { - p += print_escape(p); - } else { - putchar(*p); - } - } + const char *p; + char extformat[FS_EXT_MAXLEN]; + + for (p = format; *p; p++) { + if (*p == '%') { + p++; + switch (parse_fs(&p, extformat)) { + case FS_PRIORITY: + printf("%d", abs(todo->id)); + break; + case FS_MESSAGE: + printf("%s", todo->mesg); + break; + case FS_NOTE: + printf("%s", todo->note); + break; + case FS_NOTEFILE: + print_notefile(stdout, todo->note, 1); + break; + case FS_PSIGN: + putchar('%'); + break; + case FS_EOF: + return; + break; + default: + putchar('?'); + break; + } + } else if (*p == '\\') { + p += print_escape(p); + } else { + putchar(*p); + } + } } @@ -70,29 +70,29 @@ const char *datefmt_str[DATE_FORMATS]; int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const char *monthnames[12] = { - N_("January"), - N_("February"), - N_("March"), - N_("April"), - N_("May"), - N_("June"), - N_("July"), - N_("August"), - N_("September"), - N_("October"), - N_("November"), - N_("December") + N_("January"), + N_("February"), + N_("March"), + N_("April"), + N_("May"), + N_("June"), + N_("July"), + N_("August"), + N_("September"), + N_("October"), + N_("November"), + N_("December") }; const char *daynames[8] = { - N_("Sun"), - N_("Mon"), - N_("Tue"), - N_("Wed"), - N_("Thu"), - N_("Fri"), - N_("Sat"), - N_("Sun") + N_("Sun"), + N_("Mon"), + N_("Tue"), + N_("Wed"), + N_("Thu"), + N_("Fri"), + N_("Sat"), + N_("Sun") }; /* @@ -126,50 +126,50 @@ struct dmon_conf dmon; */ void vars_init(void) { - const char *ed, *pg; - - /* Variables for user configuration */ - conf.confirm_quit = 1; - conf.confirm_delete = 1; - conf.auto_save = 1; - conf.auto_gc = 0; - conf.periodic_save = 0; - conf.default_panel = CAL; - conf.compact_panels = 0; - conf.system_dialogs = 1; - conf.progress_bar = 1; - strncpy(conf.output_datefmt, "%D", 3); - conf.input_datefmt = 1; - - datefmt_str[0] = _("mm/dd/yyyy"); - datefmt_str[1] = _("dd/mm/yyyy"); - datefmt_str[2] = _("yyyy/mm/dd"); - datefmt_str[3] = _("yyyy-mm-dd"); - - /* Default external editor and pager */ - ed = getenv("VISUAL"); - if (ed == NULL || ed[0] == '\0') - ed = getenv("EDITOR"); - if (ed == NULL || ed[0] == '\0') - ed = DEFAULT_EDITOR; - conf.editor = ed; - - pg = getenv("PAGER"); - if (pg == NULL || pg[0] == '\0') - pg = DEFAULT_PAGER; - conf.pager = pg; - - wins_set_layout(1); - - ui_calendar_set_first_day_of_week(MONDAY); - - /* Pad structure to scroll text inside the appointment panel */ - apad.length = 1; - apad.first_onscreen = 0; - - /* Attribute definitions for color and non-color terminals */ - custom_init_attr(); - - /* Start at the current date */ - ui_calendar_init_slctd_day(); + const char *ed, *pg; + + /* Variables for user configuration */ + conf.confirm_quit = 1; + conf.confirm_delete = 1; + conf.auto_save = 1; + conf.auto_gc = 0; + conf.periodic_save = 0; + conf.default_panel = CAL; + conf.compact_panels = 0; + conf.system_dialogs = 1; + conf.progress_bar = 1; + strncpy(conf.output_datefmt, "%D", 3); + conf.input_datefmt = 1; + + datefmt_str[0] = _("mm/dd/yyyy"); + datefmt_str[1] = _("dd/mm/yyyy"); + datefmt_str[2] = _("yyyy/mm/dd"); + datefmt_str[3] = _("yyyy-mm-dd"); + + /* Default external editor and pager */ + ed = getenv("VISUAL"); + if (ed == NULL || ed[0] == '\0') + ed = getenv("EDITOR"); + if (ed == NULL || ed[0] == '\0') + ed = DEFAULT_EDITOR; + conf.editor = ed; + + pg = getenv("PAGER"); + if (pg == NULL || pg[0] == '\0') + pg = DEFAULT_PAGER; + conf.pager = pg; + + wins_set_layout(1); + + ui_calendar_set_first_day_of_week(MONDAY); + + /* Pad structure to scroll text inside the appointment panel */ + apad.length = 1; + apad.first_onscreen = 0; + + /* Attribute definitions for color and non-color terminals */ + custom_init_attr(); + + /* Start at the current date */ + ui_calendar_init_slctd_day(); } @@ -73,20 +73,20 @@ static pthread_mutex_t screen_mutex = PTHREAD_MUTEX_INITIALIZER; static unsigned screen_acquire(void) { - if (pthread_mutex_lock(&screen_mutex) != 0) - return 0; - else - return 1; + if (pthread_mutex_lock(&screen_mutex) != 0) + return 0; + else + return 1; } static void screen_release(void) { - pthread_mutex_unlock(&screen_mutex); + pthread_mutex_unlock(&screen_mutex); } static void screen_cleanup(void *arg) { - screen_release(); + screen_release(); } /* @@ -97,90 +97,92 @@ static void screen_cleanup(void *arg) unsigned wins_nbar_lock(void) { - return screen_acquire(); + return screen_acquire(); } void wins_nbar_unlock(void) { - screen_release(); + screen_release(); } void wins_nbar_cleanup(void *arg) { - wins_nbar_unlock(); + wins_nbar_unlock(); } unsigned wins_calendar_lock(void) { - return screen_acquire(); + return screen_acquire(); } void wins_calendar_unlock(void) { - screen_release(); + screen_release(); } void wins_calendar_cleanup(void *arg) { - wins_calendar_unlock(); + wins_calendar_unlock(); } int wins_refresh(void) { - int rc; + int rc; - SCREEN_ACQUIRE; - rc = refresh(); - SCREEN_RELEASE; + SCREEN_ACQUIRE; + rc = refresh(); + SCREEN_RELEASE; - return rc; + return rc; } int wins_wrefresh(WINDOW * win) { - int rc; + int rc; - if (!win) - return ERR; - SCREEN_ACQUIRE; - rc = wrefresh(win); - SCREEN_RELEASE; + if (!win) + return ERR; + SCREEN_ACQUIRE; + rc = wrefresh(win); + SCREEN_RELEASE; - return rc; + return rc; } int wins_doupdate(void) { - int rc; + int rc; - SCREEN_ACQUIRE; - rc = doupdate(); - SCREEN_RELEASE; + SCREEN_ACQUIRE; + rc = doupdate(); + SCREEN_RELEASE; - return rc; + return rc; } /* Get the current layout. */ int wins_layout(void) { - return layout; + return layout; } /* Set the current layout. */ void wins_set_layout(int nb) { - layout = nb; + layout = nb; } /* Get the current side bar width. */ unsigned wins_sbar_width(void) { - if (sbarwidth_perc > SBARMAXWIDTHPERC) { - return col * SBARMAXWIDTHPERC / 100; - } else { - unsigned sbarwidth = (unsigned)(col * sbarwidth_perc / 100); - return (sbarwidth < SBARMINWIDTH) ? SBARMINWIDTH : sbarwidth; - } + if (sbarwidth_perc > SBARMAXWIDTHPERC) { + return col * SBARMAXWIDTHPERC / 100; + } else { + unsigned sbarwidth = + (unsigned)(col * sbarwidth_perc / 100); + return (sbarwidth < + SBARMINWIDTH) ? SBARMINWIDTH : sbarwidth; + } } /* @@ -189,7 +191,8 @@ unsigned wins_sbar_width(void) */ unsigned wins_sbar_wperc(void) { - return sbarwidth_perc > SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : sbarwidth_perc; + return sbarwidth_perc > + SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : sbarwidth_perc; } /* @@ -200,75 +203,78 @@ unsigned wins_sbar_wperc(void) */ void wins_set_sbar_width(unsigned perc) { - sbarwidth_perc = perc; + sbarwidth_perc = perc; } /* Change the width of the side bar within acceptable boundaries. */ void wins_sbar_winc(void) { - if (sbarwidth_perc < SBARMAXWIDTHPERC) - sbarwidth_perc++; + if (sbarwidth_perc < SBARMAXWIDTHPERC) + sbarwidth_perc++; } void wins_sbar_wdec(void) { - if (sbarwidth_perc > 0) - sbarwidth_perc--; + if (sbarwidth_perc > 0) + sbarwidth_perc--; } /* Returns an enum which corresponds to the window which is selected. */ enum win wins_slctd(void) { - return slctd_win; + return slctd_win; } /* Sets the selected window. */ void wins_slctd_set(enum win window) { - slctd_win = window; + slctd_win = window; } /* TAB key was hit in the interface, need to select next window. */ 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++; } static void wins_init_panels(void) { - win[CAL].p = newwin(CALHEIGHT + (conf.compact_panels ? 2 : 4), - wins_sbar_width(), win[CAL].y, win[CAL].x); - wins_show(win[CAL].p, _("Calendar")); + win[CAL].p = newwin(CALHEIGHT + (conf.compact_panels ? 2 : 4), + wins_sbar_width(), win[CAL].y, win[CAL].x); + wins_show(win[CAL].p, _("Calendar")); - win[APP].p = newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x); - wins_show(win[APP].p, _("Appointments")); - apad.width = win[APP].w - 3; - apad.ptrwin = newpad(apad.length, apad.width); + win[APP].p = + newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x); + wins_show(win[APP].p, _("Appointments")); + apad.width = win[APP].w - 3; + apad.ptrwin = newpad(apad.length, apad.width); - win[TOD].p = newwin(win[TOD].h, win[TOD].w, win[TOD].y, win[TOD].x); - wins_show(win[TOD].p, _("ToDo")); + win[TOD].p = + newwin(win[TOD].h, win[TOD].w, win[TOD].y, win[TOD].x); + wins_show(win[TOD].p, _("ToDo")); - /* Enable function keys (i.e. arrow keys) in those windows */ - keypad(win[CAL].p, TRUE); - keypad(win[APP].p, TRUE); - keypad(win[TOD].p, TRUE); + /* 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); } /* Create all the windows. */ void wins_init(void) { - wins_init_panels(); - win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); - win[KEY].p = newwin(1, 1, 1, 1); + wins_init_panels(); + win[STA].p = + newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x); + win[KEY].p = newwin(1, 1, 1, 1); - keypad(win[STA].p, TRUE); - keypad(win[KEY].p, TRUE); + keypad(win[STA].p, TRUE); + keypad(win[KEY].p, TRUE); - /* Notify that the curses mode is now launched. */ - ui_mode = UI_CURSES; + /* Notify that the curses mode is now launched. */ + ui_mode = UI_CURSES; } /* @@ -277,63 +283,69 @@ void wins_init(void) */ void wins_scrollwin_init(struct scrollwin *sw) { - EXIT_IF(sw == NULL, "null pointer"); - sw->win.p = newwin(sw->win.h, sw->win.w, sw->win.y, sw->win.x); - sw->pad.p = newpad(sw->pad.h, sw->pad.w); - sw->first_visible_line = 0; - sw->total_lines = 0; + EXIT_IF(sw == NULL, "null pointer"); + sw->win.p = newwin(sw->win.h, sw->win.w, sw->win.y, sw->win.x); + sw->pad.p = newpad(sw->pad.h, sw->pad.w); + sw->first_visible_line = 0; + sw->total_lines = 0; } /* Free an already created scrollwin. */ void wins_scrollwin_delete(struct scrollwin *sw) { - EXIT_IF(sw == NULL, "null pointer"); - delwin(sw->win.p); - delwin(sw->pad.p); + EXIT_IF(sw == NULL, "null pointer"); + delwin(sw->win.p); + delwin(sw->pad.p); } /* Display a scrolling window. */ void wins_scrollwin_display(struct scrollwin *sw) { - const int visible_lines = sw->win.h - sw->pad.y - 1; - - if (sw->total_lines > visible_lines) { - int sbar_length = visible_lines * visible_lines / sw->total_lines; - int highend = visible_lines * sw->first_visible_line / sw->total_lines; - int sbar_top = highend + sw->pad.y + 1; - - if ((sbar_top + sbar_length) > sw->win.h - 1) - sbar_length = sw->win.h - sbar_top; - draw_scrollbar(sw->win.p, sbar_top, sw->win.w + sw->win.x - 2, - sbar_length, sw->pad.y + 1, sw->win.h - 1, 1); - } - wmove(win[STA].p, 0, 0); - wnoutrefresh(sw->win.p); - pnoutrefresh(sw->pad.p, sw->first_visible_line, 0, sw->pad.y, sw->pad.x, - sw->win.h - sw->pad.y + 1, sw->win.w - sw->win.x); - wins_doupdate(); + const int visible_lines = sw->win.h - sw->pad.y - 1; + + if (sw->total_lines > visible_lines) { + int sbar_length = + visible_lines * visible_lines / sw->total_lines; + int highend = + visible_lines * sw->first_visible_line / + sw->total_lines; + int sbar_top = highend + sw->pad.y + 1; + + if ((sbar_top + sbar_length) > sw->win.h - 1) + sbar_length = sw->win.h - sbar_top; + draw_scrollbar(sw->win.p, sbar_top, + sw->win.w + sw->win.x - 2, sbar_length, + sw->pad.y + 1, sw->win.h - 1, 1); + } + wmove(win[STA].p, 0, 0); + wnoutrefresh(sw->win.p); + pnoutrefresh(sw->pad.p, sw->first_visible_line, 0, sw->pad.y, + sw->pad.x, sw->win.h - sw->pad.y + 1, + sw->win.w - sw->win.x); + wins_doupdate(); } void wins_scrollwin_up(struct scrollwin *sw, int amount) { - if (sw->first_visible_line > 0) - sw->first_visible_line -= amount; + if (sw->first_visible_line > 0) + sw->first_visible_line -= amount; } void wins_scrollwin_down(struct scrollwin *sw, int amount) { - if (sw->total_lines > (sw->first_visible_line + sw->win.h - sw->pad.y - 1)) - sw->first_visible_line += amount; + if (sw->total_lines > + (sw->first_visible_line + sw->win.h - sw->pad.y - 1)) + sw->first_visible_line += amount; } void wins_reinit_panels(void) { - delwin(win[CAL].p); - delwin(win[APP].p); - delwin(apad.ptrwin); - delwin(win[TOD].p); - wins_get_config(); - wins_init_panels(); + delwin(win[CAL].p); + delwin(win[APP].p); + delwin(apad.ptrwin); + delwin(win[TOD].p); + wins_get_config(); + wins_init_panels(); } /* @@ -342,32 +354,32 @@ void wins_reinit_panels(void) */ void wins_reinit(void) { - delwin(win[CAL].p); - delwin(win[APP].p); - delwin(apad.ptrwin); - delwin(win[TOD].p); - delwin(win[STA].p); - delwin(win[KEY].p); - wins_get_config(); - wins_init(); - if (notify_bar()) - notify_reinit_bar(); + delwin(win[CAL].p); + delwin(win[APP].p); + delwin(apad.ptrwin); + delwin(win[TOD].p); + delwin(win[STA].p); + delwin(win[KEY].p); + wins_get_config(); + wins_init(); + if (notify_bar()) + notify_reinit_bar(); } /* Show the window with a border and a label. */ void wins_show(WINDOW * win, const char *label) { - int width = getmaxx(win); + int width = getmaxx(win); - box(win, 0, 0); + box(win, 0, 0); - if (!conf.compact_panels) { - mvwaddch(win, 2, 0, ACS_LTEE); - mvwhline(win, 2, 1, ACS_HLINE, width - 2); - mvwaddch(win, 2, width - 1, ACS_RTEE); + if (!conf.compact_panels) { + 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); + } } /* @@ -375,131 +387,131 @@ void wins_show(WINDOW * win, const char *label) */ void wins_get_config(void) { - enum win win_master; - enum win win_slave[2]; - unsigned master_is_left; - - /* 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; - } - - win[CAL].h = CALHEIGHT + (conf.compact_panels ? 2 : 4); - - if (layout <= 4) { - win_master = APP; - win_slave[0] = ((layout - 1) % 2 == 0) ? CAL : TOD; - win_slave[1] = ((layout - 1) % 2 == 1) ? CAL : TOD; - win[TOD].h = row - (win[CAL].h + win[STA].h + win[NOT].h); - } else { - win_master = TOD; - win_slave[0] = ((layout - 1) % 2 == 0) ? CAL : APP; - win_slave[1] = ((layout - 1) % 2 == 1) ? CAL : APP; - win[APP].h = row - (win[CAL].h + win[STA].h + win[NOT].h); - } - master_is_left = ((layout - 1) % 4 < 2); - - win[win_master].x = master_is_left ? 0 : wins_sbar_width(); - win[win_master].y = 0; - win[win_master].w = col - wins_sbar_width(); - win[win_master].h = row - (win[STA].h + win[NOT].h); - - win[win_slave[0]].x = win[win_slave[1]].x = - master_is_left ? win[win_master].w : 0; - win[win_slave[0]].y = 0; - win[win_slave[1]].y = win[win_slave[0]].h; - win[win_slave[0]].w = win[win_slave[1]].w = wins_sbar_width(); + enum win win_master; + enum win win_slave[2]; + unsigned master_is_left; + + /* 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; + } + + win[CAL].h = CALHEIGHT + (conf.compact_panels ? 2 : 4); + + if (layout <= 4) { + win_master = APP; + win_slave[0] = ((layout - 1) % 2 == 0) ? CAL : TOD; + win_slave[1] = ((layout - 1) % 2 == 1) ? CAL : TOD; + win[TOD].h = row - (win[CAL].h + win[STA].h + win[NOT].h); + } else { + win_master = TOD; + win_slave[0] = ((layout - 1) % 2 == 0) ? CAL : APP; + win_slave[1] = ((layout - 1) % 2 == 1) ? CAL : APP; + win[APP].h = row - (win[CAL].h + win[STA].h + win[NOT].h); + } + master_is_left = ((layout - 1) % 4 < 2); + + win[win_master].x = master_is_left ? 0 : wins_sbar_width(); + win[win_master].y = 0; + win[win_master].w = col - wins_sbar_width(); + win[win_master].h = row - (win[STA].h + win[NOT].h); + + win[win_slave[0]].x = win[win_slave[1]].x = + master_is_left ? win[win_master].w : 0; + win[win_slave[0]].y = 0; + win[win_slave[1]].y = win[win_slave[0]].h; + win[win_slave[0]].w = win[win_slave[1]].w = wins_sbar_width(); } /* draw panel border in color */ static void border_color(WINDOW * window) { - int color_attr = A_BOLD; - int no_color_attr = A_BOLD; + int color_attr = A_BOLD; + int no_color_attr = A_BOLD; - if (colorize) { - wattron(window, color_attr | COLOR_PAIR(COLR_CUSTOM)); - box(window, 0, 0); - } else { - wattron(window, no_color_attr); - box(window, 0, 0); - } - if (colorize) { - wattroff(window, color_attr | COLOR_PAIR(COLR_CUSTOM)); - } else { - wattroff(window, no_color_attr); - } - wnoutrefresh(window); + if (colorize) { + wattron(window, color_attr | COLOR_PAIR(COLR_CUSTOM)); + box(window, 0, 0); + } else { + wattron(window, no_color_attr); + box(window, 0, 0); + } + if (colorize) { + wattroff(window, color_attr | COLOR_PAIR(COLR_CUSTOM)); + } else { + wattroff(window, no_color_attr); + } + wnoutrefresh(window); } /* draw panel border without any color */ static void border_nocolor(WINDOW * window) { - int color_attr = A_BOLD; - int no_color_attr = A_DIM; + 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); + if (colorize) { + wattron(window, color_attr | COLOR_PAIR(COLR_DEFAULT)); + } else { + wattron(window, no_color_attr); + } + box(window, 0, 0); + if (colorize) { + wattroff(window, color_attr | COLOR_PAIR(COLR_DEFAULT)); + } else { + wattroff(window, no_color_attr); + } + wnoutrefresh(window); } void wins_update_border(int flags) { - if (flags & FLAG_CAL) { - WINS_CALENDAR_LOCK; - if (slctd_win == CAL) - border_color(win[CAL].p); - else - border_nocolor(win[CAL].p); - WINS_CALENDAR_UNLOCK; - } - if (flags & FLAG_APP) { - if (slctd_win == APP) - border_color(win[APP].p); - else - border_nocolor(win[APP].p); - } - if (flags & FLAG_TOD) { - if (slctd_win == TOD) - border_color(win[TOD].p); - else - border_nocolor(win[TOD].p); - } + if (flags & FLAG_CAL) { + WINS_CALENDAR_LOCK; + if (slctd_win == CAL) + border_color(win[CAL].p); + else + border_nocolor(win[CAL].p); + WINS_CALENDAR_UNLOCK; + } + if (flags & FLAG_APP) { + if (slctd_win == APP) + border_color(win[APP].p); + else + border_nocolor(win[APP].p); + } + if (flags & FLAG_TOD) { + if (slctd_win == TOD) + border_color(win[TOD].p); + else + border_nocolor(win[TOD].p); + } } void wins_update_panels(int flags) { - if (flags & FLAG_APP) - ui_day_update_panel(slctd_win); - if (flags & FLAG_TOD) - ui_todo_update_panel(slctd_win); - if (flags & FLAG_CAL) - ui_calendar_update_panel(&win[CAL]); + if (flags & FLAG_APP) + ui_day_update_panel(slctd_win); + if (flags & FLAG_TOD) + ui_todo_update_panel(slctd_win); + if (flags & FLAG_CAL) + ui_calendar_update_panel(&win[CAL]); } /* @@ -508,52 +520,52 @@ void wins_update_panels(int flags) */ void wins_update(int flags) { - wins_update_border(flags); - wins_update_panels(flags); - if (flags & FLAG_STA) - wins_status_bar(); - if ((flags & FLAG_NOT) && notify_bar()) - notify_update_bar(); - wmove(win[STA].p, 0, 0); - wins_doupdate(); + wins_update_border(flags); + wins_update_panels(flags); + if (flags & FLAG_STA) + wins_status_bar(); + if ((flags & FLAG_NOT) && notify_bar()) + notify_update_bar(); + wmove(win[STA].p, 0, 0); + wins_doupdate(); } /* Reset the screen, needed when resizing terminal for example. */ void wins_reset(void) { - endwin(); - wins_refresh(); - curs_set(0); - wins_reinit(); - wins_update(FLAG_ALL); + endwin(); + wins_refresh(); + curs_set(0); + wins_reinit(); + wins_update(FLAG_ALL); } /* Prepare windows for the execution of an external command. */ void wins_prepare_external(void) { - if (notify_bar()) - notify_stop_main_thread(); - def_prog_mode(); - ui_mode = UI_CMDLINE; - clear(); - wins_refresh(); - endwin(); - sigs_ignore(); + if (notify_bar()) + notify_stop_main_thread(); + def_prog_mode(); + ui_mode = UI_CMDLINE; + clear(); + wins_refresh(); + endwin(); + sigs_ignore(); } /* Restore windows when returning from an external command. */ void wins_unprepare_external(void) { - sigs_unignore(); - reset_prog_mode(); - clearok(curscr, TRUE); - curs_set(0); - ui_mode = UI_CURSES; - wins_refresh(); - wins_reinit(); - wins_update(FLAG_ALL); - if (notify_bar()) - notify_start_main_thread(); + sigs_unignore(); + reset_prog_mode(); + clearok(curscr, TRUE); + curs_set(0); + ui_mode = UI_CURSES; + wins_refresh(); + wins_reinit(); + wins_update(FLAG_ALL); + if (notify_bar()) + notify_start_main_thread(); } /* @@ -562,18 +574,18 @@ void wins_unprepare_external(void) */ void wins_launch_external(const char *file, const char *cmd) { - const char *arg[] = { cmd, file, NULL }; - int pid; + const char *arg[] = { cmd, file, NULL }; + int pid; - wins_prepare_external(); - if ((pid = shell_exec(NULL, NULL, *arg, arg))) - child_wait(NULL, NULL, pid); - wins_unprepare_external(); + wins_prepare_external(); + if ((pid = shell_exec(NULL, NULL, *arg, arg))) + child_wait(NULL, NULL, pid); + wins_unprepare_external(); } -#define NB_CAL_CMDS 27 /* number of commands while in cal view */ -#define NB_APP_CMDS 32 /* same thing while in appointment view */ -#define NB_TOD_CMDS 31 /* same thing while in todo view */ +#define NB_CAL_CMDS 27 /* number of commands while in cal view */ +#define NB_APP_CMDS 32 /* same thing while in appointment view */ +#define NB_TOD_CMDS 31 /* same thing while in todo view */ static unsigned status_page; @@ -585,131 +597,144 @@ static unsigned status_page; */ void wins_status_bar(void) { - struct binding help = { _("Help"), KEY_GENERIC_HELP }; - struct binding quit = { _("Quit"), KEY_GENERIC_QUIT }; - struct binding save = { _("Save"), KEY_GENERIC_SAVE }; - struct binding copy = { _("Copy"), KEY_GENERIC_COPY }; - struct binding paste = { _("Paste"), KEY_GENERIC_PASTE }; - struct binding chgvu = { _("Chg Win"), KEY_GENERIC_CHANGE_VIEW }; - struct binding import = { _("Import"), KEY_GENERIC_IMPORT }; - struct binding export = { _("Export"), KEY_GENERIC_EXPORT }; - struct binding togo = { _("Go to"), KEY_GENERIC_GOTO }; - struct binding conf = { _("Config"), KEY_GENERIC_CONFIG_MENU }; - struct binding draw = { _("Redraw"), KEY_GENERIC_REDRAW }; - struct binding appt = { _("Add Appt"), KEY_GENERIC_ADD_APPT }; - struct binding todo = { _("Add Todo"), KEY_GENERIC_ADD_TODO }; - struct binding gpday = { _("-1 Day"), KEY_GENERIC_PREV_DAY }; - struct binding gnday = { _("+1 Day"), KEY_GENERIC_NEXT_DAY }; - struct binding gpweek = { _("-1 Week"), KEY_GENERIC_PREV_WEEK }; - struct binding gnweek = { _("+1 Week"), KEY_GENERIC_NEXT_WEEK }; - struct binding gpmonth = { _("-1 Month"), KEY_GENERIC_PREV_MONTH }; - struct binding gnmonth = { _("+1 Month"), KEY_GENERIC_NEXT_MONTH }; - struct binding gpyear = { _("-1 Year"), KEY_GENERIC_PREV_YEAR }; - struct binding gnyear = { _("+1 Year"), KEY_GENERIC_NEXT_YEAR }; - struct binding today = { _("Today"), KEY_GENERIC_GOTO_TODAY }; - struct binding nview = { _("Nxt View"), KEY_GENERIC_SCROLL_DOWN }; - struct binding pview = { _("Prv View"), KEY_GENERIC_SCROLL_UP }; - struct binding up = { _("Up"), KEY_MOVE_UP }; - struct binding down = { _("Down"), KEY_MOVE_DOWN }; - struct binding left = { _("Left"), KEY_MOVE_LEFT }; - struct binding right = { _("Right"), KEY_MOVE_RIGHT }; - struct binding weekb = { _("beg Week"), KEY_START_OF_WEEK }; - struct binding weeke = { _("end Week"), KEY_END_OF_WEEK }; - struct binding add = { _("Add Item"), KEY_ADD_ITEM }; - struct binding del = { _("Del Item"), KEY_DEL_ITEM }; - struct binding edit = { _("Edit Itm"), KEY_EDIT_ITEM }; - struct binding view = { _("View"), KEY_VIEW_ITEM }; - struct binding pipe = { _("Pipe"), KEY_PIPE_ITEM }; - struct binding flag = { _("Flag Itm"), KEY_FLAG_ITEM }; - struct binding rept = { _("Repeat"), KEY_REPEAT_ITEM }; - struct binding enote = { _("EditNote"), KEY_EDIT_NOTE }; - struct binding vnote = { _("ViewNote"), KEY_VIEW_NOTE }; - struct binding rprio = { _("Prio.+"), KEY_RAISE_PRIORITY }; - struct binding lprio = { _("Prio.-"), KEY_LOWER_PRIORITY }; - struct binding othr = { _("OtherCmd"), KEY_GENERIC_OTHER_CMD }; - - struct binding *bindings_cal[] = { - &help, &quit, &save, &chgvu, &nview, &pview, &up, &down, &left, &right, - &togo, &import, &export, &weekb, &weeke, &appt, &todo, &gpday, &gnday, - &gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, &draw, &today, - &conf - }; - - struct binding *bindings_apoint[] = { - &help, &quit, &save, &chgvu, &import, &export, &add, &del, &edit, &view, - &pipe, &draw, &rept, &flag, &enote, &vnote, &up, &down, &gpday, &gnday, - &gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, &togo, &today, - &conf, &appt, &todo, ©, &paste - }; - - struct binding *bindings_todo[] = { - &help, &quit, &save, &chgvu, &import, &export, &add, &del, &edit, &view, - &pipe, &flag, &rprio, &lprio, &enote, &vnote, &up, &down, &gpday, &gnday, - &gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, &togo, &today, - &conf, &appt, &todo, &draw - }; - - enum win active_panel = wins_slctd(); - - struct binding **bindings; - int bindings_size; - - switch (active_panel) { - case CAL: - bindings = bindings_cal; - bindings_size = sizeof(bindings_cal) / sizeof(bindings_cal[0]); - break; - case APP: - bindings = bindings_apoint; - bindings_size = sizeof(bindings_apoint) / sizeof(bindings_apoint[0]); - break; - case TOD: - bindings = bindings_todo; - bindings_size = sizeof(bindings_todo) / sizeof(bindings_todo[0]); - break; - default: - EXIT(_("unknown panel")); - /* NOTREACHED */ - } - - keys_display_bindings_bar(win[STA].p, bindings, bindings_size, - (KEYS_CMDS_PER_LINE * 2 - 1) * (status_page - 1), - KEYS_CMDS_PER_LINE * 2, &othr); + struct binding help = { _("Help"), KEY_GENERIC_HELP }; + struct binding quit = { _("Quit"), KEY_GENERIC_QUIT }; + struct binding save = { _("Save"), KEY_GENERIC_SAVE }; + struct binding copy = { _("Copy"), KEY_GENERIC_COPY }; + struct binding paste = { _("Paste"), KEY_GENERIC_PASTE }; + struct binding chgvu = { _("Chg Win"), KEY_GENERIC_CHANGE_VIEW }; + struct binding import = { _("Import"), KEY_GENERIC_IMPORT }; + struct binding export = { _("Export"), KEY_GENERIC_EXPORT }; + struct binding togo = { _("Go to"), KEY_GENERIC_GOTO }; + struct binding conf = { _("Config"), KEY_GENERIC_CONFIG_MENU }; + struct binding draw = { _("Redraw"), KEY_GENERIC_REDRAW }; + struct binding appt = { _("Add Appt"), KEY_GENERIC_ADD_APPT }; + struct binding todo = { _("Add Todo"), KEY_GENERIC_ADD_TODO }; + struct binding gpday = { _("-1 Day"), KEY_GENERIC_PREV_DAY }; + struct binding gnday = { _("+1 Day"), KEY_GENERIC_NEXT_DAY }; + struct binding gpweek = { _("-1 Week"), KEY_GENERIC_PREV_WEEK }; + struct binding gnweek = { _("+1 Week"), KEY_GENERIC_NEXT_WEEK }; + struct binding gpmonth = { _("-1 Month"), KEY_GENERIC_PREV_MONTH }; + struct binding gnmonth = { _("+1 Month"), KEY_GENERIC_NEXT_MONTH }; + struct binding gpyear = { _("-1 Year"), KEY_GENERIC_PREV_YEAR }; + struct binding gnyear = { _("+1 Year"), KEY_GENERIC_NEXT_YEAR }; + struct binding today = { _("Today"), KEY_GENERIC_GOTO_TODAY }; + struct binding nview = { _("Nxt View"), KEY_GENERIC_SCROLL_DOWN }; + struct binding pview = { _("Prv View"), KEY_GENERIC_SCROLL_UP }; + struct binding up = { _("Up"), KEY_MOVE_UP }; + struct binding down = { _("Down"), KEY_MOVE_DOWN }; + struct binding left = { _("Left"), KEY_MOVE_LEFT }; + struct binding right = { _("Right"), KEY_MOVE_RIGHT }; + struct binding weekb = { _("beg Week"), KEY_START_OF_WEEK }; + struct binding weeke = { _("end Week"), KEY_END_OF_WEEK }; + struct binding add = { _("Add Item"), KEY_ADD_ITEM }; + struct binding del = { _("Del Item"), KEY_DEL_ITEM }; + struct binding edit = { _("Edit Itm"), KEY_EDIT_ITEM }; + struct binding view = { _("View"), KEY_VIEW_ITEM }; + struct binding pipe = { _("Pipe"), KEY_PIPE_ITEM }; + struct binding flag = { _("Flag Itm"), KEY_FLAG_ITEM }; + struct binding rept = { _("Repeat"), KEY_REPEAT_ITEM }; + struct binding enote = { _("EditNote"), KEY_EDIT_NOTE }; + struct binding vnote = { _("ViewNote"), KEY_VIEW_NOTE }; + struct binding rprio = { _("Prio.+"), KEY_RAISE_PRIORITY }; + struct binding lprio = { _("Prio.-"), KEY_LOWER_PRIORITY }; + struct binding othr = { _("OtherCmd"), KEY_GENERIC_OTHER_CMD }; + + struct binding *bindings_cal[] = { + &help, &quit, &save, &chgvu, &nview, &pview, &up, &down, + &left, &right, + &togo, &import, &export, &weekb, &weeke, &appt, &todo, + &gpday, &gnday, + &gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, + &draw, &today, + &conf + }; + + struct binding *bindings_apoint[] = { + &help, &quit, &save, &chgvu, &import, &export, &add, &del, + &edit, &view, + &pipe, &draw, &rept, &flag, &enote, &vnote, &up, &down, + &gpday, &gnday, + &gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, + &togo, &today, + &conf, &appt, &todo, ©, &paste + }; + + struct binding *bindings_todo[] = { + &help, &quit, &save, &chgvu, &import, &export, &add, &del, + &edit, &view, + &pipe, &flag, &rprio, &lprio, &enote, &vnote, &up, &down, + &gpday, &gnday, + &gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, + &togo, &today, + &conf, &appt, &todo, &draw + }; + + enum win active_panel = wins_slctd(); + + struct binding **bindings; + int bindings_size; + + switch (active_panel) { + case CAL: + bindings = bindings_cal; + bindings_size = + sizeof(bindings_cal) / sizeof(bindings_cal[0]); + break; + case APP: + bindings = bindings_apoint; + bindings_size = + sizeof(bindings_apoint) / sizeof(bindings_apoint[0]); + break; + case TOD: + bindings = bindings_todo; + bindings_size = + sizeof(bindings_todo) / sizeof(bindings_todo[0]); + break; + default: + EXIT(_("unknown panel")); + /* NOTREACHED */ + } + + keys_display_bindings_bar(win[STA].p, bindings, bindings_size, + (KEYS_CMDS_PER_LINE * 2 - + 1) * (status_page - 1), + KEYS_CMDS_PER_LINE * 2, &othr); } /* Erase status bar. */ void wins_erase_status_bar(void) { - erase_window_part(win[STA].p, 0, 0, col, STATUSHEIGHT); + erase_window_part(win[STA].p, 0, 0, col, STATUSHEIGHT); } /* Update the status bar page number to display other commands. */ void wins_other_status_page(int panel) { - int nb_item, max_page; - - switch (panel) { - case CAL: - nb_item = NB_CAL_CMDS; - break; - case APP: - nb_item = NB_APP_CMDS; - break; - case TOD: - nb_item = NB_TOD_CMDS; - break; - default: - EXIT(_("unknown panel")); - /* NOTREACHED */ - } - max_page = nb_item / (KEYS_CMDS_PER_LINE * 2 - 1) + 1; - status_page = (status_page % max_page) + 1; + int nb_item, max_page; + + switch (panel) { + case CAL: + nb_item = NB_CAL_CMDS; + break; + case APP: + nb_item = NB_APP_CMDS; + break; + case TOD: + nb_item = NB_TOD_CMDS; + break; + default: + EXIT(_("unknown panel")); + /* NOTREACHED */ + } + max_page = nb_item / (KEYS_CMDS_PER_LINE * 2 - 1) + 1; + status_page = (status_page % max_page) + 1; } /* Reset the status bar page. */ void wins_reset_status_page(void) { - status_page = 1; + status_page = 1; } #undef NB_CAL_CMDS diff --git a/test/run-test.c b/test/run-test.c index 7084189..78fb7d1 100644 --- a/test/run-test.c +++ b/test/run-test.c @@ -52,181 +52,184 @@ static int fork_exec(int *pfdin, int *pfdout, const char *path, char *const *arg) { - int pin[2], pout[2]; - int pid; - - if (pfdin && (pipe(pin) == -1)) - return 0; - if (pfdout && (pipe(pout) == -1)) - return 0; - - if ((pid = fork()) == 0) { - if (pfdout) { - if (dup2(pout[0], STDIN_FILENO) < 0) - _exit(127); - close(pout[0]); - close(pout[1]); - } - - if (pfdin) { - if (dup2(pin[1], STDOUT_FILENO) < 0) - _exit(127); - close(pin[0]); - close(pin[1]); - } - - execvp(path, arg); - _exit(127); - } else { - if (pfdin) - close(pin[1]); - if (pfdout) - close(pout[0]); - - if (pid > 0) { - if (pfdin) { - fcntl(pin[0], F_SETFD, FD_CLOEXEC); - *pfdin = pin[0]; - } - if (pfdout) { - fcntl(pout[1], F_SETFD, FD_CLOEXEC); - *pfdout = pout[1]; - } - } else { - if (pfdin) - close(pin[0]); - if (pfdout) - close(pout[1]); - return 0; - } - } - return pid; + int pin[2], pout[2]; + int pid; + + if (pfdin && (pipe(pin) == -1)) + return 0; + if (pfdout && (pipe(pout) == -1)) + return 0; + + if ((pid = fork()) == 0) { + if (pfdout) { + if (dup2(pout[0], STDIN_FILENO) < 0) + _exit(127); + close(pout[0]); + close(pout[1]); + } + + if (pfdin) { + if (dup2(pin[1], STDOUT_FILENO) < 0) + _exit(127); + close(pin[0]); + close(pin[1]); + } + + execvp(path, arg); + _exit(127); + } else { + if (pfdin) + close(pin[1]); + if (pfdout) + close(pout[0]); + + if (pid > 0) { + if (pfdin) { + fcntl(pin[0], F_SETFD, FD_CLOEXEC); + *pfdin = pin[0]; + } + if (pfdout) { + fcntl(pout[1], F_SETFD, FD_CLOEXEC); + *pfdout = pout[1]; + } + } else { + if (pfdin) + close(pin[0]); + if (pfdout) + close(pout[1]); + return 0; + } + } + return pid; } /* Wait for a child process to terminate. */ static int child_wait(int *pfdin, int *pfdout, int pid) { - int stat; + int stat; - if (pfdin) - close(*pfdin); - if (pfdout) - close(*pfdout); + if (pfdin) + close(*pfdin); + if (pfdout) + close(*pfdout); - waitpid(pid, &stat, 0); - return stat; + waitpid(pid, &stat, 0); + return stat; } /* Print error message and bail out. */ static void die(const char *format, ...) { - va_list arg; + va_list arg; - va_start(arg, format); - fprintf(stderr, "error: "); - vfprintf(stderr, format, arg); - va_end(arg); + va_start(arg, format); + fprintf(stderr, "error: "); + vfprintf(stderr, format, arg); + va_end(arg); - exit(1); + exit(1); } /* Print usage message. */ static void usage(void) { - printf("usage: run-test [-h|--help] <test>...\n"); + printf("usage: run-test [-h|--help] <test>...\n"); } /* Run test with a specific name. */ static int run_test(const char *name, int expect_failure) { - char filename[BUFSIZ]; - char *arg1[3], *arg2[3]; - int pid1 = -1, pin1, pid2 = -1, pin2; - FILE *fpin1 = NULL, *fpin2 = NULL; - char buf1[BUFSIZ], buf2[BUFSIZ]; - int ret = 1; - - if (snprintf(filename, BUFSIZ, "./%s", name) >= BUFSIZ) - die("file name too long\n"); - - if (access(filename, F_OK) != 0) { - if (snprintf(filename, BUFSIZ, "./%s.sh", name) >= BUFSIZ) - die("file name too long\n"); - - if (access(filename, F_OK) != 0) - die("test not found: %s\n", name); - } - - if (access(filename, X_OK) != 0) - die("script is not executable: %s\n", filename); - - arg1[0] = arg2[0] = filename; - arg1[1] = "expected"; - arg2[1] = "actual"; - arg1[2] = arg2[2] = NULL; - - printf("Running %s...", name); - - if ((pid1 = fork_exec(&pin1, NULL, *arg1, arg1)) < 0) - die("failed to execute %s: %s\n", filename, strerror(errno)); - - if ((pid2 = fork_exec(&pin2, NULL, *arg2, arg2)) < 0) - die("failed to execute %s: %s\n", filename, strerror(errno)); - - fpin1 = fdopen(pin1, "r"); - fpin2 = fdopen(pin2, "r"); - - while (fgets(buf1, BUFSIZ, fpin1)) { - if (!fgets(buf2, BUFSIZ, fpin2) || strcmp(buf1, buf2) != 0) { - ret = 0; - break; - } - } - - if (fgets(buf2, BUFSIZ, fpin2)) - ret = 0; - - if (fpin1) - fclose(fpin1); - if (fpin2) - fclose(fpin2); - - if (child_wait(&pin1, NULL, pid1) != 0) - ret = 0; - if (child_wait(&pin2, NULL, pid2) != 0) - ret = 0; - - if (expect_failure) - ret = 1 - ret; - - if (ret == 1) - printf(" ok\n"); - else - printf(" FAIL\n"); - - return ret; + char filename[BUFSIZ]; + char *arg1[3], *arg2[3]; + int pid1 = -1, pin1, pid2 = -1, pin2; + FILE *fpin1 = NULL, *fpin2 = NULL; + char buf1[BUFSIZ], buf2[BUFSIZ]; + int ret = 1; + + if (snprintf(filename, BUFSIZ, "./%s", name) >= BUFSIZ) + die("file name too long\n"); + + if (access(filename, F_OK) != 0) { + if (snprintf(filename, BUFSIZ, "./%s.sh", name) >= BUFSIZ) + die("file name too long\n"); + + if (access(filename, F_OK) != 0) + die("test not found: %s\n", name); + } + + if (access(filename, X_OK) != 0) + die("script is not executable: %s\n", filename); + + arg1[0] = arg2[0] = filename; + arg1[1] = "expected"; + arg2[1] = "actual"; + arg1[2] = arg2[2] = NULL; + + printf("Running %s...", name); + + if ((pid1 = fork_exec(&pin1, NULL, *arg1, arg1)) < 0) + die("failed to execute %s: %s\n", filename, + strerror(errno)); + + if ((pid2 = fork_exec(&pin2, NULL, *arg2, arg2)) < 0) + die("failed to execute %s: %s\n", filename, + strerror(errno)); + + fpin1 = fdopen(pin1, "r"); + fpin2 = fdopen(pin2, "r"); + + while (fgets(buf1, BUFSIZ, fpin1)) { + if (!fgets(buf2, BUFSIZ, fpin2) || strcmp(buf1, buf2) != 0) { + ret = 0; + break; + } + } + + if (fgets(buf2, BUFSIZ, fpin2)) + ret = 0; + + if (fpin1) + fclose(fpin1); + if (fpin2) + fclose(fpin2); + + if (child_wait(&pin1, NULL, pid1) != 0) + ret = 0; + if (child_wait(&pin2, NULL, pid2) != 0) + ret = 0; + + if (expect_failure) + ret = 1 - ret; + + if (ret == 1) + printf(" ok\n"); + else + printf(" FAIL\n"); + + return ret; } int main(int argc, char **argv) { - int i; - - if (!argv[1]) - die("no tests specified, bailing out\n"); - else if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) { - usage(); - return 0; - } - - for (i = 1; i < argc; i++) { - if (*argv[i] == '!') { - if (!run_test(argv[i] + 1, 1)) - return 1; - } else { - if (!run_test(argv[i], 0)) - return 1; - } - } - - return 0; + int i; + + if (!argv[1]) + die("no tests specified, bailing out\n"); + else if (strcmp(argv[1], "-h") == 0 + || strcmp(argv[1], "--help") == 0) { + usage(); + return 0; + } + + for (i = 1; i < argc; i++) { + if (*argv[i] == '!') { + if (!run_test(argv[i] + 1, 1)) + return 1; + } else { + if (!run_test(argv[i], 0)) + return 1; + } + } + + return 0; } |