Switch to Linux kernel coding style
Convert our code base to adhere to Linux kernel coding style using Lindent, with the following exceptions: * Use spaces, instead of tabs, for indentation. * Use 2-character indentations (instead of 8 characters). Rationale: We currently have too much levels of indentation. Using 8-character tabs would make huge code parts unreadable. These need to be cleaned up before we can switch to 8 characters. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
434
src/apoint.c
434
src/apoint.c
@@ -45,42 +45,37 @@ llist_ts_t alist_p;
|
||||
static struct apoint bkp_cut_apoint;
|
||||
static int hilt;
|
||||
|
||||
void
|
||||
apoint_free_bkp (void)
|
||||
void apoint_free_bkp(void)
|
||||
{
|
||||
if (bkp_cut_apoint.mesg)
|
||||
{
|
||||
mem_free (bkp_cut_apoint.mesg);
|
||||
if (bkp_cut_apoint.mesg) {
|
||||
mem_free(bkp_cut_apoint.mesg);
|
||||
bkp_cut_apoint.mesg = 0;
|
||||
}
|
||||
erase_note (&bkp_cut_apoint.note);
|
||||
erase_note(&bkp_cut_apoint.note);
|
||||
}
|
||||
|
||||
static void
|
||||
apoint_free (struct apoint *apt)
|
||||
static 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);
|
||||
}
|
||||
|
||||
static void
|
||||
apoint_dup (struct apoint *in, struct apoint *bkp)
|
||||
static void apoint_dup(struct apoint *in, struct apoint *bkp)
|
||||
{
|
||||
EXIT_IF (!in || !bkp, _("null pointer"));
|
||||
EXIT_IF(!in || !bkp, _("null pointer"));
|
||||
|
||||
bkp->start = in->start;
|
||||
bkp->dur = in->dur;
|
||||
bkp->state = in->state;
|
||||
bkp->mesg = mem_strdup (in->mesg);
|
||||
bkp->mesg = mem_strdup(in->mesg);
|
||||
if (in->note)
|
||||
bkp->note = mem_strdup (in->note);
|
||||
bkp->note = mem_strdup(in->note);
|
||||
}
|
||||
|
||||
void
|
||||
apoint_llist_init (void)
|
||||
void apoint_llist_init(void)
|
||||
{
|
||||
LLIST_TS_INIT (&alist_p);
|
||||
LLIST_TS_INIT(&alist_p);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -88,60 +83,54 @@ apoint_llist_init (void)
|
||||
* list. No need to be thread safe, as only the main process remains when
|
||||
* calling this function.
|
||||
*/
|
||||
void
|
||||
apoint_llist_free (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);
|
||||
}
|
||||
|
||||
/* Sets which appointment is highlighted. */
|
||||
void
|
||||
apoint_hilt_set (int highlighted)
|
||||
void apoint_hilt_set(int highlighted)
|
||||
{
|
||||
hilt = highlighted;
|
||||
}
|
||||
|
||||
void
|
||||
apoint_hilt_decrease (int n)
|
||||
void apoint_hilt_decrease(int n)
|
||||
{
|
||||
hilt -= n;
|
||||
}
|
||||
|
||||
void
|
||||
apoint_hilt_increase (int n)
|
||||
void apoint_hilt_increase(int n)
|
||||
{
|
||||
hilt += n;
|
||||
}
|
||||
|
||||
/* Return which appointment is highlighted. */
|
||||
int
|
||||
apoint_hilt (void)
|
||||
int apoint_hilt(void)
|
||||
{
|
||||
return hilt;
|
||||
}
|
||||
|
||||
static int
|
||||
apoint_cmp_start (struct apoint *a, struct apoint *b)
|
||||
static int apoint_cmp_start(struct apoint *a, struct apoint *b)
|
||||
{
|
||||
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)
|
||||
struct apoint *apoint_new(char *mesg, char *note, long start, long dur,
|
||||
char state)
|
||||
{
|
||||
struct apoint *apt;
|
||||
|
||||
apt = mem_malloc (sizeof (struct apoint));
|
||||
apt->mesg = mem_strdup (mesg);
|
||||
apt->note = (note != NULL) ? mem_strdup (note) : NULL;
|
||||
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;
|
||||
}
|
||||
@@ -150,20 +139,21 @@ apoint_new (char *mesg, char *note, long start, long dur, char state)
|
||||
* Add an item in either the appointment or the event list,
|
||||
* depending if the start time is entered or not.
|
||||
*/
|
||||
void
|
||||
apoint_add (void)
|
||||
void apoint_add(void)
|
||||
{
|
||||
#define LTIME 6
|
||||
#define LDUR 12
|
||||
const char *mesg_1 =
|
||||
_("Enter start time ([hh:mm]), leave blank for an all-day event : ");
|
||||
const char *mesg_2 =
|
||||
_("Enter end time ([hh:mm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : ");
|
||||
_
|
||||
("Enter end time ([hh:mm]) 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]");
|
||||
const char *format_message_2 =
|
||||
_("Invalid end time/duration, should be [hh:mm], [+hh:mm], [+xxxdxxhxxm] or [+mm]");
|
||||
_
|
||||
("Invalid end time/duration, should be [hh:mm], [+hh:mm], [+xxxdxxhxxm] or [+mm]");
|
||||
const char *enter_str = _("Press [Enter] to continue");
|
||||
int Id = 1;
|
||||
char item_time[LDUR] = "";
|
||||
@@ -175,26 +165,21 @@ apoint_add (void)
|
||||
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)
|
||||
{
|
||||
if (strlen (item_time) == 0)
|
||||
{
|
||||
for (;;) {
|
||||
status_mesg(mesg_1, "");
|
||||
if (getstring(win[STA].p, item_time, LTIME, 0, 1) != GETSTRING_ESC) {
|
||||
if (strlen(item_time) == 0) {
|
||||
is_appointment = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (parse_time (item_time, &heures, &minutes) == 1)
|
||||
if (parse_time(item_time, &heures, &minutes) == 1)
|
||||
break;
|
||||
else
|
||||
{
|
||||
status_mesg (format_message_1, enter_str);
|
||||
wgetch (win[STA].p);
|
||||
else {
|
||||
status_mesg(format_message_1, enter_str);
|
||||
wgetch(win[STA].p);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -203,90 +188,71 @@ apoint_add (void)
|
||||
* depending on the starting time, and record the
|
||||
* corresponding item.
|
||||
*/
|
||||
if (is_appointment)
|
||||
{ /* Get the appointment duration */
|
||||
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)
|
||||
{
|
||||
if (*item_time == '+' && parse_duration (item_time + 1,
|
||||
for (;;) {
|
||||
status_mesg(mesg_2, "");
|
||||
if (getstring(win[STA].p, item_time, LDUR, 0, 1) != GETSTRING_ESC) {
|
||||
if (*item_time == '+' && parse_duration(item_time + 1,
|
||||
&apoint_duration) == 1)
|
||||
break;
|
||||
else if (parse_time (item_time, &end_h, &end_m) == 1)
|
||||
{
|
||||
if (end_h < heures || ((end_h == heures) && (end_m < minutes)))
|
||||
{
|
||||
else 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
|
||||
{
|
||||
} else {
|
||||
apoint_duration = MININSEC - minutes
|
||||
+ end_m + (end_h - (heures + 1)) * MININSEC;
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
status_mesg(format_message_2, enter_str);
|
||||
wgetch(win[STA].p);
|
||||
}
|
||||
else
|
||||
{
|
||||
status_mesg (format_message_2, enter_str);
|
||||
wgetch (win[STA].p);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* Insert the event Id */
|
||||
} else /* Insert the event Id */
|
||||
Id = 1;
|
||||
|
||||
status_mesg (mesg_3, "");
|
||||
if (getstring (win[STA].p, item_mesg, BUFSIZ, 0, 1) == GETSTRING_VALID)
|
||||
{
|
||||
if (is_appointment)
|
||||
{
|
||||
apoint_start = date2sec (*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 (*calendar_get_slctd_day (), 0, 0), Id);
|
||||
status_mesg(mesg_3, "");
|
||||
if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) == GETSTRING_VALID) {
|
||||
if (is_appointment) {
|
||||
apoint_start = date2sec(*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(*calendar_get_slctd_day(), 0, 0), Id);
|
||||
|
||||
if (hilt == 0)
|
||||
hilt++;
|
||||
}
|
||||
wins_erase_status_bar ();
|
||||
wins_erase_status_bar();
|
||||
}
|
||||
|
||||
/* Delete an item from the appointment list. */
|
||||
void
|
||||
apoint_delete (unsigned *nb_events, unsigned *nb_apoints)
|
||||
void apoint_delete(unsigned *nb_events, unsigned *nb_apoints)
|
||||
{
|
||||
const char *del_app_str = _("Do you really want to delete this item ?");
|
||||
long date;
|
||||
int nb_items = *nb_apoints + *nb_events;
|
||||
int to_be_removed = 0;
|
||||
|
||||
date = calendar_get_slctd_day_sec ();
|
||||
date = calendar_get_slctd_day_sec();
|
||||
|
||||
if (nb_items == 0)
|
||||
return;
|
||||
|
||||
if (conf.confirm_delete)
|
||||
{
|
||||
if (status_ask_bool (del_app_str) != 1)
|
||||
{
|
||||
wins_erase_status_bar ();
|
||||
if (conf.confirm_delete) {
|
||||
if (status_ask_bool(del_app_str) != 1) {
|
||||
wins_erase_status_bar();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (nb_items != 0)
|
||||
{
|
||||
switch (day_erase_item (date, hilt, ERASE_DONT_FORCE))
|
||||
{
|
||||
if (nb_items != 0) {
|
||||
switch (day_erase_item(date, hilt, ERASE_DONT_FORCE)) {
|
||||
case EVNT:
|
||||
case RECUR_EVNT:
|
||||
(*nb_events)--;
|
||||
@@ -300,7 +266,7 @@ apoint_delete (unsigned *nb_events, unsigned *nb_apoints)
|
||||
case 0:
|
||||
return;
|
||||
default:
|
||||
EXIT (_("no such type"));
|
||||
EXIT(_("no such type"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
@@ -314,8 +280,7 @@ apoint_delete (unsigned *nb_events, unsigned *nb_apoints)
|
||||
}
|
||||
|
||||
/* Cut an item, so that it can be pasted somewhere else later. */
|
||||
int
|
||||
apoint_cut (unsigned *nb_events, unsigned *nb_apoints)
|
||||
int apoint_cut(unsigned *nb_events, unsigned *nb_apoints)
|
||||
{
|
||||
const int NBITEMS = *nb_apoints + *nb_events;
|
||||
int item_type, to_be_removed;
|
||||
@@ -324,20 +289,16 @@ apoint_cut (unsigned *nb_events, unsigned *nb_apoints)
|
||||
if (NBITEMS == 0)
|
||||
return 0;
|
||||
|
||||
date = calendar_get_slctd_day_sec ();
|
||||
item_type = day_cut_item (date, hilt);
|
||||
if (item_type == EVNT || item_type == RECUR_EVNT)
|
||||
{
|
||||
date = calendar_get_slctd_day_sec();
|
||||
item_type = day_cut_item(date, hilt);
|
||||
if (item_type == EVNT || item_type == RECUR_EVNT) {
|
||||
(*nb_events)--;
|
||||
to_be_removed = 1;
|
||||
}
|
||||
else if (item_type == APPT || item_type == RECUR_APPT)
|
||||
{
|
||||
} else if (item_type == APPT || item_type == RECUR_APPT) {
|
||||
(*nb_apoints)--;
|
||||
to_be_removed = 3;
|
||||
}
|
||||
else
|
||||
EXIT (_("no such type"));
|
||||
} else
|
||||
EXIT(_("no such type"));
|
||||
/* NOTREACHED */
|
||||
|
||||
if (hilt > 1)
|
||||
@@ -351,14 +312,13 @@ apoint_cut (unsigned *nb_events, unsigned *nb_apoints)
|
||||
}
|
||||
|
||||
/* Paste a previously cut item. */
|
||||
void
|
||||
apoint_paste (unsigned *nb_events, unsigned *nb_apoints, int cut_item_type)
|
||||
void apoint_paste(unsigned *nb_events, unsigned *nb_apoints, int cut_item_type)
|
||||
{
|
||||
int item_type;
|
||||
long date;
|
||||
|
||||
date = calendar_get_slctd_day_sec ();
|
||||
item_type = day_paste_item (date, cut_item_type);
|
||||
date = calendar_get_slctd_day_sec();
|
||||
item_type = day_paste_item(date, cut_item_type);
|
||||
if (item_type == EVNT || item_type == RECUR_EVNT)
|
||||
(*nb_events)++;
|
||||
else if (item_type == APPT || item_type == RECUR_APPT)
|
||||
@@ -370,77 +330,72 @@ apoint_paste (unsigned *nb_events, unsigned *nb_apoints, int cut_item_type)
|
||||
hilt++;
|
||||
}
|
||||
|
||||
unsigned
|
||||
apoint_inday (struct apoint *i, long start)
|
||||
unsigned apoint_inday(struct apoint *i, long start)
|
||||
{
|
||||
return (i->start <= start + DAYINSEC && i->start + i->dur > start);
|
||||
}
|
||||
|
||||
void
|
||||
apoint_sec2str (struct apoint *o, long day, char *start, char *end)
|
||||
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
|
||||
{
|
||||
strncpy(start, "..:..", 6);
|
||||
else {
|
||||
t = o->start;
|
||||
lt = localtime (&t);
|
||||
snprintf (start, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
||||
lt = localtime(&t);
|
||||
snprintf(start, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
||||
}
|
||||
if (o->start + o->dur > day + DAYINSEC)
|
||||
strncpy (end, "..:..", 6);
|
||||
else
|
||||
{
|
||||
strncpy(end, "..:..", 6);
|
||||
else {
|
||||
t = o->start + o->dur;
|
||||
lt = localtime (&t);
|
||||
snprintf (end, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
||||
lt = localtime(&t);
|
||||
snprintf(end, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
apoint_write (struct apoint *o, FILE *f)
|
||||
void apoint_write(struct apoint *o, FILE * f)
|
||||
{
|
||||
struct tm *lt;
|
||||
time_t t;
|
||||
|
||||
t = o->start;
|
||||
lt = localtime (&t);
|
||||
fprintf (f, "%02u/%02u/%04u @ %02u:%02u", lt->tm_mon + 1, lt->tm_mday,
|
||||
lt = localtime(&t);
|
||||
fprintf(f, "%02u/%02u/%04u @ %02u:%02u", lt->tm_mon + 1, lt->tm_mday,
|
||||
1900 + lt->tm_year, lt->tm_hour, lt->tm_min);
|
||||
|
||||
t = o->start + o->dur;
|
||||
lt = localtime (&t);
|
||||
fprintf (f, " -> %02u/%02u/%04u @ %02u:%02u ", lt->tm_mon + 1, lt->tm_mday,
|
||||
lt = localtime(&t);
|
||||
fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u ", lt->tm_mon + 1, lt->tm_mday,
|
||||
1900 + lt->tm_year, lt->tm_hour, lt->tm_min);
|
||||
|
||||
if (o->note != NULL)
|
||||
fprintf (f, ">%s ", o->note);
|
||||
fprintf(f, ">%s ", o->note);
|
||||
|
||||
if (o->state & APOINT_NOTIFY)
|
||||
fputc ('!', f);
|
||||
fputc('!', f);
|
||||
else
|
||||
fputc ('|', f);
|
||||
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, t;
|
||||
|
||||
t = time (NULL);
|
||||
localtime (&t);
|
||||
t = time(NULL);
|
||||
localtime(&t);
|
||||
|
||||
/* Read the appointment description */
|
||||
if (!fgets (buf, sizeof buf, f))
|
||||
if (!fgets(buf, sizeof buf, f))
|
||||
return NULL;
|
||||
|
||||
newline = strchr (buf, '\n');
|
||||
newline = strchr(buf, '\n');
|
||||
if (newline)
|
||||
*newline = '\0';
|
||||
|
||||
@@ -451,61 +406,58 @@ apoint_scan (FILE *f, struct tm start, struct tm end, char state, char *note)
|
||||
end.tm_year -= 1900;
|
||||
end.tm_mon--;
|
||||
|
||||
tstart = mktime (&start);
|
||||
tend = mktime (&end);
|
||||
EXIT_IF (tstart == -1 || tend == -1 || tstart > tend,
|
||||
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);
|
||||
return apoint_new(buf, note, tstart, tend - tstart, state);
|
||||
}
|
||||
|
||||
/* Retrieve an appointment from the list, given the day and item position. */
|
||||
struct apoint *
|
||||
apoint_get (long day, int pos)
|
||||
struct apoint *apoint_get(long day, int pos)
|
||||
{
|
||||
llist_item_t *i = LLIST_TS_FIND_NTH (&alist_p, pos, day, apoint_inday);
|
||||
llist_item_t *i = LLIST_TS_FIND_NTH(&alist_p, pos, day, apoint_inday);
|
||||
|
||||
if (i)
|
||||
return LLIST_TS_GET_DATA (i);
|
||||
return LLIST_TS_GET_DATA(i);
|
||||
|
||||
EXIT (_("item not found"));
|
||||
EXIT(_("item not found"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
void
|
||||
apoint_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
||||
void apoint_delete_bynum(long start, unsigned num, enum eraseflg flag)
|
||||
{
|
||||
llist_item_t *i;
|
||||
int need_check_notify = 0;
|
||||
|
||||
LLIST_TS_LOCK (&alist_p);
|
||||
i = LLIST_TS_FIND_NTH (&alist_p, num, start, apoint_inday);
|
||||
LLIST_TS_LOCK(&alist_p);
|
||||
i = LLIST_TS_FIND_NTH(&alist_p, num, start, apoint_inday);
|
||||
|
||||
if (!i)
|
||||
EXIT (_("no such appointment"));
|
||||
struct apoint *apt = LLIST_TS_GET_DATA (i);
|
||||
EXIT(_("no such appointment"));
|
||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||
|
||||
switch (flag)
|
||||
{
|
||||
switch (flag) {
|
||||
case ERASE_FORCE_ONLY_NOTE:
|
||||
erase_note (&apt->note);
|
||||
erase_note(&apt->note);
|
||||
break;
|
||||
case ERASE_CUT:
|
||||
apoint_free_bkp ();
|
||||
apoint_dup (apt, &bkp_cut_apoint);
|
||||
erase_note (&apt->note);
|
||||
apoint_free_bkp();
|
||||
apoint_dup(apt, &bkp_cut_apoint);
|
||||
erase_note(&apt->note);
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
if (notify_bar ())
|
||||
need_check_notify = notify_same_item (apt->start);
|
||||
LLIST_TS_REMOVE (&alist_p, i);
|
||||
mem_free (apt->mesg);
|
||||
mem_free (apt);
|
||||
if (notify_bar())
|
||||
need_check_notify = notify_same_item(apt->start);
|
||||
LLIST_TS_REMOVE(&alist_p, i);
|
||||
mem_free(apt->mesg);
|
||||
mem_free(apt);
|
||||
if (need_check_notify)
|
||||
notify_check_next_app (0);
|
||||
notify_check_next_app(0);
|
||||
break;
|
||||
}
|
||||
|
||||
LLIST_TS_UNLOCK (&alist_p);
|
||||
LLIST_TS_UNLOCK(&alist_p);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -513,8 +465,7 @@ apoint_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
||||
* the appointment panel. This is to help the appointment scroll function
|
||||
* to place beggining of the pad correctly.
|
||||
*/
|
||||
static int
|
||||
get_item_line (int item_nb, int nb_events_inday)
|
||||
static int get_item_line(int item_nb, int nb_events_inday)
|
||||
{
|
||||
int separator = 2;
|
||||
int line = 0;
|
||||
@@ -531,15 +482,14 @@ get_item_line (int item_nb, int nb_events_inday)
|
||||
* Update (if necessary) the first displayed pad line to make the
|
||||
* appointment panel scroll down next time pnoutrefresh is called.
|
||||
*/
|
||||
void
|
||||
apoint_scroll_pad_down (int nb_events_inday, int win_length)
|
||||
void apoint_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);
|
||||
item_first_line = get_item_line(hilt, nb_events_inday);
|
||||
if (hilt < nb_events_inday)
|
||||
item_last_line = item_first_line;
|
||||
else
|
||||
@@ -553,18 +503,16 @@ apoint_scroll_pad_down (int nb_events_inday, int win_length)
|
||||
* Update (if necessary) the first displayed pad line to make the
|
||||
* appointment panel scroll up next time pnoutrefresh is called.
|
||||
*/
|
||||
void
|
||||
apoint_scroll_pad_up (int nb_events_inday)
|
||||
void apoint_scroll_pad_up(int nb_events_inday)
|
||||
{
|
||||
int item_first_line = 0;
|
||||
|
||||
item_first_line = get_item_line (hilt, nb_events_inday);
|
||||
item_first_line = get_item_line(hilt, nb_events_inday);
|
||||
if (item_first_line < apad.first_onscreen)
|
||||
apad.first_onscreen = item_first_line;
|
||||
}
|
||||
|
||||
static int
|
||||
apoint_starts_after (struct apoint *apt, long time)
|
||||
static int apoint_starts_after(struct apoint *apt, long time)
|
||||
{
|
||||
return apt->start > time;
|
||||
}
|
||||
@@ -573,28 +521,25 @@ apoint_starts_after (struct apoint *apt, long 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 *
|
||||
apoint_check_next (struct notify_app *app, long start)
|
||||
struct notify_app *apoint_check_next(struct notify_app *app, long start)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (apt->start <= app->time) {
|
||||
app->time = apt->start;
|
||||
app->txt = mem_strdup (apt->mesg);
|
||||
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;
|
||||
}
|
||||
@@ -602,44 +547,40 @@ apoint_check_next (struct notify_app *app, long start)
|
||||
/*
|
||||
* Switch notification state.
|
||||
*/
|
||||
void
|
||||
apoint_switch_notify (void)
|
||||
void apoint_switch_notify(void)
|
||||
{
|
||||
struct day_item *p;
|
||||
long date;
|
||||
int apoint_nb = 0, need_chk_notify;
|
||||
|
||||
p = day_get_item (hilt);
|
||||
p = day_get_item(hilt);
|
||||
if (p->type != APPT && p->type != RECUR_APPT)
|
||||
return;
|
||||
|
||||
date = calendar_get_slctd_day_sec ();
|
||||
date = calendar_get_slctd_day_sec();
|
||||
|
||||
if (p->type == RECUR_APPT)
|
||||
{
|
||||
recur_apoint_switch_notify (date, p->appt_pos);
|
||||
if (p->type == RECUR_APPT) {
|
||||
recur_apoint_switch_notify(date, p->appt_pos);
|
||||
return;
|
||||
}
|
||||
else if (p->type == APPT)
|
||||
apoint_nb = day_item_nb (date, hilt, APPT);
|
||||
} else if (p->type == APPT)
|
||||
apoint_nb = day_item_nb(date, hilt, APPT);
|
||||
|
||||
need_chk_notify = 0;
|
||||
LLIST_TS_LOCK (&alist_p);
|
||||
LLIST_TS_LOCK(&alist_p);
|
||||
|
||||
struct apoint *apt = apoint_get (date, apoint_nb);
|
||||
struct apoint *apt = apoint_get(date, apoint_nb);
|
||||
|
||||
apt->state ^= APOINT_NOTIFY;
|
||||
if (notify_bar ())
|
||||
notify_check_added (apt->mesg, apt->start, apt->state);
|
||||
if (notify_bar())
|
||||
notify_check_added(apt->mesg, apt->start, apt->state);
|
||||
if (need_chk_notify)
|
||||
notify_check_next_app (0);
|
||||
notify_check_next_app(0);
|
||||
|
||||
LLIST_TS_UNLOCK (&alist_p);
|
||||
LLIST_TS_UNLOCK(&alist_p);
|
||||
}
|
||||
|
||||
/* Updates the Appointment panel */
|
||||
void
|
||||
apoint_update_panel (int which_pan)
|
||||
void apoint_update_panel(int which_pan)
|
||||
{
|
||||
int title_xpos;
|
||||
int bordr = 1;
|
||||
@@ -650,56 +591,53 @@ apoint_update_panel (int which_pan)
|
||||
struct date slctd_date;
|
||||
|
||||
/* variable inits */
|
||||
slctd_date = *calendar_get_slctd_day ();
|
||||
title_xpos = win[APP].w - (strlen (_(monthnames[slctd_date.mm - 1])) + 16);
|
||||
slctd_date = *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);
|
||||
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",
|
||||
calendar_get_pom (date), _(monthnames[slctd_date.mm - 1]),
|
||||
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",
|
||||
calendar_get_pom(date), _(monthnames[slctd_date.mm - 1]),
|
||||
slctd_date.dd, slctd_date.yyyy);
|
||||
custom_remove_attr (win[APP].p, ATTR_HIGHEST);
|
||||
custom_remove_attr(win[APP].p, ATTR_HIGHEST);
|
||||
|
||||
/* Draw the scrollbar if necessary. */
|
||||
if ((apad.length >= app_length) || (apad.first_onscreen > 0))
|
||||
{
|
||||
float ratio = ((float) app_length) / ((float) apad.length);
|
||||
int sbar_length = (int) (ratio * app_length);
|
||||
int highend = (int) (ratio * apad.first_onscreen);
|
||||
if ((apad.length >= app_length) || (apad.first_onscreen > 0)) {
|
||||
float ratio = ((float)app_length) / ((float)apad.length);
|
||||
int sbar_length = (int)(ratio * app_length);
|
||||
int highend = (int)(ratio * apad.first_onscreen);
|
||||
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,
|
||||
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,
|
||||
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);
|
||||
}
|
||||
|
||||
void
|
||||
apoint_paste_item (void)
|
||||
void apoint_paste_item(void)
|
||||
{
|
||||
long bkp_time, bkp_start;
|
||||
|
||||
bkp_time = get_item_time (bkp_cut_apoint.start);
|
||||
bkp_start = calendar_get_slctd_day_sec () + bkp_time;
|
||||
apoint_new (bkp_cut_apoint.mesg, bkp_cut_apoint.note, bkp_start,
|
||||
bkp_time = get_item_time(bkp_cut_apoint.start);
|
||||
bkp_start = calendar_get_slctd_day_sec() + bkp_time;
|
||||
apoint_new(bkp_cut_apoint.mesg, bkp_cut_apoint.note, bkp_start,
|
||||
bkp_cut_apoint.dur, bkp_cut_apoint.state);
|
||||
|
||||
if (notify_bar ())
|
||||
notify_check_added (bkp_cut_apoint.mesg, bkp_start, bkp_cut_apoint.state);
|
||||
if (notify_bar())
|
||||
notify_check_added(bkp_cut_apoint.mesg, bkp_start, bkp_cut_apoint.state);
|
||||
|
||||
apoint_free_bkp ();
|
||||
apoint_free_bkp();
|
||||
}
|
||||
|
||||
579
src/args.c
579
src/args.c
@@ -58,43 +58,39 @@ enum {
|
||||
/*
|
||||
* Print Calcurse usage and exit.
|
||||
*/
|
||||
static void
|
||||
usage (void)
|
||||
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);
|
||||
fputs(arg_usage, stdout);
|
||||
}
|
||||
|
||||
static void
|
||||
usage_try (void)
|
||||
static void usage_try(void)
|
||||
{
|
||||
const char *arg_usage_try = _("Try 'calcurse -h' for more information.\n");
|
||||
fputs (arg_usage_try, stdout);
|
||||
fputs(arg_usage_try, stdout);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print Calcurse version with a short copyright text and exit.
|
||||
*/
|
||||
static void
|
||||
version_arg (void)
|
||||
static void version_arg(void)
|
||||
{
|
||||
const char *vtext =
|
||||
_("\nCopyright (c) 2004-2012 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);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the command line options and exit.
|
||||
*/
|
||||
static void
|
||||
help_arg (void)
|
||||
static void help_arg(void)
|
||||
{
|
||||
const char *htext =
|
||||
_("\nMiscellaneous:\n"
|
||||
@@ -154,9 +150,9 @@ help_arg (void)
|
||||
"or read the manpage.\n"
|
||||
"Mail bug reports and suggestions to <misc@calcurse.org>.\n");
|
||||
|
||||
fprintf (stdout, _("Calcurse %s - text-based organizer\n"), VERSION);
|
||||
usage ();
|
||||
fputs (htext, stdout);
|
||||
fprintf(stdout, _("Calcurse %s - text-based organizer\n"), VERSION);
|
||||
usage();
|
||||
fputs(htext, stdout);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -170,26 +166,24 @@ help_arg (void)
|
||||
* The status is obtained by looking at pid files in user data directory
|
||||
* (.calcurse.pid and .daemon.pid).
|
||||
*/
|
||||
static void
|
||||
status_arg (void)
|
||||
static void status_arg(void)
|
||||
{
|
||||
int cpid, dpid;
|
||||
|
||||
cpid = io_get_pid (path_cpid);
|
||||
dpid = io_get_pid (path_dpid);
|
||||
cpid = io_get_pid(path_cpid);
|
||||
dpid = io_get_pid(path_dpid);
|
||||
|
||||
EXIT_IF (cpid && 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);
|
||||
"Please check manually and restart calcurse.\n"), cpid, dpid);
|
||||
|
||||
if (cpid)
|
||||
fprintf (stdout, _("calcurse is running (pid %d)\n"), cpid);
|
||||
fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid);
|
||||
else if (dpid)
|
||||
fprintf (stdout, _("calcurse is running in background (pid %d)\n"), dpid);
|
||||
fprintf(stdout, _("calcurse is running in background (pid %d)\n"), dpid);
|
||||
else
|
||||
puts (_("calcurse is not running\n"));
|
||||
puts(_("calcurse is not running\n"));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -199,8 +193,7 @@ status_arg (void)
|
||||
* If priority == 0, only completed tasks will be displayed.
|
||||
* If regex is not null, only the matching todos are printed.
|
||||
*/
|
||||
static void
|
||||
todo_arg (int priority, const char *format, regex_t *regex)
|
||||
static void todo_arg(int priority, const char *format, regex_t * regex)
|
||||
{
|
||||
llist_item_t *i;
|
||||
int title = 1;
|
||||
@@ -218,26 +211,20 @@ 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)
|
||||
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)
|
||||
{
|
||||
if (todo->id < 0) { /* completed task */
|
||||
if (priority == 0) {
|
||||
DISPLAY_TITLE;
|
||||
print_todo (format, todo);
|
||||
print_todo(format, todo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (priority < 0 || todo->id == priority)
|
||||
{
|
||||
} else {
|
||||
if (priority < 0 || todo->id == priority) {
|
||||
DISPLAY_TITLE;
|
||||
print_todo (format, todo);
|
||||
print_todo(format, todo);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,11 +233,10 @@ todo_arg (int priority, const char *format, regex_t *regex)
|
||||
}
|
||||
|
||||
/* Print the next appointment within the upcoming 24 hours. */
|
||||
static void
|
||||
next_arg (void)
|
||||
static void next_arg(void)
|
||||
{
|
||||
struct notify_app next_app;
|
||||
const long current_time = now ();
|
||||
const long current_time = now();
|
||||
int time_left, hours_left, min_left;
|
||||
char mesg[BUFSIZ];
|
||||
|
||||
@@ -258,37 +244,35 @@ next_arg (void)
|
||||
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);
|
||||
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)
|
||||
{
|
||||
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);
|
||||
snprintf (mesg, BUFSIZ, " [%02d:%02d] %s\n", hours_left, min_left,
|
||||
fputs(_("next appointment:\n"), stdout);
|
||||
snprintf(mesg, BUFSIZ, " [%02d:%02d] %s\n", hours_left, min_left,
|
||||
next_app.txt);
|
||||
fputs (mesg, stdout);
|
||||
mem_free (next_app.txt);
|
||||
fputs(mesg, stdout);
|
||||
mem_free(next_app.txt);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the date on stdout.
|
||||
*/
|
||||
static void
|
||||
arg_print_date (long date)
|
||||
static void arg_print_date(long date)
|
||||
{
|
||||
char date_str[BUFSIZ];
|
||||
time_t t;
|
||||
struct tm *lt;
|
||||
|
||||
t = date;
|
||||
lt = localtime (&t);
|
||||
strftime (date_str, BUFSIZ, conf.output_datefmt, lt);
|
||||
fputs (date_str, stdout);
|
||||
fputs (":\n", stdout);
|
||||
lt = localtime(&t);
|
||||
strftime(date_str, BUFSIZ, conf.output_datefmt, lt);
|
||||
fputs(date_str, stdout);
|
||||
fputs(":\n", stdout);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -298,9 +282,9 @@ arg_print_date (long date)
|
||||
* If regex is not null, only the matching appointments or events are printed.
|
||||
*/
|
||||
static int
|
||||
app_arg (int add_line, struct date *day, long date, const char *fmt_apt,
|
||||
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)
|
||||
regex_t * regex)
|
||||
{
|
||||
llist_item_t *i, *j;
|
||||
long today;
|
||||
@@ -308,7 +292,7 @@ app_arg (int add_line, struct date *day, long date, const char *fmt_apt,
|
||||
int app_found = 0;
|
||||
|
||||
if (date == 0)
|
||||
today = get_sec_date (*day);
|
||||
today = get_sec_date(*day);
|
||||
else
|
||||
today = date;
|
||||
|
||||
@@ -317,131 +301,113 @@ app_arg (int add_line, struct date *day, long date, const char *fmt_apt,
|
||||
* that date and it is the first one, and then print all the events for
|
||||
* that date.
|
||||
*/
|
||||
LLIST_FIND_FOREACH (&recur_elist, today, recur_event_inday, i)
|
||||
{
|
||||
struct recur_event *re = LLIST_GET_DATA (i);
|
||||
if (regex && regexec (regex, re->mesg, 0, 0, 0) != 0)
|
||||
LLIST_FIND_FOREACH(&recur_elist, today, recur_event_inday, i) {
|
||||
struct recur_event *re = LLIST_GET_DATA(i);
|
||||
if (regex && regexec(regex, re->mesg, 0, 0, 0) != 0)
|
||||
continue;
|
||||
|
||||
app_found = 1;
|
||||
if (add_line)
|
||||
{
|
||||
fputs ("\n", stdout);
|
||||
if (add_line) {
|
||||
fputs("\n", stdout);
|
||||
add_line = 0;
|
||||
}
|
||||
if (print_date)
|
||||
{
|
||||
arg_print_date (today);
|
||||
if (print_date) {
|
||||
arg_print_date(today);
|
||||
print_date = 0;
|
||||
}
|
||||
print_recur_event (fmt_rev, today, re);
|
||||
print_recur_event(fmt_rev, today, re);
|
||||
}
|
||||
|
||||
LLIST_FIND_FOREACH_CONT (&eventlist, today, event_inday, i)
|
||||
{
|
||||
struct event *ev = LLIST_TS_GET_DATA (i);
|
||||
if (regex && regexec (regex, ev->mesg, 0, 0, 0) != 0)
|
||||
LLIST_FIND_FOREACH_CONT(&eventlist, today, event_inday, i) {
|
||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||
if (regex && regexec(regex, ev->mesg, 0, 0, 0) != 0)
|
||||
continue;
|
||||
|
||||
app_found = 1;
|
||||
if (add_line)
|
||||
{
|
||||
fputs ("\n", stdout);
|
||||
if (add_line) {
|
||||
fputs("\n", stdout);
|
||||
add_line = 0;
|
||||
}
|
||||
if (print_date)
|
||||
{
|
||||
arg_print_date (today);
|
||||
if (print_date) {
|
||||
arg_print_date(today);
|
||||
print_date = 0;
|
||||
}
|
||||
print_event (fmt_ev, today, ev);
|
||||
print_event(fmt_ev, today, ev);
|
||||
}
|
||||
|
||||
/* Same process is performed but this time on the appointments. */
|
||||
LLIST_TS_LOCK (&alist_p);
|
||||
LLIST_TS_LOCK (&recur_alist_p);
|
||||
LLIST_TS_LOCK(&alist_p);
|
||||
LLIST_TS_LOCK(&recur_alist_p);
|
||||
|
||||
/*
|
||||
* Iterate over regular appointments and recurrent ones simultaneously (fixes
|
||||
* http://lists.calcurse.org/bugs/msg00002.html).
|
||||
*/
|
||||
i = LLIST_TS_FIND_FIRST (&alist_p, today, apoint_inday);
|
||||
j = LLIST_TS_FIND_FIRST (&recur_alist_p, today, recur_apoint_inday);
|
||||
while (i || j)
|
||||
{
|
||||
struct apoint *apt = LLIST_TS_GET_DATA (i);
|
||||
struct recur_apoint *ra = LLIST_TS_GET_DATA (j);
|
||||
i = LLIST_TS_FIND_FIRST(&alist_p, today, apoint_inday);
|
||||
j = LLIST_TS_FIND_FIRST(&recur_alist_p, today, recur_apoint_inday);
|
||||
while (i || j) {
|
||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||
struct recur_apoint *ra = LLIST_TS_GET_DATA(j);
|
||||
unsigned occurrence;
|
||||
|
||||
while (i && regex && regexec (regex, apt->mesg, 0, 0, 0) != 0)
|
||||
{
|
||||
i = LLIST_TS_FIND_NEXT (i, today, apoint_inday);
|
||||
apt = LLIST_TS_GET_DATA (i);
|
||||
while (i && regex && regexec(regex, apt->mesg, 0, 0, 0) != 0) {
|
||||
i = LLIST_TS_FIND_NEXT(i, today, apoint_inday);
|
||||
apt = LLIST_TS_GET_DATA(i);
|
||||
}
|
||||
|
||||
while (j && regex && regexec (regex, ra->mesg, 0, 0, 0) != 0)
|
||||
{
|
||||
j = LLIST_TS_FIND_NEXT (j, today, recur_apoint_inday);
|
||||
ra = LLIST_TS_GET_DATA (j);
|
||||
while (j && regex && regexec(regex, ra->mesg, 0, 0, 0) != 0) {
|
||||
j = LLIST_TS_FIND_NEXT(j, today, recur_apoint_inday);
|
||||
ra = LLIST_TS_GET_DATA(j);
|
||||
}
|
||||
|
||||
if (apt && ra)
|
||||
{
|
||||
if (recur_apoint_find_occurrence (ra, today, &occurrence) &&
|
||||
if (apt && ra) {
|
||||
if (recur_apoint_find_occurrence(ra, today, &occurrence) &&
|
||||
apt->start <= occurrence)
|
||||
ra = NULL;
|
||||
else
|
||||
apt = NULL;
|
||||
}
|
||||
|
||||
if (apt)
|
||||
{
|
||||
if (apt) {
|
||||
app_found = 1;
|
||||
if (add_line)
|
||||
{
|
||||
fputs ("\n", stdout);
|
||||
if (add_line) {
|
||||
fputs("\n", stdout);
|
||||
add_line = 0;
|
||||
}
|
||||
if (print_date)
|
||||
{
|
||||
arg_print_date (today);
|
||||
if (print_date) {
|
||||
arg_print_date(today);
|
||||
print_date = 0;
|
||||
}
|
||||
print_apoint (fmt_apt, today, apt);
|
||||
i = LLIST_TS_FIND_NEXT (i, today, apoint_inday);
|
||||
}
|
||||
else if (ra)
|
||||
{
|
||||
print_apoint(fmt_apt, today, apt);
|
||||
i = LLIST_TS_FIND_NEXT(i, today, apoint_inday);
|
||||
} else if (ra) {
|
||||
app_found = 1;
|
||||
if (add_line)
|
||||
{
|
||||
fputs ("\n", stdout);
|
||||
if (add_line) {
|
||||
fputs("\n", stdout);
|
||||
add_line = 0;
|
||||
}
|
||||
if (print_date)
|
||||
{
|
||||
arg_print_date (today);
|
||||
if (print_date) {
|
||||
arg_print_date(today);
|
||||
print_date = 0;
|
||||
}
|
||||
recur_apoint_find_occurrence (ra, today, &occurrence);
|
||||
print_recur_apoint (fmt_rapt, today, occurrence, ra);
|
||||
recur_apoint_find_occurrence(ra, today, &occurrence);
|
||||
print_recur_apoint(fmt_rapt, today, occurrence, ra);
|
||||
apt = NULL;
|
||||
j = LLIST_TS_FIND_NEXT (j, today, recur_apoint_inday);
|
||||
j = LLIST_TS_FIND_NEXT(j, today, recur_apoint_inday);
|
||||
}
|
||||
}
|
||||
|
||||
LLIST_TS_UNLOCK (&recur_alist_p);
|
||||
LLIST_TS_UNLOCK (&alist_p);
|
||||
LLIST_TS_UNLOCK(&recur_alist_p);
|
||||
LLIST_TS_UNLOCK(&alist_p);
|
||||
|
||||
return app_found;
|
||||
}
|
||||
|
||||
static void
|
||||
more_info (void)
|
||||
static void more_info(void)
|
||||
{
|
||||
fputs (_("\nFor more information, type '?' from within Calcurse, "
|
||||
fputs(_("\nFor more information, type '?' from within Calcurse, "
|
||||
"or read the manpage.\n"), stdout);
|
||||
fputs (_("Mail bug reports and suggestions to "
|
||||
fputs(_("Mail bug reports and suggestions to "
|
||||
"<misc@calcurse.org>.\n"), stdout);
|
||||
}
|
||||
|
||||
@@ -451,24 +417,23 @@ more_info (void)
|
||||
* to format the output correctly.
|
||||
*/
|
||||
static void
|
||||
display_app (struct tm *t, int numdays, int add_line, const char *fmt_apt,
|
||||
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)
|
||||
regex_t * regex)
|
||||
{
|
||||
int i, app_found;
|
||||
struct date day;
|
||||
|
||||
for (i = 0; i < numdays; i++)
|
||||
{
|
||||
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,
|
||||
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);
|
||||
mktime(t);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -477,9 +442,9 @@ display_app (struct tm *t, int numdays, int add_line, const char *fmt_apt,
|
||||
* days.
|
||||
*/
|
||||
static void
|
||||
date_arg (const char *ddate, int add_line, const char *fmt_apt,
|
||||
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)
|
||||
regex_t * regex)
|
||||
{
|
||||
int i;
|
||||
struct date day;
|
||||
@@ -492,43 +457,36 @@ date_arg (const char *ddate, int add_line, const char *fmt_apt,
|
||||
* Check (with the argument length) if a date or a number of days
|
||||
* was entered, and then call app_arg() to print appointments
|
||||
*/
|
||||
arg_len = strlen (ddate);
|
||||
if (arg_len <= 4)
|
||||
{ /* a number of days was entered */
|
||||
for (i = 0; i <= arg_len - 1; i++)
|
||||
{
|
||||
if (isdigit (ddate[i]))
|
||||
arg_len = strlen(ddate);
|
||||
if (arg_len <= 4) { /* a number of days was entered */
|
||||
for (i = 0; i <= arg_len - 1; i++) {
|
||||
if (isdigit(ddate[i]))
|
||||
num_digit++;
|
||||
}
|
||||
if (num_digit == arg_len)
|
||||
numdays = atoi (ddate);
|
||||
numdays = atoi(ddate);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
t = *localtime (&timer);
|
||||
display_app (&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
||||
timer = time(NULL);
|
||||
t = *localtime(&timer);
|
||||
display_app(&t, numdays, 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
|
||||
{
|
||||
} 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 {
|
||||
char outstr[BUFSIZ];
|
||||
fputs (_("Argument to the '-d' flag is not valid\n"), stderr);
|
||||
snprintf (outstr, BUFSIZ,
|
||||
fputs(_("Argument to the '-d' flag is not valid\n"), stderr);
|
||||
snprintf(outstr, BUFSIZ,
|
||||
"Possible argument format are: '%s' or 'n'\n",
|
||||
DATEFMT_DESC (conf.input_datefmt));
|
||||
fputs (_(outstr), stdout);
|
||||
more_info ();
|
||||
DATEFMT_DESC(conf.input_datefmt));
|
||||
fputs(_(outstr), stdout);
|
||||
more_info();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -542,9 +500,9 @@ date_arg (const char *ddate, int add_line, const char *fmt_apt,
|
||||
* Many thanks to Erik Saule for providing this function.
|
||||
*/
|
||||
static void
|
||||
date_arg_extended (const char *startday, const char *range, int add_line,
|
||||
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_ev, const char *fmt_rev, regex_t * regex)
|
||||
{
|
||||
int i, numdays = 1, error = 0, arg_len = 0;
|
||||
static struct tm t;
|
||||
@@ -553,58 +511,47 @@ date_arg_extended (const char *startday, const char *range, int add_line,
|
||||
/*
|
||||
* Check arguments and extract information
|
||||
*/
|
||||
if (range != NULL)
|
||||
{
|
||||
arg_len = strlen (range);
|
||||
for (i = 0; i <= arg_len - 1; i++)
|
||||
{
|
||||
if (!isdigit (range[i]))
|
||||
if (range != NULL) {
|
||||
arg_len = strlen(range);
|
||||
for (i = 0; i <= arg_len - 1; i++) {
|
||||
if (!isdigit(range[i]))
|
||||
error = 1;
|
||||
}
|
||||
if (!error)
|
||||
numdays = atoi (range);
|
||||
numdays = atoi(range);
|
||||
}
|
||||
timer = time (NULL);
|
||||
t = *localtime (&timer);
|
||||
if (startday != NULL)
|
||||
{
|
||||
if (parse_date (startday, conf.input_datefmt, (int *)&t.tm_year,
|
||||
(int *)&t.tm_mon, (int *)&t.tm_mday, NULL))
|
||||
{
|
||||
timer = time(NULL);
|
||||
t = *localtime(&timer);
|
||||
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
|
||||
{
|
||||
mktime(&t);
|
||||
} else {
|
||||
error = 1;
|
||||
}
|
||||
}
|
||||
if (!error)
|
||||
{
|
||||
display_app (&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
||||
if (!error) {
|
||||
display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
||||
regex);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
char outstr[BUFSIZ];
|
||||
fputs (_("Argument is not valid\n"), stderr);
|
||||
snprintf (outstr, BUFSIZ,
|
||||
fputs(_("Argument is not valid\n"), stderr);
|
||||
snprintf(outstr, BUFSIZ,
|
||||
"Argument format for -s and --startday is: '%s'\n",
|
||||
DATEFMT_DESC (conf.input_datefmt));
|
||||
fputs (_(outstr), stdout);
|
||||
fputs (_("Argument format for -r and --range is: 'n'\n"), stdout);
|
||||
more_info ();
|
||||
DATEFMT_DESC(conf.input_datefmt));
|
||||
fputs(_(outstr), stdout);
|
||||
fputs(_("Argument format for -r and --range is: 'n'\n"), stdout);
|
||||
more_info();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Parse the command-line arguments and call the appropriate
|
||||
* routines to handle those arguments. Also initialize the data paths.
|
||||
*/
|
||||
int
|
||||
parse_args (int argc, char **argv)
|
||||
int parse_args(int argc, char **argv)
|
||||
{
|
||||
int ch, add_line = 0;
|
||||
int unknown_flag = 0;
|
||||
@@ -637,8 +584,7 @@ parse_args (int argc, char **argv)
|
||||
|
||||
/* Long options only */
|
||||
int statusflag = 0; /* --status: get the status of running instances */
|
||||
enum
|
||||
{
|
||||
enum {
|
||||
STATUS_OPT = CHAR_MAX + 1
|
||||
};
|
||||
|
||||
@@ -671,10 +617,8 @@ parse_args (int argc, char **argv)
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
|
||||
while ((ch = getopt_long (argc, argv, optstr, longopts, NULL)) != -1)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
while ((ch = getopt_long(argc, argv, optstr, longopts, NULL)) != -1) {
|
||||
switch (ch) {
|
||||
case STATUS_OPT:
|
||||
statusflag = 1;
|
||||
break;
|
||||
@@ -729,11 +673,10 @@ parse_args (int argc, char **argv)
|
||||
startday = optarg;
|
||||
break;
|
||||
case 'S':
|
||||
EXIT_IF (Sflag > 0,
|
||||
_("Can not handle more than one regular expression."));
|
||||
EXIT_IF(Sflag > 0, _("Can not handle more than one regular expression."));
|
||||
Sflag = 1;
|
||||
if (regcomp (®, optarg, REG_EXTENDED))
|
||||
EXIT (_("Could not compile regular expression."));
|
||||
if (regcomp(®, optarg, REG_EXTENDED))
|
||||
EXIT(_("Could not compile regular expression."));
|
||||
preg = ®
|
||||
break;
|
||||
case 't':
|
||||
@@ -741,17 +684,14 @@ parse_args (int argc, char **argv)
|
||||
multiple_flag++;
|
||||
load_data++;
|
||||
add_line = 1;
|
||||
if (optarg != NULL)
|
||||
{
|
||||
tnum = atoi (optarg);
|
||||
if (tnum < 0 || tnum > 9)
|
||||
{
|
||||
usage ();
|
||||
usage_try ();
|
||||
if (optarg != NULL) {
|
||||
tnum = atoi(optarg);
|
||||
if (tnum < 0 || tnum > 9) {
|
||||
usage();
|
||||
usage_try();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
tnum = -1;
|
||||
break;
|
||||
case 'v':
|
||||
@@ -761,23 +701,19 @@ parse_args (int argc, char **argv)
|
||||
xflag = 1;
|
||||
multiple_flag++;
|
||||
load_data++;
|
||||
if (optarg != NULL)
|
||||
{
|
||||
if (strcmp (optarg, "ical") == 0)
|
||||
if (optarg != NULL) {
|
||||
if (strcmp(optarg, "ical") == 0)
|
||||
xfmt = IO_EXPORT_ICAL;
|
||||
else if (strcmp (optarg, "pcal") == 0)
|
||||
else if (strcmp(optarg, "pcal") == 0)
|
||||
xfmt = IO_EXPORT_PCAL;
|
||||
else
|
||||
{
|
||||
fputs (_("Argument for '-x' should be either "
|
||||
else {
|
||||
fputs(_("Argument for '-x' should be either "
|
||||
"'ical' or 'pcal'\n"), stderr);
|
||||
usage ();
|
||||
usage_try ();
|
||||
usage();
|
||||
usage_try();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
xfmt = IO_EXPORT_ICAL;
|
||||
}
|
||||
break;
|
||||
@@ -800,8 +736,8 @@ parse_args (int argc, char **argv)
|
||||
read_only = 1;
|
||||
break;
|
||||
default:
|
||||
usage ();
|
||||
usage_try ();
|
||||
usage();
|
||||
usage_try();
|
||||
unknown_flag = 1;
|
||||
non_interactive = 1;
|
||||
/* NOTREACHED */
|
||||
@@ -809,146 +745,115 @@ parse_args (int argc, char **argv)
|
||||
}
|
||||
argc -= optind;
|
||||
|
||||
if (argc >= 1)
|
||||
{
|
||||
usage ();
|
||||
usage_try ();
|
||||
if (argc >= 1) {
|
||||
usage();
|
||||
usage_try();
|
||||
return EXIT_FAILURE;
|
||||
/* Incorrect arguments */
|
||||
}
|
||||
else if (Dflag && cflag)
|
||||
{
|
||||
fputs (_("Options '-D' and '-c' cannot be used at the same time\n"),
|
||||
stderr);
|
||||
usage ();
|
||||
usage_try ();
|
||||
} else if (Dflag && cflag) {
|
||||
fputs(_("Options '-D' and '-c' cannot be used at the same time\n"), stderr);
|
||||
usage();
|
||||
usage_try();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
else if (Sflag && !(aflag || dflag || rflag || sflag || tflag))
|
||||
{
|
||||
fputs (_("Option '-S' must be used with either '-d', '-r', '-s', "
|
||||
} 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 ();
|
||||
usage();
|
||||
usage_try();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (unknown_flag)
|
||||
{
|
||||
} else {
|
||||
if (unknown_flag) {
|
||||
non_interactive = 1;
|
||||
}
|
||||
else if (hflag)
|
||||
{
|
||||
help_arg ();
|
||||
} else if (hflag) {
|
||||
help_arg();
|
||||
non_interactive = 1;
|
||||
}
|
||||
else if (vflag)
|
||||
{
|
||||
version_arg ();
|
||||
} else if (vflag) {
|
||||
version_arg();
|
||||
non_interactive = 1;
|
||||
}
|
||||
else if (statusflag)
|
||||
{
|
||||
io_init (cfile, datadir);
|
||||
status_arg ();
|
||||
} else if (statusflag) {
|
||||
io_init(cfile, datadir);
|
||||
status_arg();
|
||||
non_interactive = 1;
|
||||
}
|
||||
else if (gflag)
|
||||
{
|
||||
io_init (cfile, datadir);
|
||||
io_check_dir (path_dir, NULL);
|
||||
io_check_dir (path_notes, NULL);
|
||||
io_check_file (path_apts, NULL);
|
||||
io_check_file (path_todo, NULL);
|
||||
io_load_app ();
|
||||
io_load_todo ();
|
||||
note_gc ();
|
||||
} else if (gflag) {
|
||||
io_init(cfile, datadir);
|
||||
io_check_dir(path_dir, NULL);
|
||||
io_check_dir(path_notes, NULL);
|
||||
io_check_file(path_apts, NULL);
|
||||
io_check_file(path_todo, NULL);
|
||||
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, NULL);
|
||||
io_check_dir(path_notes, NULL);
|
||||
}
|
||||
else if (multiple_flag)
|
||||
{
|
||||
if (load_data)
|
||||
{
|
||||
io_init (cfile, datadir);
|
||||
io_check_dir (path_dir, NULL);
|
||||
io_check_dir (path_notes, NULL);
|
||||
}
|
||||
if (iflag)
|
||||
{
|
||||
io_check_file (path_apts, NULL);
|
||||
io_check_file (path_todo, NULL);
|
||||
if (iflag) {
|
||||
io_check_file(path_apts, NULL);
|
||||
io_check_file(path_todo, NULL);
|
||||
/* 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 ();
|
||||
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, NULL);
|
||||
io_check_file (path_todo, NULL);
|
||||
io_load_app ();
|
||||
io_load_todo ();
|
||||
io_export_data (xfmt);
|
||||
if (xflag) {
|
||||
io_check_file(path_apts, NULL);
|
||||
io_check_file(path_todo, NULL);
|
||||
io_load_app();
|
||||
io_load_todo();
|
||||
io_export_data(xfmt);
|
||||
non_interactive = 1;
|
||||
return non_interactive;
|
||||
}
|
||||
if (tflag)
|
||||
{
|
||||
io_check_file (path_todo, NULL);
|
||||
io_load_todo ();
|
||||
todo_arg (tnum, fmt_todo, preg);
|
||||
if (tflag) {
|
||||
io_check_file(path_todo, NULL);
|
||||
io_load_todo();
|
||||
todo_arg(tnum, fmt_todo, preg);
|
||||
non_interactive = 1;
|
||||
}
|
||||
if (nflag)
|
||||
{
|
||||
io_check_file (path_apts, NULL);
|
||||
io_load_app ();
|
||||
next_arg ();
|
||||
if (nflag) {
|
||||
io_check_file(path_apts, NULL);
|
||||
io_load_app();
|
||||
next_arg();
|
||||
non_interactive = 1;
|
||||
}
|
||||
if (dflag || rflag || sflag)
|
||||
{
|
||||
io_check_file (path_apts, NULL);
|
||||
io_check_file (path_conf, NULL);
|
||||
io_load_app ();
|
||||
config_load (); /* To get output date format. */
|
||||
if (dflag || rflag || sflag) {
|
||||
io_check_file(path_apts, NULL);
|
||||
io_check_file(path_conf, NULL);
|
||||
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);
|
||||
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,
|
||||
date_arg_extended(startday, range, add_line, fmt_apt,
|
||||
fmt_rapt, fmt_ev, fmt_rev, preg);
|
||||
non_interactive = 1;
|
||||
}
|
||||
else if (aflag)
|
||||
{
|
||||
} else if (aflag) {
|
||||
struct date day;
|
||||
|
||||
io_check_file (path_apts, NULL);
|
||||
io_check_file (path_conf, NULL);
|
||||
vars_init ();
|
||||
config_load (); /* To get output date format. */
|
||||
io_load_app ();
|
||||
io_check_file(path_apts, NULL);
|
||||
io_check_file(path_conf, NULL);
|
||||
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);
|
||||
app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg);
|
||||
non_interactive = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
non_interactive = 0;
|
||||
io_init (cfile, datadir);
|
||||
io_init(cfile, datadir);
|
||||
}
|
||||
}
|
||||
|
||||
if (preg)
|
||||
regfree (preg);
|
||||
regfree(preg);
|
||||
|
||||
return non_interactive;
|
||||
}
|
||||
|
||||
545
src/calcurse.c
545
src/calcurse.c
@@ -42,14 +42,13 @@
|
||||
* Store the events and appointments for the selected day and reset the
|
||||
* appointment highlight pointer if a new day was selected.
|
||||
*/
|
||||
static struct day_items_nb
|
||||
do_storage (int day_changed)
|
||||
static struct day_items_nb do_storage(int day_changed)
|
||||
{
|
||||
struct day_items_nb inday = *day_process_storage (calendar_get_slctd_day (),
|
||||
struct day_items_nb inday = *day_process_storage(calendar_get_slctd_day(),
|
||||
day_changed, &inday);
|
||||
|
||||
if (day_changed)
|
||||
apoint_hilt_set (1);
|
||||
apoint_hilt_set(1);
|
||||
|
||||
return inday;
|
||||
}
|
||||
@@ -61,8 +60,7 @@ do_storage (int day_changed)
|
||||
* and one can choose between different color schemes and layouts.
|
||||
* All of the commands are documented within an online help system.
|
||||
*/
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct day_items_nb inday;
|
||||
int no_data_file = 1;
|
||||
@@ -70,209 +68,195 @@ main (int argc, char **argv)
|
||||
int count;
|
||||
|
||||
#if ENABLE_NLS
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
setlocale(LC_ALL, "");
|
||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||
textdomain(PACKAGE);
|
||||
#endif /* ENABLE_NLS */
|
||||
|
||||
/* Thread-safe data structure init */
|
||||
apoint_llist_init ();
|
||||
recur_apoint_llist_init ();
|
||||
apoint_llist_init();
|
||||
recur_apoint_llist_init();
|
||||
|
||||
/* Initialize non-thread-safe data structures. */
|
||||
event_llist_init ();
|
||||
todo_init_list ();
|
||||
event_llist_init();
|
||||
todo_init_list();
|
||||
|
||||
/*
|
||||
* Begin by parsing and handling command line arguments.
|
||||
* The data path is also initialized here.
|
||||
*/
|
||||
if (parse_args (argc, argv))
|
||||
{
|
||||
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 ();
|
||||
exit_calcurse(EXIT_SUCCESS);
|
||||
} else {
|
||||
no_data_file = io_check_data_files();
|
||||
dmon_stop();
|
||||
io_set_lock();
|
||||
}
|
||||
|
||||
/* Begin of interactive mode with ncurses interface. */
|
||||
sigs_init (); /* signal handling init */
|
||||
initscr (); /* start the curses mode */
|
||||
cbreak (); /* control chars generate a signal */
|
||||
noecho (); /* controls echoing of typed chars */
|
||||
curs_set (0); /* make cursor invisible */
|
||||
calendar_set_current_date ();
|
||||
notify_init_vars ();
|
||||
wins_get_config ();
|
||||
sigs_init(); /* signal handling init */
|
||||
initscr(); /* start the curses mode */
|
||||
cbreak(); /* control chars generate a signal */
|
||||
noecho(); /* controls echoing of typed chars */
|
||||
curs_set(0); /* make cursor invisible */
|
||||
calendar_set_current_date();
|
||||
notify_init_vars();
|
||||
wins_get_config();
|
||||
|
||||
/* Check if terminal supports color. */
|
||||
if (has_colors ())
|
||||
{
|
||||
if (has_colors()) {
|
||||
colorize = 1;
|
||||
background = COLOR_BLACK;
|
||||
foreground = COLOR_WHITE;
|
||||
start_color ();
|
||||
start_color();
|
||||
|
||||
#ifdef NCURSES_VERSION
|
||||
if (use_default_colors () != ERR)
|
||||
{
|
||||
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
|
||||
{
|
||||
init_pair(COLR_RED, COLOR_RED, background);
|
||||
init_pair(COLR_GREEN, COLOR_GREEN, background);
|
||||
init_pair(COLR_YELLOW, COLOR_YELLOW, background);
|
||||
init_pair(COLR_BLUE, COLOR_BLUE, background);
|
||||
init_pair(COLR_MAGENTA, COLOR_MAGENTA, background);
|
||||
init_pair(COLR_CYAN, COLOR_CYAN, background);
|
||||
init_pair(COLR_DEFAULT, foreground, background);
|
||||
init_pair(COLR_HIGH, COLOR_BLACK, COLOR_GREEN);
|
||||
init_pair(COLR_CUSTOM, COLOR_RED, background);
|
||||
} else {
|
||||
colorize = 0;
|
||||
background = COLOR_BLACK;
|
||||
}
|
||||
|
||||
vars_init ();
|
||||
wins_init ();
|
||||
wins_slctd_init ();
|
||||
notify_init_bar ();
|
||||
wins_reset_status_page ();
|
||||
vars_init();
|
||||
wins_init();
|
||||
wins_slctd_init();
|
||||
notify_init_bar();
|
||||
wins_reset_status_page();
|
||||
|
||||
/*
|
||||
* Read the data from files : first the user
|
||||
* configuration (the display is then updated), and then
|
||||
* the todo list, appointments and events.
|
||||
*/
|
||||
config_load ();
|
||||
wins_erase_status_bar ();
|
||||
io_load_keys (conf.pager);
|
||||
io_load_todo ();
|
||||
io_load_app ();
|
||||
wins_reinit ();
|
||||
if (conf.system_dialogs)
|
||||
{
|
||||
wins_update (FLAG_ALL);
|
||||
io_startup_screen (no_data_file);
|
||||
config_load();
|
||||
wins_erase_status_bar();
|
||||
io_load_keys(conf.pager);
|
||||
io_load_todo();
|
||||
io_load_app();
|
||||
wins_reinit();
|
||||
if (conf.system_dialogs) {
|
||||
wins_update(FLAG_ALL);
|
||||
io_startup_screen(no_data_file);
|
||||
}
|
||||
inday = *day_process_storage (0, 0, &inday);
|
||||
wins_slctd_set (CAL);
|
||||
wins_update (FLAG_ALL);
|
||||
inday = *day_process_storage(0, 0, &inday);
|
||||
wins_slctd_set(CAL);
|
||||
wins_update(FLAG_ALL);
|
||||
|
||||
/* Start miscellaneous threads. */
|
||||
if (notify_bar ())
|
||||
notify_start_main_thread ();
|
||||
calendar_start_date_thread ();
|
||||
if (notify_bar())
|
||||
notify_start_main_thread();
|
||||
calendar_start_date_thread();
|
||||
if (conf.periodic_save > 0)
|
||||
io_start_psave_thread ();
|
||||
io_start_psave_thread();
|
||||
|
||||
/* User input */
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
int key;
|
||||
|
||||
if (resize)
|
||||
{
|
||||
if (resize) {
|
||||
resize = 0;
|
||||
wins_reset ();
|
||||
wins_reset();
|
||||
}
|
||||
|
||||
key = keys_getch (win[STA].p, &count);
|
||||
switch (key)
|
||||
{
|
||||
key = keys_getch(win[STA].p, &count);
|
||||
switch (key) {
|
||||
case KEY_GENERIC_REDRAW:
|
||||
resize = 1;
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_CHANGE_VIEW:
|
||||
wins_reset_status_page ();
|
||||
wins_slctd_next ();
|
||||
wins_reset_status_page();
|
||||
wins_slctd_next();
|
||||
|
||||
/* Select the event to highlight. */
|
||||
switch (wins_slctd ())
|
||||
{
|
||||
switch (wins_slctd()) {
|
||||
case TOD:
|
||||
if ((todo_hilt () == 0) && (todo_nb () > 0))
|
||||
todo_hilt_set (1);
|
||||
if ((todo_hilt() == 0) && (todo_nb() > 0))
|
||||
todo_hilt_set(1);
|
||||
break;
|
||||
case APP:
|
||||
if ((apoint_hilt () == 0) &&
|
||||
((inday.nb_events + inday.nb_apoints) > 0))
|
||||
apoint_hilt_set (1);
|
||||
if ((apoint_hilt() == 0) && ((inday.nb_events + inday.nb_apoints) > 0))
|
||||
apoint_hilt_set(1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
wins_update (FLAG_ALL);
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_OTHER_CMD:
|
||||
wins_other_status_page (wins_slctd ());
|
||||
wins_update (FLAG_STA);
|
||||
wins_other_status_page(wins_slctd());
|
||||
wins_update(FLAG_STA);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_GOTO:
|
||||
case KEY_GENERIC_GOTO_TODAY:
|
||||
wins_erase_status_bar ();
|
||||
calendar_set_current_date ();
|
||||
wins_erase_status_bar();
|
||||
calendar_set_current_date();
|
||||
if (key == KEY_GENERIC_GOTO_TODAY)
|
||||
calendar_goto_today ();
|
||||
calendar_goto_today();
|
||||
else
|
||||
calendar_change_day (conf.input_datefmt);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
calendar_change_day(conf.input_datefmt);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
break;
|
||||
|
||||
case KEY_VIEW_ITEM:
|
||||
if ((wins_slctd () == APP) && (apoint_hilt () != 0))
|
||||
day_popup_item ();
|
||||
else if ((wins_slctd () == TOD) && (todo_hilt () != 0))
|
||||
item_in_popup (NULL, NULL, todo_saved_mesg (), _("To do :"));
|
||||
wins_update (FLAG_ALL);
|
||||
if ((wins_slctd() == APP) && (apoint_hilt() != 0))
|
||||
day_popup_item();
|
||||
else if ((wins_slctd() == TOD) && (todo_hilt() != 0))
|
||||
item_in_popup(NULL, NULL, todo_saved_mesg(), _("To do :"));
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_CONFIG_MENU:
|
||||
wins_erase_status_bar ();
|
||||
custom_config_main ();
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_ALL);
|
||||
wins_erase_status_bar();
|
||||
custom_config_main();
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_ADD_APPT:
|
||||
apoint_add ();
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
apoint_add();
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_ADD_TODO:
|
||||
todo_new_item ();
|
||||
if (todo_hilt () == 0 && todo_nb () == 1)
|
||||
todo_hilt_increase (1);
|
||||
wins_update (FLAG_TOD | FLAG_STA);
|
||||
todo_new_item();
|
||||
if (todo_hilt() == 0 && todo_nb() == 1)
|
||||
todo_hilt_increase(1);
|
||||
wins_update(FLAG_TOD | FLAG_STA);
|
||||
break;
|
||||
|
||||
case KEY_ADD_ITEM:
|
||||
switch (wins_slctd ())
|
||||
{
|
||||
switch (wins_slctd()) {
|
||||
case APP:
|
||||
apoint_add ();
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
apoint_add();
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
break;
|
||||
case TOD:
|
||||
todo_new_item ();
|
||||
if (todo_hilt () == 0 && todo_nb () == 1)
|
||||
todo_hilt_increase (1);
|
||||
wins_update (FLAG_TOD | FLAG_STA);
|
||||
todo_new_item();
|
||||
if (todo_hilt() == 0 && todo_nb() == 1)
|
||||
todo_hilt_increase(1);
|
||||
wins_update(FLAG_TOD | FLAG_STA);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -280,283 +264,248 @@ main (int argc, char **argv)
|
||||
break;
|
||||
|
||||
case KEY_EDIT_ITEM:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
{
|
||||
day_edit_item ();
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
}
|
||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
{
|
||||
todo_edit_item ();
|
||||
wins_update (FLAG_TOD | FLAG_STA);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||
day_edit_item();
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||
todo_edit_item();
|
||||
wins_update(FLAG_TOD | FLAG_STA);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_DEL_ITEM:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
{
|
||||
apoint_delete (&inday.nb_events, &inday.nb_apoints);
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
}
|
||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
{
|
||||
todo_delete ();
|
||||
wins_update (FLAG_TOD | FLAG_STA);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||
apoint_delete(&inday.nb_events, &inday.nb_apoints);
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||
todo_delete();
|
||||
wins_update(FLAG_TOD | FLAG_STA);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_CUT:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
{
|
||||
cut_item = apoint_cut (&inday.nb_events, &inday.nb_apoints);
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||
cut_item = apoint_cut(&inday.nb_events, &inday.nb_apoints);
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_PASTE:
|
||||
if (wins_slctd () == APP)
|
||||
{
|
||||
apoint_paste (&inday.nb_events, &inday.nb_apoints, cut_item);
|
||||
if (wins_slctd() == APP) {
|
||||
apoint_paste(&inday.nb_events, &inday.nb_apoints, cut_item);
|
||||
cut_item = 0;
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_REPEAT_ITEM:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
recur_repeat_item ();
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0)
|
||||
recur_repeat_item();
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||
break;
|
||||
|
||||
case KEY_FLAG_ITEM:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
{
|
||||
apoint_switch_notify ();
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_APP);
|
||||
}
|
||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
{
|
||||
todo_flag ();
|
||||
wins_update (FLAG_TOD);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||
apoint_switch_notify();
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_APP);
|
||||
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||
todo_flag();
|
||||
wins_update(FLAG_TOD);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_PIPE_ITEM:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
day_pipe_item ();
|
||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
todo_pipe_item ();
|
||||
wins_update (FLAG_ALL);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0)
|
||||
day_pipe_item();
|
||||
else if (wins_slctd() == TOD && todo_hilt() != 0)
|
||||
todo_pipe_item();
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_RAISE_PRIORITY:
|
||||
case KEY_LOWER_PRIORITY:
|
||||
if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
{
|
||||
todo_chg_priority (key);
|
||||
if (todo_hilt_pos () < 0)
|
||||
todo_set_first (todo_hilt ());
|
||||
else if (todo_hilt_pos () >= win[TOD].h - 4)
|
||||
todo_set_first (todo_hilt () - win[TOD].h + 5);
|
||||
wins_update (FLAG_TOD);
|
||||
if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||
todo_chg_priority(key);
|
||||
if (todo_hilt_pos() < 0)
|
||||
todo_set_first(todo_hilt());
|
||||
else if (todo_hilt_pos() >= win[TOD].h - 4)
|
||||
todo_set_first(todo_hilt() - win[TOD].h + 5);
|
||||
wins_update(FLAG_TOD);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_EDIT_NOTE:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
{
|
||||
day_edit_note (conf.editor);
|
||||
inday = do_storage (0);
|
||||
}
|
||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
todo_edit_note (conf.editor);
|
||||
wins_update (FLAG_ALL);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||
day_edit_note(conf.editor);
|
||||
inday = do_storage(0);
|
||||
} else if (wins_slctd() == TOD && todo_hilt() != 0)
|
||||
todo_edit_note(conf.editor);
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_VIEW_NOTE:
|
||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
||||
day_view_note (conf.pager);
|
||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
||||
todo_view_note (conf.pager);
|
||||
wins_update (FLAG_ALL);
|
||||
if (wins_slctd() == APP && apoint_hilt() != 0)
|
||||
day_view_note(conf.pager);
|
||||
else if (wins_slctd() == TOD && todo_hilt() != 0)
|
||||
todo_view_note(conf.pager);
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_HELP:
|
||||
wins_status_bar ();
|
||||
help_screen ();
|
||||
wins_update (FLAG_ALL);
|
||||
wins_status_bar();
|
||||
help_screen();
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_SAVE:
|
||||
io_save_cal (IO_SAVE_DISPLAY_BAR);
|
||||
wins_update (FLAG_STA);
|
||||
io_save_cal(IO_SAVE_DISPLAY_BAR);
|
||||
wins_update(FLAG_STA);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_IMPORT:
|
||||
wins_erase_status_bar ();
|
||||
io_import_data (IO_IMPORT_ICAL, NULL);
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_ALL);
|
||||
wins_erase_status_bar();
|
||||
io_import_data(IO_IMPORT_ICAL, NULL);
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_EXPORT:
|
||||
wins_erase_status_bar ();
|
||||
io_export_bar ();
|
||||
while ((key = wgetch (win[STA].p)) != 'q')
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
wins_erase_status_bar();
|
||||
io_export_bar();
|
||||
while ((key = wgetch(win[STA].p)) != 'q') {
|
||||
switch (key) {
|
||||
case 'I':
|
||||
case 'i':
|
||||
io_export_data (IO_EXPORT_ICAL);
|
||||
io_export_data(IO_EXPORT_ICAL);
|
||||
break;
|
||||
case 'P':
|
||||
case 'p':
|
||||
io_export_data (IO_EXPORT_PCAL);
|
||||
io_export_data(IO_EXPORT_PCAL);
|
||||
break;
|
||||
}
|
||||
wins_reset ();
|
||||
wins_update (FLAG_ALL);
|
||||
wins_erase_status_bar ();
|
||||
io_export_bar ();
|
||||
wins_reset();
|
||||
wins_update(FLAG_ALL);
|
||||
wins_erase_status_bar();
|
||||
io_export_bar();
|
||||
}
|
||||
inday = do_storage (0);
|
||||
wins_update (FLAG_ALL);
|
||||
inday = do_storage(0);
|
||||
wins_update(FLAG_ALL);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_NEXT_DAY:
|
||||
case KEY_MOVE_RIGHT:
|
||||
if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_DAY)
|
||||
{
|
||||
calendar_move (RIGHT, count);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == CAL || key == KEY_GENERIC_NEXT_DAY) {
|
||||
calendar_move(RIGHT, count);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_PREV_DAY:
|
||||
case KEY_MOVE_LEFT:
|
||||
if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_DAY)
|
||||
{
|
||||
calendar_move (LEFT, count);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == CAL || key == KEY_GENERIC_PREV_DAY) {
|
||||
calendar_move(LEFT, count);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_PREV_WEEK:
|
||||
case KEY_MOVE_UP:
|
||||
if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_WEEK)
|
||||
{
|
||||
calendar_move (UP, count);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
else if (wins_slctd () == APP)
|
||||
{
|
||||
if (count >= apoint_hilt ())
|
||||
count = apoint_hilt () - 1;
|
||||
apoint_hilt_decrease (count);
|
||||
apoint_scroll_pad_up (inday.nb_events);
|
||||
wins_update (FLAG_APP);
|
||||
}
|
||||
else if (wins_slctd () == TOD)
|
||||
{
|
||||
if (count >= todo_hilt ())
|
||||
count = todo_hilt () - 1;
|
||||
todo_hilt_decrease (count);
|
||||
if (todo_hilt_pos () < 0)
|
||||
todo_first_increase (todo_hilt_pos ());
|
||||
wins_update (FLAG_TOD);
|
||||
if (wins_slctd() == CAL || key == KEY_GENERIC_PREV_WEEK) {
|
||||
calendar_move(UP, count);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
} else if (wins_slctd() == APP) {
|
||||
if (count >= apoint_hilt())
|
||||
count = apoint_hilt() - 1;
|
||||
apoint_hilt_decrease(count);
|
||||
apoint_scroll_pad_up(inday.nb_events);
|
||||
wins_update(FLAG_APP);
|
||||
} else if (wins_slctd() == TOD) {
|
||||
if (count >= todo_hilt())
|
||||
count = todo_hilt() - 1;
|
||||
todo_hilt_decrease(count);
|
||||
if (todo_hilt_pos() < 0)
|
||||
todo_first_increase(todo_hilt_pos());
|
||||
wins_update(FLAG_TOD);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_NEXT_WEEK:
|
||||
case KEY_MOVE_DOWN:
|
||||
if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_WEEK)
|
||||
{
|
||||
calendar_move (DOWN, count);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
else if (wins_slctd () == APP)
|
||||
{
|
||||
if (count > inday.nb_events + inday.nb_apoints - apoint_hilt ())
|
||||
count = inday.nb_events + inday.nb_apoints - apoint_hilt ();
|
||||
apoint_hilt_increase (count);
|
||||
apoint_scroll_pad_down (inday.nb_events, win[APP].h);
|
||||
wins_update (FLAG_APP);
|
||||
}
|
||||
else if (wins_slctd () == TOD)
|
||||
{
|
||||
if (count > todo_nb () - todo_hilt ())
|
||||
count = todo_nb () - todo_hilt ();
|
||||
todo_hilt_increase (count);
|
||||
if (todo_hilt_pos () >= win[TOD].h - 4)
|
||||
todo_first_increase (todo_hilt_pos () - win[TOD].h + 5);
|
||||
wins_update (FLAG_TOD);
|
||||
if (wins_slctd() == CAL || key == KEY_GENERIC_NEXT_WEEK) {
|
||||
calendar_move(DOWN, count);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
} else if (wins_slctd() == APP) {
|
||||
if (count > inday.nb_events + inday.nb_apoints - apoint_hilt())
|
||||
count = inday.nb_events + inday.nb_apoints - apoint_hilt();
|
||||
apoint_hilt_increase(count);
|
||||
apoint_scroll_pad_down(inday.nb_events, win[APP].h);
|
||||
wins_update(FLAG_APP);
|
||||
} else if (wins_slctd() == TOD) {
|
||||
if (count > todo_nb() - todo_hilt())
|
||||
count = todo_nb() - todo_hilt();
|
||||
todo_hilt_increase(count);
|
||||
if (todo_hilt_pos() >= win[TOD].h - 4)
|
||||
todo_first_increase(todo_hilt_pos() - win[TOD].h + 5);
|
||||
wins_update(FLAG_TOD);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_START_OF_WEEK:
|
||||
if (wins_slctd () == CAL)
|
||||
{
|
||||
calendar_move (WEEK_START, count);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == CAL) {
|
||||
calendar_move(WEEK_START, count);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_END_OF_WEEK:
|
||||
if (wins_slctd () == CAL)
|
||||
{
|
||||
calendar_move (WEEK_END, count);
|
||||
inday = do_storage (1);
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == CAL) {
|
||||
calendar_move(WEEK_END, count);
|
||||
inday = do_storage(1);
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_SCROLL_UP:
|
||||
if (wins_slctd () == CAL)
|
||||
{
|
||||
calendar_view_prev ();
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == CAL) {
|
||||
calendar_view_prev();
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_SCROLL_DOWN:
|
||||
if (wins_slctd () == CAL)
|
||||
{
|
||||
calendar_view_next ();
|
||||
wins_update (FLAG_CAL | FLAG_APP);
|
||||
if (wins_slctd() == CAL) {
|
||||
calendar_view_next();
|
||||
wins_update(FLAG_CAL | FLAG_APP);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_QUIT:
|
||||
if (conf.auto_save)
|
||||
io_save_cal (IO_SAVE_DISPLAY_BAR);
|
||||
io_save_cal(IO_SAVE_DISPLAY_BAR);
|
||||
if (conf.auto_gc)
|
||||
note_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);
|
||||
if (conf.confirm_quit) {
|
||||
if (status_ask_bool(_("Do you really want to quit ?")) == 1)
|
||||
exit_calcurse(EXIT_SUCCESS);
|
||||
else {
|
||||
wins_erase_status_bar();
|
||||
wins_update(FLAG_STA);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
exit_calcurse (EXIT_SUCCESS);
|
||||
} else
|
||||
exit_calcurse(EXIT_SUCCESS);
|
||||
break;
|
||||
|
||||
case KEY_RESIZE:
|
||||
|
||||
716
src/calcurse.h
716
src/calcurse.h
@@ -40,13 +40,13 @@
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_NCURSES_H
|
||||
# include <ncurses.h>
|
||||
#include <ncurses.h>
|
||||
#elif defined HAVE_NCURSES_NCURSES_H
|
||||
# include <ncurses/ncurses.h>
|
||||
#include <ncurses/ncurses.h>
|
||||
#elif defined HAVE_NCURSESW_NCURSES_H
|
||||
# include <ncursesw/ncurses.h>
|
||||
#include <ncursesw/ncurses.h>
|
||||
#else
|
||||
# error "Missing ncurses header. Aborting..."
|
||||
#error "Missing ncurses header. Aborting..."
|
||||
#endif
|
||||
|
||||
#include <pthread.h>
|
||||
@@ -60,24 +60,24 @@
|
||||
|
||||
/* Internationalization. */
|
||||
#if ENABLE_NLS
|
||||
# include <locale.h>
|
||||
# include <libintl.h>
|
||||
# undef _
|
||||
# define _(String) gettext(String)
|
||||
# ifdef gettext_noop
|
||||
# define N_(String) gettext_noop(String)
|
||||
# else
|
||||
# define N_(String) (String)
|
||||
# endif
|
||||
#include <locale.h>
|
||||
#include <libintl.h>
|
||||
#undef _
|
||||
#define _(String) gettext(String)
|
||||
#ifdef gettext_noop
|
||||
#define N_(String) gettext_noop(String)
|
||||
#else
|
||||
#define N_(String) (String)
|
||||
#endif
|
||||
#else /* NLS disabled */
|
||||
# define _(String) (String)
|
||||
# define N_(String) (String)
|
||||
# define textdomain(String) (String)
|
||||
# define gettext(String) (String)
|
||||
# define dgettext(String) (String)
|
||||
# define dcgettext(String) (String)
|
||||
# define bindtextdomain(String) (String)
|
||||
# define bind_textdomain_codeset(Domain,Codeset) (Codeset)
|
||||
#define _(String) (String)
|
||||
#define N_(String) (String)
|
||||
#define textdomain(String) (String)
|
||||
#define gettext(String) (String)
|
||||
#define dgettext(String) (String)
|
||||
#define dcgettext(String) (String)
|
||||
#define bindtextdomain(String) (String)
|
||||
#define bind_textdomain_codeset(Domain,Codeset) (Codeset)
|
||||
#endif /* ENABLE_NLS */
|
||||
|
||||
/* Paths configuration. */
|
||||
@@ -270,8 +270,7 @@ struct date {
|
||||
};
|
||||
|
||||
/* Appointment definition. */
|
||||
struct apoint
|
||||
{
|
||||
struct apoint {
|
||||
long start; /* seconds since 1 jan 1970 */
|
||||
long dur; /* duration of the appointment in seconds */
|
||||
|
||||
@@ -569,376 +568,367 @@ enum save_display {
|
||||
|
||||
/* apoint.c */
|
||||
extern llist_ts_t alist_p;
|
||||
void apoint_free_bkp (void);
|
||||
void apoint_llist_init (void);
|
||||
void apoint_llist_free (void);
|
||||
void apoint_hilt_set (int);
|
||||
void apoint_hilt_decrease (int);
|
||||
void apoint_hilt_increase (int);
|
||||
int apoint_hilt (void);
|
||||
struct apoint *apoint_new (char *, char *, long, long, char);
|
||||
void apoint_add (void);
|
||||
void apoint_delete (unsigned *, unsigned *);
|
||||
int apoint_cut (unsigned *, unsigned *);
|
||||
void apoint_paste (unsigned *, unsigned *, int);
|
||||
unsigned apoint_inday (struct apoint *, long);
|
||||
void apoint_sec2str (struct apoint *, long, char *, char *);
|
||||
void apoint_write (struct apoint *, FILE *);
|
||||
struct apoint *apoint_scan (FILE *, struct tm, struct tm, char, char *);
|
||||
struct apoint *apoint_get (long, int);
|
||||
void apoint_delete_bynum (long, unsigned, enum eraseflg);
|
||||
void apoint_scroll_pad_down (int, int);
|
||||
void apoint_scroll_pad_up (int);
|
||||
struct notify_app *apoint_check_next (struct notify_app *, long);
|
||||
void apoint_switch_notify (void);
|
||||
void apoint_update_panel (int);
|
||||
void apoint_paste_item (void);
|
||||
void apoint_free_bkp(void);
|
||||
void apoint_llist_init(void);
|
||||
void apoint_llist_free(void);
|
||||
void apoint_hilt_set(int);
|
||||
void apoint_hilt_decrease(int);
|
||||
void apoint_hilt_increase(int);
|
||||
int apoint_hilt(void);
|
||||
struct apoint *apoint_new(char *, char *, long, long, char);
|
||||
void apoint_add(void);
|
||||
void apoint_delete(unsigned *, unsigned *);
|
||||
int apoint_cut(unsigned *, unsigned *);
|
||||
void apoint_paste(unsigned *, unsigned *, int);
|
||||
unsigned apoint_inday(struct apoint *, long);
|
||||
void apoint_sec2str(struct apoint *, long, char *, char *);
|
||||
void apoint_write(struct apoint *, FILE *);
|
||||
struct apoint *apoint_scan(FILE *, struct tm, struct tm, char, char *);
|
||||
struct apoint *apoint_get(long, int);
|
||||
void apoint_delete_bynum(long, unsigned, enum eraseflg);
|
||||
void apoint_scroll_pad_down(int, int);
|
||||
void apoint_scroll_pad_up(int);
|
||||
struct notify_app *apoint_check_next(struct notify_app *, long);
|
||||
void apoint_switch_notify(void);
|
||||
void apoint_update_panel(int);
|
||||
void apoint_paste_item(void);
|
||||
|
||||
/* args.c */
|
||||
int parse_args (int, char **);
|
||||
int parse_args(int, char **);
|
||||
|
||||
/* calendar.c */
|
||||
void calendar_view_next (void);
|
||||
void calendar_view_prev (void);
|
||||
void calendar_set_view (int);
|
||||
int calendar_get_view (void);
|
||||
void calendar_start_date_thread (void);
|
||||
void calendar_stop_date_thread (void);
|
||||
void calendar_set_current_date (void);
|
||||
void calendar_set_first_day_of_week (enum wday);
|
||||
void calendar_change_first_day_of_week (void);
|
||||
unsigned calendar_week_begins_on_monday (void);
|
||||
void calendar_store_current_date (struct date *);
|
||||
void calendar_init_slctd_day (void);
|
||||
struct date *calendar_get_slctd_day (void);
|
||||
long calendar_get_slctd_day_sec (void);
|
||||
void calendar_update_panel (struct window *);
|
||||
void calendar_goto_today (void);
|
||||
void calendar_change_day (int);
|
||||
void calendar_move (enum move, int);
|
||||
long calendar_start_of_year (void);
|
||||
long calendar_end_of_year (void);
|
||||
const char *calendar_get_pom (time_t);
|
||||
void calendar_view_next(void);
|
||||
void calendar_view_prev(void);
|
||||
void calendar_set_view(int);
|
||||
int calendar_get_view(void);
|
||||
void calendar_start_date_thread(void);
|
||||
void calendar_stop_date_thread(void);
|
||||
void calendar_set_current_date(void);
|
||||
void calendar_set_first_day_of_week(enum wday);
|
||||
void calendar_change_first_day_of_week(void);
|
||||
unsigned calendar_week_begins_on_monday(void);
|
||||
void calendar_store_current_date(struct date *);
|
||||
void calendar_init_slctd_day(void);
|
||||
struct date *calendar_get_slctd_day(void);
|
||||
long calendar_get_slctd_day_sec(void);
|
||||
void calendar_update_panel(struct window *);
|
||||
void calendar_goto_today(void);
|
||||
void calendar_change_day(int);
|
||||
void calendar_move(enum move, int);
|
||||
long calendar_start_of_year(void);
|
||||
long calendar_end_of_year(void);
|
||||
const char *calendar_get_pom(time_t);
|
||||
|
||||
/* config.c */
|
||||
|
||||
void config_load (void);
|
||||
unsigned config_save (void);
|
||||
void config_load(void);
|
||||
unsigned config_save(void);
|
||||
|
||||
/* custom.c */
|
||||
void custom_init_attr (void);
|
||||
void custom_apply_attr (WINDOW *, int);
|
||||
void custom_remove_attr (WINDOW *, int);
|
||||
void custom_config_bar (void);
|
||||
void custom_layout_config (void);
|
||||
void custom_sidebar_config (void);
|
||||
void custom_color_config (void);
|
||||
void custom_color_theme_name (char *);
|
||||
void custom_confwin_init (struct window *, const char *);
|
||||
void custom_set_swsiz (struct scrollwin *);
|
||||
void custom_general_config (void);
|
||||
void custom_keys_config (void);
|
||||
void custom_config_main (void);
|
||||
void custom_init_attr(void);
|
||||
void custom_apply_attr(WINDOW *, int);
|
||||
void custom_remove_attr(WINDOW *, int);
|
||||
void custom_config_bar(void);
|
||||
void custom_layout_config(void);
|
||||
void custom_sidebar_config(void);
|
||||
void custom_color_config(void);
|
||||
void custom_color_theme_name(char *);
|
||||
void custom_confwin_init(struct window *, const char *);
|
||||
void custom_set_swsiz(struct scrollwin *);
|
||||
void custom_general_config(void);
|
||||
void custom_keys_config(void);
|
||||
void custom_config_main(void);
|
||||
|
||||
/* day.c */
|
||||
void day_free_list (void);
|
||||
struct day_items_nb *day_process_storage (struct date *, unsigned,
|
||||
void day_free_list(void);
|
||||
struct day_items_nb *day_process_storage(struct date *, unsigned,
|
||||
struct day_items_nb *);
|
||||
void day_write_pad (long, int, int, int);
|
||||
void day_popup_item (void);
|
||||
int day_check_if_item (struct date);
|
||||
unsigned day_chk_busy_slices (struct date, int, int *);
|
||||
void day_edit_item (void);
|
||||
int day_erase_item (long, int, enum eraseflg);
|
||||
int day_cut_item (long, int);
|
||||
int day_paste_item (long, int);
|
||||
struct day_item *day_get_item (int);
|
||||
int day_item_nb (long, int, int);
|
||||
void day_edit_note (const char *);
|
||||
void day_view_note (const char *);
|
||||
void day_pipe_item (void);
|
||||
void day_write_pad(long, int, int, int);
|
||||
void day_popup_item(void);
|
||||
int day_check_if_item(struct date);
|
||||
unsigned day_chk_busy_slices(struct date, int, int *);
|
||||
void day_edit_item(void);
|
||||
int day_erase_item(long, int, enum eraseflg);
|
||||
int day_cut_item(long, int);
|
||||
int day_paste_item(long, int);
|
||||
struct day_item *day_get_item(int);
|
||||
int day_item_nb(long, int, int);
|
||||
void day_edit_note(const char *);
|
||||
void day_view_note(const char *);
|
||||
void day_pipe_item(void);
|
||||
|
||||
/* dmon.c */
|
||||
void dmon_start (int);
|
||||
void dmon_stop (void);
|
||||
void dmon_start(int);
|
||||
void dmon_stop(void);
|
||||
|
||||
/* event.c */
|
||||
extern llist_t eventlist;
|
||||
void event_free_bkp (void);
|
||||
void event_llist_init (void);
|
||||
void event_llist_free (void);
|
||||
struct event *event_new (char *, char *, long, int);
|
||||
unsigned event_inday (struct event *, long);
|
||||
void event_write (struct event *, FILE *);
|
||||
struct event *event_scan (FILE *, struct tm, int, char *);
|
||||
struct event *event_get (long, int);
|
||||
void event_delete_bynum (long, unsigned, enum eraseflg);
|
||||
void event_paste_item (void);
|
||||
void event_free_bkp(void);
|
||||
void event_llist_init(void);
|
||||
void event_llist_free(void);
|
||||
struct event *event_new(char *, char *, long, int);
|
||||
unsigned event_inday(struct event *, long);
|
||||
void event_write(struct event *, FILE *);
|
||||
struct event *event_scan(FILE *, struct tm, int, char *);
|
||||
struct event *event_get(long, int);
|
||||
void event_delete_bynum(long, unsigned, enum eraseflg);
|
||||
void event_paste_item(void);
|
||||
|
||||
/* help.c */
|
||||
void help_wins_init (struct scrollwin *, int, int, int, int);
|
||||
void help_screen (void);
|
||||
void help_wins_init(struct scrollwin *, int, int, int, int);
|
||||
void help_screen(void);
|
||||
|
||||
/* getstring.c */
|
||||
enum getstr getstring (WINDOW *, char *, int, int, int);
|
||||
int updatestring (WINDOW *, char **, int, int);
|
||||
enum getstr getstring(WINDOW *, char *, int, int, int);
|
||||
int updatestring(WINDOW *, char **, int, int);
|
||||
|
||||
/* ical.c */
|
||||
void ical_import_data (FILE *, FILE *, unsigned *, unsigned *, unsigned *,
|
||||
void ical_import_data(FILE *, FILE *, unsigned *, unsigned *, unsigned *,
|
||||
unsigned *, unsigned *);
|
||||
void ical_export_data (FILE *);
|
||||
void ical_export_data(FILE *);
|
||||
|
||||
/* io.c */
|
||||
unsigned io_fprintln (const char *, const char *, ...);
|
||||
void io_init (const char *, const char *);
|
||||
void io_extract_data (char *, const char *, int);
|
||||
unsigned io_save_apts (void);
|
||||
unsigned io_save_todo (void);
|
||||
unsigned io_save_keys (void);
|
||||
void io_save_cal (enum save_display);
|
||||
void io_load_app (void);
|
||||
void io_load_todo (void);
|
||||
void io_load_keys (const char *);
|
||||
void io_check_dir (char *, int *);
|
||||
unsigned io_file_exist (char *);
|
||||
void io_check_file (char *, int *);
|
||||
int io_check_data_files (void);
|
||||
void io_startup_screen (int);
|
||||
void io_export_data (enum export_type);
|
||||
void io_export_bar (void);
|
||||
void io_import_data (enum import_type, const char *);
|
||||
struct io_file *io_log_init (void);
|
||||
void io_log_print (struct io_file *, int, const char *);
|
||||
void io_log_display (struct io_file *, const char *, const char *);
|
||||
void io_log_free (struct io_file *);
|
||||
void io_start_psave_thread (void);
|
||||
void io_stop_psave_thread (void);
|
||||
void io_set_lock (void);
|
||||
unsigned io_dump_pid (char *);
|
||||
unsigned io_get_pid (char *);
|
||||
int io_file_is_empty (char *);
|
||||
int io_file_cp (const char *, const char *);
|
||||
unsigned io_fprintln(const char *, const char *, ...);
|
||||
void io_init(const char *, const char *);
|
||||
void io_extract_data(char *, const char *, int);
|
||||
unsigned io_save_apts(void);
|
||||
unsigned io_save_todo(void);
|
||||
unsigned io_save_keys(void);
|
||||
void io_save_cal(enum save_display);
|
||||
void io_load_app(void);
|
||||
void io_load_todo(void);
|
||||
void io_load_keys(const char *);
|
||||
void io_check_dir(char *, int *);
|
||||
unsigned io_file_exist(char *);
|
||||
void io_check_file(char *, int *);
|
||||
int io_check_data_files(void);
|
||||
void io_startup_screen(int);
|
||||
void io_export_data(enum export_type);
|
||||
void io_export_bar(void);
|
||||
void io_import_data(enum import_type, const char *);
|
||||
struct io_file *io_log_init(void);
|
||||
void io_log_print(struct io_file *, int, const char *);
|
||||
void io_log_display(struct io_file *, const char *, const char *);
|
||||
void io_log_free(struct io_file *);
|
||||
void io_start_psave_thread(void);
|
||||
void io_stop_psave_thread(void);
|
||||
void io_set_lock(void);
|
||||
unsigned io_dump_pid(char *);
|
||||
unsigned io_get_pid(char *);
|
||||
int io_file_is_empty(char *);
|
||||
int io_file_cp(const char *, const char *);
|
||||
|
||||
/* keys.c */
|
||||
void keys_init (void);
|
||||
void keys_free (void);
|
||||
void keys_dump_defaults (char *);
|
||||
const char *keys_get_label (enum key);
|
||||
enum key keys_get_action (int);
|
||||
enum key keys_getch (WINDOW *win, int *);
|
||||
int keys_assign_binding (int, enum key);
|
||||
void keys_remove_binding (int, enum key);
|
||||
int keys_str2int (const char *);
|
||||
const char *keys_int2str (int);
|
||||
int keys_action_count_keys (enum key);
|
||||
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,
|
||||
void keys_init(void);
|
||||
void keys_free(void);
|
||||
void keys_dump_defaults(char *);
|
||||
const char *keys_get_label(enum key);
|
||||
enum key keys_get_action(int);
|
||||
enum key keys_getch(WINDOW * win, int *);
|
||||
int keys_assign_binding(int, enum key);
|
||||
void keys_remove_binding(int, enum key);
|
||||
int keys_str2int(const char *);
|
||||
const char *keys_int2str(int);
|
||||
int keys_action_count_keys(enum key);
|
||||
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 *);
|
||||
void keys_popup_info (enum key);
|
||||
void keys_save_bindings (FILE *);
|
||||
int keys_check_missing_bindings (void);
|
||||
void keys_fill_missing (void);
|
||||
void keys_popup_info(enum key);
|
||||
void keys_save_bindings(FILE *);
|
||||
int keys_check_missing_bindings(void);
|
||||
void keys_fill_missing(void);
|
||||
|
||||
/* mem.c */
|
||||
void *xmalloc (size_t);
|
||||
void *xcalloc (size_t, size_t);
|
||||
void *xrealloc (void *, size_t, size_t);
|
||||
char *xstrdup (const char *);
|
||||
void xfree (void *);
|
||||
void *xmalloc(size_t);
|
||||
void *xcalloc(size_t, size_t);
|
||||
void *xrealloc(void *, size_t, size_t);
|
||||
char *xstrdup(const char *);
|
||||
void xfree(void *);
|
||||
|
||||
#ifdef CALCURSE_MEMORY_DEBUG
|
||||
|
||||
# define mem_malloc(s) dbg_malloc ((s), __FILE_POS__)
|
||||
# define mem_calloc(n, s) dbg_calloc ((n), (s), __FILE_POS__)
|
||||
# define mem_realloc(p, n, s) dbg_realloc ((p), (n), (s), __FILE_POS__)
|
||||
# define mem_strdup(s) dbg_strdup ((s), __FILE_POS__)
|
||||
# define mem_free(p) dbg_free ((p), __FILE_POS__)
|
||||
#define mem_malloc(s) dbg_malloc ((s), __FILE_POS__)
|
||||
#define mem_calloc(n, s) dbg_calloc ((n), (s), __FILE_POS__)
|
||||
#define mem_realloc(p, n, s) dbg_realloc ((p), (n), (s), __FILE_POS__)
|
||||
#define mem_strdup(s) dbg_strdup ((s), __FILE_POS__)
|
||||
#define mem_free(p) dbg_free ((p), __FILE_POS__)
|
||||
|
||||
void *dbg_malloc (size_t, const char *);
|
||||
void *dbg_calloc (size_t, size_t, const char *);
|
||||
void *dbg_realloc (void *, size_t, size_t, const char *);
|
||||
char *dbg_strdup (const char *, const char *);
|
||||
void dbg_free (void *, const char *);
|
||||
void mem_stats (void);
|
||||
void *dbg_malloc(size_t, const char *);
|
||||
void *dbg_calloc(size_t, size_t, const char *);
|
||||
void *dbg_realloc(void *, size_t, size_t, const char *);
|
||||
char *dbg_strdup(const char *, const char *);
|
||||
void dbg_free(void *, const char *);
|
||||
void mem_stats(void);
|
||||
|
||||
#else /* MEMORY DEBUG disabled */
|
||||
|
||||
# define mem_malloc(s) xmalloc ((s))
|
||||
# define mem_calloc(n, s) xcalloc ((n), (s))
|
||||
# define mem_realloc(p, n, s) xrealloc ((p), (n), (s))
|
||||
# define mem_strdup(s) xstrdup ((s))
|
||||
# define mem_free(p) xfree ((p))
|
||||
# define mem_stats()
|
||||
#define mem_malloc(s) xmalloc ((s))
|
||||
#define mem_calloc(n, s) xcalloc ((n), (s))
|
||||
#define mem_realloc(p, n, s) xrealloc ((p), (n), (s))
|
||||
#define mem_strdup(s) xstrdup ((s))
|
||||
#define mem_free(p) xfree ((p))
|
||||
#define mem_stats()
|
||||
|
||||
#endif /* CALCURSE_MEMORY_DEBUG */
|
||||
|
||||
/* note.c */
|
||||
char *generate_note (const char *);
|
||||
void edit_note (char **, const char *);
|
||||
void view_note (const char *, const char *);
|
||||
void erase_note (char **);
|
||||
void note_read (char *, FILE *);
|
||||
void note_gc (void);
|
||||
char *generate_note(const char *);
|
||||
void edit_note(char **, const char *);
|
||||
void view_note(const char *, const char *);
|
||||
void erase_note(char **);
|
||||
void note_read(char *, FILE *);
|
||||
void note_gc(void);
|
||||
|
||||
/* notify.c */
|
||||
int notify_time_left (void);
|
||||
unsigned notify_needs_reminder (void);
|
||||
void notify_update_app (long, char, char *);
|
||||
int notify_bar (void);
|
||||
void notify_init_vars (void);
|
||||
void notify_init_bar (void);
|
||||
void notify_free_app (void);
|
||||
void notify_start_main_thread (void);
|
||||
void notify_stop_main_thread (void);
|
||||
void notify_reinit_bar (void);
|
||||
unsigned notify_launch_cmd (void);
|
||||
void notify_update_bar (void);
|
||||
unsigned notify_get_next (struct notify_app *);
|
||||
unsigned notify_get_next_bkgd (void);
|
||||
char *notify_app_txt (void);
|
||||
void notify_check_next_app (int);
|
||||
void notify_check_added (char *, long, char);
|
||||
void notify_check_repeated (struct recur_apoint *);
|
||||
int notify_same_item (long);
|
||||
int notify_same_recur_item (struct recur_apoint *);
|
||||
void notify_config_bar (void);
|
||||
int notify_time_left(void);
|
||||
unsigned notify_needs_reminder(void);
|
||||
void notify_update_app(long, char, char *);
|
||||
int notify_bar(void);
|
||||
void notify_init_vars(void);
|
||||
void notify_init_bar(void);
|
||||
void notify_free_app(void);
|
||||
void notify_start_main_thread(void);
|
||||
void notify_stop_main_thread(void);
|
||||
void notify_reinit_bar(void);
|
||||
unsigned notify_launch_cmd(void);
|
||||
void notify_update_bar(void);
|
||||
unsigned notify_get_next(struct notify_app *);
|
||||
unsigned notify_get_next_bkgd(void);
|
||||
char *notify_app_txt(void);
|
||||
void notify_check_next_app(int);
|
||||
void notify_check_added(char *, long, char);
|
||||
void notify_check_repeated(struct recur_apoint *);
|
||||
int notify_same_item(long);
|
||||
int notify_same_recur_item(struct recur_apoint *);
|
||||
void notify_config_bar(void);
|
||||
|
||||
/* pcal.c */
|
||||
void pcal_export_data (FILE *);
|
||||
void pcal_export_data(FILE *);
|
||||
|
||||
/* recur.c */
|
||||
extern llist_ts_t recur_alist_p;
|
||||
extern llist_t recur_elist;
|
||||
void recur_event_free_bkp (void);
|
||||
void recur_apoint_free_bkp (void);
|
||||
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,
|
||||
void recur_event_free_bkp(void);
|
||||
void recur_apoint_free_bkp(void);
|
||||
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 *);
|
||||
struct recur_event *recur_event_new (char *, char *, long, int, int, int,
|
||||
struct recur_event *recur_event_new(char *, char *, long, int, int, int,
|
||||
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 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);
|
||||
struct recur_event *recur_event_scan (FILE *, struct tm, int, char,
|
||||
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,
|
||||
struct recur_event *recur_event_scan(FILE *, struct tm, int, char,
|
||||
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 *);
|
||||
unsigned recur_item_inday (long, long, llist_t *, int, int, long,
|
||||
long);
|
||||
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);
|
||||
void recur_event_erase (long, unsigned, unsigned,
|
||||
enum eraseflg);
|
||||
void recur_apoint_erase (long, unsigned, unsigned,
|
||||
enum eraseflg);
|
||||
void recur_repeat_item (void);
|
||||
void recur_exc_scan (llist_t *, FILE *);
|
||||
struct notify_app *recur_apoint_check_next (struct notify_app *, long, long);
|
||||
struct recur_apoint *recur_get_apoint (long, int);
|
||||
struct recur_event *recur_get_event (long, int);
|
||||
void recur_apoint_switch_notify (long, int);
|
||||
void recur_event_paste_item (void);
|
||||
void recur_apoint_paste_item (void);
|
||||
void recur_event_erase(long, unsigned, unsigned, enum eraseflg);
|
||||
void recur_apoint_erase(long, unsigned, unsigned, enum eraseflg);
|
||||
void recur_repeat_item(void);
|
||||
void recur_exc_scan(llist_t *, FILE *);
|
||||
struct notify_app *recur_apoint_check_next(struct notify_app *, long, long);
|
||||
struct recur_apoint *recur_get_apoint(long, int);
|
||||
struct recur_event *recur_get_event(long, int);
|
||||
void recur_apoint_switch_notify(long, int);
|
||||
void recur_event_paste_item(void);
|
||||
void recur_apoint_paste_item(void);
|
||||
|
||||
/* sigs.c */
|
||||
void sigs_init (void);
|
||||
unsigned sigs_set_hdlr (int, void (*)(int));
|
||||
void sigs_init(void);
|
||||
unsigned sigs_set_hdlr(int, void (*)(int));
|
||||
|
||||
/* todo.c */
|
||||
extern llist_t todolist;
|
||||
void todo_hilt_set (int);
|
||||
void todo_hilt_decrease (int);
|
||||
void todo_hilt_increase (int);
|
||||
int todo_hilt (void);
|
||||
int todo_nb (void);
|
||||
void todo_set_nb (int);
|
||||
void todo_set_first (int);
|
||||
void todo_first_increase (int);
|
||||
void todo_first_decrease (int);
|
||||
int todo_hilt_pos (void);
|
||||
char *todo_saved_mesg (void);
|
||||
void todo_new_item (void);
|
||||
struct todo *todo_add (char *, int, char *);
|
||||
void todo_write (struct todo *, FILE *);
|
||||
void todo_flag (void);
|
||||
void todo_delete (void);
|
||||
void todo_chg_priority (int);
|
||||
void todo_edit_item (void);
|
||||
void todo_update_panel (int);
|
||||
void todo_edit_note (const char *);
|
||||
void todo_view_note (const char *);
|
||||
void todo_pipe_item (void);
|
||||
void todo_init_list (void);
|
||||
void todo_free_list (void);
|
||||
void todo_hilt_set(int);
|
||||
void todo_hilt_decrease(int);
|
||||
void todo_hilt_increase(int);
|
||||
int todo_hilt(void);
|
||||
int todo_nb(void);
|
||||
void todo_set_nb(int);
|
||||
void todo_set_first(int);
|
||||
void todo_first_increase(int);
|
||||
void todo_first_decrease(int);
|
||||
int todo_hilt_pos(void);
|
||||
char *todo_saved_mesg(void);
|
||||
void todo_new_item(void);
|
||||
struct todo *todo_add(char *, int, char *);
|
||||
void todo_write(struct todo *, FILE *);
|
||||
void todo_flag(void);
|
||||
void todo_delete(void);
|
||||
void todo_chg_priority(int);
|
||||
void todo_edit_item(void);
|
||||
void todo_update_panel(int);
|
||||
void todo_edit_note(const char *);
|
||||
void todo_view_note(const char *);
|
||||
void todo_pipe_item(void);
|
||||
void todo_init_list(void);
|
||||
void todo_free_list(void);
|
||||
|
||||
/* utf8.c */
|
||||
int utf8_width (char *);
|
||||
int utf8_strwidth (char *);
|
||||
int utf8_width(char *);
|
||||
int utf8_strwidth(char *);
|
||||
|
||||
/* utils.c */
|
||||
void exit_calcurse (int) __attribute__((__noreturn__));
|
||||
void free_user_data (void);
|
||||
void fatalbox (const char *);
|
||||
void warnbox (const char *);
|
||||
void status_mesg (const char *, const char *);
|
||||
int status_ask_choice (const char *, const char[], int);
|
||||
int status_ask_bool (const char *);
|
||||
int status_ask_simplechoice (const char *, const char *[], int);
|
||||
void erase_window_part (WINDOW *, int, int, int, int);
|
||||
WINDOW *popup (int, int, int, int, const char *, const char *, int);
|
||||
void print_in_middle (WINDOW *, int, int, int, const char *);
|
||||
int is_all_digit (const char *);
|
||||
long get_item_time (long);
|
||||
int get_item_hour (long);
|
||||
int get_item_min (long);
|
||||
long date2sec (struct date, unsigned, unsigned);
|
||||
char *date_sec2date_str (long, const char *);
|
||||
void date_sec2date_fmt (long, const char *, char *);
|
||||
long date_sec_change (long, int, int);
|
||||
long update_time_in_date (long, unsigned, unsigned);
|
||||
long get_sec_date (struct date);
|
||||
long min2sec (unsigned);
|
||||
void draw_scrollbar (WINDOW *, int, int, int, int, int, unsigned);
|
||||
void item_in_popup (const char *, const char *, const char *,
|
||||
const char *);
|
||||
long get_today (void);
|
||||
long now (void);
|
||||
char *nowstr (void);
|
||||
long mystrtol (const char *);
|
||||
void print_bool_option_incolor (WINDOW *, unsigned, int, int);
|
||||
const char *get_tempdir (void);
|
||||
char *new_tempfile (const char *, int);
|
||||
int parse_date (const char *, enum datefmt, int *, int *, int *,
|
||||
struct date *);
|
||||
int parse_time (const char *, unsigned *, unsigned *);
|
||||
int parse_duration (const char *, unsigned *);
|
||||
void str_toupper (char *);
|
||||
void file_close (FILE *, const char *);
|
||||
void psleep (unsigned);
|
||||
int fork_exec (int *, int *, const char *, const char *const *);
|
||||
int shell_exec (int *, int *, const char *, const char *const *);
|
||||
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_event (const char *, long, struct recur_event *);
|
||||
void print_todo (const char *, struct todo *);
|
||||
void exit_calcurse(int) __attribute__ ((__noreturn__));
|
||||
void free_user_data(void);
|
||||
void fatalbox(const char *);
|
||||
void warnbox(const char *);
|
||||
void status_mesg(const char *, const char *);
|
||||
int status_ask_choice(const char *, const char[], int);
|
||||
int status_ask_bool(const char *);
|
||||
int status_ask_simplechoice(const char *, const char *[], int);
|
||||
void erase_window_part(WINDOW *, int, int, int, int);
|
||||
WINDOW *popup(int, int, int, int, const char *, const char *, int);
|
||||
void print_in_middle(WINDOW *, int, int, int, const char *);
|
||||
int is_all_digit(const char *);
|
||||
long get_item_time(long);
|
||||
int get_item_hour(long);
|
||||
int get_item_min(long);
|
||||
long date2sec(struct date, unsigned, unsigned);
|
||||
char *date_sec2date_str(long, const char *);
|
||||
void date_sec2date_fmt(long, const char *, char *);
|
||||
long date_sec_change(long, int, int);
|
||||
long update_time_in_date(long, unsigned, unsigned);
|
||||
long get_sec_date(struct date);
|
||||
long min2sec(unsigned);
|
||||
void draw_scrollbar(WINDOW *, int, int, int, int, int, unsigned);
|
||||
void item_in_popup(const char *, const char *, const char *, const char *);
|
||||
long get_today(void);
|
||||
long now(void);
|
||||
char *nowstr(void);
|
||||
long mystrtol(const char *);
|
||||
void print_bool_option_incolor(WINDOW *, unsigned, int, int);
|
||||
const char *get_tempdir(void);
|
||||
char *new_tempfile(const char *, int);
|
||||
int parse_date(const char *, enum datefmt, int *, int *, int *, struct date *);
|
||||
int parse_time(const char *, unsigned *, unsigned *);
|
||||
int parse_duration(const char *, unsigned *);
|
||||
void str_toupper(char *);
|
||||
void file_close(FILE *, const char *);
|
||||
void psleep(unsigned);
|
||||
int fork_exec(int *, int *, const char *, const char *const *);
|
||||
int shell_exec(int *, int *, const char *, const char *const *);
|
||||
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_event(const char *, long, struct recur_event *);
|
||||
void print_todo(const char *, struct todo *);
|
||||
|
||||
/* vars.c */
|
||||
extern int col, row;
|
||||
@@ -963,44 +953,44 @@ extern struct conf conf;
|
||||
extern struct pad apad;
|
||||
extern struct nbar nbar;
|
||||
extern struct dmon_conf dmon;
|
||||
void vars_init (void);
|
||||
void vars_init(void);
|
||||
|
||||
/* wins.c */
|
||||
extern struct window win[NBWINS];
|
||||
int wins_refresh (void);
|
||||
int wins_wrefresh (WINDOW *);
|
||||
int wins_doupdate (void);
|
||||
int wins_layout (void);
|
||||
void wins_set_layout (int);
|
||||
unsigned wins_sbar_width (void);
|
||||
unsigned wins_sbar_wperc (void);
|
||||
void wins_set_sbar_width (unsigned);
|
||||
void wins_sbar_winc (void);
|
||||
void wins_sbar_wdec (void);
|
||||
void wins_slctd_init (void);
|
||||
enum win wins_slctd (void);
|
||||
void wins_slctd_set (enum win);
|
||||
void wins_slctd_next (void);
|
||||
void wins_init (void);
|
||||
void wins_scrollwin_init (struct scrollwin *);
|
||||
void wins_scrollwin_delete (struct scrollwin *);
|
||||
void wins_scrollwin_display (struct scrollwin *);
|
||||
void wins_scrollwin_up (struct scrollwin *, int);
|
||||
void wins_scrollwin_down (struct scrollwin *, int);
|
||||
void wins_reinit (void);
|
||||
void wins_reinit_panels (void);
|
||||
void wins_show (WINDOW *, const char *);
|
||||
void wins_get_config (void);
|
||||
void wins_update_border (int);
|
||||
void wins_update_panels (int);
|
||||
void wins_update (int);
|
||||
void wins_reset (void);
|
||||
void wins_prepare_external (void);
|
||||
void wins_unprepare_external (void);
|
||||
void wins_launch_external (const char *, const char *);
|
||||
void wins_status_bar (void);
|
||||
void wins_erase_status_bar (void);
|
||||
void wins_other_status_page (int);
|
||||
void wins_reset_status_page (void);
|
||||
int wins_refresh(void);
|
||||
int wins_wrefresh(WINDOW *);
|
||||
int wins_doupdate(void);
|
||||
int wins_layout(void);
|
||||
void wins_set_layout(int);
|
||||
unsigned wins_sbar_width(void);
|
||||
unsigned wins_sbar_wperc(void);
|
||||
void wins_set_sbar_width(unsigned);
|
||||
void wins_sbar_winc(void);
|
||||
void wins_sbar_wdec(void);
|
||||
void wins_slctd_init(void);
|
||||
enum win wins_slctd(void);
|
||||
void wins_slctd_set(enum win);
|
||||
void wins_slctd_next(void);
|
||||
void wins_init(void);
|
||||
void wins_scrollwin_init(struct scrollwin *);
|
||||
void wins_scrollwin_delete(struct scrollwin *);
|
||||
void wins_scrollwin_display(struct scrollwin *);
|
||||
void wins_scrollwin_up(struct scrollwin *, int);
|
||||
void wins_scrollwin_down(struct scrollwin *, int);
|
||||
void wins_reinit(void);
|
||||
void wins_reinit_panels(void);
|
||||
void wins_show(WINDOW *, const char *);
|
||||
void wins_get_config(void);
|
||||
void wins_update_border(int);
|
||||
void wins_update_panels(int);
|
||||
void wins_update(int);
|
||||
void wins_reset(void);
|
||||
void wins_prepare_external(void);
|
||||
void wins_unprepare_external(void);
|
||||
void wins_launch_external(const char *, const char *);
|
||||
void wins_status_bar(void);
|
||||
void wins_erase_status_bar(void);
|
||||
void wins_other_status_page(int);
|
||||
void wins_reset_status_page(void);
|
||||
|
||||
#endif /* CALCURSE_H */
|
||||
|
||||
469
src/calendar.c
469
src/calendar.c
@@ -77,103 +77,91 @@ static unsigned calendar_view, week_begins_on_monday;
|
||||
static pthread_mutex_t date_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_t 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_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) =
|
||||
{draw_monthly_view, draw_weekly_view};
|
||||
unsigned) = {
|
||||
draw_monthly_view, draw_weekly_view};
|
||||
|
||||
/* Switch between calendar views (monthly view is selected by default). */
|
||||
void
|
||||
calendar_view_next (void)
|
||||
void calendar_view_next(void)
|
||||
{
|
||||
calendar_view++;
|
||||
if (calendar_view == CAL_VIEWS)
|
||||
calendar_view = 0;
|
||||
}
|
||||
|
||||
void
|
||||
calendar_view_prev (void)
|
||||
void calendar_view_prev(void)
|
||||
{
|
||||
if (calendar_view == 0)
|
||||
calendar_view = CAL_VIEWS;
|
||||
calendar_view--;
|
||||
}
|
||||
|
||||
void
|
||||
calendar_set_view (int view)
|
||||
void calendar_set_view(int view)
|
||||
{
|
||||
calendar_view = (view < 0 || view >= CAL_VIEWS) ? CAL_MONTH_VIEW : view;
|
||||
}
|
||||
|
||||
int
|
||||
calendar_get_view (void)
|
||||
int calendar_get_view(void)
|
||||
{
|
||||
return (int)calendar_view;
|
||||
}
|
||||
|
||||
/* Thread needed to update current date in calendar. */
|
||||
/* ARGSUSED0 */
|
||||
static void *
|
||||
calendar_date_thread (void *arg)
|
||||
static void *calendar_date_thread(void *arg)
|
||||
{
|
||||
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);
|
||||
|
||||
calendar_set_current_date ();
|
||||
calendar_update_panel (&win[CAL]);
|
||||
calendar_set_current_date();
|
||||
calendar_update_panel(&win[CAL]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Launch the calendar date thread. */
|
||||
void
|
||||
calendar_start_date_thread (void)
|
||||
void calendar_start_date_thread(void)
|
||||
{
|
||||
pthread_create (&calendar_t_date, NULL, calendar_date_thread, NULL);
|
||||
pthread_create(&calendar_t_date, NULL, calendar_date_thread, NULL);
|
||||
}
|
||||
|
||||
/* Stop the calendar date thread. */
|
||||
void
|
||||
calendar_stop_date_thread (void)
|
||||
void calendar_stop_date_thread(void)
|
||||
{
|
||||
if (calendar_t_date)
|
||||
{
|
||||
pthread_cancel (calendar_t_date);
|
||||
pthread_join (calendar_t_date, NULL);
|
||||
if (calendar_t_date) {
|
||||
pthread_cancel(calendar_t_date);
|
||||
pthread_join(calendar_t_date, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Set static variable today to current date */
|
||||
void
|
||||
calendar_set_current_date (void)
|
||||
void calendar_set_current_date(void)
|
||||
{
|
||||
time_t timer;
|
||||
struct tm *tm;
|
||||
|
||||
timer = time (NULL);
|
||||
tm = localtime (&timer);
|
||||
timer = time(NULL);
|
||||
tm = localtime(&timer);
|
||||
|
||||
pthread_mutex_lock (&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);
|
||||
pthread_mutex_unlock(&date_thread_mutex);
|
||||
}
|
||||
|
||||
/* Needed to display sunday or monday as the first day of week in calendar. */
|
||||
void
|
||||
calendar_set_first_day_of_week (enum wday first_day)
|
||||
void calendar_set_first_day_of_week(enum wday first_day)
|
||||
{
|
||||
switch (first_day)
|
||||
{
|
||||
switch (first_day) {
|
||||
case SUNDAY:
|
||||
week_begins_on_monday = 0;
|
||||
break;
|
||||
@@ -181,94 +169,83 @@ calendar_set_first_day_of_week (enum wday first_day)
|
||||
week_begins_on_monday = 1;
|
||||
break;
|
||||
default:
|
||||
ERROR_MSG (_("ERROR setting first day of week"));
|
||||
ERROR_MSG(_("ERROR setting first day of week"));
|
||||
week_begins_on_monday = 0;
|
||||
/* NOTREACHED */
|
||||
}
|
||||
}
|
||||
|
||||
/* Swap first day of week in calendar. */
|
||||
void
|
||||
calendar_change_first_day_of_week (void)
|
||||
void calendar_change_first_day_of_week(void)
|
||||
{
|
||||
week_begins_on_monday = !week_begins_on_monday;
|
||||
}
|
||||
|
||||
/* Return 1 if week begins on monday, 0 otherwise. */
|
||||
unsigned
|
||||
calendar_week_begins_on_monday (void)
|
||||
unsigned calendar_week_begins_on_monday(void)
|
||||
{
|
||||
return week_begins_on_monday;
|
||||
}
|
||||
|
||||
/* Fill in the given variable with the current date. */
|
||||
void
|
||||
calendar_store_current_date (struct date *date)
|
||||
void calendar_store_current_date(struct date *date)
|
||||
{
|
||||
pthread_mutex_lock (&date_thread_mutex);
|
||||
pthread_mutex_lock(&date_thread_mutex);
|
||||
*date = today;
|
||||
pthread_mutex_unlock (&date_thread_mutex);
|
||||
pthread_mutex_unlock(&date_thread_mutex);
|
||||
}
|
||||
|
||||
/* This is to start at the current date in calendar. */
|
||||
void
|
||||
calendar_init_slctd_day (void)
|
||||
void calendar_init_slctd_day(void)
|
||||
{
|
||||
calendar_store_current_date (&slctd_day);
|
||||
calendar_store_current_date(&slctd_day);
|
||||
}
|
||||
|
||||
/* Return the selected day in calendar */
|
||||
struct date *
|
||||
calendar_get_slctd_day (void)
|
||||
struct date *calendar_get_slctd_day(void)
|
||||
{
|
||||
return &slctd_day;
|
||||
}
|
||||
|
||||
/* Returned value represents the selected day in calendar (in seconds) */
|
||||
long
|
||||
calendar_get_slctd_day_sec (void)
|
||||
long calendar_get_slctd_day_sec(void)
|
||||
{
|
||||
return date2sec (slctd_day, 0, 0);
|
||||
return date2sec(slctd_day, 0, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
calendar_get_wday (struct date *date)
|
||||
static int calendar_get_wday(struct date *date)
|
||||
{
|
||||
struct tm t;
|
||||
|
||||
memset (&t, 0, sizeof (struct tm));
|
||||
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;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
months_to_days (unsigned month)
|
||||
static unsigned months_to_days(unsigned month)
|
||||
{
|
||||
return (month * 3057 - 3007) / 100;
|
||||
}
|
||||
|
||||
|
||||
static long
|
||||
years_to_days (unsigned year)
|
||||
static long years_to_days(unsigned year)
|
||||
{
|
||||
return year * 365L + year / 4 - year / 100 + year / 400;
|
||||
}
|
||||
|
||||
static long
|
||||
ymd_to_scalar (unsigned year, unsigned month, unsigned day)
|
||||
static long ymd_to_scalar(unsigned year, unsigned month, unsigned day)
|
||||
{
|
||||
long scalar;
|
||||
|
||||
scalar = day + months_to_days (month);
|
||||
scalar = day + months_to_days(month);
|
||||
if (month > 2)
|
||||
scalar -= ISLEAP (year) ? 1 : 2;
|
||||
scalar -= ISLEAP(year) ? 1 : 2;
|
||||
year--;
|
||||
scalar += years_to_days (year);
|
||||
scalar += years_to_days(year);
|
||||
|
||||
return scalar;
|
||||
}
|
||||
@@ -277,8 +254,7 @@ ymd_to_scalar (unsigned year, unsigned month, unsigned day)
|
||||
* Used to change date by adding a certain amount of days or weeks.
|
||||
* Returns 0 on success, 1 otherwise.
|
||||
*/
|
||||
static int
|
||||
date_change (struct tm *date, int delta_month, int delta_day)
|
||||
static int date_change(struct tm *date, int delta_month, int delta_day)
|
||||
{
|
||||
struct tm t;
|
||||
|
||||
@@ -286,10 +262,9 @@ date_change (struct tm *date, int delta_month, int delta_day)
|
||||
t.tm_mon += delta_month;
|
||||
t.tm_mday += delta_day;
|
||||
|
||||
if (mktime (&t) == -1)
|
||||
if (mktime(&t) == -1)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
else {
|
||||
*date = t;
|
||||
return 0;
|
||||
}
|
||||
@@ -297,7 +272,7 @@ date_change (struct tm *date, int delta_month, int delta_day)
|
||||
|
||||
/* Draw the monthly view inside calendar panel. */
|
||||
static void
|
||||
draw_monthly_view (struct window *cwin, struct date *current_day,
|
||||
draw_monthly_view(struct window *cwin, struct date *current_day,
|
||||
unsigned sunday_first)
|
||||
{
|
||||
const int OFFY = 2 + (CALHEIGHT - 9) / 2;
|
||||
@@ -311,53 +286,50 @@ draw_monthly_view (struct window *cwin, struct date *current_day,
|
||||
yr = slctd_day.yyyy;
|
||||
|
||||
/* offset for centering calendar in window */
|
||||
SBAR_WIDTH = wins_sbar_width ();
|
||||
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))
|
||||
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);
|
||||
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 */
|
||||
custom_apply_attr (cwin->p, ATTR_HIGHEST);
|
||||
mvwprintw (cwin->p, ofs_y,
|
||||
(SBAR_WIDTH - (strlen (_(monthnames[mo - 1])) + 5)) / 2,
|
||||
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);
|
||||
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++)
|
||||
{
|
||||
mvwprintw (cwin->p, ofs_y, ofs_x + 4 * j, "%s",
|
||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||
for (j = 0; j < WEEKINDAYS; j++) {
|
||||
mvwprintw(cwin->p, ofs_y, ofs_x + 4 * j, "%s",
|
||||
_(daynames[1 + j - sunday_first]));
|
||||
}
|
||||
custom_remove_attr (cwin->p, ATTR_HIGHEST);
|
||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||
|
||||
day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7;
|
||||
|
||||
for (c_day = 1; c_day <= numdays; ++c_day, ++c_day_1, c_day_1 %= 7)
|
||||
{
|
||||
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 */
|
||||
item_this_day = day_check_if_item (check_day);
|
||||
item_this_day = day_check_if_item(check_day);
|
||||
|
||||
/* Go to next line, the week is over. */
|
||||
if (!c_day_1 && 1 != c_day)
|
||||
{
|
||||
if (!c_day_1 && 1 != c_day) {
|
||||
ofs_y++;
|
||||
ofs_x = OFFX - day_1_sav - 4 * c_day;
|
||||
}
|
||||
@@ -366,46 +338,35 @@ draw_monthly_view (struct window *cwin, struct date *current_day,
|
||||
if (c_day == current_day->dd
|
||||
&& current_day->mm == slctd_day.mm
|
||||
&& current_day->yyyy == slctd_day.yyyy
|
||||
&& current_day->dd != slctd_day.dd)
|
||||
{
|
||||
custom_apply_attr (cwin->p, ATTR_LOWEST);
|
||||
mvwprintw (cwin->p, ofs_y + 1,
|
||||
&& current_day->dd != slctd_day.dd) {
|
||||
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)
|
||||
{
|
||||
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
|
||||
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);
|
||||
mvwprintw(cwin->p, ofs_y + 1,
|
||||
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
weeknum (const struct tm *t, int firstweekday)
|
||||
static int weeknum(const struct tm *t, int firstweekday)
|
||||
{
|
||||
int wday, wnum;
|
||||
|
||||
wday = t->tm_wday;
|
||||
if (firstweekday == MONDAY)
|
||||
{
|
||||
if (firstweekday == MONDAY) {
|
||||
if (wday == SUNDAY)
|
||||
wday = 6;
|
||||
else
|
||||
@@ -421,19 +382,17 @@ weeknum (const struct tm *t, int firstweekday)
|
||||
/*
|
||||
* Compute the week number according to ISO 8601.
|
||||
*/
|
||||
static int
|
||||
ISO8601weeknum (const struct tm *t)
|
||||
static int ISO8601weeknum(const struct tm *t)
|
||||
{
|
||||
int wnum, jan1day;
|
||||
|
||||
wnum = weeknum (t, MONDAY);
|
||||
wnum = weeknum(t, MONDAY);
|
||||
|
||||
jan1day = t->tm_wday - (t->tm_yday % WEEKINDAYS);
|
||||
if (jan1day < 0)
|
||||
jan1day += WEEKINDAYS;
|
||||
|
||||
switch (jan1day)
|
||||
{
|
||||
switch (jan1day) {
|
||||
case MONDAY:
|
||||
break;
|
||||
case TUESDAY:
|
||||
@@ -444,8 +403,7 @@ ISO8601weeknum (const struct tm *t)
|
||||
case FRIDAY:
|
||||
case SATURDAY:
|
||||
case SUNDAY:
|
||||
if (wnum == 0)
|
||||
{
|
||||
if (wnum == 0) {
|
||||
/* Get week number of last week of last year. */
|
||||
struct tm dec31ly; /* 12/31 last year */
|
||||
|
||||
@@ -454,14 +412,13 @@ ISO8601weeknum (const struct tm *t)
|
||||
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);
|
||||
dec31ly.tm_yday = 364 + ISLEAP(dec31ly.tm_year + 1900);
|
||||
wnum = ISO8601weeknum(&dec31ly);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (t->tm_mon == 11)
|
||||
{
|
||||
if (t->tm_mon == 11) {
|
||||
int wday, mday;
|
||||
|
||||
wday = t->tm_wday;
|
||||
@@ -477,7 +434,7 @@ ISO8601weeknum (const struct tm *t)
|
||||
|
||||
/* Draw the weekly view inside calendar panel. */
|
||||
static void
|
||||
draw_weekly_view (struct window *cwin, struct date *current_day,
|
||||
draw_weekly_view(struct window *cwin, struct date *current_day,
|
||||
unsigned sunday_first)
|
||||
{
|
||||
#define DAYSLICESNO 6
|
||||
@@ -486,46 +443,45 @@ draw_weekly_view (struct window *cwin, struct date *current_day,
|
||||
struct tm t;
|
||||
int OFFX, j, c_wday, days_to_remove, weeknum;
|
||||
|
||||
OFFX = (wins_sbar_width () - WCALWIDTH) / 2 + 1;
|
||||
OFFX = (wins_sbar_width() - WCALWIDTH) / 2 + 1;
|
||||
|
||||
/* Fill in a tm structure with the first day of the selected week. */
|
||||
c_wday = calendar_get_wday (&slctd_day);
|
||||
c_wday = 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));
|
||||
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);
|
||||
mktime(&t);
|
||||
date_change(&t, 0, -days_to_remove);
|
||||
|
||||
/* Print the week number. */
|
||||
weeknum = ISO8601weeknum (&t);
|
||||
custom_apply_attr (cwin->p, ATTR_HIGHEST);
|
||||
mvwprintw (cwin->p, 2, cwin->w - 9, "(# %02d)", weeknum);
|
||||
custom_remove_attr (cwin->p, ATTR_HIGHEST);
|
||||
weeknum = ISO8601weeknum(&t);
|
||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||
mvwprintw(cwin->p, 2, cwin->w - 9, "(# %02d)", weeknum);
|
||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||
|
||||
/* Now draw calendar view. */
|
||||
for (j = 0; j < WEEKINDAYS; j++)
|
||||
{
|
||||
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);
|
||||
mvwprintw (cwin->p, OFFY, OFFX + 4 * j, "%s",
|
||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||
mvwprintw(cwin->p, OFFY, OFFX + 4 * j, "%s",
|
||||
_(daynames[1 + j - sunday_first]));
|
||||
custom_remove_attr (cwin->p, ATTR_HIGHEST);
|
||||
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);
|
||||
item_this_day = day_check_if_item(date);
|
||||
|
||||
/* Print the day numbers with appropriate decoration. */
|
||||
if (t.tm_mday == current_day->dd
|
||||
@@ -541,74 +497,69 @@ draw_weekly_view (struct window *cwin, struct date *current_day,
|
||||
attr = 0;
|
||||
|
||||
if (attr)
|
||||
custom_apply_attr (cwin->p, attr);
|
||||
mvwprintw (cwin->p, OFFY + 1, OFFX + 1 + 4 * j, "%02d", t.tm_mday);
|
||||
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);
|
||||
custom_remove_attr(cwin->p, attr);
|
||||
|
||||
/* 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++)
|
||||
{
|
||||
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)
|
||||
mvwhline (cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2);
|
||||
if (slices[i])
|
||||
{
|
||||
mvwhline(cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2);
|
||||
if (slices[i]) {
|
||||
int highlight;
|
||||
|
||||
highlight = (t.tm_mday == slctd_day.dd) ? 1 : 0;
|
||||
if (highlight)
|
||||
custom_apply_attr (cwin->p, attr);
|
||||
wattron (cwin->p, A_REVERSE);
|
||||
mvwprintw (cwin->p, OFFY + 2 + i, OFFX + 1 + 4 * j, " ");
|
||||
mvwprintw (cwin->p, OFFY + 2 + i, OFFX + 2 + 4 * j, " ");
|
||||
wattroff (cwin->p, A_REVERSE);
|
||||
custom_apply_attr(cwin->p, attr);
|
||||
wattron(cwin->p, A_REVERSE);
|
||||
mvwprintw(cwin->p, OFFY + 2 + i, OFFX + 1 + 4 * j, " ");
|
||||
mvwprintw(cwin->p, OFFY + 2 + i, OFFX + 2 + 4 * j, " ");
|
||||
wattroff(cwin->p, A_REVERSE);
|
||||
if (highlight)
|
||||
custom_remove_attr (cwin->p, attr);
|
||||
custom_remove_attr(cwin->p, attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* get next day */
|
||||
date_change (&t, 0, 1);
|
||||
date_change(&t, 0, 1);
|
||||
}
|
||||
|
||||
/* Draw marks to indicate midday on the sides of the calendar. */
|
||||
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,
|
||||
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);
|
||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||
|
||||
#undef DAYSLICESNO
|
||||
}
|
||||
|
||||
/* Function used to display the calendar panel. */
|
||||
void
|
||||
calendar_update_panel (struct window *cwin)
|
||||
void calendar_update_panel(struct window *cwin)
|
||||
{
|
||||
struct date current_day;
|
||||
unsigned sunday_first;
|
||||
|
||||
calendar_store_current_date (¤t_day);
|
||||
erase_window_part (cwin->p, 1, 3, cwin->w - 2, cwin->h - 2);
|
||||
mvwhline (cwin->p, 2, 1, ACS_HLINE, cwin->w - 2);
|
||||
sunday_first = calendar_week_begins_on_monday () ? 0 : 1;
|
||||
calendar_store_current_date(¤t_day);
|
||||
erase_window_part(cwin->p, 1, 3, cwin->w - 2, cwin->h - 2);
|
||||
mvwhline(cwin->p, 2, 1, ACS_HLINE, cwin->w - 2);
|
||||
sunday_first = calendar_week_begins_on_monday()? 0 : 1;
|
||||
|
||||
draw_calendar[calendar_view] (cwin, ¤t_day, sunday_first);
|
||||
|
||||
wnoutrefresh (cwin->p);
|
||||
wnoutrefresh(cwin->p);
|
||||
}
|
||||
|
||||
/* Set the selected day in calendar to current day. */
|
||||
void
|
||||
calendar_goto_today (void)
|
||||
void calendar_goto_today(void)
|
||||
{
|
||||
struct date today;
|
||||
|
||||
calendar_store_current_date (&today);
|
||||
calendar_store_current_date(&today);
|
||||
slctd_day.dd = today.dd;
|
||||
slctd_day.mm = today.mm;
|
||||
slctd_day.yyyy = today.yyyy;
|
||||
@@ -620,8 +571,7 @@ calendar_goto_today (void)
|
||||
* If the entered date is empty, automatically jump to the current date.
|
||||
* slctd_day is updated with the newly selected date.
|
||||
*/
|
||||
void
|
||||
calendar_change_day (int datefmt)
|
||||
void calendar_change_day(int datefmt)
|
||||
{
|
||||
#define LDAY 11
|
||||
char selected_day[LDAY] = "";
|
||||
@@ -634,32 +584,26 @@ calendar_change_day (int datefmt)
|
||||
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)
|
||||
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)
|
||||
{
|
||||
else {
|
||||
if (strlen(selected_day) == 0) {
|
||||
wrong_day = 0;
|
||||
calendar_goto_today ();
|
||||
}
|
||||
else if (parse_date (selected_day, datefmt, &dyear, &dmonth, &dday,
|
||||
calendar_get_slctd_day ()))
|
||||
{
|
||||
calendar_goto_today();
|
||||
} else if (parse_date(selected_day, datefmt, &dyear, &dmonth, &dday,
|
||||
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[STA].p);
|
||||
if (wrong_day) {
|
||||
status_mesg(mesg_line1, mesg_line2);
|
||||
wgetch(win[STA].p);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -667,66 +611,60 @@ calendar_change_day (int datefmt)
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
calendar_move (enum move move, int count)
|
||||
void calendar_move(enum move move, int count)
|
||||
{
|
||||
int ret, days_to_remove, days_to_add;
|
||||
struct tm t;
|
||||
|
||||
memset (&t, 0, sizeof (struct tm));
|
||||
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)
|
||||
{
|
||||
switch (move) {
|
||||
case UP:
|
||||
ret = date_change (&t, 0, -count * WEEKINDAYS);
|
||||
ret = date_change(&t, 0, -count * WEEKINDAYS);
|
||||
break;
|
||||
case DOWN:
|
||||
ret = date_change (&t, 0, count * WEEKINDAYS);
|
||||
ret = date_change(&t, 0, count * WEEKINDAYS);
|
||||
break;
|
||||
case LEFT:
|
||||
ret = date_change (&t, 0, -count);
|
||||
ret = date_change(&t, 0, -count);
|
||||
break;
|
||||
case RIGHT:
|
||||
ret = date_change (&t, 0, count);
|
||||
ret = date_change(&t, 0, count);
|
||||
break;
|
||||
case WEEK_START:
|
||||
/* Normalize struct tm to get week day number. */
|
||||
mktime (&t);
|
||||
if (calendar_week_begins_on_monday ())
|
||||
mktime(&t);
|
||||
if (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);
|
||||
ret = date_change(&t, 0, -days_to_remove);
|
||||
break;
|
||||
case WEEK_END:
|
||||
mktime (&t);
|
||||
if (calendar_week_begins_on_monday ())
|
||||
mktime(&t);
|
||||
if (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);
|
||||
ret = date_change(&t, 0, days_to_add);
|
||||
break;
|
||||
default:
|
||||
ret = 1;
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
if (t.tm_year < 2)
|
||||
{
|
||||
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)
|
||||
{
|
||||
} else if (t.tm_year > 137) {
|
||||
t.tm_mday = 31;
|
||||
t.tm_mon = 11;
|
||||
t.tm_year = 137;
|
||||
@@ -739,39 +677,37 @@ calendar_move (enum move move, int count)
|
||||
}
|
||||
|
||||
/* Returns the beginning of current year as a long. */
|
||||
long
|
||||
calendar_start_of_year (void)
|
||||
long calendar_start_of_year(void)
|
||||
{
|
||||
time_t timer;
|
||||
struct tm *tm;
|
||||
|
||||
timer = time (NULL);
|
||||
tm = localtime (&timer);
|
||||
timer = time(NULL);
|
||||
tm = localtime(&timer);
|
||||
tm->tm_mon = 0;
|
||||
tm->tm_mday = 1;
|
||||
tm->tm_hour = 0;
|
||||
tm->tm_min = 0;
|
||||
tm->tm_sec = 0;
|
||||
timer = mktime (tm);
|
||||
timer = mktime(tm);
|
||||
|
||||
return (long)timer;
|
||||
}
|
||||
|
||||
long
|
||||
calendar_end_of_year (void)
|
||||
long calendar_end_of_year(void)
|
||||
{
|
||||
time_t timer;
|
||||
struct tm *tm;
|
||||
|
||||
timer = time (NULL);
|
||||
tm = localtime (&timer);
|
||||
timer = time(NULL);
|
||||
tm = localtime(&timer);
|
||||
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 = mktime(tm);
|
||||
|
||||
return (long)(timer - 1);
|
||||
}
|
||||
@@ -817,8 +753,7 @@ calendar_end_of_year (void)
|
||||
* dtor --
|
||||
* convert degrees to radians
|
||||
*/
|
||||
static double
|
||||
dtor (double deg)
|
||||
static double dtor(double deg)
|
||||
{
|
||||
return deg * M_PI / 180;
|
||||
}
|
||||
@@ -827,8 +762,7 @@ dtor (double deg)
|
||||
* adj360 --
|
||||
* adjust value so 0 <= deg <= 360
|
||||
*/
|
||||
static void
|
||||
adj360 (double *deg)
|
||||
static void adj360(double *deg)
|
||||
{
|
||||
for (;;)
|
||||
if (*deg < 0.0)
|
||||
@@ -843,36 +777,35 @@ adj360 (double *deg)
|
||||
* potm --
|
||||
* return phase of the moon
|
||||
*/
|
||||
static double
|
||||
potm (double days)
|
||||
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);
|
||||
adj360(&N);
|
||||
Msol = N + EPSILONg - RHOg; /* sec 46 #4 */
|
||||
adj360 (&Msol);
|
||||
Ec = 360 / M_PI * ECCEN * sin (dtor (Msol)); /* sec 46 #5 */
|
||||
adj360(&Msol);
|
||||
Ec = 360 / M_PI * ECCEN * sin(dtor(Msol)); /* sec 46 #5 */
|
||||
LambdaSol = N + Ec + EPSILONg; /* sec 46 #6 */
|
||||
adj360 (&LambdaSol);
|
||||
adj360(&LambdaSol);
|
||||
l = 13.1763966 * days + lzero; /* sec 65 #4 */
|
||||
adj360 (&l);
|
||||
adj360(&l);
|
||||
Mm = l - (0.1114041 * days) - Pzero; /* sec 65 #5 */
|
||||
adj360 (&Mm);
|
||||
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));
|
||||
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 */
|
||||
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 */
|
||||
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 */
|
||||
return 50.0 * (1 - cos(dtor(D))); /* sec 67 #3 */
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -886,23 +819,22 @@ potm (double days)
|
||||
* Updated to the Third Edition of Duffett-Smith's book, IX 1998
|
||||
*
|
||||
*/
|
||||
static double
|
||||
pom (time_t tmpt)
|
||||
static double pom(time_t tmpt)
|
||||
{
|
||||
struct tm *GMT;
|
||||
double days;
|
||||
int cnt;
|
||||
|
||||
GMT = gmtime (&tmpt);
|
||||
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;
|
||||
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;
|
||||
days -= ISLEAP(cnt + TM_YEAR_BASE) ? 366 : 365;
|
||||
|
||||
return potm (days);
|
||||
return potm(days);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -910,24 +842,23 @@ pom (time_t tmpt)
|
||||
* Careful: date is the selected day in calendar at 00:00, so it represents
|
||||
* the phase of the moon for previous day.
|
||||
*/
|
||||
const char *
|
||||
calendar_get_pom (time_t date)
|
||||
const char *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);
|
||||
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))
|
||||
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];
|
||||
|
||||
416
src/config.c
416
src/config.c
@@ -49,28 +49,28 @@ struct confvar {
|
||||
void *target;
|
||||
};
|
||||
|
||||
static int config_parse_bool (unsigned *, const char *);
|
||||
static int config_serialize_bool (char *, unsigned *);
|
||||
static int config_parse_int (int *, const char *);
|
||||
static int config_serialize_int (char *, int *);
|
||||
static int config_parse_unsigned (unsigned *, const char *);
|
||||
static int config_serialize_unsigned (char *, unsigned *);
|
||||
static int config_parse_str (char *, const char *);
|
||||
static int config_serialize_str (char *, const char *);
|
||||
static int config_parse_calendar_view (void *, const char *);
|
||||
static int config_serialize_calendar_view (char *, void *);
|
||||
static int config_parse_first_day_of_week (void *, const char *);
|
||||
static int config_serialize_first_day_of_week (char *, void *);
|
||||
static int config_parse_color_theme (void *, const char *);
|
||||
static int config_serialize_color_theme (char *, void *);
|
||||
static int config_parse_layout (void *, const char *);
|
||||
static int config_serialize_layout (char *, void *);
|
||||
static int config_parse_sidebar_width (void *, const char *);
|
||||
static int config_serialize_sidebar_width (char *, void *);
|
||||
static int config_parse_output_datefmt (void *, const char *);
|
||||
static int config_serialize_output_datefmt (char *, void *);
|
||||
static int config_parse_input_datefmt (void *, const char *);
|
||||
static int config_serialize_input_datefmt (char *, void *);
|
||||
static int config_parse_bool(unsigned *, const char *);
|
||||
static int config_serialize_bool(char *, unsigned *);
|
||||
static int config_parse_int(int *, const char *);
|
||||
static int config_serialize_int(char *, int *);
|
||||
static int config_parse_unsigned(unsigned *, const char *);
|
||||
static int config_serialize_unsigned(char *, unsigned *);
|
||||
static int config_parse_str(char *, const char *);
|
||||
static int config_serialize_str(char *, const char *);
|
||||
static int config_parse_calendar_view(void *, const char *);
|
||||
static int config_serialize_calendar_view(char *, void *);
|
||||
static int config_parse_first_day_of_week(void *, const char *);
|
||||
static int config_serialize_first_day_of_week(char *, void *);
|
||||
static int config_parse_color_theme(void *, const char *);
|
||||
static int config_serialize_color_theme(char *, void *);
|
||||
static int config_parse_layout(void *, const char *);
|
||||
static int config_serialize_layout(char *, void *);
|
||||
static int config_parse_sidebar_width(void *, const char *);
|
||||
static int config_serialize_sidebar_width(char *, void *);
|
||||
static int config_parse_output_datefmt(void *, const char *);
|
||||
static int config_serialize_output_datefmt(char *, void *);
|
||||
static int config_parse_input_datefmt(void *, const char *);
|
||||
static int config_serialize_input_datefmt(char *, void *);
|
||||
|
||||
#define CONFIG_HANDLER_BOOL(var) (config_fn_parse_t) config_parse_bool, \
|
||||
(config_fn_serialize_t) config_serialize_bool, &(var)
|
||||
@@ -82,44 +82,49 @@ 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.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.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])];
|
||||
int done[sizeof(confmap) / sizeof(confmap[0])];
|
||||
};
|
||||
|
||||
typedef int (*config_fn_walk_cb_t) (const char *, const char *, void *);
|
||||
typedef int (*config_fn_walk_junk_cb_t) (const char *, void *);
|
||||
|
||||
static int
|
||||
config_parse_bool (unsigned *dest, const char *val)
|
||||
static int config_parse_bool(unsigned *dest, const char *val)
|
||||
{
|
||||
if (strcmp (val, "yes") == 0)
|
||||
if (strcmp(val, "yes") == 0)
|
||||
*dest = 1;
|
||||
else if (strcmp (val, "no") == 0)
|
||||
else if (strcmp(val, "no") == 0)
|
||||
*dest = 0;
|
||||
else
|
||||
return 0;
|
||||
@@ -127,55 +132,51 @@ config_parse_bool (unsigned *dest, const char *val)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_unsigned (unsigned *dest, const char *val)
|
||||
static int config_parse_unsigned(unsigned *dest, const char *val)
|
||||
{
|
||||
if (is_all_digit (val))
|
||||
*dest = atoi (val);
|
||||
if (is_all_digit(val))
|
||||
*dest = atoi(val);
|
||||
else
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_int (int *dest, const char *val)
|
||||
static int config_parse_int(int *dest, const char *val)
|
||||
{
|
||||
if ((*val == '+' || *val == '-' || isdigit (*val)) && is_all_digit (val + 1))
|
||||
*dest = atoi (val);
|
||||
if ((*val == '+' || *val == '-' || isdigit(*val)) && is_all_digit(val + 1))
|
||||
*dest = atoi(val);
|
||||
else
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_str (char *dest, const char *val)
|
||||
static int config_parse_str(char *dest, const char *val)
|
||||
{
|
||||
strncpy (dest, val, BUFSIZ);
|
||||
strncpy(dest, val, BUFSIZ);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_color (int *dest, const char *val)
|
||||
static int config_parse_color(int *dest, const char *val)
|
||||
{
|
||||
if (!strcmp (val, "black"))
|
||||
if (!strcmp(val, "black"))
|
||||
*dest = COLOR_BLACK;
|
||||
else if (!strcmp (val, "red"))
|
||||
else if (!strcmp(val, "red"))
|
||||
*dest = COLOR_RED;
|
||||
else if (!strcmp (val, "green"))
|
||||
else if (!strcmp(val, "green"))
|
||||
*dest = COLOR_GREEN;
|
||||
else if (!strcmp (val, "yellow"))
|
||||
else if (!strcmp(val, "yellow"))
|
||||
*dest = COLOR_YELLOW;
|
||||
else if (!strcmp (val, "blue"))
|
||||
else if (!strcmp(val, "blue"))
|
||||
*dest = COLOR_BLUE;
|
||||
else if (!strcmp (val, "magenta"))
|
||||
else if (!strcmp(val, "magenta"))
|
||||
*dest = COLOR_MAGENTA;
|
||||
else if (!strcmp (val, "cyan"))
|
||||
else if (!strcmp(val, "cyan"))
|
||||
*dest = COLOR_CYAN;
|
||||
else if (!strcmp (val, "white"))
|
||||
else if (!strcmp(val, "white"))
|
||||
*dest = COLOR_WHITE;
|
||||
else if (!strcmp (val, "default"))
|
||||
else if (!strcmp(val, "default"))
|
||||
*dest = background;
|
||||
else
|
||||
return 0;
|
||||
@@ -183,111 +184,96 @@ config_parse_color (int *dest, const char *val)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_color_pair (int *dest1, int *dest2, const char *val)
|
||||
static int config_parse_color_pair(int *dest1, int *dest2, const char *val)
|
||||
{
|
||||
char s1[BUFSIZ], s2[BUFSIZ];
|
||||
|
||||
if (sscanf (val, "%s on %s", s1, s2) != 2)
|
||||
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)
|
||||
static int config_parse_calendar_view(void *dummy, const char *val)
|
||||
{
|
||||
calendar_set_view (atoi (val));
|
||||
calendar_set_view(atoi(val));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_first_day_of_week (void *dummy, const char *val)
|
||||
static int config_parse_first_day_of_week(void *dummy, const char *val)
|
||||
{
|
||||
if (!strcmp (val, "monday"))
|
||||
calendar_set_first_day_of_week (MONDAY);
|
||||
else if (!strcmp (val, "sunday"))
|
||||
calendar_set_first_day_of_week (SUNDAY);
|
||||
if (!strcmp(val, "monday"))
|
||||
calendar_set_first_day_of_week(MONDAY);
|
||||
else if (!strcmp(val, "sunday"))
|
||||
calendar_set_first_day_of_week(SUNDAY);
|
||||
else
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_color_theme (void *dummy, const char *val)
|
||||
static int config_parse_color_theme(void *dummy, const char *val)
|
||||
{
|
||||
int color1, color2;
|
||||
if (!config_parse_color_pair (&color1, &color2, val))
|
||||
if (!config_parse_color_pair(&color1, &color2, val))
|
||||
return 0;
|
||||
init_pair (COLR_CUSTOM, color1, color2);
|
||||
init_pair(COLR_CUSTOM, color1, color2);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_layout (void *dummy, const char *val)
|
||||
static int config_parse_layout(void *dummy, const char *val)
|
||||
{
|
||||
wins_set_layout (atoi (val));
|
||||
wins_set_layout(atoi(val));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_sidebar_width (void *dummy, const char *val)
|
||||
static int config_parse_sidebar_width(void *dummy, const char *val)
|
||||
{
|
||||
wins_set_sbar_width (atoi (val));
|
||||
wins_set_sbar_width(atoi(val));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_output_datefmt (void *dummy, const char *val)
|
||||
static int config_parse_output_datefmt(void *dummy, const char *val)
|
||||
{
|
||||
if (val[0] != '\0')
|
||||
return config_parse_str (conf.output_datefmt, val);
|
||||
return config_parse_str(conf.output_datefmt, val);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_parse_input_datefmt (void *dummy, const char *val)
|
||||
static int config_parse_input_datefmt(void *dummy, const char *val)
|
||||
{
|
||||
if (config_parse_int (&conf.input_datefmt, 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
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Set a configuration variable. */
|
||||
static int
|
||||
config_set_conf (const char *key, const char *value)
|
||||
static int config_set_conf(const char *key, const char *value)
|
||||
{
|
||||
int i;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_bool (char *dest, unsigned *val)
|
||||
static int config_serialize_bool(char *dest, unsigned *val)
|
||||
{
|
||||
if (*val)
|
||||
{
|
||||
if (*val) {
|
||||
dest[0] = 'y';
|
||||
dest[1] = 'e';
|
||||
dest[2] = 's';
|
||||
dest[3] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
dest[0] = 'n';
|
||||
dest[1] = 'o';
|
||||
dest[2] = '\0';
|
||||
@@ -296,24 +282,21 @@ config_serialize_bool (char *dest, unsigned *val)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_unsigned (char *dest, unsigned *val)
|
||||
static int config_serialize_unsigned(char *dest, unsigned *val)
|
||||
{
|
||||
snprintf (dest, BUFSIZ, "%u", *val);
|
||||
snprintf(dest, BUFSIZ, "%u", *val);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_int (char *dest, int *val)
|
||||
static int config_serialize_int(char *dest, int *val)
|
||||
{
|
||||
snprintf (dest, BUFSIZ, "%d", *val);
|
||||
snprintf(dest, BUFSIZ, "%d", *val);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_str (char *dest, const char *val)
|
||||
static int config_serialize_str(char *dest, const char *val)
|
||||
{
|
||||
strncpy (dest, val, BUFSIZ);
|
||||
strncpy(dest, val, BUFSIZ);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -325,8 +308,7 @@ config_serialize_str (char *dest, const char *val)
|
||||
* If ncurses library was compiled with --enable-ext-funcs,
|
||||
* then default color is -1.
|
||||
*/
|
||||
static void
|
||||
config_color_theme_name (char *theme_name)
|
||||
static void config_color_theme_name(char *theme_name)
|
||||
{
|
||||
#define MAXCOLORS 8
|
||||
#define NBCOLORS 2
|
||||
@@ -349,37 +331,32 @@ config_color_theme_name (char *theme_name)
|
||||
};
|
||||
|
||||
if (!colorize)
|
||||
strncpy (theme_name, "0", BUFSIZ);
|
||||
else
|
||||
{
|
||||
pair_content (COLR_CUSTOM, &color[0], &color[1]);
|
||||
for (i = 0; i < NBCOLORS; i++)
|
||||
{
|
||||
strncpy(theme_name, "0", 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"));
|
||||
else {
|
||||
EXIT(_("unknown color"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
}
|
||||
snprintf (theme_name, BUFSIZ, "%s on %s", color_name[0], color_name[1]);
|
||||
snprintf(theme_name, BUFSIZ, "%s on %s", color_name[0], color_name[1]);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_calendar_view (char *buf, void *dummy)
|
||||
static int config_serialize_calendar_view(char *buf, void *dummy)
|
||||
{
|
||||
int tmp = calendar_get_view ();
|
||||
return config_serialize_int (buf, &tmp);
|
||||
int tmp = calendar_get_view();
|
||||
return config_serialize_int(buf, &tmp);
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_first_day_of_week (char *buf, void *dummy)
|
||||
static int config_serialize_first_day_of_week(char *buf, void *dummy)
|
||||
{
|
||||
if (calendar_week_begins_on_monday ())
|
||||
if (calendar_week_begins_on_monday())
|
||||
strcpy(buf, "monday");
|
||||
else
|
||||
strcpy(buf, "sunday");
|
||||
@@ -387,42 +364,37 @@ config_serialize_first_day_of_week (char *buf, void *dummy)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_color_theme (char *buf, void *dummy)
|
||||
static int config_serialize_color_theme(char *buf, void *dummy)
|
||||
{
|
||||
config_color_theme_name (buf);
|
||||
config_color_theme_name(buf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_serialize_layout (char *buf, void *dummy)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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,
|
||||
config_serialize_conf(char *buf, const char *key,
|
||||
struct config_save_status *status)
|
||||
{
|
||||
int i;
|
||||
@@ -430,17 +402,13 @@ config_serialize_conf (char *buf, const char *key,
|
||||
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))
|
||||
{
|
||||
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
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -449,34 +417,31 @@ config_serialize_conf (char *buf, const char *key,
|
||||
}
|
||||
|
||||
static void
|
||||
config_file_walk (config_fn_walk_cb_t fn_cb,
|
||||
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"));
|
||||
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)
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
for (;;) {
|
||||
if (fgets(buf, sizeof buf, data_file) == NULL)
|
||||
break;
|
||||
io_extract_data (e_conf, buf, sizeof buf);
|
||||
io_extract_data(e_conf, buf, sizeof buf);
|
||||
|
||||
if (*e_conf == '\0')
|
||||
{
|
||||
if (*e_conf == '\0') {
|
||||
if (fn_junk_cb)
|
||||
fn_junk_cb (buf, data);
|
||||
fn_junk_cb(buf, data);
|
||||
continue;
|
||||
}
|
||||
|
||||
key = e_conf;
|
||||
value = strchr (e_conf, '=');
|
||||
if (value)
|
||||
{
|
||||
value = strchr(e_conf, '=');
|
||||
if (value) {
|
||||
*value = '\0';
|
||||
value++;
|
||||
}
|
||||
@@ -502,80 +467,74 @@ config_file_walk (config_fn_walk_cb_t fn_cb,
|
||||
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, "
|
||||
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'))
|
||||
{
|
||||
if (value && (*value == '\0' || *value == '\n')) {
|
||||
/* Backward compatibility mode. */
|
||||
if (fgets (buf, sizeof buf, data_file) == NULL)
|
||||
if (fgets(buf, sizeof buf, data_file) == NULL)
|
||||
break;
|
||||
io_extract_data (e_conf, buf, sizeof buf);
|
||||
io_extract_data(e_conf, buf, sizeof buf);
|
||||
value = e_conf;
|
||||
}
|
||||
|
||||
fn_cb (key, value, data);
|
||||
fn_cb(key, value, data);
|
||||
}
|
||||
file_close (data_file, __FILE_POS__);
|
||||
pthread_mutex_unlock (&nbar.mutex);
|
||||
file_close(data_file, __FILE_POS__);
|
||||
pthread_mutex_unlock(&nbar.mutex);
|
||||
}
|
||||
|
||||
static int
|
||||
config_load_cb (const char *key, const char *value, void *dummy)
|
||||
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);
|
||||
EXIT(_("configuration variable unknown: \"%s\""), key);
|
||||
/* NOTREACHED */
|
||||
else if (result == 0)
|
||||
EXIT (_("wrong configuration variable format for \"%s\""), key);
|
||||
EXIT(_("wrong configuration variable format for \"%s\""), key);
|
||||
/* NOTREACHED */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Load the user configuration. */
|
||||
void
|
||||
config_load (void)
|
||||
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)
|
||||
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);
|
||||
int result =
|
||||
config_serialize_conf(buf, key, (struct config_save_status *)status);
|
||||
|
||||
if (result < 0)
|
||||
EXIT (_("configuration variable unknown: \"%s\""), key);
|
||||
EXIT(_("configuration variable unknown: \"%s\""), key);
|
||||
/* NOTREACHED */
|
||||
else if (result == 0)
|
||||
EXIT (_("wrong configuration variable format for \"%s\""), key);
|
||||
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;
|
||||
}
|
||||
|
||||
static int
|
||||
config_save_junk_cb (const char *data, void *status)
|
||||
static int config_save_junk_cb(const char *data, void *status)
|
||||
{
|
||||
fputs (data, ((struct config_save_status *) status)->fp);
|
||||
fputs(data, ((struct config_save_status *)status)->fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Save the user configuration. */
|
||||
unsigned
|
||||
config_save (void)
|
||||
unsigned config_save(void)
|
||||
{
|
||||
char tmppath[BUFSIZ];
|
||||
char *tmpext;
|
||||
@@ -585,32 +544,31 @@ config_save (void)
|
||||
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)
|
||||
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);
|
||||
strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1);
|
||||
mem_free(tmpext);
|
||||
|
||||
status.fp = fopen (tmppath, "w");
|
||||
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++)
|
||||
{
|
||||
for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) {
|
||||
if (!status.done[i])
|
||||
config_save_cb (confmap[i].key, NULL, &status);
|
||||
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;
|
||||
}
|
||||
|
||||
874
src/custom.c
874
src/custom.c
File diff suppressed because it is too large
Load Diff
135
src/dmon.c
135
src/dmon.c
@@ -64,26 +64,22 @@
|
||||
|
||||
static unsigned data_loaded;
|
||||
|
||||
static void
|
||||
dmon_sigs_hdlr (int sig)
|
||||
static void dmon_sigs_hdlr(int sig)
|
||||
{
|
||||
if (data_loaded)
|
||||
free_user_data ();
|
||||
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)
|
||||
static unsigned daemonize(int status)
|
||||
{
|
||||
int fd;
|
||||
|
||||
@@ -93,15 +89,14 @@ daemonize (int status)
|
||||
* First need to fork in order to become a child of the init process,
|
||||
* once the father exits.
|
||||
*/
|
||||
switch (fork ())
|
||||
{
|
||||
switch (fork()) {
|
||||
case -1: /* fork error */
|
||||
EXIT (_("Could not fork: %s\n"), strerror (errno));
|
||||
EXIT(_("Could not fork: %s\n"), strerror(errno));
|
||||
break;
|
||||
case 0: /* child */
|
||||
break;
|
||||
default: /* parent */
|
||||
exit (status);
|
||||
exit(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -110,10 +105,9 @@ daemonize (int status)
|
||||
* 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));
|
||||
if (setsid() == -1) {
|
||||
DMON_LOG(_("Could not detach from the controlling terminal: %s\n"),
|
||||
strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -121,82 +115,74 @@ daemonize (int status)
|
||||
* Change working directory to root directory,
|
||||
* to prevent filesystem unmounts.
|
||||
*/
|
||||
if (chdir ("/") == -1)
|
||||
{
|
||||
DMON_LOG (_("Could not change working directory: %s\n"),
|
||||
strerror (errno));
|
||||
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 = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
|
||||
dup2(fd, STDIN_FILENO);
|
||||
dup2(fd, STDOUT_FILENO);
|
||||
dup2(fd, STDERR_FILENO);
|
||||
if (fd > 2)
|
||||
close (fd);
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/* Write access for the owner only. */
|
||||
umask (0022);
|
||||
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))
|
||||
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)
|
||||
void dmon_start(int parent_exit_status)
|
||||
{
|
||||
if (!daemonize (parent_exit_status))
|
||||
DMON_ABRT (_("Cannot daemonize, aborting\n"));
|
||||
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_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_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 ();
|
||||
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 (;;)
|
||||
{
|
||||
DMON_LOG(_("started at %s\n"), nowstr());
|
||||
for (;;) {
|
||||
int left;
|
||||
|
||||
if (!notify_get_next_bkgd ())
|
||||
DMON_ABRT (_("error loading next appointment\n"));
|
||||
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"));
|
||||
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",
|
||||
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 ());
|
||||
DMON_SLEEP_TIME), nowstr(), DMON_SLEEP_TIME);
|
||||
psleep(DMON_SLEEP_TIME);
|
||||
DMON_LOG(_("awakened at %s\n"), nowstr());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,15 +190,14 @@ dmon_start (int parent_exit_status)
|
||||
* Check if calcurse is running in background, and if yes, send a SIGINT
|
||||
* signal to stop it.
|
||||
*/
|
||||
void
|
||||
dmon_stop (void)
|
||||
void dmon_stop(void)
|
||||
{
|
||||
int dpid;
|
||||
|
||||
dpid = io_get_pid (path_dpid);
|
||||
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));
|
||||
}
|
||||
|
||||
132
src/event.c
132
src/event.c
@@ -44,113 +44,101 @@
|
||||
llist_t eventlist;
|
||||
static struct event bkp_cut_event;
|
||||
|
||||
void
|
||||
event_free_bkp (void)
|
||||
void event_free_bkp(void)
|
||||
{
|
||||
if (bkp_cut_event.mesg)
|
||||
{
|
||||
mem_free (bkp_cut_event.mesg);
|
||||
if (bkp_cut_event.mesg) {
|
||||
mem_free(bkp_cut_event.mesg);
|
||||
bkp_cut_event.mesg = 0;
|
||||
}
|
||||
erase_note (&bkp_cut_event.note);
|
||||
erase_note(&bkp_cut_event.note);
|
||||
}
|
||||
|
||||
static void
|
||||
event_free (struct event *ev)
|
||||
static 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);
|
||||
}
|
||||
|
||||
static void
|
||||
event_dup (struct event *in, struct event *bkp)
|
||||
static void event_dup(struct event *in, struct event *bkp)
|
||||
{
|
||||
EXIT_IF (!in || !bkp, _("null pointer"));
|
||||
EXIT_IF(!in || !bkp, _("null pointer"));
|
||||
|
||||
bkp->id = in->id;
|
||||
bkp->day = in->day;
|
||||
bkp->mesg = mem_strdup (in->mesg);
|
||||
bkp->mesg = mem_strdup(in->mesg);
|
||||
if (in->note)
|
||||
bkp->note = mem_strdup (in->note);
|
||||
bkp->note = mem_strdup(in->note);
|
||||
}
|
||||
|
||||
void
|
||||
event_llist_init (void)
|
||||
void event_llist_init(void)
|
||||
{
|
||||
LLIST_INIT (&eventlist);
|
||||
LLIST_INIT(&eventlist);
|
||||
}
|
||||
|
||||
void
|
||||
event_llist_free (void)
|
||||
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)
|
||||
static int event_cmp_day(struct event *a, struct event *b)
|
||||
{
|
||||
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 *event_new(char *mesg, char *note, long day, int id)
|
||||
{
|
||||
struct event *ev;
|
||||
|
||||
ev = mem_malloc (sizeof (struct event));
|
||||
ev->mesg = mem_strdup (mesg);
|
||||
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->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;
|
||||
}
|
||||
|
||||
/* Check if the event belongs to the selected day */
|
||||
unsigned
|
||||
event_inday (struct event *i, long start)
|
||||
unsigned event_inday(struct event *i, long 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)
|
||||
void event_write(struct event *o, FILE * f)
|
||||
{
|
||||
struct tm *lt;
|
||||
time_t t;
|
||||
|
||||
t = o->day;
|
||||
lt = localtime (&t);
|
||||
fprintf (f, "%02u/%02u/%04u [%d] ", lt->tm_mon + 1, lt->tm_mday,
|
||||
lt = localtime(&t);
|
||||
fprintf(f, "%02u/%02u/%04u [%d] ", lt->tm_mon + 1, lt->tm_mday,
|
||||
1900 + lt->tm_year, o->id);
|
||||
if (o->note != NULL)
|
||||
fprintf (f, ">%s ", o->note);
|
||||
fprintf (f, "%s\n", o->mesg);
|
||||
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)
|
||||
struct event *event_scan(FILE * f, struct tm start, int id, char *note)
|
||||
{
|
||||
char buf[BUFSIZ], *nl;
|
||||
time_t tstart, t;
|
||||
|
||||
t = time (NULL);
|
||||
localtime (&t);
|
||||
t = time(NULL);
|
||||
localtime(&t);
|
||||
|
||||
/* Read the event description */
|
||||
if (!fgets (buf, sizeof buf, f))
|
||||
if (!fgets(buf, sizeof buf, f))
|
||||
return NULL;
|
||||
|
||||
nl = strchr (buf, '\n');
|
||||
if (nl)
|
||||
{
|
||||
nl = strchr(buf, '\n');
|
||||
if (nl) {
|
||||
*nl = '\0';
|
||||
}
|
||||
start.tm_hour = 0;
|
||||
@@ -160,57 +148,53 @@ event_scan (FILE *f, struct tm start, int id, char *note)
|
||||
start.tm_year -= 1900;
|
||||
start.tm_mon--;
|
||||
|
||||
tstart = mktime (&start);
|
||||
EXIT_IF (tstart == -1, _("date error in the event\n"));
|
||||
tstart = mktime(&start);
|
||||
EXIT_IF(tstart == -1, _("date error in the event\n"));
|
||||
|
||||
return event_new (buf, note, tstart, id);
|
||||
return event_new(buf, note, tstart, id);
|
||||
}
|
||||
|
||||
/* Retrieve an event from the list, given the day and item position. */
|
||||
struct event *
|
||||
event_get (long day, int pos)
|
||||
struct event *event_get(long day, int pos)
|
||||
{
|
||||
llist_item_t *i = LLIST_FIND_NTH (&eventlist, pos, day, event_inday);
|
||||
llist_item_t *i = LLIST_FIND_NTH(&eventlist, pos, day, event_inday);
|
||||
|
||||
if (i)
|
||||
return LLIST_TS_GET_DATA (i);
|
||||
return LLIST_TS_GET_DATA(i);
|
||||
|
||||
EXIT (_("event not found"));
|
||||
EXIT(_("event not found"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* Delete an event from the list. */
|
||||
void
|
||||
event_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
||||
void event_delete_bynum(long start, unsigned num, enum eraseflg flag)
|
||||
{
|
||||
llist_item_t *i = LLIST_FIND_NTH (&eventlist, num, start, event_inday);
|
||||
llist_item_t *i = LLIST_FIND_NTH(&eventlist, num, start, event_inday);
|
||||
|
||||
if (!i)
|
||||
EXIT (_("no such appointment"));
|
||||
struct event *ev = LLIST_TS_GET_DATA (i);
|
||||
EXIT(_("no such appointment"));
|
||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||
|
||||
switch (flag)
|
||||
{
|
||||
switch (flag) {
|
||||
case ERASE_FORCE_ONLY_NOTE:
|
||||
erase_note (&ev->note);
|
||||
erase_note(&ev->note);
|
||||
break;
|
||||
case ERASE_CUT:
|
||||
event_free_bkp ();
|
||||
event_dup (ev, &bkp_cut_event);
|
||||
erase_note (&ev->note);
|
||||
event_free_bkp();
|
||||
event_dup(ev, &bkp_cut_event);
|
||||
erase_note(&ev->note);
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
LLIST_REMOVE (&eventlist, i);
|
||||
mem_free (ev->mesg);
|
||||
mem_free (ev);
|
||||
LLIST_REMOVE(&eventlist, i);
|
||||
mem_free(ev->mesg);
|
||||
mem_free(ev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
event_paste_item (void)
|
||||
void event_paste_item(void)
|
||||
{
|
||||
event_new (bkp_cut_event.mesg, bkp_cut_event.note,
|
||||
date2sec (*calendar_get_slctd_day (), 0, 0), bkp_cut_event.id);
|
||||
event_free_bkp ();
|
||||
event_new(bkp_cut_event.mesg, bkp_cut_event.note,
|
||||
date2sec(*calendar_get_slctd_day(), 0, 0), bkp_cut_event.id);
|
||||
event_free_bkp();
|
||||
}
|
||||
|
||||
185
src/getstring.c
185
src/getstring.c
@@ -48,14 +48,13 @@ struct getstr_status {
|
||||
};
|
||||
|
||||
/* 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);
|
||||
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 -
|
||||
@@ -65,62 +64,57 @@ getstr_print (WINDOW *win, int x, int y, struct getstr_status *st)
|
||||
c = '<';
|
||||
else if (st->ci[st->len].dpyoff - st->ci[st->scrpos].dpyoff > col - 2)
|
||||
c = '>';
|
||||
mvwprintw (win, y, col - 2, " %c", 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);
|
||||
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)
|
||||
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);
|
||||
memmove(str, str + cl, strlen(str) + 1);
|
||||
|
||||
st->len--;
|
||||
for (i = st->pos; i <= st->len; i++)
|
||||
{
|
||||
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)
|
||||
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 cl = UTF8_LENGTH(c[0]);
|
||||
int cw = utf8_width(c);
|
||||
int i;
|
||||
|
||||
memmove (str + cl, str, strlen (str) + 1);
|
||||
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--)
|
||||
{
|
||||
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)
|
||||
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;
|
||||
|
||||
@@ -128,14 +122,13 @@ getstr_init (struct getstr_status *st, char *str, struct getstr_charinfo *ci)
|
||||
st->ci = ci;
|
||||
|
||||
st->len = width = 0;
|
||||
while (*str)
|
||||
{
|
||||
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);
|
||||
width += utf8_width(str);
|
||||
str += UTF8_LENGTH(*str);
|
||||
}
|
||||
st->ci[st->len].offset = str - st->s;
|
||||
st->ci[st->len].dpyoff = width;
|
||||
@@ -145,26 +138,21 @@ getstr_init (struct getstr_status *st, char *str, struct getstr_charinfo *ci)
|
||||
}
|
||||
|
||||
/* Scroll left/right if the cursor moves outside the window range. */
|
||||
static void
|
||||
getstr_fixscr (struct getstr_status *st)
|
||||
static void getstr_fixscr(struct getstr_status *st)
|
||||
{
|
||||
const int pgsize = col / 3;
|
||||
int pgskip;
|
||||
|
||||
while (st->pos < st->scrpos)
|
||||
{
|
||||
while (st->pos < st->scrpos) {
|
||||
pgskip = 0;
|
||||
while (pgskip < pgsize && st->scrpos > 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)
|
||||
{
|
||||
while (st->ci[st->pos].dpyoff - st->ci[st->scrpos].dpyoff > col - 2) {
|
||||
pgskip = 0;
|
||||
while (pgskip < pgsize && st->scrpos < st->len)
|
||||
{
|
||||
while (pgskip < pgsize && st->scrpos < st->len) {
|
||||
pgskip += st->ci[st->scrpos + 1].dpyoff - st->ci[st->scrpos].dpyoff;
|
||||
st->scrpos++;
|
||||
}
|
||||
@@ -179,8 +167,7 @@ getstr_fixscr (struct getstr_status *st)
|
||||
* environment, otherwise the cursor would move from place to place without
|
||||
* control.
|
||||
*/
|
||||
enum getstr
|
||||
getstring (WINDOW *win, char *str, int l, int x, int y)
|
||||
enum getstr getstring(WINDOW * win, char *str, int l, int x, int y)
|
||||
{
|
||||
struct getstr_status st;
|
||||
struct getstr_charinfo ci[l + 1];
|
||||
@@ -188,112 +175,106 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
|
||||
int ch, k;
|
||||
char c[UTF8_MAXLEN];
|
||||
|
||||
getstr_init (&st, str, ci);
|
||||
custom_apply_attr (win, ATTR_HIGHEST);
|
||||
getstr_init(&st, str, ci);
|
||||
custom_apply_attr(win, ATTR_HIGHEST);
|
||||
|
||||
for (;;) {
|
||||
getstr_fixscr (&st);
|
||||
getstr_print (win, x, y, &st);
|
||||
wins_doupdate ();
|
||||
getstr_fixscr(&st);
|
||||
getstr_print(win, x, y, &st);
|
||||
wins_doupdate();
|
||||
|
||||
if ((ch = wgetch (win)) == '\n') break;
|
||||
switch (ch)
|
||||
{
|
||||
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 */
|
||||
case CTRL('H'):
|
||||
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 ();
|
||||
getstr_del_char(&st);
|
||||
} else
|
||||
bell();
|
||||
break;
|
||||
case CTRL ('K'): /* delete to end-of-line */
|
||||
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 */
|
||||
case CTRL('A'): /* go to begginning of string */
|
||||
st.pos = 0;
|
||||
break;
|
||||
case CTRL ('E'): /* go to end of string */
|
||||
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--;
|
||||
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++;
|
||||
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);
|
||||
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);
|
||||
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 updatestring(WINDOW * win, char **str, int x, int y)
|
||||
{
|
||||
int len = strlen (*str);
|
||||
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);
|
||||
mem_free(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
288
src/help.c
288
src/help.c
@@ -48,8 +48,7 @@ typedef struct {
|
||||
char text[HELPTEXTSIZ];
|
||||
} help_page_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
typedef enum {
|
||||
HELP_MAIN,
|
||||
HELP_SAVE,
|
||||
HELP_IMPORT,
|
||||
@@ -74,18 +73,15 @@ typedef enum
|
||||
HELP_CREDITS,
|
||||
HELPSCREENS,
|
||||
NOPAGE
|
||||
}
|
||||
help_pages_e;
|
||||
} help_pages_e;
|
||||
|
||||
/* Returns the number of lines in an help text. */
|
||||
static int
|
||||
get_help_lines (char *text)
|
||||
static int get_help_lines(char *text)
|
||||
{
|
||||
int i, newline;
|
||||
|
||||
newline = 0;
|
||||
for (i = 0; text[i]; i++)
|
||||
{
|
||||
for (i = 0; text[i]; i++) {
|
||||
if (text[i] == '\n')
|
||||
newline++;
|
||||
}
|
||||
@@ -97,7 +93,7 @@ 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";
|
||||
@@ -105,12 +101,11 @@ help_write_pad (struct window *win, char *title, char *text, enum key action)
|
||||
|
||||
colnum = 0;
|
||||
rownum = 0;
|
||||
erase_window_part (win->p, rownum, colnum, BUFSIZ, win->w);
|
||||
custom_apply_attr (win->p, ATTR_HIGHEST);
|
||||
mvwprintw (win->p, rownum, colnum, "%s", title);
|
||||
if ((int) action != KEY_RESIZE && action < NBKEYS) {
|
||||
switch (action)
|
||||
{
|
||||
erase_window_part(win->p, rownum, colnum, BUFSIZ, win->w);
|
||||
custom_apply_attr(win->p, ATTR_HIGHEST);
|
||||
mvwprintw(win->p, rownum, colnum, "%s", title);
|
||||
if ((int)action != KEY_RESIZE && action < NBKEYS) {
|
||||
switch (action) {
|
||||
case KEY_END_OF_WEEK:
|
||||
case KEY_START_OF_WEEK:
|
||||
case KEY_MOVE_UP:
|
||||
@@ -131,20 +126,19 @@ help_write_pad (struct window *win, char *title, char *text, enum key action)
|
||||
case KEY_GENERIC_PASTE:
|
||||
break;
|
||||
default:
|
||||
bindings = keys_action_allkeys (action);
|
||||
bindings = keys_action_allkeys(action);
|
||||
|
||||
if (bindings)
|
||||
{
|
||||
colnum = win->w - strlen (bindings_title) - strlen (bindings);
|
||||
mvwprintw (win->p, rownum, colnum, bindings_title, bindings);
|
||||
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);
|
||||
mvwprintw (win->p, rownum, colnum, "%s", text);
|
||||
rownum += get_help_lines (text);
|
||||
rownum += get_help_lines(title);
|
||||
custom_remove_attr(win->p, ATTR_HIGHEST);
|
||||
mvwprintw(win->p, rownum, colnum, "%s", text);
|
||||
rownum += get_help_lines(text);
|
||||
return rownum;
|
||||
}
|
||||
|
||||
@@ -152,8 +146,7 @@ help_write_pad (struct window *win, char *title, char *text, enum key action)
|
||||
* Create and init help screen and its pad, which is used to make the scrolling
|
||||
* faster.
|
||||
*/
|
||||
void
|
||||
help_wins_init (struct scrollwin *hwin, int x, int y, int h, int w)
|
||||
void help_wins_init(struct scrollwin *hwin, int x, int y, int h, int w)
|
||||
{
|
||||
const int PADOFFSET = 4;
|
||||
const int TITLELINES = 3;
|
||||
@@ -169,48 +162,44 @@ help_wins_init (struct scrollwin *hwin, int x, int y, int h, int w)
|
||||
hwin->pad.w = hwin->win.w - 2 * PADOFFSET + 1;
|
||||
|
||||
hwin->label = _("Calcurse help");
|
||||
wins_scrollwin_init (hwin);
|
||||
wins_show (hwin->win.p, hwin->label);
|
||||
wins_scrollwin_init(hwin);
|
||||
wins_show(hwin->win.p, hwin->label);
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete the existing windows and recreate them with their new
|
||||
* size and placement.
|
||||
*/
|
||||
static void
|
||||
help_wins_reinit (struct scrollwin *hwin)
|
||||
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)
|
||||
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)
|
||||
static int wanted_page(int ch)
|
||||
{
|
||||
int page;
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
switch (ch) {
|
||||
|
||||
case KEY_GENERIC_HELP:
|
||||
page = HELP_MAIN;
|
||||
@@ -323,8 +312,7 @@ wanted_page (int ch)
|
||||
}
|
||||
|
||||
/* Draws the help screen */
|
||||
void
|
||||
help_screen (void)
|
||||
void help_screen(void)
|
||||
{
|
||||
enum {
|
||||
MOVE_UP,
|
||||
@@ -342,8 +330,9 @@ help_screen (void)
|
||||
|
||||
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"
|
||||
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"
|
||||
@@ -357,13 +346,13 @@ help_screen (void)
|
||||
" 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));
|
||||
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,
|
||||
snprintf(hscr[HELP_SAVE].text, HELPTEXTSIZ,
|
||||
_("Save calcurse data.\n"
|
||||
"Data are splitted into four different files which contain :"
|
||||
"\n\n"
|
||||
@@ -376,7 +365,7 @@ help_screen (void)
|
||||
"automatically before quitting."));
|
||||
|
||||
hscr[HELP_IMPORT].title = _("Import\n");
|
||||
snprintf (hscr[HELP_IMPORT].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -394,7 +383,7 @@ help_screen (void)
|
||||
"the item could not be imported.\n"));
|
||||
|
||||
hscr[HELP_EXPORT].title = _("Export\n");
|
||||
snprintf (hscr[HELP_EXPORT].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -409,15 +398,12 @@ help_screen (void)
|
||||
"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);
|
||||
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,
|
||||
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"
|
||||
@@ -440,12 +426,13 @@ help_screen (void)
|
||||
"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));
|
||||
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"
|
||||
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"
|
||||
@@ -453,19 +440,18 @@ help_screen (void)
|
||||
"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));
|
||||
"Calcurse screen."), keys_action_firstkey(KEY_VIEW_ITEM));
|
||||
|
||||
hscr[HELP_PIPE].title = _("Pipe\n");
|
||||
snprintf (hscr[HELP_PIPE].text, HELPTEXTSIZ,
|
||||
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));
|
||||
keys_action_firstkey(KEY_PIPE_ITEM));
|
||||
|
||||
hscr[HELP_TAB].title = _("Tab\n");
|
||||
snprintf (hscr[HELP_TAB].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -475,12 +461,12 @@ help_screen (void)
|
||||
"\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));
|
||||
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,
|
||||
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"
|
||||
@@ -488,10 +474,10 @@ help_screen (void)
|
||||
"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));
|
||||
keys_action_firstkey(KEY_GENERIC_GOTO_TODAY));
|
||||
|
||||
hscr[HELP_DELETE].title = _("Delete\n");
|
||||
snprintf (hscr[HELP_DELETE].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -505,8 +491,9 @@ help_screen (void)
|
||||
"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"
|
||||
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 "
|
||||
@@ -535,15 +522,16 @@ help_screen (void)
|
||||
" 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));
|
||||
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_CUT_PASTE].title = _("Cut and Paste\n");
|
||||
snprintf (hscr[HELP_CUT_PASTE].text, HELPTEXTSIZ,
|
||||
_("Cut and paste the currently selected item. This is useful to quickly\n"
|
||||
snprintf(hscr[HELP_CUT_PASTE].text, HELPTEXTSIZ,
|
||||
_
|
||||
("Cut and paste the currently selected item. This is useful to quickly\n"
|
||||
"move an item from one date to another.\n"
|
||||
"To do so, one must first highlight the item that needs to be moved,\n"
|
||||
"then press '%s' to cut this item. It will be removed from the panel.\n"
|
||||
@@ -554,11 +542,11 @@ help_screen (void)
|
||||
"Be careful that if two cuts are performed successively without pasting\n"
|
||||
"between them, the item that was cut at first will be lost, together\n"
|
||||
"with its associated note if it had one."),
|
||||
keys_action_firstkey (KEY_GENERIC_CUT),
|
||||
keys_action_firstkey (KEY_GENERIC_PASTE));
|
||||
keys_action_firstkey(KEY_GENERIC_CUT),
|
||||
keys_action_firstkey(KEY_GENERIC_PASTE));
|
||||
|
||||
hscr[HELP_EDIT].title = _("Edit Item\n");
|
||||
snprintf (hscr[HELP_EDIT].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -575,8 +563,9 @@ help_screen (void)
|
||||
" 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"
|
||||
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"
|
||||
@@ -593,30 +582,30 @@ help_screen (void)
|
||||
"\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));
|
||||
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"
|
||||
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"
|
||||
"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));
|
||||
"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"
|
||||
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"
|
||||
@@ -629,11 +618,11 @@ help_screen (void)
|
||||
"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));
|
||||
keys_action_firstkey(KEY_RAISE_PRIORITY),
|
||||
keys_action_firstkey(KEY_LOWER_PRIORITY));
|
||||
|
||||
hscr[HELP_REPEAT].title = _("Repeat\n");
|
||||
snprintf (hscr[HELP_REPEAT].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -657,11 +646,12 @@ help_screen (void)
|
||||
" 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));
|
||||
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"
|
||||
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"
|
||||
@@ -674,7 +664,7 @@ help_screen (void)
|
||||
"\nand how long before it he gets notified."));
|
||||
|
||||
hscr[HELP_CONFIG].title = _("Config\n");
|
||||
snprintf (hscr[HELP_CONFIG].text, HELPTEXTSIZ,
|
||||
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"
|
||||
@@ -689,8 +679,9 @@ help_screen (void)
|
||||
"\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"
|
||||
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"
|
||||
@@ -708,30 +699,30 @@ help_screen (void)
|
||||
"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_GOTO_TODAY),
|
||||
keys_action_firstkey (KEY_GENERIC_SCROLL_UP),
|
||||
keys_action_firstkey (KEY_GENERIC_SCROLL_DOWN));
|
||||
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_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,
|
||||
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));
|
||||
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,
|
||||
snprintf(hscr[HELP_CREDITS].text, HELPTEXTSIZ,
|
||||
_("\nCopyright (c) 2004-2012 calcurse Development Team\n"
|
||||
"All rights reserved.\n"
|
||||
"\n"
|
||||
@@ -751,50 +742,47 @@ help_screen (void)
|
||||
"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);
|
||||
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);
|
||||
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);
|
||||
wins_scrollwin_down(&hwin, 1);
|
||||
break;
|
||||
|
||||
case KEY_GENERIC_SCROLL_UP:
|
||||
wins_scrollwin_up (&hwin, 1);
|
||||
wins_scrollwin_up(&hwin, 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
page = wanted_page (ch);
|
||||
page = wanted_page(ch);
|
||||
if (page != NOPAGE) {
|
||||
hwin.first_visible_line = 0;
|
||||
hwin.total_lines = help_write_pad (&hwin.pad, hscr[page].title,
|
||||
hwin.total_lines = help_write_pad(&hwin.pad, hscr[page].title,
|
||||
hscr[page].text, ch);
|
||||
oldpage = page;
|
||||
}
|
||||
}
|
||||
|
||||
if (resize)
|
||||
{
|
||||
if (resize) {
|
||||
resize = 0;
|
||||
wins_get_config ();
|
||||
help_wins_reset (&hwin);
|
||||
wins_get_config();
|
||||
help_wins_reset(&hwin);
|
||||
hwin.first_visible_line = 0;
|
||||
hwin.total_lines = help_write_pad (&hwin.pad, hscr[oldpage].title,
|
||||
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[STA].p, NULL);
|
||||
wins_scrollwin_display(&hwin);
|
||||
ch = keys_getch(win[STA].p, NULL);
|
||||
}
|
||||
wins_scrollwin_delete (&hwin);
|
||||
wins_scrollwin_delete(&hwin);
|
||||
if (need_resize)
|
||||
wins_reset ();
|
||||
wins_reset();
|
||||
}
|
||||
|
||||
861
src/ical.c
861
src/ical.c
File diff suppressed because it is too large
Load Diff
339
src/keys.c
339
src/keys.c
@@ -94,8 +94,7 @@ static struct keydef_s keydef[NBKEYS] = {
|
||||
{"lower-priority", "-"},
|
||||
};
|
||||
|
||||
static void
|
||||
dump_intro (FILE *fd)
|
||||
static void dump_intro(FILE * fd)
|
||||
{
|
||||
const char *intro =
|
||||
_("#\n"
|
||||
@@ -119,64 +118,56 @@ dump_intro (FILE *fd)
|
||||
"# A description of what each ACTION keyword is used for is available\n"
|
||||
"# from calcurse online configuration menu.\n");
|
||||
|
||||
fprintf (fd, "%s\n", intro);
|
||||
fprintf(fd, "%s\n", intro);
|
||||
}
|
||||
|
||||
void
|
||||
keys_init (void)
|
||||
void keys_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAXKEYVAL; i++)
|
||||
actions[i] = KEY_UNDEF;
|
||||
for (i = 0; i < NBKEYS; i++)
|
||||
LLIST_INIT (&keys[i]);
|
||||
LLIST_INIT(&keys[i]);
|
||||
}
|
||||
|
||||
static void
|
||||
key_free (char *s)
|
||||
static void key_free(char *s)
|
||||
{
|
||||
mem_free (s);
|
||||
mem_free(s);
|
||||
}
|
||||
|
||||
void
|
||||
keys_free (void)
|
||||
void keys_free(void)
|
||||
{
|
||||
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)
|
||||
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."));
|
||||
fd = fopen(file, "w");
|
||||
EXIT_IF(fd == NULL, _("FATAL ERROR: could not create default keys file."));
|
||||
|
||||
dump_intro (fd);
|
||||
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__);
|
||||
fprintf(fd, "%s %s\n", keydef[i].label, keydef[i].binding);
|
||||
file_close(fd, __FILE_POS__);
|
||||
}
|
||||
|
||||
const char *
|
||||
keys_get_label (enum key key)
|
||||
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;
|
||||
}
|
||||
|
||||
enum key
|
||||
keys_get_action (int pressed)
|
||||
enum key keys_get_action(int pressed)
|
||||
{
|
||||
if (pressed < 0 || pressed > MAXKEYVAL)
|
||||
return -1;
|
||||
@@ -184,61 +175,52 @@ keys_get_action (int pressed)
|
||||
return actions[pressed];
|
||||
}
|
||||
|
||||
enum key
|
||||
keys_getch (WINDOW *win, int *count)
|
||||
enum key keys_getch(WINDOW * win, int *count)
|
||||
{
|
||||
int ch = '0';
|
||||
|
||||
if (count)
|
||||
{
|
||||
if (count) {
|
||||
*count = 0;
|
||||
do
|
||||
{
|
||||
do {
|
||||
*count = *count * 10 + ch - '0';
|
||||
ch = wgetch (win);
|
||||
ch = wgetch(win);
|
||||
}
|
||||
while ((ch == '0' && *count > 0) || (ch >= '1' && ch <= '9'));
|
||||
|
||||
if (*count == 0)
|
||||
*count = 1;
|
||||
}
|
||||
else
|
||||
ch = wgetch (win);
|
||||
} else
|
||||
ch = wgetch(win);
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
switch (ch) {
|
||||
case KEY_RESIZE:
|
||||
return KEY_RESIZE;
|
||||
default:
|
||||
return keys_get_action (ch);
|
||||
return keys_get_action(ch);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
add_key_str (enum key action, int key)
|
||||
static void add_key_str(enum key action, int key)
|
||||
{
|
||||
if (action < 0 || 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)
|
||||
int keys_assign_binding(int key, enum key action)
|
||||
{
|
||||
if (key < 0 || key > MAXKEYVAL || actions[key] != KEY_UNDEF)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
else {
|
||||
actions[key] = action;
|
||||
add_key_str (action, key);
|
||||
add_key_str(action, key);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
del_key_str (enum key action, int key)
|
||||
static void del_key_str(enum key action, int key)
|
||||
{
|
||||
llist_item_t *i;
|
||||
char oldstr[BUFSIZ];
|
||||
@@ -246,30 +228,25 @@ del_key_str (enum key action, int key)
|
||||
if (action < 0 || 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);
|
||||
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)
|
||||
void keys_remove_binding(int key, enum key action)
|
||||
{
|
||||
if (key >= 0 && key <= MAXKEYVAL)
|
||||
{
|
||||
if (key >= 0 && key <= MAXKEYVAL) {
|
||||
actions[key] = KEY_UNDEF;
|
||||
del_key_str (action, key);
|
||||
del_key_str(action, key);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
keys_str2int (const char *key)
|
||||
int keys_str2int(const char *key)
|
||||
{
|
||||
const char CONTROL_KEY[] = "C-";
|
||||
const char TAB_KEY[] = "TAB";
|
||||
@@ -284,42 +261,39 @@ keys_str2int (const char *key)
|
||||
|
||||
if (!key)
|
||||
return -1;
|
||||
if (strlen (key) == 1)
|
||||
if (strlen(key) == 1)
|
||||
return (int)key[0];
|
||||
else
|
||||
{
|
||||
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 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))
|
||||
else if (!strcmp(key, ESCAPE_KEY))
|
||||
return ESCAPE;
|
||||
else if (!strcmp (key, SPACE_KEY))
|
||||
else if (!strcmp(key, SPACE_KEY))
|
||||
return SPACE;
|
||||
else if (!strcmp (key, CURSES_KEY_UP))
|
||||
else if (!strcmp(key, CURSES_KEY_UP))
|
||||
return KEY_UP;
|
||||
else if (!strcmp (key, CURSES_KEY_DOWN))
|
||||
else if (!strcmp(key, CURSES_KEY_DOWN))
|
||||
return KEY_DOWN;
|
||||
else if (!strcmp (key, CURSES_KEY_LEFT))
|
||||
else if (!strcmp(key, CURSES_KEY_LEFT))
|
||||
return KEY_LEFT;
|
||||
else if (!strcmp (key, CURSES_KEY_RIGHT))
|
||||
else if (!strcmp(key, CURSES_KEY_RIGHT))
|
||||
return KEY_RIGHT;
|
||||
else if (!strcmp (key, CURSES_KEY_HOME))
|
||||
else if (!strcmp(key, CURSES_KEY_HOME))
|
||||
return KEY_HOME;
|
||||
else if (!strcmp (key, CURSES_KEY_END))
|
||||
else if (!strcmp(key, CURSES_KEY_END))
|
||||
return KEY_END;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
keys_int2str (int key)
|
||||
const char *keys_int2str(int key)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
switch (key) {
|
||||
case TAB:
|
||||
return "TAB";
|
||||
case SPACE:
|
||||
@@ -339,79 +313,70 @@ keys_int2str (int key)
|
||||
case KEY_END:
|
||||
return "KEY_END";
|
||||
default:
|
||||
return (char *)keyname (key);
|
||||
return (char *)keyname(key);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
keys_action_count_keys (enum key action)
|
||||
int keys_action_count_keys(enum key action)
|
||||
{
|
||||
llist_item_t *i;
|
||||
int n = 0;
|
||||
|
||||
LLIST_FOREACH (&keys[action], i)
|
||||
LLIST_FOREACH(&keys[action], i)
|
||||
n++;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
const char *
|
||||
keys_action_firstkey (enum key action)
|
||||
const char *keys_action_firstkey(enum key action)
|
||||
{
|
||||
const char *s = LLIST_GET_DATA (LLIST_FIRST (&keys[action]));
|
||||
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)
|
||||
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)
|
||||
char *keys_action_allkeys(enum key action)
|
||||
{
|
||||
llist_item_t *i;
|
||||
static char keystr[BUFSIZ];
|
||||
const char *CHAR_SPACE = " ";
|
||||
|
||||
if (!LLIST_FIRST (&keys[action]))
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
/* Need this to display keys properly inside status bar. */
|
||||
static char *
|
||||
keys_format_label (char *key, int keylen)
|
||||
static char *keys_format_label(char *key, int keylen)
|
||||
{
|
||||
static char fmtkey[BUFSIZ];
|
||||
const int len = strlen (key);
|
||||
const int len = strlen(key);
|
||||
const char dot = '.';
|
||||
int i;
|
||||
|
||||
if (keylen > BUFSIZ)
|
||||
return NULL;
|
||||
|
||||
memset (fmtkey, 0, sizeof(fmtkey));
|
||||
memset(fmtkey, 0, sizeof(fmtkey));
|
||||
if (len == 0)
|
||||
strncpy (fmtkey, "?", sizeof (fmtkey));
|
||||
else if (len <= keylen)
|
||||
{
|
||||
strncpy(fmtkey, "?", sizeof(fmtkey));
|
||||
else if (len <= keylen) {
|
||||
for (i = 0; i < keylen - len; i++)
|
||||
fmtkey[i] = ' ';
|
||||
strncat (fmtkey, key, keylen);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncat(fmtkey, key, keylen);
|
||||
} else {
|
||||
for (i = 0; i < keylen - 1; i++)
|
||||
fmtkey[i] = key[i];
|
||||
fmtkey[keylen - 1] = dot;
|
||||
@@ -420,7 +385,7 @@ keys_format_label (char *key, int keylen)
|
||||
}
|
||||
|
||||
void
|
||||
keys_display_bindings_bar (WINDOW *win, struct binding *bindings[], int count,
|
||||
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. */
|
||||
@@ -430,9 +395,8 @@ keys_display_bindings_bar (WINDOW *win, struct binding *bindings[], int count,
|
||||
|
||||
int i;
|
||||
|
||||
wins_erase_status_bar ();
|
||||
for (i = 0; i < page_size && page_base + i < count; 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;
|
||||
@@ -447,58 +411,46 @@ keys_display_bindings_bar (WINDOW *win, struct binding *bindings[], int count,
|
||||
else
|
||||
binding = more;
|
||||
|
||||
strncpy (key, keys_action_firstkey (binding->action), KEYS_KEYLEN);
|
||||
strncpy(key, keys_action_firstkey(binding->action), KEYS_KEYLEN);
|
||||
key[KEYS_KEYLEN] = '\0';
|
||||
fmtkey = keys_format_label (key, KEYS_KEYLEN);
|
||||
fmtkey = keys_format_label(key, KEYS_KEYLEN);
|
||||
|
||||
custom_apply_attr (win, ATTR_HIGHEST);
|
||||
mvwprintw (win, key_pos_y, key_pos_x, fmtkey);
|
||||
custom_remove_attr (win, ATTR_HIGHEST);
|
||||
mvwprintw (win, label_pos_y, label_pos_x, binding->label);
|
||||
custom_apply_attr(win, ATTR_HIGHEST);
|
||||
mvwprintw(win, key_pos_y, key_pos_x, fmtkey);
|
||||
custom_remove_attr(win, ATTR_HIGHEST);
|
||||
mvwprintw(win, label_pos_y, label_pos_x, binding->label);
|
||||
}
|
||||
wnoutrefresh (win);
|
||||
wnoutrefresh(win);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display information about the given key.
|
||||
* (could not add the keys descriptions to keydef variable, because of i18n).
|
||||
*/
|
||||
void
|
||||
keys_popup_info (enum key key)
|
||||
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_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_CUT] =
|
||||
_("Help for `generic-cut`.");
|
||||
info[KEY_GENERIC_PASTE] =
|
||||
_("Help for `generic-paste`.");
|
||||
info[KEY_GENERIC_QUIT] = _("Exit from the current menu, or quit calcurse.");
|
||||
info[KEY_GENERIC_SAVE] = _("Save calcurse data.");
|
||||
info[KEY_GENERIC_CUT] = _("Help for `generic-cut`.");
|
||||
info[KEY_GENERIC_PASTE] = _("Help for `generic-paste`.");
|
||||
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_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_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] =
|
||||
@@ -509,122 +461,103 @@ keys_popup_info (enum key key)
|
||||
_("Move to previous day in calendar, whichever panel is currently "
|
||||
"selected.");
|
||||
info[KEY_GENERIC_NEXT_WEEK] =
|
||||
_("Move to next week in calendar, whichever panel is currently selected.");
|
||||
_
|
||||
("Move to next week 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_SCROLL_DOWN] =
|
||||
_("Scroll window down (e.g. when displaying text inside a popup window).");
|
||||
_
|
||||
("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_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_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_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.");
|
||||
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 < 0 || key > NBKEYS)
|
||||
return;
|
||||
|
||||
#define WINROW 10
|
||||
#define WINCOL (col - 4)
|
||||
infowin = popup (WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2,
|
||||
infowin = popup(WINROW, WINCOL, (row - WINROW) / 2, (col - WINCOL) / 2,
|
||||
keydef[key].label, info[key], 1);
|
||||
keys_getch (infowin, NULL);
|
||||
delwin (infowin);
|
||||
keys_getch(infowin, NULL);
|
||||
delwin(infowin);
|
||||
#undef WINROW
|
||||
#undef WINCOL
|
||||
}
|
||||
|
||||
void
|
||||
keys_save_bindings (FILE *fd)
|
||||
void keys_save_bindings(FILE * fd)
|
||||
{
|
||||
int i;
|
||||
|
||||
EXIT_IF (fd == NULL, _("FATAL ERROR: null file pointer."));
|
||||
dump_intro (fd);
|
||||
EXIT_IF(fd == NULL, _("FATAL ERROR: null file pointer."));
|
||||
dump_intro(fd);
|
||||
for (i = 0; i < NBKEYS; i++)
|
||||
fprintf (fd, "%s %s\n", keydef[i].label, keys_action_allkeys (i));
|
||||
fprintf(fd, "%s %s\n", keydef[i].label, keys_action_allkeys(i));
|
||||
}
|
||||
|
||||
int
|
||||
keys_check_missing_bindings (void)
|
||||
int keys_check_missing_bindings(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NBKEYS; i++)
|
||||
{
|
||||
if (!LLIST_FIRST (&keys[i]))
|
||||
for (i = 0; i < NBKEYS; i++) {
|
||||
if (!LLIST_FIRST(&keys[i]))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
keys_fill_missing (void)
|
||||
void keys_fill_missing(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NBKEYS; i++)
|
||||
{
|
||||
if (!LLIST_FIRST (&keys[i]))
|
||||
{
|
||||
for (i = 0; i < NBKEYS; i++) {
|
||||
if (!LLIST_FIRST(&keys[i])) {
|
||||
char *p, tmpbuf[BUFSIZ];
|
||||
|
||||
strncpy (tmpbuf, keydef[i].binding, BUFSIZ);
|
||||
strncpy(tmpbuf, keydef[i].binding, BUFSIZ);
|
||||
p = tmpbuf;
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
char key_ch[BUFSIZ];
|
||||
|
||||
while (*p == ' ')
|
||||
p++;
|
||||
if (sscanf (p, "%s", key_ch) == 1)
|
||||
{
|
||||
if (sscanf(p, "%s", key_ch) == 1) {
|
||||
int ch, used;
|
||||
|
||||
ch = keys_str2int (key_ch);
|
||||
used = keys_assign_binding (ch, i);
|
||||
ch = keys_str2int(key_ch);
|
||||
used = keys_assign_binding(ch, i);
|
||||
if (used)
|
||||
WARN_MSG (_("When adding default key for \"%s\", "
|
||||
WARN_MSG(_("When adding default key for \"%s\", "
|
||||
"\"%s\" was already assigned!"),
|
||||
keydef[i].label, key_ch);
|
||||
p += strlen (key_ch) + 1;
|
||||
}
|
||||
else
|
||||
p += strlen(key_ch) + 1;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
112
src/llist.c
112
src/llist.c
@@ -39,8 +39,7 @@
|
||||
/*
|
||||
* Initialize a list.
|
||||
*/
|
||||
void
|
||||
llist_init (llist_t *l)
|
||||
void llist_init(llist_t * l)
|
||||
{
|
||||
l->head = NULL;
|
||||
l->tail = NULL;
|
||||
@@ -49,15 +48,13 @@ llist_init (llist_t *l)
|
||||
/*
|
||||
* Free a list, but not the contained data.
|
||||
*/
|
||||
void
|
||||
llist_free (llist_t *l)
|
||||
void llist_free(llist_t * l)
|
||||
{
|
||||
llist_item_t *i, *t;
|
||||
|
||||
for (i = l->head; i; i = t)
|
||||
{
|
||||
for (i = l->head; i; i = t) {
|
||||
t = i->next;
|
||||
mem_free (i);
|
||||
mem_free(i);
|
||||
}
|
||||
|
||||
l->head = NULL;
|
||||
@@ -67,15 +64,12 @@ llist_free (llist_t *l)
|
||||
/*
|
||||
* Free the data contained in a list.
|
||||
*/
|
||||
void
|
||||
llist_free_inner (llist_t *l, llist_fn_free_t fn_free)
|
||||
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)
|
||||
{
|
||||
for (i = l->head; i; i = i->next) {
|
||||
if (i->data) {
|
||||
fn_free(i->data);
|
||||
i->data = NULL;
|
||||
}
|
||||
@@ -85,8 +79,7 @@ llist_free_inner (llist_t *l, llist_fn_free_t fn_free)
|
||||
/*
|
||||
* Get the first item of a list.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_first (llist_t *l)
|
||||
llist_item_t *llist_first(llist_t * l)
|
||||
{
|
||||
return l->head;
|
||||
}
|
||||
@@ -94,8 +87,7 @@ llist_first (llist_t *l)
|
||||
/*
|
||||
* Get the nth item of a list.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_nth (llist_t *l, int n)
|
||||
llist_item_t *llist_nth(llist_t * l, int n)
|
||||
{
|
||||
llist_item_t *i;
|
||||
|
||||
@@ -111,8 +103,7 @@ llist_nth (llist_t *l, int n)
|
||||
/*
|
||||
* Get the successor of a list item.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_next (llist_item_t *i)
|
||||
llist_item_t *llist_next(llist_item_t * i)
|
||||
{
|
||||
return i ? i->next : NULL;
|
||||
}
|
||||
@@ -121,10 +112,10 @@ llist_next (llist_item_t *i)
|
||||
* Return the successor of a list item if it is matched by some filter
|
||||
* callback. Return NULL otherwise.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_next_filter (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
||||
llist_item_t *llist_next_filter(llist_item_t * i, long data,
|
||||
llist_fn_match_t fn_match)
|
||||
{
|
||||
if (i && i->next && fn_match (i->next->data, data))
|
||||
if (i && i->next && fn_match(i->next->data, data))
|
||||
return i->next;
|
||||
else
|
||||
return NULL;
|
||||
@@ -133,8 +124,7 @@ llist_next_filter (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
||||
/*
|
||||
* Get the actual data of an item.
|
||||
*/
|
||||
void *
|
||||
llist_get_data (llist_item_t *i)
|
||||
void *llist_get_data(llist_item_t * i)
|
||||
{
|
||||
return i ? i->data : NULL;
|
||||
}
|
||||
@@ -142,20 +132,17 @@ llist_get_data (llist_item_t *i)
|
||||
/*
|
||||
* Add an item at the end of a list.
|
||||
*/
|
||||
void
|
||||
llist_add (llist_t *l, void *data)
|
||||
void llist_add(llist_t * l, void *data)
|
||||
{
|
||||
llist_item_t *o = mem_malloc (sizeof (llist_item_t));
|
||||
llist_item_t *o = mem_malloc(sizeof(llist_item_t));
|
||||
|
||||
if (o)
|
||||
{
|
||||
if (o) {
|
||||
o->data = data;
|
||||
o->next = NULL;
|
||||
|
||||
if (!l->head)
|
||||
l->head = l->tail = o;
|
||||
else
|
||||
{
|
||||
else {
|
||||
l->tail->next = o;
|
||||
l->tail = o;
|
||||
}
|
||||
@@ -165,31 +152,24 @@ llist_add (llist_t *l, void *data)
|
||||
/*
|
||||
* Add an item to a sorted list.
|
||||
*/
|
||||
void
|
||||
llist_add_sorted (llist_t *l, void *data, llist_fn_cmp_t fn_cmp)
|
||||
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 *o = mem_malloc(sizeof(llist_item_t));
|
||||
llist_item_t *i;
|
||||
|
||||
if (o)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
} else if (fn_cmp(o->data, l->head->data) < 0) {
|
||||
o->next = l->head;
|
||||
l->head = o;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
i = l->head;
|
||||
while (i->next && fn_cmp(o->data, i->next->data) >= 0)
|
||||
i = i->next;
|
||||
@@ -202,41 +182,36 @@ llist_add_sorted (llist_t *l, void *data, llist_fn_cmp_t fn_cmp)
|
||||
/*
|
||||
* Remove an item from a list.
|
||||
*/
|
||||
void
|
||||
llist_remove (llist_t *l, llist_item_t *i)
|
||||
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)
|
||||
;
|
||||
else {
|
||||
for (j = l->head; j && j->next != i; j = j->next) ;
|
||||
}
|
||||
|
||||
if (i)
|
||||
{
|
||||
if (i) {
|
||||
if (j)
|
||||
j->next = i->next;
|
||||
if (i == l->tail)
|
||||
l->tail = j;
|
||||
|
||||
mem_free (i);
|
||||
mem_free(i);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the first item matched by some filter callback.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_find_first (llist_t *l, long data, llist_fn_match_t fn_match)
|
||||
llist_item_t *llist_find_first(llist_t * l, long data,
|
||||
llist_fn_match_t fn_match)
|
||||
{
|
||||
llist_item_t *i;
|
||||
|
||||
for (i = l->head; i; i = i->next)
|
||||
{
|
||||
if (fn_match (i->data, data))
|
||||
for (i = l->head; i; i = i->next) {
|
||||
if (fn_match(i->data, data))
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -246,15 +221,13 @@ llist_find_first (llist_t *l, long data, llist_fn_match_t fn_match)
|
||||
/*
|
||||
* Find the next item matched by some filter callback.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_find_next (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
||||
llist_item_t *llist_find_next(llist_item_t * i, long data,
|
||||
llist_fn_match_t fn_match)
|
||||
{
|
||||
if (i)
|
||||
{
|
||||
if (i) {
|
||||
i = i->next;
|
||||
for (; i; i = i->next)
|
||||
{
|
||||
if (fn_match (i->data, data))
|
||||
for (; i; i = i->next) {
|
||||
if (fn_match(i->data, data))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@@ -265,17 +238,16 @@ llist_find_next (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
||||
/*
|
||||
* Find the nth item matched by some filter callback.
|
||||
*/
|
||||
llist_item_t *
|
||||
llist_find_nth (llist_t *l, int n, long data, llist_fn_match_t fn_match)
|
||||
llist_item_t *llist_find_nth(llist_t * l, int n, long data,
|
||||
llist_fn_match_t fn_match)
|
||||
{
|
||||
llist_item_t *i;
|
||||
|
||||
if (n < 0)
|
||||
return NULL;
|
||||
|
||||
for (i = l->head; i; i = i->next)
|
||||
{
|
||||
if (fn_match (i->data, data) && (n-- == 0))
|
||||
for (i = l->head; i; i = i->next) {
|
||||
if (fn_match(i->data, data) && (n-- == 0))
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
28
src/llist.h
28
src/llist.h
@@ -52,9 +52,9 @@ typedef int (*llist_fn_match_t) (void *, long);
|
||||
typedef void (*llist_fn_free_t) (void *);
|
||||
|
||||
/* Initialization and deallocation. */
|
||||
void llist_init (llist_t *);
|
||||
void llist_free (llist_t *);
|
||||
void llist_free_inner (llist_t *, llist_fn_free_t);
|
||||
void llist_init(llist_t *);
|
||||
void llist_free(llist_t *);
|
||||
void llist_free_inner(llist_t *, llist_fn_free_t);
|
||||
|
||||
#define LLIST_INIT(l) llist_init(l)
|
||||
#define LLIST_FREE(l) llist_free(l)
|
||||
@@ -62,13 +62,13 @@ void llist_free_inner (llist_t *, llist_fn_free_t);
|
||||
llist_free_inner(l, (llist_fn_free_t)fn_free)
|
||||
|
||||
/* Retrieving list items. */
|
||||
llist_item_t *llist_first (llist_t *);
|
||||
llist_item_t *llist_nth (llist_t *, int);
|
||||
llist_item_t *llist_next (llist_item_t *);
|
||||
llist_item_t *llist_next_filter (llist_item_t *, long, llist_fn_match_t);
|
||||
llist_item_t *llist_find_first (llist_t *, long, llist_fn_match_t);
|
||||
llist_item_t *llist_find_next (llist_item_t *, long, llist_fn_match_t);
|
||||
llist_item_t *llist_find_nth (llist_t *, int, long, llist_fn_match_t);
|
||||
llist_item_t *llist_first(llist_t *);
|
||||
llist_item_t *llist_nth(llist_t *, int);
|
||||
llist_item_t *llist_next(llist_item_t *);
|
||||
llist_item_t *llist_next_filter(llist_item_t *, long, llist_fn_match_t);
|
||||
llist_item_t *llist_find_first(llist_t *, long, llist_fn_match_t);
|
||||
llist_item_t *llist_find_next(llist_item_t *, long, llist_fn_match_t);
|
||||
llist_item_t *llist_find_nth(llist_t *, int, long, llist_fn_match_t);
|
||||
|
||||
#define LLIST_FIRST(l) llist_first(l)
|
||||
#define LLIST_NTH(l, n) llist_nth(l, n)
|
||||
@@ -91,14 +91,14 @@ llist_item_t *llist_find_nth (llist_t *, int, long, llist_fn_match_t);
|
||||
i = LLIST_NEXT_FILTER (i, data, fn_match))
|
||||
|
||||
/* Accessing list item data. */
|
||||
void *llist_get_data (llist_item_t *);
|
||||
void *llist_get_data(llist_item_t *);
|
||||
|
||||
#define LLIST_GET_DATA(i) llist_get_data(i)
|
||||
|
||||
/* List manipulation. */
|
||||
void llist_add (llist_t *, void *);
|
||||
void llist_add_sorted (llist_t *, void *, llist_fn_cmp_t);
|
||||
void llist_remove (llist_t *, llist_item_t *);
|
||||
void llist_add(llist_t *, void *);
|
||||
void llist_add_sorted(llist_t *, void *, llist_fn_cmp_t);
|
||||
void llist_remove(llist_t *, llist_item_t *);
|
||||
|
||||
#define LLIST_ADD(l, data) llist_add(l, data)
|
||||
#define LLIST_ADD_SORTED(l, data, fn_cmp) \
|
||||
|
||||
@@ -90,4 +90,3 @@ struct llist_ts {
|
||||
#define LLIST_TS_REMOVE(l_ts, i) llist_remove ((llist_t *)l_ts, i)
|
||||
#define LLIST_TS_ADD_SORTED(l_ts, data, fn_cmp) \
|
||||
llist_add_sorted ((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
|
||||
|
||||
|
||||
164
src/mem.c
164
src/mem.c
@@ -71,75 +71,68 @@ static struct mem_stats mstats;
|
||||
|
||||
#endif /* CALCURSE_MEMORY_DEBUG */
|
||||
|
||||
|
||||
void *
|
||||
xmalloc (size_t size)
|
||||
void *xmalloc(size_t size)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
void *
|
||||
xcalloc (size_t nmemb, size_t size)
|
||||
void *xcalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
void *
|
||||
xrealloc (void *ptr, size_t nmemb, size_t size)
|
||||
void *xrealloc(void *ptr, size_t nmemb, size_t 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"));
|
||||
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;
|
||||
}
|
||||
|
||||
char *
|
||||
xstrdup (const char *str)
|
||||
char *xstrdup(const char *str)
|
||||
{
|
||||
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)
|
||||
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)
|
||||
static unsigned stats_add_blk(size_t size, const char *pos)
|
||||
{
|
||||
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++;
|
||||
|
||||
@@ -147,49 +140,44 @@ stats_add_blk (size_t size, const char *pos)
|
||||
o->size = (unsigned)size;
|
||||
o->next = 0;
|
||||
|
||||
for (i = &mstats.blk; *i; i = &(*i)->next)
|
||||
;
|
||||
for (i = &mstats.blk; *i; i = &(*i)->next) ;
|
||||
o->id = mstats.ncall;
|
||||
*i = o;
|
||||
|
||||
return o->id;
|
||||
}
|
||||
|
||||
static void
|
||||
stats_del_blk (unsigned 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)
|
||||
{
|
||||
for (o = mstats.blk; o; o = o->next) {
|
||||
if (o->id == id) {
|
||||
*i = o->next;
|
||||
free (o);
|
||||
free(o);
|
||||
return;
|
||||
}
|
||||
i = &o->next;
|
||||
}
|
||||
|
||||
EXIT (_("Block not found"));
|
||||
EXIT(_("Block not found"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
void *
|
||||
dbg_malloc (size_t size, const char *pos)
|
||||
void *dbg_malloc(size_t size, const char *pos)
|
||||
{
|
||||
unsigned *buf;
|
||||
|
||||
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[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;
|
||||
@@ -197,53 +185,50 @@ dbg_malloc (size_t size, const char *pos)
|
||||
return (void *)(buf + EXTRA_SPACE_START);
|
||||
}
|
||||
|
||||
void *
|
||||
dbg_calloc (size_t nmemb, size_t size, const char *pos)
|
||||
void *dbg_calloc(size_t nmemb, size_t size, const char *pos)
|
||||
{
|
||||
void *buf;
|
||||
|
||||
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)
|
||||
if ((buf = dbg_malloc(size, pos)) == NULL)
|
||||
return NULL;
|
||||
|
||||
memset (buf, 0, size);
|
||||
memset(buf, 0, size);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
void *
|
||||
dbg_realloc (void *ptr, size_t nmemb, size_t size, const char *pos)
|
||||
void *dbg_realloc(void *ptr, size_t nmemb, size_t size, const char *pos)
|
||||
{
|
||||
unsigned *buf, old_size, new_size, cpy_size;
|
||||
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
new_size = nmemb *size;
|
||||
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)
|
||||
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);
|
||||
memmove(buf, ptr, cpy_size);
|
||||
|
||||
mem_free (ptr);
|
||||
mem_free(ptr);
|
||||
|
||||
return (void *)buf;
|
||||
}
|
||||
|
||||
char *
|
||||
dbg_strdup (const char *s, const char *pos)
|
||||
char *dbg_strdup(const char *s, const char *pos)
|
||||
{
|
||||
size_t size;
|
||||
char *buf;
|
||||
@@ -251,70 +236,65 @@ dbg_strdup (const char *s, const char *pos)
|
||||
if (s == NULL)
|
||||
return NULL;
|
||||
|
||||
size = strlen (s);
|
||||
if ((buf = dbg_malloc (size + 1, pos)) == 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)
|
||||
void dbg_free(void *ptr, const char *pos)
|
||||
{
|
||||
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];
|
||||
|
||||
EXIT_IF (buf[BLK_STATE] == MAGIC_FREE,
|
||||
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],
|
||||
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;
|
||||
|
||||
stats_del_blk (buf[BLK_ID]);
|
||||
stats_del_blk(buf[BLK_ID]);
|
||||
|
||||
free (buf);
|
||||
free(buf);
|
||||
mstats.nfree += size;
|
||||
}
|
||||
|
||||
static void
|
||||
dump_block_info (struct mem_blk *blk)
|
||||
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"));
|
||||
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)
|
||||
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');
|
||||
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)
|
||||
{
|
||||
if (mstats.nfree < mstats.nalloc) {
|
||||
struct mem_blk *blk;
|
||||
|
||||
for (blk = mstats.blk; blk; blk = blk->next)
|
||||
dump_block_info (blk);
|
||||
dump_block_info(blk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
182
src/note.c
182
src/note.c
@@ -43,135 +43,124 @@
|
||||
struct note_gc_hash {
|
||||
char *hash;
|
||||
char buf[MAX_NOTESIZ + 1];
|
||||
HTABLE_ENTRY (note_gc_hash);
|
||||
HTABLE_ENTRY(note_gc_hash);
|
||||
};
|
||||
|
||||
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 *);
|
||||
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);
|
||||
HTABLE_PROTOTYPE (htp, note_gc_hash)
|
||||
HTABLE_GENERATE (htp, note_gc_hash, note_gc_extract_key, note_gc_cmp)
|
||||
HTABLE_HEAD(htp, NOTE_GC_HSIZE, note_gc_hash);
|
||||
HTABLE_PROTOTYPE(htp, note_gc_hash)
|
||||
HTABLE_GENERATE(htp, note_gc_hash, note_gc_extract_key, note_gc_cmp)
|
||||
|
||||
/* Create note file from a string and return a newly allocated string that
|
||||
* contains its name. */
|
||||
char *
|
||||
generate_note (const char *str)
|
||||
char *generate_note(const char *str)
|
||||
{
|
||||
char *sha1 = mem_malloc (SHA1_DIGESTLEN * 2 + 1);
|
||||
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__);
|
||||
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)
|
||||
void edit_note(char **note, const char *editor)
|
||||
{
|
||||
char tmppath[BUFSIZ];
|
||||
char *tmpext;
|
||||
char notepath[BUFSIZ];
|
||||
char *sha1 = mem_malloc (SHA1_DIGESTLEN * 2 + 1);
|
||||
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)
|
||||
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);
|
||||
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);
|
||||
if (*note != NULL) {
|
||||
snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note);
|
||||
io_file_cp(notepath, tmppath);
|
||||
}
|
||||
|
||||
wins_launch_external (tmppath, editor);
|
||||
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);
|
||||
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);
|
||||
snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note);
|
||||
io_file_cp(tmppath, notepath);
|
||||
}
|
||||
|
||||
unlink (tmppath);
|
||||
unlink(tmppath);
|
||||
}
|
||||
|
||||
/* View a note in an external pager. */
|
||||
void
|
||||
view_note (const char *note, const char *pager)
|
||||
void view_note(const char *note, const char *pager)
|
||||
{
|
||||
char fullname[BUFSIZ];
|
||||
|
||||
if (note == NULL)
|
||||
return;
|
||||
snprintf (fullname, BUFSIZ, "%s%s", path_notes, note);
|
||||
wins_launch_external (fullname, pager);
|
||||
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)
|
||||
void erase_note(char **note)
|
||||
{
|
||||
if (*note == NULL)
|
||||
return;
|
||||
mem_free (*note);
|
||||
mem_free(*note);
|
||||
*note = NULL;
|
||||
}
|
||||
|
||||
/* Read a serialized note file name from a stream and deserialize it. */
|
||||
void
|
||||
note_read (char *buffer, FILE *fp)
|
||||
void note_read(char *buffer, FILE * fp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_NOTESIZ; i++)
|
||||
{
|
||||
buffer[i] = getc (fp);
|
||||
if (buffer[i] == ' ')
|
||||
{
|
||||
for (i = 0; i < MAX_NOTESIZ; i++) {
|
||||
buffer[i] = getc(fp);
|
||||
if (buffer[i] == ' ') {
|
||||
buffer[i] = '\0';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while (getc (fp) != ' ');
|
||||
while (getc(fp) != ' ') ;
|
||||
buffer[MAX_NOTESIZ] = '\0';
|
||||
}
|
||||
|
||||
static void
|
||||
note_gc_extract_key (struct note_gc_hash *data, const char **key, int *len)
|
||||
note_gc_extract_key(struct note_gc_hash *data, const char **key, int *len)
|
||||
{
|
||||
*key = data->hash;
|
||||
*len = strlen (data->hash);
|
||||
*len = strlen(data->hash);
|
||||
}
|
||||
|
||||
static int
|
||||
note_gc_cmp (struct note_gc_hash *a, struct note_gc_hash *b)
|
||||
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)
|
||||
void note_gc(void)
|
||||
{
|
||||
struct htp gc_htable = HTABLE_INITIALIZER (&gc_htable);
|
||||
struct htp gc_htable = HTABLE_INITIALIZER(&gc_htable);
|
||||
struct note_gc_hash *hp;
|
||||
DIR *dirp;
|
||||
struct dirent *dp;
|
||||
@@ -179,81 +168,68 @@ note_gc (void)
|
||||
struct note_gc_hash tmph;
|
||||
char notepath[BUFSIZ];
|
||||
|
||||
if (!(dirp = opendir (path_notes)))
|
||||
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));
|
||||
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);
|
||||
strncpy(hp->buf, dp->d_name, MAX_NOTESIZ + 1);
|
||||
hp->hash = hp->buf;
|
||||
|
||||
HTABLE_INSERT (htp, &gc_htable, hp);
|
||||
HTABLE_INSERT(htp, &gc_htable, hp);
|
||||
}
|
||||
}
|
||||
while (dp);
|
||||
|
||||
closedir (dirp);
|
||||
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)
|
||||
{
|
||||
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));
|
||||
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
||||
}
|
||||
}
|
||||
|
||||
LLIST_FOREACH (&eventlist, i)
|
||||
{
|
||||
struct event *ev = LLIST_GET_DATA (i);
|
||||
if (ev->note)
|
||||
{
|
||||
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));
|
||||
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)
|
||||
{
|
||||
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));
|
||||
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
||||
}
|
||||
}
|
||||
|
||||
LLIST_FOREACH (&recur_elist, i)
|
||||
{
|
||||
struct recur_event *rev = LLIST_GET_DATA (i);
|
||||
if (rev->note)
|
||||
{
|
||||
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));
|
||||
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
||||
}
|
||||
}
|
||||
|
||||
LLIST_FOREACH (&todolist, i)
|
||||
{
|
||||
struct todo *todo = LLIST_GET_DATA (i);
|
||||
if (todo->note)
|
||||
{
|
||||
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));
|
||||
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);
|
||||
HTABLE_FOREACH(hp, htp, &gc_htable) {
|
||||
snprintf(notepath, BUFSIZ, "%s%s", path_notes, hp->hash);
|
||||
unlink(notepath);
|
||||
}
|
||||
}
|
||||
|
||||
606
src/notify.c
606
src/notify.c
@@ -60,13 +60,12 @@ static pthread_t notify_t_main;
|
||||
* Return the number of seconds before next appointment
|
||||
* (0 if no upcoming appointment).
|
||||
*/
|
||||
int
|
||||
notify_time_left (void)
|
||||
int notify_time_left(void)
|
||||
{
|
||||
time_t ntimer;
|
||||
int left;
|
||||
|
||||
ntimer = time (NULL);
|
||||
ntimer = time(NULL);
|
||||
left = notify_app.time - ntimer;
|
||||
|
||||
return left > 0 ? left : 0;
|
||||
@@ -76,8 +75,7 @@ notify_time_left (void)
|
||||
* Return 1 if the reminder was not sent already for the upcoming
|
||||
* appointment.
|
||||
*/
|
||||
unsigned
|
||||
notify_needs_reminder (void)
|
||||
unsigned notify_needs_reminder(void)
|
||||
{
|
||||
if (notify_app.got_app
|
||||
&& (((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) ||
|
||||
@@ -92,64 +90,59 @@ notify_needs_reminder (void)
|
||||
* Note: the mutex associated with this structure must be locked by the
|
||||
* caller!
|
||||
*/
|
||||
void
|
||||
notify_update_app (long start, char state, char *msg)
|
||||
void notify_update_app(long start, char state, char *msg)
|
||||
{
|
||||
notify_free_app ();
|
||||
notify_free_app();
|
||||
notify_app.got_app = 1;
|
||||
notify_app.time = start;
|
||||
notify_app.state = state;
|
||||
notify_app.txt = mem_strdup (msg);
|
||||
notify_app.txt = mem_strdup(msg);
|
||||
}
|
||||
|
||||
/* Return 1 if we need to display the notify-bar, else 0. */
|
||||
int
|
||||
notify_bar (void)
|
||||
int notify_bar(void)
|
||||
{
|
||||
int display_bar = 0;
|
||||
|
||||
pthread_mutex_lock (&nbar.mutex);
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
display_bar = (nbar.show) ? 1 : 0;
|
||||
pthread_mutex_unlock (&nbar.mutex);
|
||||
pthread_mutex_unlock(&nbar.mutex);
|
||||
|
||||
return display_bar;
|
||||
}
|
||||
|
||||
/* Initialize the nbar variable used to store notification options. */
|
||||
void
|
||||
notify_init_vars (void)
|
||||
void notify_init_vars(void)
|
||||
{
|
||||
const char *time_format = "%T";
|
||||
const char *date_format = "%a %F";
|
||||
const char *cmd = "printf '\\a'";
|
||||
|
||||
pthread_mutex_init (&nbar.mutex, NULL);
|
||||
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);
|
||||
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)
|
||||
if ((nbar.shell = getenv("SHELL")) == NULL)
|
||||
nbar.shell = "/bin/sh";
|
||||
|
||||
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)
|
||||
static void extract_aptsfile(void)
|
||||
{
|
||||
char *file;
|
||||
|
||||
file = strrchr (path_apts, '/');
|
||||
file = strrchr(path_apts, '/');
|
||||
if (!file)
|
||||
notify.apts_file = path_apts;
|
||||
else
|
||||
{
|
||||
else {
|
||||
notify.apts_file = file;
|
||||
notify.apts_file++;
|
||||
}
|
||||
@@ -160,39 +153,35 @@ extract_aptsfile (void)
|
||||
* creating the notification window (l is the number of lines, c the
|
||||
* number of columns, y and x are its coordinates).
|
||||
*/
|
||||
void
|
||||
notify_init_bar (void)
|
||||
void notify_init_bar(void)
|
||||
{
|
||||
pthread_mutex_init (¬ify.mutex, NULL);
|
||||
pthread_mutex_init (¬ify_app.mutex, NULL);
|
||||
pthread_mutex_init(¬ify.mutex, NULL);
|
||||
pthread_mutex_init(¬ify_app.mutex, NULL);
|
||||
notify_app.got_app = 0;
|
||||
notify_app.txt = 0;
|
||||
notify.win = newwin (win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x);
|
||||
extract_aptsfile ();
|
||||
notify.win = newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x);
|
||||
extract_aptsfile();
|
||||
}
|
||||
|
||||
/*
|
||||
* Free memory associated with the notify_app structure.
|
||||
*/
|
||||
void
|
||||
notify_free_app (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);
|
||||
mem_free(notify_app.txt);
|
||||
notify_app.txt = 0;
|
||||
}
|
||||
|
||||
/* Stop the notify-bar main thread. */
|
||||
void
|
||||
notify_stop_main_thread (void)
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,16 +189,14 @@ notify_stop_main_thread (void)
|
||||
* The calcurse window geometry has changed so we need to reset the
|
||||
* notification window.
|
||||
*/
|
||||
void
|
||||
notify_reinit_bar (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)
|
||||
unsigned notify_launch_cmd(void)
|
||||
{
|
||||
int pid;
|
||||
|
||||
@@ -218,22 +205,18 @@ notify_launch_cmd (void)
|
||||
|
||||
notify_app.state |= APOINT_NOTIFIED;
|
||||
|
||||
pid = fork ();
|
||||
pid = fork();
|
||||
|
||||
if (pid < 0)
|
||||
{
|
||||
ERROR_MSG (_("error while launching command: could not fork"));
|
||||
if (pid < 0) {
|
||||
ERROR_MSG(_("error while launching command: could not fork"));
|
||||
return 0;
|
||||
}
|
||||
else if (pid == 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);
|
||||
if (execlp(nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) < 0) {
|
||||
ERROR_MSG(_("error while launching command"));
|
||||
_exit(1);
|
||||
}
|
||||
_exit (0);
|
||||
_exit(0);
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -243,8 +226,7 @@ notify_launch_cmd (void)
|
||||
* Update the notification bar. This is useful when changing color theme
|
||||
* for example.
|
||||
*/
|
||||
void
|
||||
notify_update_bar (void)
|
||||
void notify_update_bar(void)
|
||||
{
|
||||
const int space = 3;
|
||||
int file_pos, date_pos, app_pos, txt_max_len, too_long = 0;
|
||||
@@ -252,39 +234,35 @@ notify_update_bar (void)
|
||||
char buf[BUFSIZ];
|
||||
|
||||
date_pos = space;
|
||||
pthread_mutex_lock (¬ify.mutex);
|
||||
pthread_mutex_lock(¬ify.mutex);
|
||||
|
||||
file_pos = strlen (notify.date) + strlen (notify.time) + 7 + 2 * space;
|
||||
app_pos = file_pos + strlen (notify.apts_file) + 2 + space;
|
||||
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);
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
if (notify_app.got_app)
|
||||
{
|
||||
if (strlen (notify_app.txt) > txt_max_len)
|
||||
{
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
if (notify_app.got_app) {
|
||||
if (strlen(notify_app.txt) > txt_max_len) {
|
||||
int shrink_len;
|
||||
|
||||
too_long = 1;
|
||||
shrink_len = txt_max_len > 3 ? txt_max_len - 3 : 1;
|
||||
strncpy (buf, notify_app.txt, shrink_len);
|
||||
strncpy(buf, notify_app.txt, shrink_len);
|
||||
buf[shrink_len] = '\0';
|
||||
}
|
||||
time_left = notify_time_left ();
|
||||
if (time_left > 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);
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
|
||||
if (time_left < nbar.cntdwn &&
|
||||
(((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) ||
|
||||
@@ -294,42 +272,39 @@ notify_update_bar (void)
|
||||
blinking = 0;
|
||||
|
||||
if (blinking)
|
||||
wattron (notify.win, A_BLINK);
|
||||
wattron(notify.win, A_BLINK);
|
||||
if (too_long)
|
||||
mvwprintw (notify.win, 0, app_pos, "> %02d:%02d :: %s.. <",
|
||||
mvwprintw(notify.win, 0, app_pos, "> %02d:%02d :: %s.. <",
|
||||
hours_left, minutes_left, buf);
|
||||
else
|
||||
mvwprintw (notify.win, 0, app_pos, "> %02d:%02d :: %s <",
|
||||
mvwprintw(notify.win, 0, app_pos, "> %02d:%02d :: %s <",
|
||||
hours_left, minutes_left, notify_app.txt);
|
||||
if (blinking)
|
||||
wattroff (notify.win, A_BLINK);
|
||||
wattroff(notify.win, A_BLINK);
|
||||
|
||||
if (blinking)
|
||||
notify_launch_cmd ();
|
||||
pthread_mutex_unlock (&nbar.mutex);
|
||||
}
|
||||
else
|
||||
{
|
||||
notify_launch_cmd();
|
||||
pthread_mutex_unlock(&nbar.mutex);
|
||||
} else {
|
||||
notify_app.got_app = 0;
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
pthread_mutex_unlock (¬ify.mutex);
|
||||
notify_check_next_app (0);
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
pthread_mutex_unlock(¬ify.mutex);
|
||||
notify_check_next_app(0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
|
||||
wattroff (notify.win, A_UNDERLINE | A_REVERSE);
|
||||
custom_remove_attr (notify.win, ATTR_HIGHEST);
|
||||
wins_wrefresh (notify.win);
|
||||
wattroff(notify.win, A_UNDERLINE | A_REVERSE);
|
||||
custom_remove_attr(notify.win, ATTR_HIGHEST);
|
||||
wins_wrefresh(notify.win);
|
||||
|
||||
pthread_mutex_unlock (¬ify.mutex);
|
||||
pthread_mutex_unlock(¬ify.mutex);
|
||||
}
|
||||
|
||||
/* Update the notication bar content */
|
||||
/* ARGSUSED0 */
|
||||
static void *
|
||||
notify_main_thread (void *arg)
|
||||
static void *notify_main_thread(void *arg)
|
||||
{
|
||||
const unsigned thread_sleep = 1;
|
||||
const unsigned check_app = MININSEC;
|
||||
@@ -340,49 +315,46 @@ notify_main_thread (void *arg)
|
||||
|
||||
elapse = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ntimer = time (NULL);
|
||||
ntime = localtime (&ntimer);
|
||||
pthread_mutex_lock (¬ify.mutex);
|
||||
pthread_mutex_lock (&nbar.mutex);
|
||||
strftime (notify.time, NOTIFY_FIELD_LENGTH, nbar.timefmt, ntime);
|
||||
strftime (notify.date, NOTIFY_FIELD_LENGTH, nbar.datefmt, ntime);
|
||||
pthread_mutex_unlock (&nbar.mutex);
|
||||
pthread_mutex_unlock (¬ify.mutex);
|
||||
notify_update_bar ();
|
||||
psleep (thread_sleep);
|
||||
for (;;) {
|
||||
ntimer = time(NULL);
|
||||
ntime = localtime(&ntimer);
|
||||
pthread_mutex_lock(¬ify.mutex);
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
strftime(notify.time, NOTIFY_FIELD_LENGTH, nbar.timefmt, ntime);
|
||||
strftime(notify.date, NOTIFY_FIELD_LENGTH, nbar.datefmt, ntime);
|
||||
pthread_mutex_unlock(&nbar.mutex);
|
||||
pthread_mutex_unlock(¬ify.mutex);
|
||||
notify_update_bar();
|
||||
psleep(thread_sleep);
|
||||
elapse += thread_sleep;
|
||||
if (elapse >= check_app)
|
||||
{
|
||||
if (elapse >= check_app) {
|
||||
elapse = 0;
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
got_app = notify_app.got_app;
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
if (!got_app)
|
||||
notify_check_next_app (0);
|
||||
notify_check_next_app(0);
|
||||
}
|
||||
}
|
||||
pthread_exit (NULL);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
/* Fill the given structure with information about next appointment. */
|
||||
unsigned
|
||||
notify_get_next (struct notify_app *a)
|
||||
unsigned notify_get_next(struct notify_app *a)
|
||||
{
|
||||
time_t current_time;
|
||||
|
||||
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);
|
||||
recur_apoint_check_next(a, current_time, get_today());
|
||||
apoint_check_next(a, current_time);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -391,36 +363,31 @@ notify_get_next (struct notify_app *a)
|
||||
* This is used for the daemon to check if we have an upcoming appointment or
|
||||
* not.
|
||||
*/
|
||||
unsigned
|
||||
notify_get_next_bkgd (void)
|
||||
unsigned notify_get_next_bkgd(void)
|
||||
{
|
||||
struct notify_app a;
|
||||
|
||||
a.txt = NULL;
|
||||
if (!notify_get_next (&a))
|
||||
if (!notify_get_next(&a))
|
||||
return 0;
|
||||
|
||||
if (!a.got_app)
|
||||
{
|
||||
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);
|
||||
} else {
|
||||
if (!notify_same_item(a.time))
|
||||
notify_update_app(a.time, a.state, a.txt);
|
||||
}
|
||||
|
||||
if (a.txt)
|
||||
mem_free (a.txt);
|
||||
mem_free(a.txt);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Return the description of next appointment to be notified. */
|
||||
char *
|
||||
notify_app_txt (void)
|
||||
char *notify_app_txt(void)
|
||||
{
|
||||
if (notify_app.got_app)
|
||||
return notify_app.txt;
|
||||
@@ -430,153 +397,128 @@ notify_app_txt (void)
|
||||
|
||||
/* Look for the next appointment within the next 24 hours. */
|
||||
/* ARGSUSED0 */
|
||||
static void *
|
||||
notify_thread_app (void *arg)
|
||||
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 (!notify_get_next(&tmp_app))
|
||||
pthread_exit(NULL);
|
||||
|
||||
if (!tmp_app.got_app)
|
||||
{
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
notify_free_app ();
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (force || !notify_same_item (tmp_app.time))
|
||||
{
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
notify_update_app (tmp_app.time, tmp_app.state, tmp_app.txt);
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
if (!tmp_app.got_app) {
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
notify_free_app();
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
} else {
|
||||
if (force || !notify_same_item(tmp_app.time)) {
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
notify_update_app(tmp_app.time, tmp_app.state, tmp_app.txt);
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
}
|
||||
}
|
||||
|
||||
if (tmp_app.txt)
|
||||
mem_free (tmp_app.txt);
|
||||
notify_update_bar ();
|
||||
mem_free(tmp_app.txt);
|
||||
notify_update_bar();
|
||||
|
||||
pthread_exit (NULL);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
/* Launch the thread notify_thread_app to look for next appointment. */
|
||||
void
|
||||
notify_check_next_app (int force)
|
||||
void notify_check_next_app(int force)
|
||||
{
|
||||
pthread_t notify_t_app;
|
||||
void *arg = (force ? (void *)1 : NULL);
|
||||
|
||||
pthread_create (¬ify_t_app, &detached_thread_attr, notify_thread_app,
|
||||
arg);
|
||||
pthread_create(¬ify_t_app, &detached_thread_attr, notify_thread_app, arg);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if the newly created appointment is to be notified. */
|
||||
void
|
||||
notify_check_added (char *mesg, long start, char state)
|
||||
void notify_check_added(char *mesg, long start, char state)
|
||||
{
|
||||
time_t current_time;
|
||||
int update_notify = 0;
|
||||
long gap;
|
||||
|
||||
current_time = time (NULL);
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
if (!notify_app.got_app)
|
||||
{
|
||||
current_time = time(NULL);
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
if (!notify_app.got_app) {
|
||||
gap = start - current_time;
|
||||
if (gap >= 0 && gap <= DAYINSEC)
|
||||
update_notify = 1;
|
||||
}
|
||||
else if (start < notify_app.time && start >= current_time)
|
||||
{
|
||||
} else if (start < notify_app.time && start >= current_time) {
|
||||
update_notify = 1;
|
||||
}
|
||||
else if (start == notify_app.time && state != notify_app.state)
|
||||
} else if (start == notify_app.time && state != notify_app.state)
|
||||
update_notify = 1;
|
||||
|
||||
if (update_notify)
|
||||
{
|
||||
notify_update_app (start, state, mesg);
|
||||
if (update_notify) {
|
||||
notify_update_app(start, state, mesg);
|
||||
}
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
notify_update_bar ();
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
notify_update_bar();
|
||||
}
|
||||
|
||||
/* Check if the newly repeated appointment is to be notified. */
|
||||
void
|
||||
notify_check_repeated (struct recur_apoint *i)
|
||||
void notify_check_repeated(struct recur_apoint *i)
|
||||
{
|
||||
unsigned real_app_time;
|
||||
int update_notify = 0;
|
||||
time_t current_time;
|
||||
|
||||
current_time = time (NULL);
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
if (recur_item_find_occurrence (i->start, i->dur, &i->exc, i->rpt->type,
|
||||
i->rpt->freq, i->rpt->until, get_today (),
|
||||
&real_app_time))
|
||||
{
|
||||
if (!notify_app.got_app)
|
||||
{
|
||||
current_time = time(NULL);
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
if (recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type,
|
||||
i->rpt->freq, i->rpt->until, get_today(),
|
||||
&real_app_time)) {
|
||||
if (!notify_app.got_app) {
|
||||
if (real_app_time - current_time <= DAYINSEC)
|
||||
update_notify = 1;
|
||||
}
|
||||
else if (real_app_time < notify_app.time &&
|
||||
real_app_time >= current_time)
|
||||
{
|
||||
} 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;
|
||||
}
|
||||
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);
|
||||
}
|
||||
if (update_notify)
|
||||
{
|
||||
notify_update_app (real_app_time, i->state, i->mesg);
|
||||
}
|
||||
pthread_mutex_unlock (¬ify_app.mutex);
|
||||
notify_update_bar ();
|
||||
pthread_mutex_unlock(¬ify_app.mutex);
|
||||
notify_update_bar();
|
||||
}
|
||||
|
||||
int
|
||||
notify_same_item (long time)
|
||||
int notify_same_item(long time)
|
||||
{
|
||||
int same = 0;
|
||||
|
||||
pthread_mutex_lock (&(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));
|
||||
pthread_mutex_unlock(&(notify_app.mutex));
|
||||
|
||||
return same;
|
||||
}
|
||||
|
||||
int
|
||||
notify_same_recur_item (struct recur_apoint *i)
|
||||
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 (),
|
||||
recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type,
|
||||
i->rpt->freq, i->rpt->until, get_today(),
|
||||
&item_start);
|
||||
pthread_mutex_lock (¬ify_app.mutex);
|
||||
pthread_mutex_lock(¬ify_app.mutex);
|
||||
if (notify_app.got_app && item_start == notify_app.time)
|
||||
same = 1;
|
||||
pthread_mutex_unlock (&(notify_app.mutex));
|
||||
pthread_mutex_unlock(&(notify_app.mutex));
|
||||
|
||||
return same;
|
||||
}
|
||||
|
||||
/* Launch the notify-bar main thread. */
|
||||
void
|
||||
notify_start_main_thread (void)
|
||||
void notify_start_main_thread(void)
|
||||
{
|
||||
pthread_create (¬ify_t_main, NULL, notify_main_thread, NULL);
|
||||
notify_check_next_app (0);
|
||||
pthread_create(¬ify_t_main, NULL, notify_main_thread, NULL);
|
||||
notify_check_next_app(0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -585,52 +527,46 @@ notify_start_main_thread (void)
|
||||
* (either YES or NO), or an option holding a string value.
|
||||
*/
|
||||
static void
|
||||
print_option (WINDOW *win, unsigned x, unsigned y, char *name,
|
||||
print_option(WINDOW * win, unsigned x, unsigned y, char *name,
|
||||
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)
|
||||
{
|
||||
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);
|
||||
custom_apply_attr(win, ATTR_HIGHEST);
|
||||
if (len < maxlen)
|
||||
mvwprintw (win, y, x_opt, "%s", valstr);
|
||||
else
|
||||
{
|
||||
mvwprintw(win, y, x_opt, "%s", valstr);
|
||||
else {
|
||||
char buf[BUFSIZ];
|
||||
|
||||
strncpy (buf, valstr, maxlen - 1);
|
||||
strncpy(buf, valstr, maxlen - 1);
|
||||
buf[maxlen - 1] = '\0';
|
||||
mvwprintw (win, y, x_opt, "%s...", buf);
|
||||
mvwprintw(win, y, x_opt, "%s...", buf);
|
||||
}
|
||||
custom_remove_attr (win, ATTR_HIGHEST);
|
||||
}
|
||||
else
|
||||
print_bool_option_incolor (win, valbool, y, x_opt);
|
||||
mvwprintw (win, y + 1, x, desc);
|
||||
custom_remove_attr(win, ATTR_HIGHEST);
|
||||
} else
|
||||
print_bool_option_incolor(win, valbool, y, x_opt);
|
||||
mvwprintw(win, y + 1, x, desc);
|
||||
}
|
||||
|
||||
/* Print options related to the notify-bar. */
|
||||
static unsigned
|
||||
print_config_options (WINDOW *optwin)
|
||||
static unsigned print_config_options(WINDOW * optwin)
|
||||
{
|
||||
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
|
||||
{
|
||||
struct opt_s {
|
||||
char *name;
|
||||
char *desc;
|
||||
char valstr[BUFSIZ];
|
||||
@@ -656,7 +592,8 @@ print_config_options (WINDOW *optwin)
|
||||
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].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)");
|
||||
@@ -664,18 +601,18 @@ print_config_options (WINDOW *optwin)
|
||||
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);
|
||||
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);
|
||||
pthread_mutex_unlock(&nbar.mutex);
|
||||
|
||||
opt[DMON].valnum = dmon.enable;
|
||||
opt[DMON_LOG].valnum = dmon.log;
|
||||
@@ -683,137 +620,127 @@ print_config_options (WINDOW *optwin)
|
||||
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++)
|
||||
{
|
||||
for (i = 0; i < NB_OPT; i++) {
|
||||
int y;
|
||||
|
||||
y = YORIG + i * YOFF;
|
||||
print_option (optwin, XORIG, y, opt[i].name, opt[i].valstr,
|
||||
print_option(optwin, XORIG, y, opt[i].name, opt[i].valstr,
|
||||
opt[i].valnum, opt[i].desc, i + 1);
|
||||
}
|
||||
|
||||
return YORIG + NB_OPT * YOFF;
|
||||
}
|
||||
|
||||
static void
|
||||
reinit_conf_win (struct scrollwin *win)
|
||||
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);
|
||||
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)
|
||||
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 *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)");
|
||||
_
|
||||
("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);
|
||||
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);
|
||||
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[STA].p)) != 'q')
|
||||
{
|
||||
buf = mem_malloc(BUFSIZ);
|
||||
while ((ch = wgetch(win[STA].p)) != 'q') {
|
||||
buf[0] = '\0';
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
case CTRL ('N'):
|
||||
wins_scrollwin_down (&cwin, 1);
|
||||
switch (ch) {
|
||||
case CTRL('N'):
|
||||
wins_scrollwin_down(&cwin, 1);
|
||||
break;
|
||||
case CTRL ('P'):
|
||||
wins_scrollwin_up (&cwin, 1);
|
||||
case CTRL('P'):
|
||||
wins_scrollwin_up(&cwin, 1);
|
||||
break;
|
||||
case '1':
|
||||
pthread_mutex_lock (&nbar.mutex);
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
nbar.show = !nbar.show;
|
||||
pthread_mutex_unlock (&nbar.mutex);
|
||||
if (notify_bar ())
|
||||
notify_start_main_thread ();
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
printf (buf, "%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);
|
||||
status_mesg(count_str, "");
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
printf(buf, "%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);
|
||||
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);
|
||||
pthread_mutex_lock(&nbar.mutex);
|
||||
nbar.notify_all = !nbar.notify_all;
|
||||
pthread_mutex_unlock (&nbar.mutex);
|
||||
notify_check_next_app (1);
|
||||
pthread_mutex_unlock(&nbar.mutex);
|
||||
notify_check_next_app(1);
|
||||
break;
|
||||
case '7':
|
||||
dmon.enable = !dmon.enable;
|
||||
@@ -823,28 +750,25 @@ notify_config_bar (void)
|
||||
break;
|
||||
}
|
||||
|
||||
if (resize)
|
||||
{
|
||||
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 ();
|
||||
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);
|
||||
clearok(curscr, TRUE);
|
||||
}
|
||||
|
||||
status_mesg (number_str, keys);
|
||||
cwin.total_lines = print_config_options (cwin.pad.p);
|
||||
wins_scrollwin_display (&cwin);
|
||||
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);
|
||||
mem_free(buf);
|
||||
wins_scrollwin_delete(&cwin);
|
||||
}
|
||||
|
||||
266
src/pcal.c
266
src/pcal.c
@@ -39,279 +39,253 @@
|
||||
#include "calcurse.h"
|
||||
|
||||
/* Static functions used to add export functionalities. */
|
||||
static void pcal_export_header (FILE *);
|
||||
static void pcal_export_recur_events (FILE *);
|
||||
static void pcal_export_events (FILE *);
|
||||
static void pcal_export_recur_apoints (FILE *);
|
||||
static void pcal_export_apoints (FILE *);
|
||||
static void pcal_export_todo (FILE *);
|
||||
static void pcal_export_footer (FILE *);
|
||||
static void pcal_export_header(FILE *);
|
||||
static void pcal_export_recur_events(FILE *);
|
||||
static void pcal_export_events(FILE *);
|
||||
static void pcal_export_recur_apoints(FILE *);
|
||||
static void pcal_export_apoints(FILE *);
|
||||
static void pcal_export_todo(FILE *);
|
||||
static void pcal_export_footer(FILE *);
|
||||
|
||||
/* Type definition for callbacks to export functions. */
|
||||
typedef void (*cb_dump_t)(FILE *, long, long, char *);
|
||||
typedef void (*cb_dump_t) (FILE *, long, long, char *);
|
||||
|
||||
/*
|
||||
* Travel through each occurence of an item, and execute the given callback
|
||||
* (mainly used to export data).
|
||||
*/
|
||||
static void
|
||||
foreach_date_dump (const long date_end, struct rpt *rpt, llist_t *exc,
|
||||
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)
|
||||
cb_dump_t cb_dump, FILE * stream)
|
||||
{
|
||||
long date, item_time;
|
||||
struct tm lt;
|
||||
time_t t;
|
||||
|
||||
t = item_first_date;
|
||||
lt = *localtime (&t);
|
||||
lt = *localtime(&t);
|
||||
lt.tm_hour = lt.tm_min = lt.tm_sec = 0;
|
||||
lt.tm_isdst = -1;
|
||||
date = mktime (<);
|
||||
date = mktime(<);
|
||||
item_time = item_first_date - date;
|
||||
|
||||
while (date <= date_end && date <= rpt->until)
|
||||
{
|
||||
if (recur_item_inday (item_first_date, item_dur, exc, rpt->type,
|
||||
rpt->freq, rpt->until, date))
|
||||
{
|
||||
(*cb_dump)(stream, date + item_time, item_dur, item_mesg);
|
||||
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)
|
||||
{
|
||||
switch (rpt->type) {
|
||||
case RECUR_DAILY:
|
||||
date = date_sec_change (date, 0, rpt->freq);
|
||||
date = date_sec_change(date, 0, rpt->freq);
|
||||
break;
|
||||
case RECUR_WEEKLY:
|
||||
date = date_sec_change (date, 0, rpt->freq * WEEKINDAYS);
|
||||
date = date_sec_change(date, 0, rpt->freq * WEEKINDAYS);
|
||||
break;
|
||||
case RECUR_MONTHLY:
|
||||
date = date_sec_change (date, rpt->freq, 0);
|
||||
date = date_sec_change(date, rpt->freq, 0);
|
||||
break;
|
||||
case RECUR_YEARLY:
|
||||
date = date_sec_change (date, rpt->freq * 12, 0);
|
||||
date = date_sec_change(date, rpt->freq * 12, 0);
|
||||
break;
|
||||
default:
|
||||
EXIT (_("incoherent repetition type"));
|
||||
EXIT(_("incoherent repetition type"));
|
||||
/* NOTREACHED */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pcal_export_header (FILE *stream)
|
||||
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",
|
||||
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 %s %%w\n", _("Week"));
|
||||
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",
|
||||
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 %s %%w\n", _("Week"));
|
||||
fputc('\n', stream);
|
||||
}
|
||||
|
||||
static void
|
||||
pcal_export_footer (FILE *stream)
|
||||
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,
|
||||
pcal_dump_event(FILE * stream, long event_date, long event_dur,
|
||||
char *event_mesg)
|
||||
{
|
||||
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,
|
||||
pcal_dump_apoint(FILE * stream, long apoint_date, long apoint_dur,
|
||||
char *apoint_mesg)
|
||||
{
|
||||
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)
|
||||
static void pcal_export_recur_events(FILE * stream)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
date_sec2date_fmt(rev->day, "%b %d", pcal_date);
|
||||
fprintf(stream, "%s %s\n", pcal_date, rev->mesg);
|
||||
break;
|
||||
default:
|
||||
EXIT (_("incoherent repetition type"));
|
||||
EXIT(_("incoherent repetition type"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const long YEAR_START = calendar_start_of_year ();
|
||||
const long YEAR_END = calendar_end_of_year ();
|
||||
} else {
|
||||
const long YEAR_START = calendar_start_of_year();
|
||||
const long YEAR_END = 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,
|
||||
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)
|
||||
static void pcal_export_events(FILE * stream)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
fputc('\n', stream);
|
||||
}
|
||||
|
||||
static void
|
||||
pcal_export_recur_apoints (FILE *stream)
|
||||
static void pcal_export_recur_apoints(FILE * stream)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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",
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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"));
|
||||
EXIT(_("incoherent repetition type"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const long YEAR_START = calendar_start_of_year ();
|
||||
const long YEAR_END = calendar_end_of_year ();
|
||||
} else {
|
||||
const long YEAR_START = calendar_start_of_year();
|
||||
const long YEAR_END = calendar_end_of_year();
|
||||
|
||||
if (rapt->start < YEAR_END && rapt->start > YEAR_START)
|
||||
foreach_date_dump (YEAR_END, rapt->rpt, &rapt->exc, rapt->start,
|
||||
foreach_date_dump(YEAR_END, rapt->rpt, &rapt->exc, rapt->start,
|
||||
rapt->dur, rapt->mesg,
|
||||
(cb_dump_t)pcal_dump_apoint, stream);
|
||||
(cb_dump_t) pcal_dump_apoint, stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pcal_export_apoints (FILE *stream)
|
||||
static void pcal_export_apoints(FILE * stream)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
LLIST_TS_UNLOCK(&alist_p);
|
||||
fputc('\n', stream);
|
||||
}
|
||||
|
||||
static void
|
||||
pcal_export_todo (FILE *stream)
|
||||
static void pcal_export_todo(FILE * stream)
|
||||
{
|
||||
llist_item_t *i;
|
||||
|
||||
fputs ("#\n# Todos\n#\n", stream);
|
||||
LLIST_FOREACH (&todolist, i)
|
||||
{
|
||||
struct todo *todo = LLIST_TS_GET_DATA (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 ("note all ", stream);
|
||||
fprintf (stream, "%d. %s\n", todo->id, todo->mesg);
|
||||
fputs("note all ", stream);
|
||||
fprintf(stream, "%d. %s\n", todo->id, todo->mesg);
|
||||
}
|
||||
fputc ('\n', stream);
|
||||
fputc('\n', stream);
|
||||
}
|
||||
|
||||
/* Export calcurse data. */
|
||||
void
|
||||
pcal_export_data (FILE *stream)
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
791
src/recur.c
791
src/recur.c
File diff suppressed because it is too large
Load Diff
208
src/sha1.c
208
src/sha1.c
@@ -67,61 +67,100 @@
|
||||
#define R4(v, w, x, y, z, i) z += (w ^ x ^ y) + blk (i) + 0xCA62C1D6 + \
|
||||
rol (v, 5); w = rol (w, 30);
|
||||
|
||||
static void
|
||||
sha1_transform (uint32_t state[5], const uint8_t buffer[64])
|
||||
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;
|
||||
|
||||
b64_t *block = (b64_t *)buffer;
|
||||
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;
|
||||
@@ -132,9 +171,7 @@ sha1_transform (uint32_t state[5], const uint8_t buffer[64])
|
||||
a = b = c = d = e = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sha1_init (sha1_ctx_t *ctx)
|
||||
void sha1_init(sha1_ctx_t * ctx)
|
||||
{
|
||||
ctx->state[0] = 0x67452301;
|
||||
ctx->state[1] = 0xEFCDAB89;
|
||||
@@ -145,8 +182,7 @@ sha1_init (sha1_ctx_t *ctx)
|
||||
ctx->count[0] = ctx->count[1] = 0;
|
||||
}
|
||||
|
||||
void
|
||||
sha1_update (sha1_ctx_t *ctx, const uint8_t *data, unsigned int len)
|
||||
void sha1_update(sha1_ctx_t * ctx, const uint8_t * data, unsigned int len)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
@@ -155,67 +191,59 @@ sha1_update (sha1_ctx_t *ctx, const uint8_t *data, unsigned int len)
|
||||
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);
|
||||
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]);
|
||||
sha1_transform(ctx->state, &data[i]);
|
||||
j = 0;
|
||||
}
|
||||
else
|
||||
} else
|
||||
i = 0;
|
||||
memcpy (&ctx->buffer[j], &data[i], len - i);
|
||||
memcpy(&ctx->buffer[j], &data[i], len - i);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sha1_final (sha1_ctx_t *ctx, uint8_t digest[SHA1_DIGESTLEN])
|
||||
void sha1_final(sha1_ctx_t * ctx, uint8_t digest[SHA1_DIGESTLEN])
|
||||
{
|
||||
uint32_t i, j;
|
||||
uint8_t finalcount[8];
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
finalcount[i] = (uint8_t)((ctx->count[(i >= 4 ? 0 : 1)] >>
|
||||
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);
|
||||
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 *) "\0", 1);
|
||||
|
||||
sha1_update (ctx, finalcount, 8);
|
||||
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);
|
||||
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);
|
||||
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)
|
||||
void sha1_digest(const char *data, char *buffer)
|
||||
{
|
||||
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)
|
||||
void sha1_stream(FILE * fp, char *buffer)
|
||||
{
|
||||
sha1_ctx_t ctx;
|
||||
uint8_t data[BUFSIZ];
|
||||
@@ -223,19 +251,17 @@ sha1_stream (FILE *fp, char *buffer)
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
10
src/sha1.h
10
src/sha1.h
@@ -50,8 +50,8 @@ typedef struct {
|
||||
uint8_t buffer[SHA1_BLOCKLEN];
|
||||
} sha1_ctx_t;
|
||||
|
||||
void sha1_init (sha1_ctx_t *);
|
||||
void sha1_update (sha1_ctx_t *, const uint8_t *, unsigned int);
|
||||
void sha1_final (sha1_ctx_t *, uint8_t *);
|
||||
void sha1_digest (const char *, char *);
|
||||
void sha1_stream (FILE *, char *);
|
||||
void sha1_init(sha1_ctx_t *);
|
||||
void sha1_update(sha1_ctx_t *, const uint8_t *, unsigned int);
|
||||
void sha1_final(sha1_ctx_t *, uint8_t *);
|
||||
void sha1_digest(const char *, char *);
|
||||
void sha1_stream(FILE *, char *);
|
||||
|
||||
47
src/sigs.c
47
src/sigs.c
@@ -53,44 +53,36 @@
|
||||
* This is needed to avoid zombie processes running on system.
|
||||
* Also catch CTRL-C (SIGINT), and SIGWINCH to resize screen automatically.
|
||||
*/
|
||||
static void
|
||||
generic_hdlr (int sig)
|
||||
static void generic_hdlr(int sig)
|
||||
{
|
||||
switch (sig)
|
||||
{
|
||||
switch (sig) {
|
||||
case SIGCHLD:
|
||||
while (waitpid (WAIT_MYPGRP, NULL, WNOHANG) > 0)
|
||||
;
|
||||
while (waitpid(WAIT_MYPGRP, NULL, WNOHANG) > 0) ;
|
||||
break;
|
||||
case SIGWINCH:
|
||||
resize = 1;
|
||||
clearok (curscr, TRUE);
|
||||
ungetch (KEY_RESIZE);
|
||||
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));
|
||||
if (unlink(path_cpid) != 0) {
|
||||
EXIT(_("Could not remove calcurse lock file: %s\n"), strerror(errno));
|
||||
}
|
||||
exit (EXIT_SUCCESS);
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned
|
||||
sigs_set_hdlr (int sig, void (*handler)(int))
|
||||
unsigned sigs_set_hdlr(int sig, void (*handler) (int))
|
||||
{
|
||||
struct sigaction sa;
|
||||
|
||||
memset (&sa, 0, sizeof sa);
|
||||
sigemptyset (&sa.sa_mask);
|
||||
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));
|
||||
if (sigaction(sig, &sa, NULL) == -1) {
|
||||
ERROR_MSG(_("Error setting signal #%d : %s\n"), sig, strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -98,12 +90,11 @@ sigs_set_hdlr (int sig, void (*handler)(int))
|
||||
}
|
||||
|
||||
/* Signal handling init. */
|
||||
void
|
||||
sigs_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);
|
||||
}
|
||||
|
||||
297
src/todo.c
297
src/todo.c
@@ -47,67 +47,57 @@ static int first = 1;
|
||||
static char *msgsav;
|
||||
|
||||
/* Returns a structure containing the selected item. */
|
||||
static struct todo *
|
||||
todo_get_item (int item_number)
|
||||
static 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));
|
||||
}
|
||||
|
||||
/* Sets which todo is highlighted. */
|
||||
void
|
||||
todo_hilt_set (int highlighted)
|
||||
void todo_hilt_set(int highlighted)
|
||||
{
|
||||
hilt = highlighted;
|
||||
}
|
||||
|
||||
void
|
||||
todo_hilt_decrease (int n)
|
||||
void todo_hilt_decrease(int n)
|
||||
{
|
||||
hilt -= n;
|
||||
}
|
||||
|
||||
void
|
||||
todo_hilt_increase (int n)
|
||||
void todo_hilt_increase(int n)
|
||||
{
|
||||
hilt += n;
|
||||
}
|
||||
|
||||
/* Return which todo is highlighted. */
|
||||
int
|
||||
todo_hilt (void)
|
||||
int todo_hilt(void)
|
||||
{
|
||||
return hilt;
|
||||
}
|
||||
|
||||
/* Return the number of todos. */
|
||||
int
|
||||
todo_nb (void)
|
||||
int todo_nb(void)
|
||||
{
|
||||
return todos;
|
||||
}
|
||||
|
||||
/* Set the number of todos. */
|
||||
void
|
||||
todo_set_nb (int nb)
|
||||
void todo_set_nb(int nb)
|
||||
{
|
||||
todos = nb;
|
||||
}
|
||||
|
||||
/* Set which one is the first todo to be displayed. */
|
||||
void
|
||||
todo_set_first (int nb)
|
||||
void todo_set_first(int nb)
|
||||
{
|
||||
first = nb;
|
||||
}
|
||||
|
||||
void
|
||||
todo_first_increase (int n)
|
||||
void todo_first_increase(int n)
|
||||
{
|
||||
first += n;
|
||||
}
|
||||
|
||||
void
|
||||
todo_first_decrease (int n)
|
||||
void todo_first_decrease(int n)
|
||||
{
|
||||
first -= n;
|
||||
}
|
||||
@@ -116,51 +106,46 @@ todo_first_decrease (int n)
|
||||
* Return the position of the hilghlighted item, relative to the first one
|
||||
* displayed.
|
||||
*/
|
||||
int
|
||||
todo_hilt_pos (void)
|
||||
int todo_hilt_pos(void)
|
||||
{
|
||||
return hilt - first;
|
||||
}
|
||||
|
||||
/* Return the last visited todo. */
|
||||
char *
|
||||
todo_saved_mesg (void)
|
||||
char *todo_saved_mesg(void)
|
||||
{
|
||||
return msgsav;
|
||||
}
|
||||
|
||||
/* Request user to enter a new todo item. */
|
||||
void
|
||||
todo_new_item (void)
|
||||
void todo_new_item(void)
|
||||
{
|
||||
int ch = 0;
|
||||
const char *mesg = _("Enter the new ToDo item : ");
|
||||
const char *mesg_id = _("Enter the ToDo priority [1 (highest) - 9 (lowest)] :");
|
||||
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[STA].p);
|
||||
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[STA].p);
|
||||
}
|
||||
todo_add (todo_input, ch - '0', NULL);
|
||||
todo_add(todo_input, ch - '0', NULL);
|
||||
todos++;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
todo_cmp_id (struct todo *a, struct todo *b)
|
||||
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);
|
||||
int abs_a = abs(a->id);
|
||||
int abs_b = abs(b->id);
|
||||
|
||||
return abs_a < abs_b ? -1 : (abs_a == abs_b ? 0 : 1);
|
||||
}
|
||||
@@ -168,59 +153,55 @@ todo_cmp_id (struct todo *a, struct todo *b)
|
||||
/*
|
||||
* Add an item in the todo linked list.
|
||||
*/
|
||||
struct todo *
|
||||
todo_add (char *mesg, int id, char *note)
|
||||
struct todo *todo_add(char *mesg, int id, char *note)
|
||||
{
|
||||
struct todo *todo;
|
||||
|
||||
todo = mem_malloc (sizeof (struct todo));
|
||||
todo->mesg = mem_strdup (mesg);
|
||||
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->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;
|
||||
}
|
||||
|
||||
void
|
||||
todo_write (struct todo *todo, FILE *f)
|
||||
void todo_write(struct todo *todo, FILE * f)
|
||||
{
|
||||
if (todo->note)
|
||||
fprintf (f, "[%d]>%s %s\n", todo->id, todo->note, todo->mesg);
|
||||
fprintf(f, "[%d]>%s %s\n", todo->id, todo->note, todo->mesg);
|
||||
else
|
||||
fprintf (f, "[%d] %s\n", todo->id, todo->mesg);
|
||||
fprintf(f, "[%d] %s\n", todo->id, todo->mesg);
|
||||
}
|
||||
|
||||
/* Delete a note previously attached to a todo item. */
|
||||
static void
|
||||
todo_delete_note_bynum (unsigned num)
|
||||
static void todo_delete_note_bynum(unsigned num)
|
||||
{
|
||||
llist_item_t *i = LLIST_NTH (&todolist, num);
|
||||
llist_item_t *i = LLIST_NTH(&todolist, num);
|
||||
|
||||
if (!i)
|
||||
EXIT (_("no such todo"));
|
||||
struct todo *todo = LLIST_TS_GET_DATA (i);
|
||||
EXIT(_("no such todo"));
|
||||
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||
|
||||
if (!todo->note)
|
||||
EXIT (_("no note attached"));
|
||||
erase_note (&todo->note);
|
||||
EXIT(_("no note attached"));
|
||||
erase_note(&todo->note);
|
||||
}
|
||||
|
||||
/* Delete an item from the todo linked list. */
|
||||
static void
|
||||
todo_delete_bynum (unsigned num)
|
||||
static void todo_delete_bynum(unsigned num)
|
||||
{
|
||||
llist_item_t *i = LLIST_NTH (&todolist, num);
|
||||
llist_item_t *i = LLIST_NTH(&todolist, num);
|
||||
|
||||
if (!i)
|
||||
EXIT (_("no such todo"));
|
||||
struct todo *todo = LLIST_TS_GET_DATA (i);
|
||||
EXIT(_("no such todo"));
|
||||
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -229,18 +210,16 @@ todo_delete_bynum (unsigned num)
|
||||
* This way, it is easy to retrive its original priority if the user decides
|
||||
* that in fact it was not completed.
|
||||
*/
|
||||
void
|
||||
todo_flag (void)
|
||||
void todo_flag(void)
|
||||
{
|
||||
struct todo *t;
|
||||
|
||||
t = todo_get_item (hilt);
|
||||
t = todo_get_item(hilt);
|
||||
t->id = -t->id;
|
||||
}
|
||||
|
||||
/* Delete an item from the ToDo list. */
|
||||
void
|
||||
todo_delete (void)
|
||||
void todo_delete(void)
|
||||
{
|
||||
const char *del_todo_str = _("Do you really want to delete this task ?");
|
||||
const char *erase_warning =
|
||||
@@ -251,22 +230,20 @@ todo_delete (void)
|
||||
int answer;
|
||||
|
||||
if ((todos <= 0) ||
|
||||
(conf.confirm_delete && (status_ask_bool (del_todo_str) != 1)))
|
||||
{
|
||||
wins_erase_status_bar ();
|
||||
(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 (hilt)->note == NULL)
|
||||
if (todo_get_item(hilt)->note == NULL)
|
||||
answer = 1;
|
||||
else
|
||||
answer = status_ask_choice (erase_warning, erase_choice, nb_erase_choice);
|
||||
answer = status_ask_choice(erase_warning, erase_choice, nb_erase_choice);
|
||||
|
||||
switch (answer)
|
||||
{
|
||||
switch (answer) {
|
||||
case 1:
|
||||
todo_delete_bynum (hilt - 1);
|
||||
todo_delete_bynum(hilt - 1);
|
||||
todos--;
|
||||
if (hilt > 1)
|
||||
hilt--;
|
||||
@@ -276,10 +253,10 @@ todo_delete (void)
|
||||
first--;
|
||||
break;
|
||||
case 2:
|
||||
todo_delete_note_bynum (hilt - 1);
|
||||
todo_delete_note_bynum(hilt - 1);
|
||||
break;
|
||||
default:
|
||||
wins_erase_status_bar ();
|
||||
wins_erase_status_bar();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -288,41 +265,37 @@ todo_delete (void)
|
||||
* Returns the position into the linked list corresponding to the
|
||||
* given todo item.
|
||||
*/
|
||||
static int
|
||||
todo_get_position (struct todo *needle)
|
||||
static int todo_get_position(struct todo *needle)
|
||||
{
|
||||
llist_item_t *i;
|
||||
int n = 0;
|
||||
|
||||
LLIST_FOREACH (&todolist, i)
|
||||
{
|
||||
LLIST_FOREACH(&todolist, i) {
|
||||
n++;
|
||||
if (LLIST_TS_GET_DATA (i) == needle)
|
||||
if (LLIST_TS_GET_DATA(i) == needle)
|
||||
return n;
|
||||
}
|
||||
|
||||
EXIT (_("todo not found"));
|
||||
EXIT(_("todo not found"));
|
||||
return -1; /* avoid compiler warnings */
|
||||
}
|
||||
|
||||
/* Change an item priority by pressing '+' or '-' inside TODO panel. */
|
||||
void
|
||||
todo_chg_priority (int action)
|
||||
void todo_chg_priority(int action)
|
||||
{
|
||||
struct todo *backup;
|
||||
char backup_mesg[BUFSIZ];
|
||||
int backup_id;
|
||||
char backup_note[MAX_NOTESIZ + 1];
|
||||
|
||||
backup = todo_get_item (hilt);
|
||||
strncpy (backup_mesg, backup->mesg, strlen (backup->mesg) + 1);
|
||||
backup = todo_get_item(hilt);
|
||||
strncpy(backup_mesg, backup->mesg, strlen(backup->mesg) + 1);
|
||||
backup_id = backup->id;
|
||||
if (backup->note)
|
||||
strncpy (backup_note, backup->note, MAX_NOTESIZ + 1);
|
||||
strncpy(backup_note, backup->note, MAX_NOTESIZ + 1);
|
||||
else
|
||||
backup_note[0] = '\0';
|
||||
switch (action)
|
||||
{
|
||||
switch (action) {
|
||||
case KEY_RAISE_PRIORITY:
|
||||
if (backup_id > 1)
|
||||
backup_id--;
|
||||
@@ -336,30 +309,29 @@ todo_chg_priority (int action)
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
EXIT (_("no such action"));
|
||||
EXIT(_("no such action"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
todo_delete_bynum (hilt - 1);
|
||||
backup = todo_add (backup_mesg, backup_id, backup_note);
|
||||
hilt = todo_get_position (backup);
|
||||
todo_delete_bynum(hilt - 1);
|
||||
backup = todo_add(backup_mesg, backup_id, backup_note);
|
||||
hilt = todo_get_position(backup);
|
||||
}
|
||||
|
||||
/* Edit the description of an already existing todo item. */
|
||||
void
|
||||
todo_edit_item (void)
|
||||
void todo_edit_item(void)
|
||||
{
|
||||
struct todo *i;
|
||||
const char *mesg = _("Enter the new ToDo description :");
|
||||
|
||||
status_mesg (mesg, "");
|
||||
i = todo_get_item (hilt);
|
||||
updatestring (win[STA].p, &i->mesg, 0, 1);
|
||||
status_mesg(mesg, "");
|
||||
i = todo_get_item(hilt);
|
||||
updatestring(win[STA].p, &i->mesg, 0, 1);
|
||||
}
|
||||
|
||||
/* Display todo items in the corresponding panel. */
|
||||
static void
|
||||
display_todo_item (int incolor, char *msg, int prio, int note, int width, int y,
|
||||
display_todo_item(int incolor, char *msg, int prio, int note, int width, int y,
|
||||
int x)
|
||||
{
|
||||
WINDOW *w;
|
||||
@@ -370,35 +342,32 @@ display_todo_item (int incolor, char *msg, int prio, int note, int width, int y,
|
||||
w = win[TOD].p;
|
||||
ch_note = (note) ? '>' : '.';
|
||||
if (prio > 0)
|
||||
snprintf (priostr, sizeof priostr, "%d", prio);
|
||||
snprintf(priostr, sizeof priostr, "%d", prio);
|
||||
else
|
||||
strncpy (priostr, "X", sizeof priostr);
|
||||
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]);
|
||||
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);
|
||||
mvwprintw(w, y, x, "%s%c %s...", priostr, ch_note, buf);
|
||||
}
|
||||
if (incolor == 0)
|
||||
custom_remove_attr (w, ATTR_HIGHEST);
|
||||
custom_remove_attr(w, ATTR_HIGHEST);
|
||||
}
|
||||
|
||||
/* Updates the ToDo panel. */
|
||||
void
|
||||
todo_update_panel (int which_pan)
|
||||
void todo_update_panel(int which_pan)
|
||||
{
|
||||
llist_item_t *i;
|
||||
int len = win[TOD].w - 8;
|
||||
@@ -411,62 +380,54 @@ todo_update_panel (int which_pan)
|
||||
int incolor = -1;
|
||||
|
||||
/* 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);
|
||||
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);
|
||||
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)
|
||||
{
|
||||
float ratio = ((float) max_items) / ((float) todos);
|
||||
int sbar_length = (int) (ratio * (max_items + 1));
|
||||
int highend = (int) (ratio * first);
|
||||
if (todos > max_items) {
|
||||
float ratio = ((float)max_items) / ((float)todos);
|
||||
int sbar_length = (int)(ratio * (max_items + 1));
|
||||
int highend = (int)(ratio * first);
|
||||
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,
|
||||
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);
|
||||
wnoutrefresh(win[TOD].p);
|
||||
}
|
||||
|
||||
/* Attach a note to a todo */
|
||||
void
|
||||
todo_edit_note (const char *editor)
|
||||
void todo_edit_note(const char *editor)
|
||||
{
|
||||
struct todo *i = todo_get_item (hilt);
|
||||
edit_note (&i->note, editor);
|
||||
struct todo *i = todo_get_item(hilt);
|
||||
edit_note(&i->note, editor);
|
||||
}
|
||||
|
||||
/* View a note previously attached to a todo */
|
||||
void
|
||||
todo_view_note (const char *pager)
|
||||
void todo_view_note(const char *pager)
|
||||
{
|
||||
struct todo *i = todo_get_item (hilt);
|
||||
view_note (i->note, pager);
|
||||
struct todo *i = todo_get_item(hilt);
|
||||
view_note(i->note, pager);
|
||||
}
|
||||
|
||||
/* Pipe a todo item to an external program. */
|
||||
void
|
||||
todo_pipe_item (void)
|
||||
void todo_pipe_item(void)
|
||||
{
|
||||
char cmd[BUFSIZ] = "";
|
||||
char const *arg[] = { cmd, NULL };
|
||||
@@ -475,42 +436,38 @@ todo_pipe_item (void)
|
||||
FILE *fpout;
|
||||
struct todo *todo;
|
||||
|
||||
status_mesg (_("Pipe item to external command:"), "");
|
||||
if (getstring (win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID)
|
||||
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");
|
||||
wins_prepare_external();
|
||||
if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
|
||||
fpout = fdopen(pout, "w");
|
||||
|
||||
todo = todo_get_item (hilt);
|
||||
todo_write (todo, fpout);
|
||||
todo = todo_get_item(hilt);
|
||||
todo_write(todo, fpout);
|
||||
|
||||
fclose (fpout);
|
||||
child_wait (NULL, &pout, pid);
|
||||
press_any_key ();
|
||||
fclose(fpout);
|
||||
child_wait(NULL, &pout, pid);
|
||||
press_any_key();
|
||||
}
|
||||
wins_unprepare_external ();
|
||||
wins_unprepare_external();
|
||||
}
|
||||
|
||||
static void
|
||||
todo_free (struct todo *todo)
|
||||
static 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)
|
||||
void todo_init_list(void)
|
||||
{
|
||||
LLIST_INIT (&todolist);
|
||||
LLIST_INIT(&todolist);
|
||||
}
|
||||
|
||||
void
|
||||
todo_free_list (void)
|
||||
void todo_free_list(void)
|
||||
{
|
||||
LLIST_FREE_INNER (&todolist, todo_free);
|
||||
LLIST_FREE (&todolist);
|
||||
LLIST_FREE_INNER(&todolist, todo_free);
|
||||
LLIST_FREE(&todolist);
|
||||
}
|
||||
|
||||
485
src/utf8.c
485
src/utf8.c
@@ -41,245 +41,243 @@ struct utf8_range {
|
||||
};
|
||||
|
||||
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 utf8_width(char *s)
|
||||
{
|
||||
int val, low, high, cur;
|
||||
|
||||
if (UTF8_ISCONT (*s))
|
||||
if (UTF8_ISCONT(*s))
|
||||
return 0;
|
||||
|
||||
switch (UTF8_LENGTH (*s))
|
||||
{
|
||||
switch (UTF8_LENGTH(*s)) {
|
||||
case 1:
|
||||
val = s[0];
|
||||
break;
|
||||
@@ -287,8 +285,7 @@ utf8_width (char *s)
|
||||
val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6;
|
||||
break;
|
||||
case 3:
|
||||
val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) |
|
||||
(s[0] & 0x0f) << 12;
|
||||
val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) | (s[0] & 0x0f) << 12;
|
||||
break;
|
||||
case 4:
|
||||
val = (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) |
|
||||
@@ -296,8 +293,7 @@ utf8_width (char *s)
|
||||
break;
|
||||
case 5:
|
||||
val = ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) |
|
||||
(s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) |
|
||||
(s[0] & 0x3f) << 24;
|
||||
(s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) | (s[0] & 0x3f) << 24;
|
||||
break;
|
||||
case 6:
|
||||
val = (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) |
|
||||
@@ -310,17 +306,14 @@ utf8_width (char *s)
|
||||
|
||||
low = 0;
|
||||
high = sizeof(utf8_widthtab) / sizeof(utf8_widthtab[0]);
|
||||
do
|
||||
{
|
||||
do {
|
||||
cur = (low + high) / 2;
|
||||
if (val >= utf8_widthtab[cur].min)
|
||||
{
|
||||
if (val >= utf8_widthtab[cur].min) {
|
||||
if (val <= utf8_widthtab[cur].max)
|
||||
return utf8_widthtab[cur].width;
|
||||
else
|
||||
low = cur + 1;
|
||||
}
|
||||
else
|
||||
} else
|
||||
high = cur - 1;
|
||||
}
|
||||
while (low <= high);
|
||||
@@ -329,15 +322,13 @@ utf8_width (char *s)
|
||||
}
|
||||
|
||||
/* Get the width of a UTF-8 string. */
|
||||
int
|
||||
utf8_strwidth (char *s)
|
||||
int utf8_strwidth(char *s)
|
||||
{
|
||||
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;
|
||||
|
||||
898
src/utils.c
898
src/utils.c
File diff suppressed because it is too large
Load Diff
20
src/vars.c
20
src/vars.c
@@ -65,6 +65,7 @@ int read_only = 0;
|
||||
* variables to store calendar names
|
||||
*/
|
||||
int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||
|
||||
const char *monthnames[12] = {
|
||||
N_("January"),
|
||||
N_("February"),
|
||||
@@ -120,8 +121,7 @@ struct dmon_conf dmon;
|
||||
/*
|
||||
* Variables init
|
||||
*/
|
||||
void
|
||||
vars_init (void)
|
||||
void vars_init(void)
|
||||
{
|
||||
const char *ed, *pg;
|
||||
|
||||
@@ -133,33 +133,33 @@ vars_init (void)
|
||||
conf.periodic_save = 0;
|
||||
conf.system_dialogs = 1;
|
||||
conf.progress_bar = 1;
|
||||
strncpy (conf.output_datefmt, "%D", 3);
|
||||
strncpy(conf.output_datefmt, "%D", 3);
|
||||
conf.input_datefmt = 1;
|
||||
|
||||
/* Default external editor and pager */
|
||||
ed = getenv ("VISUAL");
|
||||
ed = getenv("VISUAL");
|
||||
if (ed == NULL || ed[0] == '\0')
|
||||
ed = getenv ("EDITOR");
|
||||
ed = getenv("EDITOR");
|
||||
if (ed == NULL || ed[0] == '\0')
|
||||
ed = DEFAULT_EDITOR;
|
||||
conf.editor = ed;
|
||||
|
||||
pg = getenv ("PAGER");
|
||||
pg = getenv("PAGER");
|
||||
if (pg == NULL || pg[0] == '\0')
|
||||
pg = DEFAULT_PAGER;
|
||||
conf.pager = pg;
|
||||
|
||||
wins_set_layout (1);
|
||||
wins_set_layout(1);
|
||||
|
||||
calendar_set_first_day_of_week (MONDAY);
|
||||
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 ();
|
||||
custom_init_attr();
|
||||
|
||||
/* Start at the current date */
|
||||
calendar_init_slctd_day ();
|
||||
calendar_init_slctd_day();
|
||||
}
|
||||
|
||||
501
src/wins.c
501
src/wins.c
@@ -63,82 +63,73 @@ static int layout;
|
||||
*/
|
||||
static pthread_mutex_t screen_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static unsigned
|
||||
screen_acquire (void)
|
||||
static unsigned screen_acquire(void)
|
||||
{
|
||||
if (pthread_mutex_lock (&screen_mutex) != 0)
|
||||
if (pthread_mutex_lock(&screen_mutex) != 0)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
screen_release (void)
|
||||
static void screen_release(void)
|
||||
{
|
||||
pthread_mutex_unlock (&screen_mutex);
|
||||
pthread_mutex_unlock(&screen_mutex);
|
||||
}
|
||||
|
||||
int
|
||||
wins_refresh (void)
|
||||
int wins_refresh(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!screen_acquire ())
|
||||
if (!screen_acquire())
|
||||
return ERR;
|
||||
rc = refresh ();
|
||||
screen_release ();
|
||||
rc = refresh();
|
||||
screen_release();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
wins_wrefresh (WINDOW *win)
|
||||
int wins_wrefresh(WINDOW * win)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!win || !screen_acquire ())
|
||||
if (!win || !screen_acquire())
|
||||
return ERR;
|
||||
rc = wrefresh (win);
|
||||
screen_release ();
|
||||
rc = wrefresh(win);
|
||||
screen_release();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
wins_doupdate (void)
|
||||
int wins_doupdate(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!screen_acquire ())
|
||||
if (!screen_acquire())
|
||||
return ERR;
|
||||
rc = doupdate ();
|
||||
screen_release ();
|
||||
rc = doupdate();
|
||||
screen_release();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Get the current layout. */
|
||||
int
|
||||
wins_layout (void)
|
||||
int wins_layout(void)
|
||||
{
|
||||
return layout;
|
||||
}
|
||||
|
||||
/* Set the current layout. */
|
||||
void
|
||||
wins_set_layout (int nb)
|
||||
void wins_set_layout(int nb)
|
||||
{
|
||||
layout = nb;
|
||||
}
|
||||
|
||||
/* Get the current side bar width. */
|
||||
unsigned
|
||||
wins_sbar_width (void)
|
||||
unsigned wins_sbar_width(void)
|
||||
{
|
||||
if (sbarwidth_perc > SBARMAXWIDTHPERC)
|
||||
return col * SBARMAXWIDTHPERC / 100;
|
||||
else
|
||||
{
|
||||
else {
|
||||
unsigned sbarwidth = (unsigned)(col * sbarwidth_perc / 100);
|
||||
return (sbarwidth < SBARMINWIDTH) ? SBARMINWIDTH : sbarwidth;
|
||||
}
|
||||
@@ -148,8 +139,7 @@ wins_sbar_width (void)
|
||||
* Return the side bar width in percentage of the total number of columns
|
||||
* available in calcurse's screen.
|
||||
*/
|
||||
unsigned
|
||||
wins_sbar_wperc (void)
|
||||
unsigned wins_sbar_wperc(void)
|
||||
{
|
||||
return sbarwidth_perc > SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : sbarwidth_perc;
|
||||
}
|
||||
@@ -160,51 +150,44 @@ wins_sbar_wperc (void)
|
||||
* The side bar could not have a width representing more than 50% of the screen,
|
||||
* and could not be less than SBARMINWIDTH characters.
|
||||
*/
|
||||
void
|
||||
wins_set_sbar_width (unsigned perc)
|
||||
void wins_set_sbar_width(unsigned perc)
|
||||
{
|
||||
sbarwidth_perc = perc;
|
||||
}
|
||||
|
||||
/* Change the width of the side bar within acceptable boundaries. */
|
||||
void
|
||||
wins_sbar_winc (void)
|
||||
void wins_sbar_winc(void)
|
||||
{
|
||||
if (sbarwidth_perc < SBARMAXWIDTHPERC)
|
||||
sbarwidth_perc++;
|
||||
}
|
||||
|
||||
void
|
||||
wins_sbar_wdec (void)
|
||||
void wins_sbar_wdec(void)
|
||||
{
|
||||
if (sbarwidth_perc > 0)
|
||||
sbarwidth_perc--;
|
||||
}
|
||||
|
||||
/* Initialize the selected window in calcurse's interface. */
|
||||
void
|
||||
wins_slctd_init (void)
|
||||
void wins_slctd_init(void)
|
||||
{
|
||||
wins_slctd_set (CAL);
|
||||
wins_slctd_set(CAL);
|
||||
}
|
||||
|
||||
/* Returns an enum which corresponds to the window which is selected. */
|
||||
enum win
|
||||
wins_slctd (void)
|
||||
enum win wins_slctd(void)
|
||||
{
|
||||
return slctd_win;
|
||||
}
|
||||
|
||||
/* Sets the selected window. */
|
||||
void
|
||||
wins_slctd_set (enum win window)
|
||||
void wins_slctd_set(enum win window)
|
||||
{
|
||||
slctd_win = window;
|
||||
}
|
||||
|
||||
/* TAB key was hit in the interface, need to select next window. */
|
||||
void
|
||||
wins_slctd_next (void)
|
||||
void wins_slctd_next(void)
|
||||
{
|
||||
if (slctd_win == TOD)
|
||||
slctd_win = CAL;
|
||||
@@ -212,34 +195,32 @@ wins_slctd_next (void)
|
||||
slctd_win++;
|
||||
}
|
||||
|
||||
static void
|
||||
wins_init_panels (void)
|
||||
static void wins_init_panels(void)
|
||||
{
|
||||
win[CAL].p = newwin (CALHEIGHT, wins_sbar_width (), win[CAL].y, win[CAL].x);
|
||||
wins_show (win[CAL].p, _("Calendar"));
|
||||
win[CAL].p = newwin(CALHEIGHT, 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"));
|
||||
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);
|
||||
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);
|
||||
keypad(win[CAL].p, TRUE);
|
||||
keypad(win[APP].p, TRUE);
|
||||
keypad(win[TOD].p, TRUE);
|
||||
}
|
||||
|
||||
/* Create all the windows. */
|
||||
void
|
||||
wins_init (void)
|
||||
void wins_init(void)
|
||||
{
|
||||
wins_init_panels ();
|
||||
win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
||||
wins_init_panels();
|
||||
win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
||||
|
||||
keypad (win[STA].p, TRUE);
|
||||
keypad(win[STA].p, TRUE);
|
||||
|
||||
/* Notify that the curses mode is now launched. */
|
||||
ui_mode = UI_CURSES;
|
||||
@@ -249,116 +230,105 @@ wins_init (void)
|
||||
* Create a new window and its associated pad, which is used to make the
|
||||
* scrolling faster.
|
||||
*/
|
||||
void
|
||||
wins_scrollwin_init (struct scrollwin *sw)
|
||||
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);
|
||||
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)
|
||||
void wins_scrollwin_delete(struct scrollwin *sw)
|
||||
{
|
||||
EXIT_IF (sw == NULL, "null pointer");
|
||||
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)
|
||||
void wins_scrollwin_display(struct scrollwin *sw)
|
||||
{
|
||||
const int visible_lines = sw->win.h - sw->pad.y - 1;
|
||||
|
||||
if (sw->total_lines > visible_lines)
|
||||
{
|
||||
float ratio = ((float) visible_lines) / ((float) sw->total_lines);
|
||||
int sbar_length = (int) (ratio * visible_lines);
|
||||
int highend = (int) (ratio * sw->first_visible_line);
|
||||
if (sw->total_lines > visible_lines) {
|
||||
float ratio = ((float)visible_lines) / ((float)sw->total_lines);
|
||||
int sbar_length = (int)(ratio * visible_lines);
|
||||
int highend = (int)(ratio * sw->first_visible_line);
|
||||
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,
|
||||
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,
|
||||
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 ();
|
||||
wins_doupdate();
|
||||
}
|
||||
|
||||
void
|
||||
wins_scrollwin_up (struct scrollwin *sw, int amount)
|
||||
void wins_scrollwin_up(struct scrollwin *sw, int amount)
|
||||
{
|
||||
if (sw->first_visible_line > 0)
|
||||
sw->first_visible_line -= amount;
|
||||
}
|
||||
|
||||
void
|
||||
wins_scrollwin_down (struct scrollwin *sw, int 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))
|
||||
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)
|
||||
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();
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete the existing windows and recreate them with their new
|
||||
* size and placement.
|
||||
*/
|
||||
void
|
||||
wins_reinit (void)
|
||||
void wins_reinit(void)
|
||||
{
|
||||
delwin (win[CAL].p);
|
||||
delwin (win[APP].p);
|
||||
delwin (apad.ptrwin);
|
||||
delwin (win[TOD].p);
|
||||
delwin (win[STA].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);
|
||||
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)
|
||||
void wins_show(WINDOW * win, const char *label)
|
||||
{
|
||||
int width = getmaxx (win);
|
||||
int width = getmaxx(win);
|
||||
|
||||
box (win, 0, 0);
|
||||
mvwaddch (win, 2, 0, ACS_LTEE);
|
||||
mvwhline (win, 2, 1, ACS_HLINE, width - 2);
|
||||
mvwaddch (win, 2, width - 1, ACS_RTEE);
|
||||
box(win, 0, 0);
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the screen size and recalculate the windows configurations.
|
||||
*/
|
||||
void
|
||||
wins_get_config (void)
|
||||
void wins_get_config(void)
|
||||
{
|
||||
/* Get the screen configuration */
|
||||
getmaxyx (stdscr, row, col);
|
||||
getmaxyx(stdscr, row, col);
|
||||
|
||||
/* fixed values for status, notification bars and calendar */
|
||||
win[STA].h = STATUSHEIGHT;
|
||||
@@ -366,33 +336,27 @@ wins_get_config (void)
|
||||
win[STA].y = row - win[STA].h;
|
||||
win[STA].x = 0;
|
||||
|
||||
if (notify_bar ())
|
||||
{
|
||||
if (notify_bar()) {
|
||||
win[NOT].h = 1;
|
||||
win[NOT].w = col;
|
||||
win[NOT].y = win[STA].y - 1;
|
||||
win[NOT].x = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
win[NOT].h = 0;
|
||||
win[NOT].w = 0;
|
||||
win[NOT].y = 0;
|
||||
win[NOT].x = 0;
|
||||
}
|
||||
|
||||
win[CAL].w = wins_sbar_width ();
|
||||
win[CAL].w = wins_sbar_width();
|
||||
win[CAL].h = CALHEIGHT;
|
||||
|
||||
if (layout <= 4)
|
||||
{ /* APPOINTMENT is the biggest panel */
|
||||
if (layout <= 4) { /* APPOINTMENT is the biggest panel */
|
||||
win[APP].w = col - win[CAL].w;
|
||||
win[APP].h = row - (win[STA].h + win[NOT].h);
|
||||
win[TOD].w = win[CAL].w;
|
||||
win[TOD].h = row - (win[CAL].h + win[STA].h + win[NOT].h);
|
||||
}
|
||||
else
|
||||
{ /* TODO is the biggest panel */
|
||||
} else { /* TODO is the biggest panel */
|
||||
win[TOD].w = col - win[CAL].w;
|
||||
win[TOD].h = row - (win[STA].h + win[NOT].h);
|
||||
win[APP].w = win[CAL].w;
|
||||
@@ -400,8 +364,7 @@ wins_get_config (void)
|
||||
}
|
||||
|
||||
/* defining the layout */
|
||||
switch (layout)
|
||||
{
|
||||
switch (layout) {
|
||||
case 1:
|
||||
win[APP].y = 0;
|
||||
win[APP].x = 0;
|
||||
@@ -470,165 +433,141 @@ wins_get_config (void)
|
||||
}
|
||||
|
||||
/* draw panel border in color */
|
||||
static void
|
||||
border_color (WINDOW *window)
|
||||
static void border_color(WINDOW * window)
|
||||
{
|
||||
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);
|
||||
if (colorize) {
|
||||
wattron(window, color_attr | COLOR_PAIR(COLR_CUSTOM));
|
||||
box(window, 0, 0);
|
||||
} else {
|
||||
wattron(window, no_color_attr);
|
||||
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);
|
||||
}
|
||||
if (colorize)
|
||||
{
|
||||
wattroff (window, color_attr | COLOR_PAIR (COLR_CUSTOM));
|
||||
}
|
||||
else
|
||||
{
|
||||
wattroff (window, no_color_attr);
|
||||
}
|
||||
wnoutrefresh (window);
|
||||
wnoutrefresh(window);
|
||||
}
|
||||
|
||||
/* draw panel border without any color */
|
||||
static void
|
||||
border_nocolor (WINDOW *window)
|
||||
static void border_nocolor(WINDOW * window)
|
||||
{
|
||||
int color_attr = A_BOLD;
|
||||
int no_color_attr = A_DIM;
|
||||
|
||||
if (colorize)
|
||||
{
|
||||
wattron (window, color_attr | COLOR_PAIR (COLR_DEFAULT));
|
||||
if (colorize) {
|
||||
wattron(window, color_attr | COLOR_PAIR(COLR_DEFAULT));
|
||||
} else {
|
||||
wattron(window, no_color_attr);
|
||||
}
|
||||
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);
|
||||
}
|
||||
box (window, 0, 0);
|
||||
if (colorize)
|
||||
{
|
||||
wattroff (window, color_attr | COLOR_PAIR (COLR_DEFAULT));
|
||||
}
|
||||
else
|
||||
{
|
||||
wattroff (window, no_color_attr);
|
||||
}
|
||||
wnoutrefresh (window);
|
||||
wnoutrefresh(window);
|
||||
}
|
||||
|
||||
void
|
||||
wins_update_border (int flags)
|
||||
void wins_update_border(int flags)
|
||||
{
|
||||
if (flags & FLAG_CAL)
|
||||
{
|
||||
if (flags & FLAG_CAL) {
|
||||
if (slctd_win == CAL)
|
||||
border_color (win[CAL].p);
|
||||
border_color(win[CAL].p);
|
||||
else
|
||||
border_nocolor (win[CAL].p);
|
||||
border_nocolor(win[CAL].p);
|
||||
}
|
||||
if (flags & FLAG_APP)
|
||||
{
|
||||
if (flags & FLAG_APP) {
|
||||
if (slctd_win == APP)
|
||||
border_color (win[APP].p);
|
||||
border_color(win[APP].p);
|
||||
else
|
||||
border_nocolor (win[APP].p);
|
||||
border_nocolor(win[APP].p);
|
||||
}
|
||||
if (flags & FLAG_TOD)
|
||||
{
|
||||
if (flags & FLAG_TOD) {
|
||||
if (slctd_win == TOD)
|
||||
border_color (win[TOD].p);
|
||||
border_color(win[TOD].p);
|
||||
else
|
||||
border_nocolor (win[TOD].p);
|
||||
border_nocolor(win[TOD].p);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
wins_update_panels (int flags)
|
||||
void wins_update_panels(int flags)
|
||||
{
|
||||
if (flags & FLAG_APP)
|
||||
apoint_update_panel (slctd_win);
|
||||
apoint_update_panel(slctd_win);
|
||||
if (flags & FLAG_TOD)
|
||||
todo_update_panel (slctd_win);
|
||||
todo_update_panel(slctd_win);
|
||||
if (flags & FLAG_CAL)
|
||||
calendar_update_panel (&win[CAL]);
|
||||
calendar_update_panel(&win[CAL]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Update all of the three windows and put a border around the
|
||||
* selected window.
|
||||
*/
|
||||
void
|
||||
wins_update (int flags)
|
||||
void wins_update(int flags)
|
||||
{
|
||||
wins_update_border (flags);
|
||||
wins_update_panels (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_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)
|
||||
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)
|
||||
void wins_prepare_external(void)
|
||||
{
|
||||
if (notify_bar ())
|
||||
notify_stop_main_thread ();
|
||||
def_prog_mode ();
|
||||
if (notify_bar())
|
||||
notify_stop_main_thread();
|
||||
def_prog_mode();
|
||||
ui_mode = UI_CMDLINE;
|
||||
clear ();
|
||||
wins_refresh ();
|
||||
endwin ();
|
||||
clear();
|
||||
wins_refresh();
|
||||
endwin();
|
||||
}
|
||||
|
||||
/* Restore windows when returning from an external command. */
|
||||
void
|
||||
wins_unprepare_external (void)
|
||||
void wins_unprepare_external(void)
|
||||
{
|
||||
reset_prog_mode ();
|
||||
clearok (curscr, TRUE);
|
||||
curs_set (0);
|
||||
reset_prog_mode();
|
||||
clearok(curscr, TRUE);
|
||||
curs_set(0);
|
||||
ui_mode = UI_CURSES;
|
||||
wins_refresh ();
|
||||
if (notify_bar ())
|
||||
notify_start_main_thread ();
|
||||
wins_refresh();
|
||||
if (notify_bar())
|
||||
notify_start_main_thread();
|
||||
}
|
||||
|
||||
/*
|
||||
* While inside interactive mode, launch the external command cmd on the given
|
||||
* file.
|
||||
*/
|
||||
void
|
||||
wins_launch_external (const char *file, const char *cmd)
|
||||
void wins_launch_external(const char *file, const char *cmd)
|
||||
{
|
||||
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 */
|
||||
@@ -643,47 +582,46 @@ static unsigned status_page;
|
||||
* table, and update the NB_CAL_CMDS, NB_APP_CMDS or NB_TOD_CMDS defines,
|
||||
* depending on which panel the added keybind is assigned to.
|
||||
*/
|
||||
void
|
||||
wins_status_bar (void)
|
||||
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 cut = {_("Cut"), KEY_GENERIC_CUT};
|
||||
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 gnday = {_("+1 Day"), KEY_GENERIC_NEXT_DAY};
|
||||
struct binding gpday = {_("-1 Day"), KEY_GENERIC_PREV_DAY};
|
||||
struct binding gnweek = {_("+1 Week"), KEY_GENERIC_NEXT_WEEK};
|
||||
struct binding gpweek = {_("-1 Week"), KEY_GENERIC_PREV_WEEK};
|
||||
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 help = { _("Help"), KEY_GENERIC_HELP };
|
||||
struct binding quit = { _("Quit"), KEY_GENERIC_QUIT };
|
||||
struct binding save = { _("Save"), KEY_GENERIC_SAVE };
|
||||
struct binding cut = { _("Cut"), KEY_GENERIC_CUT };
|
||||
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 gnday = { _("+1 Day"), KEY_GENERIC_NEXT_DAY };
|
||||
struct binding gpday = { _("-1 Day"), KEY_GENERIC_PREV_DAY };
|
||||
struct binding gnweek = { _("+1 Week"), KEY_GENERIC_NEXT_WEEK };
|
||||
struct binding gpweek = { _("-1 Week"), KEY_GENERIC_PREV_WEEK };
|
||||
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,
|
||||
@@ -703,50 +641,46 @@ wins_status_bar (void)
|
||||
&gnweek, &gpweek, &togo, &today, &conf, &appt, &todo, &draw
|
||||
};
|
||||
|
||||
enum win active_panel = wins_slctd ();
|
||||
enum win active_panel = wins_slctd();
|
||||
|
||||
struct binding **bindings;
|
||||
int bindings_size;
|
||||
|
||||
switch (active_panel)
|
||||
{
|
||||
switch (active_panel) {
|
||||
case CAL:
|
||||
bindings = bindings_cal;
|
||||
bindings_size = sizeof (bindings_cal) / sizeof (bindings_cal[0]);
|
||||
bindings_size = sizeof(bindings_cal) / sizeof(bindings_cal[0]);
|
||||
break;
|
||||
case APP:
|
||||
bindings = bindings_apoint;
|
||||
bindings_size = sizeof (bindings_apoint) / sizeof (bindings_apoint[0]);
|
||||
bindings_size = sizeof(bindings_apoint) / sizeof(bindings_apoint[0]);
|
||||
break;
|
||||
case TOD:
|
||||
bindings = bindings_todo;
|
||||
bindings_size = sizeof (bindings_todo) / sizeof (bindings_todo[0]);
|
||||
bindings_size = sizeof(bindings_todo) / sizeof(bindings_todo[0]);
|
||||
break;
|
||||
default:
|
||||
EXIT (_("unknown panel"));
|
||||
EXIT(_("unknown panel"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
keys_display_bindings_bar (win[STA].p, bindings, bindings_size,
|
||||
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)
|
||||
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)
|
||||
void wins_other_status_page(int panel)
|
||||
{
|
||||
int nb_item, max_page;
|
||||
|
||||
switch (panel)
|
||||
{
|
||||
switch (panel) {
|
||||
case CAL:
|
||||
nb_item = NB_CAL_CMDS;
|
||||
break;
|
||||
@@ -757,7 +691,7 @@ wins_other_status_page (int panel)
|
||||
nb_item = NB_TOD_CMDS;
|
||||
break;
|
||||
default:
|
||||
EXIT (_("unknown panel"));
|
||||
EXIT(_("unknown panel"));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
max_page = nb_item / (KEYS_CMDS_PER_LINE * 2 - 1) + 1;
|
||||
@@ -765,8 +699,7 @@ wins_other_status_page (int panel)
|
||||
}
|
||||
|
||||
/* Reset the status bar page. */
|
||||
void
|
||||
wins_reset_status_page (void)
|
||||
void wins_reset_status_page(void)
|
||||
{
|
||||
status_page = 1;
|
||||
}
|
||||
|
||||
177
test/run-test.c
177
test/run-test.c
@@ -50,63 +50,53 @@
|
||||
* appropriate file descriptors are written to pfdin/pfdout.
|
||||
*/
|
||||
static int
|
||||
fork_exec (int *pfdin, int *pfdout, const char *path, char *const *arg)
|
||||
fork_exec(int *pfdin, int *pfdout, const char *path, char *const *arg)
|
||||
{
|
||||
int pin[2], pout[2];
|
||||
int pid;
|
||||
|
||||
if (pfdin && (pipe (pin) == -1))
|
||||
if (pfdin && (pipe(pin) == -1))
|
||||
return 0;
|
||||
if (pfdout && (pipe (pout) == -1))
|
||||
if (pfdout && (pipe(pout) == -1))
|
||||
return 0;
|
||||
|
||||
if ((pid = fork ()) == 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)
|
||||
{
|
||||
if (dup2 (pout[0], STDIN_FILENO) < 0)
|
||||
_exit (127);
|
||||
close (pout[0]);
|
||||
close (pout[1]);
|
||||
}
|
||||
close(pout[0]);
|
||||
|
||||
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);
|
||||
if (pid > 0) {
|
||||
if (pfdin) {
|
||||
fcntl(pin[0], F_SETFD, FD_CLOEXEC);
|
||||
*pfdin = pin[0];
|
||||
}
|
||||
if (pfdout)
|
||||
{
|
||||
fcntl (pout[1], F_SETFD, FD_CLOEXEC);
|
||||
if (pfdout) {
|
||||
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
|
||||
*pfdout = pout[1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
if (pfdin)
|
||||
close (pin[0]);
|
||||
close(pin[0]);
|
||||
if (pfdout)
|
||||
close (pout[1]);
|
||||
close(pout[1]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -114,44 +104,40 @@ fork_exec (int *pfdin, int *pfdout, const char *path, char *const *arg)
|
||||
}
|
||||
|
||||
/* Wait for a child process to terminate. */
|
||||
static int
|
||||
child_wait (int *pfdin, int *pfdout, int pid)
|
||||
static int child_wait(int *pfdin, int *pfdout, int pid)
|
||||
{
|
||||
int stat;
|
||||
|
||||
if (pfdin)
|
||||
close (*pfdin);
|
||||
close(*pfdin);
|
||||
if (pfdout)
|
||||
close (*pfdout);
|
||||
close(*pfdout);
|
||||
|
||||
waitpid (pid, &stat, 0);
|
||||
waitpid(pid, &stat, 0);
|
||||
return stat;
|
||||
}
|
||||
|
||||
/* Print error message and bail out. */
|
||||
static void
|
||||
die (const char *format, ...)
|
||||
static void die(const char *format, ...)
|
||||
{
|
||||
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)
|
||||
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)
|
||||
static int run_test(const char *name, int expect_failure)
|
||||
{
|
||||
char filename[BUFSIZ];
|
||||
char *arg1[3], *arg2[3];
|
||||
@@ -160,90 +146,81 @@ run_test (const char *name, int expect_failure)
|
||||
char buf1[BUFSIZ], buf2[BUFSIZ];
|
||||
int ret = 1;
|
||||
|
||||
if (snprintf (filename, BUFSIZ, "./%s", name) >= BUFSIZ)
|
||||
die ("file name too long\n");
|
||||
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) {
|
||||
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, F_OK) != 0)
|
||||
die("test not found: %s\n", name);
|
||||
}
|
||||
|
||||
if (access (filename, X_OK) != 0)
|
||||
die ("script is not executable: %s\n", filename);
|
||||
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);
|
||||
printf("Running %s...", name);
|
||||
|
||||
if ((pid1 = fork_exec (&pin1, NULL, *arg1, arg1)) < 0)
|
||||
die("failed to execute %s: %s\n", filename, strerror (errno));
|
||||
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));
|
||||
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");
|
||||
fpin1 = fdopen(pin1, "r");
|
||||
fpin2 = fdopen(pin2, "r");
|
||||
|
||||
while (fgets (buf1, BUFSIZ, fpin1))
|
||||
{
|
||||
if (!fgets (buf2, BUFSIZ, fpin2) || strcmp (buf1, buf2) != 0)
|
||||
{
|
||||
while (fgets(buf1, BUFSIZ, fpin1)) {
|
||||
if (!fgets(buf2, BUFSIZ, fpin2) || strcmp(buf1, buf2) != 0) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fpin1)
|
||||
fclose (fpin1);
|
||||
fclose(fpin1);
|
||||
if (fpin2)
|
||||
fclose (fpin2);
|
||||
fclose(fpin2);
|
||||
|
||||
if (child_wait (&pin1, NULL, pid1) != 0)
|
||||
if (child_wait(&pin1, NULL, pid1) != 0)
|
||||
ret = 0;
|
||||
if (child_wait (&pin2, NULL, pid2) != 0)
|
||||
if (child_wait(&pin2, NULL, pid2) != 0)
|
||||
ret = 0;
|
||||
|
||||
if (expect_failure)
|
||||
ret = 1 - ret;
|
||||
|
||||
if (ret == 1)
|
||||
printf (" ok\n");
|
||||
printf(" ok\n");
|
||||
else
|
||||
printf (" FAIL\n");
|
||||
printf(" FAIL\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
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)
|
||||
{
|
||||
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))
|
||||
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))
|
||||
} else {
|
||||
if (!run_test(argv[i], 0))
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user