summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/apoint.c273
-rw-r--r--src/args.c1107
-rw-r--r--src/calcurse.c847
-rw-r--r--src/calcurse.h449
-rw-r--r--src/config.c698
-rw-r--r--src/custom.c1869
-rw-r--r--src/day.c937
-rw-r--r--src/dmon.c233
-rw-r--r--src/event.c140
-rw-r--r--src/getstring.c383
-rw-r--r--src/help.c1417
-rw-r--r--src/htable.h2
-rw-r--r--src/ical.c1652
-rw-r--r--src/io.c1939
-rw-r--r--src/keys.c880
-rw-r--r--src/llist.c271
-rw-r--r--src/llist.h8
-rw-r--r--src/llist_ts.h6
-rw-r--r--src/mem.c281
-rw-r--r--src/note.c290
-rw-r--r--src/notify.c1082
-rw-r--r--src/pcal.c384
-rw-r--r--src/recur.c1105
-rw-r--r--src/sha1.c321
-rw-r--r--src/sha1.h6
-rw-r--r--src/sigs.c72
-rw-r--r--src/todo.c100
-rw-r--r--src/ui-calendar.c1182
-rw-r--r--src/ui-day.c1503
-rw-r--r--src/ui-todo.c360
-rw-r--r--src/utf8.c556
-rw-r--r--src/utils.c1889
-rw-r--r--src/vars.c132
-rw-r--r--src/wins.c779
-rw-r--r--test/run-test.c301
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, &lt);
- 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, &lt);
- 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, &lt);
+ 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, &lt);
+ 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, &lt);
- 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, &lt);
+ 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, &lt);
- 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, &lt);
+ 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);
}
diff --git a/src/args.c b/src/args.c
index 8687130..8b1da49 100644
--- a/src/args.c
+++ b/src/args.c
@@ -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, &lt);
- strftime(date_str, BUFSIZ, conf.output_datefmt, &lt);
- fputs(date_str, stdout);
- fputs(":\n", stdout);
+ localtime_r((time_t *) & date, &lt);
+ strftime(date_str, BUFSIZ, conf.output_datefmt, &lt);
+ 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(&reg, optarg, REG_EXTENDED))
- EXIT(_("Could not compile regular expression."));
- preg = &reg;
- 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(&reg, optarg, REG_EXTENDED))
+ EXIT(_("Could not compile regular expression."));
+ preg = &reg;
+ 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, &reg);
- 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, &reg);
+ 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();
+ }
}
diff --git a/src/day.c b/src/day.c
index 35e17d6..48a6f18 100644
--- a/src/day.c
+++ b/src/day.c
@@ -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(&note, editor);
+ note = day_item_get_note(p);
+ edit_note(&note, 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;
+ }
}
diff --git a/src/dmon.c b/src/dmon.c
index 0fd7962..d1ef1cd 100644
--- a/src/dmon.c
+++ b/src/dmon.c
@@ -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, &lt);
- 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, &lt);
+ 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;
}
diff --git a/src/help.c b/src/help.c
index 289f814..b4dcb07 100644
--- a/src/help.c
+++ b/src/help.c
@@ -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)
diff --git a/src/ical.c b/src/ical.c
index bd53a0c..0aa5da7 100644
--- a/src/ical.c
+++ b/src/ical.c
@@ -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(&note);
+ todo_add(mesg, priority, note);
+ mem_free(mesg);
+ erase_note(&note);
}
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(&note);
+ 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(&note);
}
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(&note);
+ 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(&note);
}
/*
@@ -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);
}
diff --git a/src/io.c b/src/io.c
index c1b3631..0f5d711 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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, &lt);
- 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, &lt);
+ 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;
}
diff --git a/src/keys.c b/src/keys.c
index f4b81c7..0ef3085 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -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. */
diff --git a/src/mem.c b/src/mem.c
index 8889cc0..a351818 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -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 */
diff --git a/src/note.c b/src/note.c
index e8c9fb0..a6e48d7 100644
--- a/src/note.c
+++ b/src/note.c
@@ -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(&notify.mutex, NULL);
- pthread_mutex_init(&notify_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(&notify.mutex, NULL);
+ pthread_mutex_init(&notify_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(&notify.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(&notify_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(&notify_app.mutex);
- pthread_mutex_unlock(&notify.mutex);
- notify_check_next_app(0);
- return;
- }
- }
- pthread_mutex_unlock(&notify_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(&notify.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(&notify.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(&notify_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(&notify_app.mutex);
+ pthread_mutex_unlock(&notify.mutex);
+ notify_check_next_app(0);
+ return;
+ }
+ }
+ pthread_mutex_unlock(&notify_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(&notify.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(&notify.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(&notify.mutex);
- notify_update_bar();
- psleep(thread_sleep);
- elapse += thread_sleep;
- if (elapse >= check_app) {
- elapse = 0;
- pthread_mutex_lock(&notify_app.mutex);
- got_app = notify_app.got_app;
- pthread_mutex_unlock(&notify_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(&notify.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(&notify.mutex);
+ notify_update_bar();
+ psleep(thread_sleep);
+ elapse += thread_sleep;
+ if (elapse >= check_app) {
+ elapse = 0;
+ pthread_mutex_lock(&notify_app.mutex);
+ got_app = notify_app.got_app;
+ pthread_mutex_unlock(&notify_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(&notify_app.mutex);
- notify_free_app();
- pthread_mutex_unlock(&notify_app.mutex);
- } else {
- if (force || !notify_same_item(tmp_app.time)) {
- pthread_mutex_lock(&notify_app.mutex);
- notify_update_app(tmp_app.time, tmp_app.state, tmp_app.txt);
- pthread_mutex_unlock(&notify_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(&notify_app.mutex);
+ notify_free_app();
+ pthread_mutex_unlock(&notify_app.mutex);
+ } else {
+ if (force || !notify_same_item(tmp_app.time)) {
+ pthread_mutex_lock(&notify_app.mutex);
+ notify_update_app(tmp_app.time, tmp_app.state,
+ tmp_app.txt);
+ pthread_mutex_unlock(&notify_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(&notify_t_app, &detached_thread_attr, notify_thread_app, arg);
- return;
+ pthread_create(&notify_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(&notify_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(&notify_app.mutex);
- notify_update_bar();
+ time_t current_time;
+ int update_notify = 0;
+ long gap;
+
+ current_time = time(NULL);
+ pthread_mutex_lock(&notify_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(&notify_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(&notify_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(&notify_app.mutex);
- notify_update_bar();
+ unsigned real_app_time;
+ int update_notify = 0;
+ time_t current_time;
+
+ current_time = time(NULL);
+ pthread_mutex_lock(&notify_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(&notify_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(&notify_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(&notify_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(&notify_t_main, NULL, notify_main_thread, NULL);
- notify_check_next_app(0);
+ pthread_create(&notify_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);
}
diff --git a/src/pcal.c b/src/pcal.c
index e2721e6..a9fdefd 100644
--- a/src/pcal.c
+++ b/src/pcal.c
@@ -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);
- lt.tm_hour = lt.tm_min = lt.tm_sec = 0;
- lt.tm_isdst = -1;
- date = mktime(&lt);
- item_time = item_first_date - date;
+ t = item_first_date;
+ localtime_r(&t, &lt);
+ lt.tm_hour = lt.tm_min = lt.tm_sec = 0;
+ lt.tm_isdst = -1;
+ date = mktime(&lt);
+ 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, &lt);
- 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, &lt);
+ 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, &lt);
- 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, &lt);
- 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, &lt);
- 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, &lt);
+ 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, &lt);
+ 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, &lt);
+ 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, &lt);
- 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, &lt);
- 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, &lt);
+ 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, &lt);
+ 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, &lt_day);
-
- t = item_start;
- localtime_r(&t, &lt_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(&lt_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(&lt_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, &lt_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, &lt_day);
+
+ t = item_start;
+ localtime_r(&t, &lt_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(&lt_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(&lt_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, &lt_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);
}
diff --git a/src/sha1.c b/src/sha1.c
index ad68bd3..d32c241 100644
--- a/src/sha1.c
+++ b/src/sha1.c
@@ -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;
+ }
}
diff --git a/src/sha1.h b/src/sha1.h
index 8f80bef..479c3b6 100644
--- a/src/sha1.h
+++ b/src/sha1.h
@@ -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 *);
diff --git a/src/sigs.c b/src/sigs.c
index 68dcdfd..e746a01 100644
--- a/src/sigs.c
+++ b/src/sigs.c
@@ -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);
}
diff --git a/src/todo.c b/src/todo.c
index a0d464f..50ee447 100644
--- a/src/todo.c
+++ b/src/todo.c
@@ -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(&current_day);
+ ui_calendar_store_current_date(&current_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, &current_day, sunday_first);
+ draw_calendar[ui_calendar_view] (cwin, &current_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, &timestr, 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, &timestr, 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, &timestr, 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, &timestr, 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, &lt);
- 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, &lt);
+ 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, &lt);
- 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, &lt);
+ 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);
}
diff --git a/src/utf8.c b/src/utf8.c
index 64b59d1..9b9f341 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -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, &lt);
- return lt.tm_hour;
+ localtime_r((time_t *) & date, &lt);
+ return lt.tm_hour;
}
int get_item_min(long date)
{
- struct tm lt;
+ struct tm lt;
- localtime_r((time_t *)&date, &lt);
- return lt.tm_min;
+ localtime_r((time_t *) & date, &lt);
+ 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, &lt);
- strftime(datestr, BUFSIZ, datefmt, &lt);
- }
+ if (sec == 0) {
+ strncpy(datestr, "0", BUFSIZ);
+ } else {
+ localtime_r((time_t *) & sec, &lt);
+ strftime(datestr, BUFSIZ, datefmt, &lt);
+ }
- 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, &lt);
- strftime(datef, BUFSIZ, fmt, &lt);
+ struct tm lt;
+ localtime_r((time_t *) & sec, &lt);
+ strftime(datef, BUFSIZ, fmt, &lt);
#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);
- lt.tm_mon += delta_month;
- lt.tm_mday += delta_day;
- lt.tm_isdst = -1;
- t = mktime(&lt);
- EXIT_IF(t == -1, _("failure in mktime"));
-
- return t;
+ struct tm lt;
+ time_t t;
+
+ t = date;
+ localtime_r(&t, &lt);
+ lt.tm_mon += delta_month;
+ lt.tm_mday += delta_day;
+ lt.tm_isdst = -1;
+ t = mktime(&lt);
+ 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);
- lt.tm_hour = hr;
- lt.tm_min = mn;
- new_date = mktime(&lt);
- EXIT_IF(new_date == -1, _("error in mktime"));
+ t = date;
+ localtime_r(&t, &lt);
+ lt.tm_hour = hr;
+ lt.tm_min = mn;
+ new_date = mktime(&lt);
+ 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(&current_time, &lt);
- 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(&current_time, &lt);
+ 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, &lt);
- strftime(buf, sizeof buf, "%a %b %d %T %Y", &lt);
+ localtime_r(&t, &lt);
+ strftime(buf, sizeof buf, "%a %b %d %T %Y", &lt);
- 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, &lt);
-
- if (extformat[0] == '\0' || !strcmp(extformat, "default")) {
- if (date >= day && date <= day + DAYINSEC)
- strftime(buf, BUFSIZ, "%H:%M", &lt);
- else
- strftime(buf, BUFSIZ, "..:..", &lt);
- } else {
- strftime(buf, BUFSIZ, extformat, &lt);
- }
-
- 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, &lt);
+
+ if (extformat[0] == '\0' || !strcmp(extformat, "default")) {
+ if (date >= day && date <= day + DAYINSEC)
+ strftime(buf, BUFSIZ, "%H:%M", &lt);
+ else
+ strftime(buf, BUFSIZ, "..:..", &lt);
+ } else {
+ strftime(buf, BUFSIZ, extformat, &lt);
+ }
+
+ 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);
+ }
+ }
}
diff --git a/src/vars.c b/src/vars.c
index 0235089..52a1ed2 100644
--- a/src/vars.c
+++ b/src/vars.c
@@ -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();
}
diff --git a/src/wins.c b/src/wins.c
index 1267552..0a3f48f 100644
--- a/src/wins.c
+++ b/src/wins.c
@@ -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, &copy, &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, &copy, &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;
}