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:
200
src/apoint.c
200
src/apoint.c
@@ -45,27 +45,23 @@ llist_ts_t alist_p;
|
|||||||
static struct apoint bkp_cut_apoint;
|
static struct apoint bkp_cut_apoint;
|
||||||
static int hilt;
|
static int hilt;
|
||||||
|
|
||||||
void
|
void apoint_free_bkp(void)
|
||||||
apoint_free_bkp (void)
|
|
||||||
{
|
|
||||||
if (bkp_cut_apoint.mesg)
|
|
||||||
{
|
{
|
||||||
|
if (bkp_cut_apoint.mesg) {
|
||||||
mem_free(bkp_cut_apoint.mesg);
|
mem_free(bkp_cut_apoint.mesg);
|
||||||
bkp_cut_apoint.mesg = 0;
|
bkp_cut_apoint.mesg = 0;
|
||||||
}
|
}
|
||||||
erase_note(&bkp_cut_apoint.note);
|
erase_note(&bkp_cut_apoint.note);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void apoint_free(struct apoint *apt)
|
||||||
apoint_free (struct apoint *apt)
|
|
||||||
{
|
{
|
||||||
mem_free(apt->mesg);
|
mem_free(apt->mesg);
|
||||||
erase_note(&apt->note);
|
erase_note(&apt->note);
|
||||||
mem_free(apt);
|
mem_free(apt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void apoint_dup(struct apoint *in, struct apoint *bkp)
|
||||||
apoint_dup (struct apoint *in, struct apoint *bkp)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(!in || !bkp, _("null pointer"));
|
EXIT_IF(!in || !bkp, _("null pointer"));
|
||||||
|
|
||||||
@@ -77,8 +73,7 @@ apoint_dup (struct apoint *in, struct apoint *bkp)
|
|||||||
bkp->note = mem_strdup(in->note);
|
bkp->note = mem_strdup(in->note);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_llist_init(void)
|
||||||
apoint_llist_init (void)
|
|
||||||
{
|
{
|
||||||
LLIST_TS_INIT(&alist_p);
|
LLIST_TS_INIT(&alist_p);
|
||||||
}
|
}
|
||||||
@@ -88,47 +83,41 @@ apoint_llist_init (void)
|
|||||||
* list. No need to be thread safe, as only the main process remains when
|
* list. No need to be thread safe, as only the main process remains when
|
||||||
* calling this function.
|
* calling this function.
|
||||||
*/
|
*/
|
||||||
void
|
void apoint_llist_free(void)
|
||||||
apoint_llist_free (void)
|
|
||||||
{
|
{
|
||||||
LLIST_TS_FREE_INNER(&alist_p, apoint_free);
|
LLIST_TS_FREE_INNER(&alist_p, apoint_free);
|
||||||
LLIST_TS_FREE(&alist_p);
|
LLIST_TS_FREE(&alist_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets which appointment is highlighted. */
|
/* Sets which appointment is highlighted. */
|
||||||
void
|
void apoint_hilt_set(int highlighted)
|
||||||
apoint_hilt_set (int highlighted)
|
|
||||||
{
|
{
|
||||||
hilt = highlighted;
|
hilt = highlighted;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_hilt_decrease(int n)
|
||||||
apoint_hilt_decrease (int n)
|
|
||||||
{
|
{
|
||||||
hilt -= n;
|
hilt -= n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_hilt_increase(int n)
|
||||||
apoint_hilt_increase (int n)
|
|
||||||
{
|
{
|
||||||
hilt += n;
|
hilt += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return which appointment is highlighted. */
|
/* Return which appointment is highlighted. */
|
||||||
int
|
int apoint_hilt(void)
|
||||||
apoint_hilt (void)
|
|
||||||
{
|
{
|
||||||
return hilt;
|
return hilt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int apoint_cmp_start(struct apoint *a, struct apoint *b)
|
||||||
apoint_cmp_start (struct apoint *a, struct apoint *b)
|
|
||||||
{
|
{
|
||||||
return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1);
|
return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct apoint *
|
struct apoint *apoint_new(char *mesg, char *note, long start, long dur,
|
||||||
apoint_new (char *mesg, char *note, long start, long dur, char state)
|
char state)
|
||||||
{
|
{
|
||||||
struct apoint *apt;
|
struct apoint *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,
|
* Add an item in either the appointment or the event list,
|
||||||
* depending if the start time is entered or not.
|
* depending if the start time is entered or not.
|
||||||
*/
|
*/
|
||||||
void
|
void apoint_add(void)
|
||||||
apoint_add (void)
|
|
||||||
{
|
{
|
||||||
#define LTIME 6
|
#define LTIME 6
|
||||||
#define LDUR 12
|
#define LDUR 12
|
||||||
const char *mesg_1 =
|
const char *mesg_1 =
|
||||||
_("Enter start time ([hh:mm]), leave blank for an all-day event : ");
|
_("Enter start time ([hh:mm]), leave blank for an all-day event : ");
|
||||||
const char *mesg_2 =
|
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 *mesg_3 = _("Enter description :");
|
||||||
const char *format_message_1 =
|
const char *format_message_1 =
|
||||||
_("You entered an invalid start time, should be [hh:mm]");
|
_("You entered an invalid start time, should be [hh:mm]");
|
||||||
const char *format_message_2 =
|
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");
|
const char *enter_str = _("Press [Enter] to continue");
|
||||||
int Id = 1;
|
int Id = 1;
|
||||||
char item_time[LDUR] = "";
|
char item_time[LDUR] = "";
|
||||||
@@ -175,26 +165,21 @@ apoint_add (void)
|
|||||||
int is_appointment = 1;
|
int is_appointment = 1;
|
||||||
|
|
||||||
/* Get the starting time */
|
/* Get the starting time */
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
status_mesg(mesg_1, "");
|
status_mesg(mesg_1, "");
|
||||||
if (getstring (win[STA].p, item_time, LTIME, 0, 1) != GETSTRING_ESC)
|
if (getstring(win[STA].p, item_time, LTIME, 0, 1) != GETSTRING_ESC) {
|
||||||
{
|
if (strlen(item_time) == 0) {
|
||||||
if (strlen (item_time) == 0)
|
|
||||||
{
|
|
||||||
is_appointment = 0;
|
is_appointment = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parse_time(item_time, &heures, &minutes) == 1)
|
if (parse_time(item_time, &heures, &minutes) == 1)
|
||||||
break;
|
break;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
status_mesg(format_message_1, enter_str);
|
status_mesg(format_message_1, enter_str);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,55 +188,41 @@ apoint_add (void)
|
|||||||
* depending on the starting time, and record the
|
* depending on the starting time, and record the
|
||||||
* corresponding item.
|
* corresponding item.
|
||||||
*/
|
*/
|
||||||
if (is_appointment)
|
if (is_appointment) { /* Get the appointment duration */
|
||||||
{ /* Get the appointment duration */
|
|
||||||
item_time[0] = '\0';
|
item_time[0] = '\0';
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
status_mesg(mesg_2, "");
|
status_mesg(mesg_2, "");
|
||||||
if (getstring (win[STA].p, item_time, LDUR, 0, 1) != GETSTRING_ESC)
|
if (getstring(win[STA].p, item_time, LDUR, 0, 1) != GETSTRING_ESC) {
|
||||||
{
|
|
||||||
if (*item_time == '+' && parse_duration(item_time + 1,
|
if (*item_time == '+' && parse_duration(item_time + 1,
|
||||||
&apoint_duration) == 1)
|
&apoint_duration) == 1)
|
||||||
break;
|
break;
|
||||||
else if (parse_time (item_time, &end_h, &end_m) == 1)
|
else if (parse_time(item_time, &end_h, &end_m) == 1) {
|
||||||
{
|
if (end_h < heures || ((end_h == heures) && (end_m < minutes))) {
|
||||||
if (end_h < heures || ((end_h == heures) && (end_m < minutes)))
|
|
||||||
{
|
|
||||||
apoint_duration = MININSEC - minutes + end_m
|
apoint_duration = MININSEC - minutes + end_m
|
||||||
+ (24 + end_h - (heures + 1)) * MININSEC;
|
+ (24 + end_h - (heures + 1)) * MININSEC;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
apoint_duration = MININSEC - minutes
|
apoint_duration = MININSEC - minutes
|
||||||
+ end_m + (end_h - (heures + 1)) * MININSEC;
|
+ end_m + (end_h - (heures + 1)) * MININSEC;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
status_mesg(format_message_2, enter_str);
|
status_mesg(format_message_2, enter_str);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else /* Insert the event Id */
|
||||||
else /* Insert the event Id */
|
|
||||||
Id = 1;
|
Id = 1;
|
||||||
|
|
||||||
status_mesg(mesg_3, "");
|
status_mesg(mesg_3, "");
|
||||||
if (getstring (win[STA].p, item_mesg, BUFSIZ, 0, 1) == GETSTRING_VALID)
|
if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
if (is_appointment) {
|
||||||
if (is_appointment)
|
|
||||||
{
|
|
||||||
apoint_start = date2sec(*calendar_get_slctd_day(), heures, minutes);
|
apoint_start = date2sec(*calendar_get_slctd_day(), heures, minutes);
|
||||||
apoint_new(item_mesg, 0L, apoint_start, min2sec(apoint_duration), 0L);
|
apoint_new(item_mesg, 0L, apoint_start, min2sec(apoint_duration), 0L);
|
||||||
if (notify_bar())
|
if (notify_bar())
|
||||||
notify_check_added(item_mesg, apoint_start, 0L);
|
notify_check_added(item_mesg, apoint_start, 0L);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
event_new(item_mesg, 0L, date2sec(*calendar_get_slctd_day(), 0, 0), Id);
|
event_new(item_mesg, 0L, date2sec(*calendar_get_slctd_day(), 0, 0), Id);
|
||||||
|
|
||||||
if (hilt == 0)
|
if (hilt == 0)
|
||||||
@@ -261,8 +232,7 @@ apoint_add (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Delete an item from the appointment list. */
|
/* Delete an item from the appointment list. */
|
||||||
void
|
void apoint_delete(unsigned *nb_events, unsigned *nb_apoints)
|
||||||
apoint_delete (unsigned *nb_events, unsigned *nb_apoints)
|
|
||||||
{
|
{
|
||||||
const char *del_app_str = _("Do you really want to delete this item ?");
|
const char *del_app_str = _("Do you really want to delete this item ?");
|
||||||
long date;
|
long date;
|
||||||
@@ -274,19 +244,15 @@ apoint_delete (unsigned *nb_events, unsigned *nb_apoints)
|
|||||||
if (nb_items == 0)
|
if (nb_items == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (conf.confirm_delete)
|
if (conf.confirm_delete) {
|
||||||
{
|
if (status_ask_bool(del_app_str) != 1) {
|
||||||
if (status_ask_bool (del_app_str) != 1)
|
|
||||||
{
|
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nb_items != 0)
|
if (nb_items != 0) {
|
||||||
{
|
switch (day_erase_item(date, hilt, ERASE_DONT_FORCE)) {
|
||||||
switch (day_erase_item (date, hilt, ERASE_DONT_FORCE))
|
|
||||||
{
|
|
||||||
case EVNT:
|
case EVNT:
|
||||||
case RECUR_EVNT:
|
case RECUR_EVNT:
|
||||||
(*nb_events)--;
|
(*nb_events)--;
|
||||||
@@ -314,8 +280,7 @@ apoint_delete (unsigned *nb_events, unsigned *nb_apoints)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Cut an item, so that it can be pasted somewhere else later. */
|
/* Cut an item, so that it can be pasted somewhere else later. */
|
||||||
int
|
int apoint_cut(unsigned *nb_events, unsigned *nb_apoints)
|
||||||
apoint_cut (unsigned *nb_events, unsigned *nb_apoints)
|
|
||||||
{
|
{
|
||||||
const int NBITEMS = *nb_apoints + *nb_events;
|
const int NBITEMS = *nb_apoints + *nb_events;
|
||||||
int item_type, to_be_removed;
|
int item_type, to_be_removed;
|
||||||
@@ -326,17 +291,13 @@ apoint_cut (unsigned *nb_events, unsigned *nb_apoints)
|
|||||||
|
|
||||||
date = calendar_get_slctd_day_sec();
|
date = calendar_get_slctd_day_sec();
|
||||||
item_type = day_cut_item(date, hilt);
|
item_type = day_cut_item(date, hilt);
|
||||||
if (item_type == EVNT || item_type == RECUR_EVNT)
|
if (item_type == EVNT || item_type == RECUR_EVNT) {
|
||||||
{
|
|
||||||
(*nb_events)--;
|
(*nb_events)--;
|
||||||
to_be_removed = 1;
|
to_be_removed = 1;
|
||||||
}
|
} else if (item_type == APPT || item_type == RECUR_APPT) {
|
||||||
else if (item_type == APPT || item_type == RECUR_APPT)
|
|
||||||
{
|
|
||||||
(*nb_apoints)--;
|
(*nb_apoints)--;
|
||||||
to_be_removed = 3;
|
to_be_removed = 3;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
EXIT(_("no such type"));
|
EXIT(_("no such type"));
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
|
|
||||||
@@ -351,8 +312,7 @@ apoint_cut (unsigned *nb_events, unsigned *nb_apoints)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Paste a previously cut item. */
|
/* Paste a previously cut item. */
|
||||||
void
|
void apoint_paste(unsigned *nb_events, unsigned *nb_apoints, int cut_item_type)
|
||||||
apoint_paste (unsigned *nb_events, unsigned *nb_apoints, int cut_item_type)
|
|
||||||
{
|
{
|
||||||
int item_type;
|
int item_type;
|
||||||
long date;
|
long date;
|
||||||
@@ -370,38 +330,33 @@ apoint_paste (unsigned *nb_events, unsigned *nb_apoints, int cut_item_type)
|
|||||||
hilt++;
|
hilt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned apoint_inday(struct apoint *i, long start)
|
||||||
apoint_inday (struct apoint *i, long start)
|
|
||||||
{
|
{
|
||||||
return (i->start <= start + DAYINSEC && i->start + i->dur > start);
|
return (i->start <= start + DAYINSEC && i->start + i->dur > start);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_sec2str(struct apoint *o, long day, char *start, char *end)
|
||||||
apoint_sec2str (struct apoint *o, long day, char *start, char *end)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
|
|
||||||
if (o->start < day)
|
if (o->start < day)
|
||||||
strncpy(start, "..:..", 6);
|
strncpy(start, "..:..", 6);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
t = o->start;
|
t = o->start;
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
snprintf(start, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
snprintf(start, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
||||||
}
|
}
|
||||||
if (o->start + o->dur > day + DAYINSEC)
|
if (o->start + o->dur > day + DAYINSEC)
|
||||||
strncpy(end, "..:..", 6);
|
strncpy(end, "..:..", 6);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
t = o->start + o->dur;
|
t = o->start + o->dur;
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
snprintf(end, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
snprintf(end, HRMIN_SIZE, "%02u:%02u", lt->tm_hour, lt->tm_min);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_write(struct apoint *o, FILE * f)
|
||||||
apoint_write (struct apoint *o, FILE *f)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -427,8 +382,8 @@ apoint_write (struct apoint *o, FILE *f)
|
|||||||
fprintf(f, "%s\n", o->mesg);
|
fprintf(f, "%s\n", o->mesg);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct apoint *
|
struct apoint *apoint_scan(FILE * f, struct tm start, struct tm end, char state,
|
||||||
apoint_scan (FILE *f, struct tm start, struct tm end, char state, char *note)
|
char *note)
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ], *newline;
|
char buf[BUFSIZ], *newline;
|
||||||
time_t tstart, tend, t;
|
time_t tstart, tend, t;
|
||||||
@@ -459,8 +414,7 @@ apoint_scan (FILE *f, struct tm start, struct tm end, char state, char *note)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve an appointment from the list, given the day and item position. */
|
/* Retrieve an appointment from the list, given the day and item position. */
|
||||||
struct apoint *
|
struct apoint *apoint_get(long day, int pos)
|
||||||
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);
|
||||||
|
|
||||||
@@ -471,8 +425,7 @@ apoint_get (long day, int pos)
|
|||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_delete_bynum(long start, unsigned num, enum eraseflg flag)
|
||||||
apoint_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int need_check_notify = 0;
|
int need_check_notify = 0;
|
||||||
@@ -484,8 +437,7 @@ apoint_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
|||||||
EXIT(_("no such appointment"));
|
EXIT(_("no such appointment"));
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
switch (flag)
|
switch (flag) {
|
||||||
{
|
|
||||||
case ERASE_FORCE_ONLY_NOTE:
|
case ERASE_FORCE_ONLY_NOTE:
|
||||||
erase_note(&apt->note);
|
erase_note(&apt->note);
|
||||||
break;
|
break;
|
||||||
@@ -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
|
* the appointment panel. This is to help the appointment scroll function
|
||||||
* to place beggining of the pad correctly.
|
* to place beggining of the pad correctly.
|
||||||
*/
|
*/
|
||||||
static int
|
static int get_item_line(int item_nb, int nb_events_inday)
|
||||||
get_item_line (int item_nb, int nb_events_inday)
|
|
||||||
{
|
{
|
||||||
int separator = 2;
|
int separator = 2;
|
||||||
int line = 0;
|
int line = 0;
|
||||||
@@ -531,8 +482,7 @@ get_item_line (int item_nb, int nb_events_inday)
|
|||||||
* Update (if necessary) the first displayed pad line to make the
|
* Update (if necessary) the first displayed pad line to make the
|
||||||
* appointment panel scroll down next time pnoutrefresh is called.
|
* appointment panel scroll down next time pnoutrefresh is called.
|
||||||
*/
|
*/
|
||||||
void
|
void apoint_scroll_pad_down(int nb_events_inday, int win_length)
|
||||||
apoint_scroll_pad_down (int nb_events_inday, int win_length)
|
|
||||||
{
|
{
|
||||||
int pad_last_line = 0;
|
int pad_last_line = 0;
|
||||||
int item_first_line = 0, item_last_line = 0;
|
int item_first_line = 0, item_last_line = 0;
|
||||||
@@ -553,8 +503,7 @@ apoint_scroll_pad_down (int nb_events_inday, int win_length)
|
|||||||
* Update (if necessary) the first displayed pad line to make the
|
* Update (if necessary) the first displayed pad line to make the
|
||||||
* appointment panel scroll up next time pnoutrefresh is called.
|
* appointment panel scroll up next time pnoutrefresh is called.
|
||||||
*/
|
*/
|
||||||
void
|
void apoint_scroll_pad_up(int nb_events_inday)
|
||||||
apoint_scroll_pad_up (int nb_events_inday)
|
|
||||||
{
|
{
|
||||||
int item_first_line = 0;
|
int item_first_line = 0;
|
||||||
|
|
||||||
@@ -563,8 +512,7 @@ apoint_scroll_pad_up (int nb_events_inday)
|
|||||||
apad.first_onscreen = item_first_line;
|
apad.first_onscreen = item_first_line;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int apoint_starts_after(struct apoint *apt, long time)
|
||||||
apoint_starts_after (struct apoint *apt, long time)
|
|
||||||
{
|
{
|
||||||
return apt->start > time;
|
return apt->start > time;
|
||||||
}
|
}
|
||||||
@@ -573,20 +521,17 @@ apoint_starts_after (struct apoint *apt, long time)
|
|||||||
* Look in the appointment list if we have an item which starts before the item
|
* 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).
|
* stored in the notify_app structure (which is the next item to be notified).
|
||||||
*/
|
*/
|
||||||
struct notify_app *
|
struct notify_app *apoint_check_next(struct notify_app *app, long start)
|
||||||
apoint_check_next (struct notify_app *app, long start)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
LLIST_TS_LOCK(&alist_p);
|
LLIST_TS_LOCK(&alist_p);
|
||||||
i = LLIST_TS_FIND_FIRST(&alist_p, start, apoint_starts_after);
|
i = LLIST_TS_FIND_FIRST(&alist_p, start, apoint_starts_after);
|
||||||
|
|
||||||
if (i)
|
if (i) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
if (apt->start <= app->time)
|
if (apt->start <= app->time) {
|
||||||
{
|
|
||||||
app->time = apt->start;
|
app->time = apt->start;
|
||||||
app->txt = mem_strdup(apt->mesg);
|
app->txt = mem_strdup(apt->mesg);
|
||||||
app->state = apt->state;
|
app->state = apt->state;
|
||||||
@@ -602,8 +547,7 @@ apoint_check_next (struct notify_app *app, long start)
|
|||||||
/*
|
/*
|
||||||
* Switch notification state.
|
* Switch notification state.
|
||||||
*/
|
*/
|
||||||
void
|
void apoint_switch_notify(void)
|
||||||
apoint_switch_notify (void)
|
|
||||||
{
|
{
|
||||||
struct day_item *p;
|
struct day_item *p;
|
||||||
long date;
|
long date;
|
||||||
@@ -615,12 +559,10 @@ apoint_switch_notify (void)
|
|||||||
|
|
||||||
date = calendar_get_slctd_day_sec();
|
date = calendar_get_slctd_day_sec();
|
||||||
|
|
||||||
if (p->type == RECUR_APPT)
|
if (p->type == RECUR_APPT) {
|
||||||
{
|
|
||||||
recur_apoint_switch_notify(date, p->appt_pos);
|
recur_apoint_switch_notify(date, p->appt_pos);
|
||||||
return;
|
return;
|
||||||
}
|
} else if (p->type == APPT)
|
||||||
else if (p->type == APPT)
|
|
||||||
apoint_nb = day_item_nb(date, hilt, APPT);
|
apoint_nb = day_item_nb(date, hilt, APPT);
|
||||||
|
|
||||||
need_chk_notify = 0;
|
need_chk_notify = 0;
|
||||||
@@ -638,8 +580,7 @@ apoint_switch_notify (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Updates the Appointment panel */
|
/* Updates the Appointment panel */
|
||||||
void
|
void apoint_update_panel(int which_pan)
|
||||||
apoint_update_panel (int which_pan)
|
|
||||||
{
|
{
|
||||||
int title_xpos;
|
int title_xpos;
|
||||||
int bordr = 1;
|
int bordr = 1;
|
||||||
@@ -658,8 +599,7 @@ apoint_update_panel (int which_pan)
|
|||||||
day_write_pad(date, app_width, app_length, (which_pan == APP) ? hilt : 0);
|
day_write_pad(date, app_width, app_length, (which_pan == APP) ? hilt : 0);
|
||||||
|
|
||||||
/* Print current date in the top right window corner. */
|
/* Print current date in the top right window corner. */
|
||||||
erase_window_part (win[APP].p, 1, title_lines, win[APP].w - 2,
|
erase_window_part(win[APP].p, 1, title_lines, win[APP].w - 2, win[APP].h - 2);
|
||||||
win[APP].h - 2);
|
|
||||||
custom_apply_attr(win[APP].p, ATTR_HIGHEST);
|
custom_apply_attr(win[APP].p, ATTR_HIGHEST);
|
||||||
mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d",
|
mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d",
|
||||||
calendar_get_pom(date), _(monthnames[slctd_date.mm - 1]),
|
calendar_get_pom(date), _(monthnames[slctd_date.mm - 1]),
|
||||||
@@ -667,8 +607,7 @@ apoint_update_panel (int which_pan)
|
|||||||
custom_remove_attr(win[APP].p, ATTR_HIGHEST);
|
custom_remove_attr(win[APP].p, ATTR_HIGHEST);
|
||||||
|
|
||||||
/* Draw the scrollbar if necessary. */
|
/* Draw the scrollbar if necessary. */
|
||||||
if ((apad.length >= app_length) || (apad.first_onscreen > 0))
|
if ((apad.length >= app_length) || (apad.first_onscreen > 0)) {
|
||||||
{
|
|
||||||
float ratio = ((float)app_length) / ((float)apad.length);
|
float ratio = ((float)app_length) / ((float)apad.length);
|
||||||
int sbar_length = (int)(ratio * app_length);
|
int sbar_length = (int)(ratio * app_length);
|
||||||
int highend = (int)(ratio * apad.first_onscreen);
|
int highend = (int)(ratio * apad.first_onscreen);
|
||||||
@@ -688,8 +627,7 @@ apoint_update_panel (int which_pan)
|
|||||||
win[APP].x + win[APP].w - 3 * bordr);
|
win[APP].x + win[APP].w - 3 * bordr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void apoint_paste_item(void)
|
||||||
apoint_paste_item (void)
|
|
||||||
{
|
{
|
||||||
long bkp_time, bkp_start;
|
long bkp_time, bkp_start;
|
||||||
|
|
||||||
|
|||||||
249
src/args.c
249
src/args.c
@@ -58,8 +58,7 @@ enum {
|
|||||||
/*
|
/*
|
||||||
* Print Calcurse usage and exit.
|
* Print Calcurse usage and exit.
|
||||||
*/
|
*/
|
||||||
static void
|
static void usage(void)
|
||||||
usage (void)
|
|
||||||
{
|
{
|
||||||
const char *arg_usage =
|
const char *arg_usage =
|
||||||
_("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n"
|
_("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n"
|
||||||
@@ -69,8 +68,7 @@ usage (void)
|
|||||||
fputs(arg_usage, stdout);
|
fputs(arg_usage, stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void usage_try(void)
|
||||||
usage_try (void)
|
|
||||||
{
|
{
|
||||||
const char *arg_usage_try = _("Try 'calcurse -h' for more information.\n");
|
const char *arg_usage_try = _("Try 'calcurse -h' for more information.\n");
|
||||||
fputs(arg_usage_try, stdout);
|
fputs(arg_usage_try, stdout);
|
||||||
@@ -79,8 +77,7 @@ usage_try (void)
|
|||||||
/*
|
/*
|
||||||
* Print Calcurse version with a short copyright text and exit.
|
* Print Calcurse version with a short copyright text and exit.
|
||||||
*/
|
*/
|
||||||
static void
|
static void version_arg(void)
|
||||||
version_arg (void)
|
|
||||||
{
|
{
|
||||||
const char *vtext =
|
const char *vtext =
|
||||||
_("\nCopyright (c) 2004-2012 calcurse Development Team.\n"
|
_("\nCopyright (c) 2004-2012 calcurse Development Team.\n"
|
||||||
@@ -93,8 +90,7 @@ version_arg (void)
|
|||||||
/*
|
/*
|
||||||
* Print the command line options and exit.
|
* Print the command line options and exit.
|
||||||
*/
|
*/
|
||||||
static void
|
static void help_arg(void)
|
||||||
help_arg (void)
|
|
||||||
{
|
{
|
||||||
const char *htext =
|
const char *htext =
|
||||||
_("\nMiscellaneous:\n"
|
_("\nMiscellaneous:\n"
|
||||||
@@ -170,8 +166,7 @@ help_arg (void)
|
|||||||
* The status is obtained by looking at pid files in user data directory
|
* The status is obtained by looking at pid files in user data directory
|
||||||
* (.calcurse.pid and .daemon.pid).
|
* (.calcurse.pid and .daemon.pid).
|
||||||
*/
|
*/
|
||||||
static void
|
static void status_arg(void)
|
||||||
status_arg (void)
|
|
||||||
{
|
{
|
||||||
int cpid, dpid;
|
int cpid, dpid;
|
||||||
|
|
||||||
@@ -181,8 +176,7 @@ status_arg (void)
|
|||||||
EXIT_IF(cpid && dpid,
|
EXIT_IF(cpid && dpid,
|
||||||
_("Error: both calcurse (pid: %d) and its daemon (pid: %d)\n"
|
_("Error: both calcurse (pid: %d) and its daemon (pid: %d)\n"
|
||||||
"seem to be running at the same time!\n"
|
"seem to be running at the same time!\n"
|
||||||
"Please check manually and restart calcurse.\n"),
|
"Please check manually and restart calcurse.\n"), cpid, dpid);
|
||||||
cpid, dpid);
|
|
||||||
|
|
||||||
if (cpid)
|
if (cpid)
|
||||||
fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid);
|
fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid);
|
||||||
@@ -199,8 +193,7 @@ status_arg (void)
|
|||||||
* If priority == 0, only completed tasks will be displayed.
|
* If priority == 0, only completed tasks will be displayed.
|
||||||
* If regex is not null, only the matching todos are printed.
|
* If regex is not null, only the matching todos are printed.
|
||||||
*/
|
*/
|
||||||
static void
|
static void todo_arg(int priority, const char *format, regex_t * regex)
|
||||||
todo_arg (int priority, const char *format, regex_t *regex)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int title = 1;
|
int title = 1;
|
||||||
@@ -218,24 +211,18 @@ todo_arg (int priority, const char *format, regex_t *regex)
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
LLIST_FOREACH (&todolist, i)
|
LLIST_FOREACH(&todolist, i) {
|
||||||
{
|
|
||||||
struct todo *todo = LLIST_TS_GET_DATA(i);
|
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||||
if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0)
|
if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (todo->id < 0) /* completed task */
|
if (todo->id < 0) { /* completed task */
|
||||||
{
|
if (priority == 0) {
|
||||||
if (priority == 0)
|
|
||||||
{
|
|
||||||
DISPLAY_TITLE;
|
DISPLAY_TITLE;
|
||||||
print_todo(format, todo);
|
print_todo(format, todo);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
if (priority < 0 || todo->id == priority) {
|
||||||
{
|
|
||||||
if (priority < 0 || todo->id == priority)
|
|
||||||
{
|
|
||||||
DISPLAY_TITLE;
|
DISPLAY_TITLE;
|
||||||
print_todo(format, todo);
|
print_todo(format, todo);
|
||||||
}
|
}
|
||||||
@@ -246,8 +233,7 @@ todo_arg (int priority, const char *format, regex_t *regex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print the next appointment within the upcoming 24 hours. */
|
/* Print the next appointment within the upcoming 24 hours. */
|
||||||
static void
|
static void next_arg(void)
|
||||||
next_arg (void)
|
|
||||||
{
|
{
|
||||||
struct notify_app next_app;
|
struct notify_app next_app;
|
||||||
const long current_time = now();
|
const long current_time = now();
|
||||||
@@ -261,8 +247,7 @@ next_arg (void)
|
|||||||
next_app = *recur_apoint_check_next(&next_app, current_time, get_today());
|
next_app = *recur_apoint_check_next(&next_app, current_time, get_today());
|
||||||
next_app = *apoint_check_next(&next_app, current_time);
|
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;
|
time_left = next_app.time - current_time;
|
||||||
hours_left = (time_left / HOURINSEC);
|
hours_left = (time_left / HOURINSEC);
|
||||||
min_left = (time_left - hours_left * HOURINSEC) / MININSEC;
|
min_left = (time_left - hours_left * HOURINSEC) / MININSEC;
|
||||||
@@ -277,8 +262,7 @@ next_arg (void)
|
|||||||
/*
|
/*
|
||||||
* Print the date on stdout.
|
* Print the date on stdout.
|
||||||
*/
|
*/
|
||||||
static void
|
static void arg_print_date(long date)
|
||||||
arg_print_date (long date)
|
|
||||||
{
|
{
|
||||||
char date_str[BUFSIZ];
|
char date_str[BUFSIZ];
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -317,40 +301,34 @@ 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 and it is the first one, and then print all the events for
|
||||||
* that date.
|
* that date.
|
||||||
*/
|
*/
|
||||||
LLIST_FIND_FOREACH (&recur_elist, today, recur_event_inday, i)
|
LLIST_FIND_FOREACH(&recur_elist, today, recur_event_inday, i) {
|
||||||
{
|
|
||||||
struct recur_event *re = LLIST_GET_DATA(i);
|
struct recur_event *re = LLIST_GET_DATA(i);
|
||||||
if (regex && regexec(regex, re->mesg, 0, 0, 0) != 0)
|
if (regex && regexec(regex, re->mesg, 0, 0, 0) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
app_found = 1;
|
app_found = 1;
|
||||||
if (add_line)
|
if (add_line) {
|
||||||
{
|
|
||||||
fputs("\n", stdout);
|
fputs("\n", stdout);
|
||||||
add_line = 0;
|
add_line = 0;
|
||||||
}
|
}
|
||||||
if (print_date)
|
if (print_date) {
|
||||||
{
|
|
||||||
arg_print_date(today);
|
arg_print_date(today);
|
||||||
print_date = 0;
|
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)
|
LLIST_FIND_FOREACH_CONT(&eventlist, today, event_inday, i) {
|
||||||
{
|
|
||||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||||
if (regex && regexec(regex, ev->mesg, 0, 0, 0) != 0)
|
if (regex && regexec(regex, ev->mesg, 0, 0, 0) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
app_found = 1;
|
app_found = 1;
|
||||||
if (add_line)
|
if (add_line) {
|
||||||
{
|
|
||||||
fputs("\n", stdout);
|
fputs("\n", stdout);
|
||||||
add_line = 0;
|
add_line = 0;
|
||||||
}
|
}
|
||||||
if (print_date)
|
if (print_date) {
|
||||||
{
|
|
||||||
arg_print_date(today);
|
arg_print_date(today);
|
||||||
print_date = 0;
|
print_date = 0;
|
||||||
}
|
}
|
||||||
@@ -367,26 +345,22 @@ app_arg (int add_line, struct date *day, long date, const char *fmt_apt,
|
|||||||
*/
|
*/
|
||||||
i = LLIST_TS_FIND_FIRST(&alist_p, today, apoint_inday);
|
i = LLIST_TS_FIND_FIRST(&alist_p, today, apoint_inday);
|
||||||
j = LLIST_TS_FIND_FIRST(&recur_alist_p, today, recur_apoint_inday);
|
j = LLIST_TS_FIND_FIRST(&recur_alist_p, today, recur_apoint_inday);
|
||||||
while (i || j)
|
while (i || j) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
struct recur_apoint *ra = LLIST_TS_GET_DATA(j);
|
struct recur_apoint *ra = LLIST_TS_GET_DATA(j);
|
||||||
unsigned occurrence;
|
unsigned occurrence;
|
||||||
|
|
||||||
while (i && regex && regexec (regex, apt->mesg, 0, 0, 0) != 0)
|
while (i && regex && regexec(regex, apt->mesg, 0, 0, 0) != 0) {
|
||||||
{
|
|
||||||
i = LLIST_TS_FIND_NEXT(i, today, apoint_inday);
|
i = LLIST_TS_FIND_NEXT(i, today, apoint_inday);
|
||||||
apt = LLIST_TS_GET_DATA(i);
|
apt = LLIST_TS_GET_DATA(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (j && regex && regexec (regex, ra->mesg, 0, 0, 0) != 0)
|
while (j && regex && regexec(regex, ra->mesg, 0, 0, 0) != 0) {
|
||||||
{
|
|
||||||
j = LLIST_TS_FIND_NEXT(j, today, recur_apoint_inday);
|
j = LLIST_TS_FIND_NEXT(j, today, recur_apoint_inday);
|
||||||
ra = LLIST_TS_GET_DATA(j);
|
ra = LLIST_TS_GET_DATA(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apt && ra)
|
if (apt && ra) {
|
||||||
{
|
|
||||||
if (recur_apoint_find_occurrence(ra, today, &occurrence) &&
|
if (recur_apoint_find_occurrence(ra, today, &occurrence) &&
|
||||||
apt->start <= occurrence)
|
apt->start <= occurrence)
|
||||||
ra = NULL;
|
ra = NULL;
|
||||||
@@ -394,32 +368,25 @@ app_arg (int add_line, struct date *day, long date, const char *fmt_apt,
|
|||||||
apt = NULL;
|
apt = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apt)
|
if (apt) {
|
||||||
{
|
|
||||||
app_found = 1;
|
app_found = 1;
|
||||||
if (add_line)
|
if (add_line) {
|
||||||
{
|
|
||||||
fputs("\n", stdout);
|
fputs("\n", stdout);
|
||||||
add_line = 0;
|
add_line = 0;
|
||||||
}
|
}
|
||||||
if (print_date)
|
if (print_date) {
|
||||||
{
|
|
||||||
arg_print_date(today);
|
arg_print_date(today);
|
||||||
print_date = 0;
|
print_date = 0;
|
||||||
}
|
}
|
||||||
print_apoint(fmt_apt, today, apt);
|
print_apoint(fmt_apt, today, apt);
|
||||||
i = LLIST_TS_FIND_NEXT(i, today, apoint_inday);
|
i = LLIST_TS_FIND_NEXT(i, today, apoint_inday);
|
||||||
}
|
} else if (ra) {
|
||||||
else if (ra)
|
|
||||||
{
|
|
||||||
app_found = 1;
|
app_found = 1;
|
||||||
if (add_line)
|
if (add_line) {
|
||||||
{
|
|
||||||
fputs("\n", stdout);
|
fputs("\n", stdout);
|
||||||
add_line = 0;
|
add_line = 0;
|
||||||
}
|
}
|
||||||
if (print_date)
|
if (print_date) {
|
||||||
{
|
|
||||||
arg_print_date(today);
|
arg_print_date(today);
|
||||||
print_date = 0;
|
print_date = 0;
|
||||||
}
|
}
|
||||||
@@ -436,8 +403,7 @@ app_arg (int add_line, struct date *day, long date, const char *fmt_apt,
|
|||||||
return app_found;
|
return app_found;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void more_info(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);
|
"or read the manpage.\n"), stdout);
|
||||||
@@ -458,8 +424,7 @@ display_app (struct tm *t, int numdays, int add_line, const char *fmt_apt,
|
|||||||
int i, app_found;
|
int i, app_found;
|
||||||
struct date day;
|
struct date day;
|
||||||
|
|
||||||
for (i = 0; i < numdays; i++)
|
for (i = 0; i < numdays; i++) {
|
||||||
{
|
|
||||||
day.dd = t->tm_mday;
|
day.dd = t->tm_mday;
|
||||||
day.mm = t->tm_mon + 1;
|
day.mm = t->tm_mon + 1;
|
||||||
day.yyyy = t->tm_year + 1900;
|
day.yyyy = t->tm_year + 1900;
|
||||||
@@ -493,10 +458,8 @@ date_arg (const char *ddate, int add_line, const char *fmt_apt,
|
|||||||
* was entered, and then call app_arg() to print appointments
|
* was entered, and then call app_arg() to print appointments
|
||||||
*/
|
*/
|
||||||
arg_len = strlen(ddate);
|
arg_len = strlen(ddate);
|
||||||
if (arg_len <= 4)
|
if (arg_len <= 4) { /* a number of days was entered */
|
||||||
{ /* a number of days was entered */
|
for (i = 0; i <= arg_len - 1; i++) {
|
||||||
for (i = 0; i <= arg_len - 1; i++)
|
|
||||||
{
|
|
||||||
if (isdigit(ddate[i]))
|
if (isdigit(ddate[i]))
|
||||||
num_digit++;
|
num_digit++;
|
||||||
}
|
}
|
||||||
@@ -512,16 +475,11 @@ date_arg (const char *ddate, int add_line, const char *fmt_apt,
|
|||||||
t = *localtime(&timer);
|
t = *localtime(&timer);
|
||||||
display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
||||||
regex);
|
regex);
|
||||||
}
|
} else { /* a date was entered */
|
||||||
else
|
|
||||||
{ /* a date was entered */
|
|
||||||
if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy,
|
if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy,
|
||||||
(int *)&day.mm, (int *)&day.dd, NULL))
|
(int *)&day.mm, (int *)&day.dd, NULL)) {
|
||||||
{
|
|
||||||
app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, regex);
|
app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, regex);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
char outstr[BUFSIZ];
|
char outstr[BUFSIZ];
|
||||||
fputs(_("Argument to the '-d' flag is not valid\n"), stderr);
|
fputs(_("Argument to the '-d' flag is not valid\n"), stderr);
|
||||||
snprintf(outstr, BUFSIZ,
|
snprintf(outstr, BUFSIZ,
|
||||||
@@ -553,11 +511,9 @@ date_arg_extended (const char *startday, const char *range, int add_line,
|
|||||||
/*
|
/*
|
||||||
* Check arguments and extract information
|
* Check arguments and extract information
|
||||||
*/
|
*/
|
||||||
if (range != NULL)
|
if (range != NULL) {
|
||||||
{
|
|
||||||
arg_len = strlen(range);
|
arg_len = strlen(range);
|
||||||
for (i = 0; i <= arg_len - 1; i++)
|
for (i = 0; i <= arg_len - 1; i++) {
|
||||||
{
|
|
||||||
if (!isdigit(range[i]))
|
if (!isdigit(range[i]))
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
@@ -566,27 +522,20 @@ date_arg_extended (const char *startday, const char *range, int add_line,
|
|||||||
}
|
}
|
||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
t = *localtime(&timer);
|
t = *localtime(&timer);
|
||||||
if (startday != NULL)
|
if (startday != NULL) {
|
||||||
{
|
|
||||||
if (parse_date(startday, conf.input_datefmt, (int *)&t.tm_year,
|
if (parse_date(startday, conf.input_datefmt, (int *)&t.tm_year,
|
||||||
(int *)&t.tm_mon, (int *)&t.tm_mday, NULL))
|
(int *)&t.tm_mon, (int *)&t.tm_mday, NULL)) {
|
||||||
{
|
|
||||||
t.tm_year -= 1900;
|
t.tm_year -= 1900;
|
||||||
t.tm_mon--;
|
t.tm_mon--;
|
||||||
mktime(&t);
|
mktime(&t);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error) {
|
||||||
{
|
|
||||||
display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
||||||
regex);
|
regex);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
char outstr[BUFSIZ];
|
char outstr[BUFSIZ];
|
||||||
fputs(_("Argument is not valid\n"), stderr);
|
fputs(_("Argument is not valid\n"), stderr);
|
||||||
snprintf(outstr, BUFSIZ,
|
snprintf(outstr, BUFSIZ,
|
||||||
@@ -598,13 +547,11 @@ date_arg_extended (const char *startday, const char *range, int add_line,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse the command-line arguments and call the appropriate
|
* Parse the command-line arguments and call the appropriate
|
||||||
* routines to handle those arguments. Also initialize the data paths.
|
* routines to handle those arguments. Also initialize the data paths.
|
||||||
*/
|
*/
|
||||||
int
|
int parse_args(int argc, char **argv)
|
||||||
parse_args (int argc, char **argv)
|
|
||||||
{
|
{
|
||||||
int ch, add_line = 0;
|
int ch, add_line = 0;
|
||||||
int unknown_flag = 0;
|
int unknown_flag = 0;
|
||||||
@@ -637,8 +584,7 @@ parse_args (int argc, char **argv)
|
|||||||
|
|
||||||
/* Long options only */
|
/* Long options only */
|
||||||
int statusflag = 0; /* --status: get the status of running instances */
|
int statusflag = 0; /* --status: get the status of running instances */
|
||||||
enum
|
enum {
|
||||||
{
|
|
||||||
STATUS_OPT = CHAR_MAX + 1
|
STATUS_OPT = CHAR_MAX + 1
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -671,10 +617,8 @@ parse_args (int argc, char **argv)
|
|||||||
{NULL, no_argument, NULL, 0}
|
{NULL, no_argument, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
while ((ch = getopt_long (argc, argv, optstr, longopts, NULL)) != -1)
|
while ((ch = getopt_long(argc, argv, optstr, longopts, NULL)) != -1) {
|
||||||
{
|
switch (ch) {
|
||||||
switch (ch)
|
|
||||||
{
|
|
||||||
case STATUS_OPT:
|
case STATUS_OPT:
|
||||||
statusflag = 1;
|
statusflag = 1;
|
||||||
break;
|
break;
|
||||||
@@ -729,8 +673,7 @@ parse_args (int argc, char **argv)
|
|||||||
startday = optarg;
|
startday = optarg;
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
EXIT_IF (Sflag > 0,
|
EXIT_IF(Sflag > 0, _("Can not handle more than one regular expression."));
|
||||||
_("Can not handle more than one regular expression."));
|
|
||||||
Sflag = 1;
|
Sflag = 1;
|
||||||
if (regcomp(®, optarg, REG_EXTENDED))
|
if (regcomp(®, optarg, REG_EXTENDED))
|
||||||
EXIT(_("Could not compile regular expression."));
|
EXIT(_("Could not compile regular expression."));
|
||||||
@@ -741,17 +684,14 @@ parse_args (int argc, char **argv)
|
|||||||
multiple_flag++;
|
multiple_flag++;
|
||||||
load_data++;
|
load_data++;
|
||||||
add_line = 1;
|
add_line = 1;
|
||||||
if (optarg != NULL)
|
if (optarg != NULL) {
|
||||||
{
|
|
||||||
tnum = atoi(optarg);
|
tnum = atoi(optarg);
|
||||||
if (tnum < 0 || tnum > 9)
|
if (tnum < 0 || tnum > 9) {
|
||||||
{
|
|
||||||
usage();
|
usage();
|
||||||
usage_try();
|
usage_try();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
tnum = -1;
|
tnum = -1;
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
@@ -761,23 +701,19 @@ parse_args (int argc, char **argv)
|
|||||||
xflag = 1;
|
xflag = 1;
|
||||||
multiple_flag++;
|
multiple_flag++;
|
||||||
load_data++;
|
load_data++;
|
||||||
if (optarg != NULL)
|
if (optarg != NULL) {
|
||||||
{
|
|
||||||
if (strcmp(optarg, "ical") == 0)
|
if (strcmp(optarg, "ical") == 0)
|
||||||
xfmt = IO_EXPORT_ICAL;
|
xfmt = IO_EXPORT_ICAL;
|
||||||
else if (strcmp(optarg, "pcal") == 0)
|
else if (strcmp(optarg, "pcal") == 0)
|
||||||
xfmt = IO_EXPORT_PCAL;
|
xfmt = IO_EXPORT_PCAL;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
fputs(_("Argument for '-x' should be either "
|
fputs(_("Argument for '-x' should be either "
|
||||||
"'ical' or 'pcal'\n"), stderr);
|
"'ical' or 'pcal'\n"), stderr);
|
||||||
usage();
|
usage();
|
||||||
usage_try();
|
usage_try();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
xfmt = IO_EXPORT_ICAL;
|
xfmt = IO_EXPORT_ICAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -809,53 +745,36 @@ parse_args (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
|
|
||||||
if (argc >= 1)
|
if (argc >= 1) {
|
||||||
{
|
|
||||||
usage();
|
usage();
|
||||||
usage_try();
|
usage_try();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
/* Incorrect arguments */
|
/* Incorrect arguments */
|
||||||
}
|
} else if (Dflag && cflag) {
|
||||||
else if (Dflag && cflag)
|
fputs(_("Options '-D' and '-c' cannot be used at the same time\n"), stderr);
|
||||||
{
|
|
||||||
fputs (_("Options '-D' and '-c' cannot be used at the same time\n"),
|
|
||||||
stderr);
|
|
||||||
usage();
|
usage();
|
||||||
usage_try();
|
usage_try();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
} else if (Sflag && !(aflag || dflag || rflag || sflag || tflag)) {
|
||||||
else if (Sflag && !(aflag || dflag || rflag || sflag || tflag))
|
|
||||||
{
|
|
||||||
fputs(_("Option '-S' must be used with either '-d', '-r', '-s', "
|
fputs(_("Option '-S' must be used with either '-d', '-r', '-s', "
|
||||||
"'-a' or '-t'\n"), stderr);
|
"'-a' or '-t'\n"), stderr);
|
||||||
usage();
|
usage();
|
||||||
usage_try();
|
usage_try();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
} else {
|
||||||
else
|
if (unknown_flag) {
|
||||||
{
|
|
||||||
if (unknown_flag)
|
|
||||||
{
|
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
} else if (hflag) {
|
||||||
else if (hflag)
|
|
||||||
{
|
|
||||||
help_arg();
|
help_arg();
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
} else if (vflag) {
|
||||||
else if (vflag)
|
|
||||||
{
|
|
||||||
version_arg();
|
version_arg();
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
} else if (statusflag) {
|
||||||
else if (statusflag)
|
|
||||||
{
|
|
||||||
io_init(cfile, datadir);
|
io_init(cfile, datadir);
|
||||||
status_arg();
|
status_arg();
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
} else if (gflag) {
|
||||||
else if (gflag)
|
|
||||||
{
|
|
||||||
io_init(cfile, datadir);
|
io_init(cfile, datadir);
|
||||||
io_check_dir(path_dir, NULL);
|
io_check_dir(path_dir, NULL);
|
||||||
io_check_dir(path_notes, NULL);
|
io_check_dir(path_notes, NULL);
|
||||||
@@ -865,17 +784,13 @@ parse_args (int argc, char **argv)
|
|||||||
io_load_todo();
|
io_load_todo();
|
||||||
note_gc();
|
note_gc();
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
} else if (multiple_flag) {
|
||||||
else if (multiple_flag)
|
if (load_data) {
|
||||||
{
|
|
||||||
if (load_data)
|
|
||||||
{
|
|
||||||
io_init(cfile, datadir);
|
io_init(cfile, datadir);
|
||||||
io_check_dir(path_dir, NULL);
|
io_check_dir(path_dir, NULL);
|
||||||
io_check_dir(path_notes, NULL);
|
io_check_dir(path_notes, NULL);
|
||||||
}
|
}
|
||||||
if (iflag)
|
if (iflag) {
|
||||||
{
|
|
||||||
io_check_file(path_apts, NULL);
|
io_check_file(path_apts, NULL);
|
||||||
io_check_file(path_todo, NULL);
|
io_check_file(path_todo, NULL);
|
||||||
/* Get default pager in case we need to show a log file. */
|
/* Get default pager in case we need to show a log file. */
|
||||||
@@ -887,8 +802,7 @@ parse_args (int argc, char **argv)
|
|||||||
io_save_todo();
|
io_save_todo();
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
}
|
||||||
if (xflag)
|
if (xflag) {
|
||||||
{
|
|
||||||
io_check_file(path_apts, NULL);
|
io_check_file(path_apts, NULL);
|
||||||
io_check_file(path_todo, NULL);
|
io_check_file(path_todo, NULL);
|
||||||
io_load_app();
|
io_load_app();
|
||||||
@@ -897,36 +811,30 @@ parse_args (int argc, char **argv)
|
|||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
return non_interactive;
|
return non_interactive;
|
||||||
}
|
}
|
||||||
if (tflag)
|
if (tflag) {
|
||||||
{
|
|
||||||
io_check_file(path_todo, NULL);
|
io_check_file(path_todo, NULL);
|
||||||
io_load_todo();
|
io_load_todo();
|
||||||
todo_arg(tnum, fmt_todo, preg);
|
todo_arg(tnum, fmt_todo, preg);
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
}
|
||||||
if (nflag)
|
if (nflag) {
|
||||||
{
|
|
||||||
io_check_file(path_apts, NULL);
|
io_check_file(path_apts, NULL);
|
||||||
io_load_app();
|
io_load_app();
|
||||||
next_arg();
|
next_arg();
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
}
|
||||||
if (dflag || rflag || sflag)
|
if (dflag || rflag || sflag) {
|
||||||
{
|
|
||||||
io_check_file(path_apts, NULL);
|
io_check_file(path_apts, NULL);
|
||||||
io_check_file(path_conf, NULL);
|
io_check_file(path_conf, NULL);
|
||||||
io_load_app();
|
io_load_app();
|
||||||
config_load(); /* To get output date format. */
|
config_load(); /* To get output date format. */
|
||||||
if (dflag)
|
if (dflag)
|
||||||
date_arg (ddate, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
date_arg(ddate, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg);
|
||||||
preg);
|
|
||||||
if (rflag || sflag)
|
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);
|
fmt_rapt, fmt_ev, fmt_rev, preg);
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
} else if (aflag) {
|
||||||
else if (aflag)
|
|
||||||
{
|
|
||||||
struct date day;
|
struct date day;
|
||||||
|
|
||||||
io_check_file(path_apts, NULL);
|
io_check_file(path_apts, NULL);
|
||||||
@@ -935,13 +843,10 @@ parse_args (int argc, char **argv)
|
|||||||
config_load(); /* To get output date format. */
|
config_load(); /* To get output date format. */
|
||||||
io_load_app();
|
io_load_app();
|
||||||
day.dd = day.mm = day.yyyy = 0;
|
day.dd = day.mm = day.yyyy = 0;
|
||||||
app_arg (add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev,
|
app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg);
|
||||||
preg);
|
|
||||||
non_interactive = 1;
|
non_interactive = 1;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
non_interactive = 0;
|
non_interactive = 0;
|
||||||
io_init(cfile, datadir);
|
io_init(cfile, datadir);
|
||||||
}
|
}
|
||||||
|
|||||||
135
src/calcurse.c
135
src/calcurse.c
@@ -42,8 +42,7 @@
|
|||||||
* Store the events and appointments for the selected day and reset the
|
* Store the events and appointments for the selected day and reset the
|
||||||
* appointment highlight pointer if a new day was selected.
|
* appointment highlight pointer if a new day was selected.
|
||||||
*/
|
*/
|
||||||
static struct day_items_nb
|
static struct day_items_nb do_storage(int day_changed)
|
||||||
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);
|
day_changed, &inday);
|
||||||
@@ -61,8 +60,7 @@ do_storage (int day_changed)
|
|||||||
* and one can choose between different color schemes and layouts.
|
* and one can choose between different color schemes and layouts.
|
||||||
* All of the commands are documented within an online help system.
|
* All of the commands are documented within an online help system.
|
||||||
*/
|
*/
|
||||||
int
|
int main(int argc, char **argv)
|
||||||
main (int argc, char **argv)
|
|
||||||
{
|
{
|
||||||
struct day_items_nb inday;
|
struct day_items_nb inday;
|
||||||
int no_data_file = 1;
|
int no_data_file = 1;
|
||||||
@@ -87,13 +85,10 @@ main (int argc, char **argv)
|
|||||||
* Begin by parsing and handling command line arguments.
|
* Begin by parsing and handling command line arguments.
|
||||||
* The data path is also initialized here.
|
* The data path is also initialized here.
|
||||||
*/
|
*/
|
||||||
if (parse_args (argc, argv))
|
if (parse_args(argc, argv)) {
|
||||||
{
|
|
||||||
/* Non-interactive mode. */
|
/* Non-interactive mode. */
|
||||||
exit_calcurse(EXIT_SUCCESS);
|
exit_calcurse(EXIT_SUCCESS);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
no_data_file = io_check_data_files();
|
no_data_file = io_check_data_files();
|
||||||
dmon_stop();
|
dmon_stop();
|
||||||
io_set_lock();
|
io_set_lock();
|
||||||
@@ -110,16 +105,14 @@ main (int argc, char **argv)
|
|||||||
wins_get_config();
|
wins_get_config();
|
||||||
|
|
||||||
/* Check if terminal supports color. */
|
/* Check if terminal supports color. */
|
||||||
if (has_colors ())
|
if (has_colors()) {
|
||||||
{
|
|
||||||
colorize = 1;
|
colorize = 1;
|
||||||
background = COLOR_BLACK;
|
background = COLOR_BLACK;
|
||||||
foreground = COLOR_WHITE;
|
foreground = COLOR_WHITE;
|
||||||
start_color();
|
start_color();
|
||||||
|
|
||||||
#ifdef NCURSES_VERSION
|
#ifdef NCURSES_VERSION
|
||||||
if (use_default_colors () != ERR)
|
if (use_default_colors() != ERR) {
|
||||||
{
|
|
||||||
background = -1;
|
background = -1;
|
||||||
foreground = -1;
|
foreground = -1;
|
||||||
}
|
}
|
||||||
@@ -135,9 +128,7 @@ main (int argc, char **argv)
|
|||||||
init_pair(COLR_DEFAULT, foreground, background);
|
init_pair(COLR_DEFAULT, foreground, background);
|
||||||
init_pair(COLR_HIGH, COLOR_BLACK, COLOR_GREEN);
|
init_pair(COLR_HIGH, COLOR_BLACK, COLOR_GREEN);
|
||||||
init_pair(COLR_CUSTOM, COLOR_RED, background);
|
init_pair(COLR_CUSTOM, COLOR_RED, background);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
colorize = 0;
|
colorize = 0;
|
||||||
background = COLOR_BLACK;
|
background = COLOR_BLACK;
|
||||||
}
|
}
|
||||||
@@ -159,8 +150,7 @@ main (int argc, char **argv)
|
|||||||
io_load_todo();
|
io_load_todo();
|
||||||
io_load_app();
|
io_load_app();
|
||||||
wins_reinit();
|
wins_reinit();
|
||||||
if (conf.system_dialogs)
|
if (conf.system_dialogs) {
|
||||||
{
|
|
||||||
wins_update(FLAG_ALL);
|
wins_update(FLAG_ALL);
|
||||||
io_startup_screen(no_data_file);
|
io_startup_screen(no_data_file);
|
||||||
}
|
}
|
||||||
@@ -176,19 +166,16 @@ main (int argc, char **argv)
|
|||||||
io_start_psave_thread();
|
io_start_psave_thread();
|
||||||
|
|
||||||
/* User input */
|
/* User input */
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
int key;
|
int key;
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
wins_reset();
|
wins_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
key = keys_getch(win[STA].p, &count);
|
key = keys_getch(win[STA].p, &count);
|
||||||
switch (key)
|
switch (key) {
|
||||||
{
|
|
||||||
case KEY_GENERIC_REDRAW:
|
case KEY_GENERIC_REDRAW:
|
||||||
resize = 1;
|
resize = 1;
|
||||||
break;
|
break;
|
||||||
@@ -198,15 +185,13 @@ main (int argc, char **argv)
|
|||||||
wins_slctd_next();
|
wins_slctd_next();
|
||||||
|
|
||||||
/* Select the event to highlight. */
|
/* Select the event to highlight. */
|
||||||
switch (wins_slctd ())
|
switch (wins_slctd()) {
|
||||||
{
|
|
||||||
case TOD:
|
case TOD:
|
||||||
if ((todo_hilt() == 0) && (todo_nb() > 0))
|
if ((todo_hilt() == 0) && (todo_nb() > 0))
|
||||||
todo_hilt_set(1);
|
todo_hilt_set(1);
|
||||||
break;
|
break;
|
||||||
case APP:
|
case APP:
|
||||||
if ((apoint_hilt () == 0) &&
|
if ((apoint_hilt() == 0) && ((inday.nb_events + inday.nb_apoints) > 0))
|
||||||
((inday.nb_events + inday.nb_apoints) > 0))
|
|
||||||
apoint_hilt_set(1);
|
apoint_hilt_set(1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -261,8 +246,7 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_ADD_ITEM:
|
case KEY_ADD_ITEM:
|
||||||
switch (wins_slctd ())
|
switch (wins_slctd()) {
|
||||||
{
|
|
||||||
case APP:
|
case APP:
|
||||||
apoint_add();
|
apoint_add();
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
@@ -280,36 +264,29 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_EDIT_ITEM:
|
case KEY_EDIT_ITEM:
|
||||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||||
{
|
|
||||||
day_edit_item();
|
day_edit_item();
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||||
}
|
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
|
||||||
{
|
|
||||||
todo_edit_item();
|
todo_edit_item();
|
||||||
wins_update(FLAG_TOD | FLAG_STA);
|
wins_update(FLAG_TOD | FLAG_STA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_DEL_ITEM:
|
case KEY_DEL_ITEM:
|
||||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||||
{
|
|
||||||
apoint_delete(&inday.nb_events, &inday.nb_apoints);
|
apoint_delete(&inday.nb_events, &inday.nb_apoints);
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
|
||||||
}
|
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
|
||||||
{
|
|
||||||
todo_delete();
|
todo_delete();
|
||||||
wins_update(FLAG_TOD | FLAG_STA);
|
wins_update(FLAG_TOD | FLAG_STA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_GENERIC_CUT:
|
case KEY_GENERIC_CUT:
|
||||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||||
{
|
|
||||||
cut_item = apoint_cut(&inday.nb_events, &inday.nb_apoints);
|
cut_item = apoint_cut(&inday.nb_events, &inday.nb_apoints);
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
@@ -317,8 +294,7 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_GENERIC_PASTE:
|
case KEY_GENERIC_PASTE:
|
||||||
if (wins_slctd () == APP)
|
if (wins_slctd() == APP) {
|
||||||
{
|
|
||||||
apoint_paste(&inday.nb_events, &inday.nb_apoints, cut_item);
|
apoint_paste(&inday.nb_events, &inday.nb_apoints, cut_item);
|
||||||
cut_item = 0;
|
cut_item = 0;
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
@@ -334,14 +310,11 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_FLAG_ITEM:
|
case KEY_FLAG_ITEM:
|
||||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||||
{
|
|
||||||
apoint_switch_notify();
|
apoint_switch_notify();
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
wins_update(FLAG_APP);
|
wins_update(FLAG_APP);
|
||||||
}
|
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
|
||||||
{
|
|
||||||
todo_flag();
|
todo_flag();
|
||||||
wins_update(FLAG_TOD);
|
wins_update(FLAG_TOD);
|
||||||
}
|
}
|
||||||
@@ -357,8 +330,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
case KEY_RAISE_PRIORITY:
|
case KEY_RAISE_PRIORITY:
|
||||||
case KEY_LOWER_PRIORITY:
|
case KEY_LOWER_PRIORITY:
|
||||||
if (wins_slctd () == TOD && todo_hilt () != 0)
|
if (wins_slctd() == TOD && todo_hilt() != 0) {
|
||||||
{
|
|
||||||
todo_chg_priority(key);
|
todo_chg_priority(key);
|
||||||
if (todo_hilt_pos() < 0)
|
if (todo_hilt_pos() < 0)
|
||||||
todo_set_first(todo_hilt());
|
todo_set_first(todo_hilt());
|
||||||
@@ -369,12 +341,10 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_EDIT_NOTE:
|
case KEY_EDIT_NOTE:
|
||||||
if (wins_slctd () == APP && apoint_hilt () != 0)
|
if (wins_slctd() == APP && apoint_hilt() != 0) {
|
||||||
{
|
|
||||||
day_edit_note(conf.editor);
|
day_edit_note(conf.editor);
|
||||||
inday = do_storage(0);
|
inday = do_storage(0);
|
||||||
}
|
} else if (wins_slctd() == TOD && todo_hilt() != 0)
|
||||||
else if (wins_slctd () == TOD && todo_hilt () != 0)
|
|
||||||
todo_edit_note(conf.editor);
|
todo_edit_note(conf.editor);
|
||||||
wins_update(FLAG_ALL);
|
wins_update(FLAG_ALL);
|
||||||
break;
|
break;
|
||||||
@@ -408,10 +378,8 @@ main (int argc, char **argv)
|
|||||||
case KEY_GENERIC_EXPORT:
|
case KEY_GENERIC_EXPORT:
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
io_export_bar();
|
io_export_bar();
|
||||||
while ((key = wgetch (win[STA].p)) != 'q')
|
while ((key = wgetch(win[STA].p)) != 'q') {
|
||||||
{
|
switch (key) {
|
||||||
switch (key)
|
|
||||||
{
|
|
||||||
case 'I':
|
case 'I':
|
||||||
case 'i':
|
case 'i':
|
||||||
io_export_data(IO_EXPORT_ICAL);
|
io_export_data(IO_EXPORT_ICAL);
|
||||||
@@ -432,8 +400,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
case KEY_GENERIC_NEXT_DAY:
|
case KEY_GENERIC_NEXT_DAY:
|
||||||
case KEY_MOVE_RIGHT:
|
case KEY_MOVE_RIGHT:
|
||||||
if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_DAY)
|
if (wins_slctd() == CAL || key == KEY_GENERIC_NEXT_DAY) {
|
||||||
{
|
|
||||||
calendar_move(RIGHT, count);
|
calendar_move(RIGHT, count);
|
||||||
inday = do_storage(1);
|
inday = do_storage(1);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
@@ -442,8 +409,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
case KEY_GENERIC_PREV_DAY:
|
case KEY_GENERIC_PREV_DAY:
|
||||||
case KEY_MOVE_LEFT:
|
case KEY_MOVE_LEFT:
|
||||||
if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_DAY)
|
if (wins_slctd() == CAL || key == KEY_GENERIC_PREV_DAY) {
|
||||||
{
|
|
||||||
calendar_move(LEFT, count);
|
calendar_move(LEFT, count);
|
||||||
inday = do_storage(1);
|
inday = do_storage(1);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
@@ -452,22 +418,17 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
case KEY_GENERIC_PREV_WEEK:
|
case KEY_GENERIC_PREV_WEEK:
|
||||||
case KEY_MOVE_UP:
|
case KEY_MOVE_UP:
|
||||||
if (wins_slctd () == CAL || key == KEY_GENERIC_PREV_WEEK)
|
if (wins_slctd() == CAL || key == KEY_GENERIC_PREV_WEEK) {
|
||||||
{
|
|
||||||
calendar_move(UP, count);
|
calendar_move(UP, count);
|
||||||
inday = do_storage(1);
|
inday = do_storage(1);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
}
|
} else if (wins_slctd() == APP) {
|
||||||
else if (wins_slctd () == APP)
|
|
||||||
{
|
|
||||||
if (count >= apoint_hilt())
|
if (count >= apoint_hilt())
|
||||||
count = apoint_hilt() - 1;
|
count = apoint_hilt() - 1;
|
||||||
apoint_hilt_decrease(count);
|
apoint_hilt_decrease(count);
|
||||||
apoint_scroll_pad_up(inday.nb_events);
|
apoint_scroll_pad_up(inday.nb_events);
|
||||||
wins_update(FLAG_APP);
|
wins_update(FLAG_APP);
|
||||||
}
|
} else if (wins_slctd() == TOD) {
|
||||||
else if (wins_slctd () == TOD)
|
|
||||||
{
|
|
||||||
if (count >= todo_hilt())
|
if (count >= todo_hilt())
|
||||||
count = todo_hilt() - 1;
|
count = todo_hilt() - 1;
|
||||||
todo_hilt_decrease(count);
|
todo_hilt_decrease(count);
|
||||||
@@ -479,22 +440,17 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
case KEY_GENERIC_NEXT_WEEK:
|
case KEY_GENERIC_NEXT_WEEK:
|
||||||
case KEY_MOVE_DOWN:
|
case KEY_MOVE_DOWN:
|
||||||
if (wins_slctd () == CAL || key == KEY_GENERIC_NEXT_WEEK)
|
if (wins_slctd() == CAL || key == KEY_GENERIC_NEXT_WEEK) {
|
||||||
{
|
|
||||||
calendar_move(DOWN, count);
|
calendar_move(DOWN, count);
|
||||||
inday = do_storage(1);
|
inday = do_storage(1);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
}
|
} else if (wins_slctd() == APP) {
|
||||||
else if (wins_slctd () == APP)
|
|
||||||
{
|
|
||||||
if (count > inday.nb_events + inday.nb_apoints - apoint_hilt())
|
if (count > inday.nb_events + inday.nb_apoints - apoint_hilt())
|
||||||
count = inday.nb_events + inday.nb_apoints - apoint_hilt();
|
count = inday.nb_events + inday.nb_apoints - apoint_hilt();
|
||||||
apoint_hilt_increase(count);
|
apoint_hilt_increase(count);
|
||||||
apoint_scroll_pad_down(inday.nb_events, win[APP].h);
|
apoint_scroll_pad_down(inday.nb_events, win[APP].h);
|
||||||
wins_update(FLAG_APP);
|
wins_update(FLAG_APP);
|
||||||
}
|
} else if (wins_slctd() == TOD) {
|
||||||
else if (wins_slctd () == TOD)
|
|
||||||
{
|
|
||||||
if (count > todo_nb() - todo_hilt())
|
if (count > todo_nb() - todo_hilt())
|
||||||
count = todo_nb() - todo_hilt();
|
count = todo_nb() - todo_hilt();
|
||||||
todo_hilt_increase(count);
|
todo_hilt_increase(count);
|
||||||
@@ -505,8 +461,7 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_START_OF_WEEK:
|
case KEY_START_OF_WEEK:
|
||||||
if (wins_slctd () == CAL)
|
if (wins_slctd() == CAL) {
|
||||||
{
|
|
||||||
calendar_move(WEEK_START, count);
|
calendar_move(WEEK_START, count);
|
||||||
inday = do_storage(1);
|
inday = do_storage(1);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
@@ -514,8 +469,7 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_END_OF_WEEK:
|
case KEY_END_OF_WEEK:
|
||||||
if (wins_slctd () == CAL)
|
if (wins_slctd() == CAL) {
|
||||||
{
|
|
||||||
calendar_move(WEEK_END, count);
|
calendar_move(WEEK_END, count);
|
||||||
inday = do_storage(1);
|
inday = do_storage(1);
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
@@ -523,16 +477,14 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_GENERIC_SCROLL_UP:
|
case KEY_GENERIC_SCROLL_UP:
|
||||||
if (wins_slctd () == CAL)
|
if (wins_slctd() == CAL) {
|
||||||
{
|
|
||||||
calendar_view_prev();
|
calendar_view_prev();
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_GENERIC_SCROLL_DOWN:
|
case KEY_GENERIC_SCROLL_DOWN:
|
||||||
if (wins_slctd () == CAL)
|
if (wins_slctd() == CAL) {
|
||||||
{
|
|
||||||
calendar_view_next();
|
calendar_view_next();
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
}
|
}
|
||||||
@@ -544,18 +496,15 @@ main (int argc, char **argv)
|
|||||||
if (conf.auto_gc)
|
if (conf.auto_gc)
|
||||||
note_gc();
|
note_gc();
|
||||||
|
|
||||||
if (conf.confirm_quit)
|
if (conf.confirm_quit) {
|
||||||
{
|
|
||||||
if (status_ask_bool(_("Do you really want to quit ?")) == 1)
|
if (status_ask_bool(_("Do you really want to quit ?")) == 1)
|
||||||
exit_calcurse(EXIT_SUCCESS);
|
exit_calcurse(EXIT_SUCCESS);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
wins_update(FLAG_STA);
|
wins_update(FLAG_STA);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
exit_calcurse(EXIT_SUCCESS);
|
exit_calcurse(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -270,8 +270,7 @@ struct date {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Appointment definition. */
|
/* Appointment definition. */
|
||||||
struct apoint
|
struct apoint {
|
||||||
{
|
|
||||||
long start; /* seconds since 1 jan 1970 */
|
long start; /* seconds since 1 jan 1970 */
|
||||||
long dur; /* duration of the appointment in seconds */
|
long dur; /* duration of the appointment in seconds */
|
||||||
|
|
||||||
@@ -826,25 +825,19 @@ struct recur_apoint *recur_apoint_scan (FILE *, struct tm, struct tm,
|
|||||||
char, int, struct tm, char *,
|
char, int, struct tm, char *,
|
||||||
llist_t *, char);
|
llist_t *, char);
|
||||||
struct recur_event *recur_event_scan(FILE *, struct tm, int, char,
|
struct recur_event *recur_event_scan(FILE *, struct tm, int, char,
|
||||||
int, struct tm, char *,
|
int, struct tm, char *, llist_t *);
|
||||||
llist_t *);
|
|
||||||
void recur_apoint_write(struct recur_apoint *, FILE *);
|
void recur_apoint_write(struct recur_apoint *, FILE *);
|
||||||
void recur_event_write(struct recur_event *, FILE *);
|
void recur_event_write(struct recur_event *, FILE *);
|
||||||
void recur_save_data(FILE *);
|
void recur_save_data(FILE *);
|
||||||
unsigned recur_item_find_occurrence(long, long, llist_t *, int,
|
unsigned recur_item_find_occurrence(long, long, llist_t *, int,
|
||||||
int, long, long, unsigned *);
|
int, long, long, unsigned *);
|
||||||
unsigned recur_apoint_find_occurrence (struct recur_apoint *,
|
unsigned recur_apoint_find_occurrence(struct recur_apoint *, long, unsigned *);
|
||||||
long, unsigned *);
|
unsigned recur_event_find_occurrence(struct recur_event *, long, unsigned *);
|
||||||
unsigned recur_event_find_occurrence (struct recur_event *, long,
|
unsigned recur_item_inday(long, long, llist_t *, int, int, long, long);
|
||||||
unsigned *);
|
|
||||||
unsigned recur_item_inday (long, long, llist_t *, int, int, long,
|
|
||||||
long);
|
|
||||||
unsigned recur_apoint_inday(struct recur_apoint *, long);
|
unsigned recur_apoint_inday(struct recur_apoint *, long);
|
||||||
unsigned recur_event_inday(struct recur_event *, long);
|
unsigned recur_event_inday(struct recur_event *, long);
|
||||||
void recur_event_erase (long, unsigned, unsigned,
|
void recur_event_erase(long, unsigned, unsigned, enum eraseflg);
|
||||||
enum eraseflg);
|
void recur_apoint_erase(long, unsigned, unsigned, enum eraseflg);
|
||||||
void recur_apoint_erase (long, unsigned, unsigned,
|
|
||||||
enum eraseflg);
|
|
||||||
void recur_repeat_item(void);
|
void recur_repeat_item(void);
|
||||||
void recur_exc_scan(llist_t *, FILE *);
|
void recur_exc_scan(llist_t *, FILE *);
|
||||||
struct notify_app *recur_apoint_check_next(struct notify_app *, long, long);
|
struct notify_app *recur_apoint_check_next(struct notify_app *, long, long);
|
||||||
@@ -913,8 +906,7 @@ long update_time_in_date (long, unsigned, unsigned);
|
|||||||
long get_sec_date(struct date);
|
long get_sec_date(struct date);
|
||||||
long min2sec(unsigned);
|
long min2sec(unsigned);
|
||||||
void draw_scrollbar(WINDOW *, int, int, int, int, int, unsigned);
|
void draw_scrollbar(WINDOW *, int, int, int, int, int, unsigned);
|
||||||
void item_in_popup (const char *, const char *, const char *,
|
void item_in_popup(const char *, const char *, const char *, const char *);
|
||||||
const char *);
|
|
||||||
long get_today(void);
|
long get_today(void);
|
||||||
long now(void);
|
long now(void);
|
||||||
char *nowstr(void);
|
char *nowstr(void);
|
||||||
@@ -922,8 +914,7 @@ long mystrtol (const char *);
|
|||||||
void print_bool_option_incolor(WINDOW *, unsigned, int, int);
|
void print_bool_option_incolor(WINDOW *, unsigned, int, int);
|
||||||
const char *get_tempdir(void);
|
const char *get_tempdir(void);
|
||||||
char *new_tempfile(const char *, int);
|
char *new_tempfile(const char *, int);
|
||||||
int parse_date (const char *, enum datefmt, int *, int *, int *,
|
int parse_date(const char *, enum datefmt, int *, int *, int *, struct date *);
|
||||||
struct date *);
|
|
||||||
int parse_time(const char *, unsigned *, unsigned *);
|
int parse_time(const char *, unsigned *, unsigned *);
|
||||||
int parse_duration(const char *, unsigned *);
|
int parse_duration(const char *, unsigned *);
|
||||||
void str_toupper(char *);
|
void str_toupper(char *);
|
||||||
@@ -935,8 +926,7 @@ int child_wait (int *, int *, int);
|
|||||||
void press_any_key(void);
|
void press_any_key(void);
|
||||||
void print_apoint(const char *, long, struct apoint *);
|
void print_apoint(const char *, long, struct apoint *);
|
||||||
void print_event(const char *, long, struct event *);
|
void print_event(const char *, long, struct event *);
|
||||||
void print_recur_apoint (const char *, long, unsigned,
|
void print_recur_apoint(const char *, long, unsigned, struct recur_apoint *);
|
||||||
struct recur_apoint *);
|
|
||||||
void print_recur_event(const char *, long, struct recur_event *);
|
void print_recur_event(const char *, long, struct recur_event *);
|
||||||
void print_todo(const char *, struct todo *);
|
void print_todo(const char *, struct todo *);
|
||||||
|
|
||||||
|
|||||||
203
src/calendar.c
203
src/calendar.c
@@ -80,47 +80,41 @@ static pthread_t calendar_t_date;
|
|||||||
static void draw_monthly_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_weekly_view(struct window *, struct date *, unsigned);
|
||||||
static void (*draw_calendar[CAL_VIEWS]) (struct window *, struct date *,
|
static void (*draw_calendar[CAL_VIEWS]) (struct window *, struct date *,
|
||||||
unsigned) =
|
unsigned) = {
|
||||||
{draw_monthly_view, draw_weekly_view};
|
draw_monthly_view, draw_weekly_view};
|
||||||
|
|
||||||
/* Switch between calendar views (monthly view is selected by default). */
|
/* Switch between calendar views (monthly view is selected by default). */
|
||||||
void
|
void calendar_view_next(void)
|
||||||
calendar_view_next (void)
|
|
||||||
{
|
{
|
||||||
calendar_view++;
|
calendar_view++;
|
||||||
if (calendar_view == CAL_VIEWS)
|
if (calendar_view == CAL_VIEWS)
|
||||||
calendar_view = 0;
|
calendar_view = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void calendar_view_prev(void)
|
||||||
calendar_view_prev (void)
|
|
||||||
{
|
{
|
||||||
if (calendar_view == 0)
|
if (calendar_view == 0)
|
||||||
calendar_view = CAL_VIEWS;
|
calendar_view = CAL_VIEWS;
|
||||||
calendar_view--;
|
calendar_view--;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void calendar_set_view(int view)
|
||||||
calendar_set_view (int view)
|
|
||||||
{
|
{
|
||||||
calendar_view = (view < 0 || view >= CAL_VIEWS) ? CAL_MONTH_VIEW : view;
|
calendar_view = (view < 0 || view >= CAL_VIEWS) ? CAL_MONTH_VIEW : view;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int calendar_get_view(void)
|
||||||
calendar_get_view (void)
|
|
||||||
{
|
{
|
||||||
return (int)calendar_view;
|
return (int)calendar_view;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Thread needed to update current date in calendar. */
|
/* Thread needed to update current date in calendar. */
|
||||||
/* ARGSUSED0 */
|
/* ARGSUSED0 */
|
||||||
static void *
|
static void *calendar_date_thread(void *arg)
|
||||||
calendar_date_thread (void *arg)
|
|
||||||
{
|
{
|
||||||
time_t actual, tomorrow;
|
time_t actual, tomorrow;
|
||||||
|
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
tomorrow = (time_t) (get_today() + DAYINSEC);
|
tomorrow = (time_t) (get_today() + DAYINSEC);
|
||||||
|
|
||||||
while ((actual = time(NULL)) < tomorrow)
|
while ((actual = time(NULL)) < tomorrow)
|
||||||
@@ -134,26 +128,22 @@ calendar_date_thread (void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Launch the calendar date thread. */
|
/* Launch the calendar date thread. */
|
||||||
void
|
void calendar_start_date_thread(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. */
|
/* Stop the calendar date thread. */
|
||||||
void
|
void calendar_stop_date_thread(void)
|
||||||
calendar_stop_date_thread (void)
|
|
||||||
{
|
|
||||||
if (calendar_t_date)
|
|
||||||
{
|
{
|
||||||
|
if (calendar_t_date) {
|
||||||
pthread_cancel(calendar_t_date);
|
pthread_cancel(calendar_t_date);
|
||||||
pthread_join(calendar_t_date, NULL);
|
pthread_join(calendar_t_date, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set static variable today to current date */
|
/* Set static variable today to current date */
|
||||||
void
|
void calendar_set_current_date(void)
|
||||||
calendar_set_current_date (void)
|
|
||||||
{
|
{
|
||||||
time_t timer;
|
time_t timer;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
@@ -169,11 +159,9 @@ calendar_set_current_date (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Needed to display sunday or monday as the first day of week in calendar. */
|
/* Needed to display sunday or monday as the first day of week in calendar. */
|
||||||
void
|
void calendar_set_first_day_of_week(enum wday first_day)
|
||||||
calendar_set_first_day_of_week (enum wday first_day)
|
|
||||||
{
|
|
||||||
switch (first_day)
|
|
||||||
{
|
{
|
||||||
|
switch (first_day) {
|
||||||
case SUNDAY:
|
case SUNDAY:
|
||||||
week_begins_on_monday = 0;
|
week_begins_on_monday = 0;
|
||||||
break;
|
break;
|
||||||
@@ -188,22 +176,19 @@ calendar_set_first_day_of_week (enum wday first_day)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Swap first day of week in calendar. */
|
/* Swap first day of week in calendar. */
|
||||||
void
|
void calendar_change_first_day_of_week(void)
|
||||||
calendar_change_first_day_of_week (void)
|
|
||||||
{
|
{
|
||||||
week_begins_on_monday = !week_begins_on_monday;
|
week_begins_on_monday = !week_begins_on_monday;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if week begins on monday, 0 otherwise. */
|
/* Return 1 if week begins on monday, 0 otherwise. */
|
||||||
unsigned
|
unsigned calendar_week_begins_on_monday(void)
|
||||||
calendar_week_begins_on_monday (void)
|
|
||||||
{
|
{
|
||||||
return week_begins_on_monday;
|
return week_begins_on_monday;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in the given variable with the current date. */
|
/* Fill in the given variable with the current date. */
|
||||||
void
|
void calendar_store_current_date(struct date *date)
|
||||||
calendar_store_current_date (struct date *date)
|
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&date_thread_mutex);
|
pthread_mutex_lock(&date_thread_mutex);
|
||||||
*date = today;
|
*date = today;
|
||||||
@@ -211,28 +196,24 @@ calendar_store_current_date (struct date *date)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This is to start at the current date in calendar. */
|
/* This is to start at the current date in calendar. */
|
||||||
void
|
void calendar_init_slctd_day(void)
|
||||||
calendar_init_slctd_day (void)
|
|
||||||
{
|
{
|
||||||
calendar_store_current_date(&slctd_day);
|
calendar_store_current_date(&slctd_day);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the selected day in calendar */
|
/* Return the selected day in calendar */
|
||||||
struct date *
|
struct date *calendar_get_slctd_day(void)
|
||||||
calendar_get_slctd_day (void)
|
|
||||||
{
|
{
|
||||||
return &slctd_day;
|
return &slctd_day;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returned value represents the selected day in calendar (in seconds) */
|
/* Returned value represents the selected day in calendar (in seconds) */
|
||||||
long
|
long calendar_get_slctd_day_sec(void)
|
||||||
calendar_get_slctd_day_sec (void)
|
|
||||||
{
|
{
|
||||||
return date2sec(slctd_day, 0, 0);
|
return date2sec(slctd_day, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int calendar_get_wday(struct date *date)
|
||||||
calendar_get_wday (struct date *date)
|
|
||||||
{
|
{
|
||||||
struct tm t;
|
struct tm t;
|
||||||
|
|
||||||
@@ -246,21 +227,17 @@ calendar_get_wday (struct date *date)
|
|||||||
return t.tm_wday;
|
return t.tm_wday;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
static unsigned months_to_days(unsigned month)
|
||||||
months_to_days (unsigned month)
|
|
||||||
{
|
{
|
||||||
return (month * 3057 - 3007) / 100;
|
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;
|
return year * 365L + year / 4 - year / 100 + year / 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long
|
static long ymd_to_scalar(unsigned year, unsigned month, unsigned day)
|
||||||
ymd_to_scalar (unsigned year, unsigned month, unsigned day)
|
|
||||||
{
|
{
|
||||||
long scalar;
|
long 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.
|
* Used to change date by adding a certain amount of days or weeks.
|
||||||
* Returns 0 on success, 1 otherwise.
|
* Returns 0 on success, 1 otherwise.
|
||||||
*/
|
*/
|
||||||
static int
|
static int date_change(struct tm *date, int delta_month, int delta_day)
|
||||||
date_change (struct tm *date, int delta_month, int delta_day)
|
|
||||||
{
|
{
|
||||||
struct tm t;
|
struct tm t;
|
||||||
|
|
||||||
@@ -288,8 +264,7 @@ date_change (struct tm *date, int delta_month, int delta_day)
|
|||||||
|
|
||||||
if (mktime(&t) == -1)
|
if (mktime(&t) == -1)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
*date = t;
|
*date = t;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -337,8 +312,7 @@ draw_monthly_view (struct window *cwin, struct date *current_day,
|
|||||||
|
|
||||||
/* print the days, with regards to the first day of the week */
|
/* print the days, with regards to the first day of the week */
|
||||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||||
for (j = 0; j < WEEKINDAYS; j++)
|
for (j = 0; j < WEEKINDAYS; j++) {
|
||||||
{
|
|
||||||
mvwprintw(cwin->p, ofs_y, ofs_x + 4 * j, "%s",
|
mvwprintw(cwin->p, ofs_y, ofs_x + 4 * j, "%s",
|
||||||
_(daynames[1 + j - sunday_first]));
|
_(daynames[1 + j - sunday_first]));
|
||||||
}
|
}
|
||||||
@@ -346,8 +320,7 @@ draw_monthly_view (struct window *cwin, struct date *current_day,
|
|||||||
|
|
||||||
day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7;
|
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.dd = c_day;
|
||||||
check_day.mm = slctd_day.mm;
|
check_day.mm = slctd_day.mm;
|
||||||
check_day.yyyy = slctd_day.yyyy;
|
check_day.yyyy = slctd_day.yyyy;
|
||||||
@@ -356,8 +329,7 @@ draw_monthly_view (struct window *cwin, struct date *current_day,
|
|||||||
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. */
|
/* 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_y++;
|
||||||
ofs_x = OFFX - day_1_sav - 4 * c_day;
|
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
|
if (c_day == current_day->dd
|
||||||
&& current_day->mm == slctd_day.mm
|
&& current_day->mm == slctd_day.mm
|
||||||
&& current_day->yyyy == slctd_day.yyyy
|
&& current_day->yyyy == slctd_day.yyyy
|
||||||
&& current_day->dd != slctd_day.dd)
|
&& current_day->dd != slctd_day.dd) {
|
||||||
{
|
|
||||||
custom_apply_attr(cwin->p, ATTR_LOWEST);
|
custom_apply_attr(cwin->p, ATTR_LOWEST);
|
||||||
mvwprintw(cwin->p, ofs_y + 1,
|
mvwprintw(cwin->p, ofs_y + 1,
|
||||||
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
||||||
custom_remove_attr(cwin->p, ATTR_LOWEST);
|
custom_remove_attr(cwin->p, ATTR_LOWEST);
|
||||||
}
|
} else if (c_day == slctd_day.dd) {
|
||||||
else if (c_day == slctd_day.dd)
|
|
||||||
{
|
|
||||||
/* This is the selected day, print it according to user's theme. */
|
/* This is the selected day, print it according to user's theme. */
|
||||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||||
mvwprintw(cwin->p, ofs_y + 1,
|
mvwprintw(cwin->p, ofs_y + 1,
|
||||||
ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
|
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
||||||
c_day);
|
|
||||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||||
}
|
} else if (item_this_day) {
|
||||||
else if (item_this_day)
|
|
||||||
{
|
|
||||||
custom_apply_attr(cwin->p, ATTR_LOW);
|
custom_apply_attr(cwin->p, ATTR_LOW);
|
||||||
mvwprintw(cwin->p, ofs_y + 1,
|
mvwprintw(cwin->p, ofs_y + 1,
|
||||||
ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
|
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
||||||
c_day);
|
|
||||||
custom_remove_attr(cwin->p, ATTR_LOW);
|
custom_remove_attr(cwin->p, ATTR_LOW);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
/* otherwise, print normal days in black */
|
/* otherwise, print normal days in black */
|
||||||
mvwprintw(cwin->p, ofs_y + 1,
|
mvwprintw(cwin->p, ofs_y + 1,
|
||||||
ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
|
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
||||||
c_day);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int weeknum(const struct tm *t, int firstweekday)
|
||||||
weeknum (const struct tm *t, int firstweekday)
|
|
||||||
{
|
{
|
||||||
int wday, wnum;
|
int wday, wnum;
|
||||||
|
|
||||||
wday = t->tm_wday;
|
wday = t->tm_wday;
|
||||||
if (firstweekday == MONDAY)
|
if (firstweekday == MONDAY) {
|
||||||
{
|
|
||||||
if (wday == SUNDAY)
|
if (wday == SUNDAY)
|
||||||
wday = 6;
|
wday = 6;
|
||||||
else
|
else
|
||||||
@@ -421,8 +382,7 @@ weeknum (const struct tm *t, int firstweekday)
|
|||||||
/*
|
/*
|
||||||
* Compute the week number according to ISO 8601.
|
* Compute the week number according to ISO 8601.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ISO8601weeknum(const struct tm *t)
|
||||||
ISO8601weeknum (const struct tm *t)
|
|
||||||
{
|
{
|
||||||
int wnum, jan1day;
|
int wnum, jan1day;
|
||||||
|
|
||||||
@@ -432,8 +392,7 @@ ISO8601weeknum (const struct tm *t)
|
|||||||
if (jan1day < 0)
|
if (jan1day < 0)
|
||||||
jan1day += WEEKINDAYS;
|
jan1day += WEEKINDAYS;
|
||||||
|
|
||||||
switch (jan1day)
|
switch (jan1day) {
|
||||||
{
|
|
||||||
case MONDAY:
|
case MONDAY:
|
||||||
break;
|
break;
|
||||||
case TUESDAY:
|
case TUESDAY:
|
||||||
@@ -444,8 +403,7 @@ ISO8601weeknum (const struct tm *t)
|
|||||||
case FRIDAY:
|
case FRIDAY:
|
||||||
case SATURDAY:
|
case SATURDAY:
|
||||||
case SUNDAY:
|
case SUNDAY:
|
||||||
if (wnum == 0)
|
if (wnum == 0) {
|
||||||
{
|
|
||||||
/* Get week number of last week of last year. */
|
/* Get week number of last week of last year. */
|
||||||
struct tm dec31ly; /* 12/31 last year */
|
struct tm dec31ly; /* 12/31 last year */
|
||||||
|
|
||||||
@@ -460,8 +418,7 @@ ISO8601weeknum (const struct tm *t)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->tm_mon == 11)
|
if (t->tm_mon == 11) {
|
||||||
{
|
|
||||||
int wday, mday;
|
int wday, mday;
|
||||||
|
|
||||||
wday = t->tm_wday;
|
wday = t->tm_wday;
|
||||||
@@ -509,8 +466,7 @@ draw_weekly_view (struct window *cwin, struct date *current_day,
|
|||||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||||
|
|
||||||
/* Now draw calendar view. */
|
/* Now draw calendar view. */
|
||||||
for (j = 0; j < WEEKINDAYS; j++)
|
for (j = 0; j < WEEKINDAYS; j++) {
|
||||||
{
|
|
||||||
struct date date;
|
struct date date;
|
||||||
unsigned attr, item_this_day;
|
unsigned attr, item_this_day;
|
||||||
int i, slices[DAYSLICESNO];
|
int i, slices[DAYSLICESNO];
|
||||||
@@ -548,14 +504,11 @@ draw_weekly_view (struct window *cwin, struct date *current_day,
|
|||||||
|
|
||||||
/* Draw slices indicating appointment times. */
|
/* Draw slices indicating appointment times. */
|
||||||
memset(slices, 0, DAYSLICESNO * sizeof *slices);
|
memset(slices, 0, DAYSLICESNO * sizeof *slices);
|
||||||
if (day_chk_busy_slices (date, DAYSLICESNO, slices))
|
if (day_chk_busy_slices(date, DAYSLICESNO, slices)) {
|
||||||
{
|
for (i = 0; i < DAYSLICESNO; i++) {
|
||||||
for (i = 0; i < DAYSLICESNO; i++)
|
|
||||||
{
|
|
||||||
if (j != WEEKINDAYS - 1 && i != DAYSLICESNO - 1)
|
if (j != WEEKINDAYS - 1 && i != DAYSLICESNO - 1)
|
||||||
mvwhline(cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2);
|
mvwhline(cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2);
|
||||||
if (slices[i])
|
if (slices[i]) {
|
||||||
{
|
|
||||||
int highlight;
|
int highlight;
|
||||||
|
|
||||||
highlight = (t.tm_mday == slctd_day.dd) ? 1 : 0;
|
highlight = (t.tm_mday == slctd_day.dd) ? 1 : 0;
|
||||||
@@ -586,8 +539,7 @@ draw_weekly_view (struct window *cwin, struct date *current_day,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Function used to display the calendar panel. */
|
/* Function used to display the calendar panel. */
|
||||||
void
|
void calendar_update_panel(struct window *cwin)
|
||||||
calendar_update_panel (struct window *cwin)
|
|
||||||
{
|
{
|
||||||
struct date current_day;
|
struct date current_day;
|
||||||
unsigned sunday_first;
|
unsigned sunday_first;
|
||||||
@@ -603,8 +555,7 @@ calendar_update_panel (struct window *cwin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set the selected day in calendar to current day. */
|
/* Set the selected day in calendar to current day. */
|
||||||
void
|
void calendar_goto_today(void)
|
||||||
calendar_goto_today (void)
|
|
||||||
{
|
{
|
||||||
struct date today;
|
struct date today;
|
||||||
|
|
||||||
@@ -620,8 +571,7 @@ calendar_goto_today (void)
|
|||||||
* If the entered date is empty, automatically jump to the current date.
|
* If the entered date is empty, automatically jump to the current date.
|
||||||
* slctd_day is updated with the newly selected date.
|
* slctd_day is updated with the newly selected date.
|
||||||
*/
|
*/
|
||||||
void
|
void calendar_change_day(int datefmt)
|
||||||
calendar_change_day (int datefmt)
|
|
||||||
{
|
{
|
||||||
#define LDAY 11
|
#define LDAY 11
|
||||||
char selected_day[LDAY] = "";
|
char selected_day[LDAY] = "";
|
||||||
@@ -634,30 +584,24 @@ calendar_change_day (int datefmt)
|
|||||||
const char *mesg_line2 = _("Press [ENTER] to continue");
|
const char *mesg_line2 = _("Press [ENTER] to continue");
|
||||||
const char *request_date = "Enter the day to go to [ENTER for today] : %s";
|
const char *request_date = "Enter the day to go to [ENTER for today] : %s";
|
||||||
|
|
||||||
while (wrong_day)
|
while (wrong_day) {
|
||||||
{
|
|
||||||
snprintf(outstr, BUFSIZ, request_date, DATEFMT_DESC(datefmt));
|
snprintf(outstr, BUFSIZ, request_date, DATEFMT_DESC(datefmt));
|
||||||
status_mesg(_(outstr), "");
|
status_mesg(_(outstr), "");
|
||||||
if (getstring(win[STA].p, selected_day, LDAY, 0, 1) == GETSTRING_ESC)
|
if (getstring(win[STA].p, selected_day, LDAY, 0, 1) == GETSTRING_ESC)
|
||||||
return;
|
return;
|
||||||
else
|
else {
|
||||||
{
|
if (strlen(selected_day) == 0) {
|
||||||
if (strlen (selected_day) == 0)
|
|
||||||
{
|
|
||||||
wrong_day = 0;
|
wrong_day = 0;
|
||||||
calendar_goto_today();
|
calendar_goto_today();
|
||||||
}
|
} else if (parse_date(selected_day, datefmt, &dyear, &dmonth, &dday,
|
||||||
else if (parse_date (selected_day, datefmt, &dyear, &dmonth, &dday,
|
calendar_get_slctd_day())) {
|
||||||
calendar_get_slctd_day ()))
|
|
||||||
{
|
|
||||||
wrong_day = 0;
|
wrong_day = 0;
|
||||||
/* go to chosen day */
|
/* go to chosen day */
|
||||||
slctd_day.dd = dday;
|
slctd_day.dd = dday;
|
||||||
slctd_day.mm = dmonth;
|
slctd_day.mm = dmonth;
|
||||||
slctd_day.yyyy = dyear;
|
slctd_day.yyyy = dyear;
|
||||||
}
|
}
|
||||||
if (wrong_day)
|
if (wrong_day) {
|
||||||
{
|
|
||||||
status_mesg(mesg_line1, mesg_line2);
|
status_mesg(mesg_line1, mesg_line2);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
@@ -667,8 +611,7 @@ calendar_change_day (int datefmt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void calendar_move(enum move move, int count)
|
||||||
calendar_move (enum move move, int count)
|
|
||||||
{
|
{
|
||||||
int ret, days_to_remove, days_to_add;
|
int ret, days_to_remove, days_to_add;
|
||||||
struct tm t;
|
struct tm t;
|
||||||
@@ -678,8 +621,7 @@ calendar_move (enum move move, int count)
|
|||||||
t.tm_mon = slctd_day.mm - 1;
|
t.tm_mon = slctd_day.mm - 1;
|
||||||
t.tm_year = slctd_day.yyyy - 1900;
|
t.tm_year = slctd_day.yyyy - 1900;
|
||||||
|
|
||||||
switch (move)
|
switch (move) {
|
||||||
{
|
|
||||||
case UP:
|
case UP:
|
||||||
ret = date_change(&t, 0, -count * WEEKINDAYS);
|
ret = date_change(&t, 0, -count * WEEKINDAYS);
|
||||||
break;
|
break;
|
||||||
@@ -717,16 +659,12 @@ calendar_move (enum move move, int count)
|
|||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0) {
|
||||||
{
|
if (t.tm_year < 2) {
|
||||||
if (t.tm_year < 2)
|
|
||||||
{
|
|
||||||
t.tm_mday = 1;
|
t.tm_mday = 1;
|
||||||
t.tm_mon = 0;
|
t.tm_mon = 0;
|
||||||
t.tm_year = 2;
|
t.tm_year = 2;
|
||||||
}
|
} else if (t.tm_year > 137) {
|
||||||
else if (t.tm_year > 137)
|
|
||||||
{
|
|
||||||
t.tm_mday = 31;
|
t.tm_mday = 31;
|
||||||
t.tm_mon = 11;
|
t.tm_mon = 11;
|
||||||
t.tm_year = 137;
|
t.tm_year = 137;
|
||||||
@@ -739,8 +677,7 @@ calendar_move (enum move move, int count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the beginning of current year as a long. */
|
/* Returns the beginning of current year as a long. */
|
||||||
long
|
long calendar_start_of_year(void)
|
||||||
calendar_start_of_year (void)
|
|
||||||
{
|
{
|
||||||
time_t timer;
|
time_t timer;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
@@ -757,8 +694,7 @@ calendar_start_of_year (void)
|
|||||||
return (long)timer;
|
return (long)timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long calendar_end_of_year(void)
|
||||||
calendar_end_of_year (void)
|
|
||||||
{
|
{
|
||||||
time_t timer;
|
time_t timer;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
@@ -817,8 +753,7 @@ calendar_end_of_year (void)
|
|||||||
* dtor --
|
* dtor --
|
||||||
* convert degrees to radians
|
* convert degrees to radians
|
||||||
*/
|
*/
|
||||||
static double
|
static double dtor(double deg)
|
||||||
dtor (double deg)
|
|
||||||
{
|
{
|
||||||
return deg * M_PI / 180;
|
return deg * M_PI / 180;
|
||||||
}
|
}
|
||||||
@@ -827,8 +762,7 @@ dtor (double deg)
|
|||||||
* adj360 --
|
* adj360 --
|
||||||
* adjust value so 0 <= deg <= 360
|
* adjust value so 0 <= deg <= 360
|
||||||
*/
|
*/
|
||||||
static void
|
static void adj360(double *deg)
|
||||||
adj360 (double *deg)
|
|
||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
if (*deg < 0.0)
|
if (*deg < 0.0)
|
||||||
@@ -843,8 +777,7 @@ adj360 (double *deg)
|
|||||||
* potm --
|
* potm --
|
||||||
* return phase of the moon
|
* return phase of the moon
|
||||||
*/
|
*/
|
||||||
static double
|
static double potm(double days)
|
||||||
potm (double days)
|
|
||||||
{
|
{
|
||||||
double N, Msol, Ec, LambdaSol, l, Mm, Ev, Ac, A3, Mmprime;
|
double N, Msol, Ec, LambdaSol, l, Mm, Ev, Ac, A3, Mmprime;
|
||||||
double A4, lprime, V, ldprime, D, Nm;
|
double A4, lprime, V, ldprime, D, Nm;
|
||||||
@@ -886,8 +819,7 @@ potm (double days)
|
|||||||
* Updated to the Third Edition of Duffett-Smith's book, IX 1998
|
* Updated to the Third Edition of Duffett-Smith's book, IX 1998
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static double
|
static double pom(time_t tmpt)
|
||||||
pom (time_t tmpt)
|
|
||||||
{
|
{
|
||||||
struct tm *GMT;
|
struct tm *GMT;
|
||||||
double days;
|
double days;
|
||||||
@@ -910,8 +842,7 @@ pom (time_t tmpt)
|
|||||||
* Careful: date is the selected day in calendar at 00:00, so it represents
|
* Careful: date is the selected day in calendar at 00:00, so it represents
|
||||||
* the phase of the moon for previous day.
|
* the phase of the moon for previous day.
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *calendar_get_pom(time_t date)
|
||||||
calendar_get_pom (time_t date)
|
|
||||||
{
|
{
|
||||||
const char *pom_pict[MOON_PHASES] = { " ", "|) ", "(|)", "(| ", " | " };
|
const char *pom_pict[MOON_PHASES] = { " ", "|) ", "(|)", "(| ", " | " };
|
||||||
enum pom phase = NO_POM;
|
enum pom phase = NO_POM;
|
||||||
|
|||||||
166
src/config.c
166
src/config.c
@@ -82,22 +82,28 @@ static int config_serialize_input_datefmt (char *, void *);
|
|||||||
(config_fn_serialize_t) config_serialize_str, &(var)
|
(config_fn_serialize_t) config_serialize_str, &(var)
|
||||||
|
|
||||||
static const struct confvar confmap[] = {
|
static const struct confvar confmap[] = {
|
||||||
{ "appearance.calendarview", config_parse_calendar_view, config_serialize_calendar_view, NULL },
|
{"appearance.calendarview", config_parse_calendar_view,
|
||||||
|
config_serialize_calendar_view, NULL},
|
||||||
{"appearance.layout", config_parse_layout, config_serialize_layout, NULL},
|
{"appearance.layout", config_parse_layout, config_serialize_layout, NULL},
|
||||||
{"appearance.notifybar", CONFIG_HANDLER_BOOL(nbar.show)},
|
{"appearance.notifybar", CONFIG_HANDLER_BOOL(nbar.show)},
|
||||||
{ "appearance.sidebarwidth", config_parse_sidebar_width, config_serialize_sidebar_width, NULL },
|
{"appearance.sidebarwidth", config_parse_sidebar_width,
|
||||||
{ "appearance.theme", config_parse_color_theme, config_serialize_color_theme, NULL },
|
config_serialize_sidebar_width, NULL},
|
||||||
|
{"appearance.theme", config_parse_color_theme, config_serialize_color_theme,
|
||||||
|
NULL},
|
||||||
{"daemon.enable", CONFIG_HANDLER_BOOL(dmon.enable)},
|
{"daemon.enable", CONFIG_HANDLER_BOOL(dmon.enable)},
|
||||||
{"daemon.log", CONFIG_HANDLER_BOOL(dmon.log)},
|
{"daemon.log", CONFIG_HANDLER_BOOL(dmon.log)},
|
||||||
{ "format.inputdate", config_parse_input_datefmt, config_serialize_input_datefmt, NULL },
|
{"format.inputdate", config_parse_input_datefmt,
|
||||||
|
config_serialize_input_datefmt, NULL},
|
||||||
{"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)},
|
{"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)},
|
||||||
{"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)},
|
{"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)},
|
||||||
{ "format.outputdate", config_parse_output_datefmt, config_serialize_output_datefmt, NULL },
|
{"format.outputdate", config_parse_output_datefmt,
|
||||||
|
config_serialize_output_datefmt, NULL},
|
||||||
{"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)},
|
{"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)},
|
||||||
{"general.autosave", CONFIG_HANDLER_BOOL(conf.auto_save)},
|
{"general.autosave", CONFIG_HANDLER_BOOL(conf.auto_save)},
|
||||||
{"general.confirmdelete", CONFIG_HANDLER_BOOL(conf.confirm_delete)},
|
{"general.confirmdelete", CONFIG_HANDLER_BOOL(conf.confirm_delete)},
|
||||||
{"general.confirmquit", CONFIG_HANDLER_BOOL(conf.confirm_quit)},
|
{"general.confirmquit", CONFIG_HANDLER_BOOL(conf.confirm_quit)},
|
||||||
{ "general.firstdayofweek", config_parse_first_day_of_week, config_serialize_first_day_of_week, NULL },
|
{"general.firstdayofweek", config_parse_first_day_of_week,
|
||||||
|
config_serialize_first_day_of_week, NULL},
|
||||||
{"general.periodicsave", CONFIG_HANDLER_UNSIGNED(conf.periodic_save)},
|
{"general.periodicsave", CONFIG_HANDLER_UNSIGNED(conf.periodic_save)},
|
||||||
{"general.progressbar", CONFIG_HANDLER_BOOL(conf.progress_bar)},
|
{"general.progressbar", CONFIG_HANDLER_BOOL(conf.progress_bar)},
|
||||||
{"general.systemdialogs", CONFIG_HANDLER_BOOL(conf.system_dialogs)},
|
{"general.systemdialogs", CONFIG_HANDLER_BOOL(conf.system_dialogs)},
|
||||||
@@ -114,8 +120,7 @@ struct config_save_status {
|
|||||||
typedef int (*config_fn_walk_cb_t) (const char *, const char *, void *);
|
typedef int (*config_fn_walk_cb_t) (const char *, const char *, void *);
|
||||||
typedef int (*config_fn_walk_junk_cb_t) (const char *, void *);
|
typedef int (*config_fn_walk_junk_cb_t) (const char *, void *);
|
||||||
|
|
||||||
static int
|
static int config_parse_bool(unsigned *dest, const char *val)
|
||||||
config_parse_bool (unsigned *dest, const char *val)
|
|
||||||
{
|
{
|
||||||
if (strcmp(val, "yes") == 0)
|
if (strcmp(val, "yes") == 0)
|
||||||
*dest = 1;
|
*dest = 1;
|
||||||
@@ -127,8 +132,7 @@ config_parse_bool (unsigned *dest, const char *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_unsigned(unsigned *dest, const char *val)
|
||||||
config_parse_unsigned (unsigned *dest, const char *val)
|
|
||||||
{
|
{
|
||||||
if (is_all_digit(val))
|
if (is_all_digit(val))
|
||||||
*dest = atoi(val);
|
*dest = atoi(val);
|
||||||
@@ -138,8 +142,7 @@ config_parse_unsigned (unsigned *dest, const char *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_int(int *dest, const char *val)
|
||||||
config_parse_int (int *dest, const char *val)
|
|
||||||
{
|
{
|
||||||
if ((*val == '+' || *val == '-' || isdigit(*val)) && is_all_digit(val + 1))
|
if ((*val == '+' || *val == '-' || isdigit(*val)) && is_all_digit(val + 1))
|
||||||
*dest = atoi(val);
|
*dest = atoi(val);
|
||||||
@@ -149,15 +152,13 @@ config_parse_int (int *dest, const char *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_str(char *dest, const char *val)
|
||||||
config_parse_str (char *dest, const char *val)
|
|
||||||
{
|
{
|
||||||
strncpy(dest, val, BUFSIZ);
|
strncpy(dest, val, BUFSIZ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_color(int *dest, const char *val)
|
||||||
config_parse_color (int *dest, const char *val)
|
|
||||||
{
|
{
|
||||||
if (!strcmp(val, "black"))
|
if (!strcmp(val, "black"))
|
||||||
*dest = COLOR_BLACK;
|
*dest = COLOR_BLACK;
|
||||||
@@ -183,8 +184,7 @@ config_parse_color (int *dest, const char *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_color_pair(int *dest1, int *dest2, const char *val)
|
||||||
config_parse_color_pair (int *dest1, int *dest2, const char *val)
|
|
||||||
{
|
{
|
||||||
char s1[BUFSIZ], s2[BUFSIZ];
|
char s1[BUFSIZ], s2[BUFSIZ];
|
||||||
|
|
||||||
@@ -194,15 +194,13 @@ config_parse_color_pair (int *dest1, int *dest2, const char *val)
|
|||||||
return (config_parse_color(dest1, s1) && config_parse_color(dest2, s2));
|
return (config_parse_color(dest1, s1) && config_parse_color(dest2, s2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_calendar_view(void *dummy, const char *val)
|
||||||
config_parse_calendar_view (void *dummy, const char *val)
|
|
||||||
{
|
{
|
||||||
calendar_set_view(atoi(val));
|
calendar_set_view(atoi(val));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_first_day_of_week(void *dummy, const char *val)
|
||||||
config_parse_first_day_of_week (void *dummy, const char *val)
|
|
||||||
{
|
{
|
||||||
if (!strcmp(val, "monday"))
|
if (!strcmp(val, "monday"))
|
||||||
calendar_set_first_day_of_week(MONDAY);
|
calendar_set_first_day_of_week(MONDAY);
|
||||||
@@ -214,8 +212,7 @@ config_parse_first_day_of_week (void *dummy, const char *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_color_theme(void *dummy, const char *val)
|
||||||
config_parse_color_theme (void *dummy, const char *val)
|
|
||||||
{
|
{
|
||||||
int color1, color2;
|
int color1, color2;
|
||||||
if (!config_parse_color_pair(&color1, &color2, val))
|
if (!config_parse_color_pair(&color1, &color2, val))
|
||||||
@@ -224,51 +221,44 @@ config_parse_color_theme (void *dummy, const char *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_layout(void *dummy, const char *val)
|
||||||
config_parse_layout (void *dummy, const char *val)
|
|
||||||
{
|
{
|
||||||
wins_set_layout(atoi(val));
|
wins_set_layout(atoi(val));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_sidebar_width(void *dummy, const char *val)
|
||||||
config_parse_sidebar_width (void *dummy, const char *val)
|
|
||||||
{
|
{
|
||||||
wins_set_sbar_width(atoi(val));
|
wins_set_sbar_width(atoi(val));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_output_datefmt(void *dummy, const char *val)
|
||||||
config_parse_output_datefmt (void *dummy, const char *val)
|
|
||||||
{
|
{
|
||||||
if (val[0] != '\0')
|
if (val[0] != '\0')
|
||||||
return config_parse_str(conf.output_datefmt, val);
|
return config_parse_str(conf.output_datefmt, val);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_parse_input_datefmt(void *dummy, const char *val)
|
||||||
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)
|
if (conf.input_datefmt <= 0 || conf.input_datefmt >= DATE_FORMATS)
|
||||||
conf.input_datefmt = 1;
|
conf.input_datefmt = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set a configuration variable. */
|
/* Set a configuration variable. */
|
||||||
static int
|
static int config_set_conf(const char *key, const char *value)
|
||||||
config_set_conf (const char *key, const char *value)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!key)
|
if (!key)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < sizeof (confmap) / sizeof (confmap[0]); i++)
|
for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) {
|
||||||
{
|
|
||||||
if (!strcmp(confmap[i].key, key))
|
if (!strcmp(confmap[i].key, key))
|
||||||
return confmap[i].fn_parse(confmap[i].target, value);
|
return confmap[i].fn_parse(confmap[i].target, value);
|
||||||
}
|
}
|
||||||
@@ -276,18 +266,14 @@ config_set_conf (const char *key, const char *value)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_bool(char *dest, unsigned *val)
|
||||||
config_serialize_bool (char *dest, unsigned *val)
|
|
||||||
{
|
|
||||||
if (*val)
|
|
||||||
{
|
{
|
||||||
|
if (*val) {
|
||||||
dest[0] = 'y';
|
dest[0] = 'y';
|
||||||
dest[1] = 'e';
|
dest[1] = 'e';
|
||||||
dest[2] = 's';
|
dest[2] = 's';
|
||||||
dest[3] = '\0';
|
dest[3] = '\0';
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
dest[0] = 'n';
|
dest[0] = 'n';
|
||||||
dest[1] = 'o';
|
dest[1] = 'o';
|
||||||
dest[2] = '\0';
|
dest[2] = '\0';
|
||||||
@@ -296,22 +282,19 @@ config_serialize_bool (char *dest, unsigned *val)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_unsigned(char *dest, unsigned *val)
|
||||||
config_serialize_unsigned (char *dest, unsigned *val)
|
|
||||||
{
|
{
|
||||||
snprintf(dest, BUFSIZ, "%u", *val);
|
snprintf(dest, BUFSIZ, "%u", *val);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_int(char *dest, int *val)
|
||||||
config_serialize_int (char *dest, int *val)
|
|
||||||
{
|
{
|
||||||
snprintf(dest, BUFSIZ, "%d", *val);
|
snprintf(dest, BUFSIZ, "%d", *val);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_str(char *dest, const char *val)
|
||||||
config_serialize_str (char *dest, const char *val)
|
|
||||||
{
|
{
|
||||||
strncpy(dest, val, BUFSIZ);
|
strncpy(dest, val, BUFSIZ);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -325,8 +308,7 @@ config_serialize_str (char *dest, const char *val)
|
|||||||
* If ncurses library was compiled with --enable-ext-funcs,
|
* If ncurses library was compiled with --enable-ext-funcs,
|
||||||
* then default color is -1.
|
* then default color is -1.
|
||||||
*/
|
*/
|
||||||
static void
|
static void config_color_theme_name(char *theme_name)
|
||||||
config_color_theme_name (char *theme_name)
|
|
||||||
{
|
{
|
||||||
#define MAXCOLORS 8
|
#define MAXCOLORS 8
|
||||||
#define NBCOLORS 2
|
#define NBCOLORS 2
|
||||||
@@ -350,17 +332,14 @@ config_color_theme_name (char *theme_name)
|
|||||||
|
|
||||||
if (!colorize)
|
if (!colorize)
|
||||||
strncpy(theme_name, "0", BUFSIZ);
|
strncpy(theme_name, "0", BUFSIZ);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
pair_content(COLR_CUSTOM, &color[0], &color[1]);
|
pair_content(COLR_CUSTOM, &color[0], &color[1]);
|
||||||
for (i = 0; i < NBCOLORS; i++)
|
for (i = 0; i < NBCOLORS; i++) {
|
||||||
{
|
|
||||||
if ((color[i] == DEFAULTCOLOR) || (color[i] == DEFAULTCOLOR_EXT))
|
if ((color[i] == DEFAULTCOLOR) || (color[i] == DEFAULTCOLOR_EXT))
|
||||||
color_name[i] = default_color;
|
color_name[i] = default_color;
|
||||||
else if (color[i] >= 0 && color[i] <= MAXCOLORS)
|
else if (color[i] >= 0 && color[i] <= MAXCOLORS)
|
||||||
color_name[i] = name[color[i]];
|
color_name[i] = name[color[i]];
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
EXIT(_("unknown color"));
|
EXIT(_("unknown color"));
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
@@ -369,15 +348,13 @@ config_color_theme_name (char *theme_name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_calendar_view(char *buf, void *dummy)
|
||||||
config_serialize_calendar_view (char *buf, void *dummy)
|
|
||||||
{
|
{
|
||||||
int tmp = calendar_get_view();
|
int tmp = calendar_get_view();
|
||||||
return config_serialize_int(buf, &tmp);
|
return config_serialize_int(buf, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_first_day_of_week(char *buf, void *dummy)
|
||||||
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");
|
strcpy(buf, "monday");
|
||||||
@@ -387,35 +364,30 @@ config_serialize_first_day_of_week (char *buf, void *dummy)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_color_theme(char *buf, void *dummy)
|
||||||
config_serialize_color_theme (char *buf, void *dummy)
|
|
||||||
{
|
{
|
||||||
config_color_theme_name(buf);
|
config_color_theme_name(buf);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_layout(char *buf, void *dummy)
|
||||||
config_serialize_layout (char *buf, void *dummy)
|
|
||||||
{
|
{
|
||||||
int tmp = wins_layout();
|
int tmp = wins_layout();
|
||||||
return config_serialize_int(buf, &tmp);
|
return config_serialize_int(buf, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_sidebar_width(char *buf, void *dummy)
|
||||||
config_serialize_sidebar_width (char *buf, void *dummy)
|
|
||||||
{
|
{
|
||||||
int tmp = wins_sbar_wperc();
|
int tmp = wins_sbar_wperc();
|
||||||
return config_serialize_int(buf, &tmp);
|
return config_serialize_int(buf, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_serialize_output_datefmt(char *buf, void *dummy)
|
||||||
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
|
static int config_serialize_input_datefmt(char *buf, void *dummy)
|
||||||
config_serialize_input_datefmt (char *buf, void *dummy)
|
|
||||||
{
|
{
|
||||||
return config_serialize_int(buf, &conf.input_datefmt);
|
return config_serialize_int(buf, &conf.input_datefmt);
|
||||||
}
|
}
|
||||||
@@ -430,17 +402,13 @@ config_serialize_conf (char *buf, const char *key,
|
|||||||
if (!key)
|
if (!key)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < sizeof (confmap) / sizeof (confmap[0]); i++)
|
for (i = 0; i < sizeof(confmap) / sizeof(confmap[0]); i++) {
|
||||||
{
|
if (!strcmp(confmap[i].key, key)) {
|
||||||
if (!strcmp (confmap[i].key, key))
|
if (confmap[i].fn_serialize(buf, confmap[i].target)) {
|
||||||
{
|
|
||||||
if (confmap[i].fn_serialize (buf, confmap[i].target))
|
|
||||||
{
|
|
||||||
if (status)
|
if (status)
|
||||||
status->done[i] = 1;
|
status->done[i] = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -460,14 +428,12 @@ config_file_walk (config_fn_walk_cb_t fn_cb,
|
|||||||
EXIT_IF(data_file == NULL, _("failed to open configuration file"));
|
EXIT_IF(data_file == NULL, _("failed to open configuration file"));
|
||||||
|
|
||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
if (fgets(buf, sizeof buf, data_file) == NULL)
|
if (fgets(buf, sizeof buf, data_file) == NULL)
|
||||||
break;
|
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)
|
if (fn_junk_cb)
|
||||||
fn_junk_cb(buf, data);
|
fn_junk_cb(buf, data);
|
||||||
continue;
|
continue;
|
||||||
@@ -475,8 +441,7 @@ config_file_walk (config_fn_walk_cb_t fn_cb,
|
|||||||
|
|
||||||
key = e_conf;
|
key = e_conf;
|
||||||
value = strchr(e_conf, '=');
|
value = strchr(e_conf, '=');
|
||||||
if (value)
|
if (value) {
|
||||||
{
|
|
||||||
*value = '\0';
|
*value = '\0';
|
||||||
value++;
|
value++;
|
||||||
}
|
}
|
||||||
@@ -502,14 +467,12 @@ config_file_walk (config_fn_walk_cb_t fn_cb,
|
|||||||
strcmp(key, "output_datefmt") == 0 ||
|
strcmp(key, "output_datefmt") == 0 ||
|
||||||
strcmp(key, "input_datefmt") == 0 ||
|
strcmp(key, "input_datefmt") == 0 ||
|
||||||
strcmp(key, "notify-daemon_enable") == 0 ||
|
strcmp(key, "notify-daemon_enable") == 0 ||
|
||||||
strcmp(key, "notify-daemon_log") == 0)
|
strcmp(key, "notify-daemon_log") == 0) {
|
||||||
{
|
|
||||||
WARN_MSG(_("Pre-3.0.0 configuration file format detected, "
|
WARN_MSG(_("Pre-3.0.0 configuration file format detected, "
|
||||||
"please upgrade running `calcurse-upgrade`."));
|
"please upgrade running `calcurse-upgrade`."));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value && (*value == '\0' || *value == '\n'))
|
if (value && (*value == '\0' || *value == '\n')) {
|
||||||
{
|
|
||||||
/* Backward compatibility mode. */
|
/* Backward compatibility mode. */
|
||||||
if (fgets(buf, sizeof buf, data_file) == NULL)
|
if (fgets(buf, sizeof buf, data_file) == NULL)
|
||||||
break;
|
break;
|
||||||
@@ -523,8 +486,7 @@ config_file_walk (config_fn_walk_cb_t fn_cb,
|
|||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_load_cb(const char *key, const char *value, void *dummy)
|
||||||
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);
|
||||||
|
|
||||||
@@ -539,17 +501,16 @@ config_load_cb (const char *key, const char *value, void *dummy)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load the user configuration. */
|
/* Load the user configuration. */
|
||||||
void
|
void config_load(void)
|
||||||
config_load (void)
|
|
||||||
{
|
{
|
||||||
config_file_walk(config_load_cb, NULL, NULL);
|
config_file_walk(config_load_cb, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_save_cb(const char *key, const char *value, void *status)
|
||||||
config_save_cb (const char *key, const char *value, void *status)
|
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ];
|
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)
|
if (result < 0)
|
||||||
EXIT(_("configuration variable unknown: \"%s\""), key);
|
EXIT(_("configuration variable unknown: \"%s\""), key);
|
||||||
@@ -566,16 +527,14 @@ config_save_cb (const char *key, const char *value, void *status)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int config_save_junk_cb(const char *data, void *status)
|
||||||
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the user configuration. */
|
/* Save the user configuration. */
|
||||||
unsigned
|
unsigned config_save(void)
|
||||||
config_save (void)
|
|
||||||
{
|
{
|
||||||
char tmppath[BUFSIZ];
|
char tmppath[BUFSIZ];
|
||||||
char *tmpext;
|
char *tmpext;
|
||||||
@@ -601,8 +560,7 @@ config_save (void)
|
|||||||
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. */
|
/* 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])
|
if (!status.done[i])
|
||||||
config_save_cb(confmap[i].key, NULL, &status);
|
config_save_cb(confmap[i].key, NULL, &status);
|
||||||
}
|
}
|
||||||
|
|||||||
262
src/custom.c
262
src/custom.c
@@ -56,8 +56,7 @@ static struct attribute attr;
|
|||||||
* ATTR_LOW are for days inside calendar panel which contains an event
|
* ATTR_LOW are for days inside calendar panel which contains an event
|
||||||
* ATTR_LOWEST are for current day inside calendar panel
|
* ATTR_LOWEST are for current day inside calendar panel
|
||||||
*/
|
*/
|
||||||
void
|
void custom_init_attr(void)
|
||||||
custom_init_attr (void)
|
|
||||||
{
|
{
|
||||||
attr.color[ATTR_HIGHEST] = COLOR_PAIR(COLR_CUSTOM);
|
attr.color[ATTR_HIGHEST] = COLOR_PAIR(COLR_CUSTOM);
|
||||||
attr.color[ATTR_HIGH] = COLOR_PAIR(COLR_HIGH);
|
attr.color[ATTR_HIGH] = COLOR_PAIR(COLR_HIGH);
|
||||||
@@ -77,8 +76,7 @@ custom_init_attr (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Apply window attribute */
|
/* Apply window attribute */
|
||||||
void
|
void custom_apply_attr(WINDOW * win, int attr_num)
|
||||||
custom_apply_attr (WINDOW *win, int attr_num)
|
|
||||||
{
|
{
|
||||||
if (colorize)
|
if (colorize)
|
||||||
wattron(win, attr.color[attr_num]);
|
wattron(win, attr.color[attr_num]);
|
||||||
@@ -87,8 +85,7 @@ custom_apply_attr (WINDOW *win, int attr_num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Remove window attribute */
|
/* Remove window attribute */
|
||||||
void
|
void custom_remove_attr(WINDOW * win, int attr_num)
|
||||||
custom_remove_attr (WINDOW *win, int attr_num)
|
|
||||||
{
|
{
|
||||||
if (colorize)
|
if (colorize)
|
||||||
wattroff(win, attr.color[attr_num]);
|
wattroff(win, attr.color[attr_num]);
|
||||||
@@ -97,8 +94,7 @@ custom_remove_attr (WINDOW *win, int attr_num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Draws the configuration bar */
|
/* Draws the configuration bar */
|
||||||
void
|
void custom_config_bar(void)
|
||||||
custom_config_bar (void)
|
|
||||||
{
|
{
|
||||||
const int SMLSPC = 2;
|
const int SMLSPC = 2;
|
||||||
const int SPC = 15;
|
const int SPC = 15;
|
||||||
@@ -126,8 +122,7 @@ custom_config_bar (void)
|
|||||||
wins_doupdate();
|
wins_doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void layout_selection_bar(void)
|
||||||
layout_selection_bar (void)
|
|
||||||
{
|
{
|
||||||
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
||||||
struct binding select = { _("Select"), KEY_GENERIC_SELECT };
|
struct binding select = { _("Select"), KEY_GENERIC_SELECT };
|
||||||
@@ -150,8 +145,7 @@ layout_selection_bar (void)
|
|||||||
#define LAYOUTSPERCOL 2
|
#define LAYOUTSPERCOL 2
|
||||||
|
|
||||||
/* Used to display available layouts in layout configuration menu. */
|
/* Used to display available layouts in layout configuration menu. */
|
||||||
static void
|
static void display_layout_config(struct window *lwin, int mark, int cursor)
|
||||||
display_layout_config (struct window *lwin, int mark, int cursor)
|
|
||||||
{
|
{
|
||||||
#define CURSOR (32 | A_REVERSE)
|
#define CURSOR (32 | A_REVERSE)
|
||||||
#define MARK 88
|
#define MARK 88
|
||||||
@@ -163,34 +157,37 @@ display_layout_config (struct window *lwin, int mark, int cursor)
|
|||||||
const int COLSIZ = LAYOUTW + BOXSIZ + 1;
|
const int COLSIZ = LAYOUTW + BOXSIZ + 1;
|
||||||
const int XSPC = (lwin->w - NBCOLS * COLSIZ) / (NBCOLS + 1);
|
const int XSPC = (lwin->w - NBCOLS * COLSIZ) / (NBCOLS + 1);
|
||||||
const int XOFST = (lwin->w - NBCOLS * (XSPC + COLSIZ)) / 2;
|
const int XOFST = (lwin->w - NBCOLS * (XSPC + COLSIZ)) / 2;
|
||||||
const int YSPC = (lwin->h - 8 - LAYOUTSPERCOL * LAYOUTH) / (LAYOUTSPERCOL + 1);
|
const int YSPC =
|
||||||
|
(lwin->h - 8 - LAYOUTSPERCOL * LAYOUTH) / (LAYOUTSPERCOL + 1);
|
||||||
const int YOFST = (lwin->h - LAYOUTSPERCOL * (YSPC + LAYOUTH)) / 2;
|
const int YOFST = (lwin->h - LAYOUTSPERCOL * (YSPC + LAYOUTH)) / 2;
|
||||||
enum { YPOS, XPOS, NBPOS };
|
enum { YPOS, XPOS, NBPOS };
|
||||||
int pos[NBLAYOUTS][NBPOS];
|
int pos[NBLAYOUTS][NBPOS];
|
||||||
const char *layouts[LAYOUTH][NBLAYOUTS] = {
|
const char *layouts[LAYOUTH][NBLAYOUTS] = {
|
||||||
{"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+"},
|
{"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+",
|
||||||
{"| | c |", "| | t |", "| c | |", "| t | |", "| | c |", "| | a |", "| c | |", "| a | |"},
|
"+---+---+", "+---+---+", "+---+---+"},
|
||||||
{"| a +---+", "| a +---+", "+---+ a |", "|---+ a |", "| t +---+", "| t +---+", "+---+ t |", "+---+ t |"},
|
{"| | c |", "| | t |", "| c | |", "| t | |", "| | c |",
|
||||||
{"| | t |", "| | c |", "| t | |", "| c | |", "| | a |", "| | c |", "| a | |", "| c | |"},
|
"| | a |", "| c | |", "| a | |"},
|
||||||
{"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+"}
|
{"| a +---+", "| a +---+", "+---+ a |", "|---+ a |", "| t +---+",
|
||||||
|
"| t +---+", "+---+ t |", "+---+ t |"},
|
||||||
|
{"| | t |", "| | c |", "| t | |", "| c | |", "| | a |",
|
||||||
|
"| | c |", "| a | |", "| c | |"},
|
||||||
|
{"+---+---+", "+---+---+", "+---+---+", "+---+---+", "+---+---+",
|
||||||
|
"+---+---+", "+---+---+", "+---+---+"}
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < NBLAYOUTS; i++)
|
for (i = 0; i < NBLAYOUTS; i++) {
|
||||||
{
|
|
||||||
pos[i][YPOS] = YOFST + (i % LAYOUTSPERCOL) * (YSPC + LAYOUTH);
|
pos[i][YPOS] = YOFST + (i % LAYOUTSPERCOL) * (YSPC + LAYOUTH);
|
||||||
pos[i][XPOS] = XOFST + (i / LAYOUTSPERCOL) * (XSPC + COLSIZ);
|
pos[i][XPOS] = XOFST + (i / LAYOUTSPERCOL) * (XSPC + COLSIZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < NBLAYOUTS; i++)
|
for (i = 0; i < NBLAYOUTS; i++) {
|
||||||
{
|
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
mvwprintw(lwin->p, pos[i][YPOS] + 2, pos[i][XPOS], box);
|
mvwprintw(lwin->p, pos[i][YPOS] + 2, pos[i][XPOS], box);
|
||||||
if (i == mark)
|
if (i == mark)
|
||||||
custom_apply_attr(lwin->p, ATTR_HIGHEST);
|
custom_apply_attr(lwin->p, ATTR_HIGHEST);
|
||||||
for (j = 0; j < LAYOUTH; j++)
|
for (j = 0; j < LAYOUTH; j++) {
|
||||||
{
|
|
||||||
mvwprintw(lwin->p, pos[i][YPOS] + j, pos[i][XPOS] + BOXSIZ + 1,
|
mvwprintw(lwin->p, pos[i][YPOS] + j, pos[i][XPOS] + BOXSIZ + 1,
|
||||||
layouts[j][i]);
|
layouts[j][i]);
|
||||||
}
|
}
|
||||||
@@ -209,8 +206,7 @@ display_layout_config (struct window *lwin, int mark, int cursor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Choose the layout */
|
/* Choose the layout */
|
||||||
void
|
void custom_layout_config(void)
|
||||||
custom_layout_config (void)
|
|
||||||
{
|
{
|
||||||
struct scrollwin hwin;
|
struct scrollwin hwin;
|
||||||
struct window conf_win;
|
struct window conf_win;
|
||||||
@@ -222,8 +218,7 @@ custom_layout_config (void)
|
|||||||
"It is possible to choose between eight different configurations.\n"
|
"It is possible to choose between eight different configurations.\n"
|
||||||
"\nIn the configuration representations, letters correspond to:\n\n"
|
"\nIn the configuration representations, letters correspond to:\n\n"
|
||||||
" 'c' -> calendar panel\n\n"
|
" 'c' -> calendar panel\n\n"
|
||||||
" 'a' -> appointment panel\n\n"
|
" 'a' -> appointment panel\n\n" " 't' -> todo panel\n\n");
|
||||||
" 't' -> todo panel\n\n");
|
|
||||||
|
|
||||||
conf_win.p = NULL;
|
conf_win.p = NULL;
|
||||||
custom_confwin_init(&conf_win, label);
|
custom_confwin_init(&conf_win, label);
|
||||||
@@ -231,14 +226,11 @@ custom_layout_config (void)
|
|||||||
display_layout_config(&conf_win, mark, cursor);
|
display_layout_config(&conf_win, mark, cursor);
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
while ((ch = keys_getch (win[STA].p, NULL)) != KEY_GENERIC_QUIT)
|
while ((ch = keys_getch(win[STA].p, NULL)) != KEY_GENERIC_QUIT) {
|
||||||
{
|
|
||||||
need_reset = 0;
|
need_reset = 0;
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
case KEY_GENERIC_HELP:
|
case KEY_GENERIC_HELP:
|
||||||
help_wins_init (&hwin, 0, 0,
|
help_wins_init(&hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col);
|
||||||
(notify_bar ()) ? row - 3 : row - 2, col);
|
|
||||||
mvwprintw(hwin.pad.p, 1, 0, "%s", help_text);
|
mvwprintw(hwin.pad.p, 1, 0, "%s", help_text);
|
||||||
hwin.total_lines = 7;
|
hwin.total_lines = 7;
|
||||||
wins_scrollwin_display(&hwin);
|
wins_scrollwin_display(&hwin);
|
||||||
@@ -270,8 +262,7 @@ custom_layout_config (void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
endwin();
|
endwin();
|
||||||
wins_refresh();
|
wins_refresh();
|
||||||
@@ -292,8 +283,7 @@ custom_layout_config (void)
|
|||||||
#undef LAYOUTSPERCOL
|
#undef LAYOUTSPERCOL
|
||||||
|
|
||||||
/* Sidebar configuration screen. */
|
/* Sidebar configuration screen. */
|
||||||
void
|
void custom_sidebar_config(void)
|
||||||
custom_sidebar_config (void)
|
|
||||||
{
|
{
|
||||||
struct scrollwin hwin;
|
struct scrollwin hwin;
|
||||||
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
||||||
@@ -304,7 +294,8 @@ custom_sidebar_config (void)
|
|||||||
&inc, &dec, &help, &quit
|
&inc, &dec, &help, &quit
|
||||||
};
|
};
|
||||||
const char *help_text =
|
const char *help_text =
|
||||||
_("This configuration screen is used to change the width of the side bar.\n"
|
_
|
||||||
|
("This configuration screen is used to change the width of the side bar.\n"
|
||||||
"The side bar is the part of the screen which contains two panels:\n"
|
"The side bar is the part of the screen which contains two panels:\n"
|
||||||
"the calendar and, depending on the chosen layout, either the todo list\n"
|
"the calendar and, depending on the chosen layout, either the todo list\n"
|
||||||
"or the appointment list.\n\n"
|
"or the appointment list.\n\n"
|
||||||
@@ -318,10 +309,8 @@ custom_sidebar_config (void)
|
|||||||
bindings_size, NULL);
|
bindings_size, NULL);
|
||||||
wins_doupdate();
|
wins_doupdate();
|
||||||
|
|
||||||
while ((ch = keys_getch (win[STA].p, NULL)) != KEY_GENERIC_QUIT)
|
while ((ch = keys_getch(win[STA].p, NULL)) != KEY_GENERIC_QUIT) {
|
||||||
{
|
switch (ch) {
|
||||||
switch (ch)
|
|
||||||
{
|
|
||||||
case KEY_MOVE_UP:
|
case KEY_MOVE_UP:
|
||||||
wins_sbar_winc();
|
wins_sbar_winc();
|
||||||
break;
|
break;
|
||||||
@@ -329,8 +318,7 @@ custom_sidebar_config (void)
|
|||||||
wins_sbar_wdec();
|
wins_sbar_wdec();
|
||||||
break;
|
break;
|
||||||
case KEY_GENERIC_HELP:
|
case KEY_GENERIC_HELP:
|
||||||
help_wins_init (&hwin, 0, 0,
|
help_wins_init(&hwin, 0, 0, (notify_bar())? row - 3 : row - 2, col);
|
||||||
(notify_bar ()) ? row - 3 : row - 2, col);
|
|
||||||
mvwprintw(hwin.pad.p, 1, 0, "%s", help_text);
|
mvwprintw(hwin.pad.p, 1, 0, "%s", help_text);
|
||||||
hwin.total_lines = 6;
|
hwin.total_lines = 6;
|
||||||
wins_scrollwin_display(&hwin);
|
wins_scrollwin_display(&hwin);
|
||||||
@@ -343,13 +331,10 @@ custom_sidebar_config (void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
wins_reset();
|
wins_reset();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
wins_reinit_panels();
|
wins_reinit_panels();
|
||||||
wins_update_border(FLAG_ALL);
|
wins_update_border(FLAG_ALL);
|
||||||
wins_update_panels(FLAG_ALL);
|
wins_update_panels(FLAG_ALL);
|
||||||
@@ -360,8 +345,7 @@ custom_sidebar_config (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void set_confwin_attr(struct window *cwin)
|
||||||
set_confwin_attr (struct window *cwin)
|
|
||||||
{
|
{
|
||||||
cwin->h = (notify_bar())? row - 3 : row - 2;
|
cwin->h = (notify_bar())? row - 3 : row - 2;
|
||||||
cwin->w = col;
|
cwin->w = col;
|
||||||
@@ -372,11 +356,9 @@ set_confwin_attr (struct window *cwin)
|
|||||||
* Create a configuration window and initialize status and notification bar
|
* Create a configuration window and initialize status and notification bar
|
||||||
* (useful in case of window resize).
|
* (useful in case of window resize).
|
||||||
*/
|
*/
|
||||||
void
|
void custom_confwin_init(struct window *confwin, const char *label)
|
||||||
custom_confwin_init (struct window *confwin, const char *label)
|
|
||||||
{
|
|
||||||
if (confwin->p)
|
|
||||||
{
|
{
|
||||||
|
if (confwin->p) {
|
||||||
erase_window_part(confwin->p, confwin->x, confwin->y,
|
erase_window_part(confwin->p, confwin->x, confwin->y,
|
||||||
confwin->x + confwin->w, confwin->y + confwin->h);
|
confwin->x + confwin->w, confwin->y + confwin->h);
|
||||||
delwin(confwin->p);
|
delwin(confwin->p);
|
||||||
@@ -390,15 +372,13 @@ custom_confwin_init (struct window *confwin, const char *label)
|
|||||||
delwin(win[STA].p);
|
delwin(win[STA].p);
|
||||||
win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
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);
|
||||||
if (notify_bar ())
|
if (notify_bar()) {
|
||||||
{
|
|
||||||
notify_reinit_bar();
|
notify_reinit_bar();
|
||||||
notify_update_bar();
|
notify_update_bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void color_selection_bar(void)
|
||||||
color_selection_bar (void)
|
|
||||||
{
|
{
|
||||||
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
||||||
struct binding select = { _("Select"), KEY_GENERIC_SELECT };
|
struct binding select = { _("Select"), KEY_GENERIC_SELECT };
|
||||||
@@ -444,8 +424,7 @@ display_color_config (struct window *cwin, int *mark_fore, int *mark_back,
|
|||||||
const unsigned XSPC = (cwin->w - 2 * BARSIZ - 2 * BOXSIZ - 6) / 3;
|
const unsigned XSPC = (cwin->w - 2 * BARSIZ - 2 * BOXSIZ - 6) / 3;
|
||||||
const unsigned XFORE = XSPC;
|
const unsigned XFORE = XSPC;
|
||||||
const unsigned XBACK = 2 * XSPC + BOXSIZ + XOFST + BARSIZ;
|
const unsigned XBACK = 2 * XSPC + BOXSIZ + XOFST + BARSIZ;
|
||||||
enum
|
enum { YPOS, XPOS, NBPOS };
|
||||||
{ YPOS, XPOS, NBPOS };
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int pos[SIZE][NBPOS];
|
int pos[SIZE][NBPOS];
|
||||||
short colr_fore, colr_back;
|
short colr_fore, colr_back;
|
||||||
@@ -456,18 +435,15 @@ display_color_config (struct window *cwin, int *mark_fore, int *mark_back,
|
|||||||
COLR_MAGENTA, COLR_CYAN, COLR_DEFAULT
|
COLR_MAGENTA, COLR_CYAN, COLR_DEFAULT
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0; i < NBUSERCOLORS + 1; i++)
|
for (i = 0; i < NBUSERCOLORS + 1; i++) {
|
||||||
{
|
|
||||||
pos[i][YPOS] = Y + YSPC * (i + 1);
|
pos[i][YPOS] = Y + YSPC * (i + 1);
|
||||||
pos[NBUSERCOLORS + i + 1][YPOS] = Y + YSPC * (i + 1);
|
pos[NBUSERCOLORS + i + 1][YPOS] = Y + YSPC * (i + 1);
|
||||||
pos[i][XPOS] = XFORE;
|
pos[i][XPOS] = XFORE;
|
||||||
pos[NBUSERCOLORS + i + 1][XPOS] = XBACK;
|
pos[NBUSERCOLORS + i + 1][XPOS] = XBACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (colorize)
|
if (colorize) {
|
||||||
{
|
if (theme_changed) {
|
||||||
if (theme_changed)
|
|
||||||
{
|
|
||||||
pair_content(colr[*mark_fore], &colr_fore, 0L);
|
pair_content(colr[*mark_fore], &colr_fore, 0L);
|
||||||
if (colr_fore == 255)
|
if (colr_fore == 255)
|
||||||
colr_fore = -1;
|
colr_fore = -1;
|
||||||
@@ -475,9 +451,7 @@ display_color_config (struct window *cwin, int *mark_fore, int *mark_back,
|
|||||||
if (colr_back == 255)
|
if (colr_back == 255)
|
||||||
colr_back = -1;
|
colr_back = -1;
|
||||||
init_pair(COLR_CUSTOM, colr_fore, colr_back);
|
init_pair(COLR_CUSTOM, colr_fore, colr_back);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Retrieve the actual color theme. */
|
/* Retrieve the actual color theme. */
|
||||||
pair_content(COLR_CUSTOM, &colr_fore, &colr_back);
|
pair_content(COLR_CUSTOM, &colr_fore, &colr_back);
|
||||||
|
|
||||||
@@ -498,8 +472,7 @@ display_color_config (struct window *cwin, int *mark_fore, int *mark_back,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* color boxes */
|
/* color boxes */
|
||||||
for (i = 0; i < SIZE - 1; i++)
|
for (i = 0; i < SIZE - 1; i++) {
|
||||||
{
|
|
||||||
mvwprintw(cwin->p, pos[i][YPOS], pos[i][XPOS], box);
|
mvwprintw(cwin->p, pos[i][YPOS], pos[i][XPOS], box);
|
||||||
wattron(cwin->p, COLOR_PAIR(colr[i]) | A_REVERSE);
|
wattron(cwin->p, COLOR_PAIR(colr[i]) | A_REVERSE);
|
||||||
mvwprintw(cwin->p, pos[i][YPOS], pos[i][XPOS] + XOFST, bar);
|
mvwprintw(cwin->p, pos[i][YPOS], pos[i][XPOS] + XOFST, bar);
|
||||||
@@ -522,12 +495,9 @@ display_color_config (struct window *cwin, int *mark_fore, int *mark_back,
|
|||||||
mvwprintw(cwin->p, Y, XBACK + XOFST, back_txt);
|
mvwprintw(cwin->p, Y, XBACK + XOFST, back_txt);
|
||||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||||
|
|
||||||
if (colorize)
|
if (colorize) {
|
||||||
{
|
mvwaddch(cwin->p, pos[*mark_fore][YPOS], pos[*mark_fore][XPOS] + 1, MARK);
|
||||||
mvwaddch (cwin->p, pos[*mark_fore][YPOS],
|
mvwaddch(cwin->p, pos[*mark_back][YPOS], pos[*mark_back][XPOS] + 1, MARK);
|
||||||
pos[*mark_fore][XPOS] + 1, MARK);
|
|
||||||
mvwaddch (cwin->p, pos[*mark_back][YPOS],
|
|
||||||
pos[*mark_back][XPOS] + 1, MARK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mvwaddch(cwin->p, pos[cursor][YPOS], pos[cursor][XPOS] + 1, CURSOR);
|
mvwaddch(cwin->p, pos[cursor][YPOS], pos[cursor][XPOS] + 1, CURSOR);
|
||||||
@@ -540,8 +510,7 @@ display_color_config (struct window *cwin, int *mark_fore, int *mark_back,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Color theme configuration. */
|
/* Color theme configuration. */
|
||||||
void
|
void custom_color_config(void)
|
||||||
custom_color_config (void)
|
|
||||||
{
|
{
|
||||||
struct window conf_win;
|
struct window conf_win;
|
||||||
int ch, cursor, need_reset, theme_changed;
|
int ch, cursor, need_reset, theme_changed;
|
||||||
@@ -554,16 +523,15 @@ custom_color_config (void)
|
|||||||
mark_back = SIZE - 1;
|
mark_back = SIZE - 1;
|
||||||
cursor = 0;
|
cursor = 0;
|
||||||
theme_changed = 0;
|
theme_changed = 0;
|
||||||
display_color_config (&conf_win, &mark_fore, &mark_back, cursor, theme_changed);
|
display_color_config(&conf_win, &mark_fore, &mark_back, cursor,
|
||||||
|
theme_changed);
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
while ((ch = keys_getch (win[STA].p, NULL)) != KEY_GENERIC_QUIT)
|
while ((ch = keys_getch(win[STA].p, NULL)) != KEY_GENERIC_QUIT) {
|
||||||
{
|
|
||||||
need_reset = 0;
|
need_reset = 0;
|
||||||
theme_changed = 0;
|
theme_changed = 0;
|
||||||
|
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
case KEY_GENERIC_SELECT:
|
case KEY_GENERIC_SELECT:
|
||||||
colorize = 1;
|
colorize = 1;
|
||||||
need_reset = 1;
|
need_reset = 1;
|
||||||
@@ -600,8 +568,7 @@ custom_color_config (void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
endwin();
|
endwin();
|
||||||
wins_refresh();
|
wins_refresh();
|
||||||
@@ -619,8 +586,7 @@ custom_color_config (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Prints the general options. */
|
/* Prints the general options. */
|
||||||
static int
|
static int print_general_options(WINDOW * win)
|
||||||
print_general_options (WINDOW *win)
|
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
AUTO_SAVE,
|
AUTO_SAVE,
|
||||||
@@ -661,8 +627,7 @@ print_general_options (WINDOW *win)
|
|||||||
mvwprintw(win, y, XPOS, "[2] %s ", opt[AUTO_GC]);
|
mvwprintw(win, y, XPOS, "[2] %s ", opt[AUTO_GC]);
|
||||||
print_bool_option_incolor(win, conf.auto_gc, y,
|
print_bool_option_incolor(win, conf.auto_gc, y,
|
||||||
XPOS + 4 + strlen(opt[AUTO_GC]));
|
XPOS + 4 + strlen(opt[AUTO_GC]));
|
||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw(win, y + 1, XPOS, _("(run the garbage collector when quitting)"));
|
||||||
_("(run the garbage collector when quitting)"));
|
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw(win, y, XPOS, "[3] %s ", opt[PERIODIC_SAVE]);
|
mvwprintw(win, y, XPOS, "[3] %s ", opt[PERIODIC_SAVE]);
|
||||||
custom_apply_attr(win, ATTR_HIGHEST);
|
custom_apply_attr(win, ATTR_HIGHEST);
|
||||||
@@ -728,8 +693,7 @@ print_general_options (WINDOW *win)
|
|||||||
return y + YOFF;
|
return y + YOFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void custom_set_swsiz(struct scrollwin *sw)
|
||||||
custom_set_swsiz (struct scrollwin *sw)
|
|
||||||
{
|
{
|
||||||
sw->win.x = 0;
|
sw->win.x = 0;
|
||||||
sw->win.y = 0;
|
sw->win.y = 0;
|
||||||
@@ -743,14 +707,11 @@ custom_set_swsiz (struct scrollwin *sw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* General configuration. */
|
/* General configuration. */
|
||||||
void
|
void custom_general_config(void)
|
||||||
custom_general_config (void)
|
|
||||||
{
|
{
|
||||||
struct scrollwin cwin;
|
struct scrollwin cwin;
|
||||||
const char *number_str =
|
const char *number_str = _("Enter an option number to change its value");
|
||||||
_("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 *keys =
|
|
||||||
_("(Press '^P' or '^N' to move up or down, 'Q' to quit)");
|
|
||||||
const char *output_datefmt_str =
|
const char *output_datefmt_str =
|
||||||
_("Enter the date format (see 'man 3 strftime' for possible formats) ");
|
_("Enter the date format (see 'man 3 strftime' for possible formats) ");
|
||||||
const char *input_datefmt_str =
|
const char *input_datefmt_str =
|
||||||
@@ -771,12 +732,10 @@ custom_general_config (void)
|
|||||||
wins_scrollwin_display(&cwin);
|
wins_scrollwin_display(&cwin);
|
||||||
|
|
||||||
buf = mem_malloc(BUFSIZ);
|
buf = mem_malloc(BUFSIZ);
|
||||||
while ((ch = wgetch (win[STA].p)) != 'q')
|
while ((ch = wgetch(win[STA].p)) != 'q') {
|
||||||
{
|
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
case CTRL('N'):
|
case CTRL('N'):
|
||||||
wins_scrollwin_down(&cwin, 1);
|
wins_scrollwin_down(&cwin, 1);
|
||||||
break;
|
break;
|
||||||
@@ -791,8 +750,7 @@ custom_general_config (void)
|
|||||||
break;
|
break;
|
||||||
case '3':
|
case '3':
|
||||||
status_mesg(periodic_save_str, "");
|
status_mesg(periodic_save_str, "");
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
|
||||||
{
|
|
||||||
int val = atoi(buf);
|
int val = atoi(buf);
|
||||||
if (val >= 0)
|
if (val >= 0)
|
||||||
conf.periodic_save = val;
|
conf.periodic_save = val;
|
||||||
@@ -820,18 +778,15 @@ custom_general_config (void)
|
|||||||
break;
|
break;
|
||||||
case '9':
|
case '9':
|
||||||
status_mesg(output_datefmt_str, "");
|
status_mesg(output_datefmt_str, "");
|
||||||
strncpy (buf, conf.output_datefmt,
|
strncpy(buf, conf.output_datefmt, strlen(conf.output_datefmt) + 1);
|
||||||
strlen (conf.output_datefmt) + 1);
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
|
||||||
{
|
|
||||||
strncpy(conf.output_datefmt, buf, strlen(buf) + 1);
|
strncpy(conf.output_datefmt, buf, strlen(buf) + 1);
|
||||||
}
|
}
|
||||||
status_mesg(number_str, keys);
|
status_mesg(number_str, keys);
|
||||||
break;
|
break;
|
||||||
case '0':
|
case '0':
|
||||||
status_mesg(input_datefmt_str, "");
|
status_mesg(input_datefmt_str, "");
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
|
||||||
{
|
|
||||||
int val = atoi(buf);
|
int val = atoi(buf);
|
||||||
if (val > 0 && val <= DATE_FORMATS)
|
if (val > 0 && val <= DATE_FORMATS)
|
||||||
conf.input_datefmt = val;
|
conf.input_datefmt = val;
|
||||||
@@ -840,8 +795,7 @@ custom_general_config (void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
wins_reset();
|
wins_reset();
|
||||||
wins_scrollwin_delete(&cwin);
|
wins_scrollwin_delete(&cwin);
|
||||||
@@ -850,11 +804,9 @@ custom_general_config (void)
|
|||||||
wins_show(cwin.win.p, cwin.label);
|
wins_show(cwin.win.p, cwin.label);
|
||||||
cwin.first_visible_line = 0;
|
cwin.first_visible_line = 0;
|
||||||
delwin(win[STA].p);
|
delwin(win[STA].p);
|
||||||
win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y,
|
win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
||||||
win[STA].x);
|
|
||||||
keypad(win[STA].p, TRUE);
|
keypad(win[STA].p, TRUE);
|
||||||
if (notify_bar ())
|
if (notify_bar()) {
|
||||||
{
|
|
||||||
notify_reinit_bar();
|
notify_reinit_bar();
|
||||||
notify_update_bar();
|
notify_update_bar();
|
||||||
}
|
}
|
||||||
@@ -868,7 +820,6 @@ custom_general_config (void)
|
|||||||
wins_scrollwin_delete(&cwin);
|
wins_scrollwin_delete(&cwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_key_incolor(WINDOW * win, const char *option, int pos_y, int pos_x)
|
print_key_incolor(WINDOW * win, const char *option, int pos_y, int pos_x)
|
||||||
{
|
{
|
||||||
@@ -889,8 +840,7 @@ print_keys_bindings (WINDOW *win, int selected_row, int selected_elm, int yoff)
|
|||||||
int noelm, action, y;
|
int noelm, action, y;
|
||||||
|
|
||||||
noelm = y = 0;
|
noelm = y = 0;
|
||||||
for (action = 0; action < NBKEYS; action++)
|
for (action = 0; action < NBKEYS; action++) {
|
||||||
{
|
|
||||||
char actionstr[BUFSIZ];
|
char actionstr[BUFSIZ];
|
||||||
int nbkeys;
|
int nbkeys;
|
||||||
|
|
||||||
@@ -904,16 +854,13 @@ print_keys_bindings (WINDOW *win, int selected_row, int selected_elm, int yoff)
|
|||||||
mvwprintw(win, y, KEYPOS, _("undefined"));
|
mvwprintw(win, y, KEYPOS, _("undefined"));
|
||||||
if (action == selected_row)
|
if (action == selected_row)
|
||||||
custom_remove_attr(win, ATTR_HIGHEST);
|
custom_remove_attr(win, ATTR_HIGHEST);
|
||||||
if (nbkeys > 0)
|
if (nbkeys > 0) {
|
||||||
{
|
if (action == selected_row) {
|
||||||
if (action == selected_row)
|
|
||||||
{
|
|
||||||
const char *key;
|
const char *key;
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
pos = KEYPOS;
|
pos = KEYPOS;
|
||||||
while ((key = keys_action_nkey (action, noelm)) != NULL)
|
while ((key = keys_action_nkey(action, noelm)) != NULL) {
|
||||||
{
|
|
||||||
if (noelm == selected_elm)
|
if (noelm == selected_elm)
|
||||||
print_key_incolor(win, key, y, pos);
|
print_key_incolor(win, key, y, pos);
|
||||||
else
|
else
|
||||||
@@ -921,9 +868,7 @@ print_keys_bindings (WINDOW *win, int selected_row, int selected_elm, int yoff)
|
|||||||
noelm++;
|
noelm++;
|
||||||
pos += strlen(key) + 1;
|
pos += strlen(key) + 1;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
mvwprintw(win, y, KEYPOS, "%s", keys_action_allkeys(action));
|
mvwprintw(win, y, KEYPOS, "%s", keys_action_allkeys(action));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -933,8 +878,7 @@ print_keys_bindings (WINDOW *win, int selected_row, int selected_elm, int yoff)
|
|||||||
return noelm;
|
return noelm;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void custom_keys_config_bar(void)
|
||||||
custom_keys_config_bar (void)
|
|
||||||
{
|
{
|
||||||
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
struct binding quit = { _("Exit"), KEY_GENERIC_QUIT };
|
||||||
struct binding info = { _("Key info"), KEY_GENERIC_HELP };
|
struct binding info = { _("Key info"), KEY_GENERIC_HELP };
|
||||||
@@ -954,8 +898,7 @@ custom_keys_config_bar (void)
|
|||||||
bindings_size, NULL);
|
bindings_size, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void custom_keys_config(void)
|
||||||
custom_keys_config (void)
|
|
||||||
{
|
{
|
||||||
struct scrollwin kwin;
|
struct scrollwin kwin;
|
||||||
int selrow, selelm, firstrow, lastrow, nbrowelm, nbdisplayed;
|
int selrow, selelm, firstrow, lastrow, nbrowelm, nbdisplayed;
|
||||||
@@ -978,20 +921,16 @@ custom_keys_config (void)
|
|||||||
wins_scrollwin_display(&kwin);
|
wins_scrollwin_display(&kwin);
|
||||||
firstrow = 0;
|
firstrow = 0;
|
||||||
lastrow = firstrow + nbdisplayed - 1;
|
lastrow = firstrow + nbdisplayed - 1;
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
ch = keys_getch(win[STA].p, NULL);
|
ch = keys_getch(win[STA].p, NULL);
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
case KEY_MOVE_UP:
|
case KEY_MOVE_UP:
|
||||||
if (selrow > 0)
|
if (selrow > 0) {
|
||||||
{
|
|
||||||
selrow--;
|
selrow--;
|
||||||
selelm = 0;
|
selelm = 0;
|
||||||
if (selrow == firstrow)
|
if (selrow == firstrow) {
|
||||||
{
|
|
||||||
firstrow--;
|
firstrow--;
|
||||||
lastrow--;
|
lastrow--;
|
||||||
wins_scrollwin_up(&kwin, LINESPERKEY);
|
wins_scrollwin_up(&kwin, LINESPERKEY);
|
||||||
@@ -999,12 +938,10 @@ custom_keys_config (void)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_MOVE_DOWN:
|
case KEY_MOVE_DOWN:
|
||||||
if (selrow < NBKEYS - 1)
|
if (selrow < NBKEYS - 1) {
|
||||||
{
|
|
||||||
selrow++;
|
selrow++;
|
||||||
selelm = 0;
|
selelm = 0;
|
||||||
if (selrow == lastrow)
|
if (selrow == lastrow) {
|
||||||
{
|
|
||||||
firstrow++;
|
firstrow++;
|
||||||
lastrow++;
|
lastrow++;
|
||||||
wins_scrollwin_down(&kwin, LINESPERKEY);
|
wins_scrollwin_down(&kwin, LINESPERKEY);
|
||||||
@@ -1025,8 +962,7 @@ custom_keys_config (void)
|
|||||||
case KEY_ADD_ITEM:
|
case KEY_ADD_ITEM:
|
||||||
#define WINROW 10
|
#define WINROW 10
|
||||||
#define WINCOL 50
|
#define WINCOL 50
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
used = 0;
|
used = 0;
|
||||||
grabwin = popup(WINROW, WINCOL, (row - WINROW) / 2,
|
grabwin = popup(WINROW, WINCOL, (row - WINROW) / 2,
|
||||||
(col - WINCOL) / 2,
|
(col - WINCOL) / 2,
|
||||||
@@ -1035,8 +971,7 @@ custom_keys_config (void)
|
|||||||
keyval = wgetch(grabwin);
|
keyval = wgetch(grabwin);
|
||||||
|
|
||||||
/* First check if this key would be recognized by calcurse. */
|
/* First check if this key would be recognized by calcurse. */
|
||||||
if (keys_str2int (keys_int2str (keyval)) == -1)
|
if (keys_str2int(keys_int2str(keyval)) == -1) {
|
||||||
{
|
|
||||||
not_recognized = 1;
|
not_recognized = 1;
|
||||||
WARN_MSG(_("This key is not yet recognized by calcurse, "
|
WARN_MSG(_("This key is not yet recognized by calcurse, "
|
||||||
"please choose another one."));
|
"please choose another one."));
|
||||||
@@ -1045,19 +980,16 @@ custom_keys_config (void)
|
|||||||
LINESPERKEY);
|
LINESPERKEY);
|
||||||
wins_scrollwin_display(&kwin);
|
wins_scrollwin_display(&kwin);
|
||||||
continue;
|
continue;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
not_recognized = 0;
|
not_recognized = 0;
|
||||||
|
|
||||||
used = keys_assign_binding(keyval, selrow);
|
used = keys_assign_binding(keyval, selrow);
|
||||||
if (used)
|
if (used) {
|
||||||
{
|
|
||||||
enum key action;
|
enum key action;
|
||||||
|
|
||||||
action = keys_get_action(keyval);
|
action = keys_get_action(keyval);
|
||||||
WARN_MSG(_("This key is already in use for %s, "
|
WARN_MSG(_("This key is already in use for %s, "
|
||||||
"please choose another one."),
|
"please choose another one."), keys_get_label(action));
|
||||||
keys_get_label (action));
|
|
||||||
werase(kwin.pad.p);
|
werase(kwin.pad.p);
|
||||||
nbrowelm = print_keys_bindings(kwin.pad.p, selrow, selelm,
|
nbrowelm = print_keys_bindings(kwin.pad.p, selrow, selelm,
|
||||||
LINESPERKEY);
|
LINESPERKEY);
|
||||||
@@ -1081,10 +1013,8 @@ custom_keys_config (void)
|
|||||||
selelm--;
|
selelm--;
|
||||||
break;
|
break;
|
||||||
case KEY_GENERIC_QUIT:
|
case KEY_GENERIC_QUIT:
|
||||||
if (keys_check_missing_bindings () != 0)
|
if (keys_check_missing_bindings() != 0) {
|
||||||
{
|
WARN_MSG(_("Some actions do not have any associated " "key bindings!"));
|
||||||
WARN_MSG (_("Some actions do not have any associated "
|
|
||||||
"key bindings!"));
|
|
||||||
}
|
}
|
||||||
wins_scrollwin_delete(&kwin);
|
wins_scrollwin_delete(&kwin);
|
||||||
return;
|
return;
|
||||||
@@ -1096,8 +1026,7 @@ custom_keys_config (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void custom_config_main(void)
|
||||||
custom_config_main (void)
|
|
||||||
{
|
{
|
||||||
const char *no_color_support =
|
const char *no_color_support =
|
||||||
_("Sorry, colors are not supported by your terminal\n"
|
_("Sorry, colors are not supported by your terminal\n"
|
||||||
@@ -1106,16 +1035,13 @@ custom_config_main (void)
|
|||||||
int old_layout;
|
int old_layout;
|
||||||
|
|
||||||
custom_config_bar();
|
custom_config_bar();
|
||||||
while ((ch = wgetch (win[STA].p)) != 'q')
|
while ((ch = wgetch(win[STA].p)) != 'q') {
|
||||||
{
|
switch (ch) {
|
||||||
switch (ch)
|
|
||||||
{
|
|
||||||
case 'C':
|
case 'C':
|
||||||
case 'c':
|
case 'c':
|
||||||
if (has_colors())
|
if (has_colors())
|
||||||
custom_color_config();
|
custom_color_config();
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
colorize = 0;
|
colorize = 0;
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
mvwprintw(win[STA].p, 0, 0, _(no_color_support));
|
mvwprintw(win[STA].p, 0, 0, _(no_color_support));
|
||||||
|
|||||||
350
src/day.c
350
src/day.c
@@ -53,14 +53,12 @@ struct day_saved_item {
|
|||||||
static llist_t day_items;
|
static llist_t day_items;
|
||||||
static struct day_saved_item day_saved_item;
|
static struct day_saved_item day_saved_item;
|
||||||
|
|
||||||
static void
|
static void day_free(struct day_item *day)
|
||||||
day_free (struct day_item *day)
|
|
||||||
{
|
{
|
||||||
mem_free(day);
|
mem_free(day);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void day_init_list(void)
|
||||||
day_init_list (void)
|
|
||||||
{
|
{
|
||||||
LLIST_INIT(&day_items);
|
LLIST_INIT(&day_items);
|
||||||
}
|
}
|
||||||
@@ -70,16 +68,15 @@ day_init_list (void)
|
|||||||
* Must not free associated message and note, because their are not dynamically
|
* Must not free associated message and note, because their are not dynamically
|
||||||
* allocated (only pointers to real objects are stored in this structure).
|
* allocated (only pointers to real objects are stored in this structure).
|
||||||
*/
|
*/
|
||||||
void
|
void day_free_list(void)
|
||||||
day_free_list (void)
|
|
||||||
{
|
{
|
||||||
LLIST_FREE_INNER(&day_items, day_free);
|
LLIST_FREE_INNER(&day_items, day_free);
|
||||||
LLIST_FREE(&day_items);
|
LLIST_FREE(&day_items);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add an event in the current day list */
|
/* Add an event in the current day list */
|
||||||
static struct day_item *
|
static struct day_item *day_add_event(int type, char *mesg, char *note,
|
||||||
day_add_event (int type, char *mesg, char *note, long nday, int id)
|
long nday, int id)
|
||||||
{
|
{
|
||||||
struct day_item *day;
|
struct day_item *day;
|
||||||
|
|
||||||
@@ -97,26 +94,23 @@ day_add_event (int type, char *mesg, char *note, long nday, int id)
|
|||||||
return day;
|
return day;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int day_cmp_start(struct day_item *a, struct day_item *b)
|
||||||
day_cmp_start (struct day_item *a, struct day_item *b)
|
|
||||||
{
|
|
||||||
if (a->type <= EVNT)
|
|
||||||
{
|
{
|
||||||
|
if (a->type <= EVNT) {
|
||||||
if (b->type <= EVNT)
|
if (b->type <= EVNT)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
} else if (b->type <= EVNT)
|
||||||
else if (b->type <= EVNT)
|
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1);
|
return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add an appointment in the current day list. */
|
/* Add an appointment in the current day list. */
|
||||||
static struct day_item *
|
static struct day_item *day_add_apoint(int type, char *mesg, char *note,
|
||||||
day_add_apoint (int type, char *mesg, char *note, long start, long dur,
|
long start, long dur, char state,
|
||||||
char state, int real_pos)
|
int real_pos)
|
||||||
{
|
{
|
||||||
struct day_item *day;
|
struct day_item *day;
|
||||||
|
|
||||||
@@ -142,14 +136,12 @@ day_add_apoint (int type, char *mesg, char *note, long start, long dur,
|
|||||||
* dedicated to the selected day.
|
* dedicated to the selected day.
|
||||||
* Returns the number of events for the selected day.
|
* Returns the number of events for the selected day.
|
||||||
*/
|
*/
|
||||||
static int
|
static int day_store_events(long date)
|
||||||
day_store_events (long date)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int e_nb = 0;
|
int e_nb = 0;
|
||||||
|
|
||||||
LLIST_FIND_FOREACH_CONT (&eventlist, date, event_inday, i)
|
LLIST_FIND_FOREACH_CONT(&eventlist, date, event_inday, i) {
|
||||||
{
|
|
||||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||||
day_add_event(EVNT, ev->mesg, ev->note, ev->day, ev->id);
|
day_add_event(EVNT, ev->mesg, ev->note, ev->day, ev->id);
|
||||||
e_nb++;
|
e_nb++;
|
||||||
@@ -165,14 +157,12 @@ day_store_events (long date)
|
|||||||
* dedicated to the selected day.
|
* dedicated to the selected day.
|
||||||
* Returns the number of recurrent events for the selected day.
|
* Returns the number of recurrent events for the selected day.
|
||||||
*/
|
*/
|
||||||
static int
|
static int day_store_recur_events(long date)
|
||||||
day_store_recur_events (long date)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int e_nb = 0;
|
int e_nb = 0;
|
||||||
|
|
||||||
LLIST_FIND_FOREACH (&recur_elist, date, recur_event_inday, i)
|
LLIST_FIND_FOREACH(&recur_elist, date, recur_event_inday, i) {
|
||||||
{
|
|
||||||
struct recur_event *rev = LLIST_TS_GET_DATA(i);
|
struct recur_event *rev = LLIST_TS_GET_DATA(i);
|
||||||
day_add_event(RECUR_EVNT, rev->mesg, rev->note, rev->day, rev->id);
|
day_add_event(RECUR_EVNT, rev->mesg, rev->note, rev->day, rev->id);
|
||||||
e_nb++;
|
e_nb++;
|
||||||
@@ -188,15 +178,13 @@ day_store_recur_events (long date)
|
|||||||
* structure dedicated to the selected day.
|
* structure dedicated to the selected day.
|
||||||
* Returns the number of appointments for the selected day.
|
* Returns the number of appointments for the selected day.
|
||||||
*/
|
*/
|
||||||
static int
|
static int day_store_apoints(long date)
|
||||||
day_store_apoints (long date)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int a_nb = 0;
|
int a_nb = 0;
|
||||||
|
|
||||||
LLIST_TS_LOCK(&alist_p);
|
LLIST_TS_LOCK(&alist_p);
|
||||||
LLIST_TS_FIND_FOREACH (&alist_p, date, apoint_inday, i)
|
LLIST_TS_FIND_FOREACH(&alist_p, date, apoint_inday, i) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
if (apt->start >= date + DAYINSEC)
|
if (apt->start >= date + DAYINSEC)
|
||||||
@@ -218,19 +206,16 @@ day_store_apoints (long date)
|
|||||||
* structure dedicated to the selected day.
|
* structure dedicated to the selected day.
|
||||||
* Returns the number of recurrent appointments for the selected day.
|
* Returns the number of recurrent appointments for the selected day.
|
||||||
*/
|
*/
|
||||||
static int
|
static int day_store_recur_apoints(long date)
|
||||||
day_store_recur_apoints (long date)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int a_nb = 0;
|
int a_nb = 0;
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
LLIST_TS_FIND_FOREACH (&recur_alist_p, date, recur_apoint_inday, i)
|
LLIST_TS_FIND_FOREACH(&recur_alist_p, date, recur_apoint_inday, i) {
|
||||||
{
|
|
||||||
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
||||||
unsigned real_start;
|
unsigned real_start;
|
||||||
if (recur_apoint_find_occurrence (rapt, date, &real_start))
|
if (recur_apoint_find_occurrence(rapt, date, &real_start)) {
|
||||||
{
|
|
||||||
day_add_apoint(RECUR_APPT, rapt->mesg, rapt->note, real_start,
|
day_add_apoint(RECUR_APPT, rapt->mesg, rapt->note, real_start,
|
||||||
rapt->dur, rapt->state, a_nb);
|
rapt->dur, rapt->state, a_nb);
|
||||||
a_nb++;
|
a_nb++;
|
||||||
@@ -277,8 +262,8 @@ day_store_items (long date, unsigned *pnb_events, unsigned *pnb_apoints)
|
|||||||
* those items in a pad. If selected day is null, then store items for current
|
* those items in a pad. If selected day is null, then store items for current
|
||||||
* day. This is useful to speed up the appointment panel update.
|
* day. This is useful to speed up the appointment panel update.
|
||||||
*/
|
*/
|
||||||
struct day_items_nb *
|
struct day_items_nb *day_process_storage(struct date *slctd_date,
|
||||||
day_process_storage (struct date *slctd_date, unsigned day_changed,
|
unsigned day_changed,
|
||||||
struct day_items_nb *inday)
|
struct day_items_nb *inday)
|
||||||
{
|
{
|
||||||
long date;
|
long date;
|
||||||
@@ -310,8 +295,7 @@ day_process_storage (struct date *slctd_date, unsigned day_changed,
|
|||||||
* Returns a structure of type apoint_llist_node_t given a structure of type
|
* Returns a structure of type apoint_llist_node_t given a structure of type
|
||||||
* day_item_s
|
* day_item_s
|
||||||
*/
|
*/
|
||||||
static void
|
static void day_item_s2apoint_s(struct apoint *a, struct day_item *p)
|
||||||
day_item_s2apoint_s (struct apoint *a, struct day_item *p)
|
|
||||||
{
|
{
|
||||||
a->state = p->state;
|
a->state = p->state;
|
||||||
a->start = p->start;
|
a->start = p->start;
|
||||||
@@ -368,10 +352,8 @@ display_item (int incolor, char *msg, int recur, int note, int width, int y,
|
|||||||
custom_apply_attr(win, ATTR_HIGHEST);
|
custom_apply_attr(win, ATTR_HIGHEST);
|
||||||
if (utf8_strwidth(msg) < width)
|
if (utf8_strwidth(msg) < width)
|
||||||
mvwprintw(win, y, x, " %c%c%s", ch_recur, ch_note, msg);
|
mvwprintw(win, y, x, " %c%c%s", ch_recur, ch_note, msg);
|
||||||
else
|
else {
|
||||||
{
|
for (i = 0; msg[i] && width > 0; i++) {
|
||||||
for (i = 0; msg[i] && width > 0; i++)
|
|
||||||
{
|
|
||||||
if (!UTF8_ISCONT(msg[i]))
|
if (!UTF8_ISCONT(msg[i]))
|
||||||
width -= utf8_width(&msg[i]);
|
width -= utf8_width(&msg[i]);
|
||||||
buf[i] = msg[i];
|
buf[i] = msg[i];
|
||||||
@@ -393,8 +375,7 @@ display_item (int incolor, char *msg, int recur, int note, int width, int y,
|
|||||||
* structure (pointed by day_saved_item), to be later displayed in a
|
* structure (pointed by day_saved_item), to be later displayed in a
|
||||||
* popup window if requested.
|
* popup window if requested.
|
||||||
*/
|
*/
|
||||||
void
|
void day_write_pad(long date, int width, int length, int incolor)
|
||||||
day_write_pad (long date, int width, int length, int incolor)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
struct apoint a;
|
struct apoint a;
|
||||||
@@ -404,19 +385,16 @@ day_write_pad (long date, int width, int length, int incolor)
|
|||||||
|
|
||||||
line = item_number = 0;
|
line = item_number = 0;
|
||||||
|
|
||||||
LLIST_FOREACH (&day_items, i)
|
LLIST_FOREACH(&day_items, i) {
|
||||||
{
|
|
||||||
struct day_item *day = LLIST_TS_GET_DATA(i);
|
struct day_item *day = LLIST_TS_GET_DATA(i);
|
||||||
if (day->type == RECUR_EVNT || day->type == RECUR_APPT)
|
if (day->type == RECUR_EVNT || day->type == RECUR_APPT)
|
||||||
recur = 1;
|
recur = 1;
|
||||||
else
|
else
|
||||||
recur = 0;
|
recur = 0;
|
||||||
/* First print the events for current day. */
|
/* First print the events for current day. */
|
||||||
if (day->type < RECUR_APPT)
|
if (day->type < RECUR_APPT) {
|
||||||
{
|
|
||||||
item_number++;
|
item_number++;
|
||||||
if (item_number - incolor == 0)
|
if (item_number - incolor == 0) {
|
||||||
{
|
|
||||||
day_saved_item.type = day->type;
|
day_saved_item.type = day->type;
|
||||||
day_saved_item.mesg = day->mesg;
|
day_saved_item.mesg = day->mesg;
|
||||||
}
|
}
|
||||||
@@ -424,12 +402,9 @@ day_write_pad (long date, int width, int length, int incolor)
|
|||||||
(day->note != NULL) ? 1 : 0, width - 7, line, x_pos);
|
(day->note != NULL) ? 1 : 0, width - 7, line, x_pos);
|
||||||
line++;
|
line++;
|
||||||
draw_line = 1;
|
draw_line = 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Draw a line between events and appointments. */
|
/* Draw a line between events and appointments. */
|
||||||
if (line > 0 && draw_line)
|
if (line > 0 && draw_line) {
|
||||||
{
|
|
||||||
wmove(apad.ptrwin, line, 0);
|
wmove(apad.ptrwin, line, 0);
|
||||||
whline(apad.ptrwin, 0, width);
|
whline(apad.ptrwin, 0, width);
|
||||||
draw_line = 0;
|
draw_line = 0;
|
||||||
@@ -437,26 +412,22 @@ day_write_pad (long date, int width, int length, int incolor)
|
|||||||
/* Last print the appointments for current day. */
|
/* Last print the appointments for current day. */
|
||||||
item_number++;
|
item_number++;
|
||||||
day_item_s2apoint_s(&a, day);
|
day_item_s2apoint_s(&a, day);
|
||||||
if (item_number - incolor == 0)
|
if (item_number - incolor == 0) {
|
||||||
{
|
|
||||||
day_saved_item.type = day->type;
|
day_saved_item.type = day->type;
|
||||||
day_saved_item.mesg = day->mesg;
|
day_saved_item.mesg = day->mesg;
|
||||||
apoint_sec2str (&a, date, day_saved_item.start,
|
apoint_sec2str(&a, date, day_saved_item.start, day_saved_item.end);
|
||||||
day_saved_item.end);
|
|
||||||
}
|
}
|
||||||
display_item_date(item_number - incolor, &a, day->type,
|
display_item_date(item_number - incolor, &a, day->type,
|
||||||
date, line + 1, x_pos);
|
date, line + 1, x_pos);
|
||||||
display_item(item_number - incolor, day->mesg, 0,
|
display_item(item_number - incolor, day->mesg, 0,
|
||||||
(day->note != NULL) ? 1 : 0, width - 7, line + 2,
|
(day->note != NULL) ? 1 : 0, width - 7, line + 2, x_pos);
|
||||||
x_pos);
|
|
||||||
line += 3;
|
line += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display an item inside a popup window. */
|
/* Display an item inside a popup window. */
|
||||||
void
|
void day_popup_item(void)
|
||||||
day_popup_item (void)
|
|
||||||
{
|
{
|
||||||
if (day_saved_item.type == EVNT || day_saved_item.type == RECUR_EVNT)
|
if (day_saved_item.type == EVNT || day_saved_item.type == RECUR_EVNT)
|
||||||
item_in_popup(NULL, NULL, day_saved_item.mesg, _("Event :"));
|
item_in_popup(NULL, NULL, day_saved_item.mesg, _("Event :"));
|
||||||
@@ -472,8 +443,7 @@ day_popup_item (void)
|
|||||||
* Need to know if there is an item for the current selected day inside
|
* Need to know if there is an item for the current selected day inside
|
||||||
* calendar. This is used to put the correct colors inside calendar panel.
|
* calendar. This is used to put the correct colors inside calendar panel.
|
||||||
*/
|
*/
|
||||||
int
|
int day_check_if_item(struct date day)
|
||||||
day_check_if_item (struct date day)
|
|
||||||
{
|
{
|
||||||
const long date = date2sec(day, 0, 0);
|
const long date = date2sec(day, 0, 0);
|
||||||
|
|
||||||
@@ -481,8 +451,7 @@ day_check_if_item (struct date day)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
if (LLIST_TS_FIND_FIRST (&recur_alist_p, date, recur_apoint_inday))
|
if (LLIST_TS_FIND_FIRST(&recur_alist_p, date, recur_apoint_inday)) {
|
||||||
{
|
|
||||||
LLIST_TS_UNLOCK(&recur_alist_p);
|
LLIST_TS_UNLOCK(&recur_alist_p);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -492,8 +461,7 @@ day_check_if_item (struct date day)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
LLIST_TS_LOCK(&alist_p);
|
LLIST_TS_LOCK(&alist_p);
|
||||||
if (LLIST_TS_FIND_FIRST (&alist_p, date, apoint_inday))
|
if (LLIST_TS_FIND_FIRST(&alist_p, date, apoint_inday)) {
|
||||||
{
|
|
||||||
LLIST_TS_UNLOCK(&alist_p);
|
LLIST_TS_UNLOCK(&alist_p);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -502,8 +470,7 @@ day_check_if_item (struct date day)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
static unsigned fill_slices(int *slices, int slicesno, int first, int last)
|
||||||
fill_slices (int *slices, int slicesno, int first, int last)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -524,8 +491,7 @@ fill_slices (int *slices, int slicesno, int first, int last)
|
|||||||
* appointment in the corresponding time slice, 0 otherwise.
|
* appointment in the corresponding time slice, 0 otherwise.
|
||||||
* A 24 hours day is divided into 'slicesno' number of time slices.
|
* A 24 hours day is divided into 'slicesno' number of time slices.
|
||||||
*/
|
*/
|
||||||
unsigned
|
unsigned day_chk_busy_slices(struct date day, int slicesno, int *slices)
|
||||||
day_chk_busy_slices (struct date day, int slicesno, int *slices)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int slicelen;
|
int slicelen;
|
||||||
@@ -536,14 +502,12 @@ day_chk_busy_slices (struct date day, int slicesno, int *slices)
|
|||||||
#define SLICENUM(tsec) ((tsec) / slicelen % slicesno)
|
#define SLICENUM(tsec) ((tsec) / slicelen % slicesno)
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
LLIST_TS_FIND_FOREACH (&recur_alist_p, date, recur_apoint_inday, i)
|
LLIST_TS_FIND_FOREACH(&recur_alist_p, date, recur_apoint_inday, i) {
|
||||||
{
|
|
||||||
struct apoint *rapt = LLIST_TS_GET_DATA(i);
|
struct apoint *rapt = LLIST_TS_GET_DATA(i);
|
||||||
long start = get_item_time(rapt->start);
|
long start = get_item_time(rapt->start);
|
||||||
long end = get_item_time(rapt->start + rapt->dur);
|
long end = get_item_time(rapt->start + rapt->dur);
|
||||||
|
|
||||||
if (!fill_slices (slices, slicesno, SLICENUM (start), SLICENUM (end)))
|
if (!fill_slices(slices, slicesno, SLICENUM(start), SLICENUM(end))) {
|
||||||
{
|
|
||||||
LLIST_TS_UNLOCK(&recur_alist_p);
|
LLIST_TS_UNLOCK(&recur_alist_p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -551,8 +515,7 @@ day_chk_busy_slices (struct date day, int slicesno, int *slices)
|
|||||||
LLIST_TS_UNLOCK(&recur_alist_p);
|
LLIST_TS_UNLOCK(&recur_alist_p);
|
||||||
|
|
||||||
LLIST_TS_LOCK(&alist_p);
|
LLIST_TS_LOCK(&alist_p);
|
||||||
LLIST_TS_FIND_FOREACH (&alist_p, date, apoint_inday, i)
|
LLIST_TS_FIND_FOREACH(&alist_p, date, apoint_inday, i) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
long start = get_item_time(apt->start);
|
long start = get_item_time(apt->start);
|
||||||
long end = get_item_time(apt->start + apt->dur);
|
long end = get_item_time(apt->start + apt->dur);
|
||||||
@@ -560,8 +523,7 @@ day_chk_busy_slices (struct date day, int slicesno, int *slices)
|
|||||||
if (apt->start >= date + DAYINSEC)
|
if (apt->start >= date + DAYINSEC)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!fill_slices (slices, slicesno, SLICENUM (start), SLICENUM (end)))
|
if (!fill_slices(slices, slicesno, SLICENUM(start), SLICENUM(end))) {
|
||||||
{
|
|
||||||
LLIST_TS_UNLOCK(&alist_p);
|
LLIST_TS_UNLOCK(&alist_p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -573,71 +535,56 @@ day_chk_busy_slices (struct date day, int slicesno, int *slices)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Request the user to enter a new time. */
|
/* Request the user to enter a new time. */
|
||||||
static int
|
static int day_edit_time(int time, unsigned *new_hour, unsigned *new_minute)
|
||||||
day_edit_time (int time, unsigned *new_hour, unsigned *new_minute)
|
|
||||||
{
|
{
|
||||||
char *timestr = date_sec2date_str(time, "%H:%M");
|
char *timestr = date_sec2date_str(time, "%H:%M");
|
||||||
const char *msg_time = _("Enter the new time ([hh:mm]) : ");
|
const char *msg_time = _("Enter the new time ([hh:mm]) : ");
|
||||||
const char *enter_str = _("Press [Enter] to continue");
|
const char *enter_str = _("Press [Enter] to continue");
|
||||||
const char *fmt_msg = _("You entered an invalid time, should be [hh:mm]");
|
const char *fmt_msg = _("You entered an invalid time, should be [hh:mm]");
|
||||||
|
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
status_mesg(msg_time, "");
|
status_mesg(msg_time, "");
|
||||||
if (updatestring (win[STA].p, ×tr, 0, 1) == GETSTRING_VALID)
|
if (updatestring(win[STA].p, ×tr, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
if (parse_time(timestr, new_hour, new_minute) == 1) {
|
||||||
if (parse_time (timestr, new_hour, new_minute) == 1)
|
|
||||||
{
|
|
||||||
mem_free(timestr);
|
mem_free(timestr);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
status_mesg(fmt_msg, enter_str);
|
status_mesg(fmt_msg, enter_str);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Request the user to enter a new time or duration. */
|
/* Request the user to enter a new time or duration. */
|
||||||
static int
|
static int day_edit_duration(int start, int dur, unsigned *new_duration)
|
||||||
day_edit_duration (int start, int dur, unsigned *new_duration)
|
|
||||||
{
|
{
|
||||||
char *timestr = date_sec2date_str(start + dur, "%H:%M");
|
char *timestr = date_sec2date_str(start + dur, "%H:%M");
|
||||||
const char *msg_time = _("Enter new end time ([hh:mm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : ");
|
const char *msg_time =
|
||||||
|
_
|
||||||
|
("Enter new end time ([hh:mm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : ");
|
||||||
const char *enter_str = _("Press [Enter] to continue");
|
const char *enter_str = _("Press [Enter] to continue");
|
||||||
const char *fmt_msg = _("You entered an invalid time, should be [hh:mm]");
|
const char *fmt_msg = _("You entered an invalid time, should be [hh:mm]");
|
||||||
long newtime;
|
long newtime;
|
||||||
unsigned hr, mn;
|
unsigned hr, mn;
|
||||||
|
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
status_mesg(msg_time, "");
|
status_mesg(msg_time, "");
|
||||||
if (updatestring (win[STA].p, ×tr, 0, 1) == GETSTRING_VALID)
|
if (updatestring(win[STA].p, ×tr, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
if (*timestr == '+' && parse_duration(timestr + 1, new_duration) == 1) {
|
||||||
if (*timestr == '+' && parse_duration (timestr + 1,
|
|
||||||
new_duration) == 1)
|
|
||||||
{
|
|
||||||
*new_duration *= MININSEC;
|
*new_duration *= MININSEC;
|
||||||
break;
|
break;
|
||||||
}
|
} else if (parse_time(timestr, &hr, &mn) == 1) {
|
||||||
else if (parse_time (timestr, &hr, &mn) == 1)
|
|
||||||
{
|
|
||||||
newtime = update_time_in_date(start + dur, hr, mn);
|
newtime = update_time_in_date(start + dur, hr, mn);
|
||||||
*new_duration = (newtime > start) ? newtime - start :
|
*new_duration = (newtime > start) ? newtime - start :
|
||||||
DAYINSEC + newtime - start;
|
DAYINSEC + newtime - start;
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
status_mesg(fmt_msg, enter_str);
|
status_mesg(fmt_msg, enter_str);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -646,27 +593,23 @@ day_edit_duration (int start, int dur, unsigned *new_duration)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Request the user to enter a new end time or duration. */
|
/* Request the user to enter a new end time or duration. */
|
||||||
static void
|
static void update_start_time(long *start, long *dur)
|
||||||
update_start_time (long *start, long *dur)
|
|
||||||
{
|
{
|
||||||
long newtime;
|
long newtime;
|
||||||
unsigned hr, mn;
|
unsigned hr, mn;
|
||||||
int valid_date;
|
int valid_date;
|
||||||
const char *msg_wrong_time = _("Invalid time: start time must be before end time!");
|
const char *msg_wrong_time =
|
||||||
|
_("Invalid time: start time must be before end time!");
|
||||||
const char *msg_enter = _("Press [Enter] to continue");
|
const char *msg_enter = _("Press [Enter] to continue");
|
||||||
|
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
day_edit_time(*start, &hr, &mn);
|
day_edit_time(*start, &hr, &mn);
|
||||||
newtime = update_time_in_date(*start, hr, mn);
|
newtime = update_time_in_date(*start, hr, mn);
|
||||||
if (newtime < *start + *dur)
|
if (newtime < *start + *dur) {
|
||||||
{
|
|
||||||
*dur -= (newtime - *start);
|
*dur -= (newtime - *start);
|
||||||
*start = newtime;
|
*start = newtime;
|
||||||
valid_date = 1;
|
valid_date = 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
status_mesg(msg_wrong_time, msg_enter);
|
status_mesg(msg_wrong_time, msg_enter);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
valid_date = 0;
|
valid_date = 0;
|
||||||
@@ -675,8 +618,7 @@ update_start_time (long *start, long *dur)
|
|||||||
while (valid_date == 0);
|
while (valid_date == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void update_duration(long *start, long *dur)
|
||||||
update_duration (long *start, long *dur)
|
|
||||||
{
|
{
|
||||||
unsigned newdur;
|
unsigned newdur;
|
||||||
|
|
||||||
@@ -684,15 +626,13 @@ update_duration (long *start, long *dur)
|
|||||||
*dur = newdur;
|
*dur = newdur;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void update_desc(char **desc)
|
||||||
update_desc (char **desc)
|
|
||||||
{
|
{
|
||||||
status_mesg(_("Enter the new item description:"), "");
|
status_mesg(_("Enter the new item description:"), "");
|
||||||
updatestring(win[STA].p, desc, 0, 1);
|
updatestring(win[STA].p, desc, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void update_rept(struct rpt **rpt, const long start)
|
||||||
update_rept (struct rpt **rpt, const long start)
|
|
||||||
{
|
{
|
||||||
int newtype, newfreq, date_entered;
|
int newtype, newfreq, date_entered;
|
||||||
long newuntil;
|
long newuntil;
|
||||||
@@ -707,8 +647,7 @@ update_rept (struct rpt **rpt, const long start)
|
|||||||
/* Find the current repetition type. */
|
/* Find the current repetition type. */
|
||||||
const char *rpt_current;
|
const char *rpt_current;
|
||||||
char msg_rpt_current[BUFSIZ];
|
char msg_rpt_current[BUFSIZ];
|
||||||
switch (recur_def2char ((*rpt)->type))
|
switch (recur_def2char((*rpt)->type)) {
|
||||||
{
|
|
||||||
case 'D':
|
case 'D':
|
||||||
rpt_current = msg_rpt_daily;
|
rpt_current = msg_rpt_daily;
|
||||||
break;
|
break;
|
||||||
@@ -732,21 +671,18 @@ update_rept (struct rpt **rpt, const long start)
|
|||||||
snprintf(msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s",
|
snprintf(msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s",
|
||||||
msg_rpt_prefix,
|
msg_rpt_prefix,
|
||||||
msg_rpt_daily,
|
msg_rpt_daily,
|
||||||
msg_rpt_weekly,
|
msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly, msg_rpt_current);
|
||||||
msg_rpt_monthly,
|
|
||||||
msg_rpt_yearly,
|
|
||||||
msg_rpt_current);
|
|
||||||
|
|
||||||
const char *msg_rpt_choice = _("[dwmy]");
|
const char *msg_rpt_choice = _("[dwmy]");
|
||||||
const char *msg_wrong_freq = _("The frequence you entered is not valid.");
|
const char *msg_wrong_freq = _("The frequence you entered is not valid.");
|
||||||
const char *msg_wrong_time = _("Invalid time: start time must be before end time!");
|
const char *msg_wrong_time =
|
||||||
|
_("Invalid time: start time must be before end time!");
|
||||||
const char *msg_wrong_date = _("The entered date is not valid.");
|
const char *msg_wrong_date = _("The entered date is not valid.");
|
||||||
const char *msg_fmts =
|
const char *msg_fmts =
|
||||||
_("Possible formats are [%s] or '0' for an endless repetetition");
|
_("Possible formats are [%s] or '0' for an endless repetetition");
|
||||||
const char *msg_enter = _("Press [Enter] to continue");
|
const char *msg_enter = _("Press [Enter] to continue");
|
||||||
|
|
||||||
switch (status_ask_choice (msg_rpt_asktype, msg_rpt_choice, 4))
|
switch (status_ask_choice(msg_rpt_asktype, msg_rpt_choice, 4)) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
newtype = 'D';
|
newtype = 'D';
|
||||||
break;
|
break;
|
||||||
@@ -763,75 +699,58 @@ update_rept (struct rpt **rpt, const long start)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
status_mesg(_("Enter the new repetition frequence:"), "");
|
status_mesg(_("Enter the new repetition frequence:"), "");
|
||||||
freqstr = mem_malloc(BUFSIZ);
|
freqstr = mem_malloc(BUFSIZ);
|
||||||
snprintf(freqstr, BUFSIZ, "%d", (*rpt)->freq);
|
snprintf(freqstr, BUFSIZ, "%d", (*rpt)->freq);
|
||||||
if (updatestring (win[STA].p, &freqstr, 0, 1) == GETSTRING_VALID)
|
if (updatestring(win[STA].p, &freqstr, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
|
||||||
newfreq = atoi(freqstr);
|
newfreq = atoi(freqstr);
|
||||||
mem_free(freqstr);
|
mem_free(freqstr);
|
||||||
if (newfreq == 0)
|
if (newfreq == 0) {
|
||||||
{
|
|
||||||
status_mesg(msg_wrong_freq, msg_enter);
|
status_mesg(msg_wrong_freq, msg_enter);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
mem_free(freqstr);
|
mem_free(freqstr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (newfreq == 0);
|
while (newfreq == 0);
|
||||||
|
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
snprintf(outstr, BUFSIZ, "Enter the new ending date: [%s] or '0'",
|
snprintf(outstr, BUFSIZ, "Enter the new ending date: [%s] or '0'",
|
||||||
DATEFMT_DESC(conf.input_datefmt));
|
DATEFMT_DESC(conf.input_datefmt));
|
||||||
status_mesg(_(outstr), "");
|
status_mesg(_(outstr), "");
|
||||||
timstr =
|
timstr = date_sec2date_str((*rpt)->until, DATEFMT(conf.input_datefmt));
|
||||||
date_sec2date_str ((*rpt)->until, DATEFMT (conf.input_datefmt));
|
if (updatestring(win[STA].p, &timstr, 0, 1) != GETSTRING_VALID) {
|
||||||
if (updatestring (win[STA].p, &timstr, 0, 1) != GETSTRING_VALID)
|
|
||||||
{
|
|
||||||
mem_free(timstr);
|
mem_free(timstr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strcmp (timstr, "0") == 0)
|
if (strcmp(timstr, "0") == 0) {
|
||||||
{
|
|
||||||
newuntil = 0;
|
newuntil = 0;
|
||||||
date_entered = 1;
|
date_entered = 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
struct date new_date;
|
struct date new_date;
|
||||||
int newmonth, newday, newyear;
|
int newmonth, newday, newyear;
|
||||||
|
|
||||||
if (parse_date(timstr, conf.input_datefmt, &newyear, &newmonth,
|
if (parse_date(timstr, conf.input_datefmt, &newyear, &newmonth,
|
||||||
&newday, calendar_get_slctd_day ()))
|
&newday, calendar_get_slctd_day())) {
|
||||||
{
|
|
||||||
t = start;
|
t = start;
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
new_date.dd = newday;
|
new_date.dd = newday;
|
||||||
new_date.mm = newmonth;
|
new_date.mm = newmonth;
|
||||||
new_date.yyyy = newyear;
|
new_date.yyyy = newyear;
|
||||||
newuntil = date2sec(new_date, lt->tm_hour, lt->tm_min);
|
newuntil = date2sec(new_date, lt->tm_hour, lt->tm_min);
|
||||||
if (newuntil < start)
|
if (newuntil < start) {
|
||||||
{
|
|
||||||
status_mesg(msg_wrong_time, msg_enter);
|
status_mesg(msg_wrong_time, msg_enter);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
date_entered = 0;
|
date_entered = 0;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
date_entered = 1;
|
date_entered = 1;
|
||||||
}
|
} else {
|
||||||
else
|
snprintf(outstr, BUFSIZ, msg_fmts, DATEFMT_DESC(conf.input_datefmt));
|
||||||
{
|
|
||||||
snprintf (outstr, BUFSIZ, msg_fmts,
|
|
||||||
DATEFMT_DESC (conf.input_datefmt));
|
|
||||||
status_mesg(msg_wrong_date, _(outstr));
|
status_mesg(msg_wrong_date, _(outstr));
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
date_entered = 0;
|
date_entered = 0;
|
||||||
@@ -847,8 +766,7 @@ update_rept (struct rpt **rpt, const long start)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Edit an already existing item. */
|
/* Edit an already existing item. */
|
||||||
void
|
void day_edit_item(void)
|
||||||
day_edit_item (void)
|
|
||||||
{
|
{
|
||||||
struct day_item *p;
|
struct day_item *p;
|
||||||
struct recur_event *re;
|
struct recur_event *re;
|
||||||
@@ -863,16 +781,14 @@ day_edit_item (void)
|
|||||||
p = day_get_item(item_num);
|
p = day_get_item(item_num);
|
||||||
date = calendar_get_slctd_day_sec();
|
date = calendar_get_slctd_day_sec();
|
||||||
|
|
||||||
switch (p->type)
|
switch (p->type) {
|
||||||
{
|
|
||||||
case RECUR_EVNT:
|
case RECUR_EVNT:
|
||||||
re = recur_get_event(date, day_item_nb(date, item_num, RECUR_EVNT));
|
re = recur_get_event(date, day_item_nb(date, item_num, RECUR_EVNT));
|
||||||
const char *choice_recur_evnt[2] = {
|
const char *choice_recur_evnt[2] = {
|
||||||
"Description",
|
"Description",
|
||||||
"Repetition",
|
"Repetition",
|
||||||
};
|
};
|
||||||
switch (status_ask_simplechoice (_("Edit: "), choice_recur_evnt, 2))
|
switch (status_ask_simplechoice(_("Edit: "), choice_recur_evnt, 2)) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
update_desc(&re->mesg);
|
update_desc(&re->mesg);
|
||||||
break;
|
break;
|
||||||
@@ -895,8 +811,7 @@ day_edit_item (void)
|
|||||||
"Description",
|
"Description",
|
||||||
"Repetition",
|
"Repetition",
|
||||||
};
|
};
|
||||||
switch (status_ask_simplechoice (_("Edit: "), choice_recur_appt, 4))
|
switch (status_ask_simplechoice(_("Edit: "), choice_recur_appt, 4)) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
need_check_notify = 1;
|
need_check_notify = 1;
|
||||||
update_start_time(&ra->start, &ra->dur);
|
update_start_time(&ra->start, &ra->dur);
|
||||||
@@ -924,8 +839,7 @@ day_edit_item (void)
|
|||||||
"End time",
|
"End time",
|
||||||
"Description",
|
"Description",
|
||||||
};
|
};
|
||||||
switch (status_ask_simplechoice (_("Edit: "), choice_appt, 3))
|
switch (status_ask_simplechoice(_("Edit: "), choice_appt, 3)) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
need_check_notify = 1;
|
need_check_notify = 1;
|
||||||
update_start_time(&a->start, &a->dur);
|
update_start_time(&a->start, &a->dur);
|
||||||
@@ -954,8 +868,7 @@ day_edit_item (void)
|
|||||||
* recurrent appointments and appointments) and then to test the
|
* recurrent appointments and appointments) and then to test the
|
||||||
* type of the item to be deleted.
|
* type of the item to be deleted.
|
||||||
*/
|
*/
|
||||||
int
|
int day_erase_item(long date, int item_number, enum eraseflg flag)
|
||||||
day_erase_item (long date, int item_number, enum eraseflg flag)
|
|
||||||
{
|
{
|
||||||
struct day_item *p;
|
struct day_item *p;
|
||||||
|
|
||||||
@@ -974,15 +887,13 @@ day_erase_item (long date, int item_number, enum eraseflg flag)
|
|||||||
unsigned delete_whole;
|
unsigned delete_whole;
|
||||||
|
|
||||||
p = day_get_item(item_number);
|
p = day_get_item(item_number);
|
||||||
if (flag == ERASE_DONT_FORCE)
|
if (flag == ERASE_DONT_FORCE) {
|
||||||
{
|
|
||||||
if (p->note == NULL)
|
if (p->note == NULL)
|
||||||
ans = 1;
|
ans = 1;
|
||||||
else
|
else
|
||||||
ans = status_ask_choice(note_warning, note_choices, nb_note_choices);
|
ans = status_ask_choice(note_warning, note_choices, nb_note_choices);
|
||||||
|
|
||||||
switch (ans)
|
switch (ans) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
flag = ERASE_FORCE;
|
flag = ERASE_FORCE;
|
||||||
break;
|
break;
|
||||||
@@ -993,24 +904,17 @@ day_erase_item (long date, int item_number, enum eraseflg flag)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p->type == EVNT)
|
if (p->type == EVNT) {
|
||||||
{
|
|
||||||
event_delete_bynum(date, day_item_nb(date, item_number, EVNT), flag);
|
event_delete_bynum(date, day_item_nb(date, item_number, EVNT), flag);
|
||||||
}
|
} else if (p->type == APPT) {
|
||||||
else if (p->type == APPT)
|
|
||||||
{
|
|
||||||
apoint_delete_bynum(date, day_item_nb(date, item_number, APPT), flag);
|
apoint_delete_bynum(date, day_item_nb(date, item_number, APPT), flag);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (flag == ERASE_FORCE_ONLY_NOTE)
|
if (flag == ERASE_FORCE_ONLY_NOTE)
|
||||||
ans = 1;
|
ans = 1;
|
||||||
else
|
else
|
||||||
ans = status_ask_choice (erase_warning, erase_choices,
|
ans = status_ask_choice(erase_warning, erase_choices, nb_erase_choices);
|
||||||
nb_erase_choices);
|
|
||||||
|
|
||||||
switch (ans)
|
switch (ans) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
delete_whole = 1;
|
delete_whole = 1;
|
||||||
break;
|
break;
|
||||||
@@ -1021,13 +925,10 @@ day_erase_item (long date, int item_number, enum eraseflg flag)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->type == RECUR_EVNT)
|
if (p->type == RECUR_EVNT) {
|
||||||
{
|
|
||||||
recur_event_erase(date, day_item_nb(date, item_number, RECUR_EVNT),
|
recur_event_erase(date, day_item_nb(date, item_number, RECUR_EVNT),
|
||||||
delete_whole, flag);
|
delete_whole, flag);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
recur_apoint_erase(date, p->appt_pos, delete_whole, flag);
|
recur_apoint_erase(date, p->appt_pos, delete_whole, flag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1038,26 +939,22 @@ day_erase_item (long date, int item_number, enum eraseflg flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Cut an item so it can be pasted somewhere else later. */
|
/* Cut an item so it can be pasted somewhere else later. */
|
||||||
int
|
int day_cut_item(long date, int item_number)
|
||||||
day_cut_item (long date, int item_number)
|
|
||||||
{
|
{
|
||||||
const int DELETE_WHOLE = 1;
|
const int DELETE_WHOLE = 1;
|
||||||
struct day_item *p;
|
struct day_item *p;
|
||||||
|
|
||||||
p = day_get_item(item_number);
|
p = day_get_item(item_number);
|
||||||
switch (p->type)
|
switch (p->type) {
|
||||||
{
|
|
||||||
case EVNT:
|
case EVNT:
|
||||||
event_delete_bynum (date, day_item_nb (date, item_number, EVNT),
|
event_delete_bynum(date, day_item_nb(date, item_number, EVNT), ERASE_CUT);
|
||||||
ERASE_CUT);
|
|
||||||
break;
|
break;
|
||||||
case RECUR_EVNT:
|
case RECUR_EVNT:
|
||||||
recur_event_erase(date, day_item_nb(date, item_number, RECUR_EVNT),
|
recur_event_erase(date, day_item_nb(date, item_number, RECUR_EVNT),
|
||||||
DELETE_WHOLE, ERASE_CUT);
|
DELETE_WHOLE, ERASE_CUT);
|
||||||
break;
|
break;
|
||||||
case APPT:
|
case APPT:
|
||||||
apoint_delete_bynum (date, day_item_nb (date, item_number, APPT),
|
apoint_delete_bynum(date, day_item_nb(date, item_number, APPT), ERASE_CUT);
|
||||||
ERASE_CUT);
|
|
||||||
break;
|
break;
|
||||||
case RECUR_APPT:
|
case RECUR_APPT:
|
||||||
recur_apoint_erase(date, p->appt_pos, DELETE_WHOLE, ERASE_CUT);
|
recur_apoint_erase(date, p->appt_pos, DELETE_WHOLE, ERASE_CUT);
|
||||||
@@ -1071,14 +968,12 @@ day_cut_item (long date, int item_number)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Paste a previously cut item. */
|
/* Paste a previously cut item. */
|
||||||
int
|
int day_paste_item(long date, int cut_item_type)
|
||||||
day_paste_item (long date, int cut_item_type)
|
|
||||||
{
|
{
|
||||||
int pasted_item_type;
|
int pasted_item_type;
|
||||||
|
|
||||||
pasted_item_type = cut_item_type;
|
pasted_item_type = cut_item_type;
|
||||||
switch (cut_item_type)
|
switch (cut_item_type) {
|
||||||
{
|
|
||||||
case 0:
|
case 0:
|
||||||
return 0;
|
return 0;
|
||||||
case EVNT:
|
case EVNT:
|
||||||
@@ -1102,15 +997,13 @@ day_paste_item (long date, int cut_item_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a structure containing the selected item. */
|
/* Returns a structure containing the selected item. */
|
||||||
struct day_item *
|
struct day_item *day_get_item(int item_number)
|
||||||
day_get_item (int item_number)
|
|
||||||
{
|
{
|
||||||
return LLIST_GET_DATA(LLIST_NTH(&day_items, item_number - 1));
|
return LLIST_GET_DATA(LLIST_NTH(&day_items, item_number - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the real item number, given its type. */
|
/* Returns the real item number, given its type. */
|
||||||
int
|
int day_item_nb(long date, int day_num, int type)
|
||||||
day_item_nb (long date, int day_num, int type)
|
|
||||||
{
|
{
|
||||||
int i, nb_item[MAX_TYPES];
|
int i, nb_item[MAX_TYPES];
|
||||||
llist_item_t *j;
|
llist_item_t *j;
|
||||||
@@ -1119,8 +1012,7 @@ day_item_nb (long date, int day_num, int type)
|
|||||||
nb_item[i] = 0;
|
nb_item[i] = 0;
|
||||||
|
|
||||||
j = LLIST_FIRST(&day_items);
|
j = LLIST_FIRST(&day_items);
|
||||||
for (i = 1; i < day_num; i++)
|
for (i = 1; i < day_num; i++) {
|
||||||
{
|
|
||||||
struct day_item *day = LLIST_TS_GET_DATA(j);
|
struct day_item *day = LLIST_TS_GET_DATA(j);
|
||||||
nb_item[day->type - 1]++;
|
nb_item[day->type - 1]++;
|
||||||
j = LLIST_TS_NEXT(j);
|
j = LLIST_TS_NEXT(j);
|
||||||
@@ -1130,8 +1022,7 @@ day_item_nb (long date, int day_num, int type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Attach a note to an appointment or event. */
|
/* Attach a note to an appointment or event. */
|
||||||
void
|
void day_edit_note(const char *editor)
|
||||||
day_edit_note (const char *editor)
|
|
||||||
{
|
{
|
||||||
struct day_item *p;
|
struct day_item *p;
|
||||||
struct recur_apoint *ra;
|
struct recur_apoint *ra;
|
||||||
@@ -1146,8 +1037,7 @@ day_edit_note (const char *editor)
|
|||||||
edit_note(&p->note, editor);
|
edit_note(&p->note, editor);
|
||||||
|
|
||||||
date = calendar_get_slctd_day_sec();
|
date = calendar_get_slctd_day_sec();
|
||||||
switch (p->type)
|
switch (p->type) {
|
||||||
{
|
|
||||||
case RECUR_EVNT:
|
case RECUR_EVNT:
|
||||||
re = recur_get_event(date, day_item_nb(date, item_num, RECUR_EVNT));
|
re = recur_get_event(date, day_item_nb(date, item_num, RECUR_EVNT));
|
||||||
re->note = p->note;
|
re->note = p->note;
|
||||||
@@ -1168,16 +1058,14 @@ day_edit_note (const char *editor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* View a note previously attached to an appointment or event */
|
/* View a note previously attached to an appointment or event */
|
||||||
void
|
void day_view_note(const char *pager)
|
||||||
day_view_note (const char *pager)
|
|
||||||
{
|
{
|
||||||
struct day_item *p = day_get_item(apoint_hilt());
|
struct day_item *p = day_get_item(apoint_hilt());
|
||||||
view_note(p->note, pager);
|
view_note(p->note, pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pipe an appointment or event to an external program. */
|
/* Pipe an appointment or event to an external program. */
|
||||||
void
|
void day_pipe_item(void)
|
||||||
day_pipe_item (void)
|
|
||||||
{
|
{
|
||||||
char cmd[BUFSIZ] = "";
|
char cmd[BUFSIZ] = "";
|
||||||
char const *arg[] = { cmd, NULL };
|
char const *arg[] = { cmd, NULL };
|
||||||
@@ -1197,15 +1085,13 @@ day_pipe_item (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
wins_prepare_external();
|
wins_prepare_external();
|
||||||
if ((pid = shell_exec (NULL, &pout, *arg, arg)))
|
if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
|
||||||
{
|
|
||||||
fpout = fdopen(pout, "w");
|
fpout = fdopen(pout, "w");
|
||||||
|
|
||||||
item_num = apoint_hilt();
|
item_num = apoint_hilt();
|
||||||
p = day_get_item(item_num);
|
p = day_get_item(item_num);
|
||||||
date = calendar_get_slctd_day_sec();
|
date = calendar_get_slctd_day_sec();
|
||||||
switch (p->type)
|
switch (p->type) {
|
||||||
{
|
|
||||||
case RECUR_EVNT:
|
case RECUR_EVNT:
|
||||||
re = recur_get_event(date, day_item_nb(date, item_num, RECUR_EVNT));
|
re = recur_get_event(date, day_item_nb(date, item_num, RECUR_EVNT));
|
||||||
recur_event_write(re, fpout);
|
recur_event_write(re, fpout);
|
||||||
|
|||||||
45
src/dmon.c
45
src/dmon.c
@@ -64,26 +64,22 @@
|
|||||||
|
|
||||||
static unsigned data_loaded;
|
static unsigned data_loaded;
|
||||||
|
|
||||||
static void
|
static void dmon_sigs_hdlr(int sig)
|
||||||
dmon_sigs_hdlr (int sig)
|
|
||||||
{
|
{
|
||||||
if (data_loaded)
|
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)
|
if (unlink(path_dpid) != 0) {
|
||||||
{
|
DMON_LOG(_("Could not remove daemon lock file: %s\n"), strerror(errno));
|
||||||
DMON_LOG (_("Could not remove daemon lock file: %s\n"),
|
|
||||||
strerror (errno));
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
static unsigned daemonize(int status)
|
||||||
daemonize (int status)
|
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
@@ -93,8 +89,7 @@ daemonize (int status)
|
|||||||
* First need to fork in order to become a child of the init process,
|
* First need to fork in order to become a child of the init process,
|
||||||
* once the father exits.
|
* once the father exits.
|
||||||
*/
|
*/
|
||||||
switch (fork ())
|
switch (fork()) {
|
||||||
{
|
|
||||||
case -1: /* fork error */
|
case -1: /* fork error */
|
||||||
EXIT(_("Could not fork: %s\n"), strerror(errno));
|
EXIT(_("Could not fork: %s\n"), strerror(errno));
|
||||||
break;
|
break;
|
||||||
@@ -110,8 +105,7 @@ daemonize (int status)
|
|||||||
* Obtain a new process group and session in order to get detached from the
|
* Obtain a new process group and session in order to get detached from the
|
||||||
* controlling terminal.
|
* controlling terminal.
|
||||||
*/
|
*/
|
||||||
if (setsid () == -1)
|
if (setsid() == -1) {
|
||||||
{
|
|
||||||
DMON_LOG(_("Could not detach from the controlling terminal: %s\n"),
|
DMON_LOG(_("Could not detach from the controlling terminal: %s\n"),
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
@@ -121,16 +115,13 @@ daemonize (int status)
|
|||||||
* Change working directory to root directory,
|
* Change working directory to root directory,
|
||||||
* to prevent filesystem unmounts.
|
* to prevent filesystem unmounts.
|
||||||
*/
|
*/
|
||||||
if (chdir ("/") == -1)
|
if (chdir("/") == -1) {
|
||||||
{
|
DMON_LOG(_("Could not change working directory: %s\n"), strerror(errno));
|
||||||
DMON_LOG (_("Could not change working directory: %s\n"),
|
|
||||||
strerror (errno));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Redirect standard file descriptors to /dev/null. */
|
/* Redirect standard file descriptors to /dev/null. */
|
||||||
if ((fd = open (_PATH_DEVNULL, O_RDWR, 0)) != -1)
|
if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
|
||||||
{
|
|
||||||
dup2(fd, STDIN_FILENO);
|
dup2(fd, STDIN_FILENO);
|
||||||
dup2(fd, STDOUT_FILENO);
|
dup2(fd, STDOUT_FILENO);
|
||||||
dup2(fd, STDERR_FILENO);
|
dup2(fd, STDERR_FILENO);
|
||||||
@@ -151,8 +142,7 @@ daemonize (int status)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void dmon_start(int parent_exit_status)
|
||||||
dmon_start (int parent_exit_status)
|
|
||||||
{
|
{
|
||||||
if (!daemonize(parent_exit_status))
|
if (!daemonize(parent_exit_status))
|
||||||
DMON_ABRT(_("Cannot daemonize, aborting\n"));
|
DMON_ABRT(_("Cannot daemonize, aborting\n"));
|
||||||
@@ -161,13 +151,11 @@ dmon_start (int parent_exit_status)
|
|||||||
DMON_ABRT(_("Could not set lock file\n"));
|
DMON_ABRT(_("Could not set lock file\n"));
|
||||||
|
|
||||||
if (!io_file_exist(path_conf))
|
if (!io_file_exist(path_conf))
|
||||||
DMON_ABRT (_("Could not access \"%s\": %s\n"),
|
DMON_ABRT(_("Could not access \"%s\": %s\n"), path_conf, strerror(errno));
|
||||||
path_conf, strerror (errno));
|
|
||||||
config_load();
|
config_load();
|
||||||
|
|
||||||
if (!io_file_exist(path_apts))
|
if (!io_file_exist(path_apts))
|
||||||
DMON_ABRT (_("Could not access \"%s\": %s\n"),
|
DMON_ABRT(_("Could not access \"%s\": %s\n"), path_apts, strerror(errno));
|
||||||
path_apts, strerror (errno));
|
|
||||||
apoint_llist_init();
|
apoint_llist_init();
|
||||||
recur_apoint_llist_init();
|
recur_apoint_llist_init();
|
||||||
event_llist_init();
|
event_llist_init();
|
||||||
@@ -176,16 +164,14 @@ dmon_start (int parent_exit_status)
|
|||||||
data_loaded = 1;
|
data_loaded = 1;
|
||||||
|
|
||||||
DMON_LOG(_("started at %s\n"), nowstr());
|
DMON_LOG(_("started at %s\n"), nowstr());
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
int left;
|
int left;
|
||||||
|
|
||||||
if (!notify_get_next_bkgd())
|
if (!notify_get_next_bkgd())
|
||||||
DMON_ABRT(_("error loading next appointment\n"));
|
DMON_ABRT(_("error loading next appointment\n"));
|
||||||
|
|
||||||
left = notify_time_left();
|
left = notify_time_left();
|
||||||
if (left > 0 && left < nbar.cntdwn && notify_needs_reminder ())
|
if (left > 0 && left < nbar.cntdwn && notify_needs_reminder()) {
|
||||||
{
|
|
||||||
DMON_LOG(_("launching notification at %s for: \"%s\"\n"),
|
DMON_LOG(_("launching notification at %s for: \"%s\"\n"),
|
||||||
nowstr(), notify_app_txt());
|
nowstr(), notify_app_txt());
|
||||||
if (!notify_launch_cmd())
|
if (!notify_launch_cmd())
|
||||||
@@ -204,8 +190,7 @@ dmon_start (int parent_exit_status)
|
|||||||
* Check if calcurse is running in background, and if yes, send a SIGINT
|
* Check if calcurse is running in background, and if yes, send a SIGINT
|
||||||
* signal to stop it.
|
* signal to stop it.
|
||||||
*/
|
*/
|
||||||
void
|
void dmon_stop(void)
|
||||||
dmon_stop (void)
|
|
||||||
{
|
{
|
||||||
int dpid;
|
int dpid;
|
||||||
|
|
||||||
|
|||||||
48
src/event.c
48
src/event.c
@@ -44,27 +44,23 @@
|
|||||||
llist_t eventlist;
|
llist_t eventlist;
|
||||||
static struct event bkp_cut_event;
|
static struct event bkp_cut_event;
|
||||||
|
|
||||||
void
|
void event_free_bkp(void)
|
||||||
event_free_bkp (void)
|
|
||||||
{
|
|
||||||
if (bkp_cut_event.mesg)
|
|
||||||
{
|
{
|
||||||
|
if (bkp_cut_event.mesg) {
|
||||||
mem_free(bkp_cut_event.mesg);
|
mem_free(bkp_cut_event.mesg);
|
||||||
bkp_cut_event.mesg = 0;
|
bkp_cut_event.mesg = 0;
|
||||||
}
|
}
|
||||||
erase_note(&bkp_cut_event.note);
|
erase_note(&bkp_cut_event.note);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void event_free(struct event *ev)
|
||||||
event_free (struct event *ev)
|
|
||||||
{
|
{
|
||||||
mem_free(ev->mesg);
|
mem_free(ev->mesg);
|
||||||
erase_note(&ev->note);
|
erase_note(&ev->note);
|
||||||
mem_free(ev);
|
mem_free(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void event_dup(struct event *in, struct event *bkp)
|
||||||
event_dup (struct event *in, struct event *bkp)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(!in || !bkp, _("null pointer"));
|
EXIT_IF(!in || !bkp, _("null pointer"));
|
||||||
|
|
||||||
@@ -75,28 +71,24 @@ event_dup (struct event *in, struct event *bkp)
|
|||||||
bkp->note = mem_strdup(in->note);
|
bkp->note = mem_strdup(in->note);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void event_llist_init(void)
|
||||||
event_llist_init (void)
|
|
||||||
{
|
{
|
||||||
LLIST_INIT(&eventlist);
|
LLIST_INIT(&eventlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void event_llist_free(void)
|
||||||
event_llist_free (void)
|
|
||||||
{
|
{
|
||||||
LLIST_FREE_INNER(&eventlist, event_free);
|
LLIST_FREE_INNER(&eventlist, event_free);
|
||||||
LLIST_FREE(&eventlist);
|
LLIST_FREE(&eventlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int event_cmp_day(struct event *a, struct event *b)
|
||||||
event_cmp_day (struct event *a, struct event *b)
|
|
||||||
{
|
{
|
||||||
return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1);
|
return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a new event */
|
/* Create a new event */
|
||||||
struct event *
|
struct event *event_new(char *mesg, char *note, long day, int id)
|
||||||
event_new (char *mesg, char *note, long day, int id)
|
|
||||||
{
|
{
|
||||||
struct event *ev;
|
struct event *ev;
|
||||||
|
|
||||||
@@ -112,15 +104,13 @@ event_new (char *mesg, char *note, long day, int id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the event belongs to the selected day */
|
/* Check if the event belongs to the selected day */
|
||||||
unsigned
|
unsigned event_inday(struct event *i, long start)
|
||||||
event_inday (struct event *i, long start)
|
|
||||||
{
|
{
|
||||||
return (i->day < start + DAYINSEC && i->day >= start);
|
return (i->day < start + DAYINSEC && i->day >= start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write to file the event in user-friendly format */
|
/* Write to file the event in user-friendly format */
|
||||||
void
|
void event_write(struct event *o, FILE * f)
|
||||||
event_write (struct event *o, FILE *f)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -135,8 +125,7 @@ event_write (struct event *o, FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load the events from file */
|
/* Load the events from file */
|
||||||
struct event *
|
struct event *event_scan(FILE * f, struct tm start, int id, char *note)
|
||||||
event_scan (FILE *f, struct tm start, int id, char *note)
|
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ], *nl;
|
char buf[BUFSIZ], *nl;
|
||||||
time_t tstart, t;
|
time_t tstart, t;
|
||||||
@@ -149,8 +138,7 @@ event_scan (FILE *f, struct tm start, int id, char *note)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
nl = strchr(buf, '\n');
|
nl = strchr(buf, '\n');
|
||||||
if (nl)
|
if (nl) {
|
||||||
{
|
|
||||||
*nl = '\0';
|
*nl = '\0';
|
||||||
}
|
}
|
||||||
start.tm_hour = 0;
|
start.tm_hour = 0;
|
||||||
@@ -167,8 +155,7 @@ event_scan (FILE *f, struct tm start, int id, char *note)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve an event from the list, given the day and item position. */
|
/* Retrieve an event from the list, given the day and item position. */
|
||||||
struct event *
|
struct event *event_get(long day, int pos)
|
||||||
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);
|
||||||
|
|
||||||
@@ -180,8 +167,7 @@ event_get (long day, int pos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Delete an event from the list. */
|
/* Delete an event from the list. */
|
||||||
void
|
void event_delete_bynum(long start, unsigned num, enum eraseflg flag)
|
||||||
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);
|
||||||
|
|
||||||
@@ -189,8 +175,7 @@ event_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
|||||||
EXIT(_("no such appointment"));
|
EXIT(_("no such appointment"));
|
||||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
switch (flag)
|
switch (flag) {
|
||||||
{
|
|
||||||
case ERASE_FORCE_ONLY_NOTE:
|
case ERASE_FORCE_ONLY_NOTE:
|
||||||
erase_note(&ev->note);
|
erase_note(&ev->note);
|
||||||
break;
|
break;
|
||||||
@@ -207,8 +192,7 @@ event_delete_bynum (long start, unsigned num, enum eraseflg flag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void event_paste_item(void)
|
||||||
event_paste_item (void)
|
|
||||||
{
|
{
|
||||||
event_new(bkp_cut_event.mesg, bkp_cut_event.note,
|
event_new(bkp_cut_event.mesg, bkp_cut_event.note,
|
||||||
date2sec(*calendar_get_slctd_day(), 0, 0), bkp_cut_event.id);
|
date2sec(*calendar_get_slctd_day(), 0, 0), bkp_cut_event.id);
|
||||||
|
|||||||
@@ -48,8 +48,7 @@ struct getstr_status {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Print the string at the desired position. */
|
/* Print the string at the desired position. */
|
||||||
static void
|
static void getstr_print(WINDOW * win, int x, int y, struct getstr_status *st)
|
||||||
getstr_print (WINDOW *win, int x, int y, struct getstr_status *st)
|
|
||||||
{
|
{
|
||||||
char c = 0;
|
char c = 0;
|
||||||
|
|
||||||
@@ -73,8 +72,7 @@ getstr_print (WINDOW *win, int x, int y, struct getstr_status *st)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Delete a character at the given position in string. */
|
/* Delete a character at the given position in string. */
|
||||||
static void
|
static void getstr_del_char(struct getstr_status *st)
|
||||||
getstr_del_char (struct getstr_status *st)
|
|
||||||
{
|
{
|
||||||
char *str = st->s + st->ci[st->pos].offset;
|
char *str = st->s + st->ci[st->pos].offset;
|
||||||
int cl = st->ci[st->pos + 1].offset - st->ci[st->pos].offset;
|
int cl = st->ci[st->pos + 1].offset - st->ci[st->pos].offset;
|
||||||
@@ -84,16 +82,14 @@ getstr_del_char (struct getstr_status *st)
|
|||||||
memmove(str, str + cl, strlen(str) + 1);
|
memmove(str, str + cl, strlen(str) + 1);
|
||||||
|
|
||||||
st->len--;
|
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].offset = st->ci[i + 1].offset - cl;
|
||||||
st->ci[i].dpyoff = st->ci[i + 1].dpyoff - cw;
|
st->ci[i].dpyoff = st->ci[i + 1].dpyoff - cw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a character at the given position in string. */
|
/* Add a character at the given position in string. */
|
||||||
static void
|
static void getstr_ins_char(struct getstr_status *st, char *c)
|
||||||
getstr_ins_char (struct getstr_status *st, char *c)
|
|
||||||
{
|
{
|
||||||
char *str = st->s + st->ci[st->pos].offset;
|
char *str = st->s + st->ci[st->pos].offset;
|
||||||
int cl = UTF8_LENGTH(c[0]);
|
int cl = UTF8_LENGTH(c[0]);
|
||||||
@@ -104,16 +100,14 @@ getstr_ins_char (struct getstr_status *st, char *c)
|
|||||||
for (i = 0; i < cl; i++, str++)
|
for (i = 0; i < cl; i++, str++)
|
||||||
*str = c[i];
|
*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].offset = st->ci[i].offset + cl;
|
||||||
st->ci[i + 1].dpyoff = st->ci[i].dpyoff + cw;
|
st->ci[i + 1].dpyoff = st->ci[i].dpyoff + cw;
|
||||||
}
|
}
|
||||||
st->len++;
|
st->len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void bell(void)
|
||||||
bell (void)
|
|
||||||
{
|
{
|
||||||
putchar('\a');
|
putchar('\a');
|
||||||
}
|
}
|
||||||
@@ -128,8 +122,7 @@ getstr_init (struct getstr_status *st, char *str, struct getstr_charinfo *ci)
|
|||||||
st->ci = ci;
|
st->ci = ci;
|
||||||
|
|
||||||
st->len = width = 0;
|
st->len = width = 0;
|
||||||
while (*str)
|
while (*str) {
|
||||||
{
|
|
||||||
st->ci[st->len].offset = str - st->s;
|
st->ci[st->len].offset = str - st->s;
|
||||||
st->ci[st->len].dpyoff = width;
|
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. */
|
/* Scroll left/right if the cursor moves outside the window range. */
|
||||||
static void
|
static void getstr_fixscr(struct getstr_status *st)
|
||||||
getstr_fixscr (struct getstr_status *st)
|
|
||||||
{
|
{
|
||||||
const int pgsize = col / 3;
|
const int pgsize = col / 3;
|
||||||
int pgskip;
|
int pgskip;
|
||||||
|
|
||||||
while (st->pos < st->scrpos)
|
while (st->pos < st->scrpos) {
|
||||||
{
|
|
||||||
pgskip = 0;
|
pgskip = 0;
|
||||||
while (pgskip < pgsize && st->scrpos > 0)
|
while (pgskip < pgsize && st->scrpos > 0) {
|
||||||
{
|
|
||||||
st->scrpos--;
|
st->scrpos--;
|
||||||
pgskip += st->ci[st->scrpos + 1].dpyoff - st->ci[st->scrpos].dpyoff;
|
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;
|
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;
|
pgskip += st->ci[st->scrpos + 1].dpyoff - st->ci[st->scrpos].dpyoff;
|
||||||
st->scrpos++;
|
st->scrpos++;
|
||||||
}
|
}
|
||||||
@@ -179,8 +167,7 @@ getstr_fixscr (struct getstr_status *st)
|
|||||||
* environment, otherwise the cursor would move from place to place without
|
* environment, otherwise the cursor would move from place to place without
|
||||||
* control.
|
* control.
|
||||||
*/
|
*/
|
||||||
enum getstr
|
enum getstr getstring(WINDOW * win, char *str, int l, int x, int y)
|
||||||
getstring (WINDOW *win, char *str, int l, int x, int y)
|
|
||||||
{
|
{
|
||||||
struct getstr_status st;
|
struct getstr_status st;
|
||||||
struct getstr_charinfo ci[l + 1];
|
struct getstr_charinfo ci[l + 1];
|
||||||
@@ -196,19 +183,17 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
|
|||||||
getstr_print(win, x, y, &st);
|
getstr_print(win, x, y, &st);
|
||||||
wins_doupdate();
|
wins_doupdate();
|
||||||
|
|
||||||
if ((ch = wgetch (win)) == '\n') break;
|
if ((ch = wgetch(win)) == '\n')
|
||||||
switch (ch)
|
break;
|
||||||
{
|
switch (ch) {
|
||||||
case KEY_BACKSPACE: /* delete one character */
|
case KEY_BACKSPACE: /* delete one character */
|
||||||
case 330:
|
case 330:
|
||||||
case 127:
|
case 127:
|
||||||
case CTRL('H'):
|
case CTRL('H'):
|
||||||
if (st.pos > 0)
|
if (st.pos > 0) {
|
||||||
{
|
|
||||||
st.pos--;
|
st.pos--;
|
||||||
getstr_del_char(&st);
|
getstr_del_char(&st);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
bell();
|
bell();
|
||||||
break;
|
break;
|
||||||
case CTRL('D'): /* delete next character */
|
case CTRL('D'): /* delete next character */
|
||||||
@@ -219,18 +204,15 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
|
|||||||
break;
|
break;
|
||||||
case CTRL('W'): /* delete a word */
|
case CTRL('W'): /* delete a word */
|
||||||
if (st.pos > 0) {
|
if (st.pos > 0) {
|
||||||
while (st.pos && st.s[st.ci[st.pos - 1].offset] == ' ')
|
while (st.pos && st.s[st.ci[st.pos - 1].offset] == ' ') {
|
||||||
{
|
|
||||||
st.pos--;
|
st.pos--;
|
||||||
getstr_del_char(&st);
|
getstr_del_char(&st);
|
||||||
}
|
}
|
||||||
while (st.pos && st.s[st.ci[st.pos - 1].offset] != ' ')
|
while (st.pos && st.s[st.ci[st.pos - 1].offset] != ' ') {
|
||||||
{
|
|
||||||
st.pos--;
|
st.pos--;
|
||||||
getstr_del_char(&st);
|
getstr_del_char(&st);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
bell();
|
bell();
|
||||||
break;
|
break;
|
||||||
case CTRL('K'): /* delete to end-of-line */
|
case CTRL('K'): /* delete to end-of-line */
|
||||||
@@ -245,11 +227,13 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
|
|||||||
break;
|
break;
|
||||||
case KEY_LEFT: /* move one char backward */
|
case KEY_LEFT: /* move one char backward */
|
||||||
case CTRL('B'):
|
case CTRL('B'):
|
||||||
if (st.pos > 0) st.pos--;
|
if (st.pos > 0)
|
||||||
|
st.pos--;
|
||||||
break;
|
break;
|
||||||
case KEY_RIGHT: /* move one char forward */
|
case KEY_RIGHT: /* move one char forward */
|
||||||
case CTRL('F'):
|
case CTRL('F'):
|
||||||
if (st.pos < st.len) st.pos++;
|
if (st.pos < st.len)
|
||||||
|
st.pos++;
|
||||||
break;
|
break;
|
||||||
case ESCAPE: /* cancel editing */
|
case ESCAPE: /* cancel editing */
|
||||||
return GETSTRING_ESC;
|
return GETSTRING_ESC;
|
||||||
@@ -258,8 +242,7 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
|
|||||||
c[0] = ch;
|
c[0] = ch;
|
||||||
for (k = 1; k < MIN(UTF8_LENGTH(c[0]), UTF8_MAXLEN); k++)
|
for (k = 1; k < MIN(UTF8_LENGTH(c[0]), UTF8_MAXLEN); k++)
|
||||||
c[k] = (unsigned char)wgetch(win);
|
c[k] = (unsigned char)wgetch(win);
|
||||||
if (st.ci[st.len].offset + k < l)
|
if (st.ci[st.len].offset + k < l) {
|
||||||
{
|
|
||||||
getstr_ins_char(&st, c);
|
getstr_ins_char(&st, c);
|
||||||
st.pos++;
|
st.pos++;
|
||||||
}
|
}
|
||||||
@@ -272,8 +255,7 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Update an already existing string. */
|
/* Update an already existing string. */
|
||||||
int
|
int updatestring(WINDOW * win, char **str, int x, int y)
|
||||||
updatestring (WINDOW *win, char **str, int x, int y)
|
|
||||||
{
|
{
|
||||||
int len = strlen(*str);
|
int len = strlen(*str);
|
||||||
char *buf;
|
char *buf;
|
||||||
@@ -286,8 +268,7 @@ updatestring (WINDOW *win, char **str, int x, int y)
|
|||||||
|
|
||||||
ret = getstring(win, buf, BUFSIZ, x, y);
|
ret = getstring(win, buf, BUFSIZ, x, y);
|
||||||
|
|
||||||
if (ret == GETSTRING_VALID)
|
if (ret == GETSTRING_VALID) {
|
||||||
{
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
*str = mem_realloc(*str, len + 1, 1);
|
*str = mem_realloc(*str, len + 1, 1);
|
||||||
EXIT_IF(*str == NULL, _("out of memory"));
|
EXIT_IF(*str == NULL, _("out of memory"));
|
||||||
|
|||||||
90
src/help.c
90
src/help.c
@@ -48,8 +48,7 @@ typedef struct {
|
|||||||
char text[HELPTEXTSIZ];
|
char text[HELPTEXTSIZ];
|
||||||
} help_page_t;
|
} help_page_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
HELP_MAIN,
|
HELP_MAIN,
|
||||||
HELP_SAVE,
|
HELP_SAVE,
|
||||||
HELP_IMPORT,
|
HELP_IMPORT,
|
||||||
@@ -74,18 +73,15 @@ typedef enum
|
|||||||
HELP_CREDITS,
|
HELP_CREDITS,
|
||||||
HELPSCREENS,
|
HELPSCREENS,
|
||||||
NOPAGE
|
NOPAGE
|
||||||
}
|
} help_pages_e;
|
||||||
help_pages_e;
|
|
||||||
|
|
||||||
/* Returns the number of lines in an help text. */
|
/* Returns the number of lines in an help text. */
|
||||||
static int
|
static int get_help_lines(char *text)
|
||||||
get_help_lines (char *text)
|
|
||||||
{
|
{
|
||||||
int i, newline;
|
int i, newline;
|
||||||
|
|
||||||
newline = 0;
|
newline = 0;
|
||||||
for (i = 0; text[i]; i++)
|
for (i = 0; text[i]; i++) {
|
||||||
{
|
|
||||||
if (text[i] == '\n')
|
if (text[i] == '\n')
|
||||||
newline++;
|
newline++;
|
||||||
}
|
}
|
||||||
@@ -109,8 +105,7 @@ help_write_pad (struct window *win, char *title, char *text, enum key action)
|
|||||||
custom_apply_attr(win->p, ATTR_HIGHEST);
|
custom_apply_attr(win->p, ATTR_HIGHEST);
|
||||||
mvwprintw(win->p, rownum, colnum, "%s", title);
|
mvwprintw(win->p, rownum, colnum, "%s", title);
|
||||||
if ((int)action != KEY_RESIZE && action < NBKEYS) {
|
if ((int)action != KEY_RESIZE && action < NBKEYS) {
|
||||||
switch (action)
|
switch (action) {
|
||||||
{
|
|
||||||
case KEY_END_OF_WEEK:
|
case KEY_END_OF_WEEK:
|
||||||
case KEY_START_OF_WEEK:
|
case KEY_START_OF_WEEK:
|
||||||
case KEY_MOVE_UP:
|
case KEY_MOVE_UP:
|
||||||
@@ -133,8 +128,7 @@ help_write_pad (struct window *win, char *title, char *text, enum key action)
|
|||||||
default:
|
default:
|
||||||
bindings = keys_action_allkeys(action);
|
bindings = keys_action_allkeys(action);
|
||||||
|
|
||||||
if (bindings)
|
if (bindings) {
|
||||||
{
|
|
||||||
colnum = win->w - strlen(bindings_title) - strlen(bindings);
|
colnum = win->w - strlen(bindings_title) - strlen(bindings);
|
||||||
mvwprintw(win->p, rownum, colnum, bindings_title, bindings);
|
mvwprintw(win->p, rownum, colnum, bindings_title, bindings);
|
||||||
}
|
}
|
||||||
@@ -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
|
* Create and init help screen and its pad, which is used to make the scrolling
|
||||||
* faster.
|
* faster.
|
||||||
*/
|
*/
|
||||||
void
|
void help_wins_init(struct scrollwin *hwin, int x, int y, int h, int w)
|
||||||
help_wins_init (struct scrollwin *hwin, int x, int y, int h, int w)
|
|
||||||
{
|
{
|
||||||
const int PADOFFSET = 4;
|
const int PADOFFSET = 4;
|
||||||
const int TITLELINES = 3;
|
const int TITLELINES = 3;
|
||||||
@@ -177,8 +170,7 @@ help_wins_init (struct scrollwin *hwin, int x, int y, int h, int w)
|
|||||||
* Delete the existing windows and recreate them with their new
|
* Delete the existing windows and recreate them with their new
|
||||||
* size and placement.
|
* size and placement.
|
||||||
*/
|
*/
|
||||||
static void
|
static void help_wins_reinit(struct scrollwin *hwin)
|
||||||
help_wins_reinit (struct scrollwin *hwin)
|
|
||||||
{
|
{
|
||||||
wins_scrollwin_delete(hwin);
|
wins_scrollwin_delete(hwin);
|
||||||
wins_get_config();
|
wins_get_config();
|
||||||
@@ -186,8 +178,7 @@ help_wins_reinit (struct scrollwin *hwin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reset the screen, needed when resizing terminal for example. */
|
/* Reset the screen, needed when resizing terminal for example. */
|
||||||
static void
|
static void help_wins_reset(struct scrollwin *hwin)
|
||||||
help_wins_reset (struct scrollwin *hwin)
|
|
||||||
{
|
{
|
||||||
endwin();
|
endwin();
|
||||||
wins_refresh();
|
wins_refresh();
|
||||||
@@ -204,13 +195,11 @@ help_wins_reset (struct scrollwin *hwin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Association between a key pressed and its corresponding help page. */
|
/* Association between a key pressed and its corresponding help page. */
|
||||||
static int
|
static int wanted_page(int ch)
|
||||||
wanted_page (int ch)
|
|
||||||
{
|
{
|
||||||
int page;
|
int page;
|
||||||
|
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
|
|
||||||
case KEY_GENERIC_HELP:
|
case KEY_GENERIC_HELP:
|
||||||
page = HELP_MAIN;
|
page = HELP_MAIN;
|
||||||
@@ -323,8 +312,7 @@ wanted_page (int ch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Draws the help screen */
|
/* Draws the help screen */
|
||||||
void
|
void help_screen(void)
|
||||||
help_screen (void)
|
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
MOVE_UP,
|
MOVE_UP,
|
||||||
@@ -343,7 +331,8 @@ help_screen (void)
|
|||||||
hscr[HELP_MAIN].title =
|
hscr[HELP_MAIN].title =
|
||||||
_(" Welcome to Calcurse. This is the main help screen.\n");
|
_(" Welcome to Calcurse. This is the main help screen.\n");
|
||||||
snprintf(hscr[HELP_MAIN].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_MAIN].text, HELPTEXTSIZ,
|
||||||
_("Moving around: Press '%s' or '%s' to scroll text upward or downward\n"
|
_
|
||||||
|
("Moving around: Press '%s' or '%s' to scroll text upward or downward\n"
|
||||||
" inside help screens, if necessary.\n\n"
|
" inside help screens, if necessary.\n\n"
|
||||||
" Exit help: When finished, press '%s' to exit help and go back to\n"
|
" Exit help: When finished, press '%s' to exit help and go back to\n"
|
||||||
" the main Calcurse screen.\n\n"
|
" the main Calcurse screen.\n\n"
|
||||||
@@ -410,12 +399,9 @@ help_screen (void)
|
|||||||
" events, appointments, todos.\n"));
|
" events, appointments, todos.\n"));
|
||||||
|
|
||||||
strncpy(keystr[MOVE_UP], keys_action_allkeys(KEY_MOVE_UP), BUFSIZ);
|
strncpy(keystr[MOVE_UP], keys_action_allkeys(KEY_MOVE_UP), BUFSIZ);
|
||||||
strncpy (keystr[MOVE_DOWN], keys_action_allkeys (KEY_MOVE_DOWN),
|
strncpy(keystr[MOVE_DOWN], keys_action_allkeys(KEY_MOVE_DOWN), BUFSIZ);
|
||||||
BUFSIZ);
|
strncpy(keystr[MOVE_LEFT], keys_action_allkeys(KEY_MOVE_LEFT), BUFSIZ);
|
||||||
strncpy (keystr[MOVE_LEFT], keys_action_allkeys (KEY_MOVE_LEFT),
|
strncpy(keystr[MOVE_RIGHT], keys_action_allkeys(KEY_MOVE_RIGHT), BUFSIZ);
|
||||||
BUFSIZ);
|
|
||||||
strncpy (keystr[MOVE_RIGHT], keys_action_allkeys (KEY_MOVE_RIGHT),
|
|
||||||
BUFSIZ);
|
|
||||||
hscr[HELP_DISPLACEMENT].title = _("Displacement keys\n");
|
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"
|
_("Move around inside calcurse screens.\n"
|
||||||
@@ -445,7 +431,8 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_VIEW].title = _("View\n");
|
hscr[HELP_VIEW].title = _("View\n");
|
||||||
snprintf(hscr[HELP_VIEW].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_VIEW].text, HELPTEXTSIZ,
|
||||||
_("View the item you select in either the Todo or Appointment panel.\n"
|
_
|
||||||
|
("View the item you select in either the Todo or Appointment panel.\n"
|
||||||
"\nThis is usefull when an event description is longer than the "
|
"\nThis is usefull when an event description is longer than the "
|
||||||
"available\nspace to display it. "
|
"available\nspace to display it. "
|
||||||
"If that is the case, the description will be\n"
|
"If that is the case, the description will be\n"
|
||||||
@@ -453,8 +440,7 @@ help_screen (void)
|
|||||||
"description, just press '%s' and a popup window will appear, containing\n"
|
"description, just press '%s' and a popup window will appear, containing\n"
|
||||||
"the whole event.\n"
|
"the whole event.\n"
|
||||||
"\nPress any key to close the popup window and go back to the main\n"
|
"\nPress any key to close the popup window and go back to the main\n"
|
||||||
"Calcurse screen."),
|
"Calcurse screen."), keys_action_firstkey(KEY_VIEW_ITEM));
|
||||||
keys_action_firstkey (KEY_VIEW_ITEM));
|
|
||||||
|
|
||||||
hscr[HELP_PIPE].title = _("Pipe\n");
|
hscr[HELP_PIPE].title = _("Pipe\n");
|
||||||
snprintf(hscr[HELP_PIPE].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_PIPE].text, HELPTEXTSIZ,
|
||||||
@@ -506,7 +492,8 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_ADD].title = _("Add\n");
|
hscr[HELP_ADD].title = _("Add\n");
|
||||||
snprintf(hscr[HELP_ADD].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_ADD].text, HELPTEXTSIZ,
|
||||||
_("Add an item in either the ToDo or Appointment list, depending on which\n"
|
_
|
||||||
|
("Add an item in either the ToDo or Appointment list, depending on which\n"
|
||||||
"panel is selected when you press '%s'.\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"
|
"\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 "
|
"\ndescription of this new item. Then you will be asked to specify the "
|
||||||
@@ -543,7 +530,8 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_CUT_PASTE].title = _("Cut and Paste\n");
|
hscr[HELP_CUT_PASTE].title = _("Cut and Paste\n");
|
||||||
snprintf(hscr[HELP_CUT_PASTE].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_CUT_PASTE].text, HELPTEXTSIZ,
|
||||||
_("Cut and paste the currently selected item. This is useful to quickly\n"
|
_
|
||||||
|
("Cut and paste the currently selected item. This is useful to quickly\n"
|
||||||
"move an item from one date to another.\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"
|
"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"
|
"then press '%s' to cut this item. It will be removed from the panel.\n"
|
||||||
@@ -576,7 +564,8 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_ENOTE].title = _("EditNote\n");
|
hscr[HELP_ENOTE].title = _("EditNote\n");
|
||||||
snprintf(hscr[HELP_ENOTE].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_ENOTE].text, HELPTEXTSIZ,
|
||||||
_("Attach a note to any type of item, or edit an already existing note.\n"
|
_
|
||||||
|
("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"
|
"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"
|
"of your item description, or if you would like to add sub-tasks to an\n"
|
||||||
"already existing todo item for example.\n"
|
"already existing todo item for example.\n"
|
||||||
@@ -597,26 +586,26 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_VNOTE].title = _("ViewNote\n");
|
hscr[HELP_VNOTE].title = _("ViewNote\n");
|
||||||
snprintf(hscr[HELP_VNOTE].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_VNOTE].text, HELPTEXTSIZ,
|
||||||
_("View a note which was previously attached to an item (an item which\n"
|
_
|
||||||
|
("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"
|
"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"
|
"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"
|
"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"
|
"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 "
|
"\nwas pressed, you will be driven to an external pager to view that "
|
||||||
"note.\n"
|
"note.\n" "The default pager is chosen the following way:\n"
|
||||||
"The default pager is chosen the following way:\n"
|
|
||||||
" o if the 'PAGER' environment variable is set, then this will be\n"
|
" o if the 'PAGER' environment variable is set, then this will be\n"
|
||||||
" the default viewer to be called.\n"
|
" the default viewer to be called.\n"
|
||||||
" o if the above environment variable is not set, then\n"
|
" o if the above environment variable is not set, then\n"
|
||||||
" '/usr/bin/less' will be used.\n"
|
" '/usr/bin/less' will be used.\n"
|
||||||
"As for editing a note, quit the pager and you will be driven back to\n"
|
"As for editing a note, quit the pager and you will be driven back to\n"
|
||||||
"Calcurse."),
|
"Calcurse."), keys_action_firstkey(KEY_EDIT_NOTE),
|
||||||
keys_action_firstkey (KEY_EDIT_NOTE),
|
|
||||||
keys_action_firstkey(KEY_VIEW_NOTE));
|
keys_action_firstkey(KEY_VIEW_NOTE));
|
||||||
|
|
||||||
hscr[HELP_PRIORITY].title = _("Priority\n");
|
hscr[HELP_PRIORITY].title = _("Priority\n");
|
||||||
snprintf(hscr[HELP_PRIORITY].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_PRIORITY].text, HELPTEXTSIZ,
|
||||||
_("Change the priority of the currently selected item in the ToDo list.\n"
|
_
|
||||||
|
("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"
|
"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"
|
"todo description. This number goes from 9 for the lowest priority to\n"
|
||||||
"1 for the highest priority.\n"
|
"1 for the highest priority.\n"
|
||||||
@@ -661,7 +650,8 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_FLAG].title = _("Flag Item\n");
|
hscr[HELP_FLAG].title = _("Flag Item\n");
|
||||||
snprintf(hscr[HELP_FLAG].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_FLAG].text, HELPTEXTSIZ,
|
||||||
_("Toggle an appointment's 'important' flag or a todo's 'completed' flag.\n"
|
_
|
||||||
|
("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"
|
"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"
|
"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"
|
"or when using the '-t' command line flag (unless specifying '0' as the\n"
|
||||||
@@ -690,7 +680,8 @@ help_screen (void)
|
|||||||
|
|
||||||
hscr[HELP_GENERAL].title = _("Generic keybindings\n");
|
hscr[HELP_GENERAL].title = _("Generic keybindings\n");
|
||||||
snprintf(hscr[HELP_GENERAL].text, HELPTEXTSIZ,
|
snprintf(hscr[HELP_GENERAL].text, HELPTEXTSIZ,
|
||||||
_("Some of the keybindings apply whatever panel is selected. They are\n"
|
_
|
||||||
|
("Some of the keybindings apply whatever panel is selected. They are\n"
|
||||||
"called generic keybinding.\n"
|
"called generic keybinding.\n"
|
||||||
"Here is the list of all the generic key bindings, together with their\n"
|
"Here is the list of all the generic key bindings, together with their\n"
|
||||||
"corresponding action:\n\n"
|
"corresponding action:\n\n"
|
||||||
@@ -756,10 +747,8 @@ help_screen (void)
|
|||||||
need_resize = 0;
|
need_resize = 0;
|
||||||
|
|
||||||
/* Display the help screen related to user input. */
|
/* Display the help screen related to user input. */
|
||||||
while (ch != KEY_GENERIC_QUIT)
|
while (ch != KEY_GENERIC_QUIT) {
|
||||||
{
|
erase_window_part(hwin.win.p, 1, hwin.pad.y, col - 2, hwin.win.h - 2);
|
||||||
erase_window_part (hwin.win.p, 1, hwin.pad.y, col - 2,
|
|
||||||
hwin.win.h - 2);
|
|
||||||
|
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case KEY_GENERIC_SCROLL_DOWN:
|
case KEY_GENERIC_SCROLL_DOWN:
|
||||||
@@ -780,8 +769,7 @@ help_screen (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
wins_get_config();
|
wins_get_config();
|
||||||
help_wins_reset(&hwin);
|
help_wins_reset(&hwin);
|
||||||
|
|||||||
435
src/ical.c
435
src/ical.c
@@ -72,8 +72,7 @@ static const char *ical_recur_type[RECUR_TYPES] =
|
|||||||
{ "", "DAILY", "WEEKLY", "MONTHLY", "YEARLY" };
|
{ "", "DAILY", "WEEKLY", "MONTHLY", "YEARLY" };
|
||||||
|
|
||||||
/* iCal alarm notification. */
|
/* iCal alarm notification. */
|
||||||
static void
|
static void ical_export_valarm(FILE * stream)
|
||||||
ical_export_valarm (FILE *stream)
|
|
||||||
{
|
{
|
||||||
fputs("BEGIN:VALARM\n", stream);
|
fputs("BEGIN:VALARM\n", stream);
|
||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
@@ -84,8 +83,7 @@ ical_export_valarm (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export header. */
|
/* Export header. */
|
||||||
static void
|
static void ical_export_header(FILE * stream)
|
||||||
ical_export_header (FILE *stream)
|
|
||||||
{
|
{
|
||||||
fputs("BEGIN:VCALENDAR\n", stream);
|
fputs("BEGIN:VCALENDAR\n", stream);
|
||||||
fprintf(stream, "PRODID:-//calcurse//NONSGML v%s//EN\n", VERSION);
|
fprintf(stream, "PRODID:-//calcurse//NONSGML v%s//EN\n", VERSION);
|
||||||
@@ -93,21 +91,18 @@ ical_export_header (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export footer. */
|
/* Export footer. */
|
||||||
static void
|
static void ical_export_footer(FILE * stream)
|
||||||
ical_export_footer (FILE *stream)
|
|
||||||
{
|
{
|
||||||
fputs("END:VCALENDAR\n", stream);
|
fputs("END:VCALENDAR\n", stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Export recurrent events. */
|
/* Export recurrent events. */
|
||||||
static void
|
static void ical_export_recur_events(FILE * stream)
|
||||||
ical_export_recur_events (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i, *j;
|
llist_item_t *i, *j;
|
||||||
char ical_date[BUFSIZ];
|
char ical_date[BUFSIZ];
|
||||||
|
|
||||||
LLIST_FOREACH (&recur_elist, i)
|
LLIST_FOREACH(&recur_elist, i) {
|
||||||
{
|
|
||||||
struct recur_event *rev = LLIST_GET_DATA(i);
|
struct recur_event *rev = LLIST_GET_DATA(i);
|
||||||
date_sec2date_fmt(rev->day, ICALDATEFMT, ical_date);
|
date_sec2date_fmt(rev->day, ICALDATEFMT, ical_date);
|
||||||
fputs("BEGIN:VEVENT\n", stream);
|
fputs("BEGIN:VEVENT\n", stream);
|
||||||
@@ -115,19 +110,15 @@ ical_export_recur_events (FILE *stream)
|
|||||||
fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d",
|
fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d",
|
||||||
ical_recur_type[rev->rpt->type], rev->rpt->freq);
|
ical_recur_type[rev->rpt->type], rev->rpt->freq);
|
||||||
|
|
||||||
if (rev->rpt->until != 0)
|
if (rev->rpt->until != 0) {
|
||||||
{
|
|
||||||
date_sec2date_fmt(rev->rpt->until, ICALDATEFMT, ical_date);
|
date_sec2date_fmt(rev->rpt->until, ICALDATEFMT, ical_date);
|
||||||
fprintf(stream, ";UNTIL=%s\n", ical_date);
|
fprintf(stream, ";UNTIL=%s\n", ical_date);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
fputc('\n', stream);
|
fputc('\n', stream);
|
||||||
|
|
||||||
if (LLIST_FIRST (&rev->exc))
|
if (LLIST_FIRST(&rev->exc)) {
|
||||||
{
|
|
||||||
fputs("EXDATE:", stream);
|
fputs("EXDATE:", stream);
|
||||||
LLIST_FOREACH (&rev->exc, j)
|
LLIST_FOREACH(&rev->exc, j) {
|
||||||
{
|
|
||||||
struct excp *exc = LLIST_GET_DATA(j);
|
struct excp *exc = LLIST_GET_DATA(j);
|
||||||
date_sec2date_fmt(exc->st, ICALDATEFMT, ical_date);
|
date_sec2date_fmt(exc->st, ICALDATEFMT, ical_date);
|
||||||
fprintf(stream, "%s", ical_date);
|
fprintf(stream, "%s", ical_date);
|
||||||
@@ -144,14 +135,12 @@ ical_export_recur_events (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export events. */
|
/* Export events. */
|
||||||
static void
|
static void ical_export_events(FILE * stream)
|
||||||
ical_export_events (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
char ical_date[BUFSIZ];
|
char ical_date[BUFSIZ];
|
||||||
|
|
||||||
LLIST_FOREACH (&eventlist, i)
|
LLIST_FOREACH(&eventlist, i) {
|
||||||
{
|
|
||||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||||
date_sec2date_fmt(ev->day, ICALDATEFMT, ical_date);
|
date_sec2date_fmt(ev->day, ICALDATEFMT, ical_date);
|
||||||
fputs("BEGIN:VEVENT\n", stream);
|
fputs("BEGIN:VEVENT\n", stream);
|
||||||
@@ -162,16 +151,14 @@ ical_export_events (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export recurrent appointments. */
|
/* Export recurrent appointments. */
|
||||||
static void
|
static void ical_export_recur_apoints(FILE * stream)
|
||||||
ical_export_recur_apoints (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i, *j;
|
llist_item_t *i, *j;
|
||||||
char ical_datetime[BUFSIZ];
|
char ical_datetime[BUFSIZ];
|
||||||
char ical_date[BUFSIZ];
|
char ical_date[BUFSIZ];
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
LLIST_TS_FOREACH (&recur_alist_p, i)
|
LLIST_TS_FOREACH(&recur_alist_p, i) {
|
||||||
{
|
|
||||||
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
date_sec2date_fmt(rapt->start, ICALDATETIMEFMT, ical_datetime);
|
date_sec2date_fmt(rapt->start, ICALDATETIMEFMT, ical_datetime);
|
||||||
@@ -181,20 +168,15 @@ ical_export_recur_apoints (FILE *stream)
|
|||||||
fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d",
|
fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d",
|
||||||
ical_recur_type[rapt->rpt->type], rapt->rpt->freq);
|
ical_recur_type[rapt->rpt->type], rapt->rpt->freq);
|
||||||
|
|
||||||
if (rapt->rpt->until != 0)
|
if (rapt->rpt->until != 0) {
|
||||||
{
|
date_sec2date_fmt(rapt->rpt->until + HOURINSEC, ICALDATEFMT, ical_date);
|
||||||
date_sec2date_fmt (rapt->rpt->until + HOURINSEC, ICALDATEFMT,
|
|
||||||
ical_date);
|
|
||||||
fprintf(stream, ";UNTIL=%s\n", ical_date);
|
fprintf(stream, ";UNTIL=%s\n", ical_date);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
fputc('\n', stream);
|
fputc('\n', stream);
|
||||||
|
|
||||||
if (LLIST_FIRST (&rapt->exc))
|
if (LLIST_FIRST(&rapt->exc)) {
|
||||||
{
|
|
||||||
fputs("EXDATE:", stream);
|
fputs("EXDATE:", stream);
|
||||||
LLIST_FOREACH (&rapt->exc, j)
|
LLIST_FOREACH(&rapt->exc, j) {
|
||||||
{
|
|
||||||
struct excp *exc = LLIST_GET_DATA(j);
|
struct excp *exc = LLIST_GET_DATA(j);
|
||||||
date_sec2date_fmt(exc->st, ICALDATEFMT, ical_date);
|
date_sec2date_fmt(exc->st, ICALDATEFMT, ical_date);
|
||||||
fprintf(stream, "%s", ical_date);
|
fprintf(stream, "%s", ical_date);
|
||||||
@@ -214,15 +196,13 @@ ical_export_recur_apoints (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export appointments. */
|
/* Export appointments. */
|
||||||
static void
|
static void ical_export_apoints(FILE * stream)
|
||||||
ical_export_apoints (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
char ical_datetime[BUFSIZ];
|
char ical_datetime[BUFSIZ];
|
||||||
|
|
||||||
LLIST_TS_LOCK(&alist_p);
|
LLIST_TS_LOCK(&alist_p);
|
||||||
LLIST_TS_FOREACH (&alist_p, i)
|
LLIST_TS_FOREACH(&alist_p, i) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
date_sec2date_fmt(apt->start, ICALDATETIMEFMT, ical_datetime);
|
date_sec2date_fmt(apt->start, ICALDATETIMEFMT, ical_datetime);
|
||||||
fputs("BEGIN:VEVENT\n", stream);
|
fputs("BEGIN:VEVENT\n", stream);
|
||||||
@@ -230,8 +210,7 @@ ical_export_apoints (FILE *stream)
|
|||||||
fprintf(stream, "DURATION:P%ldDT%ldH%ldM%ldS\n",
|
fprintf(stream, "DURATION:P%ldDT%ldH%ldM%ldS\n",
|
||||||
apt->dur / DAYINSEC,
|
apt->dur / DAYINSEC,
|
||||||
(apt->dur / HOURINSEC) % DAYINHOURS,
|
(apt->dur / HOURINSEC) % DAYINHOURS,
|
||||||
(apt->dur / MININSEC) % HOURINMIN,
|
(apt->dur / MININSEC) % HOURINMIN, apt->dur % MININSEC);
|
||||||
apt->dur % MININSEC);
|
|
||||||
fprintf(stream, "SUMMARY:%s\n", apt->mesg);
|
fprintf(stream, "SUMMARY:%s\n", apt->mesg);
|
||||||
if (apt->state & APOINT_NOTIFY)
|
if (apt->state & APOINT_NOTIFY)
|
||||||
ical_export_valarm(stream);
|
ical_export_valarm(stream);
|
||||||
@@ -241,13 +220,11 @@ ical_export_apoints (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export todo items. */
|
/* Export todo items. */
|
||||||
static void
|
static void ical_export_todo(FILE * stream)
|
||||||
ical_export_todo (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
LLIST_FOREACH (&todolist, i)
|
LLIST_FOREACH(&todolist, i) {
|
||||||
{
|
|
||||||
struct todo *todo = LLIST_TS_GET_DATA(i);
|
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||||
if (todo->id < 0) /* completed items */
|
if (todo->id < 0) /* completed items */
|
||||||
continue;
|
continue;
|
||||||
@@ -260,8 +237,7 @@ ical_export_todo (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print a header to describe import log report format. */
|
/* Print a header to describe import log report format. */
|
||||||
static void
|
static void ical_log_init(FILE * log, float version)
|
||||||
ical_log_init (FILE *log, float version)
|
|
||||||
{
|
{
|
||||||
const char *header =
|
const char *header =
|
||||||
"+-------------------------------------------------------------------+\n"
|
"+-------------------------------------------------------------------+\n"
|
||||||
@@ -289,8 +265,7 @@ ical_log_init (FILE *log, float version)
|
|||||||
* first line inside the icalendar file), together with a message describing the
|
* first line inside the icalendar file), together with a message describing the
|
||||||
* problem.
|
* problem.
|
||||||
*/
|
*/
|
||||||
static void
|
static void ical_log(FILE * log, ical_types_e type, unsigned lineno, char *msg)
|
||||||
ical_log (FILE *log, ical_types_e type, unsigned lineno, char *msg)
|
|
||||||
{
|
{
|
||||||
const char *typestr[ICAL_TYPES] = { "VEVENT", "VTODO" };
|
const char *typestr[ICAL_TYPES] = { "VEVENT", "VTODO" };
|
||||||
|
|
||||||
@@ -299,8 +274,7 @@ ical_log (FILE *log, ical_types_e type, unsigned lineno, char *msg)
|
|||||||
fprintf(log, "%s [%d]: %s\n", typestr[type], lineno, msg);
|
fprintf(log, "%s [%d]: %s\n", typestr[type], lineno, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void ical_store_todo(int priority, char *mesg, char *note)
|
||||||
ical_store_todo (int priority, char *mesg, char *note)
|
|
||||||
{
|
{
|
||||||
todo_add(mesg, priority, note);
|
todo_add(mesg, priority, note);
|
||||||
mem_free(mesg);
|
mem_free(mesg);
|
||||||
@@ -313,14 +287,11 @@ ical_store_event (char *mesg, char *note, long day, long end, ical_rpt_t *rpt,
|
|||||||
{
|
{
|
||||||
const int EVENTID = 1;
|
const int EVENTID = 1;
|
||||||
|
|
||||||
if (rpt)
|
if (rpt) {
|
||||||
{
|
|
||||||
recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq,
|
recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq,
|
||||||
rpt->until, exc);
|
rpt->until, exc);
|
||||||
mem_free(rpt);
|
mem_free(rpt);
|
||||||
}
|
} else if (end && end != day) {
|
||||||
else if (end && end != day)
|
|
||||||
{
|
|
||||||
/* Here we have an event that spans over several days. */
|
/* Here we have an event that spans over several days. */
|
||||||
rpt = mem_malloc(sizeof(ical_rpt_t));
|
rpt = mem_malloc(sizeof(ical_rpt_t));
|
||||||
rpt->type = RECUR_DAILY;
|
rpt->type = RECUR_DAILY;
|
||||||
@@ -330,9 +301,7 @@ ical_store_event (char *mesg, char *note, long day, long end, ical_rpt_t *rpt,
|
|||||||
recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq,
|
recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq,
|
||||||
rpt->until, exc);
|
rpt->until, exc);
|
||||||
mem_free(rpt);
|
mem_free(rpt);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
event_new(mesg, note, day, EVENTID);
|
event_new(mesg, note, day, EVENTID);
|
||||||
}
|
}
|
||||||
mem_free(mesg);
|
mem_free(mesg);
|
||||||
@@ -347,14 +316,11 @@ ical_store_apoint (char *mesg, char *note, long start, long dur,
|
|||||||
|
|
||||||
if (has_alarm)
|
if (has_alarm)
|
||||||
state |= APOINT_NOTIFY;
|
state |= APOINT_NOTIFY;
|
||||||
if (rpt)
|
if (rpt) {
|
||||||
{
|
|
||||||
recur_apoint_new(mesg, note, start, dur, state, rpt->type, rpt->freq,
|
recur_apoint_new(mesg, note, start, dur, state, rpt->type, rpt->freq,
|
||||||
rpt->until, exc);
|
rpt->until, exc);
|
||||||
mem_free(rpt);
|
mem_free(rpt);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
apoint_new(mesg, note, start, dur, state);
|
apoint_new(mesg, note, start, dur, state);
|
||||||
}
|
}
|
||||||
mem_free(mesg);
|
mem_free(mesg);
|
||||||
@@ -374,8 +340,7 @@ ical_store_apoint (char *mesg, char *note, long start, long dur,
|
|||||||
* Lines of text SHOULD NOT be longer than 75 octets, excluding the line
|
* Lines of text SHOULD NOT be longer than 75 octets, excluding the line
|
||||||
* break.
|
* break.
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *ical_unformat_line(char *line)
|
||||||
ical_unformat_line (char *line)
|
|
||||||
{
|
{
|
||||||
char *p, uline[BUFSIZ];
|
char *p, uline[BUFSIZ];
|
||||||
int len;
|
int len;
|
||||||
@@ -384,13 +349,10 @@ ical_unformat_line (char *line)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
memset(uline, 0, BUFSIZ);
|
memset(uline, 0, BUFSIZ);
|
||||||
for (len = 0, p = line; *p; p++)
|
for (len = 0, p = line; *p; p++) {
|
||||||
{
|
switch (*p) {
|
||||||
switch (*p)
|
|
||||||
{
|
|
||||||
case '\\':
|
case '\\':
|
||||||
switch (*(p + 1))
|
switch (*(p + 1)) {
|
||||||
{
|
|
||||||
case 'n':
|
case 'n':
|
||||||
uline[len++] = '\n';
|
uline[len++] = '\n';
|
||||||
p++;
|
p++;
|
||||||
@@ -425,24 +387,21 @@ ical_readline_init (FILE *fdi, char *buf, char *lstore, unsigned *ln)
|
|||||||
char *eol;
|
char *eol;
|
||||||
|
|
||||||
*buf = *lstore = '\0';
|
*buf = *lstore = '\0';
|
||||||
if (fgets (lstore, BUFSIZ, fdi))
|
if (fgets(lstore, BUFSIZ, fdi)) {
|
||||||
{
|
|
||||||
if ((eol = strchr(lstore, '\n')) != NULL)
|
if ((eol = strchr(lstore, '\n')) != NULL)
|
||||||
*eol = '\0';
|
*eol = '\0';
|
||||||
(*ln)++;
|
(*ln)++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln)
|
||||||
ical_readline (FILE *fdi, char *buf, char *lstore, unsigned *ln)
|
|
||||||
{
|
{
|
||||||
char *eol;
|
char *eol;
|
||||||
|
|
||||||
strncpy(buf, lstore, BUFSIZ);
|
strncpy(buf, lstore, BUFSIZ);
|
||||||
(*ln)++;
|
(*ln)++;
|
||||||
|
|
||||||
while (fgets (lstore, BUFSIZ, fdi) != NULL)
|
while (fgets(lstore, BUFSIZ, fdi) != NULL) {
|
||||||
{
|
|
||||||
if ((eol = strchr(lstore, '\n')) != NULL)
|
if ((eol = strchr(lstore, '\n')) != NULL)
|
||||||
*eol = '\0';
|
*eol = '\0';
|
||||||
if (*lstore != SPACE && *lstore != TAB)
|
if (*lstore != SPACE && *lstore != TAB)
|
||||||
@@ -451,8 +410,7 @@ ical_readline (FILE *fdi, char *buf, char *lstore, unsigned *ln)
|
|||||||
(*ln)++;
|
(*ln)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (feof (fdi))
|
if (feof(fdi)) {
|
||||||
{
|
|
||||||
*lstore = '\0';
|
*lstore = '\0';
|
||||||
if (*buf == '\0')
|
if (*buf == '\0')
|
||||||
return 0;
|
return 0;
|
||||||
@@ -475,8 +433,7 @@ ical_chk_header (FILE *fd, char *buf, char *lstore, unsigned *lineno)
|
|||||||
if (strncmp(buf, icalheader, sizeof(icalheader) - 1) != 0)
|
if (strncmp(buf, icalheader, sizeof(icalheader) - 1) != 0)
|
||||||
return HEADER_MALFORMED;
|
return HEADER_MALFORMED;
|
||||||
|
|
||||||
while (!sscanf (buf, "VERSION:%f", &version))
|
while (!sscanf(buf, "VERSION:%f", &version)) {
|
||||||
{
|
|
||||||
if (!ical_readline(fd, buf, lstore, lineno))
|
if (!ical_readline(fd, buf, lstore, lineno))
|
||||||
return HEADER_MALFORMED;
|
return HEADER_MALFORMED;
|
||||||
}
|
}
|
||||||
@@ -495,8 +452,7 @@ ical_chk_header (FILE *fd, char *buf, char *lstore, unsigned *lineno)
|
|||||||
*
|
*
|
||||||
* The timezone is not yet handled by calcurse.
|
* The timezone is not yet handled by calcurse.
|
||||||
*/
|
*/
|
||||||
static long
|
static long ical_datetime2long(char *datestr, ical_vevent_e * type)
|
||||||
ical_datetime2long (char *datestr, ical_vevent_e *type)
|
|
||||||
{
|
{
|
||||||
const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 5;
|
const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 5;
|
||||||
struct date date;
|
struct date date;
|
||||||
@@ -506,35 +462,28 @@ ical_datetime2long (char *datestr, ical_vevent_e *type)
|
|||||||
|
|
||||||
format = sscanf(datestr, "%04u%02u%02uT%02u%02u",
|
format = sscanf(datestr, "%04u%02u%02uT%02u%02u",
|
||||||
&date.yyyy, &date.mm, &date.dd, &hour, &min);
|
&date.yyyy, &date.mm, &date.dd, &hour, &min);
|
||||||
if (format == FORMAT_DATE)
|
if (format == FORMAT_DATE) {
|
||||||
{
|
|
||||||
if (type)
|
if (type)
|
||||||
*type = EVENT;
|
*type = EVENT;
|
||||||
datelong = date2sec(date, 0, 0);
|
datelong = date2sec(date, 0, 0);
|
||||||
}
|
} else if (format == FORMAT_DATETIME) {
|
||||||
else if (format == FORMAT_DATETIME)
|
|
||||||
{
|
|
||||||
if (type)
|
if (type)
|
||||||
*type = APPOINTMENT;
|
*type = APPOINTMENT;
|
||||||
datelong = date2sec(date, hour, min);
|
datelong = date2sec(date, hour, min);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
datelong = NOTFOUND;
|
datelong = NOTFOUND;
|
||||||
}
|
}
|
||||||
return datelong;
|
return datelong;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long
|
static long ical_durtime2long(char *timestr)
|
||||||
ical_durtime2long (char *timestr)
|
|
||||||
{
|
{
|
||||||
long timelong;
|
long timelong;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
if ((p = strchr(timestr, 'T')) == NULL)
|
if ((p = strchr(timestr, 'T')) == NULL)
|
||||||
timelong = 0;
|
timelong = 0;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
int nbmatch;
|
int nbmatch;
|
||||||
struct {
|
struct {
|
||||||
unsigned hour, min, sec;
|
unsigned hour, min, sec;
|
||||||
@@ -576,8 +525,7 @@ ical_durtime2long (char *timestr)
|
|||||||
* A duration of 7 weeks would be:
|
* A duration of 7 weeks would be:
|
||||||
* P7W
|
* P7W
|
||||||
*/
|
*/
|
||||||
static long
|
static long ical_dur2long(char *durstr)
|
||||||
ical_dur2long (char *durstr)
|
|
||||||
{
|
{
|
||||||
const int NOTFOUND = -1;
|
const int NOTFOUND = -1;
|
||||||
long durlong;
|
long durlong;
|
||||||
@@ -589,8 +537,7 @@ ical_dur2long (char *durstr)
|
|||||||
memset(&date, 0, sizeof date);
|
memset(&date, 0, sizeof date);
|
||||||
if ((p = strchr(durstr, 'P')) == NULL)
|
if ((p = strchr(durstr, 'P')) == NULL)
|
||||||
durlong = NOTFOUND;
|
durlong = NOTFOUND;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
p++;
|
p++;
|
||||||
if (*p == '-')
|
if (*p == '-')
|
||||||
return NOTFOUND;
|
return NOTFOUND;
|
||||||
@@ -599,26 +546,19 @@ ical_dur2long (char *durstr)
|
|||||||
|
|
||||||
if (*p == 'T') /* dur-time */
|
if (*p == 'T') /* dur-time */
|
||||||
durlong = ical_durtime2long(p);
|
durlong = ical_durtime2long(p);
|
||||||
else if (strchr (p, 'W')) /* dur-week */
|
else if (strchr(p, 'W')) { /* dur-week */
|
||||||
{
|
|
||||||
if (sscanf(p, "%u", &date.week) == 1)
|
if (sscanf(p, "%u", &date.week) == 1)
|
||||||
durlong = date.week * WEEKINDAYS * DAYINSEC;
|
durlong = date.week * WEEKINDAYS * DAYINSEC;
|
||||||
else
|
else
|
||||||
durlong = NOTFOUND;
|
durlong = NOTFOUND;
|
||||||
}
|
} else {
|
||||||
else
|
if (strchr(p, 'D')) { /* dur-date */
|
||||||
{
|
if (sscanf(p, "%uD", &date.day) == 1) {
|
||||||
if (strchr (p, 'D')) /* dur-date */
|
|
||||||
{
|
|
||||||
if (sscanf (p, "%uD", &date.day) == 1)
|
|
||||||
{
|
|
||||||
durlong = date.day * DAYINSEC;
|
durlong = date.day * DAYINSEC;
|
||||||
durlong += ical_durtime2long(p);
|
durlong += ical_durtime2long(p);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
durlong = NOTFOUND;
|
durlong = NOTFOUND;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
durlong = NOTFOUND;
|
durlong = NOTFOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -633,13 +573,11 @@ ical_dur2long (char *durstr)
|
|||||||
* range-bound the recurrence. The "DTSTART" property value, if specified,
|
* range-bound the recurrence. The "DTSTART" property value, if specified,
|
||||||
* counts as the first occurrence.
|
* counts as the first occurrence.
|
||||||
*/
|
*/
|
||||||
static long
|
static long ical_compute_rpt_until(long start, ical_rpt_t * rpt)
|
||||||
ical_compute_rpt_until (long start, ical_rpt_t *rpt)
|
|
||||||
{
|
{
|
||||||
long until;
|
long until;
|
||||||
|
|
||||||
switch (rpt->type)
|
switch (rpt->type) {
|
||||||
{
|
|
||||||
case RECUR_DAILY:
|
case RECUR_DAILY:
|
||||||
until = date_sec_change(start, 0, rpt->freq * (rpt->count - 1));
|
until = date_sec_change(start, 0, rpt->freq * (rpt->count - 1));
|
||||||
break;
|
break;
|
||||||
@@ -698,9 +636,8 @@ ical_compute_rpt_until (long start, ical_rpt_t *rpt)
|
|||||||
* ( ";" x-name "=" text )
|
* ( ";" x-name "=" text )
|
||||||
* )
|
* )
|
||||||
*/
|
*/
|
||||||
static ical_rpt_t *
|
static ical_rpt_t *ical_read_rrule(FILE * log, char *rrulestr,
|
||||||
ical_read_rrule (FILE *log, char *rrulestr, unsigned *noskipped,
|
unsigned *noskipped, const int itemline)
|
||||||
const int itemline)
|
|
||||||
{
|
{
|
||||||
const char daily[] = "DAILY";
|
const char daily[] = "DAILY";
|
||||||
const char weekly[] = "WEEKLY";
|
const char weekly[] = "WEEKLY";
|
||||||
@@ -713,23 +650,19 @@ ical_read_rrule (FILE *log, char *rrulestr, unsigned *noskipped,
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
rpt = NULL;
|
rpt = NULL;
|
||||||
if ((p = strchr (rrulestr, ':')) != NULL)
|
if ((p = strchr(rrulestr, ':')) != NULL) {
|
||||||
{
|
|
||||||
char freqstr[BUFSIZ];
|
char freqstr[BUFSIZ];
|
||||||
|
|
||||||
p++;
|
p++;
|
||||||
rpt = mem_malloc(sizeof(ical_rpt_t));
|
rpt = mem_malloc(sizeof(ical_rpt_t));
|
||||||
memset(rpt, 0, sizeof(ical_rpt_t));
|
memset(rpt, 0, sizeof(ical_rpt_t));
|
||||||
if (sscanf (p, "FREQ=%s", freqstr) != 1)
|
if (sscanf(p, "FREQ=%s", freqstr) != 1) {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, itemline,
|
ical_log(log, ICAL_VEVENT, itemline,
|
||||||
_("recurrence frequence not found."));
|
_("recurrence frequence not found."));
|
||||||
(*noskipped)++;
|
(*noskipped)++;
|
||||||
mem_free(rpt);
|
mem_free(rpt);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (strncmp(freqstr, daily, sizeof(daily) - 1) == 0)
|
if (strncmp(freqstr, daily, sizeof(daily) - 1) == 0)
|
||||||
rpt->type = RECUR_DAILY;
|
rpt->type = RECUR_DAILY;
|
||||||
else if (strncmp(freqstr, weekly, sizeof(weekly) - 1) == 0)
|
else if (strncmp(freqstr, weekly, sizeof(weekly) - 1) == 0)
|
||||||
@@ -738,8 +671,7 @@ ical_read_rrule (FILE *log, char *rrulestr, unsigned *noskipped,
|
|||||||
rpt->type = RECUR_MONTHLY;
|
rpt->type = RECUR_MONTHLY;
|
||||||
else if (strncmp(freqstr, yearly, sizeof(yearly) - 1) == 0)
|
else if (strncmp(freqstr, yearly, sizeof(yearly) - 1) == 0)
|
||||||
rpt->type = RECUR_YEARLY;
|
rpt->type = RECUR_YEARLY;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, itemline,
|
ical_log(log, ICAL_VEVENT, itemline,
|
||||||
_("recurrence frequence not recognized."));
|
_("recurrence frequence not recognized."));
|
||||||
(*noskipped)++;
|
(*noskipped)++;
|
||||||
@@ -757,66 +689,48 @@ ical_read_rrule (FILE *log, char *rrulestr, unsigned *noskipped,
|
|||||||
range-bound the recurrence. The "DTSTART" property value, if
|
range-bound the recurrence. The "DTSTART" property value, if
|
||||||
specified, counts as the first occurrence.
|
specified, counts as the first occurrence.
|
||||||
*/
|
*/
|
||||||
if ((p = strstr (rrulestr, "UNTIL")) != NULL)
|
if ((p = strstr(rrulestr, "UNTIL")) != NULL) {
|
||||||
{
|
|
||||||
char *untilstr;
|
char *untilstr;
|
||||||
|
|
||||||
untilstr = strchr(p, '=');
|
untilstr = strchr(p, '=');
|
||||||
rpt->until = ical_datetime2long(++untilstr, NULL);
|
rpt->until = ical_datetime2long(++untilstr, NULL);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
unsigned cnt;
|
unsigned cnt;
|
||||||
char *countstr;
|
char *countstr;
|
||||||
|
|
||||||
if ((countstr = strstr (rrulestr, count)) != NULL)
|
if ((countstr = strstr(rrulestr, count)) != NULL) {
|
||||||
{
|
|
||||||
countstr += sizeof(count) - 1;
|
countstr += sizeof(count) - 1;
|
||||||
if (sscanf (countstr, "%u", &cnt) != 1)
|
if (sscanf(countstr, "%u", &cnt) != 1) {
|
||||||
{
|
|
||||||
rpt->until = 0;
|
rpt->until = 0;
|
||||||
/* endless repetition */
|
/* endless repetition */
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
rpt->count = cnt;
|
rpt->count = cnt;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
rpt->until = 0;
|
rpt->until = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((p = strstr (rrulestr, interv)) != NULL)
|
if ((p = strstr(rrulestr, interv)) != NULL) {
|
||||||
{
|
|
||||||
p += sizeof(interv) - 1;
|
p += sizeof(interv) - 1;
|
||||||
if (sscanf (p, "%u", &interval) != 1)
|
if (sscanf(p, "%u", &interval) != 1) {
|
||||||
{
|
|
||||||
rpt->freq = 1;
|
rpt->freq = 1;
|
||||||
/* default frequence if none specified */
|
/* default frequence if none specified */
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
rpt->freq = interval;
|
rpt->freq = interval;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
rpt->freq = 1;
|
rpt->freq = 1;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, itemline, _("recurrence rule malformed."));
|
ical_log(log, ICAL_VEVENT, itemline, _("recurrence rule malformed."));
|
||||||
(*noskipped)++;
|
(*noskipped)++;
|
||||||
}
|
}
|
||||||
return rpt;
|
return rpt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void ical_add_exc(llist_t * exc_head, long date)
|
||||||
ical_add_exc (llist_t *exc_head, long date)
|
|
||||||
{
|
|
||||||
if (date != 0)
|
|
||||||
{
|
{
|
||||||
|
if (date != 0) {
|
||||||
struct excp *exc = mem_malloc(sizeof(struct excp));
|
struct excp *exc = mem_malloc(sizeof(struct excp));
|
||||||
exc->st = date;
|
exc->st = date;
|
||||||
|
|
||||||
@@ -836,11 +750,9 @@ ical_read_exdate (llist_t *exc, FILE *log, char *exstr, unsigned *noskipped,
|
|||||||
long date;
|
long date;
|
||||||
|
|
||||||
LLIST_INIT(exc);
|
LLIST_INIT(exc);
|
||||||
if ((p = strchr (exstr, ':')) != NULL)
|
if ((p = strchr(exstr, ':')) != NULL) {
|
||||||
{
|
|
||||||
p++;
|
p++;
|
||||||
while ((q = strchr (p, ',')) != NULL)
|
while ((q = strchr(p, ',')) != NULL) {
|
||||||
{
|
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
const int buflen = q - p;
|
const int buflen = q - p;
|
||||||
|
|
||||||
@@ -852,9 +764,7 @@ ical_read_exdate (llist_t *exc, FILE *log, char *exstr, unsigned *noskipped,
|
|||||||
}
|
}
|
||||||
date = ical_datetime2long(p, NULL);
|
date = ical_datetime2long(p, NULL);
|
||||||
ical_add_exc(exc, date);
|
ical_add_exc(exc, date);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, itemline,
|
ical_log(log, ICAL_VEVENT, itemline,
|
||||||
_("recurrence exception dates malformed."));
|
_("recurrence exception dates malformed."));
|
||||||
(*noskipped)++;
|
(*noskipped)++;
|
||||||
@@ -862,37 +772,29 @@ ical_read_exdate (llist_t *exc, FILE *log, char *exstr, unsigned *noskipped,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Return an allocated string containing the name of the newly created note. */
|
/* Return an allocated string containing the name of the newly created note. */
|
||||||
static char *
|
static char *ical_read_note(char *line, unsigned *noskipped,
|
||||||
ical_read_note (char *line, unsigned *noskipped, ical_vevent_e item_type,
|
ical_vevent_e item_type, const int itemline,
|
||||||
const int itemline, FILE *log)
|
FILE * log)
|
||||||
{
|
{
|
||||||
char *p, *notestr, *note;
|
char *p, *notestr, *note;
|
||||||
|
|
||||||
if ((p = strchr (line, ':')) != NULL)
|
if ((p = strchr(line, ':')) != NULL) {
|
||||||
{
|
|
||||||
p++;
|
p++;
|
||||||
notestr = ical_unformat_line(p);
|
notestr = ical_unformat_line(p);
|
||||||
if (notestr == NULL)
|
if (notestr == NULL) {
|
||||||
{
|
|
||||||
ical_log(log, item_type, itemline,
|
ical_log(log, item_type, itemline,
|
||||||
_("could not get entire item description."));
|
_("could not get entire item description."));
|
||||||
(*noskipped)++;
|
(*noskipped)++;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
} else if (strlen(notestr) == 0) {
|
||||||
else if (strlen (notestr) == 0)
|
|
||||||
{
|
|
||||||
mem_free(notestr);
|
mem_free(notestr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
note = generate_note(notestr);
|
note = generate_note(notestr);
|
||||||
mem_free(notestr);
|
mem_free(notestr);
|
||||||
return note;
|
return note;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ical_log(log, item_type, itemline, _("description malformed."));
|
ical_log(log, item_type, itemline, _("description malformed."));
|
||||||
(*noskipped)++;
|
(*noskipped)++;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -900,25 +802,21 @@ ical_read_note (char *line, unsigned *noskipped, ical_vevent_e item_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns an allocated string containing the ical item summary. */
|
/* Returns an allocated string containing the ical item summary. */
|
||||||
static char *
|
static char *ical_read_summary(char *line)
|
||||||
ical_read_summary (char *line)
|
|
||||||
{
|
{
|
||||||
char *p, *summary;
|
char *p, *summary;
|
||||||
|
|
||||||
if ((p = strchr (line, ':')) != NULL)
|
if ((p = strchr(line, ':')) != NULL) {
|
||||||
{
|
|
||||||
p++;
|
p++;
|
||||||
summary = ical_unformat_line(p);
|
summary = ical_unformat_line(p);
|
||||||
return summary;
|
return summary;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ical_read_event(FILE * fdi, FILE * log, unsigned *noevents, unsigned *noapoints,
|
ical_read_event(FILE * fdi, FILE * log, unsigned *noevents, unsigned *noapoints,
|
||||||
unsigned *noskipped, char *buf, char *lstore,
|
unsigned *noskipped, char *buf, char *lstore, unsigned *lineno)
|
||||||
unsigned *lineno)
|
|
||||||
{
|
{
|
||||||
const int ITEMLINE = *lineno;
|
const int ITEMLINE = *lineno;
|
||||||
const char endevent[] = "END:VEVENT";
|
const char endevent[] = "END:VEVENT";
|
||||||
@@ -945,48 +843,36 @@ ical_read_event (FILE *fdi, FILE *log, unsigned *noevents, unsigned *noapoints,
|
|||||||
vevent_type = UNDEFINED;
|
vevent_type = UNDEFINED;
|
||||||
memset(&vevent, 0, sizeof vevent);
|
memset(&vevent, 0, sizeof vevent);
|
||||||
skip_alarm = 0;
|
skip_alarm = 0;
|
||||||
while (ical_readline (fdi, buf, lstore, lineno))
|
while (ical_readline(fdi, buf, lstore, lineno)) {
|
||||||
{
|
|
||||||
strncpy(buf_upper, buf, BUFSIZ);
|
strncpy(buf_upper, buf, BUFSIZ);
|
||||||
buf_upper[BUFSIZ - 1] = '\0';
|
buf_upper[BUFSIZ - 1] = '\0';
|
||||||
str_toupper(buf_upper);
|
str_toupper(buf_upper);
|
||||||
|
|
||||||
if (skip_alarm)
|
if (skip_alarm) {
|
||||||
{
|
|
||||||
/* Need to skip VALARM properties because some keywords could
|
/* Need to skip VALARM properties because some keywords could
|
||||||
interfere, such as DURATION, SUMMARY,.. */
|
interfere, such as DURATION, SUMMARY,.. */
|
||||||
if (strncmp(buf_upper, endalarm, sizeof(endalarm) - 1) == 0)
|
if (strncmp(buf_upper, endalarm, sizeof(endalarm) - 1) == 0)
|
||||||
skip_alarm = 0;
|
skip_alarm = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strncmp (buf_upper, endevent, sizeof (endevent) - 1) == 0)
|
if (strncmp(buf_upper, endevent, sizeof(endevent) - 1) == 0) {
|
||||||
{
|
if (vevent.mesg) {
|
||||||
if (vevent.mesg)
|
|
||||||
{
|
|
||||||
if (vevent.rpt && vevent.rpt->count)
|
if (vevent.rpt && vevent.rpt->count)
|
||||||
vevent.rpt->until = ical_compute_rpt_until (vevent.start,
|
vevent.rpt->until = ical_compute_rpt_until(vevent.start, vevent.rpt);
|
||||||
vevent.rpt);
|
|
||||||
|
|
||||||
switch (vevent_type)
|
switch (vevent_type) {
|
||||||
{
|
|
||||||
case APPOINTMENT:
|
case APPOINTMENT:
|
||||||
if (vevent.start == 0)
|
if (vevent.start == 0) {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("appointment has no start time."));
|
_("appointment has no start time."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (vevent.dur == 0)
|
if (vevent.dur == 0) {
|
||||||
{
|
if (vevent.end == 0) {
|
||||||
if (vevent.end == 0)
|
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("could not compute duration "
|
_("could not compute duration " "(no end time)."));
|
||||||
"(no end time)."));
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
} else if (vevent.start == vevent.end) {
|
||||||
else if (vevent.start == vevent.end)
|
|
||||||
{
|
|
||||||
vevent_type = EVENT;
|
vevent_type = EVENT;
|
||||||
vevent.end = 0L;
|
vevent.end = 0L;
|
||||||
ical_store_event(vevent.mesg, vevent.note,
|
ical_store_event(vevent.mesg, vevent.note,
|
||||||
@@ -994,12 +880,9 @@ ical_read_event (FILE *fdi, FILE *log, unsigned *noevents, unsigned *noapoints,
|
|||||||
vevent.rpt, &vevent.exc);
|
vevent.rpt, &vevent.exc);
|
||||||
(*noevents)++;
|
(*noevents)++;
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
vevent.dur = vevent.end - vevent.start;
|
vevent.dur = vevent.end - vevent.start;
|
||||||
if (vevent.dur < 0)
|
if (vevent.dur < 0) {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("item has a negative duration."));
|
_("item has a negative duration."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@@ -1012,8 +895,7 @@ ical_read_event (FILE *fdi, FILE *log, unsigned *noevents, unsigned *noapoints,
|
|||||||
(*noapoints)++;
|
(*noapoints)++;
|
||||||
break;
|
break;
|
||||||
case EVENT:
|
case EVENT:
|
||||||
if (vevent.start == 0)
|
if (vevent.start == 0) {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("event date is not defined."));
|
_("event date is not defined."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@@ -1028,67 +910,44 @@ ical_read_event (FILE *fdi, FILE *log, unsigned *noevents, unsigned *noapoints,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("could not retrieve item summary."));
|
_("could not retrieve item summary."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else
|
if (strncmp(buf_upper, dtstart, sizeof(dtstart) - 1) == 0) {
|
||||||
{
|
|
||||||
if (strncmp (buf_upper, dtstart, sizeof (dtstart) - 1) == 0)
|
|
||||||
{
|
|
||||||
if ((p = strchr(buf, ':')) != NULL)
|
if ((p = strchr(buf, ':')) != NULL)
|
||||||
vevent.start = ical_datetime2long(++p, &vevent_type);
|
vevent.start = ical_datetime2long(++p, &vevent_type);
|
||||||
if (!vevent.start)
|
if (!vevent.start) {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("could not retrieve event start time."));
|
_("could not retrieve event start time."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
} else if (strncmp(buf_upper, dtend, sizeof(dtend) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, dtend, sizeof (dtend) - 1) == 0)
|
|
||||||
{
|
|
||||||
if ((p = strchr(buf, ':')) != NULL)
|
if ((p = strchr(buf, ':')) != NULL)
|
||||||
vevent.end = ical_datetime2long(++p, &vevent_type);
|
vevent.end = ical_datetime2long(++p, &vevent_type);
|
||||||
if (!vevent.end)
|
if (!vevent.end) {
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
ical_log(log, ICAL_VEVENT, ITEMLINE,
|
||||||
_("could not retrieve event end time."));
|
_("could not retrieve event end time."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
} else if (strncmp(buf_upper, duration, sizeof(duration) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, duration, sizeof (duration) - 1) == 0)
|
if ((vevent.dur = ical_dur2long(buf)) <= 0) {
|
||||||
{
|
ical_log(log, ICAL_VEVENT, ITEMLINE, _("item duration malformed."));
|
||||||
if ((vevent.dur = ical_dur2long (buf)) <= 0)
|
|
||||||
{
|
|
||||||
ical_log (log, ICAL_VEVENT, ITEMLINE,
|
|
||||||
_("item duration malformed."));
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
} else if (strncmp(buf_upper, rrule, sizeof(rrule) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, rrule, sizeof (rrule) - 1) == 0)
|
|
||||||
{
|
|
||||||
vevent.rpt = ical_read_rrule(log, buf, noskipped, ITEMLINE);
|
vevent.rpt = ical_read_rrule(log, buf, noskipped, ITEMLINE);
|
||||||
}
|
} else if (strncmp(buf_upper, exdate, sizeof(exdate) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, exdate, sizeof (exdate) - 1) == 0)
|
|
||||||
{
|
|
||||||
ical_read_exdate(&vevent.exc, log, buf, noskipped, ITEMLINE);
|
ical_read_exdate(&vevent.exc, log, buf, noskipped, ITEMLINE);
|
||||||
}
|
} else if (strncmp(buf_upper, summary, sizeof(summary) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, summary, sizeof (summary) - 1) == 0)
|
|
||||||
{
|
|
||||||
vevent.mesg = ical_read_summary(buf);
|
vevent.mesg = ical_read_summary(buf);
|
||||||
}
|
} else if (strncmp(buf_upper, alarm, sizeof(alarm) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, alarm, sizeof (alarm) - 1) == 0)
|
|
||||||
{
|
|
||||||
skip_alarm = 1;
|
skip_alarm = 1;
|
||||||
vevent.has_alarm = 1;
|
vevent.has_alarm = 1;
|
||||||
}
|
} else if (strncmp(buf_upper, desc, sizeof(desc) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, desc, sizeof (desc) - 1) == 0)
|
|
||||||
{
|
|
||||||
vevent.note = ical_read_note(buf, noskipped, ICAL_VEVENT,
|
vevent.note = ical_read_note(buf, noskipped, ICAL_VEVENT,
|
||||||
ITEMLINE, log);
|
ITEMLINE, log);
|
||||||
}
|
}
|
||||||
@@ -1130,67 +989,48 @@ ical_read_todo (FILE *fdi, FILE *log, unsigned *notodos, unsigned *noskipped,
|
|||||||
|
|
||||||
memset(&vtodo, 0, sizeof vtodo);
|
memset(&vtodo, 0, sizeof vtodo);
|
||||||
skip_alarm = 0;
|
skip_alarm = 0;
|
||||||
while (ical_readline (fdi, buf, lstore, lineno))
|
while (ical_readline(fdi, buf, lstore, lineno)) {
|
||||||
{
|
|
||||||
strncpy(buf_upper, buf, BUFSIZ);
|
strncpy(buf_upper, buf, BUFSIZ);
|
||||||
buf_upper[BUFSIZ - 1] = '\0';
|
buf_upper[BUFSIZ - 1] = '\0';
|
||||||
str_toupper(buf_upper);
|
str_toupper(buf_upper);
|
||||||
if (skip_alarm)
|
if (skip_alarm) {
|
||||||
{
|
|
||||||
/* Need to skip VALARM properties because some keywords could
|
/* Need to skip VALARM properties because some keywords could
|
||||||
interfere, such as DURATION, SUMMARY,.. */
|
interfere, such as DURATION, SUMMARY,.. */
|
||||||
if (strncmp(buf_upper, endalarm, sizeof(endalarm) - 1) == 0)
|
if (strncmp(buf_upper, endalarm, sizeof(endalarm) - 1) == 0)
|
||||||
skip_alarm = 0;
|
skip_alarm = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strncmp (buf_upper, endtodo, sizeof (endtodo) - 1) == 0)
|
if (strncmp(buf_upper, endtodo, sizeof(endtodo) - 1) == 0) {
|
||||||
{
|
|
||||||
if (!vtodo.has_priority)
|
if (!vtodo.has_priority)
|
||||||
vtodo.priority = LOWEST;
|
vtodo.priority = LOWEST;
|
||||||
if (vtodo.mesg)
|
if (vtodo.mesg) {
|
||||||
{
|
|
||||||
ical_store_todo(vtodo.priority, vtodo.mesg, vtodo.note);
|
ical_store_todo(vtodo.priority, vtodo.mesg, vtodo.note);
|
||||||
(*notodos)++;
|
(*notodos)++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VTODO, ITEMLINE,
|
ical_log(log, ICAL_VTODO, ITEMLINE,
|
||||||
_("could not retrieve item summary."));
|
_("could not retrieve item summary."));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
int tmpint;
|
int tmpint;
|
||||||
|
|
||||||
if (sscanf (buf_upper, "PRIORITY:%d", &tmpint) == 1)
|
if (sscanf(buf_upper, "PRIORITY:%d", &tmpint) == 1) {
|
||||||
{
|
if (tmpint <= 9 && tmpint >= 1) {
|
||||||
if (tmpint <= 9 && tmpint >= 1)
|
|
||||||
{
|
|
||||||
vtodo.priority = tmpint;
|
vtodo.priority = tmpint;
|
||||||
vtodo.has_priority = 1;
|
vtodo.has_priority = 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ical_log(log, ICAL_VTODO, ITEMLINE,
|
ical_log(log, ICAL_VTODO, ITEMLINE,
|
||||||
_("item priority is not acceptable "
|
_("item priority is not acceptable "
|
||||||
"(must be between 1 and 9)."));
|
"(must be between 1 and 9)."));
|
||||||
vtodo.priority = LOWEST;
|
vtodo.priority = LOWEST;
|
||||||
}
|
}
|
||||||
}
|
} else if (strncmp(buf_upper, summary, sizeof(summary) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, summary, sizeof (summary) - 1) == 0)
|
|
||||||
{
|
|
||||||
vtodo.mesg = ical_read_summary(buf);
|
vtodo.mesg = ical_read_summary(buf);
|
||||||
}
|
} else if (strncmp(buf_upper, alarm, sizeof(alarm) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, alarm, sizeof (alarm) - 1) == 0)
|
|
||||||
{
|
|
||||||
skip_alarm = 1;
|
skip_alarm = 1;
|
||||||
}
|
} else if (strncmp(buf_upper, desc, sizeof(desc) - 1) == 0) {
|
||||||
else if (strncmp (buf_upper, desc, sizeof (desc) - 1) == 0)
|
vtodo.note = ical_read_note(buf, noskipped, ICAL_VTODO, ITEMLINE, log);
|
||||||
{
|
|
||||||
vtodo.note = ical_read_note (buf, noskipped, ICAL_VTODO,
|
|
||||||
ITEMLINE, log);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1225,25 +1065,20 @@ ical_import_data (FILE *stream, FILE *log, unsigned *events, unsigned *apoints,
|
|||||||
|
|
||||||
ical_log_init(log, ical_version);
|
ical_log_init(log, ical_version);
|
||||||
|
|
||||||
while (ical_readline (stream, buf, lstore, lines))
|
while (ical_readline(stream, buf, lstore, lines)) {
|
||||||
{
|
|
||||||
(*lines)++;
|
(*lines)++;
|
||||||
str_toupper(buf);
|
str_toupper(buf);
|
||||||
if (strncmp (buf, vevent, sizeof (vevent) - 1) == 0)
|
if (strncmp(buf, vevent, sizeof(vevent) - 1) == 0) {
|
||||||
{
|
|
||||||
ical_read_event(stream, log, events, apoints, skipped, buf, lstore,
|
ical_read_event(stream, log, events, apoints, skipped, buf, lstore,
|
||||||
lines);
|
lines);
|
||||||
}
|
} else if (strncmp(buf, vtodo, sizeof(vtodo) - 1) == 0) {
|
||||||
else if (strncmp (buf, vtodo, sizeof (vtodo) - 1) == 0)
|
|
||||||
{
|
|
||||||
ical_read_todo(stream, log, todos, skipped, buf, lstore, lines);
|
ical_read_todo(stream, log, todos, skipped, buf, lstore, lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Export calcurse data. */
|
/* Export calcurse data. */
|
||||||
void
|
void ical_export_data(FILE * stream)
|
||||||
ical_export_data (FILE *stream)
|
|
||||||
{
|
{
|
||||||
ical_export_header(stream);
|
ical_export_header(stream);
|
||||||
ical_export_recur_events(stream);
|
ical_export_recur_events(stream);
|
||||||
|
|||||||
211
src/keys.c
211
src/keys.c
@@ -94,8 +94,7 @@ static struct keydef_s keydef[NBKEYS] = {
|
|||||||
{"lower-priority", "-"},
|
{"lower-priority", "-"},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void dump_intro(FILE * fd)
|
||||||
dump_intro (FILE *fd)
|
|
||||||
{
|
{
|
||||||
const char *intro =
|
const char *intro =
|
||||||
_("#\n"
|
_("#\n"
|
||||||
@@ -122,8 +121,7 @@ dump_intro (FILE *fd)
|
|||||||
fprintf(fd, "%s\n", intro);
|
fprintf(fd, "%s\n", intro);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void keys_init(void)
|
||||||
keys_init (void)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -133,26 +131,22 @@ keys_init (void)
|
|||||||
LLIST_INIT(&keys[i]);
|
LLIST_INIT(&keys[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void key_free(char *s)
|
||||||
key_free (char *s)
|
|
||||||
{
|
{
|
||||||
mem_free(s);
|
mem_free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void keys_free(void)
|
||||||
keys_free (void)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < NBKEYS; i++)
|
for (i = 0; i < NBKEYS; i++) {
|
||||||
{
|
|
||||||
LLIST_FREE_INNER(&keys[i], key_free);
|
LLIST_FREE_INNER(&keys[i], key_free);
|
||||||
LLIST_FREE(&keys[i]);
|
LLIST_FREE(&keys[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void keys_dump_defaults(char *file)
|
||||||
keys_dump_defaults (char *file)
|
|
||||||
{
|
{
|
||||||
FILE *fd;
|
FILE *fd;
|
||||||
int i;
|
int i;
|
||||||
@@ -166,17 +160,14 @@ keys_dump_defaults (char *file)
|
|||||||
file_close(fd, __FILE_POS__);
|
file_close(fd, __FILE_POS__);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *keys_get_label(enum key key)
|
||||||
keys_get_label (enum key key)
|
|
||||||
{
|
{
|
||||||
EXIT_IF (key < 0 || key > NBKEYS,
|
EXIT_IF(key < 0 || key > NBKEYS, _("FATAL ERROR: key value out of bounds"));
|
||||||
_("FATAL ERROR: key value out of bounds"));
|
|
||||||
|
|
||||||
return keydef[key].label;
|
return keydef[key].label;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum key
|
enum key keys_get_action(int pressed)
|
||||||
keys_get_action (int pressed)
|
|
||||||
{
|
{
|
||||||
if (pressed < 0 || pressed > MAXKEYVAL)
|
if (pressed < 0 || pressed > MAXKEYVAL)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -184,16 +175,13 @@ keys_get_action (int pressed)
|
|||||||
return actions[pressed];
|
return actions[pressed];
|
||||||
}
|
}
|
||||||
|
|
||||||
enum key
|
enum key keys_getch(WINDOW * win, int *count)
|
||||||
keys_getch (WINDOW *win, int *count)
|
|
||||||
{
|
{
|
||||||
int ch = '0';
|
int ch = '0';
|
||||||
|
|
||||||
if (count)
|
if (count) {
|
||||||
{
|
|
||||||
*count = 0;
|
*count = 0;
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
*count = *count * 10 + ch - '0';
|
*count = *count * 10 + ch - '0';
|
||||||
ch = wgetch(win);
|
ch = wgetch(win);
|
||||||
}
|
}
|
||||||
@@ -201,12 +189,10 @@ keys_getch (WINDOW *win, int *count)
|
|||||||
|
|
||||||
if (*count == 0)
|
if (*count == 0)
|
||||||
*count = 1;
|
*count = 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
ch = wgetch(win);
|
ch = wgetch(win);
|
||||||
|
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
case KEY_RESIZE:
|
case KEY_RESIZE:
|
||||||
return KEY_RESIZE;
|
return KEY_RESIZE;
|
||||||
default:
|
default:
|
||||||
@@ -214,8 +200,7 @@ keys_getch (WINDOW *win, int *count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void add_key_str(enum key action, int key)
|
||||||
add_key_str (enum key action, int key)
|
|
||||||
{
|
{
|
||||||
if (action < 0 || action > NBKEYS)
|
if (action < 0 || action > NBKEYS)
|
||||||
return;
|
return;
|
||||||
@@ -223,13 +208,11 @@ add_key_str (enum key action, int key)
|
|||||||
LLIST_ADD(&keys[action], mem_strdup(keys_int2str(key)));
|
LLIST_ADD(&keys[action], mem_strdup(keys_int2str(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int keys_assign_binding(int key, enum key action)
|
||||||
keys_assign_binding (int key, enum key action)
|
|
||||||
{
|
{
|
||||||
if (key < 0 || key > MAXKEYVAL || actions[key] != KEY_UNDEF)
|
if (key < 0 || key > MAXKEYVAL || actions[key] != KEY_UNDEF)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
actions[key] = action;
|
actions[key] = action;
|
||||||
add_key_str(action, key);
|
add_key_str(action, key);
|
||||||
}
|
}
|
||||||
@@ -237,8 +220,7 @@ keys_assign_binding (int key, enum key action)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void del_key_str(enum key action, int key)
|
||||||
del_key_str (enum key action, int key)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
char oldstr[BUFSIZ];
|
char oldstr[BUFSIZ];
|
||||||
@@ -248,28 +230,23 @@ del_key_str (enum key action, int key)
|
|||||||
|
|
||||||
strncpy(oldstr, keys_int2str(key), BUFSIZ);
|
strncpy(oldstr, keys_int2str(key), BUFSIZ);
|
||||||
|
|
||||||
LLIST_FOREACH (&keys[action], i)
|
LLIST_FOREACH(&keys[action], i) {
|
||||||
{
|
if (strcmp(LLIST_GET_DATA(i), oldstr) == 0) {
|
||||||
if (strcmp (LLIST_GET_DATA (i), oldstr) == 0)
|
|
||||||
{
|
|
||||||
LLIST_REMOVE(&keys[action], i);
|
LLIST_REMOVE(&keys[action], i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void keys_remove_binding(int key, enum key action)
|
||||||
keys_remove_binding (int key, enum key action)
|
|
||||||
{
|
|
||||||
if (key >= 0 && key <= MAXKEYVAL)
|
|
||||||
{
|
{
|
||||||
|
if (key >= 0 && key <= MAXKEYVAL) {
|
||||||
actions[key] = KEY_UNDEF;
|
actions[key] = KEY_UNDEF;
|
||||||
del_key_str(action, key);
|
del_key_str(action, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int keys_str2int(const char *key)
|
||||||
keys_str2int (const char *key)
|
|
||||||
{
|
{
|
||||||
const char CONTROL_KEY[] = "C-";
|
const char CONTROL_KEY[] = "C-";
|
||||||
const char TAB_KEY[] = "TAB";
|
const char TAB_KEY[] = "TAB";
|
||||||
@@ -286,8 +263,7 @@ keys_str2int (const char *key)
|
|||||||
return -1;
|
return -1;
|
||||||
if (strlen(key) == 1)
|
if (strlen(key) == 1)
|
||||||
return (int)key[0];
|
return (int)key[0];
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
if (key[0] == '^')
|
if (key[0] == '^')
|
||||||
return CTRL((int)key[1]);
|
return CTRL((int)key[1]);
|
||||||
else if (!strncmp(key, CONTROL_KEY, sizeof(CONTROL_KEY) - 1))
|
else if (!strncmp(key, CONTROL_KEY, sizeof(CONTROL_KEY) - 1))
|
||||||
@@ -315,11 +291,9 @@ keys_str2int (const char *key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *keys_int2str(int key)
|
||||||
keys_int2str (int key)
|
|
||||||
{
|
|
||||||
switch (key)
|
|
||||||
{
|
{
|
||||||
|
switch (key) {
|
||||||
case TAB:
|
case TAB:
|
||||||
return "TAB";
|
return "TAB";
|
||||||
case SPACE:
|
case SPACE:
|
||||||
@@ -343,8 +317,7 @@ keys_int2str (int key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int keys_action_count_keys(enum key action)
|
||||||
keys_action_count_keys (enum key action)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
@@ -355,21 +328,18 @@ keys_action_count_keys (enum key action)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *keys_action_firstkey(enum key action)
|
||||||
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";
|
return (s != NULL) ? s : "XXX";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *keys_action_nkey(enum key action, int keynum)
|
||||||
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 *
|
char *keys_action_allkeys(enum key action)
|
||||||
keys_action_allkeys (enum key action)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
static char keystr[BUFSIZ];
|
static char keystr[BUFSIZ];
|
||||||
@@ -379,8 +349,7 @@ keys_action_allkeys (enum key action)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
keystr[0] = '\0';
|
keystr[0] = '\0';
|
||||||
LLIST_FOREACH (&keys[action], i)
|
LLIST_FOREACH(&keys[action], i) {
|
||||||
{
|
|
||||||
const int MAXLEN = sizeof(keystr) - 1 - strlen(keystr);
|
const int MAXLEN = sizeof(keystr) - 1 - strlen(keystr);
|
||||||
strncat(keystr, LLIST_GET_DATA(i), MAXLEN - 1);
|
strncat(keystr, LLIST_GET_DATA(i), MAXLEN - 1);
|
||||||
strncat(keystr, CHAR_SPACE, 1);
|
strncat(keystr, CHAR_SPACE, 1);
|
||||||
@@ -390,8 +359,7 @@ keys_action_allkeys (enum key action)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Need this to display keys properly inside status bar. */
|
/* Need this to display keys properly inside status bar. */
|
||||||
static char *
|
static char *keys_format_label(char *key, int keylen)
|
||||||
keys_format_label (char *key, int keylen)
|
|
||||||
{
|
{
|
||||||
static char fmtkey[BUFSIZ];
|
static char fmtkey[BUFSIZ];
|
||||||
const int len = strlen(key);
|
const int len = strlen(key);
|
||||||
@@ -404,14 +372,11 @@ keys_format_label (char *key, int keylen)
|
|||||||
memset(fmtkey, 0, sizeof(fmtkey));
|
memset(fmtkey, 0, sizeof(fmtkey));
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
strncpy(fmtkey, "?", sizeof(fmtkey));
|
strncpy(fmtkey, "?", sizeof(fmtkey));
|
||||||
else if (len <= keylen)
|
else if (len <= keylen) {
|
||||||
{
|
|
||||||
for (i = 0; i < keylen - len; i++)
|
for (i = 0; i < keylen - len; i++)
|
||||||
fmtkey[i] = ' ';
|
fmtkey[i] = ' ';
|
||||||
strncat(fmtkey, key, keylen);
|
strncat(fmtkey, key, keylen);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < keylen - 1; i++)
|
for (i = 0; i < keylen - 1; i++)
|
||||||
fmtkey[i] = key[i];
|
fmtkey[i] = key[i];
|
||||||
fmtkey[keylen - 1] = dot;
|
fmtkey[keylen - 1] = dot;
|
||||||
@@ -431,8 +396,7 @@ keys_display_bindings_bar (WINDOW *win, struct binding *bindings[], int count,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
for (i = 0; i < page_size && page_base + i < count; i++)
|
for (i = 0; i < page_size && page_base + i < count; i++) {
|
||||||
{
|
|
||||||
/* Location of key and label. */
|
/* Location of key and label. */
|
||||||
const int key_pos_x = (i / 2) * cmd_len;
|
const int key_pos_x = (i / 2) * cmd_len;
|
||||||
const int key_pos_y = i % 2;
|
const int key_pos_y = i % 2;
|
||||||
@@ -463,42 +427,30 @@ keys_display_bindings_bar (WINDOW *win, struct binding *bindings[], int count,
|
|||||||
* Display information about the given key.
|
* Display information about the given key.
|
||||||
* (could not add the keys descriptions to keydef variable, because of i18n).
|
* (could not add the keys descriptions to keydef variable, because of i18n).
|
||||||
*/
|
*/
|
||||||
void
|
void keys_popup_info(enum key key)
|
||||||
keys_popup_info (enum key key)
|
|
||||||
{
|
{
|
||||||
char *info[NBKEYS];
|
char *info[NBKEYS];
|
||||||
WINDOW *infowin;
|
WINDOW *infowin;
|
||||||
|
|
||||||
info[KEY_GENERIC_CANCEL] =
|
info[KEY_GENERIC_CANCEL] = _("Cancel the ongoing action.");
|
||||||
_("Cancel the ongoing action.");
|
info[KEY_GENERIC_SELECT] = _("Select the highlighted item.");
|
||||||
info[KEY_GENERIC_SELECT] =
|
|
||||||
_("Select the highlighted item.");
|
|
||||||
info[KEY_GENERIC_CREDITS] =
|
info[KEY_GENERIC_CREDITS] =
|
||||||
_("Print general information about calcurse's authors, license, etc.");
|
_("Print general information about calcurse's authors, license, etc.");
|
||||||
info[KEY_GENERIC_HELP] =
|
info[KEY_GENERIC_HELP] =
|
||||||
_("Display hints whenever some help screens are available.");
|
_("Display hints whenever some help screens are available.");
|
||||||
info[KEY_GENERIC_QUIT] =
|
info[KEY_GENERIC_QUIT] = _("Exit from the current menu, or quit calcurse.");
|
||||||
_("Exit from the current menu, or quit calcurse.");
|
info[KEY_GENERIC_SAVE] = _("Save calcurse data.");
|
||||||
info[KEY_GENERIC_SAVE] =
|
info[KEY_GENERIC_CUT] = _("Help for `generic-cut`.");
|
||||||
_("Save calcurse data.");
|
info[KEY_GENERIC_PASTE] = _("Help for `generic-paste`.");
|
||||||
info[KEY_GENERIC_CUT] =
|
|
||||||
_("Help for `generic-cut`.");
|
|
||||||
info[KEY_GENERIC_PASTE] =
|
|
||||||
_("Help for `generic-paste`.");
|
|
||||||
info[KEY_GENERIC_CHANGE_VIEW] =
|
info[KEY_GENERIC_CHANGE_VIEW] =
|
||||||
_("Select next panel in calcurse main screen.");
|
_("Select next panel in calcurse main screen.");
|
||||||
info[KEY_GENERIC_IMPORT] =
|
info[KEY_GENERIC_IMPORT] = _("Import data from an external file.");
|
||||||
_("Import data from an external file.");
|
info[KEY_GENERIC_EXPORT] = _("Export data to a new file format.");
|
||||||
info[KEY_GENERIC_EXPORT] =
|
info[KEY_GENERIC_GOTO] = _("Select the day to go to.");
|
||||||
_("Export data to a new file format.");
|
|
||||||
info[KEY_GENERIC_GOTO] =
|
|
||||||
_("Select the day to go to.");
|
|
||||||
info[KEY_GENERIC_OTHER_CMD] =
|
info[KEY_GENERIC_OTHER_CMD] =
|
||||||
_("Show next possible actions inside status bar.");
|
_("Show next possible actions inside status bar.");
|
||||||
info[KEY_GENERIC_CONFIG_MENU] =
|
info[KEY_GENERIC_CONFIG_MENU] = _("Enter the configuration menu.");
|
||||||
_("Enter the configuration menu.");
|
info[KEY_GENERIC_REDRAW] = _("Redraw calcurse's screen.");
|
||||||
info[KEY_GENERIC_REDRAW] =
|
|
||||||
_("Redraw calcurse's screen.");
|
|
||||||
info[KEY_GENERIC_ADD_APPT] =
|
info[KEY_GENERIC_ADD_APPT] =
|
||||||
_("Add an appointment, whichever panel is currently selected.");
|
_("Add an appointment, whichever panel is currently selected.");
|
||||||
info[KEY_GENERIC_ADD_TODO] =
|
info[KEY_GENERIC_ADD_TODO] =
|
||||||
@@ -509,52 +461,42 @@ keys_popup_info (enum key key)
|
|||||||
_("Move to previous day in calendar, whichever panel is currently "
|
_("Move to previous day in calendar, whichever panel is currently "
|
||||||
"selected.");
|
"selected.");
|
||||||
info[KEY_GENERIC_NEXT_WEEK] =
|
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] =
|
info[KEY_GENERIC_PREV_WEEK] =
|
||||||
_("Move to previous week in calendar, whichever panel is currently "
|
_("Move to previous week in calendar, whichever panel is currently "
|
||||||
"selected");
|
"selected");
|
||||||
info[KEY_GENERIC_SCROLL_DOWN] =
|
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] =
|
info[KEY_GENERIC_SCROLL_UP] =
|
||||||
_("Scroll window up (e.g. when displaying text inside a popup window).");
|
_("Scroll window up (e.g. when displaying text inside a popup window).");
|
||||||
info[KEY_GENERIC_GOTO_TODAY] =
|
info[KEY_GENERIC_GOTO_TODAY] = _("Go to today, whichever panel is selected.");
|
||||||
_("Go to today, whichever panel is selected.");
|
info[KEY_MOVE_RIGHT] = _("Move to the right.");
|
||||||
info[KEY_MOVE_RIGHT] =
|
info[KEY_MOVE_LEFT] = _("Move to the left.");
|
||||||
_("Move to the right.");
|
info[KEY_MOVE_DOWN] = _("Move down.");
|
||||||
info[KEY_MOVE_LEFT] =
|
info[KEY_MOVE_UP] = _("Move up.");
|
||||||
_("Move to the left.");
|
|
||||||
info[KEY_MOVE_DOWN] =
|
|
||||||
_("Move down.");
|
|
||||||
info[KEY_MOVE_UP] =
|
|
||||||
_("Move up.");
|
|
||||||
info[KEY_START_OF_WEEK] =
|
info[KEY_START_OF_WEEK] =
|
||||||
_("Select the first day of the current week when inside the calendar "
|
_("Select the first day of the current week when inside the calendar "
|
||||||
"panel.");
|
"panel.");
|
||||||
info[KEY_END_OF_WEEK] =
|
info[KEY_END_OF_WEEK] =
|
||||||
_("Select the last day of the current week when inside the calendar "
|
_("Select the last day of the current week when inside the calendar "
|
||||||
"panel.");
|
"panel.");
|
||||||
info[KEY_ADD_ITEM] =
|
info[KEY_ADD_ITEM] = _("Add an item to the currently selected panel.");
|
||||||
_("Add an item to the currently selected panel.");
|
info[KEY_DEL_ITEM] = _("Delete the currently selected item.");
|
||||||
info[KEY_DEL_ITEM] =
|
info[KEY_EDIT_ITEM] = _("Edit the currently seleted item.");
|
||||||
_("Delete the currently selected item.");
|
|
||||||
info[KEY_EDIT_ITEM] =
|
|
||||||
_("Edit the currently seleted item.");
|
|
||||||
info[KEY_VIEW_ITEM] =
|
info[KEY_VIEW_ITEM] =
|
||||||
_("Display the currently selected item inside a popup window.");
|
_("Display the currently selected item inside a popup window.");
|
||||||
info[KEY_FLAG_ITEM] =
|
info[KEY_FLAG_ITEM] = _("Flag the currently selected item as important.");
|
||||||
_("Flag the currently selected item as important.");
|
info[KEY_REPEAT_ITEM] = _("Repeat an item");
|
||||||
info[KEY_REPEAT_ITEM] =
|
|
||||||
_("Repeat an item");
|
|
||||||
info[KEY_PIPE_ITEM] =
|
info[KEY_PIPE_ITEM] =
|
||||||
_("Pipe the currently selected item to an external program.");
|
_("Pipe the currently selected item to an external program.");
|
||||||
info[KEY_EDIT_NOTE] =
|
info[KEY_EDIT_NOTE] =
|
||||||
_("Attach (or edit if one exists) a note to the currently selected item");
|
_("Attach (or edit if one exists) a note to the currently selected item");
|
||||||
info[KEY_VIEW_NOTE] =
|
info[KEY_VIEW_NOTE] =
|
||||||
_("View the note attached to the currently selected item.");
|
_("View the note attached to the currently selected item.");
|
||||||
info[KEY_RAISE_PRIORITY] =
|
info[KEY_RAISE_PRIORITY] = _("Raise a task priority inside the todo panel.");
|
||||||
_("Raise a task priority inside the todo panel.");
|
info[KEY_LOWER_PRIORITY] = _("Lower a task priority inside the todo panel.");
|
||||||
info[KEY_LOWER_PRIORITY] =
|
|
||||||
_("Lower a task priority inside the todo panel.");
|
|
||||||
|
|
||||||
if (key < 0 || key > NBKEYS)
|
if (key < 0 || key > NBKEYS)
|
||||||
return;
|
return;
|
||||||
@@ -569,8 +511,7 @@ keys_popup_info (enum key key)
|
|||||||
#undef WINCOL
|
#undef WINCOL
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void keys_save_bindings(FILE * fd)
|
||||||
keys_save_bindings (FILE *fd)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -580,40 +521,33 @@ keys_save_bindings (FILE *fd)
|
|||||||
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
|
int keys_check_missing_bindings(void)
|
||||||
keys_check_missing_bindings (void)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < NBKEYS; i++)
|
for (i = 0; i < NBKEYS; i++) {
|
||||||
{
|
|
||||||
if (!LLIST_FIRST(&keys[i]))
|
if (!LLIST_FIRST(&keys[i]))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void keys_fill_missing(void)
|
||||||
keys_fill_missing (void)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < NBKEYS; i++)
|
for (i = 0; i < NBKEYS; i++) {
|
||||||
{
|
if (!LLIST_FIRST(&keys[i])) {
|
||||||
if (!LLIST_FIRST (&keys[i]))
|
|
||||||
{
|
|
||||||
char *p, tmpbuf[BUFSIZ];
|
char *p, tmpbuf[BUFSIZ];
|
||||||
|
|
||||||
strncpy(tmpbuf, keydef[i].binding, BUFSIZ);
|
strncpy(tmpbuf, keydef[i].binding, BUFSIZ);
|
||||||
p = tmpbuf;
|
p = tmpbuf;
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
char key_ch[BUFSIZ];
|
char key_ch[BUFSIZ];
|
||||||
|
|
||||||
while (*p == ' ')
|
while (*p == ' ')
|
||||||
p++;
|
p++;
|
||||||
if (sscanf (p, "%s", key_ch) == 1)
|
if (sscanf(p, "%s", key_ch) == 1) {
|
||||||
{
|
|
||||||
int ch, used;
|
int ch, used;
|
||||||
|
|
||||||
ch = keys_str2int(key_ch);
|
ch = keys_str2int(key_ch);
|
||||||
@@ -623,8 +557,7 @@ keys_fill_missing (void)
|
|||||||
"\"%s\" was already assigned!"),
|
"\"%s\" was already assigned!"),
|
||||||
keydef[i].label, key_ch);
|
keydef[i].label, key_ch);
|
||||||
p += strlen(key_ch) + 1;
|
p += strlen(key_ch) + 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
96
src/llist.c
96
src/llist.c
@@ -39,8 +39,7 @@
|
|||||||
/*
|
/*
|
||||||
* Initialize a list.
|
* Initialize a list.
|
||||||
*/
|
*/
|
||||||
void
|
void llist_init(llist_t * l)
|
||||||
llist_init (llist_t *l)
|
|
||||||
{
|
{
|
||||||
l->head = NULL;
|
l->head = NULL;
|
||||||
l->tail = NULL;
|
l->tail = NULL;
|
||||||
@@ -49,13 +48,11 @@ llist_init (llist_t *l)
|
|||||||
/*
|
/*
|
||||||
* Free a list, but not the contained data.
|
* Free a list, but not the contained data.
|
||||||
*/
|
*/
|
||||||
void
|
void llist_free(llist_t * l)
|
||||||
llist_free (llist_t *l)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i, *t;
|
llist_item_t *i, *t;
|
||||||
|
|
||||||
for (i = l->head; i; i = t)
|
for (i = l->head; i; i = t) {
|
||||||
{
|
|
||||||
t = i->next;
|
t = i->next;
|
||||||
mem_free(i);
|
mem_free(i);
|
||||||
}
|
}
|
||||||
@@ -67,15 +64,12 @@ llist_free (llist_t *l)
|
|||||||
/*
|
/*
|
||||||
* Free the data contained in a list.
|
* Free the data contained in a list.
|
||||||
*/
|
*/
|
||||||
void
|
void llist_free_inner(llist_t * l, llist_fn_free_t fn_free)
|
||||||
llist_free_inner (llist_t *l, llist_fn_free_t fn_free)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
for (i = l->head; i; i = i->next)
|
for (i = l->head; i; i = i->next) {
|
||||||
{
|
if (i->data) {
|
||||||
if (i->data)
|
|
||||||
{
|
|
||||||
fn_free(i->data);
|
fn_free(i->data);
|
||||||
i->data = NULL;
|
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.
|
* Get the first item of a list.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_first(llist_t * l)
|
||||||
llist_first (llist_t *l)
|
|
||||||
{
|
{
|
||||||
return l->head;
|
return l->head;
|
||||||
}
|
}
|
||||||
@@ -94,8 +87,7 @@ llist_first (llist_t *l)
|
|||||||
/*
|
/*
|
||||||
* Get the nth item of a list.
|
* Get the nth item of a list.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_nth(llist_t * l, int n)
|
||||||
llist_nth (llist_t *l, int n)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
@@ -111,8 +103,7 @@ llist_nth (llist_t *l, int n)
|
|||||||
/*
|
/*
|
||||||
* Get the successor of a list item.
|
* Get the successor of a list item.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_next(llist_item_t * i)
|
||||||
llist_next (llist_item_t *i)
|
|
||||||
{
|
{
|
||||||
return i ? i->next : NULL;
|
return i ? i->next : NULL;
|
||||||
}
|
}
|
||||||
@@ -121,8 +112,8 @@ llist_next (llist_item_t *i)
|
|||||||
* Return the successor of a list item if it is matched by some filter
|
* Return the successor of a list item if it is matched by some filter
|
||||||
* callback. Return NULL otherwise.
|
* callback. Return NULL otherwise.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_next_filter(llist_item_t * i, long data,
|
||||||
llist_next_filter (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
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;
|
return i->next;
|
||||||
@@ -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.
|
* Get the actual data of an item.
|
||||||
*/
|
*/
|
||||||
void *
|
void *llist_get_data(llist_item_t * i)
|
||||||
llist_get_data (llist_item_t *i)
|
|
||||||
{
|
{
|
||||||
return i ? i->data : NULL;
|
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.
|
* Add an item at the end of a list.
|
||||||
*/
|
*/
|
||||||
void
|
void llist_add(llist_t * l, void *data)
|
||||||
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->data = data;
|
||||||
o->next = NULL;
|
o->next = NULL;
|
||||||
|
|
||||||
if (!l->head)
|
if (!l->head)
|
||||||
l->head = l->tail = o;
|
l->head = l->tail = o;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
l->tail->next = o;
|
l->tail->next = o;
|
||||||
l->tail = o;
|
l->tail = o;
|
||||||
}
|
}
|
||||||
@@ -165,31 +152,24 @@ llist_add (llist_t *l, void *data)
|
|||||||
/*
|
/*
|
||||||
* Add an item to a sorted list.
|
* Add an item to a sorted list.
|
||||||
*/
|
*/
|
||||||
void
|
void llist_add_sorted(llist_t * l, void *data, llist_fn_cmp_t fn_cmp)
|
||||||
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;
|
llist_item_t *i;
|
||||||
|
|
||||||
if (o)
|
if (o) {
|
||||||
{
|
|
||||||
o->data = data;
|
o->data = data;
|
||||||
o->next = NULL;
|
o->next = NULL;
|
||||||
|
|
||||||
if (!l->head)
|
if (!l->head)
|
||||||
l->head = l->tail = o;
|
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->next = o;
|
||||||
l->tail = 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;
|
o->next = l->head;
|
||||||
l->head = o;
|
l->head = o;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
i = l->head;
|
i = l->head;
|
||||||
while (i->next && fn_cmp(o->data, i->next->data) >= 0)
|
while (i->next && fn_cmp(o->data, i->next->data) >= 0)
|
||||||
i = i->next;
|
i = i->next;
|
||||||
@@ -202,21 +182,17 @@ llist_add_sorted (llist_t *l, void *data, llist_fn_cmp_t fn_cmp)
|
|||||||
/*
|
/*
|
||||||
* Remove an item from a list.
|
* Remove an item from a list.
|
||||||
*/
|
*/
|
||||||
void
|
void llist_remove(llist_t * l, llist_item_t * i)
|
||||||
llist_remove (llist_t *l, llist_item_t *i)
|
|
||||||
{
|
{
|
||||||
llist_item_t *j = NULL;
|
llist_item_t *j = NULL;
|
||||||
|
|
||||||
if (l->head && i == l->head)
|
if (l->head && i == l->head)
|
||||||
l->head = i->next;
|
l->head = i->next;
|
||||||
else
|
else {
|
||||||
{
|
for (j = l->head; j && j->next != i; j = j->next) ;
|
||||||
for (j = l->head; j && j->next != i; j = j->next)
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i)
|
if (i) {
|
||||||
{
|
|
||||||
if (j)
|
if (j)
|
||||||
j->next = i->next;
|
j->next = i->next;
|
||||||
if (i == l->tail)
|
if (i == l->tail)
|
||||||
@@ -229,13 +205,12 @@ llist_remove (llist_t *l, llist_item_t *i)
|
|||||||
/*
|
/*
|
||||||
* Find the first item matched by some filter callback.
|
* Find the first item matched by some filter callback.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_find_first(llist_t * l, long data,
|
||||||
llist_find_first (llist_t *l, long data, llist_fn_match_t fn_match)
|
llist_fn_match_t fn_match)
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
for (i = l->head; i; i = i->next)
|
for (i = l->head; i; i = i->next) {
|
||||||
{
|
|
||||||
if (fn_match(i->data, data))
|
if (fn_match(i->data, data))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -246,14 +221,12 @@ llist_find_first (llist_t *l, long data, llist_fn_match_t fn_match)
|
|||||||
/*
|
/*
|
||||||
* Find the next item matched by some filter callback.
|
* Find the next item matched by some filter callback.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_find_next(llist_item_t * i, long data,
|
||||||
llist_find_next (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
llist_fn_match_t fn_match)
|
||||||
{
|
|
||||||
if (i)
|
|
||||||
{
|
{
|
||||||
|
if (i) {
|
||||||
i = i->next;
|
i = i->next;
|
||||||
for (; i; i = i->next)
|
for (; i; i = i->next) {
|
||||||
{
|
|
||||||
if (fn_match(i->data, data))
|
if (fn_match(i->data, data))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -265,16 +238,15 @@ llist_find_next (llist_item_t *i, long data, llist_fn_match_t fn_match)
|
|||||||
/*
|
/*
|
||||||
* Find the nth item matched by some filter callback.
|
* Find the nth item matched by some filter callback.
|
||||||
*/
|
*/
|
||||||
llist_item_t *
|
llist_item_t *llist_find_nth(llist_t * l, int n, long data,
|
||||||
llist_find_nth (llist_t *l, int n, long data, llist_fn_match_t fn_match)
|
llist_fn_match_t fn_match)
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (i = l->head; i; i = i->next)
|
for (i = l->head; i; i = i->next) {
|
||||||
{
|
|
||||||
if (fn_match(i->data, data) && (n-- == 0))
|
if (fn_match(i->data, data) && (n-- == 0))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,4 +90,3 @@ struct llist_ts {
|
|||||||
#define LLIST_TS_REMOVE(l_ts, i) llist_remove ((llist_t *)l_ts, i)
|
#define LLIST_TS_REMOVE(l_ts, i) llist_remove ((llist_t *)l_ts, i)
|
||||||
#define LLIST_TS_ADD_SORTED(l_ts, data, fn_cmp) \
|
#define LLIST_TS_ADD_SORTED(l_ts, data, fn_cmp) \
|
||||||
llist_add_sorted ((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
|
llist_add_sorted ((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
|
||||||
|
|
||||||
|
|||||||
58
src/mem.c
58
src/mem.c
@@ -71,9 +71,7 @@ static struct mem_stats mstats;
|
|||||||
|
|
||||||
#endif /* CALCURSE_MEMORY_DEBUG */
|
#endif /* CALCURSE_MEMORY_DEBUG */
|
||||||
|
|
||||||
|
void *xmalloc(size_t size)
|
||||||
void *
|
|
||||||
xmalloc (size_t size)
|
|
||||||
{
|
{
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
@@ -84,8 +82,7 @@ xmalloc (size_t size)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *xcalloc(size_t nmemb, size_t size)
|
||||||
xcalloc (size_t nmemb, size_t size)
|
|
||||||
{
|
{
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
@@ -97,8 +94,7 @@ xcalloc (size_t nmemb, size_t size)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *xrealloc(void *ptr, size_t nmemb, size_t size)
|
||||||
xrealloc (void *ptr, size_t nmemb, size_t size)
|
|
||||||
{
|
{
|
||||||
void *new_ptr;
|
void *new_ptr;
|
||||||
size_t new_size;
|
size_t new_size;
|
||||||
@@ -112,8 +108,7 @@ xrealloc (void *ptr, size_t nmemb, size_t size)
|
|||||||
return new_ptr;
|
return new_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *xstrdup(const char *str)
|
||||||
xstrdup (const char *str)
|
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
char *cp;
|
char *cp;
|
||||||
@@ -124,8 +119,7 @@ xstrdup (const char *str)
|
|||||||
return strncpy(cp, str, len);
|
return strncpy(cp, str, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void xfree(void *p)
|
||||||
xfree (void *p)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(p == NULL, _("xfree: null pointer"));
|
EXIT_IF(p == NULL, _("xfree: null pointer"));
|
||||||
free(p);
|
free(p);
|
||||||
@@ -133,8 +127,7 @@ xfree (void *p)
|
|||||||
|
|
||||||
#ifdef CALCURSE_MEMORY_DEBUG
|
#ifdef CALCURSE_MEMORY_DEBUG
|
||||||
|
|
||||||
static unsigned
|
static unsigned stats_add_blk(size_t size, const char *pos)
|
||||||
stats_add_blk (size_t size, const char *pos)
|
|
||||||
{
|
{
|
||||||
struct mem_blk *o, **i;
|
struct mem_blk *o, **i;
|
||||||
|
|
||||||
@@ -147,24 +140,20 @@ stats_add_blk (size_t size, const char *pos)
|
|||||||
o->size = (unsigned)size;
|
o->size = (unsigned)size;
|
||||||
o->next = 0;
|
o->next = 0;
|
||||||
|
|
||||||
for (i = &mstats.blk; *i; i = &(*i)->next)
|
for (i = &mstats.blk; *i; i = &(*i)->next) ;
|
||||||
;
|
|
||||||
o->id = mstats.ncall;
|
o->id = mstats.ncall;
|
||||||
*i = o;
|
*i = o;
|
||||||
|
|
||||||
return o->id;
|
return o->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void stats_del_blk(unsigned id)
|
||||||
stats_del_blk (unsigned id)
|
|
||||||
{
|
{
|
||||||
struct mem_blk *o, **i;
|
struct mem_blk *o, **i;
|
||||||
|
|
||||||
i = &mstats.blk;
|
i = &mstats.blk;
|
||||||
for (o = mstats.blk; o; o = o->next)
|
for (o = mstats.blk; o; o = o->next) {
|
||||||
{
|
if (o->id == id) {
|
||||||
if (o->id == id)
|
|
||||||
{
|
|
||||||
*i = o->next;
|
*i = o->next;
|
||||||
free(o);
|
free(o);
|
||||||
return;
|
return;
|
||||||
@@ -176,8 +165,7 @@ stats_del_blk (unsigned id)
|
|||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *dbg_malloc(size_t size, const char *pos)
|
||||||
dbg_malloc (size_t size, const char *pos)
|
|
||||||
{
|
{
|
||||||
unsigned *buf;
|
unsigned *buf;
|
||||||
|
|
||||||
@@ -197,8 +185,7 @@ dbg_malloc (size_t size, const char *pos)
|
|||||||
return (void *)(buf + EXTRA_SPACE_START);
|
return (void *)(buf + EXTRA_SPACE_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *dbg_calloc(size_t nmemb, size_t size, const char *pos)
|
||||||
dbg_calloc (size_t nmemb, size_t size, const char *pos)
|
|
||||||
{
|
{
|
||||||
void *buf;
|
void *buf;
|
||||||
|
|
||||||
@@ -216,8 +203,7 @@ dbg_calloc (size_t nmemb, size_t size, const char *pos)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *dbg_realloc(void *ptr, size_t nmemb, size_t size, const char *pos)
|
||||||
dbg_realloc (void *ptr, size_t nmemb, size_t size, const char *pos)
|
|
||||||
{
|
{
|
||||||
unsigned *buf, old_size, new_size, cpy_size;
|
unsigned *buf, old_size, new_size, cpy_size;
|
||||||
|
|
||||||
@@ -242,8 +228,7 @@ dbg_realloc (void *ptr, size_t nmemb, size_t size, const char *pos)
|
|||||||
return (void *)buf;
|
return (void *)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *dbg_strdup(const char *s, const char *pos)
|
||||||
dbg_strdup (const char *s, const char *pos)
|
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
char *buf;
|
char *buf;
|
||||||
@@ -258,8 +243,7 @@ dbg_strdup (const char *s, const char *pos)
|
|||||||
return strncpy(buf, s, size + 1);
|
return strncpy(buf, s, size + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void dbg_free(void *ptr, const char *pos)
|
||||||
dbg_free (void *ptr, const char *pos)
|
|
||||||
{
|
{
|
||||||
unsigned *buf, size;
|
unsigned *buf, size;
|
||||||
|
|
||||||
@@ -270,8 +254,7 @@ dbg_free (void *ptr, const char *pos)
|
|||||||
|
|
||||||
EXIT_IF(buf[BLK_STATE] == MAGIC_FREE,
|
EXIT_IF(buf[BLK_STATE] == MAGIC_FREE,
|
||||||
_("block seems already freed at %s"), pos);
|
_("block seems already freed at %s"), pos);
|
||||||
EXIT_IF (buf[BLK_STATE] != MAGIC_ALLOC,
|
EXIT_IF(buf[BLK_STATE] != MAGIC_ALLOC, _("corrupt block header at %s"), pos);
|
||||||
_("corrupt block header at %s"), pos);
|
|
||||||
EXIT_IF(buf[size - 1] != buf[BLK_ID],
|
EXIT_IF(buf[size - 1] != buf[BLK_ID],
|
||||||
_("corrupt block end at %s, (end = %u, should be %d)"), pos,
|
_("corrupt block end at %s, (end = %u, should be %d)"), pos,
|
||||||
buf[size - 1], buf[BLK_ID]);
|
buf[size - 1], buf[BLK_ID]);
|
||||||
@@ -284,8 +267,7 @@ dbg_free (void *ptr, const char *pos)
|
|||||||
mstats.nfree += size;
|
mstats.nfree += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void dump_block_info(struct mem_blk *blk)
|
||||||
dump_block_info (struct mem_blk *blk)
|
|
||||||
{
|
{
|
||||||
if (blk == NULL)
|
if (blk == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -297,8 +279,7 @@ dump_block_info (struct mem_blk *blk)
|
|||||||
puts(_("-----------------------------------------\n"));
|
puts(_("-----------------------------------------\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void mem_stats(void)
|
||||||
mem_stats (void)
|
|
||||||
{
|
{
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
puts(_("+------------------------------+\n"));
|
puts(_("+------------------------------+\n"));
|
||||||
@@ -309,8 +290,7 @@ mem_stats (void)
|
|||||||
printf(_(" unfreed blocks: %u\n"), mstats.nalloc - mstats.nfree);
|
printf(_(" unfreed blocks: %u\n"), mstats.nalloc - mstats.nfree);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
|
|
||||||
if (mstats.nfree < mstats.nalloc)
|
if (mstats.nfree < mstats.nalloc) {
|
||||||
{
|
|
||||||
struct mem_blk *blk;
|
struct mem_blk *blk;
|
||||||
|
|
||||||
for (blk = mstats.blk; blk; blk = blk->next)
|
for (blk = mstats.blk; blk; blk = blk->next)
|
||||||
|
|||||||
72
src/note.c
72
src/note.c
@@ -55,8 +55,7 @@ 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
|
/* Create note file from a string and return a newly allocated string that
|
||||||
* contains its name. */
|
* contains its name. */
|
||||||
char *
|
char *generate_note(const char *str)
|
||||||
generate_note (const char *str)
|
|
||||||
{
|
{
|
||||||
char *sha1 = mem_malloc(SHA1_DIGESTLEN * 2 + 1);
|
char *sha1 = mem_malloc(SHA1_DIGESTLEN * 2 + 1);
|
||||||
char notepath[BUFSIZ];
|
char notepath[BUFSIZ];
|
||||||
@@ -73,8 +72,7 @@ generate_note (const char *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Edit a note with an external editor. */
|
/* Edit a note with an external editor. */
|
||||||
void
|
void edit_note(char **note, const char *editor)
|
||||||
edit_note (char **note, const char *editor)
|
|
||||||
{
|
{
|
||||||
char tmppath[BUFSIZ];
|
char tmppath[BUFSIZ];
|
||||||
char *tmpext;
|
char *tmpext;
|
||||||
@@ -89,8 +87,7 @@ edit_note (char **note, const char *editor)
|
|||||||
strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1);
|
strncat(tmppath, tmpext, BUFSIZ - strlen(tmppath) - 1);
|
||||||
mem_free(tmpext);
|
mem_free(tmpext);
|
||||||
|
|
||||||
if (*note != NULL)
|
if (*note != NULL) {
|
||||||
{
|
|
||||||
snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note);
|
snprintf(notepath, BUFSIZ, "%s%s", path_notes, *note);
|
||||||
io_file_cp(notepath, tmppath);
|
io_file_cp(notepath, tmppath);
|
||||||
}
|
}
|
||||||
@@ -99,8 +96,7 @@ edit_note (char **note, const char *editor)
|
|||||||
|
|
||||||
if (io_file_is_empty(tmppath) > 0)
|
if (io_file_is_empty(tmppath) > 0)
|
||||||
erase_note(note);
|
erase_note(note);
|
||||||
else if ((fp = fopen (tmppath, "r")))
|
else if ((fp = fopen(tmppath, "r"))) {
|
||||||
{
|
|
||||||
sha1_stream(fp, sha1);
|
sha1_stream(fp, sha1);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
*note = sha1;
|
*note = sha1;
|
||||||
@@ -113,8 +109,7 @@ edit_note (char **note, const char *editor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* View a note in an external pager. */
|
/* View a note in an external pager. */
|
||||||
void
|
void view_note(const char *note, const char *pager)
|
||||||
view_note (const char *note, const char *pager)
|
|
||||||
{
|
{
|
||||||
char fullname[BUFSIZ];
|
char fullname[BUFSIZ];
|
||||||
|
|
||||||
@@ -125,8 +120,7 @@ view_note (const char *note, const char *pager)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Erase a note previously attached to an item. */
|
/* Erase a note previously attached to an item. */
|
||||||
void
|
void erase_note(char **note)
|
||||||
erase_note (char **note)
|
|
||||||
{
|
{
|
||||||
if (*note == NULL)
|
if (*note == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -135,16 +129,13 @@ erase_note (char **note)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read a serialized note file name from a stream and deserialize it. */
|
/* Read a serialized note file name from a stream and deserialize it. */
|
||||||
void
|
void note_read(char *buffer, FILE * fp)
|
||||||
note_read (char *buffer, FILE *fp)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < MAX_NOTESIZ; i++)
|
for (i = 0; i < MAX_NOTESIZ; i++) {
|
||||||
{
|
|
||||||
buffer[i] = getc(fp);
|
buffer[i] = getc(fp);
|
||||||
if (buffer[i] == ' ')
|
if (buffer[i] == ' ') {
|
||||||
{
|
|
||||||
buffer[i] = '\0';
|
buffer[i] = '\0';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -161,15 +152,13 @@ note_gc_extract_key (struct note_gc_hash *data, const char **key, int *len)
|
|||||||
*len = strlen(data->hash);
|
*len = strlen(data->hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int note_gc_cmp(struct note_gc_hash *a, struct note_gc_hash *b)
|
||||||
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. */
|
/* Spot and unlink unused note files. */
|
||||||
void
|
void note_gc(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;
|
struct note_gc_hash *hp;
|
||||||
@@ -183,10 +172,8 @@ note_gc (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Insert all note file names into a hash table. */
|
/* Insert all note file names into a hash table. */
|
||||||
do
|
do {
|
||||||
{
|
if ((dp = readdir(dirp)) && *(dp->d_name) != '.') {
|
||||||
if ((dp = readdir (dirp)) && *(dp->d_name) != '.')
|
|
||||||
{
|
|
||||||
hp = mem_malloc(sizeof(struct note_gc_hash));
|
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);
|
||||||
@@ -200,59 +187,48 @@ note_gc (void)
|
|||||||
closedir(dirp);
|
closedir(dirp);
|
||||||
|
|
||||||
/* Remove hashes that are actually in use. */
|
/* Remove hashes that are actually in use. */
|
||||||
LLIST_TS_FOREACH (&alist_p, i)
|
LLIST_TS_FOREACH(&alist_p, i) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_GET_DATA(i);
|
struct apoint *apt = LLIST_GET_DATA(i);
|
||||||
if (apt->note)
|
if (apt->note) {
|
||||||
{
|
|
||||||
tmph.hash = apt->note;
|
tmph.hash = apt->note;
|
||||||
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LLIST_FOREACH (&eventlist, i)
|
LLIST_FOREACH(&eventlist, i) {
|
||||||
{
|
|
||||||
struct event *ev = LLIST_GET_DATA(i);
|
struct event *ev = LLIST_GET_DATA(i);
|
||||||
if (ev->note)
|
if (ev->note) {
|
||||||
{
|
|
||||||
tmph.hash = 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)
|
LLIST_TS_FOREACH(&recur_alist_p, i) {
|
||||||
{
|
|
||||||
struct recur_apoint *rapt = LLIST_GET_DATA(i);
|
struct recur_apoint *rapt = LLIST_GET_DATA(i);
|
||||||
if (rapt->note)
|
if (rapt->note) {
|
||||||
{
|
|
||||||
tmph.hash = 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)
|
LLIST_FOREACH(&recur_elist, i) {
|
||||||
{
|
|
||||||
struct recur_event *rev = LLIST_GET_DATA(i);
|
struct recur_event *rev = LLIST_GET_DATA(i);
|
||||||
if (rev->note)
|
if (rev->note) {
|
||||||
{
|
|
||||||
tmph.hash = rev->note;
|
tmph.hash = rev->note;
|
||||||
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LLIST_FOREACH (&todolist, i)
|
LLIST_FOREACH(&todolist, i) {
|
||||||
{
|
|
||||||
struct todo *todo = LLIST_GET_DATA(i);
|
struct todo *todo = LLIST_GET_DATA(i);
|
||||||
if (todo->note)
|
if (todo->note) {
|
||||||
{
|
|
||||||
tmph.hash = todo->note;
|
tmph.hash = todo->note;
|
||||||
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
free(HTABLE_REMOVE(htp, &gc_htable, &tmph));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unlink unused note files. */
|
/* Unlink unused note files. */
|
||||||
HTABLE_FOREACH (hp, htp, &gc_htable)
|
HTABLE_FOREACH(hp, htp, &gc_htable) {
|
||||||
{
|
|
||||||
snprintf(notepath, BUFSIZ, "%s%s", path_notes, hp->hash);
|
snprintf(notepath, BUFSIZ, "%s%s", path_notes, hp->hash);
|
||||||
unlink(notepath);
|
unlink(notepath);
|
||||||
}
|
}
|
||||||
|
|||||||
226
src/notify.c
226
src/notify.c
@@ -60,8 +60,7 @@ static pthread_t notify_t_main;
|
|||||||
* Return the number of seconds before next appointment
|
* Return the number of seconds before next appointment
|
||||||
* (0 if no upcoming appointment).
|
* (0 if no upcoming appointment).
|
||||||
*/
|
*/
|
||||||
int
|
int notify_time_left(void)
|
||||||
notify_time_left (void)
|
|
||||||
{
|
{
|
||||||
time_t ntimer;
|
time_t ntimer;
|
||||||
int left;
|
int left;
|
||||||
@@ -76,8 +75,7 @@ notify_time_left (void)
|
|||||||
* Return 1 if the reminder was not sent already for the upcoming
|
* Return 1 if the reminder was not sent already for the upcoming
|
||||||
* appointment.
|
* appointment.
|
||||||
*/
|
*/
|
||||||
unsigned
|
unsigned notify_needs_reminder(void)
|
||||||
notify_needs_reminder (void)
|
|
||||||
{
|
{
|
||||||
if (notify_app.got_app
|
if (notify_app.got_app
|
||||||
&& (((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) ||
|
&& (((notify_app.state & APOINT_NOTIFY) && !nbar.notify_all) ||
|
||||||
@@ -92,8 +90,7 @@ notify_needs_reminder (void)
|
|||||||
* Note: the mutex associated with this structure must be locked by the
|
* Note: the mutex associated with this structure must be locked by the
|
||||||
* caller!
|
* caller!
|
||||||
*/
|
*/
|
||||||
void
|
void notify_update_app(long start, char state, char *msg)
|
||||||
notify_update_app (long start, char state, char *msg)
|
|
||||||
{
|
{
|
||||||
notify_free_app();
|
notify_free_app();
|
||||||
notify_app.got_app = 1;
|
notify_app.got_app = 1;
|
||||||
@@ -103,8 +100,7 @@ notify_update_app (long start, char state, char *msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if we need to display the notify-bar, else 0. */
|
/* Return 1 if we need to display the notify-bar, else 0. */
|
||||||
int
|
int notify_bar(void)
|
||||||
notify_bar (void)
|
|
||||||
{
|
{
|
||||||
int display_bar = 0;
|
int display_bar = 0;
|
||||||
|
|
||||||
@@ -116,8 +112,7 @@ notify_bar (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the nbar variable used to store notification options. */
|
/* Initialize the nbar variable used to store notification options. */
|
||||||
void
|
void notify_init_vars(void)
|
||||||
notify_init_vars (void)
|
|
||||||
{
|
{
|
||||||
const char *time_format = "%T";
|
const char *time_format = "%T";
|
||||||
const char *date_format = "%a %F";
|
const char *date_format = "%a %F";
|
||||||
@@ -140,16 +135,14 @@ notify_init_vars (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Extract the appointment file name from the complete file path. */
|
/* Extract the appointment file name from the complete file path. */
|
||||||
static void
|
static void extract_aptsfile(void)
|
||||||
extract_aptsfile (void)
|
|
||||||
{
|
{
|
||||||
char *file;
|
char *file;
|
||||||
|
|
||||||
file = strrchr(path_apts, '/');
|
file = strrchr(path_apts, '/');
|
||||||
if (!file)
|
if (!file)
|
||||||
notify.apts_file = path_apts;
|
notify.apts_file = path_apts;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
notify.apts_file = file;
|
notify.apts_file = file;
|
||||||
notify.apts_file++;
|
notify.apts_file++;
|
||||||
}
|
}
|
||||||
@@ -160,8 +153,7 @@ extract_aptsfile (void)
|
|||||||
* creating the notification window (l is the number of lines, c the
|
* creating the notification window (l is the number of lines, c the
|
||||||
* number of columns, y and x are its coordinates).
|
* number of columns, y and x are its coordinates).
|
||||||
*/
|
*/
|
||||||
void
|
void notify_init_bar(void)
|
||||||
notify_init_bar (void)
|
|
||||||
{
|
{
|
||||||
pthread_mutex_init(¬ify.mutex, NULL);
|
pthread_mutex_init(¬ify.mutex, NULL);
|
||||||
pthread_mutex_init(¬ify_app.mutex, NULL);
|
pthread_mutex_init(¬ify_app.mutex, NULL);
|
||||||
@@ -174,8 +166,7 @@ notify_init_bar (void)
|
|||||||
/*
|
/*
|
||||||
* Free memory associated with the notify_app structure.
|
* Free memory associated with the notify_app structure.
|
||||||
*/
|
*/
|
||||||
void
|
void notify_free_app(void)
|
||||||
notify_free_app (void)
|
|
||||||
{
|
{
|
||||||
notify_app.time = 0;
|
notify_app.time = 0;
|
||||||
notify_app.got_app = 0;
|
notify_app.got_app = 0;
|
||||||
@@ -186,11 +177,9 @@ notify_free_app (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Stop the notify-bar main thread. */
|
/* Stop the notify-bar main thread. */
|
||||||
void
|
void notify_stop_main_thread(void)
|
||||||
notify_stop_main_thread (void)
|
|
||||||
{
|
|
||||||
if (notify_t_main)
|
|
||||||
{
|
{
|
||||||
|
if (notify_t_main) {
|
||||||
pthread_cancel(notify_t_main);
|
pthread_cancel(notify_t_main);
|
||||||
pthread_join(notify_t_main, NULL);
|
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
|
* The calcurse window geometry has changed so we need to reset the
|
||||||
* notification window.
|
* notification window.
|
||||||
*/
|
*/
|
||||||
void
|
void notify_reinit_bar(void)
|
||||||
notify_reinit_bar (void)
|
|
||||||
{
|
{
|
||||||
delwin(notify.win);
|
delwin(notify.win);
|
||||||
notify.win = newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x);
|
notify.win = newwin(win[NOT].h, win[NOT].w, win[NOT].y, win[NOT].x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Launch user defined command as a notification. */
|
/* Launch user defined command as a notification. */
|
||||||
unsigned
|
unsigned notify_launch_cmd(void)
|
||||||
notify_launch_cmd (void)
|
|
||||||
{
|
{
|
||||||
int pid;
|
int pid;
|
||||||
|
|
||||||
@@ -220,16 +207,12 @@ notify_launch_cmd (void)
|
|||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
|
|
||||||
if (pid < 0)
|
if (pid < 0) {
|
||||||
{
|
|
||||||
ERROR_MSG(_("error while launching command: could not fork"));
|
ERROR_MSG(_("error while launching command: could not fork"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
} else if (pid == 0) {
|
||||||
else if (pid == 0)
|
|
||||||
{
|
|
||||||
/* Child: launch user defined command */
|
/* Child: launch user defined command */
|
||||||
if (execlp (nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) < 0)
|
if (execlp(nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) < 0) {
|
||||||
{
|
|
||||||
ERROR_MSG(_("error while launching command"));
|
ERROR_MSG(_("error while launching command"));
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
@@ -243,8 +226,7 @@ notify_launch_cmd (void)
|
|||||||
* Update the notification bar. This is useful when changing color theme
|
* Update the notification bar. This is useful when changing color theme
|
||||||
* for example.
|
* for example.
|
||||||
*/
|
*/
|
||||||
void
|
void notify_update_bar(void)
|
||||||
notify_update_bar (void)
|
|
||||||
{
|
{
|
||||||
const int space = 3;
|
const int space = 3;
|
||||||
int file_pos, date_pos, app_pos, txt_max_len, too_long = 0;
|
int file_pos, date_pos, app_pos, txt_max_len, too_long = 0;
|
||||||
@@ -261,15 +243,12 @@ notify_update_bar (void)
|
|||||||
custom_apply_attr(notify.win, ATTR_HIGHEST);
|
custom_apply_attr(notify.win, ATTR_HIGHEST);
|
||||||
wattron(notify.win, A_UNDERLINE | A_REVERSE);
|
wattron(notify.win, A_UNDERLINE | A_REVERSE);
|
||||||
mvwhline(notify.win, 0, 0, ACS_HLINE, col);
|
mvwhline(notify.win, 0, 0, ACS_HLINE, col);
|
||||||
mvwprintw (notify.win, 0, date_pos, "[ %s | %s ]",
|
mvwprintw(notify.win, 0, date_pos, "[ %s | %s ]", notify.date, notify.time);
|
||||||
notify.date, notify.time);
|
|
||||||
mvwprintw(notify.win, 0, file_pos, "(%s)", notify.apts_file);
|
mvwprintw(notify.win, 0, file_pos, "(%s)", notify.apts_file);
|
||||||
|
|
||||||
pthread_mutex_lock(¬ify_app.mutex);
|
pthread_mutex_lock(¬ify_app.mutex);
|
||||||
if (notify_app.got_app)
|
if (notify_app.got_app) {
|
||||||
{
|
if (strlen(notify_app.txt) > txt_max_len) {
|
||||||
if (strlen (notify_app.txt) > txt_max_len)
|
|
||||||
{
|
|
||||||
int shrink_len;
|
int shrink_len;
|
||||||
|
|
||||||
too_long = 1;
|
too_long = 1;
|
||||||
@@ -278,8 +257,7 @@ notify_update_bar (void)
|
|||||||
buf[shrink_len] = '\0';
|
buf[shrink_len] = '\0';
|
||||||
}
|
}
|
||||||
time_left = notify_time_left();
|
time_left = notify_time_left();
|
||||||
if (time_left > 0)
|
if (time_left > 0) {
|
||||||
{
|
|
||||||
int hours_left, minutes_left;
|
int hours_left, minutes_left;
|
||||||
|
|
||||||
hours_left = (time_left / HOURINSEC);
|
hours_left = (time_left / HOURINSEC);
|
||||||
@@ -307,9 +285,7 @@ notify_update_bar (void)
|
|||||||
if (blinking)
|
if (blinking)
|
||||||
notify_launch_cmd();
|
notify_launch_cmd();
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
notify_app.got_app = 0;
|
notify_app.got_app = 0;
|
||||||
pthread_mutex_unlock(¬ify_app.mutex);
|
pthread_mutex_unlock(¬ify_app.mutex);
|
||||||
pthread_mutex_unlock(¬ify.mutex);
|
pthread_mutex_unlock(¬ify.mutex);
|
||||||
@@ -328,8 +304,7 @@ notify_update_bar (void)
|
|||||||
|
|
||||||
/* Update the notication bar content */
|
/* Update the notication bar content */
|
||||||
/* ARGSUSED0 */
|
/* ARGSUSED0 */
|
||||||
static void *
|
static void *notify_main_thread(void *arg)
|
||||||
notify_main_thread (void *arg)
|
|
||||||
{
|
{
|
||||||
const unsigned thread_sleep = 1;
|
const unsigned thread_sleep = 1;
|
||||||
const unsigned check_app = MININSEC;
|
const unsigned check_app = MININSEC;
|
||||||
@@ -340,8 +315,7 @@ notify_main_thread (void *arg)
|
|||||||
|
|
||||||
elapse = 0;
|
elapse = 0;
|
||||||
|
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
ntimer = time(NULL);
|
ntimer = time(NULL);
|
||||||
ntime = localtime(&ntimer);
|
ntime = localtime(&ntimer);
|
||||||
pthread_mutex_lock(¬ify.mutex);
|
pthread_mutex_lock(¬ify.mutex);
|
||||||
@@ -353,8 +327,7 @@ notify_main_thread (void *arg)
|
|||||||
notify_update_bar();
|
notify_update_bar();
|
||||||
psleep(thread_sleep);
|
psleep(thread_sleep);
|
||||||
elapse += thread_sleep;
|
elapse += thread_sleep;
|
||||||
if (elapse >= check_app)
|
if (elapse >= check_app) {
|
||||||
{
|
|
||||||
elapse = 0;
|
elapse = 0;
|
||||||
pthread_mutex_lock(¬ify_app.mutex);
|
pthread_mutex_lock(¬ify_app.mutex);
|
||||||
got_app = notify_app.got_app;
|
got_app = notify_app.got_app;
|
||||||
@@ -367,8 +340,7 @@ notify_main_thread (void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fill the given structure with information about next appointment. */
|
/* Fill the given structure with information about next appointment. */
|
||||||
unsigned
|
unsigned notify_get_next(struct notify_app *a)
|
||||||
notify_get_next (struct notify_app *a)
|
|
||||||
{
|
{
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
|
|
||||||
@@ -391,8 +363,7 @@ notify_get_next (struct notify_app *a)
|
|||||||
* This is used for the daemon to check if we have an upcoming appointment or
|
* This is used for the daemon to check if we have an upcoming appointment or
|
||||||
* not.
|
* not.
|
||||||
*/
|
*/
|
||||||
unsigned
|
unsigned notify_get_next_bkgd(void)
|
||||||
notify_get_next_bkgd (void)
|
|
||||||
{
|
{
|
||||||
struct notify_app a;
|
struct notify_app a;
|
||||||
|
|
||||||
@@ -400,14 +371,11 @@ notify_get_next_bkgd (void)
|
|||||||
if (!notify_get_next(&a))
|
if (!notify_get_next(&a))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!a.got_app)
|
if (!a.got_app) {
|
||||||
{
|
|
||||||
/* No next appointment, reset the previous notified one. */
|
/* No next appointment, reset the previous notified one. */
|
||||||
notify_app.got_app = 0;
|
notify_app.got_app = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!notify_same_item(a.time))
|
if (!notify_same_item(a.time))
|
||||||
notify_update_app(a.time, a.state, a.txt);
|
notify_update_app(a.time, a.state, a.txt);
|
||||||
}
|
}
|
||||||
@@ -419,8 +387,7 @@ notify_get_next_bkgd (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Return the description of next appointment to be notified. */
|
/* Return the description of next appointment to be notified. */
|
||||||
char *
|
char *notify_app_txt(void)
|
||||||
notify_app_txt (void)
|
|
||||||
{
|
{
|
||||||
if (notify_app.got_app)
|
if (notify_app.got_app)
|
||||||
return notify_app.txt;
|
return notify_app.txt;
|
||||||
@@ -430,8 +397,7 @@ notify_app_txt (void)
|
|||||||
|
|
||||||
/* Look for the next appointment within the next 24 hours. */
|
/* Look for the next appointment within the next 24 hours. */
|
||||||
/* ARGSUSED0 */
|
/* ARGSUSED0 */
|
||||||
static void *
|
static void *notify_thread_app(void *arg)
|
||||||
notify_thread_app (void *arg)
|
|
||||||
{
|
{
|
||||||
struct notify_app tmp_app;
|
struct notify_app tmp_app;
|
||||||
int force = (arg ? 1 : 0);
|
int force = (arg ? 1 : 0);
|
||||||
@@ -439,16 +405,12 @@ notify_thread_app (void *arg)
|
|||||||
if (!notify_get_next(&tmp_app))
|
if (!notify_get_next(&tmp_app))
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
|
|
||||||
if (!tmp_app.got_app)
|
if (!tmp_app.got_app) {
|
||||||
{
|
|
||||||
pthread_mutex_lock(¬ify_app.mutex);
|
pthread_mutex_lock(¬ify_app.mutex);
|
||||||
notify_free_app();
|
notify_free_app();
|
||||||
pthread_mutex_unlock(¬ify_app.mutex);
|
pthread_mutex_unlock(¬ify_app.mutex);
|
||||||
}
|
} else {
|
||||||
else
|
if (force || !notify_same_item(tmp_app.time)) {
|
||||||
{
|
|
||||||
if (force || !notify_same_item (tmp_app.time))
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(¬ify_app.mutex);
|
pthread_mutex_lock(¬ify_app.mutex);
|
||||||
notify_update_app(tmp_app.time, tmp_app.state, tmp_app.txt);
|
notify_update_app(tmp_app.time, tmp_app.state, tmp_app.txt);
|
||||||
pthread_mutex_unlock(¬ify_app.mutex);
|
pthread_mutex_unlock(¬ify_app.mutex);
|
||||||
@@ -463,20 +425,17 @@ notify_thread_app (void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Launch the thread notify_thread_app to look for next appointment. */
|
/* Launch the thread notify_thread_app to look for next appointment. */
|
||||||
void
|
void notify_check_next_app(int force)
|
||||||
notify_check_next_app (int force)
|
|
||||||
{
|
{
|
||||||
pthread_t notify_t_app;
|
pthread_t notify_t_app;
|
||||||
void *arg = (force ? (void *)1 : NULL);
|
void *arg = (force ? (void *)1 : NULL);
|
||||||
|
|
||||||
pthread_create (¬ify_t_app, &detached_thread_attr, notify_thread_app,
|
pthread_create(¬ify_t_app, &detached_thread_attr, notify_thread_app, arg);
|
||||||
arg);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the newly created appointment is to be notified. */
|
/* Check if the newly created appointment is to be notified. */
|
||||||
void
|
void notify_check_added(char *mesg, long start, char state)
|
||||||
notify_check_added (char *mesg, long start, char state)
|
|
||||||
{
|
{
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
int update_notify = 0;
|
int update_notify = 0;
|
||||||
@@ -484,21 +443,16 @@ notify_check_added (char *mesg, long start, char state)
|
|||||||
|
|
||||||
current_time = time(NULL);
|
current_time = time(NULL);
|
||||||
pthread_mutex_lock(¬ify_app.mutex);
|
pthread_mutex_lock(¬ify_app.mutex);
|
||||||
if (!notify_app.got_app)
|
if (!notify_app.got_app) {
|
||||||
{
|
|
||||||
gap = start - current_time;
|
gap = start - current_time;
|
||||||
if (gap >= 0 && gap <= DAYINSEC)
|
if (gap >= 0 && gap <= DAYINSEC)
|
||||||
update_notify = 1;
|
update_notify = 1;
|
||||||
}
|
} else if (start < notify_app.time && start >= current_time) {
|
||||||
else if (start < notify_app.time && start >= current_time)
|
|
||||||
{
|
|
||||||
update_notify = 1;
|
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;
|
update_notify = 1;
|
||||||
|
|
||||||
if (update_notify)
|
if (update_notify) {
|
||||||
{
|
|
||||||
notify_update_app(start, state, mesg);
|
notify_update_app(start, state, mesg);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(¬ify_app.mutex);
|
pthread_mutex_unlock(¬ify_app.mutex);
|
||||||
@@ -506,8 +460,7 @@ notify_check_added (char *mesg, long start, char state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the newly repeated appointment is to be notified. */
|
/* Check if the newly repeated appointment is to be notified. */
|
||||||
void
|
void notify_check_repeated(struct recur_apoint *i)
|
||||||
notify_check_repeated (struct recur_apoint *i)
|
|
||||||
{
|
{
|
||||||
unsigned real_app_time;
|
unsigned real_app_time;
|
||||||
int update_notify = 0;
|
int update_notify = 0;
|
||||||
@@ -517,32 +470,23 @@ notify_check_repeated (struct recur_apoint *i)
|
|||||||
pthread_mutex_lock(¬ify_app.mutex);
|
pthread_mutex_lock(¬ify_app.mutex);
|
||||||
if (recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type,
|
if (recur_item_find_occurrence(i->start, i->dur, &i->exc, i->rpt->type,
|
||||||
i->rpt->freq, i->rpt->until, get_today(),
|
i->rpt->freq, i->rpt->until, get_today(),
|
||||||
&real_app_time))
|
&real_app_time)) {
|
||||||
{
|
if (!notify_app.got_app) {
|
||||||
if (!notify_app.got_app)
|
|
||||||
{
|
|
||||||
if (real_app_time - current_time <= DAYINSEC)
|
if (real_app_time - current_time <= DAYINSEC)
|
||||||
update_notify = 1;
|
update_notify = 1;
|
||||||
}
|
} else if (real_app_time < notify_app.time && real_app_time >= current_time) {
|
||||||
else if (real_app_time < notify_app.time &&
|
update_notify = 1;
|
||||||
real_app_time >= current_time)
|
} else if (real_app_time == notify_app.time && i->state != notify_app.state)
|
||||||
{
|
|
||||||
update_notify = 1;
|
update_notify = 1;
|
||||||
}
|
}
|
||||||
else if (real_app_time == notify_app.time &&
|
if (update_notify) {
|
||||||
i->state != notify_app.state)
|
|
||||||
update_notify = 1;
|
|
||||||
}
|
|
||||||
if (update_notify)
|
|
||||||
{
|
|
||||||
notify_update_app(real_app_time, i->state, i->mesg);
|
notify_update_app(real_app_time, i->state, i->mesg);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(¬ify_app.mutex);
|
pthread_mutex_unlock(¬ify_app.mutex);
|
||||||
notify_update_bar();
|
notify_update_bar();
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int notify_same_item(long time)
|
||||||
notify_same_item (long time)
|
|
||||||
{
|
{
|
||||||
int same = 0;
|
int same = 0;
|
||||||
|
|
||||||
@@ -554,8 +498,7 @@ notify_same_item (long time)
|
|||||||
return same;
|
return same;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int notify_same_recur_item(struct recur_apoint *i)
|
||||||
notify_same_recur_item (struct recur_apoint *i)
|
|
||||||
{
|
{
|
||||||
int same = 0;
|
int same = 0;
|
||||||
unsigned item_start = 0;
|
unsigned item_start = 0;
|
||||||
@@ -572,8 +515,7 @@ notify_same_recur_item (struct recur_apoint *i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Launch the notify-bar main thread. */
|
/* Launch the notify-bar main thread. */
|
||||||
void
|
void notify_start_main_thread(void)
|
||||||
notify_start_main_thread (void)
|
|
||||||
{
|
{
|
||||||
pthread_create(¬ify_t_main, NULL, notify_main_thread, NULL);
|
pthread_create(¬ify_t_main, NULL, notify_main_thread, NULL);
|
||||||
notify_check_next_app(0);
|
notify_check_next_app(0);
|
||||||
@@ -595,16 +537,14 @@ print_option (WINDOW *win, unsigned x, unsigned y, char *name,
|
|||||||
x_opt = x + XOFF + strlen(name);
|
x_opt = x + XOFF + strlen(name);
|
||||||
mvwprintw(win, y, x, "[%u] %s", num, name);
|
mvwprintw(win, y, x, "[%u] %s", num, name);
|
||||||
erase_window_part(win, x_opt, y, MAXCOL, y);
|
erase_window_part(win, x_opt, y, MAXCOL, y);
|
||||||
if ((len = strlen (valstr)) != 0)
|
if ((len = strlen(valstr)) != 0) {
|
||||||
{
|
|
||||||
unsigned maxlen;
|
unsigned maxlen;
|
||||||
|
|
||||||
maxlen = MAXCOL - x_opt - 2;
|
maxlen = MAXCOL - x_opt - 2;
|
||||||
custom_apply_attr(win, ATTR_HIGHEST);
|
custom_apply_attr(win, ATTR_HIGHEST);
|
||||||
if (len < maxlen)
|
if (len < maxlen)
|
||||||
mvwprintw(win, y, x_opt, "%s", valstr);
|
mvwprintw(win, y, x_opt, "%s", valstr);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
|
|
||||||
strncpy(buf, valstr, maxlen - 1);
|
strncpy(buf, valstr, maxlen - 1);
|
||||||
@@ -612,25 +552,21 @@ print_option (WINDOW *win, unsigned x, unsigned y, char *name,
|
|||||||
mvwprintw(win, y, x_opt, "%s...", buf);
|
mvwprintw(win, y, x_opt, "%s...", buf);
|
||||||
}
|
}
|
||||||
custom_remove_attr(win, ATTR_HIGHEST);
|
custom_remove_attr(win, ATTR_HIGHEST);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
print_bool_option_incolor(win, valbool, y, x_opt);
|
print_bool_option_incolor(win, valbool, y, x_opt);
|
||||||
mvwprintw(win, y + 1, x, desc);
|
mvwprintw(win, y + 1, x, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print options related to the notify-bar. */
|
/* Print options related to the notify-bar. */
|
||||||
static unsigned
|
static unsigned print_config_options(WINDOW * optwin)
|
||||||
print_config_options (WINDOW *optwin)
|
|
||||||
{
|
{
|
||||||
const int XORIG = 3;
|
const int XORIG = 3;
|
||||||
const int YORIG = 0;
|
const int YORIG = 0;
|
||||||
const int YOFF = 3;
|
const int YOFF = 3;
|
||||||
|
|
||||||
enum
|
enum { SHOW, DATE, CLOCK, WARN, CMD, NOTIFY_ALL, DMON, DMON_LOG, NB_OPT };
|
||||||
{ SHOW, DATE, CLOCK, WARN, CMD, NOTIFY_ALL, DMON, DMON_LOG, NB_OPT };
|
|
||||||
|
|
||||||
struct opt_s
|
struct opt_s {
|
||||||
{
|
|
||||||
char *name;
|
char *name;
|
||||||
char *desc;
|
char *desc;
|
||||||
char valstr[BUFSIZ];
|
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[CMD].desc = _("(Command used to notify user of an upcoming appointment)");
|
||||||
|
|
||||||
opt[NOTIFY_ALL].name = _("notification.notifyall = ");
|
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].name = _("daemon.enable = ");
|
||||||
opt[DMON].desc = _("(Run in background to get notifications after exiting)");
|
opt[DMON].desc = _("(Run in background to get notifications after exiting)");
|
||||||
@@ -683,8 +620,7 @@ print_config_options (WINDOW *optwin)
|
|||||||
opt[SHOW].valstr[0] = opt[NOTIFY_ALL].valstr[0] = opt[DMON].valstr[0] =
|
opt[SHOW].valstr[0] = opt[NOTIFY_ALL].valstr[0] = opt[DMON].valstr[0] =
|
||||||
opt[DMON_LOG].valstr[0] = '\0';
|
opt[DMON_LOG].valstr[0] = '\0';
|
||||||
|
|
||||||
for (i = 0; i < NB_OPT; i++)
|
for (i = 0; i < NB_OPT; i++) {
|
||||||
{
|
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
y = YORIG + i * YOFF;
|
y = YORIG + i * YOFF;
|
||||||
@@ -695,8 +631,7 @@ print_config_options (WINDOW *optwin)
|
|||||||
return YORIG + NB_OPT * YOFF;
|
return YORIG + NB_OPT * YOFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void reinit_conf_win(struct scrollwin *win)
|
||||||
reinit_conf_win (struct scrollwin *win)
|
|
||||||
{
|
{
|
||||||
unsigned first_line;
|
unsigned first_line;
|
||||||
|
|
||||||
@@ -709,21 +644,19 @@ reinit_conf_win (struct scrollwin *win)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Notify-bar configuration. */
|
/* Notify-bar configuration. */
|
||||||
void
|
void notify_config_bar(void)
|
||||||
notify_config_bar (void)
|
|
||||||
{
|
{
|
||||||
struct scrollwin cwin;
|
struct scrollwin cwin;
|
||||||
char *buf;
|
char *buf;
|
||||||
const char *number_str =
|
const char *number_str = _("Enter an option number to change its value");
|
||||||
_("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 *keys =
|
|
||||||
_("(Press '^P' or '^N' to move up or down, 'Q' to quit)");
|
|
||||||
const char *date_str =
|
const char *date_str =
|
||||||
_("Enter the date format (see 'man 3 strftime' for possible formats) ");
|
_("Enter the date format (see 'man 3 strftime' for possible formats) ");
|
||||||
const char *time_str =
|
const char *time_str =
|
||||||
_("Enter the time format (see 'man 3 strftime' for possible formats) ");
|
_("Enter the time format (see 'man 3 strftime' for possible formats) ");
|
||||||
const char *count_str =
|
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 ");
|
const char *cmd_str = _("Enter the notification command ");
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
@@ -737,12 +670,10 @@ notify_config_bar (void)
|
|||||||
wins_scrollwin_display(&cwin);
|
wins_scrollwin_display(&cwin);
|
||||||
|
|
||||||
buf = mem_malloc(BUFSIZ);
|
buf = mem_malloc(BUFSIZ);
|
||||||
while ((ch = wgetch (win[STA].p)) != 'q')
|
while ((ch = wgetch(win[STA].p)) != 'q') {
|
||||||
{
|
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
||||||
switch (ch)
|
switch (ch) {
|
||||||
{
|
|
||||||
case CTRL('N'):
|
case CTRL('N'):
|
||||||
wins_scrollwin_down(&cwin, 1);
|
wins_scrollwin_down(&cwin, 1);
|
||||||
break;
|
break;
|
||||||
@@ -765,8 +696,7 @@ notify_config_bar (void)
|
|||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
strncpy(buf, nbar.datefmt, strlen(nbar.datefmt) + 1);
|
strncpy(buf, nbar.datefmt, strlen(nbar.datefmt) + 1);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
|
||||||
{
|
|
||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
strncpy(nbar.datefmt, buf, strlen(buf) + 1);
|
strncpy(nbar.datefmt, buf, strlen(buf) + 1);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
@@ -777,8 +707,7 @@ notify_config_bar (void)
|
|||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
strncpy(buf, nbar.timefmt, strlen(nbar.timefmt) + 1);
|
strncpy(buf, nbar.timefmt, strlen(nbar.timefmt) + 1);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
|
||||||
{
|
|
||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
strncpy(nbar.timefmt, buf, strlen(buf) + 1);
|
strncpy(nbar.timefmt, buf, strlen(buf) + 1);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
@@ -790,8 +719,7 @@ notify_config_bar (void)
|
|||||||
printf(buf, "%d", nbar.cntdwn);
|
printf(buf, "%d", nbar.cntdwn);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
if (updatestring(win[STA].p, &buf, 0, 1) == 0 &&
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0 &&
|
||||||
is_all_digit (buf) && atoi (buf) >= 0 && atoi (buf) <= DAYINSEC)
|
is_all_digit(buf) && atoi(buf) >= 0 && atoi(buf) <= DAYINSEC) {
|
||||||
{
|
|
||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
nbar.cntdwn = atoi(buf);
|
nbar.cntdwn = atoi(buf);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
@@ -802,8 +730,7 @@ notify_config_bar (void)
|
|||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
strncpy(buf, nbar.cmd, strlen(nbar.cmd) + 1);
|
strncpy(buf, nbar.cmd, strlen(nbar.cmd) + 1);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
|
||||||
{
|
|
||||||
pthread_mutex_lock(&nbar.mutex);
|
pthread_mutex_lock(&nbar.mutex);
|
||||||
strncpy(nbar.cmd, buf, strlen(buf) + 1);
|
strncpy(nbar.cmd, buf, strlen(buf) + 1);
|
||||||
pthread_mutex_unlock(&nbar.mutex);
|
pthread_mutex_unlock(&nbar.mutex);
|
||||||
@@ -823,18 +750,15 @@ notify_config_bar (void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
wins_get_config();
|
wins_get_config();
|
||||||
wins_reset();
|
wins_reset();
|
||||||
reinit_conf_win(&cwin);
|
reinit_conf_win(&cwin);
|
||||||
delwin(win[STA].p);
|
delwin(win[STA].p);
|
||||||
win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y,
|
win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
||||||
win[STA].x);
|
|
||||||
keypad(win[STA].p, TRUE);
|
keypad(win[STA].p, TRUE);
|
||||||
if (notify_bar ())
|
if (notify_bar()) {
|
||||||
{
|
|
||||||
notify_reinit_bar();
|
notify_reinit_bar();
|
||||||
notify_update_bar();
|
notify_update_bar();
|
||||||
}
|
}
|
||||||
|
|||||||
72
src/pcal.c
72
src/pcal.c
@@ -70,15 +70,12 @@ foreach_date_dump (const long date_end, struct rpt *rpt, llist_t *exc,
|
|||||||
date = mktime(<);
|
date = mktime(<);
|
||||||
item_time = item_first_date - date;
|
item_time = item_first_date - date;
|
||||||
|
|
||||||
while (date <= date_end && date <= rpt->until)
|
while (date <= date_end && date <= rpt->until) {
|
||||||
{
|
|
||||||
if (recur_item_inday(item_first_date, item_dur, exc, rpt->type,
|
if (recur_item_inday(item_first_date, item_dur, exc, rpt->type,
|
||||||
rpt->freq, rpt->until, date))
|
rpt->freq, rpt->until, date)) {
|
||||||
{
|
|
||||||
(*cb_dump) (stream, date + item_time, item_dur, item_mesg);
|
(*cb_dump) (stream, date + item_time, item_dur, item_mesg);
|
||||||
}
|
}
|
||||||
switch (rpt->type)
|
switch (rpt->type) {
|
||||||
{
|
|
||||||
case RECUR_DAILY:
|
case RECUR_DAILY:
|
||||||
date = date_sec_change(date, 0, rpt->freq);
|
date = date_sec_change(date, 0, rpt->freq);
|
||||||
break;
|
break;
|
||||||
@@ -99,8 +96,7 @@ foreach_date_dump (const long date_end, struct rpt *rpt, llist_t *exc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_header(FILE * stream)
|
||||||
pcal_export_header (FILE *stream)
|
|
||||||
{
|
{
|
||||||
fputs("# calcurse pcal export\n", stream);
|
fputs("# calcurse pcal export\n", stream);
|
||||||
fputs("\n# =======\n# options\n# =======\n", stream);
|
fputs("\n# =======\n# options\n# =======\n", stream);
|
||||||
@@ -111,8 +107,7 @@ pcal_export_header (FILE *stream)
|
|||||||
fputc('\n', stream);
|
fputc('\n', stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_footer(FILE * stream)
|
||||||
pcal_export_footer (FILE *stream)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,8 +136,7 @@ pcal_dump_apoint (FILE *stream, long apoint_date, long apoint_dur,
|
|||||||
fprintf(stream, "(%s -> %s) %s\n", pcal_beg, pcal_end, apoint_mesg);
|
fprintf(stream, "(%s -> %s) %s\n", pcal_beg, pcal_end, apoint_mesg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_recur_events(FILE * stream)
|
||||||
pcal_export_recur_events (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
char pcal_date[BUFSIZ];
|
char pcal_date[BUFSIZ];
|
||||||
@@ -152,17 +146,13 @@ pcal_export_recur_events (FILE *stream)
|
|||||||
fputs("\n# =============\n", stream);
|
fputs("\n# =============\n", stream);
|
||||||
fputs("# (pcal does not support from..until dates specification\n", stream);
|
fputs("# (pcal does not support from..until dates specification\n", stream);
|
||||||
|
|
||||||
LLIST_FOREACH (&recur_elist, i)
|
LLIST_FOREACH(&recur_elist, i) {
|
||||||
{
|
|
||||||
struct recur_event *rev = LLIST_GET_DATA(i);
|
struct recur_event *rev = LLIST_GET_DATA(i);
|
||||||
if (rev->rpt->until == 0 && rev->rpt->freq == 1)
|
if (rev->rpt->until == 0 && rev->rpt->freq == 1) {
|
||||||
{
|
switch (rev->rpt->type) {
|
||||||
switch (rev->rpt->type)
|
|
||||||
{
|
|
||||||
case RECUR_DAILY:
|
case RECUR_DAILY:
|
||||||
date_sec2date_fmt(rev->day, "%b %d", pcal_date);
|
date_sec2date_fmt(rev->day, "%b %d", pcal_date);
|
||||||
fprintf (stream, "all day on_or_after %s %s\n", pcal_date,
|
fprintf(stream, "all day on_or_after %s %s\n", pcal_date, rev->mesg);
|
||||||
rev->mesg);
|
|
||||||
break;
|
break;
|
||||||
case RECUR_WEEKLY:
|
case RECUR_WEEKLY:
|
||||||
date_sec2date_fmt(rev->day, "%a", pcal_date);
|
date_sec2date_fmt(rev->day, "%a", pcal_date);
|
||||||
@@ -181,9 +171,7 @@ pcal_export_recur_events (FILE *stream)
|
|||||||
default:
|
default:
|
||||||
EXIT(_("incoherent repetition type"));
|
EXIT(_("incoherent repetition type"));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
const long YEAR_START = calendar_start_of_year();
|
const long YEAR_START = calendar_start_of_year();
|
||||||
const long YEAR_END = calendar_end_of_year();
|
const long YEAR_END = calendar_end_of_year();
|
||||||
|
|
||||||
@@ -194,22 +182,19 @@ pcal_export_recur_events (FILE *stream)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_events(FILE * stream)
|
||||||
pcal_export_events (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
fputs("\n# ======\n# Events\n# ======\n", stream);
|
fputs("\n# ======\n# Events\n# ======\n", stream);
|
||||||
LLIST_FOREACH (&eventlist, i)
|
LLIST_FOREACH(&eventlist, i) {
|
||||||
{
|
|
||||||
struct event *ev = LLIST_TS_GET_DATA(i);
|
struct event *ev = LLIST_TS_GET_DATA(i);
|
||||||
pcal_dump_event(stream, ev->day, 0, ev->mesg);
|
pcal_dump_event(stream, ev->day, 0, ev->mesg);
|
||||||
}
|
}
|
||||||
fputc('\n', stream);
|
fputc('\n', stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_recur_apoints(FILE * stream)
|
||||||
pcal_export_recur_apoints (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
char pcal_date[BUFSIZ], pcal_beg[BUFSIZ], pcal_end[BUFSIZ];
|
char pcal_date[BUFSIZ], pcal_beg[BUFSIZ], pcal_end[BUFSIZ];
|
||||||
@@ -219,16 +204,13 @@ pcal_export_recur_apoints (FILE *stream)
|
|||||||
fputs("\n# ==============\n", stream);
|
fputs("\n# ==============\n", stream);
|
||||||
fputs("# (pcal does not support from..until dates specification\n", stream);
|
fputs("# (pcal does not support from..until dates specification\n", stream);
|
||||||
|
|
||||||
LLIST_TS_FOREACH (&recur_alist_p, i)
|
LLIST_TS_FOREACH(&recur_alist_p, i) {
|
||||||
{
|
|
||||||
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
if (rapt->rpt->until == 0 && rapt->rpt->freq == 1)
|
if (rapt->rpt->until == 0 && rapt->rpt->freq == 1) {
|
||||||
{
|
|
||||||
date_sec2date_fmt(rapt->start, "%R", pcal_beg);
|
date_sec2date_fmt(rapt->start, "%R", pcal_beg);
|
||||||
date_sec2date_fmt(rapt->start + rapt->dur, "%R", pcal_end);
|
date_sec2date_fmt(rapt->start + rapt->dur, "%R", pcal_end);
|
||||||
switch (rapt->rpt->type)
|
switch (rapt->rpt->type) {
|
||||||
{
|
|
||||||
case RECUR_DAILY:
|
case RECUR_DAILY:
|
||||||
date_sec2date_fmt(rapt->start, "%b %d", pcal_date);
|
date_sec2date_fmt(rapt->start, "%b %d", pcal_date);
|
||||||
fprintf(stream, "all day on_or_after %s (%s -> %s) %s\n",
|
fprintf(stream, "all day on_or_after %s (%s -> %s) %s\n",
|
||||||
@@ -254,9 +236,7 @@ pcal_export_recur_apoints (FILE *stream)
|
|||||||
default:
|
default:
|
||||||
EXIT(_("incoherent repetition type"));
|
EXIT(_("incoherent repetition type"));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
const long YEAR_START = calendar_start_of_year();
|
const long YEAR_START = calendar_start_of_year();
|
||||||
const long YEAR_END = calendar_end_of_year();
|
const long YEAR_END = calendar_end_of_year();
|
||||||
|
|
||||||
@@ -268,15 +248,13 @@ pcal_export_recur_apoints (FILE *stream)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_apoints(FILE * stream)
|
||||||
pcal_export_apoints (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
fputs("\n# ============\n# Appointments\n# ============\n", stream);
|
fputs("\n# ============\n# Appointments\n# ============\n", stream);
|
||||||
LLIST_TS_LOCK(&alist_p);
|
LLIST_TS_LOCK(&alist_p);
|
||||||
LLIST_TS_FOREACH (&alist_p, i)
|
LLIST_TS_FOREACH(&alist_p, i) {
|
||||||
{
|
|
||||||
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
struct apoint *apt = LLIST_TS_GET_DATA(i);
|
||||||
pcal_dump_apoint(stream, apt->start, apt->dur, apt->mesg);
|
pcal_dump_apoint(stream, apt->start, apt->dur, apt->mesg);
|
||||||
}
|
}
|
||||||
@@ -284,14 +262,12 @@ pcal_export_apoints (FILE *stream)
|
|||||||
fputc('\n', stream);
|
fputc('\n', stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void pcal_export_todo(FILE * stream)
|
||||||
pcal_export_todo (FILE *stream)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
fputs("#\n# Todos\n#\n", stream);
|
fputs("#\n# Todos\n#\n", stream);
|
||||||
LLIST_FOREACH (&todolist, i)
|
LLIST_FOREACH(&todolist, i) {
|
||||||
{
|
|
||||||
struct todo *todo = LLIST_TS_GET_DATA(i);
|
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||||
if (todo->id < 0) /* completed items */
|
if (todo->id < 0) /* completed items */
|
||||||
continue;
|
continue;
|
||||||
@@ -303,8 +279,7 @@ pcal_export_todo (FILE *stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Export calcurse data. */
|
/* Export calcurse data. */
|
||||||
void
|
void pcal_export_data(FILE * stream)
|
||||||
pcal_export_data (FILE *stream)
|
|
||||||
{
|
{
|
||||||
pcal_export_header(stream);
|
pcal_export_header(stream);
|
||||||
pcal_export_recur_events(stream);
|
pcal_export_recur_events(stream);
|
||||||
@@ -314,4 +289,3 @@ pcal_export_data (FILE *stream)
|
|||||||
pcal_export_todo(stream);
|
pcal_export_todo(stream);
|
||||||
pcal_export_footer(stream);
|
pcal_export_footer(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
347
src/recur.c
347
src/recur.c
@@ -47,27 +47,23 @@ llist_t recur_elist;
|
|||||||
static struct recur_event bkp_cut_recur_event;
|
static struct recur_event bkp_cut_recur_event;
|
||||||
static struct recur_apoint bkp_cut_recur_apoint;
|
static struct recur_apoint bkp_cut_recur_apoint;
|
||||||
|
|
||||||
static void
|
static void free_exc(struct excp *exc)
|
||||||
free_exc (struct excp *exc)
|
|
||||||
{
|
{
|
||||||
mem_free(exc);
|
mem_free(exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void free_exc_list(llist_t * exc)
|
||||||
free_exc_list (llist_t *exc)
|
|
||||||
{
|
{
|
||||||
LLIST_FREE_INNER(exc, free_exc);
|
LLIST_FREE_INNER(exc, free_exc);
|
||||||
LLIST_FREE(exc);
|
LLIST_FREE(exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int exc_cmp_day(struct excp *a, struct excp *b)
|
||||||
exc_cmp_day (struct excp *a, struct excp *b)
|
|
||||||
{
|
{
|
||||||
return a->st < b->st ? -1 : (a->st == b->st ? 0 : 1);
|
return a->st < b->st ? -1 : (a->st == b->st ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void recur_add_exc(llist_t * exc, long day)
|
||||||
recur_add_exc (llist_t *exc, long day)
|
|
||||||
{
|
{
|
||||||
struct excp *o = mem_malloc(sizeof(struct excp));
|
struct excp *o = mem_malloc(sizeof(struct excp));
|
||||||
o->st = day;
|
o->st = day;
|
||||||
@@ -75,33 +71,27 @@ recur_add_exc (llist_t *exc, long day)
|
|||||||
LLIST_ADD_SORTED(exc, o, exc_cmp_day);
|
LLIST_ADD_SORTED(exc, o, exc_cmp_day);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void exc_dup(llist_t * in, llist_t * exc)
|
||||||
exc_dup (llist_t *in, llist_t *exc)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
LLIST_INIT(in);
|
LLIST_INIT(in);
|
||||||
|
|
||||||
if (exc)
|
if (exc) {
|
||||||
{
|
LLIST_FOREACH(exc, i) {
|
||||||
LLIST_FOREACH (exc, i)
|
|
||||||
{
|
|
||||||
struct excp *p = LLIST_GET_DATA(i);
|
struct excp *p = LLIST_GET_DATA(i);
|
||||||
recur_add_exc(in, p->st);
|
recur_add_exc(in, p->st);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_event_free_bkp(void)
|
||||||
recur_event_free_bkp (void)
|
|
||||||
{
|
|
||||||
if (bkp_cut_recur_event.mesg)
|
|
||||||
{
|
{
|
||||||
|
if (bkp_cut_recur_event.mesg) {
|
||||||
mem_free(bkp_cut_recur_event.mesg);
|
mem_free(bkp_cut_recur_event.mesg);
|
||||||
bkp_cut_recur_event.mesg = 0;
|
bkp_cut_recur_event.mesg = 0;
|
||||||
}
|
}
|
||||||
if (bkp_cut_recur_event.rpt)
|
if (bkp_cut_recur_event.rpt) {
|
||||||
{
|
|
||||||
mem_free(bkp_cut_recur_event.rpt);
|
mem_free(bkp_cut_recur_event.rpt);
|
||||||
bkp_cut_recur_event.rpt = 0;
|
bkp_cut_recur_event.rpt = 0;
|
||||||
}
|
}
|
||||||
@@ -109,16 +99,13 @@ recur_event_free_bkp (void)
|
|||||||
erase_note(&bkp_cut_recur_event.note);
|
erase_note(&bkp_cut_recur_event.note);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_apoint_free_bkp(void)
|
||||||
recur_apoint_free_bkp (void)
|
|
||||||
{
|
|
||||||
if (bkp_cut_recur_apoint.mesg)
|
|
||||||
{
|
{
|
||||||
|
if (bkp_cut_recur_apoint.mesg) {
|
||||||
mem_free(bkp_cut_recur_apoint.mesg);
|
mem_free(bkp_cut_recur_apoint.mesg);
|
||||||
bkp_cut_recur_apoint.mesg = 0;
|
bkp_cut_recur_apoint.mesg = 0;
|
||||||
}
|
}
|
||||||
if (bkp_cut_recur_apoint.rpt)
|
if (bkp_cut_recur_apoint.rpt) {
|
||||||
{
|
|
||||||
mem_free(bkp_cut_recur_apoint.rpt);
|
mem_free(bkp_cut_recur_apoint.rpt);
|
||||||
bkp_cut_recur_apoint.rpt = 0;
|
bkp_cut_recur_apoint.rpt = 0;
|
||||||
}
|
}
|
||||||
@@ -126,8 +113,7 @@ recur_apoint_free_bkp (void)
|
|||||||
erase_note(&bkp_cut_recur_apoint.note);
|
erase_note(&bkp_cut_recur_apoint.note);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void recur_event_dup(struct recur_event *in, struct recur_event *bkp)
|
||||||
recur_event_dup (struct recur_event *in, struct recur_event *bkp)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(!in || !bkp, _("null pointer"));
|
EXIT_IF(!in || !bkp, _("null pointer"));
|
||||||
|
|
||||||
@@ -146,8 +132,7 @@ recur_event_dup (struct recur_event *in, struct recur_event *bkp)
|
|||||||
bkp->note = mem_strdup(in->note);
|
bkp->note = mem_strdup(in->note);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void recur_apoint_dup(struct recur_apoint *in, struct recur_apoint *bkp)
|
||||||
recur_apoint_dup (struct recur_apoint *in, struct recur_apoint *bkp)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(!in || !bkp, _("null pointer"));
|
EXIT_IF(!in || !bkp, _("null pointer"));
|
||||||
|
|
||||||
@@ -167,14 +152,12 @@ recur_apoint_dup (struct recur_apoint *in, struct recur_apoint *bkp)
|
|||||||
bkp->note = mem_strdup(in->note);
|
bkp->note = mem_strdup(in->note);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_apoint_llist_init(void)
|
||||||
recur_apoint_llist_init (void)
|
|
||||||
{
|
{
|
||||||
LLIST_TS_INIT(&recur_alist_p);
|
LLIST_TS_INIT(&recur_alist_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void recur_apoint_free(struct recur_apoint *rapt)
|
||||||
recur_apoint_free (struct recur_apoint *rapt)
|
|
||||||
{
|
{
|
||||||
mem_free(rapt->mesg);
|
mem_free(rapt->mesg);
|
||||||
if (rapt->note)
|
if (rapt->note)
|
||||||
@@ -185,8 +168,7 @@ recur_apoint_free (struct recur_apoint *rapt)
|
|||||||
mem_free(rapt);
|
mem_free(rapt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void recur_event_free(struct recur_event *rev)
|
||||||
recur_event_free (struct recur_event *rev)
|
|
||||||
{
|
{
|
||||||
mem_free(rev->mesg);
|
mem_free(rev->mesg);
|
||||||
if (rev->note)
|
if (rev->note)
|
||||||
@@ -197,15 +179,13 @@ recur_event_free (struct recur_event *rev)
|
|||||||
mem_free(rev);
|
mem_free(rev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_apoint_llist_free(void)
|
||||||
recur_apoint_llist_free (void)
|
|
||||||
{
|
{
|
||||||
LLIST_TS_FREE_INNER(&recur_alist_p, recur_apoint_free);
|
LLIST_TS_FREE_INNER(&recur_alist_p, recur_apoint_free);
|
||||||
LLIST_TS_FREE(&recur_alist_p);
|
LLIST_TS_FREE(&recur_alist_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_event_llist_free(void)
|
||||||
recur_event_llist_free (void)
|
|
||||||
{
|
{
|
||||||
LLIST_FREE_INNER(&recur_elist, recur_event_free);
|
LLIST_FREE_INNER(&recur_elist, recur_event_free);
|
||||||
LLIST_FREE(&recur_elist);
|
LLIST_FREE(&recur_elist);
|
||||||
@@ -217,16 +197,15 @@ recur_apoint_cmp_start (struct recur_apoint *a, struct recur_apoint *b)
|
|||||||
return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1);
|
return a->start < b->start ? -1 : (a->start == b->start ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int recur_event_cmp_day(struct recur_event *a, struct recur_event *b)
|
||||||
recur_event_cmp_day (struct recur_event *a, struct recur_event *b)
|
|
||||||
{
|
{
|
||||||
return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1);
|
return a->day < b->day ? -1 : (a->day == b->day ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert a new recursive appointment in the general linked list */
|
/* Insert a new recursive appointment in the general linked list */
|
||||||
struct recur_apoint *
|
struct recur_apoint *recur_apoint_new(char *mesg, char *note, long start,
|
||||||
recur_apoint_new (char *mesg, char *note, long start, long dur, char state,
|
long dur, char state, int type, int freq,
|
||||||
int type, int freq, long until, llist_t *except)
|
long until, llist_t * except)
|
||||||
{
|
{
|
||||||
struct recur_apoint *rapt = mem_malloc(sizeof(struct recur_apoint));
|
struct recur_apoint *rapt = mem_malloc(sizeof(struct recur_apoint));
|
||||||
|
|
||||||
@@ -239,12 +218,10 @@ recur_apoint_new (char *mesg, char *note, long start, long dur, char state,
|
|||||||
rapt->rpt->type = type;
|
rapt->rpt->type = type;
|
||||||
rapt->rpt->freq = freq;
|
rapt->rpt->freq = freq;
|
||||||
rapt->rpt->until = until;
|
rapt->rpt->until = until;
|
||||||
if (except)
|
if (except) {
|
||||||
{
|
|
||||||
exc_dup(&rapt->exc, except);
|
exc_dup(&rapt->exc, except);
|
||||||
free_exc_list(except);
|
free_exc_list(except);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
LLIST_INIT(&rapt->exc);
|
LLIST_INIT(&rapt->exc);
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
@@ -255,9 +232,9 @@ recur_apoint_new (char *mesg, char *note, long start, long dur, char state,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Insert a new recursive event in the general linked list */
|
/* Insert a new recursive event in the general linked list */
|
||||||
struct recur_event *
|
struct recur_event *recur_event_new(char *mesg, char *note, long day, int id,
|
||||||
recur_event_new (char *mesg, char *note, long day, int id, int type, int freq,
|
int type, int freq, long until,
|
||||||
long until, llist_t *except)
|
llist_t * except)
|
||||||
{
|
{
|
||||||
struct recur_event *rev = mem_malloc(sizeof(struct recur_event));
|
struct recur_event *rev = mem_malloc(sizeof(struct recur_event));
|
||||||
|
|
||||||
@@ -269,12 +246,10 @@ recur_event_new (char *mesg, char *note, long day, int id, int type, int freq,
|
|||||||
rev->rpt->type = type;
|
rev->rpt->type = type;
|
||||||
rev->rpt->freq = freq;
|
rev->rpt->freq = freq;
|
||||||
rev->rpt->until = until;
|
rev->rpt->until = until;
|
||||||
if (except)
|
if (except) {
|
||||||
{
|
|
||||||
exc_dup(&rev->exc, except);
|
exc_dup(&rev->exc, except);
|
||||||
free_exc_list(except);
|
free_exc_list(except);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
LLIST_INIT(&rev->exc);
|
LLIST_INIT(&rev->exc);
|
||||||
|
|
||||||
LLIST_ADD_SORTED(&recur_elist, rev, recur_event_cmp_day);
|
LLIST_ADD_SORTED(&recur_elist, rev, recur_event_cmp_day);
|
||||||
@@ -286,13 +261,11 @@ recur_event_new (char *mesg, char *note, long day, int id, int type, int freq,
|
|||||||
* Correspondance between the defines on recursive type,
|
* Correspondance between the defines on recursive type,
|
||||||
* and the letter to be written in file.
|
* and the letter to be written in file.
|
||||||
*/
|
*/
|
||||||
char
|
char recur_def2char(enum recur_type define)
|
||||||
recur_def2char (enum recur_type define)
|
|
||||||
{
|
{
|
||||||
char recur_char;
|
char recur_char;
|
||||||
|
|
||||||
switch (define)
|
switch (define) {
|
||||||
{
|
|
||||||
case RECUR_DAILY:
|
case RECUR_DAILY:
|
||||||
recur_char = 'D';
|
recur_char = 'D';
|
||||||
break;
|
break;
|
||||||
@@ -317,13 +290,11 @@ recur_def2char (enum recur_type define)
|
|||||||
* Correspondance between the letters written in file and the defines
|
* Correspondance between the letters written in file and the defines
|
||||||
* concerning the recursive type.
|
* concerning the recursive type.
|
||||||
*/
|
*/
|
||||||
int
|
int recur_char2def(char type)
|
||||||
recur_char2def (char type)
|
|
||||||
{
|
{
|
||||||
int recur_def;
|
int recur_def;
|
||||||
|
|
||||||
switch (type)
|
switch (type) {
|
||||||
{
|
|
||||||
case 'D':
|
case 'D':
|
||||||
recur_def = RECUR_DAILY;
|
recur_def = RECUR_DAILY;
|
||||||
break;
|
break;
|
||||||
@@ -344,16 +315,14 @@ recur_char2def (char type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Write days for which recurrent items should not be repeated. */
|
/* Write days for which recurrent items should not be repeated. */
|
||||||
static void
|
static void recur_write_exc(llist_t * lexc, FILE * f)
|
||||||
recur_write_exc (llist_t *lexc, FILE *f)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
int st_mon, st_day, st_year;
|
int st_mon, st_day, st_year;
|
||||||
|
|
||||||
LLIST_FOREACH (lexc, i)
|
LLIST_FOREACH(lexc, i) {
|
||||||
{
|
|
||||||
struct excp *exc = LLIST_GET_DATA(i);
|
struct excp *exc = LLIST_GET_DATA(i);
|
||||||
t = exc->st;
|
t = exc->st;
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
@@ -365,10 +334,9 @@ recur_write_exc (llist_t *lexc, FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load the recursive appointment description */
|
/* Load the recursive appointment description */
|
||||||
struct recur_apoint *
|
struct recur_apoint *recur_apoint_scan(FILE * f, struct tm start, struct tm end,
|
||||||
recur_apoint_scan (FILE *f, struct tm start, struct tm end, char type,
|
char type, int freq, struct tm until,
|
||||||
int freq, struct tm until, char *note, llist_t *exc,
|
char *note, llist_t * exc, char state)
|
||||||
char state)
|
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ], *nl;
|
char buf[BUFSIZ], *nl;
|
||||||
time_t tstart, tend, tuntil;
|
time_t tstart, tend, tuntil;
|
||||||
@@ -378,8 +346,7 @@ recur_apoint_scan (FILE *f, struct tm start, struct tm end, char type,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
nl = strchr(buf, '\n');
|
nl = strchr(buf, '\n');
|
||||||
if (nl)
|
if (nl) {
|
||||||
{
|
|
||||||
*nl = '\0';
|
*nl = '\0';
|
||||||
}
|
}
|
||||||
start.tm_sec = end.tm_sec = 0;
|
start.tm_sec = end.tm_sec = 0;
|
||||||
@@ -391,8 +358,7 @@ recur_apoint_scan (FILE *f, struct tm start, struct tm end, char type,
|
|||||||
tstart = mktime(&start);
|
tstart = mktime(&start);
|
||||||
tend = mktime(&end);
|
tend = mktime(&end);
|
||||||
|
|
||||||
if (until.tm_year != 0)
|
if (until.tm_year != 0) {
|
||||||
{
|
|
||||||
until.tm_hour = 23;
|
until.tm_hour = 23;
|
||||||
until.tm_min = 59;
|
until.tm_min = 59;
|
||||||
until.tm_sec = 0;
|
until.tm_sec = 0;
|
||||||
@@ -400,9 +366,7 @@ recur_apoint_scan (FILE *f, struct tm start, struct tm end, char type,
|
|||||||
until.tm_year -= 1900;
|
until.tm_year -= 1900;
|
||||||
until.tm_mon--;
|
until.tm_mon--;
|
||||||
tuntil = mktime(&until);
|
tuntil = mktime(&until);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
tuntil = 0;
|
tuntil = 0;
|
||||||
}
|
}
|
||||||
EXIT_IF(tstart == -1 || tend == -1 || tstart > tend || tuntil == -1,
|
EXIT_IF(tstart == -1 || tend == -1 || tstart > tend || tuntil == -1,
|
||||||
@@ -413,9 +377,9 @@ recur_apoint_scan (FILE *f, struct tm start, struct tm end, char type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load the recursive events from file */
|
/* Load the recursive events from file */
|
||||||
struct recur_event *
|
struct recur_event *recur_event_scan(FILE * f, struct tm start, int id,
|
||||||
recur_event_scan (FILE *f, struct tm start, int id, char type, int freq,
|
char type, int freq, struct tm until,
|
||||||
struct tm until, char *note, llist_t *exc)
|
char *note, llist_t * exc)
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ], *nl;
|
char buf[BUFSIZ], *nl;
|
||||||
time_t tstart, tuntil;
|
time_t tstart, tuntil;
|
||||||
@@ -425,8 +389,7 @@ recur_event_scan (FILE *f, struct tm start, int id, char type, int freq,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
nl = strchr(buf, '\n');
|
nl = strchr(buf, '\n');
|
||||||
if (nl)
|
if (nl) {
|
||||||
{
|
|
||||||
*nl = '\0';
|
*nl = '\0';
|
||||||
}
|
}
|
||||||
start.tm_hour = until.tm_hour = 0;
|
start.tm_hour = until.tm_hour = 0;
|
||||||
@@ -435,27 +398,22 @@ recur_event_scan (FILE *f, struct tm start, int id, char type, int freq,
|
|||||||
start.tm_isdst = until.tm_isdst = -1;
|
start.tm_isdst = until.tm_isdst = -1;
|
||||||
start.tm_year -= 1900;
|
start.tm_year -= 1900;
|
||||||
start.tm_mon--;
|
start.tm_mon--;
|
||||||
if (until.tm_year != 0)
|
if (until.tm_year != 0) {
|
||||||
{
|
|
||||||
until.tm_year -= 1900;
|
until.tm_year -= 1900;
|
||||||
until.tm_mon--;
|
until.tm_mon--;
|
||||||
tuntil = mktime(&until);
|
tuntil = mktime(&until);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
tuntil = 0;
|
tuntil = 0;
|
||||||
}
|
}
|
||||||
tstart = mktime(&start);
|
tstart = mktime(&start);
|
||||||
EXIT_IF (tstart == -1 || tuntil == -1,
|
EXIT_IF(tstart == -1 || tuntil == -1, _("date error in event"));
|
||||||
_("date error in event"));
|
|
||||||
|
|
||||||
return recur_event_new(buf, note, tstart, id, recur_char2def(type), freq,
|
return recur_event_new(buf, note, tstart, id, recur_char2def(type), freq,
|
||||||
tuntil, exc);
|
tuntil, exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Writting of a recursive appointment into file. */
|
/* Writting of a recursive appointment into file. */
|
||||||
void
|
void recur_apoint_write(struct recur_apoint *o, FILE * f)
|
||||||
recur_apoint_write (struct recur_apoint *o, FILE *f)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -471,12 +429,9 @@ recur_apoint_write (struct recur_apoint *o, FILE *f)
|
|||||||
1900 + lt->tm_year, lt->tm_hour, lt->tm_min);
|
1900 + lt->tm_year, lt->tm_hour, lt->tm_min);
|
||||||
|
|
||||||
t = o->rpt->until;
|
t = o->rpt->until;
|
||||||
if (t == 0)
|
if (t == 0) { /* We have an endless recurrent appointment. */
|
||||||
{ /* We have an endless recurrent appointment. */
|
|
||||||
fprintf(f, " {%d%c", o->rpt->freq, recur_def2char(o->rpt->type));
|
fprintf(f, " {%d%c", o->rpt->freq, recur_def2char(o->rpt->type));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
fprintf(f, " {%d%c -> %02u/%02u/%04u", o->rpt->freq,
|
fprintf(f, " {%d%c -> %02u/%02u/%04u", o->rpt->freq,
|
||||||
recur_def2char(o->rpt->type), lt->tm_mon + 1, lt->tm_mday,
|
recur_def2char(o->rpt->type), lt->tm_mon + 1, lt->tm_mday,
|
||||||
@@ -494,8 +449,7 @@ recur_apoint_write (struct recur_apoint *o, FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Writting of a recursive event into file. */
|
/* Writting of a recursive event into file. */
|
||||||
void
|
void recur_event_write(struct recur_event *o, FILE * f)
|
||||||
recur_event_write (struct recur_event *o, FILE *f)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -508,13 +462,10 @@ recur_event_write (struct recur_event *o, FILE *f)
|
|||||||
st_day = lt->tm_mday;
|
st_day = lt->tm_mday;
|
||||||
st_year = lt->tm_year + 1900;
|
st_year = lt->tm_year + 1900;
|
||||||
t = o->rpt->until;
|
t = o->rpt->until;
|
||||||
if (t == 0)
|
if (t == 0) { /* We have an endless recurrent event. */
|
||||||
{ /* We have an endless recurrent event. */
|
|
||||||
fprintf(f, "%02u/%02u/%04u [%d] {%d%c", st_mon, st_day, st_year, o->id,
|
fprintf(f, "%02u/%02u/%04u [%d] {%d%c", st_mon, st_day, st_year, o->id,
|
||||||
o->rpt->freq, recur_def2char(o->rpt->type));
|
o->rpt->freq, recur_def2char(o->rpt->type));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
end_mon = lt->tm_mon + 1;
|
end_mon = lt->tm_mon + 1;
|
||||||
end_day = lt->tm_mday;
|
end_day = lt->tm_mday;
|
||||||
@@ -531,27 +482,23 @@ recur_event_write (struct recur_event *o, FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Write recursive items to file. */
|
/* Write recursive items to file. */
|
||||||
void
|
void recur_save_data(FILE * f)
|
||||||
recur_save_data (FILE *f)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
LLIST_FOREACH (&recur_elist, i)
|
LLIST_FOREACH(&recur_elist, i) {
|
||||||
{
|
|
||||||
struct recur_event *rev = LLIST_GET_DATA(i);
|
struct recur_event *rev = LLIST_GET_DATA(i);
|
||||||
recur_event_write(rev, f);
|
recur_event_write(rev, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
LLIST_TS_FOREACH (&recur_alist_p, i)
|
LLIST_TS_FOREACH(&recur_alist_p, i) {
|
||||||
{
|
|
||||||
struct recur_apoint *rapt = LLIST_GET_DATA(i);
|
struct recur_apoint *rapt = LLIST_GET_DATA(i);
|
||||||
recur_apoint_write(rapt, f);
|
recur_apoint_write(rapt, f);
|
||||||
}
|
}
|
||||||
LLIST_TS_UNLOCK(&recur_alist_p);
|
LLIST_TS_UNLOCK(&recur_alist_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The two following defines together with the diff_days, diff_months and
|
* The two following defines together with the diff_days, diff_months and
|
||||||
* diff_years functions were provided by Lukas Fleischer to correct the wrong
|
* diff_years functions were provided by Lukas Fleischer to correct the wrong
|
||||||
@@ -564,10 +511,8 @@ recur_save_data (FILE *f)
|
|||||||
#define LEAPCOUNT(start, end) \
|
#define LEAPCOUNT(start, end) \
|
||||||
(BC(start, end, 4) - BC(start, end, 100) + BC(start, end, 400))
|
(BC(start, end, 4) - BC(start, end, 100) + BC(start, end, 400))
|
||||||
|
|
||||||
|
|
||||||
/* Calculate the difference in days between two dates. */
|
/* Calculate the difference in days between two dates. */
|
||||||
static long
|
static long diff_days(struct tm lt_start, struct tm lt_end)
|
||||||
diff_days (struct tm lt_start, struct tm lt_end)
|
|
||||||
{
|
{
|
||||||
long diff;
|
long diff;
|
||||||
|
|
||||||
@@ -576,8 +521,7 @@ diff_days (struct tm lt_start, struct tm lt_end)
|
|||||||
|
|
||||||
diff = lt_end.tm_yday - lt_start.tm_yday;
|
diff = lt_end.tm_yday - lt_start.tm_yday;
|
||||||
|
|
||||||
if (lt_end.tm_year > lt_start.tm_year)
|
if (lt_end.tm_year > lt_start.tm_year) {
|
||||||
{
|
|
||||||
diff += (lt_end.tm_year - lt_start.tm_year) * YEARINDAYS;
|
diff += (lt_end.tm_year - lt_start.tm_year) * YEARINDAYS;
|
||||||
diff += LEAPCOUNT(lt_start.tm_year + TM_YEAR_BASE,
|
diff += LEAPCOUNT(lt_start.tm_year + TM_YEAR_BASE,
|
||||||
lt_end.tm_year + TM_YEAR_BASE - 1);
|
lt_end.tm_year + TM_YEAR_BASE - 1);
|
||||||
@@ -587,8 +531,7 @@ diff_days (struct tm lt_start, struct tm lt_end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate the difference in months between two dates. */
|
/* Calculate the difference in months between two dates. */
|
||||||
static long
|
static long diff_months(struct tm lt_start, struct tm lt_end)
|
||||||
diff_months (struct tm lt_start, struct tm lt_end)
|
|
||||||
{
|
{
|
||||||
long diff;
|
long diff;
|
||||||
|
|
||||||
@@ -602,14 +545,12 @@ diff_months (struct tm lt_start, struct tm lt_end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate the difference in years between two dates. */
|
/* Calculate the difference in years between two dates. */
|
||||||
static long
|
static long diff_years(struct tm lt_start, struct tm lt_end)
|
||||||
diff_years (struct tm lt_start, struct tm lt_end)
|
|
||||||
{
|
{
|
||||||
return lt_end.tm_year - lt_start.tm_year;
|
return lt_end.tm_year - lt_start.tm_year;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int exc_inday(struct excp *exc, long day_start)
|
||||||
exc_inday (struct excp *exc, long day_start)
|
|
||||||
{
|
{
|
||||||
return (exc->st >= day_start && exc->st < day_start + DAYINSEC);
|
return (exc->st >= day_start && exc->st < day_start + DAYINSEC);
|
||||||
}
|
}
|
||||||
@@ -650,8 +591,7 @@ recur_item_find_occurrence (long item_start, long item_dur, llist_t *item_exc,
|
|||||||
|
|
||||||
span = (item_start - mktime(<_item_day) + item_dur - 1) / DAYINSEC;
|
span = (item_start - mktime(<_item_day) + item_dur - 1) / DAYINSEC;
|
||||||
|
|
||||||
switch (rpt_type)
|
switch (rpt_type) {
|
||||||
{
|
|
||||||
case RECUR_DAILY:
|
case RECUR_DAILY:
|
||||||
diff = diff_days(lt_item_day, lt_day) % rpt_freq;
|
diff = diff_days(lt_item_day, lt_day) % rpt_freq;
|
||||||
lt_item_day.tm_mday = lt_day.tm_mday - diff;
|
lt_item_day.tm_mday = lt_day.tm_mday - diff;
|
||||||
@@ -695,10 +635,8 @@ recur_item_find_occurrence (long item_start, long item_dur, llist_t *item_exc,
|
|||||||
lt_item_day = *localtime(&t);
|
lt_item_day = *localtime(&t);
|
||||||
diff = diff_days(lt_item_day, lt_day);
|
diff = diff_days(lt_item_day, lt_day);
|
||||||
|
|
||||||
if (diff <= span)
|
if (diff <= span) {
|
||||||
{
|
if (occurrence) {
|
||||||
if (occurrence)
|
|
||||||
{
|
|
||||||
start_date.dd = lt_item_day.tm_mday;
|
start_date.dd = lt_item_day.tm_mday;
|
||||||
start_date.mm = lt_item_day.tm_mon + 1;
|
start_date.mm = lt_item_day.tm_mon + 1;
|
||||||
start_date.yyyy = lt_item_day.tm_year + 1900;
|
start_date.yyyy = lt_item_day.tm_year + 1900;
|
||||||
@@ -707,8 +645,7 @@ recur_item_find_occurrence (long item_start, long item_dur, llist_t *item_exc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -741,15 +678,13 @@ recur_item_inday (long item_start, long item_dur, llist_t *item_exc,
|
|||||||
rpt_freq, rpt_until, day_start, NULL);
|
rpt_freq, rpt_until, day_start, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned recur_apoint_inday(struct recur_apoint *rapt, long day_start)
|
||||||
recur_apoint_inday(struct recur_apoint *rapt, long day_start)
|
|
||||||
{
|
{
|
||||||
return recur_item_inday(rapt->start, rapt->dur, &rapt->exc, rapt->rpt->type,
|
return recur_item_inday(rapt->start, rapt->dur, &rapt->exc, rapt->rpt->type,
|
||||||
rapt->rpt->freq, rapt->rpt->until, day_start);
|
rapt->rpt->freq, rapt->rpt->until, day_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned recur_event_inday(struct recur_event *rev, long day_start)
|
||||||
recur_event_inday(struct recur_event *rev, long day_start)
|
|
||||||
{
|
{
|
||||||
return recur_item_inday(rev->day, DAYINSEC, &rev->exc, rev->rpt->type,
|
return recur_item_inday(rev->day, DAYINSEC, &rev->exc, rev->rpt->type,
|
||||||
rev->rpt->freq, rev->rpt->until, day_start);
|
rev->rpt->freq, rev->rpt->until, day_start);
|
||||||
@@ -771,10 +706,8 @@ recur_event_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
EXIT(_("event not found"));
|
EXIT(_("event not found"));
|
||||||
struct recur_event *rev = LLIST_GET_DATA(i);
|
struct recur_event *rev = LLIST_GET_DATA(i);
|
||||||
|
|
||||||
if (delete_whole)
|
if (delete_whole) {
|
||||||
{
|
switch (flag) {
|
||||||
switch (flag)
|
|
||||||
{
|
|
||||||
case ERASE_FORCE_ONLY_NOTE:
|
case ERASE_FORCE_ONLY_NOTE:
|
||||||
erase_note(&rev->note);
|
erase_note(&rev->note);
|
||||||
break;
|
break;
|
||||||
@@ -786,8 +719,7 @@ recur_event_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
default:
|
default:
|
||||||
LLIST_REMOVE(&recur_elist, i);
|
LLIST_REMOVE(&recur_elist, i);
|
||||||
mem_free(rev->mesg);
|
mem_free(rev->mesg);
|
||||||
if (rev->rpt)
|
if (rev->rpt) {
|
||||||
{
|
|
||||||
mem_free(rev->rpt);
|
mem_free(rev->rpt);
|
||||||
rev->rpt = 0;
|
rev->rpt = 0;
|
||||||
}
|
}
|
||||||
@@ -795,8 +727,7 @@ recur_event_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
mem_free(rev);
|
mem_free(rev);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
recur_add_exc(&rev->exc, start);
|
recur_add_exc(&rev->exc, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -820,10 +751,8 @@ recur_apoint_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
if (notify_bar() && flag != ERASE_FORCE_ONLY_NOTE)
|
if (notify_bar() && flag != ERASE_FORCE_ONLY_NOTE)
|
||||||
need_check_notify = notify_same_recur_item(rapt);
|
need_check_notify = notify_same_recur_item(rapt);
|
||||||
if (delete_whole)
|
if (delete_whole) {
|
||||||
{
|
switch (flag) {
|
||||||
switch (flag)
|
|
||||||
{
|
|
||||||
case ERASE_FORCE_ONLY_NOTE:
|
case ERASE_FORCE_ONLY_NOTE:
|
||||||
erase_note(&rapt->note);
|
erase_note(&rapt->note);
|
||||||
break;
|
break;
|
||||||
@@ -835,8 +764,7 @@ recur_apoint_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
default:
|
default:
|
||||||
LLIST_TS_REMOVE(&recur_alist_p, i);
|
LLIST_TS_REMOVE(&recur_alist_p, i);
|
||||||
mem_free(rapt->mesg);
|
mem_free(rapt->mesg);
|
||||||
if (rapt->rpt)
|
if (rapt->rpt) {
|
||||||
{
|
|
||||||
mem_free(rapt->rpt);
|
mem_free(rapt->rpt);
|
||||||
rapt->rpt = 0;
|
rapt->rpt = 0;
|
||||||
}
|
}
|
||||||
@@ -846,9 +774,7 @@ recur_apoint_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
notify_check_next_app(0);
|
notify_check_next_app(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
recur_add_exc(&rapt->exc, start);
|
recur_add_exc(&rapt->exc, start);
|
||||||
if (need_check_notify)
|
if (need_check_notify)
|
||||||
notify_check_next_app(0);
|
notify_check_next_app(0);
|
||||||
@@ -863,8 +789,7 @@ recur_apoint_erase (long start, unsigned num, unsigned delete_whole,
|
|||||||
* o repetition end date
|
* o repetition end date
|
||||||
* and then delete the selected item to recreate it as a recurrent one
|
* and then delete the selected item to recreate it as a recurrent one
|
||||||
*/
|
*/
|
||||||
void
|
void recur_repeat_item(void)
|
||||||
recur_repeat_item (void)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -894,10 +819,7 @@ recur_repeat_item (void)
|
|||||||
char msg_asktype[BUFSIZ];
|
char msg_asktype[BUFSIZ];
|
||||||
snprintf(msg_asktype, BUFSIZ, "%s %s, %s, %s, %s",
|
snprintf(msg_asktype, BUFSIZ, "%s %s, %s, %s, %s",
|
||||||
msg_rpt_prefix,
|
msg_rpt_prefix,
|
||||||
msg_rpt_daily,
|
msg_rpt_daily, msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly);
|
||||||
msg_rpt_weekly,
|
|
||||||
msg_rpt_monthly,
|
|
||||||
msg_rpt_yearly);
|
|
||||||
|
|
||||||
int type = 0, freq = 0;
|
int type = 0, freq = 0;
|
||||||
int item_nb;
|
int item_nb;
|
||||||
@@ -907,15 +829,13 @@ recur_repeat_item (void)
|
|||||||
|
|
||||||
item_nb = apoint_hilt();
|
item_nb = apoint_hilt();
|
||||||
p = day_get_item(item_nb);
|
p = day_get_item(item_nb);
|
||||||
if (p->type != APPT && p->type != EVNT)
|
if (p->type != APPT && p->type != EVNT) {
|
||||||
{
|
|
||||||
status_mesg(wrong_type_1, wrong_type_2);
|
status_mesg(wrong_type_1, wrong_type_2);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (status_ask_choice (msg_asktype, msg_type_choice, 4))
|
switch (status_ask_choice(msg_asktype, msg_type_choice, 4)) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
type = RECUR_DAILY;
|
type = RECUR_DAILY;
|
||||||
break;
|
break;
|
||||||
@@ -932,59 +852,43 @@ recur_repeat_item (void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (freq == 0)
|
while (freq == 0) {
|
||||||
{
|
|
||||||
status_mesg(mesg_freq_1, "");
|
status_mesg(mesg_freq_1, "");
|
||||||
if (getstring (win[STA].p, user_input, BUFSIZ, 0, 1) == GETSTRING_VALID)
|
if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
|
||||||
freq = atoi(user_input);
|
freq = atoi(user_input);
|
||||||
if (freq == 0)
|
if (freq == 0) {
|
||||||
{
|
|
||||||
status_mesg(mesg_wrong_freq, wrong_type_2);
|
status_mesg(mesg_wrong_freq, wrong_type_2);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
user_input[0] = '\0';
|
user_input[0] = '\0';
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!date_entered)
|
while (!date_entered) {
|
||||||
{
|
snprintf(outstr, BUFSIZ, mesg_until_1, DATEFMT_DESC(conf.input_datefmt));
|
||||||
snprintf (outstr, BUFSIZ, mesg_until_1,
|
|
||||||
DATEFMT_DESC (conf.input_datefmt));
|
|
||||||
status_mesg(_(outstr), "");
|
status_mesg(_(outstr), "");
|
||||||
if (getstring (win[STA].p, user_input, BUFSIZ, 0, 1) == GETSTRING_VALID)
|
if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
if (strlen(user_input) == 1 && strcmp(user_input, "0") == 0) {
|
||||||
if (strlen (user_input) == 1 && strcmp (user_input, "0") == 0)
|
|
||||||
{
|
|
||||||
until = 0;
|
until = 0;
|
||||||
date_entered = 1;
|
date_entered = 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (parse_date(user_input, conf.input_datefmt,
|
if (parse_date(user_input, conf.input_datefmt,
|
||||||
&year, &month, &day, calendar_get_slctd_day ()))
|
&year, &month, &day, calendar_get_slctd_day())) {
|
||||||
{
|
|
||||||
t = p->start;
|
t = p->start;
|
||||||
lt = localtime(&t);
|
lt = localtime(&t);
|
||||||
until_date.dd = day;
|
until_date.dd = day;
|
||||||
until_date.mm = month;
|
until_date.mm = month;
|
||||||
until_date.yyyy = year;
|
until_date.yyyy = year;
|
||||||
until = date2sec(until_date, lt->tm_hour, lt->tm_min);
|
until = date2sec(until_date, lt->tm_hour, lt->tm_min);
|
||||||
if (until < p->start)
|
if (until < p->start) {
|
||||||
{
|
|
||||||
status_mesg(mesg_older, wrong_type_2);
|
status_mesg(mesg_older, wrong_type_2);
|
||||||
wgetch(win[STA].p);
|
wgetch(win[STA].p);
|
||||||
date_entered = 0;
|
date_entered = 0;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
date_entered = 1;
|
date_entered = 1;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
snprintf(outstr, BUFSIZ, mesg_wrong_2,
|
snprintf(outstr, BUFSIZ, mesg_wrong_2,
|
||||||
DATEFMT_DESC(conf.input_datefmt));
|
DATEFMT_DESC(conf.input_datefmt));
|
||||||
status_mesg(mesg_wrong_1, _(outstr));
|
status_mesg(mesg_wrong_1, _(outstr));
|
||||||
@@ -992,26 +896,20 @@ recur_repeat_item (void)
|
|||||||
date_entered = 0;
|
date_entered = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
date = calendar_get_slctd_day_sec();
|
date = calendar_get_slctd_day_sec();
|
||||||
if (p->type == EVNT)
|
if (p->type == EVNT) {
|
||||||
{
|
|
||||||
recur_event_new(p->mesg, p->note, p->start, p->evnt_id, type, freq,
|
recur_event_new(p->mesg, p->note, p->start, p->evnt_id, type, freq,
|
||||||
until, NULL);
|
until, NULL);
|
||||||
}
|
} else if (p->type == APPT) {
|
||||||
else if (p->type == APPT)
|
|
||||||
{
|
|
||||||
ra = recur_apoint_new(p->mesg, p->note, p->start, p->appt_dur,
|
ra = recur_apoint_new(p->mesg, p->note, p->start, p->appt_dur,
|
||||||
p->state, type, freq, until, NULL);
|
p->state, type, freq, until, NULL);
|
||||||
if (notify_bar())
|
if (notify_bar())
|
||||||
notify_check_repeated(ra);
|
notify_check_repeated(ra);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
EXIT(_("wrong item type"));
|
EXIT(_("wrong item type"));
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
@@ -1022,19 +920,16 @@ recur_repeat_item (void)
|
|||||||
* Read days for which recurrent items must not be repeated
|
* Read days for which recurrent items must not be repeated
|
||||||
* (such days are called exceptions).
|
* (such days are called exceptions).
|
||||||
*/
|
*/
|
||||||
void
|
void recur_exc_scan(llist_t * lexc, FILE * data_file)
|
||||||
recur_exc_scan (llist_t *lexc, FILE *data_file)
|
|
||||||
{
|
{
|
||||||
int c = 0;
|
int c = 0;
|
||||||
struct tm day;
|
struct tm day;
|
||||||
|
|
||||||
LLIST_INIT(lexc);
|
LLIST_INIT(lexc);
|
||||||
while ((c = getc (data_file)) == '!')
|
while ((c = getc(data_file)) == '!') {
|
||||||
{
|
|
||||||
ungetc(c, data_file);
|
ungetc(c, data_file);
|
||||||
if (fscanf(data_file, "!%d / %d / %d ",
|
if (fscanf(data_file, "!%d / %d / %d ",
|
||||||
&day.tm_mon, &day.tm_mday, &day.tm_year) != 3)
|
&day.tm_mon, &day.tm_mday, &day.tm_year) != 3) {
|
||||||
{
|
|
||||||
EXIT(_("syntax error in item date"));
|
EXIT(_("syntax error in item date"));
|
||||||
}
|
}
|
||||||
day.tm_hour = 0;
|
day.tm_hour = 0;
|
||||||
@@ -1048,8 +943,7 @@ recur_exc_scan (llist_t *lexc, FILE *data_file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int recur_apoint_starts_before(struct recur_apoint *rapt, long time)
|
||||||
recur_apoint_starts_before (struct recur_apoint *rapt, long time)
|
|
||||||
{
|
{
|
||||||
return rapt->start < time;
|
return rapt->start < time;
|
||||||
}
|
}
|
||||||
@@ -1058,20 +952,19 @@ recur_apoint_starts_before (struct recur_apoint *rapt, long time)
|
|||||||
* Look in the appointment list if we have an item which starts before the item
|
* 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).
|
* stored in the notify_app structure (which is the next item to be notified).
|
||||||
*/
|
*/
|
||||||
struct notify_app *
|
struct notify_app *recur_apoint_check_next(struct notify_app *app, long start,
|
||||||
recur_apoint_check_next (struct notify_app *app, long start, long day)
|
long day)
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
unsigned real_recur_start_time;
|
unsigned real_recur_start_time;
|
||||||
|
|
||||||
LLIST_TS_LOCK(&recur_alist_p);
|
LLIST_TS_LOCK(&recur_alist_p);
|
||||||
LLIST_TS_FIND_FOREACH (&recur_alist_p, app->time, recur_apoint_starts_before, i)
|
LLIST_TS_FIND_FOREACH(&recur_alist_p, app->time, recur_apoint_starts_before,
|
||||||
{
|
i) {
|
||||||
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
|
||||||
|
|
||||||
if (recur_apoint_find_occurrence(rapt, day, &real_recur_start_time) &&
|
if (recur_apoint_find_occurrence(rapt, day, &real_recur_start_time) &&
|
||||||
real_recur_start_time > start)
|
real_recur_start_time > start) {
|
||||||
{
|
|
||||||
app->time = real_recur_start_time;
|
app->time = real_recur_start_time;
|
||||||
app->txt = mem_strdup(rapt->mesg);
|
app->txt = mem_strdup(rapt->mesg);
|
||||||
app->state = rapt->state;
|
app->state = rapt->state;
|
||||||
@@ -1084,8 +977,7 @@ recur_apoint_check_next (struct notify_app *app, long start, long day)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a structure containing the selected recurrent appointment. */
|
/* Returns a structure containing the selected recurrent appointment. */
|
||||||
struct recur_apoint *
|
struct recur_apoint *recur_get_apoint(long date, int num)
|
||||||
recur_get_apoint (long date, int num)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i = LLIST_TS_FIND_NTH(&recur_alist_p, num, date,
|
llist_item_t *i = LLIST_TS_FIND_NTH(&recur_alist_p, num, date,
|
||||||
recur_apoint_inday);
|
recur_apoint_inday);
|
||||||
@@ -1098,8 +990,7 @@ recur_get_apoint (long date, int num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a structure containing the selected recurrent event. */
|
/* Returns a structure containing the selected recurrent event. */
|
||||||
struct recur_event *
|
struct recur_event *recur_get_event(long date, int num)
|
||||||
recur_get_event (long date, int num)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i = LLIST_FIND_NTH(&recur_elist, num, date,
|
llist_item_t *i = LLIST_FIND_NTH(&recur_elist, num, date,
|
||||||
recur_event_inday);
|
recur_event_inday);
|
||||||
@@ -1112,8 +1003,7 @@ recur_get_event (long date, int num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Switch recurrent item notification state. */
|
/* Switch recurrent item notification state. */
|
||||||
void
|
void recur_apoint_switch_notify(long date, int recur_nb)
|
||||||
recur_apoint_switch_notify (long date, int recur_nb)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
@@ -1132,8 +1022,7 @@ recur_apoint_switch_notify (long date, int recur_nb)
|
|||||||
LLIST_TS_UNLOCK(&recur_alist_p);
|
LLIST_TS_UNLOCK(&recur_alist_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_event_paste_item(void)
|
||||||
recur_event_paste_item (void)
|
|
||||||
{
|
{
|
||||||
long new_start, time_shift;
|
long new_start, time_shift;
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
@@ -1144,8 +1033,7 @@ recur_event_paste_item (void)
|
|||||||
bkp_cut_recur_event.day += time_shift;
|
bkp_cut_recur_event.day += time_shift;
|
||||||
if (bkp_cut_recur_event.rpt->until != 0)
|
if (bkp_cut_recur_event.rpt->until != 0)
|
||||||
bkp_cut_recur_event.rpt->until += time_shift;
|
bkp_cut_recur_event.rpt->until += time_shift;
|
||||||
LLIST_FOREACH (&bkp_cut_recur_event.exc, i)
|
LLIST_FOREACH(&bkp_cut_recur_event.exc, i) {
|
||||||
{
|
|
||||||
struct excp *exc = LLIST_GET_DATA(i);
|
struct excp *exc = LLIST_GET_DATA(i);
|
||||||
exc->st += time_shift;
|
exc->st += time_shift;
|
||||||
}
|
}
|
||||||
@@ -1158,8 +1046,7 @@ recur_event_paste_item (void)
|
|||||||
recur_event_free_bkp();
|
recur_event_free_bkp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void recur_apoint_paste_item(void)
|
||||||
recur_apoint_paste_item (void)
|
|
||||||
{
|
{
|
||||||
long new_start, time_shift;
|
long new_start, time_shift;
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
@@ -1172,8 +1059,7 @@ recur_apoint_paste_item (void)
|
|||||||
bkp_cut_recur_apoint.start += time_shift;
|
bkp_cut_recur_apoint.start += time_shift;
|
||||||
if (bkp_cut_recur_apoint.rpt->until != 0)
|
if (bkp_cut_recur_apoint.rpt->until != 0)
|
||||||
bkp_cut_recur_apoint.rpt->until += time_shift;
|
bkp_cut_recur_apoint.rpt->until += time_shift;
|
||||||
LLIST_FOREACH (&bkp_cut_recur_event.exc, i)
|
LLIST_FOREACH(&bkp_cut_recur_event.exc, i) {
|
||||||
{
|
|
||||||
struct excp *exc = LLIST_GET_DATA(i);
|
struct excp *exc = LLIST_GET_DATA(i);
|
||||||
exc->st += time_shift;
|
exc->st += time_shift;
|
||||||
}
|
}
|
||||||
@@ -1182,8 +1068,7 @@ recur_apoint_paste_item (void)
|
|||||||
bkp_cut_recur_apoint.start, bkp_cut_recur_apoint.dur,
|
bkp_cut_recur_apoint.start, bkp_cut_recur_apoint.dur,
|
||||||
bkp_cut_recur_apoint.state, bkp_cut_recur_apoint.rpt->type,
|
bkp_cut_recur_apoint.state, bkp_cut_recur_apoint.rpt->type,
|
||||||
bkp_cut_recur_apoint.rpt->freq,
|
bkp_cut_recur_apoint.rpt->freq,
|
||||||
bkp_cut_recur_apoint.rpt->until,
|
bkp_cut_recur_apoint.rpt->until, &bkp_cut_recur_apoint.exc);
|
||||||
&bkp_cut_recur_apoint.exc);
|
|
||||||
|
|
||||||
if (notify_bar())
|
if (notify_bar())
|
||||||
notify_check_repeated(&bkp_cut_recur_apoint);
|
notify_check_repeated(&bkp_cut_recur_apoint);
|
||||||
|
|||||||
158
src/sha1.c
158
src/sha1.c
@@ -67,8 +67,7 @@
|
|||||||
#define R4(v, w, x, y, z, i) z += (w ^ x ^ y) + blk (i) + 0xCA62C1D6 + \
|
#define R4(v, w, x, y, z, i) z += (w ^ x ^ y) + blk (i) + 0xCA62C1D6 + \
|
||||||
rol (v, 5); w = rol (w, 30);
|
rol (v, 5); w = rol (w, 30);
|
||||||
|
|
||||||
static void
|
static void sha1_transform(uint32_t state[5], const uint8_t buffer[64])
|
||||||
sha1_transform (uint32_t state[5], const uint8_t buffer[64])
|
|
||||||
{
|
{
|
||||||
typedef union {
|
typedef union {
|
||||||
uint8_t c[64];
|
uint8_t c[64];
|
||||||
@@ -82,46 +81,86 @@ sha1_transform (uint32_t state[5], const uint8_t buffer[64])
|
|||||||
uint32_t d = state[3];
|
uint32_t d = state[3];
|
||||||
uint32_t e = state[4];
|
uint32_t e = state[4];
|
||||||
|
|
||||||
R0 (a, b, c, d, e, 0); R0 (e, a, b, c, d, 1);
|
R0(a, b, c, d, e, 0);
|
||||||
R0 (d, e, a, b, c, 2); R0 (c, d, e, a, b, 3);
|
R0(e, a, b, c, d, 1);
|
||||||
R0 (b, c, d, e, a, 4); R0 (a, b, c, d, e, 5);
|
R0(d, e, a, b, c, 2);
|
||||||
R0 (e, a, b, c, d, 6); R0 (d, e, a, b, c, 7);
|
R0(c, d, e, a, b, 3);
|
||||||
R0 (c, d, e, a, b, 8); R0 (b, c, d, e, a, 9);
|
R0(b, c, d, e, a, 4);
|
||||||
R0 (a, b, c, d, e, 10); R0 (e, a, b, c, d, 11);
|
R0(a, b, c, d, e, 5);
|
||||||
R0 (d, e, a, b, c, 12); R0 (c, d, e, a, b, 13);
|
R0(e, a, b, c, d, 6);
|
||||||
R0 (b, c, d, e, a, 14); R0 (a, b, c, d, e, 15);
|
R0(d, e, a, b, c, 7);
|
||||||
R1 (e, a, b, c, d, 16); R1 (d, e, a, b, c, 17);
|
R0(c, d, e, a, b, 8);
|
||||||
R1 (c, d, e, a, b, 18); R1 (b, c, d, e, a, 19);
|
R0(b, c, d, e, a, 9);
|
||||||
R2 (a, b, c, d, e, 20); R2 (e, a, b, c, d, 21);
|
R0(a, b, c, d, e, 10);
|
||||||
R2 (d, e, a, b, c, 22); R2 (c, d, e, a, b, 23);
|
R0(e, a, b, c, d, 11);
|
||||||
R2 (b, c, d, e, a, 24); R2 (a, b, c, d, e, 25);
|
R0(d, e, a, b, c, 12);
|
||||||
R2 (e, a, b, c, d, 26); R2 (d, e, a, b, c, 27);
|
R0(c, d, e, a, b, 13);
|
||||||
R2 (c, d, e, a, b, 28); R2 (b, c, d, e, a, 29);
|
R0(b, c, d, e, a, 14);
|
||||||
R2 (a, b, c, d, e, 30); R2 (e, a, b, c, d, 31);
|
R0(a, b, c, d, e, 15);
|
||||||
R2 (d, e, a, b, c, 32); R2 (c, d, e, a, b, 33);
|
R1(e, a, b, c, d, 16);
|
||||||
R2 (b, c, d, e, a, 34); R2 (a, b, c, d, e, 35);
|
R1(d, e, a, b, c, 17);
|
||||||
R2 (e, a, b, c, d, 36); R2 (d, e, a, b, c, 37);
|
R1(c, d, e, a, b, 18);
|
||||||
R2 (c, d, e, a, b, 38); R2 (b, c, d, e, a, 39);
|
R1(b, c, d, e, a, 19);
|
||||||
R3 (a, b, c, d, e, 40); R3 (e, a, b, c, d, 41);
|
R2(a, b, c, d, e, 20);
|
||||||
R3 (d, e, a, b, c, 42); R3 (c, d, e, a, b, 43);
|
R2(e, a, b, c, d, 21);
|
||||||
R3 (b, c, d, e, a, 44); R3 (a, b, c, d, e, 45);
|
R2(d, e, a, b, c, 22);
|
||||||
R3 (e, a, b, c, d, 46); R3 (d, e, a, b, c, 47);
|
R2(c, d, e, a, b, 23);
|
||||||
R3 (c, d, e, a, b, 48); R3 (b, c, d, e, a, 49);
|
R2(b, c, d, e, a, 24);
|
||||||
R3 (a, b, c, d, e, 50); R3 (e, a, b, c, d, 51);
|
R2(a, b, c, d, e, 25);
|
||||||
R3 (d, e, a, b, c, 52); R3 (c, d, e, a, b, 53);
|
R2(e, a, b, c, d, 26);
|
||||||
R3 (b, c, d, e, a, 54); R3 (a, b, c, d, e, 55);
|
R2(d, e, a, b, c, 27);
|
||||||
R3 (e, a, b, c, d, 56); R3 (d, e, a, b, c, 57);
|
R2(c, d, e, a, b, 28);
|
||||||
R3 (c, d, e, a, b, 58); R3 (b, c, d, e, a, 59);
|
R2(b, c, d, e, a, 29);
|
||||||
R4 (a, b, c, d, e, 60); R4 (e, a, b, c, d, 61);
|
R2(a, b, c, d, e, 30);
|
||||||
R4 (d, e, a, b, c, 62); R4 (c, d, e, a, b, 63);
|
R2(e, a, b, c, d, 31);
|
||||||
R4 (b, c, d, e, a, 64); R4 (a, b, c, d, e, 65);
|
R2(d, e, a, b, c, 32);
|
||||||
R4 (e, a, b, c, d, 66); R4 (d, e, a, b, c, 67);
|
R2(c, d, e, a, b, 33);
|
||||||
R4 (c, d, e, a, b, 68); R4 (b, c, d, e, a, 69);
|
R2(b, c, d, e, a, 34);
|
||||||
R4 (a, b, c, d, e, 70); R4 (e, a, b, c, d, 71);
|
R2(a, b, c, d, e, 35);
|
||||||
R4 (d, e, a, b, c, 72); R4 (c, d, e, a, b, 73);
|
R2(e, a, b, c, d, 36);
|
||||||
R4 (b, c, d, e, a, 74); R4 (a, b, c, d, e, 75);
|
R2(d, e, a, b, c, 37);
|
||||||
R4 (e, a, b, c, d, 76); R4 (d, e, a, b, c, 77);
|
R2(c, d, e, a, b, 38);
|
||||||
R4 (c, d, e, a, b, 78); R4 (b, c, d, e, a, 79);
|
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[0] += a;
|
||||||
state[1] += b;
|
state[1] += b;
|
||||||
@@ -132,9 +171,7 @@ sha1_transform (uint32_t state[5], const uint8_t buffer[64])
|
|||||||
a = b = c = d = e = 0;
|
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[0] = 0x67452301;
|
||||||
ctx->state[1] = 0xEFCDAB89;
|
ctx->state[1] = 0xEFCDAB89;
|
||||||
@@ -145,8 +182,7 @@ sha1_init (sha1_ctx_t *ctx)
|
|||||||
ctx->count[0] = ctx->count[1] = 0;
|
ctx->count[0] = ctx->count[1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void sha1_update(sha1_ctx_t * ctx, const uint8_t * data, unsigned int len)
|
||||||
sha1_update (sha1_ctx_t *ctx, const uint8_t *data, unsigned int len)
|
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@@ -155,28 +191,23 @@ sha1_update (sha1_ctx_t *ctx, const uint8_t *data, unsigned int len)
|
|||||||
ctx->count[1]++;
|
ctx->count[1]++;
|
||||||
ctx->count[1] += (len >> 29);
|
ctx->count[1] += (len >> 29);
|
||||||
|
|
||||||
if (j + len > 63)
|
if (j + len > 63) {
|
||||||
{
|
|
||||||
memcpy(&ctx->buffer[j], data, (i = 64 - j));
|
memcpy(&ctx->buffer[j], data, (i = 64 - j));
|
||||||
sha1_transform(ctx->state, ctx->buffer);
|
sha1_transform(ctx->state, ctx->buffer);
|
||||||
for (; i + 63 < len; i += 64)
|
for (; i + 63 < len; i += 64)
|
||||||
sha1_transform(ctx->state, &data[i]);
|
sha1_transform(ctx->state, &data[i]);
|
||||||
j = 0;
|
j = 0;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
i = 0;
|
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;
|
uint32_t i, j;
|
||||||
uint8_t finalcount[8];
|
uint8_t finalcount[8];
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++) {
|
||||||
{
|
|
||||||
finalcount[i] = (uint8_t) ((ctx->count[(i >= 4 ? 0 : 1)] >>
|
finalcount[i] = (uint8_t) ((ctx->count[(i >= 4 ? 0 : 1)] >>
|
||||||
((3 - (i & 3)) * 8)) & 255);
|
((3 - (i & 3)) * 8)) & 255);
|
||||||
}
|
}
|
||||||
@@ -196,8 +227,7 @@ sha1_final (sha1_ctx_t *ctx, uint8_t digest[SHA1_DIGESTLEN])
|
|||||||
memset(&finalcount, 0, 8);
|
memset(&finalcount, 0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void sha1_digest(const char *data, char *buffer)
|
||||||
sha1_digest (const char *data, char *buffer)
|
|
||||||
{
|
{
|
||||||
sha1_ctx_t ctx;
|
sha1_ctx_t ctx;
|
||||||
uint8_t digest[SHA1_DIGESTLEN];
|
uint8_t digest[SHA1_DIGESTLEN];
|
||||||
@@ -207,15 +237,13 @@ sha1_digest (const char *data, char *buffer)
|
|||||||
sha1_update(&ctx, (const uint8_t *)data, strlen(data));
|
sha1_update(&ctx, (const uint8_t *)data, strlen(data));
|
||||||
sha1_final(&ctx, (uint8_t *) digest);
|
sha1_final(&ctx, (uint8_t *) digest);
|
||||||
|
|
||||||
for (i = 0; i < SHA1_DIGESTLEN; i++)
|
for (i = 0; i < SHA1_DIGESTLEN; i++) {
|
||||||
{
|
|
||||||
snprintf(buffer, 3, "%02x", digest[i]);
|
snprintf(buffer, 3, "%02x", digest[i]);
|
||||||
buffer += sizeof(char) * 2;
|
buffer += sizeof(char) * 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void sha1_stream(FILE * fp, char *buffer)
|
||||||
sha1_stream (FILE *fp, char *buffer)
|
|
||||||
{
|
{
|
||||||
sha1_ctx_t ctx;
|
sha1_ctx_t ctx;
|
||||||
uint8_t data[BUFSIZ];
|
uint8_t data[BUFSIZ];
|
||||||
@@ -225,16 +253,14 @@ sha1_stream (FILE *fp, char *buffer)
|
|||||||
|
|
||||||
sha1_init(&ctx);
|
sha1_init(&ctx);
|
||||||
|
|
||||||
while (!feof (fp))
|
while (!feof(fp)) {
|
||||||
{
|
|
||||||
bytes_read = fread(data, 1, BUFSIZ, fp);
|
bytes_read = fread(data, 1, BUFSIZ, fp);
|
||||||
sha1_update(&ctx, data, bytes_read);
|
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++)
|
for (i = 0; i < SHA1_DIGESTLEN; i++) {
|
||||||
{
|
|
||||||
snprintf(buffer, 3, "%02x", digest[i]);
|
snprintf(buffer, 3, "%02x", digest[i]);
|
||||||
buffer += sizeof(char) * 2;
|
buffer += sizeof(char) * 2;
|
||||||
}
|
}
|
||||||
|
|||||||
27
src/sigs.c
27
src/sigs.c
@@ -53,14 +53,11 @@
|
|||||||
* This is needed to avoid zombie processes running on system.
|
* This is needed to avoid zombie processes running on system.
|
||||||
* Also catch CTRL-C (SIGINT), and SIGWINCH to resize screen automatically.
|
* Also catch CTRL-C (SIGINT), and SIGWINCH to resize screen automatically.
|
||||||
*/
|
*/
|
||||||
static void
|
static void generic_hdlr(int sig)
|
||||||
generic_hdlr (int sig)
|
|
||||||
{
|
|
||||||
switch (sig)
|
|
||||||
{
|
{
|
||||||
|
switch (sig) {
|
||||||
case SIGCHLD:
|
case SIGCHLD:
|
||||||
while (waitpid (WAIT_MYPGRP, NULL, WNOHANG) > 0)
|
while (waitpid(WAIT_MYPGRP, NULL, WNOHANG) > 0) ;
|
||||||
;
|
|
||||||
break;
|
break;
|
||||||
case SIGWINCH:
|
case SIGWINCH:
|
||||||
resize = 1;
|
resize = 1;
|
||||||
@@ -68,18 +65,15 @@ generic_hdlr (int sig)
|
|||||||
ungetch(KEY_RESIZE);
|
ungetch(KEY_RESIZE);
|
||||||
break;
|
break;
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
if (unlink (path_cpid) != 0)
|
if (unlink(path_cpid) != 0) {
|
||||||
{
|
EXIT(_("Could not remove calcurse lock file: %s\n"), strerror(errno));
|
||||||
EXIT (_("Could not remove calcurse lock file: %s\n"),
|
|
||||||
strerror (errno));
|
|
||||||
}
|
}
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned sigs_set_hdlr(int sig, void (*handler) (int))
|
||||||
sigs_set_hdlr (int sig, void (*handler)(int))
|
|
||||||
{
|
{
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
|
||||||
@@ -87,10 +81,8 @@ sigs_set_hdlr (int sig, void (*handler)(int))
|
|||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
sa.sa_handler = handler;
|
sa.sa_handler = handler;
|
||||||
sa.sa_flags = 0;
|
sa.sa_flags = 0;
|
||||||
if (sigaction (sig, &sa, NULL) == -1)
|
if (sigaction(sig, &sa, NULL) == -1) {
|
||||||
{
|
ERROR_MSG(_("Error setting signal #%d : %s\n"), sig, strerror(errno));
|
||||||
ERROR_MSG (_("Error setting signal #%d : %s\n"),
|
|
||||||
sig, strerror (errno));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,8 +90,7 @@ sigs_set_hdlr (int sig, void (*handler)(int))
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Signal handling init. */
|
/* Signal handling init. */
|
||||||
void
|
void sigs_init()
|
||||||
sigs_init ()
|
|
||||||
{
|
{
|
||||||
if (!sigs_set_hdlr(SIGCHLD, generic_hdlr)
|
if (!sigs_set_hdlr(SIGCHLD, generic_hdlr)
|
||||||
|| !sigs_set_hdlr(SIGWINCH, generic_hdlr)
|
|| !sigs_set_hdlr(SIGWINCH, generic_hdlr)
|
||||||
|
|||||||
135
src/todo.c
135
src/todo.c
@@ -47,67 +47,57 @@ static int first = 1;
|
|||||||
static char *msgsav;
|
static char *msgsav;
|
||||||
|
|
||||||
/* Returns a structure containing the selected item. */
|
/* Returns a structure containing the selected item. */
|
||||||
static struct todo *
|
static struct todo *todo_get_item(int item_number)
|
||||||
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. */
|
/* Sets which todo is highlighted. */
|
||||||
void
|
void todo_hilt_set(int highlighted)
|
||||||
todo_hilt_set (int highlighted)
|
|
||||||
{
|
{
|
||||||
hilt = highlighted;
|
hilt = highlighted;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_hilt_decrease(int n)
|
||||||
todo_hilt_decrease (int n)
|
|
||||||
{
|
{
|
||||||
hilt -= n;
|
hilt -= n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_hilt_increase(int n)
|
||||||
todo_hilt_increase (int n)
|
|
||||||
{
|
{
|
||||||
hilt += n;
|
hilt += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return which todo is highlighted. */
|
/* Return which todo is highlighted. */
|
||||||
int
|
int todo_hilt(void)
|
||||||
todo_hilt (void)
|
|
||||||
{
|
{
|
||||||
return hilt;
|
return hilt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the number of todos. */
|
/* Return the number of todos. */
|
||||||
int
|
int todo_nb(void)
|
||||||
todo_nb (void)
|
|
||||||
{
|
{
|
||||||
return todos;
|
return todos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the number of todos. */
|
/* Set the number of todos. */
|
||||||
void
|
void todo_set_nb(int nb)
|
||||||
todo_set_nb (int nb)
|
|
||||||
{
|
{
|
||||||
todos = nb;
|
todos = nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set which one is the first todo to be displayed. */
|
/* Set which one is the first todo to be displayed. */
|
||||||
void
|
void todo_set_first(int nb)
|
||||||
todo_set_first (int nb)
|
|
||||||
{
|
{
|
||||||
first = nb;
|
first = nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_first_increase(int n)
|
||||||
todo_first_increase (int n)
|
|
||||||
{
|
{
|
||||||
first += n;
|
first += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_first_decrease(int n)
|
||||||
todo_first_decrease (int n)
|
|
||||||
{
|
{
|
||||||
first -= n;
|
first -= n;
|
||||||
}
|
}
|
||||||
@@ -116,33 +106,29 @@ todo_first_decrease (int n)
|
|||||||
* Return the position of the hilghlighted item, relative to the first one
|
* Return the position of the hilghlighted item, relative to the first one
|
||||||
* displayed.
|
* displayed.
|
||||||
*/
|
*/
|
||||||
int
|
int todo_hilt_pos(void)
|
||||||
todo_hilt_pos (void)
|
|
||||||
{
|
{
|
||||||
return hilt - first;
|
return hilt - first;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the last visited todo. */
|
/* Return the last visited todo. */
|
||||||
char *
|
char *todo_saved_mesg(void)
|
||||||
todo_saved_mesg (void)
|
|
||||||
{
|
{
|
||||||
return msgsav;
|
return msgsav;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Request user to enter a new todo item. */
|
/* Request user to enter a new todo item. */
|
||||||
void
|
void todo_new_item(void)
|
||||||
todo_new_item (void)
|
|
||||||
{
|
{
|
||||||
int ch = 0;
|
int ch = 0;
|
||||||
const char *mesg = _("Enter the new ToDo item : ");
|
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] = "";
|
char todo_input[BUFSIZ] = "";
|
||||||
|
|
||||||
status_mesg(mesg, "");
|
status_mesg(mesg, "");
|
||||||
if (getstring (win[STA].p, todo_input, BUFSIZ, 0, 1) == GETSTRING_VALID)
|
if (getstring(win[STA].p, todo_input, BUFSIZ, 0, 1) == GETSTRING_VALID) {
|
||||||
{
|
while ((ch < '1') || (ch > '9')) {
|
||||||
while ((ch < '1') || (ch > '9'))
|
|
||||||
{
|
|
||||||
status_mesg(mesg_id, "");
|
status_mesg(mesg_id, "");
|
||||||
ch = wgetch(win[STA].p);
|
ch = wgetch(win[STA].p);
|
||||||
}
|
}
|
||||||
@@ -151,8 +137,7 @@ todo_new_item (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int todo_cmp_id(struct todo *a, struct todo *b)
|
||||||
todo_cmp_id (struct todo *a, struct todo *b)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* As of version 2.6, todo items can have a negative id, which means they
|
* As of version 2.6, todo items can have a negative id, which means they
|
||||||
@@ -168,8 +153,7 @@ todo_cmp_id (struct todo *a, struct todo *b)
|
|||||||
/*
|
/*
|
||||||
* Add an item in the todo linked list.
|
* Add an item in the todo linked list.
|
||||||
*/
|
*/
|
||||||
struct todo *
|
struct todo *todo_add(char *mesg, int id, char *note)
|
||||||
todo_add (char *mesg, int id, char *note)
|
|
||||||
{
|
{
|
||||||
struct todo *todo;
|
struct todo *todo;
|
||||||
|
|
||||||
@@ -183,8 +167,7 @@ todo_add (char *mesg, int id, char *note)
|
|||||||
return todo;
|
return todo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_write(struct todo *todo, FILE * f)
|
||||||
todo_write (struct todo *todo, FILE *f)
|
|
||||||
{
|
{
|
||||||
if (todo->note)
|
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);
|
||||||
@@ -193,8 +176,7 @@ todo_write (struct todo *todo, FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Delete a note previously attached to a todo item. */
|
/* Delete a note previously attached to a todo item. */
|
||||||
static void
|
static void todo_delete_note_bynum(unsigned num)
|
||||||
todo_delete_note_bynum (unsigned num)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i = LLIST_NTH(&todolist, num);
|
llist_item_t *i = LLIST_NTH(&todolist, num);
|
||||||
|
|
||||||
@@ -208,8 +190,7 @@ todo_delete_note_bynum (unsigned num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Delete an item from the todo linked list. */
|
/* Delete an item from the todo linked list. */
|
||||||
static void
|
static void todo_delete_bynum(unsigned num)
|
||||||
todo_delete_bynum (unsigned num)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i = LLIST_NTH(&todolist, num);
|
llist_item_t *i = LLIST_NTH(&todolist, num);
|
||||||
|
|
||||||
@@ -229,8 +210,7 @@ todo_delete_bynum (unsigned num)
|
|||||||
* This way, it is easy to retrive its original priority if the user decides
|
* This way, it is easy to retrive its original priority if the user decides
|
||||||
* that in fact it was not completed.
|
* that in fact it was not completed.
|
||||||
*/
|
*/
|
||||||
void
|
void todo_flag(void)
|
||||||
todo_flag (void)
|
|
||||||
{
|
{
|
||||||
struct todo *t;
|
struct todo *t;
|
||||||
|
|
||||||
@@ -239,8 +219,7 @@ todo_flag (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Delete an item from the ToDo list. */
|
/* Delete an item from the ToDo list. */
|
||||||
void
|
void todo_delete(void)
|
||||||
todo_delete (void)
|
|
||||||
{
|
{
|
||||||
const char *del_todo_str = _("Do you really want to delete this task ?");
|
const char *del_todo_str = _("Do you really want to delete this task ?");
|
||||||
const char *erase_warning =
|
const char *erase_warning =
|
||||||
@@ -251,8 +230,7 @@ todo_delete (void)
|
|||||||
int answer;
|
int answer;
|
||||||
|
|
||||||
if ((todos <= 0) ||
|
if ((todos <= 0) ||
|
||||||
(conf.confirm_delete && (status_ask_bool (del_todo_str) != 1)))
|
(conf.confirm_delete && (status_ask_bool(del_todo_str) != 1))) {
|
||||||
{
|
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -263,8 +241,7 @@ todo_delete (void)
|
|||||||
else
|
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:
|
case 1:
|
||||||
todo_delete_bynum(hilt - 1);
|
todo_delete_bynum(hilt - 1);
|
||||||
todos--;
|
todos--;
|
||||||
@@ -288,14 +265,12 @@ todo_delete (void)
|
|||||||
* Returns the position into the linked list corresponding to the
|
* Returns the position into the linked list corresponding to the
|
||||||
* given todo item.
|
* given todo item.
|
||||||
*/
|
*/
|
||||||
static int
|
static int todo_get_position(struct todo *needle)
|
||||||
todo_get_position (struct todo *needle)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
LLIST_FOREACH (&todolist, i)
|
LLIST_FOREACH(&todolist, i) {
|
||||||
{
|
|
||||||
n++;
|
n++;
|
||||||
if (LLIST_TS_GET_DATA(i) == needle)
|
if (LLIST_TS_GET_DATA(i) == needle)
|
||||||
return n;
|
return n;
|
||||||
@@ -306,8 +281,7 @@ todo_get_position (struct todo *needle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Change an item priority by pressing '+' or '-' inside TODO panel. */
|
/* Change an item priority by pressing '+' or '-' inside TODO panel. */
|
||||||
void
|
void todo_chg_priority(int action)
|
||||||
todo_chg_priority (int action)
|
|
||||||
{
|
{
|
||||||
struct todo *backup;
|
struct todo *backup;
|
||||||
char backup_mesg[BUFSIZ];
|
char backup_mesg[BUFSIZ];
|
||||||
@@ -321,8 +295,7 @@ todo_chg_priority (int action)
|
|||||||
strncpy(backup_note, backup->note, MAX_NOTESIZ + 1);
|
strncpy(backup_note, backup->note, MAX_NOTESIZ + 1);
|
||||||
else
|
else
|
||||||
backup_note[0] = '\0';
|
backup_note[0] = '\0';
|
||||||
switch (action)
|
switch (action) {
|
||||||
{
|
|
||||||
case KEY_RAISE_PRIORITY:
|
case KEY_RAISE_PRIORITY:
|
||||||
if (backup_id > 1)
|
if (backup_id > 1)
|
||||||
backup_id--;
|
backup_id--;
|
||||||
@@ -346,8 +319,7 @@ todo_chg_priority (int action)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Edit the description of an already existing todo item. */
|
/* Edit the description of an already existing todo item. */
|
||||||
void
|
void todo_edit_item(void)
|
||||||
todo_edit_item (void)
|
|
||||||
{
|
{
|
||||||
struct todo *i;
|
struct todo *i;
|
||||||
const char *mesg = _("Enter the new ToDo description :");
|
const char *mesg = _("Enter the new ToDo description :");
|
||||||
@@ -378,10 +350,8 @@ display_todo_item (int incolor, char *msg, int prio, int note, int width, int y,
|
|||||||
custom_apply_attr(w, ATTR_HIGHEST);
|
custom_apply_attr(w, ATTR_HIGHEST);
|
||||||
if (utf8_strwidth(msg) < width)
|
if (utf8_strwidth(msg) < width)
|
||||||
mvwprintw(w, y, x, "%s%c %s", priostr, ch_note, msg);
|
mvwprintw(w, y, x, "%s%c %s", priostr, ch_note, msg);
|
||||||
else
|
else {
|
||||||
{
|
for (i = 0; msg[i] && width > 0; i++) {
|
||||||
for (i = 0; msg[i] && width > 0; i++)
|
|
||||||
{
|
|
||||||
if (!UTF8_ISCONT(msg[i]))
|
if (!UTF8_ISCONT(msg[i]))
|
||||||
width -= utf8_width(&msg[i]);
|
width -= utf8_width(&msg[i]);
|
||||||
buf[i] = msg[i];
|
buf[i] = msg[i];
|
||||||
@@ -397,8 +367,7 @@ display_todo_item (int incolor, char *msg, int prio, int note, int width, int y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Updates the ToDo panel. */
|
/* Updates the ToDo panel. */
|
||||||
void
|
void todo_update_panel(int which_pan)
|
||||||
todo_update_panel (int which_pan)
|
|
||||||
{
|
{
|
||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
int len = win[TOD].w - 8;
|
int len = win[TOD].w - 8;
|
||||||
@@ -411,28 +380,23 @@ todo_update_panel (int which_pan)
|
|||||||
int incolor = -1;
|
int incolor = -1;
|
||||||
|
|
||||||
/* Print todo item in the panel. */
|
/* Print todo item in the panel. */
|
||||||
erase_window_part (win[TOD].p, 1, title_lines, win[TOD].w - 2,
|
erase_window_part(win[TOD].p, 1, title_lines, win[TOD].w - 2, win[TOD].h - 2);
|
||||||
win[TOD].h - 2);
|
LLIST_FOREACH(&todolist, i) {
|
||||||
LLIST_FOREACH (&todolist, i)
|
|
||||||
{
|
|
||||||
struct todo *todo = LLIST_TS_GET_DATA(i);
|
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||||
num_todo++;
|
num_todo++;
|
||||||
t_realpos = num_todo - first;
|
t_realpos = num_todo - first;
|
||||||
incolor = (which_pan == TOD) ? num_todo - hilt : num_todo;
|
incolor = (which_pan == TOD) ? num_todo - hilt : num_todo;
|
||||||
if (incolor == 0)
|
if (incolor == 0)
|
||||||
msgsav = todo->mesg;
|
msgsav = todo->mesg;
|
||||||
if (t_realpos >= 0 && t_realpos < max_items)
|
if (t_realpos >= 0 && t_realpos < max_items) {
|
||||||
{
|
|
||||||
display_todo_item(incolor, todo->mesg, todo->id,
|
display_todo_item(incolor, todo->mesg, todo->id,
|
||||||
(todo->note != NULL) ? 1 : 0, len, y_offset,
|
(todo->note != NULL) ? 1 : 0, len, y_offset, x_offset);
|
||||||
x_offset);
|
|
||||||
y_offset = y_offset + todo_lines;
|
y_offset = y_offset + todo_lines;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw the scrollbar if necessary. */
|
/* Draw the scrollbar if necessary. */
|
||||||
if (todos > max_items)
|
if (todos > max_items) {
|
||||||
{
|
|
||||||
float ratio = ((float)max_items) / ((float)todos);
|
float ratio = ((float)max_items) / ((float)todos);
|
||||||
int sbar_length = (int)(ratio * (max_items + 1));
|
int sbar_length = (int)(ratio * (max_items + 1));
|
||||||
int highend = (int)(ratio * first);
|
int highend = (int)(ratio * first);
|
||||||
@@ -449,24 +413,21 @@ todo_update_panel (int which_pan)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Attach a note to a todo */
|
/* Attach a note to a todo */
|
||||||
void
|
void todo_edit_note(const char *editor)
|
||||||
todo_edit_note (const char *editor)
|
|
||||||
{
|
{
|
||||||
struct todo *i = todo_get_item(hilt);
|
struct todo *i = todo_get_item(hilt);
|
||||||
edit_note(&i->note, editor);
|
edit_note(&i->note, editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* View a note previously attached to a todo */
|
/* View a note previously attached to a todo */
|
||||||
void
|
void todo_view_note(const char *pager)
|
||||||
todo_view_note (const char *pager)
|
|
||||||
{
|
{
|
||||||
struct todo *i = todo_get_item(hilt);
|
struct todo *i = todo_get_item(hilt);
|
||||||
view_note(i->note, pager);
|
view_note(i->note, pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pipe a todo item to an external program. */
|
/* Pipe a todo item to an external program. */
|
||||||
void
|
void todo_pipe_item(void)
|
||||||
todo_pipe_item (void)
|
|
||||||
{
|
{
|
||||||
char cmd[BUFSIZ] = "";
|
char cmd[BUFSIZ] = "";
|
||||||
char const *arg[] = { cmd, NULL };
|
char const *arg[] = { cmd, NULL };
|
||||||
@@ -480,8 +441,7 @@ todo_pipe_item (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
wins_prepare_external();
|
wins_prepare_external();
|
||||||
if ((pid = shell_exec (NULL, &pout, *arg, arg)))
|
if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
|
||||||
{
|
|
||||||
fpout = fdopen(pout, "w");
|
fpout = fdopen(pout, "w");
|
||||||
|
|
||||||
todo = todo_get_item(hilt);
|
todo = todo_get_item(hilt);
|
||||||
@@ -494,22 +454,19 @@ todo_pipe_item (void)
|
|||||||
wins_unprepare_external();
|
wins_unprepare_external();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void todo_free(struct todo *todo)
|
||||||
todo_free (struct todo *todo)
|
|
||||||
{
|
{
|
||||||
mem_free(todo->mesg);
|
mem_free(todo->mesg);
|
||||||
erase_note(&todo->note);
|
erase_note(&todo->note);
|
||||||
mem_free(todo);
|
mem_free(todo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_init_list(void)
|
||||||
todo_init_list (void)
|
|
||||||
{
|
{
|
||||||
LLIST_INIT(&todolist);
|
LLIST_INIT(&todolist);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void todo_free_list(void)
|
||||||
todo_free_list (void)
|
|
||||||
{
|
{
|
||||||
LLIST_FREE_INNER(&todolist, todo_free);
|
LLIST_FREE_INNER(&todolist, todo_free);
|
||||||
LLIST_FREE(&todolist);
|
LLIST_FREE(&todolist);
|
||||||
|
|||||||
27
src/utf8.c
27
src/utf8.c
@@ -270,16 +270,14 @@ static const struct utf8_range utf8_widthtab[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Get the width of a UTF-8 character. */
|
/* Get the width of a UTF-8 character. */
|
||||||
int
|
int utf8_width(char *s)
|
||||||
utf8_width (char *s)
|
|
||||||
{
|
{
|
||||||
int val, low, high, cur;
|
int val, low, high, cur;
|
||||||
|
|
||||||
if (UTF8_ISCONT(*s))
|
if (UTF8_ISCONT(*s))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch (UTF8_LENGTH (*s))
|
switch (UTF8_LENGTH(*s)) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
val = s[0];
|
val = s[0];
|
||||||
break;
|
break;
|
||||||
@@ -287,8 +285,7 @@ utf8_width (char *s)
|
|||||||
val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6;
|
val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) |
|
val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) | (s[0] & 0x0f) << 12;
|
||||||
(s[0] & 0x0f) << 12;
|
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
val = (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) |
|
val = (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) |
|
||||||
@@ -296,8 +293,7 @@ utf8_width (char *s)
|
|||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
val = ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) |
|
val = ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) |
|
||||||
(s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) |
|
(s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) | (s[0] & 0x3f) << 24;
|
||||||
(s[0] & 0x3f) << 24;
|
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
val = (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) |
|
val = (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) |
|
||||||
@@ -310,17 +306,14 @@ utf8_width (char *s)
|
|||||||
|
|
||||||
low = 0;
|
low = 0;
|
||||||
high = sizeof(utf8_widthtab) / sizeof(utf8_widthtab[0]);
|
high = sizeof(utf8_widthtab) / sizeof(utf8_widthtab[0]);
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
cur = (low + high) / 2;
|
cur = (low + high) / 2;
|
||||||
if (val >= utf8_widthtab[cur].min)
|
if (val >= utf8_widthtab[cur].min) {
|
||||||
{
|
|
||||||
if (val <= utf8_widthtab[cur].max)
|
if (val <= utf8_widthtab[cur].max)
|
||||||
return utf8_widthtab[cur].width;
|
return utf8_widthtab[cur].width;
|
||||||
else
|
else
|
||||||
low = cur + 1;
|
low = cur + 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
high = cur - 1;
|
high = cur - 1;
|
||||||
}
|
}
|
||||||
while (low <= high);
|
while (low <= high);
|
||||||
@@ -329,13 +322,11 @@ utf8_width (char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get the width of a UTF-8 string. */
|
/* Get the width of a UTF-8 string. */
|
||||||
int
|
int utf8_strwidth(char *s)
|
||||||
utf8_strwidth (char *s)
|
|
||||||
{
|
{
|
||||||
int width = 0;
|
int width = 0;
|
||||||
|
|
||||||
for (; s && *s; s++)
|
for (; s && *s; s++) {
|
||||||
{
|
|
||||||
if (!UTF8_ISCONT(*s))
|
if (!UTF8_ISCONT(*s))
|
||||||
width += utf8_width(s);
|
width += utf8_width(s);
|
||||||
}
|
}
|
||||||
|
|||||||
366
src/utils.c
366
src/utils.c
@@ -66,21 +66,18 @@ enum format_specifier {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* General routine to exit calcurse properly. */
|
/* General routine to exit calcurse properly. */
|
||||||
void
|
void exit_calcurse(int status)
|
||||||
exit_calcurse (int status)
|
|
||||||
{
|
{
|
||||||
int was_interactive;
|
int was_interactive;
|
||||||
|
|
||||||
if (ui_mode == UI_CURSES)
|
if (ui_mode == UI_CURSES) {
|
||||||
{
|
|
||||||
notify_stop_main_thread();
|
notify_stop_main_thread();
|
||||||
clear();
|
clear();
|
||||||
wins_refresh();
|
wins_refresh();
|
||||||
endwin();
|
endwin();
|
||||||
ui_mode = UI_CMDLINE;
|
ui_mode = UI_CMDLINE;
|
||||||
was_interactive = 1;
|
was_interactive = 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
was_interactive = 0;
|
was_interactive = 0;
|
||||||
|
|
||||||
calendar_stop_date_thread();
|
calendar_stop_date_thread();
|
||||||
@@ -88,11 +85,9 @@ exit_calcurse (int status)
|
|||||||
free_user_data();
|
free_user_data();
|
||||||
keys_free();
|
keys_free();
|
||||||
mem_stats();
|
mem_stats();
|
||||||
if (was_interactive)
|
if (was_interactive) {
|
||||||
{
|
|
||||||
if (unlink(path_cpid) != 0)
|
if (unlink(path_cpid) != 0)
|
||||||
EXIT (_("Could not remove calcurse lock file: %s\n"),
|
EXIT(_("Could not remove calcurse lock file: %s\n"), strerror(errno));
|
||||||
strerror (errno));
|
|
||||||
if (dmon.enable)
|
if (dmon.enable)
|
||||||
dmon_start(status);
|
dmon_start(status);
|
||||||
}
|
}
|
||||||
@@ -100,8 +95,7 @@ exit_calcurse (int status)
|
|||||||
exit(status);
|
exit(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void free_user_data(void)
|
||||||
free_user_data (void)
|
|
||||||
{
|
{
|
||||||
day_free_list();
|
day_free_list();
|
||||||
event_llist_free();
|
event_llist_free();
|
||||||
@@ -117,8 +111,7 @@ free_user_data (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Function to exit on internal error. */
|
/* Function to exit on internal error. */
|
||||||
void
|
void fatalbox(const char *errmsg)
|
||||||
fatalbox (const char *errmsg)
|
|
||||||
{
|
{
|
||||||
WINDOW *errwin;
|
WINDOW *errwin;
|
||||||
const char *label = _("/!\\ INTERNAL ERROR /!\\");
|
const char *label = _("/!\\ INTERNAL ERROR /!\\");
|
||||||
@@ -145,8 +138,7 @@ fatalbox (const char *errmsg)
|
|||||||
wins_doupdate();
|
wins_doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void warnbox(const char *msg)
|
||||||
warnbox (const char *msg)
|
|
||||||
{
|
{
|
||||||
WINDOW *warnwin;
|
WINDOW *warnwin;
|
||||||
const char *label = "/!\\";
|
const char *label = "/!\\";
|
||||||
@@ -175,8 +167,7 @@ warnbox (const char *msg)
|
|||||||
* Print a message in the status bar.
|
* Print a message in the status bar.
|
||||||
* Message texts for first line and second line are to be provided.
|
* Message texts for first line and second line are to be provided.
|
||||||
*/
|
*/
|
||||||
void
|
void status_mesg(const char *msg1, const char *msg2)
|
||||||
status_mesg (const char *msg1, const char *msg2)
|
|
||||||
{
|
{
|
||||||
wins_erase_status_bar();
|
wins_erase_status_bar();
|
||||||
custom_apply_attr(win[STA].p, ATTR_HIGHEST);
|
custom_apply_attr(win[STA].p, ATTR_HIGHEST);
|
||||||
@@ -196,8 +187,7 @@ status_mesg (const char *msg1, const char *msg2)
|
|||||||
* Returns the index of the key pressed by the user (starting from 1),
|
* Returns the index of the key pressed by the user (starting from 1),
|
||||||
* or -1 if the user doesn't want to answer (e.g. by escaping).
|
* or -1 if the user doesn't want to answer (e.g. by escaping).
|
||||||
*/
|
*/
|
||||||
int
|
int status_ask_choice(const char *message, const char choice[], int nb_choice)
|
||||||
status_ask_choice(const char *message, const char choice[], int nb_choice)
|
|
||||||
{
|
{
|
||||||
int i, ch;
|
int i, ch;
|
||||||
char tmp[BUFSIZ];
|
char tmp[BUFSIZ];
|
||||||
@@ -207,24 +197,21 @@ status_ask_choice(const char *message, const char choice[], int nb_choice)
|
|||||||
avail_choice[0] = '[';
|
avail_choice[0] = '[';
|
||||||
avail_choice[1] = '\0';
|
avail_choice[1] = '\0';
|
||||||
|
|
||||||
for (i = 1; i <= nb_choice; i++)
|
for (i = 1; i <= nb_choice; i++) {
|
||||||
{
|
|
||||||
snprintf(tmp, BUFSIZ, (i == nb_choice) ? "%c] " : "%c/", choice[i]);
|
snprintf(tmp, BUFSIZ, (i == nb_choice) ? "%c] " : "%c/", choice[i]);
|
||||||
strcat(avail_choice, tmp);
|
strcat(avail_choice, tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
status_mesg(message, avail_choice);
|
status_mesg(message, avail_choice);
|
||||||
|
|
||||||
for (;;)
|
for (;;) {
|
||||||
{
|
|
||||||
ch = wgetch(win[STA].p);
|
ch = wgetch(win[STA].p);
|
||||||
for (i = 1; i <= nb_choice; i++)
|
for (i = 1; i <= nb_choice; i++)
|
||||||
if (ch == choice[i])
|
if (ch == choice[i])
|
||||||
return i;
|
return i;
|
||||||
if (ch == ESCAPE)
|
if (ch == ESCAPE)
|
||||||
return (-1);
|
return (-1);
|
||||||
if (resize)
|
if (resize) {
|
||||||
{
|
|
||||||
resize = 0;
|
resize = 0;
|
||||||
wins_reset();
|
wins_reset();
|
||||||
status_mesg(message, avail_choice);
|
status_mesg(message, avail_choice);
|
||||||
@@ -237,8 +224,7 @@ status_ask_choice(const char *message, const char choice[], int nb_choice)
|
|||||||
*
|
*
|
||||||
* Returns 1 if yes, 2 if no, and -1 otherwise
|
* Returns 1 if yes, 2 if no, and -1 otherwise
|
||||||
*/
|
*/
|
||||||
int
|
int status_ask_bool(const char *msg)
|
||||||
status_ask_bool (const char *msg)
|
|
||||||
{
|
{
|
||||||
return (status_ask_choice(msg, _("[yn]"), 2));
|
return (status_ask_choice(msg, _("[yn]"), 2));
|
||||||
}
|
}
|
||||||
@@ -250,8 +236,7 @@ status_ask_bool (const char *msg)
|
|||||||
* the user doesn't want to answer.
|
* the user doesn't want to answer.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
status_ask_simplechoice (const char *prefix, const char *choice[],
|
status_ask_simplechoice(const char *prefix, const char *choice[], int nb_choice)
|
||||||
int nb_choice)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char tmp[BUFSIZ];
|
char tmp[BUFSIZ];
|
||||||
@@ -266,8 +251,7 @@ status_ask_simplechoice (const char *prefix, const char *choice[],
|
|||||||
|
|
||||||
strcpy(choicestr, prefix);
|
strcpy(choicestr, prefix);
|
||||||
|
|
||||||
for (i = 0; i < nb_choice; i++)
|
for (i = 0; i < nb_choice; i++) {
|
||||||
{
|
|
||||||
snprintf(tmp, BUFSIZ, ((i + 1) == nb_choice) ? "(%d) %s?" : "(%d) %s, ",
|
snprintf(tmp, BUFSIZ, ((i + 1) == nb_choice) ? "(%d) %s?" : "(%d) %s, ",
|
||||||
(i + 1), _(choice[i]));
|
(i + 1), _(choice[i]));
|
||||||
strcat(choicestr, tmp);
|
strcat(choicestr, tmp);
|
||||||
@@ -283,16 +267,14 @@ erase_window_part (WINDOW *win, int first_col, int first_row, int last_col,
|
|||||||
{
|
{
|
||||||
int c, r;
|
int c, r;
|
||||||
|
|
||||||
for (r = first_row; r <= last_row; r++)
|
for (r = first_row; r <= last_row; r++) {
|
||||||
{
|
|
||||||
for (c = first_col; c <= last_col; c++)
|
for (c = first_col; c <= last_col; c++)
|
||||||
mvwprintw(win, r, c, " ");
|
mvwprintw(win, r, c, " ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws a popup window */
|
/* draws a popup window */
|
||||||
WINDOW *
|
WINDOW *popup(int pop_row, int pop_col, int pop_y, int pop_x, const char *title,
|
||||||
popup (int pop_row, int pop_col, int pop_y, int pop_x, const char *title,
|
|
||||||
const char *msg, int hint)
|
const char *msg, int hint)
|
||||||
{
|
{
|
||||||
const char *any_key = _("Press any key to continue...");
|
const char *any_key = _("Press any key to continue...");
|
||||||
@@ -339,11 +321,9 @@ print_in_middle (WINDOW *win, int starty, int startx, int width,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* checks if a string is only made of digits */
|
/* checks if a string is only made of digits */
|
||||||
int
|
int is_all_digit(const char *string)
|
||||||
is_all_digit (const char *string)
|
|
||||||
{
|
|
||||||
for (; *string; string++)
|
|
||||||
{
|
{
|
||||||
|
for (; *string; string++) {
|
||||||
if (!isdigit((int)*string))
|
if (!isdigit((int)*string))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -352,27 +332,23 @@ is_all_digit (const char *string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Given an item date expressed in seconds, return its start time in seconds. */
|
/* Given an item date expressed in seconds, return its start time in seconds. */
|
||||||
long
|
long get_item_time(long date)
|
||||||
get_item_time (long date)
|
|
||||||
{
|
{
|
||||||
return (long)(get_item_hour(date) * HOURINSEC +
|
return (long)(get_item_hour(date) * HOURINSEC +
|
||||||
get_item_min(date) * MININSEC);
|
get_item_min(date) * MININSEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int get_item_hour(long date)
|
||||||
get_item_hour (long date)
|
|
||||||
{
|
{
|
||||||
return (localtime((time_t *) & date))->tm_hour;
|
return (localtime((time_t *) & date))->tm_hour;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int get_item_min(long date)
|
||||||
get_item_min (long date)
|
|
||||||
{
|
{
|
||||||
return (localtime((time_t *) & date))->tm_min;
|
return (localtime((time_t *) & date))->tm_min;
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long date2sec(struct date day, unsigned hour, unsigned min)
|
||||||
date2sec (struct date day, unsigned hour, unsigned min)
|
|
||||||
{
|
{
|
||||||
time_t t = now();
|
time_t t = now();
|
||||||
struct tm start = *(localtime(&t));
|
struct tm start = *(localtime(&t));
|
||||||
@@ -392,16 +368,14 @@ date2sec (struct date day, unsigned hour, unsigned min)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Return a string containing the date, given a date in seconds. */
|
/* Return a string containing the date, given a date in seconds. */
|
||||||
char *
|
char *date_sec2date_str(long sec, const char *datefmt)
|
||||||
date_sec2date_str (long sec, const char *datefmt)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
char *datestr = (char *)mem_calloc(BUFSIZ, sizeof(char));
|
char *datestr = (char *)mem_calloc(BUFSIZ, sizeof(char));
|
||||||
|
|
||||||
if (sec == 0)
|
if (sec == 0)
|
||||||
strncpy(datestr, "0", BUFSIZ);
|
strncpy(datestr, "0", BUFSIZ);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
lt = localtime((time_t *) & sec);
|
lt = localtime((time_t *) & sec);
|
||||||
strftime(datestr, BUFSIZ, datefmt, lt);
|
strftime(datestr, BUFSIZ, datefmt, lt);
|
||||||
}
|
}
|
||||||
@@ -410,8 +384,7 @@ date_sec2date_str (long sec, const char *datefmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Generic function to format date. */
|
/* Generic function to format date. */
|
||||||
void
|
void date_sec2date_fmt(long sec, const char *fmt, char *datef)
|
||||||
date_sec2date_fmt (long sec, const char *fmt, char *datef)
|
|
||||||
{
|
{
|
||||||
struct tm *lt = localtime((time_t *) & sec);
|
struct tm *lt = localtime((time_t *) & sec);
|
||||||
strftime(datef, BUFSIZ, fmt, lt);
|
strftime(datef, BUFSIZ, fmt, lt);
|
||||||
@@ -420,8 +393,7 @@ date_sec2date_fmt (long sec, const char *fmt, char *datef)
|
|||||||
/*
|
/*
|
||||||
* Used to change date by adding a certain amount of days or weeks.
|
* Used to change date by adding a certain amount of days or weeks.
|
||||||
*/
|
*/
|
||||||
long
|
long date_sec_change(long date, int delta_month, int delta_day)
|
||||||
date_sec_change (long date, int delta_month, int delta_day)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -441,8 +413,7 @@ date_sec_change (long date, int delta_month, int delta_day)
|
|||||||
* Return a long containing the date which is updated taking into account
|
* Return a long containing the date which is updated taking into account
|
||||||
* the new time and date entered by the user.
|
* the new time and date entered by the user.
|
||||||
*/
|
*/
|
||||||
long
|
long update_time_in_date(long date, unsigned hr, unsigned mn)
|
||||||
update_time_in_date (long date, unsigned hr, unsigned mn)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t t, new_date;
|
time_t t, new_date;
|
||||||
@@ -461,8 +432,7 @@ update_time_in_date (long date, unsigned hr, unsigned mn)
|
|||||||
* Returns the date in seconds from year 1900.
|
* Returns the date in seconds from year 1900.
|
||||||
* If no date is entered, current date is chosen.
|
* If no date is entered, current date is chosen.
|
||||||
*/
|
*/
|
||||||
long
|
long get_sec_date(struct date date)
|
||||||
get_sec_date (struct date date)
|
|
||||||
{
|
{
|
||||||
struct tm *ptrtime;
|
struct tm *ptrtime;
|
||||||
time_t timer;
|
time_t timer;
|
||||||
@@ -471,8 +441,7 @@ get_sec_date (struct date date)
|
|||||||
char current_month[] = "mm ";
|
char current_month[] = "mm ";
|
||||||
char current_year[] = "yyyy ";
|
char current_year[] = "yyyy ";
|
||||||
|
|
||||||
if (date.yyyy == 0 && date.mm == 0 && date.dd == 0)
|
if (date.yyyy == 0 && date.mm == 0 && date.dd == 0) {
|
||||||
{
|
|
||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
ptrtime = localtime(&timer);
|
ptrtime = localtime(&timer);
|
||||||
strftime(current_day, strlen(current_day), "%d", ptrtime);
|
strftime(current_day, strlen(current_day), "%d", ptrtime);
|
||||||
@@ -486,8 +455,7 @@ get_sec_date (struct date date)
|
|||||||
return long_date;
|
return long_date;
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long min2sec(unsigned minutes)
|
||||||
min2sec (unsigned minutes)
|
|
||||||
{
|
{
|
||||||
return minutes * MININSEC;
|
return minutes * MININSEC;
|
||||||
}
|
}
|
||||||
@@ -526,8 +494,7 @@ item_in_popup (const char *saved_a_start, const char *saved_a_end,
|
|||||||
|
|
||||||
pad = newpad(padl, padw);
|
pad = newpad(padl, padw);
|
||||||
popup_win = popup(winl, winw, 1, 2, pop_title, NULL, 1);
|
popup_win = popup(winl, winw, 1, 2, pop_title, NULL, 1);
|
||||||
if (strcmp (pop_title, _("Appointment")) == 0)
|
if (strcmp(pop_title, _("Appointment")) == 0) {
|
||||||
{
|
|
||||||
mvwprintw(popup_win, margin_top, margin_left, "- %s -> %s",
|
mvwprintw(popup_win, margin_top, margin_left, "- %s -> %s",
|
||||||
saved_a_start, saved_a_end);
|
saved_a_start, saved_a_end);
|
||||||
}
|
}
|
||||||
@@ -541,8 +508,7 @@ item_in_popup (const char *saved_a_start, const char *saved_a_end,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the beginning of current day in seconds from 1900. */
|
/* Returns the beginning of current day in seconds from 1900. */
|
||||||
long
|
long get_today(void)
|
||||||
get_today (void)
|
|
||||||
{
|
{
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
@@ -560,14 +526,12 @@ get_today (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the current time in seconds. */
|
/* Returns the current time in seconds. */
|
||||||
long
|
long now(void)
|
||||||
now (void)
|
|
||||||
{
|
{
|
||||||
return (long)time(NULL);
|
return (long)time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *nowstr(void)
|
||||||
nowstr (void)
|
|
||||||
{
|
{
|
||||||
static char buf[BUFSIZ];
|
static char buf[BUFSIZ];
|
||||||
time_t t = now();
|
time_t t = now();
|
||||||
@@ -577,8 +541,7 @@ nowstr (void)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long mystrtol(const char *str)
|
||||||
mystrtol (const char *str)
|
|
||||||
{
|
{
|
||||||
char *ep;
|
char *ep;
|
||||||
long lval;
|
long lval;
|
||||||
@@ -600,17 +563,13 @@ print_bool_option_incolor (WINDOW *win, unsigned option, int pos_y, int pos_x)
|
|||||||
int color = 0;
|
int color = 0;
|
||||||
const char *option_value;
|
const char *option_value;
|
||||||
|
|
||||||
if (option == 1)
|
if (option == 1) {
|
||||||
{
|
|
||||||
color = ATTR_TRUE;
|
color = ATTR_TRUE;
|
||||||
option_value = _("yes");
|
option_value = _("yes");
|
||||||
}
|
} else if (option == 0) {
|
||||||
else if (option == 0)
|
|
||||||
{
|
|
||||||
color = ATTR_FALSE;
|
color = ATTR_FALSE;
|
||||||
option_value = _("no");
|
option_value = _("no");
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
EXIT(_("option not defined"));
|
EXIT(_("option not defined"));
|
||||||
|
|
||||||
custom_apply_attr(win, color);
|
custom_apply_attr(win, color);
|
||||||
@@ -620,12 +579,10 @@ print_bool_option_incolor (WINDOW *win, unsigned option, int pos_y, int pos_x)
|
|||||||
wins_doupdate();
|
wins_doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the name of the default directory for temporary files.
|
* Get the name of the default directory for temporary files.
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *get_tempdir(void)
|
||||||
get_tempdir (void)
|
|
||||||
{
|
{
|
||||||
if (getenv("TMPDIR"))
|
if (getenv("TMPDIR"))
|
||||||
return getenv("TMPDIR");
|
return getenv("TMPDIR");
|
||||||
@@ -641,8 +598,7 @@ get_tempdir (void)
|
|||||||
* Create a new unique file, and return a newly allocated string which contains
|
* Create a new unique file, and return a newly allocated string which contains
|
||||||
* the random part of the file name.
|
* the random part of the file name.
|
||||||
*/
|
*/
|
||||||
char *
|
char *new_tempfile(const char *prefix, int trailing_len)
|
||||||
new_tempfile (const char *prefix, int trailing_len)
|
|
||||||
{
|
{
|
||||||
char fullname[BUFSIZ];
|
char fullname[BUFSIZ];
|
||||||
int prefix_len, fd;
|
int prefix_len, fd;
|
||||||
@@ -657,10 +613,8 @@ new_tempfile (const char *prefix, int trailing_len)
|
|||||||
memcpy(fullname, prefix, prefix_len);
|
memcpy(fullname, prefix, prefix_len);
|
||||||
memset(fullname + prefix_len, 'X', trailing_len);
|
memset(fullname + prefix_len, 'X', trailing_len);
|
||||||
fullname[prefix_len + trailing_len] = '\0';
|
fullname[prefix_len + trailing_len] = '\0';
|
||||||
if ((fd = mkstemp (fullname)) == -1 || (file = fdopen (fd, "w+")) == NULL)
|
if ((fd = mkstemp(fullname)) == -1 || (file = fdopen(fd, "w+")) == NULL) {
|
||||||
{
|
if (fd != -1) {
|
||||||
if (fd != -1)
|
|
||||||
{
|
|
||||||
unlink(fullname);
|
unlink(fullname);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
@@ -697,14 +651,11 @@ parse_date (const char *date_string, enum datefmt datefmt, int *year,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* parse string into in[], read up to three integers */
|
/* parse string into in[], read up to three integers */
|
||||||
for (p = date_string; *p; p++)
|
for (p = date_string; *p; p++) {
|
||||||
{
|
if (*p == sep) {
|
||||||
if (*p == sep)
|
|
||||||
{
|
|
||||||
if ((++n) > 2)
|
if ((++n) > 2)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
} else if ((*p >= '0') && (*p <= '9'))
|
||||||
else if ((*p >= '0') && (*p <= '9'))
|
|
||||||
in[n] = in[n] * 10 + (int)(*p - '0');
|
in[n] = in[n] * 10 + (int)(*p - '0');
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
@@ -714,8 +665,7 @@ parse_date (const char *date_string, enum datefmt datefmt, int *year,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* convert into day, month and year, depending on the date format */
|
/* convert into day, month and year, depending on the date format */
|
||||||
switch (datefmt)
|
switch (datefmt) {
|
||||||
{
|
|
||||||
case DATEFMT_MMDDYYYY:
|
case DATEFMT_MMDDYYYY:
|
||||||
m = (n >= 1) ? in[0] : 0;
|
m = (n >= 1) ? in[0] : 0;
|
||||||
d = (n >= 1) ? in[1] : in[0];
|
d = (n >= 1) ? in[1] : in[0];
|
||||||
@@ -736,18 +686,15 @@ parse_date (const char *date_string, enum datefmt datefmt, int *year,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slctd_date)
|
if (slctd_date) {
|
||||||
{
|
if (y > 0 && y < 100) {
|
||||||
if (y > 0 && y < 100)
|
|
||||||
{
|
|
||||||
/* convert "YY" format into "YYYY" */
|
/* convert "YY" format into "YYYY" */
|
||||||
y += slctd_date->yyyy - slctd_date->yyyy % 100;
|
y += slctd_date->yyyy - slctd_date->yyyy % 100;
|
||||||
}
|
} else if (n < 2) {
|
||||||
else if (n < 2)
|
|
||||||
{
|
|
||||||
/* set year and, optionally, month if short from is used */
|
/* set year and, optionally, month if short from is used */
|
||||||
y = slctd_date->yyyy;
|
y = slctd_date->yyyy;
|
||||||
if (n < 1) m = slctd_date->mm;
|
if (n < 1)
|
||||||
|
m = slctd_date->mm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -772,8 +719,7 @@ parse_date (const char *date_string, enum datefmt datefmt, int *year,
|
|||||||
*
|
*
|
||||||
* Returns 1 on success and 0 on failure.
|
* Returns 1 on success and 0 on failure.
|
||||||
*/
|
*/
|
||||||
int
|
int parse_time(const char *string, unsigned *hour, unsigned *minute)
|
||||||
parse_time (const char *string, unsigned *hour, unsigned *minute)
|
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
unsigned in[2] = { 0, 0 }, n = 0;
|
unsigned in[2] = { 0, 0 }, n = 0;
|
||||||
@@ -782,14 +728,11 @@ parse_time (const char *string, unsigned *hour, unsigned *minute)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* parse string into in[], read up to two integers */
|
/* parse string into in[], read up to two integers */
|
||||||
for (p = string; *p; p++)
|
for (p = string; *p; p++) {
|
||||||
{
|
if (*p == ':') {
|
||||||
if (*p == ':')
|
|
||||||
{
|
|
||||||
if ((++n) > 1)
|
if ((++n) > 1)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
} else if ((*p >= '0') && (*p <= '9'))
|
||||||
else if ((*p >= '0') && (*p <= '9'))
|
|
||||||
in[n] = in[n] * 10 + (int)(*p - '0');
|
in[n] = in[n] * 10 + (int)(*p - '0');
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
@@ -816,8 +759,7 @@ parse_time (const char *string, unsigned *hour, unsigned *minute)
|
|||||||
*
|
*
|
||||||
* Returns 1 on success and 0 on failure.
|
* Returns 1 on success and 0 on failure.
|
||||||
*/
|
*/
|
||||||
int
|
int parse_duration(const char *string, unsigned *duration)
|
||||||
parse_duration (const char *string, unsigned *duration)
|
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
STATE_INITIAL,
|
STATE_INITIAL,
|
||||||
@@ -835,64 +777,45 @@ parse_duration (const char *string, unsigned *duration)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* parse string using a simple state machine */
|
/* parse string using a simple state machine */
|
||||||
for (p = string; *p; p++)
|
for (p = string; *p; p++) {
|
||||||
{
|
if ((*p >= '0') && (*p <= '9')) {
|
||||||
if ((*p >= '0') && (*p <= '9'))
|
|
||||||
{
|
|
||||||
if (state == STATE_DONE)
|
if (state == STATE_DONE)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
in = in * 10 + (int)(*p - '0');
|
in = in * 10 + (int)(*p - '0');
|
||||||
}
|
} else {
|
||||||
else
|
switch (state) {
|
||||||
{
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case STATE_INITIAL:
|
case STATE_INITIAL:
|
||||||
if (*p == ':')
|
if (*p == ':') {
|
||||||
{
|
|
||||||
dur += in * HOURINMIN;
|
dur += in * HOURINMIN;
|
||||||
state = STATE_HHMM_MM;
|
state = STATE_HHMM_MM;
|
||||||
}
|
} else if (*p == 'd') {
|
||||||
else if (*p == 'd')
|
|
||||||
{
|
|
||||||
dur += in * DAYINMIN;
|
dur += in * DAYINMIN;
|
||||||
state = STATE_DDHHMM_HH;
|
state = STATE_DDHHMM_HH;
|
||||||
}
|
} else if (*p == 'h') {
|
||||||
else if (*p == 'h')
|
|
||||||
{
|
|
||||||
dur += in * HOURINMIN;
|
dur += in * HOURINMIN;
|
||||||
state = STATE_DDHHMM_MM;
|
state = STATE_DDHHMM_MM;
|
||||||
}
|
} else if (*p == 'm') {
|
||||||
else if (*p == 'm')
|
|
||||||
{
|
|
||||||
dur += in;
|
dur += in;
|
||||||
state = STATE_DONE;
|
state = STATE_DONE;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
case STATE_DDHHMM_HH:
|
case STATE_DDHHMM_HH:
|
||||||
if (*p == 'h')
|
if (*p == 'h') {
|
||||||
{
|
|
||||||
dur += in * HOURINMIN;
|
dur += in * HOURINMIN;
|
||||||
state = STATE_DDHHMM_MM;
|
state = STATE_DDHHMM_MM;
|
||||||
}
|
} else if (*p == 'm') {
|
||||||
else if (*p == 'm')
|
|
||||||
{
|
|
||||||
dur += in;
|
dur += in;
|
||||||
state = STATE_DONE;
|
state = STATE_DONE;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
case STATE_DDHHMM_MM:
|
case STATE_DDHHMM_MM:
|
||||||
if (*p == 'm')
|
if (*p == 'm') {
|
||||||
{
|
|
||||||
dur += in;
|
dur += in;
|
||||||
state = STATE_DONE;
|
state = STATE_DONE;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
case STATE_HHMM_MM:
|
case STATE_HHMM_MM:
|
||||||
@@ -915,8 +838,7 @@ parse_duration (const char *string, unsigned *duration)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void str_toupper(char *s)
|
||||||
str_toupper (char *s)
|
|
||||||
{
|
{
|
||||||
if (!s)
|
if (!s)
|
||||||
return;
|
return;
|
||||||
@@ -924,8 +846,7 @@ str_toupper (char *s)
|
|||||||
*s = toupper(*s);
|
*s = toupper(*s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void file_close(FILE * f, const char *pos)
|
||||||
file_close (FILE *f, const char *pos)
|
|
||||||
{
|
{
|
||||||
EXIT_IF((fclose(f)) != 0, _("Error when closing file at %s"), pos);
|
EXIT_IF((fclose(f)) != 0, _("Error when closing file at %s"), pos);
|
||||||
}
|
}
|
||||||
@@ -935,13 +856,11 @@ file_close (FILE *f, const char *pos)
|
|||||||
* (hence the 'p') in a way that even if a signal is caught during the sleep
|
* (hence the 'p') in a way that even if a signal is caught during the sleep
|
||||||
* process, this function will return to sleep afterwards.
|
* process, this function will return to sleep afterwards.
|
||||||
*/
|
*/
|
||||||
void
|
void psleep(unsigned secs)
|
||||||
psleep (unsigned secs)
|
|
||||||
{
|
{
|
||||||
unsigned unslept;
|
unsigned unslept;
|
||||||
|
|
||||||
for (unslept = sleep (secs); unslept; unslept = sleep (unslept))
|
for (unslept = sleep(secs); unslept; unslept = sleep(unslept)) ;
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -950,8 +869,7 @@ psleep (unsigned secs)
|
|||||||
* If pfdin and/or pfdout point to a valid address, a pipe is created and the
|
* If pfdin and/or pfdout point to a valid address, a pipe is created and the
|
||||||
* appropriate file descriptors are written to pfdin/pfdout.
|
* appropriate file descriptors are written to pfdin/pfdout.
|
||||||
*/
|
*/
|
||||||
int
|
int fork_exec(int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
||||||
fork_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|
||||||
{
|
{
|
||||||
int pin[2], pout[2];
|
int pin[2], pout[2];
|
||||||
int pid;
|
int pid;
|
||||||
@@ -961,18 +879,15 @@ fork_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
if (pfdout && (pipe(pout) == -1))
|
if (pfdout && (pipe(pout) == -1))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((pid = fork ()) == 0)
|
if ((pid = fork()) == 0) {
|
||||||
{
|
if (pfdout) {
|
||||||
if (pfdout)
|
|
||||||
{
|
|
||||||
if (dup2(pout[0], STDIN_FILENO) < 0)
|
if (dup2(pout[0], STDIN_FILENO) < 0)
|
||||||
_exit(127);
|
_exit(127);
|
||||||
close(pout[0]);
|
close(pout[0]);
|
||||||
close(pout[1]);
|
close(pout[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfdin)
|
if (pfdin) {
|
||||||
{
|
|
||||||
if (dup2(pin[1], STDOUT_FILENO) < 0)
|
if (dup2(pin[1], STDOUT_FILENO) < 0)
|
||||||
_exit(127);
|
_exit(127);
|
||||||
close(pin[0]);
|
close(pin[0]);
|
||||||
@@ -981,29 +896,22 @@ fork_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
|
|
||||||
execvp(path, (char *const *)arg);
|
execvp(path, (char *const *)arg);
|
||||||
_exit(127);
|
_exit(127);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pfdin)
|
if (pfdin)
|
||||||
close(pin[1]);
|
close(pin[1]);
|
||||||
if (pfdout)
|
if (pfdout)
|
||||||
close(pout[0]);
|
close(pout[0]);
|
||||||
|
|
||||||
if (pid > 0)
|
if (pid > 0) {
|
||||||
{
|
if (pfdin) {
|
||||||
if (pfdin)
|
|
||||||
{
|
|
||||||
fcntl(pin[0], F_SETFD, FD_CLOEXEC);
|
fcntl(pin[0], F_SETFD, FD_CLOEXEC);
|
||||||
*pfdin = pin[0];
|
*pfdin = pin[0];
|
||||||
}
|
}
|
||||||
if (pfdout)
|
if (pfdout) {
|
||||||
{
|
|
||||||
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
|
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
|
||||||
*pfdout = pout[1];
|
*pfdout = pout[1];
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pfdin)
|
if (pfdin)
|
||||||
close(pin[0]);
|
close(pin[0]);
|
||||||
if (pfdout)
|
if (pfdout)
|
||||||
@@ -1023,8 +931,7 @@ shell_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
char *arg0 = NULL;
|
char *arg0 = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
for (argc = 0; arg[argc]; argc++)
|
for (argc = 0; arg[argc]; argc++) ;
|
||||||
;
|
|
||||||
|
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1034,8 +941,7 @@ shell_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
narg[0] = "sh";
|
narg[0] = "sh";
|
||||||
narg[1] = "-c";
|
narg[1] = "-c";
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1) {
|
||||||
{
|
|
||||||
arg0 = mem_malloc(strlen(path) + 6);
|
arg0 = mem_malloc(strlen(path) + 6);
|
||||||
sprintf(arg0, "%s \"$@\"", path);
|
sprintf(arg0, "%s \"$@\"", path);
|
||||||
narg[2] = arg0;
|
narg[2] = arg0;
|
||||||
@@ -1043,9 +949,7 @@ shell_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
narg[i + 3] = arg[i];
|
narg[i + 3] = arg[i];
|
||||||
narg[argc + 3] = NULL;
|
narg[argc + 3] = NULL;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
narg[2] = path;
|
narg[2] = path;
|
||||||
narg[3] = NULL;
|
narg[3] = NULL;
|
||||||
}
|
}
|
||||||
@@ -1060,8 +964,7 @@ shell_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for a child process to terminate. */
|
/* Wait for a child process to terminate. */
|
||||||
int
|
int child_wait(int *pfdin, int *pfdout, int pid)
|
||||||
child_wait (int *pfdin, int *pfdout, int pid)
|
|
||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
@@ -1075,8 +978,7 @@ child_wait (int *pfdin, int *pfdout, int pid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Display "Press any key to continue..." and wait for a key press. */
|
/* Display "Press any key to continue..." and wait for a key press. */
|
||||||
void
|
void press_any_key(void)
|
||||||
press_any_key (void)
|
|
||||||
{
|
{
|
||||||
struct termios t_attr_old, t_attr;
|
struct termios t_attr_old, t_attr;
|
||||||
|
|
||||||
@@ -1103,8 +1005,7 @@ press_any_key (void)
|
|||||||
*
|
*
|
||||||
* (patch submitted by Erik Saule).
|
* (patch submitted by Erik Saule).
|
||||||
*/
|
*/
|
||||||
static void
|
static void print_notefile(FILE * out, const char *filename, int nbtab)
|
||||||
print_notefile (FILE *out, const char *filename, int nbtab)
|
|
||||||
{
|
{
|
||||||
char path_to_notefile[BUFSIZ];
|
char path_to_notefile[BUFSIZ];
|
||||||
FILE *notefile;
|
FILE *notefile;
|
||||||
@@ -1113,23 +1014,18 @@ print_notefile (FILE *out, const char *filename, int nbtab)
|
|||||||
int i;
|
int i;
|
||||||
int printlinestarter = 1;
|
int printlinestarter = 1;
|
||||||
|
|
||||||
if (nbtab < BUFSIZ)
|
if (nbtab < BUFSIZ) {
|
||||||
{
|
|
||||||
for (i = 0; i < nbtab; i++)
|
for (i = 0; i < nbtab; i++)
|
||||||
linestarter[i] = '\t';
|
linestarter[i] = '\t';
|
||||||
linestarter[nbtab] = '\0';
|
linestarter[nbtab] = '\0';
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
linestarter[0] = '\0';
|
linestarter[0] = '\0';
|
||||||
|
|
||||||
snprintf(path_to_notefile, BUFSIZ, "%s/%s", path_notes, filename);
|
snprintf(path_to_notefile, BUFSIZ, "%s/%s", path_notes, filename);
|
||||||
notefile = fopen(path_to_notefile, "r");
|
notefile = fopen(path_to_notefile, "r");
|
||||||
if (notefile)
|
if (notefile) {
|
||||||
{
|
while (fgets(buffer, BUFSIZ, notefile) != 0) {
|
||||||
while (fgets (buffer, BUFSIZ, notefile) != 0)
|
if (printlinestarter) {
|
||||||
{
|
|
||||||
if (printlinestarter)
|
|
||||||
{
|
|
||||||
fputs(linestarter, out);
|
fputs(linestarter, out);
|
||||||
printlinestarter = 0;
|
printlinestarter = 0;
|
||||||
}
|
}
|
||||||
@@ -1139,20 +1035,16 @@ print_notefile (FILE *out, const char *filename, int nbtab)
|
|||||||
}
|
}
|
||||||
fputs("\n", out);
|
fputs("\n", out);
|
||||||
file_close(notefile, __FILE_POS__);
|
file_close(notefile, __FILE_POS__);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
fputs(linestarter, out);
|
fputs(linestarter, out);
|
||||||
fputs(_("No note file found\n"), out);
|
fputs(_("No note file found\n"), out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print an escape sequence and return its length. */
|
/* Print an escape sequence and return its length. */
|
||||||
static int
|
static int print_escape(const char *s)
|
||||||
print_escape (const char *s)
|
|
||||||
{
|
|
||||||
switch (*(s + 1))
|
|
||||||
{
|
{
|
||||||
|
switch (*(s + 1)) {
|
||||||
case 'a':
|
case 'a':
|
||||||
putchar('\a');
|
putchar('\a');
|
||||||
return 1;
|
return 1;
|
||||||
@@ -1197,16 +1089,14 @@ print_escape (const char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Parse a format specifier. */
|
/* Parse a format specifier. */
|
||||||
static enum format_specifier
|
static enum format_specifier parse_fs(const char **s, char *extformat)
|
||||||
parse_fs (const char **s, char *extformat)
|
|
||||||
{
|
{
|
||||||
char buf[FS_EXT_MAXLEN];
|
char buf[FS_EXT_MAXLEN];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
extformat[0] = '\0';
|
extformat[0] = '\0';
|
||||||
|
|
||||||
switch (**s)
|
switch (**s) {
|
||||||
{
|
|
||||||
case 's':
|
case 's':
|
||||||
strcpy(extformat, "epoch");
|
strcpy(extformat, "epoch");
|
||||||
return FS_STARTDATE;
|
return FS_STARTDATE;
|
||||||
@@ -1229,8 +1119,7 @@ parse_fs (const char **s, char *extformat)
|
|||||||
return FS_PRIORITY;
|
return FS_PRIORITY;
|
||||||
case '(':
|
case '(':
|
||||||
/* Long format specifier. */
|
/* Long format specifier. */
|
||||||
for ((*s)++, i = 0; **s != ':' && **s != ')'; (*s)++, i++)
|
for ((*s)++, i = 0; **s != ':' && **s != ')'; (*s)++, i++) {
|
||||||
{
|
|
||||||
if (**s == '\0')
|
if (**s == '\0')
|
||||||
return FS_EOF;
|
return FS_EOF;
|
||||||
|
|
||||||
@@ -1240,10 +1129,8 @@ parse_fs (const char **s, char *extformat)
|
|||||||
|
|
||||||
buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0';
|
buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0';
|
||||||
|
|
||||||
if (**s == ':')
|
if (**s == ':') {
|
||||||
{
|
for ((*s)++, i = 0; **s != ')'; (*s)++, i++) {
|
||||||
for ((*s)++, i = 0; **s != ')'; (*s)++, i++)
|
|
||||||
{
|
|
||||||
if (**s == '\0')
|
if (**s == '\0')
|
||||||
return FS_EOF;
|
return FS_EOF;
|
||||||
|
|
||||||
@@ -1280,15 +1167,13 @@ parse_fs (const char **s, char *extformat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print a formatted date to stdout. */
|
/* Print a formatted date to stdout. */
|
||||||
static void
|
static void print_date(long date, const char *extformat)
|
||||||
print_date (long date, const char *extformat)
|
|
||||||
{
|
{
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
|
|
||||||
if (!strcmp(extformat, "epoch"))
|
if (!strcmp(extformat, "epoch"))
|
||||||
printf("%ld", date);
|
printf("%ld", date);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
time_t t = date;
|
time_t t = date;
|
||||||
struct tm *lt = localtime((time_t *) & t);
|
struct tm *lt = localtime((time_t *) & t);
|
||||||
|
|
||||||
@@ -1302,18 +1187,15 @@ print_date (long date, const char *extformat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print a formatted appointment to stdout. */
|
/* Print a formatted appointment to stdout. */
|
||||||
void
|
void print_apoint(const char *format, long day, struct apoint *apt)
|
||||||
print_apoint (const char *format, long day, struct apoint *apt)
|
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
char extformat[FS_EXT_MAXLEN];
|
char extformat[FS_EXT_MAXLEN];
|
||||||
|
|
||||||
for (p = format; *p; p++)
|
for (p = format; *p; p++) {
|
||||||
{
|
|
||||||
if (*p == '%') {
|
if (*p == '%') {
|
||||||
p++;
|
p++;
|
||||||
switch (parse_fs (&p, extformat))
|
switch (parse_fs(&p, extformat)) {
|
||||||
{
|
|
||||||
case FS_STARTDATE:
|
case FS_STARTDATE:
|
||||||
print_date(apt->start, extformat);
|
print_date(apt->start, extformat);
|
||||||
break;
|
break;
|
||||||
@@ -1342,8 +1224,7 @@ print_apoint (const char *format, long day, struct apoint *apt)
|
|||||||
putchar('?');
|
putchar('?');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else if (*p == '\\')
|
||||||
else if (*p == '\\')
|
|
||||||
p += print_escape(p);
|
p += print_escape(p);
|
||||||
else
|
else
|
||||||
putchar(*p);
|
putchar(*p);
|
||||||
@@ -1351,18 +1232,15 @@ print_apoint (const char *format, long day, struct apoint *apt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print a formatted event to stdout. */
|
/* Print a formatted event to stdout. */
|
||||||
void
|
void print_event(const char *format, long day, struct event *ev)
|
||||||
print_event (const char *format, long day, struct event *ev)
|
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
char extformat[FS_EXT_MAXLEN];
|
char extformat[FS_EXT_MAXLEN];
|
||||||
|
|
||||||
for (p = format; *p; p++)
|
for (p = format; *p; p++) {
|
||||||
{
|
|
||||||
if (*p == '%') {
|
if (*p == '%') {
|
||||||
p++;
|
p++;
|
||||||
switch (parse_fs (&p, extformat))
|
switch (parse_fs(&p, extformat)) {
|
||||||
{
|
|
||||||
case FS_MESSAGE:
|
case FS_MESSAGE:
|
||||||
printf("%s", ev->mesg);
|
printf("%s", ev->mesg);
|
||||||
break;
|
break;
|
||||||
@@ -1382,8 +1260,7 @@ print_event (const char *format, long day, struct event *ev)
|
|||||||
putchar('?');
|
putchar('?');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else if (*p == '\\')
|
||||||
else if (*p == '\\')
|
|
||||||
p += print_escape(p);
|
p += print_escape(p);
|
||||||
else
|
else
|
||||||
putchar(*p);
|
putchar(*p);
|
||||||
@@ -1406,8 +1283,7 @@ print_recur_apoint (const char *format, long day, unsigned occurrence,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print a formatted recurrent event to stdout. */
|
/* Print a formatted recurrent event to stdout. */
|
||||||
void
|
void print_recur_event(const char *format, long day, struct recur_event *rev)
|
||||||
print_recur_event (const char *format, long day, struct recur_event *rev)
|
|
||||||
{
|
{
|
||||||
struct event ev;
|
struct event ev;
|
||||||
|
|
||||||
@@ -1418,18 +1294,15 @@ print_recur_event (const char *format, long day, struct recur_event *rev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print a formatted todo item to stdout. */
|
/* Print a formatted todo item to stdout. */
|
||||||
void
|
void print_todo(const char *format, struct todo *todo)
|
||||||
print_todo (const char *format, struct todo *todo)
|
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
char extformat[FS_EXT_MAXLEN];
|
char extformat[FS_EXT_MAXLEN];
|
||||||
|
|
||||||
for (p = format; *p; p++)
|
for (p = format; *p; p++) {
|
||||||
{
|
|
||||||
if (*p == '%') {
|
if (*p == '%') {
|
||||||
p++;
|
p++;
|
||||||
switch (parse_fs (&p, extformat))
|
switch (parse_fs(&p, extformat)) {
|
||||||
{
|
|
||||||
case FS_PRIORITY:
|
case FS_PRIORITY:
|
||||||
printf("%d", abs(todo->id));
|
printf("%d", abs(todo->id));
|
||||||
break;
|
break;
|
||||||
@@ -1452,8 +1325,7 @@ print_todo (const char *format, struct todo *todo)
|
|||||||
putchar('?');
|
putchar('?');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else if (*p == '\\')
|
||||||
else if (*p == '\\')
|
|
||||||
p += print_escape(p);
|
p += print_escape(p);
|
||||||
else
|
else
|
||||||
putchar(*p);
|
putchar(*p);
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ int read_only = 0;
|
|||||||
* variables to store calendar names
|
* variables to store calendar names
|
||||||
*/
|
*/
|
||||||
int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||||
|
|
||||||
const char *monthnames[12] = {
|
const char *monthnames[12] = {
|
||||||
N_("January"),
|
N_("January"),
|
||||||
N_("February"),
|
N_("February"),
|
||||||
@@ -120,8 +121,7 @@ struct dmon_conf dmon;
|
|||||||
/*
|
/*
|
||||||
* Variables init
|
* Variables init
|
||||||
*/
|
*/
|
||||||
void
|
void vars_init(void)
|
||||||
vars_init (void)
|
|
||||||
{
|
{
|
||||||
const char *ed, *pg;
|
const char *ed, *pg;
|
||||||
|
|
||||||
|
|||||||
189
src/wins.c
189
src/wins.c
@@ -63,8 +63,7 @@ static int layout;
|
|||||||
*/
|
*/
|
||||||
static pthread_mutex_t screen_mutex = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t screen_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
static unsigned
|
static unsigned screen_acquire(void)
|
||||||
screen_acquire (void)
|
|
||||||
{
|
{
|
||||||
if (pthread_mutex_lock(&screen_mutex) != 0)
|
if (pthread_mutex_lock(&screen_mutex) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -72,14 +71,12 @@ screen_acquire (void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void screen_release(void)
|
||||||
screen_release (void)
|
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&screen_mutex);
|
pthread_mutex_unlock(&screen_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int wins_refresh(void)
|
||||||
wins_refresh (void)
|
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -91,8 +88,7 @@ wins_refresh (void)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int wins_wrefresh(WINDOW * win)
|
||||||
wins_wrefresh (WINDOW *win)
|
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -104,8 +100,7 @@ wins_wrefresh (WINDOW *win)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int wins_doupdate(void)
|
||||||
wins_doupdate (void)
|
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -118,27 +113,23 @@ wins_doupdate (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get the current layout. */
|
/* Get the current layout. */
|
||||||
int
|
int wins_layout(void)
|
||||||
wins_layout (void)
|
|
||||||
{
|
{
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the current layout. */
|
/* Set the current layout. */
|
||||||
void
|
void wins_set_layout(int nb)
|
||||||
wins_set_layout (int nb)
|
|
||||||
{
|
{
|
||||||
layout = nb;
|
layout = nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the current side bar width. */
|
/* Get the current side bar width. */
|
||||||
unsigned
|
unsigned wins_sbar_width(void)
|
||||||
wins_sbar_width (void)
|
|
||||||
{
|
{
|
||||||
if (sbarwidth_perc > SBARMAXWIDTHPERC)
|
if (sbarwidth_perc > SBARMAXWIDTHPERC)
|
||||||
return col * SBARMAXWIDTHPERC / 100;
|
return col * SBARMAXWIDTHPERC / 100;
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
unsigned sbarwidth = (unsigned)(col * sbarwidth_perc / 100);
|
unsigned sbarwidth = (unsigned)(col * sbarwidth_perc / 100);
|
||||||
return (sbarwidth < SBARMINWIDTH) ? SBARMINWIDTH : sbarwidth;
|
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
|
* Return the side bar width in percentage of the total number of columns
|
||||||
* available in calcurse's screen.
|
* available in calcurse's screen.
|
||||||
*/
|
*/
|
||||||
unsigned
|
unsigned wins_sbar_wperc(void)
|
||||||
wins_sbar_wperc (void)
|
|
||||||
{
|
{
|
||||||
return sbarwidth_perc > SBARMAXWIDTHPERC ? SBARMAXWIDTHPERC : sbarwidth_perc;
|
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,
|
* The side bar could not have a width representing more than 50% of the screen,
|
||||||
* and could not be less than SBARMINWIDTH characters.
|
* and could not be less than SBARMINWIDTH characters.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_set_sbar_width(unsigned perc)
|
||||||
wins_set_sbar_width (unsigned perc)
|
|
||||||
{
|
{
|
||||||
sbarwidth_perc = perc;
|
sbarwidth_perc = perc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change the width of the side bar within acceptable boundaries. */
|
/* Change the width of the side bar within acceptable boundaries. */
|
||||||
void
|
void wins_sbar_winc(void)
|
||||||
wins_sbar_winc (void)
|
|
||||||
{
|
{
|
||||||
if (sbarwidth_perc < SBARMAXWIDTHPERC)
|
if (sbarwidth_perc < SBARMAXWIDTHPERC)
|
||||||
sbarwidth_perc++;
|
sbarwidth_perc++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void wins_sbar_wdec(void)
|
||||||
wins_sbar_wdec (void)
|
|
||||||
{
|
{
|
||||||
if (sbarwidth_perc > 0)
|
if (sbarwidth_perc > 0)
|
||||||
sbarwidth_perc--;
|
sbarwidth_perc--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the selected window in calcurse's interface. */
|
/* Initialize the selected window in calcurse's interface. */
|
||||||
void
|
void wins_slctd_init(void)
|
||||||
wins_slctd_init (void)
|
|
||||||
{
|
{
|
||||||
wins_slctd_set(CAL);
|
wins_slctd_set(CAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns an enum which corresponds to the window which is selected. */
|
/* Returns an enum which corresponds to the window which is selected. */
|
||||||
enum win
|
enum win wins_slctd(void)
|
||||||
wins_slctd (void)
|
|
||||||
{
|
{
|
||||||
return slctd_win;
|
return slctd_win;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets the selected window. */
|
/* Sets the selected window. */
|
||||||
void
|
void wins_slctd_set(enum win window)
|
||||||
wins_slctd_set (enum win window)
|
|
||||||
{
|
{
|
||||||
slctd_win = window;
|
slctd_win = window;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TAB key was hit in the interface, need to select next window. */
|
/* TAB key was hit in the interface, need to select next window. */
|
||||||
void
|
void wins_slctd_next(void)
|
||||||
wins_slctd_next (void)
|
|
||||||
{
|
{
|
||||||
if (slctd_win == TOD)
|
if (slctd_win == TOD)
|
||||||
slctd_win = CAL;
|
slctd_win = CAL;
|
||||||
@@ -212,8 +195,7 @@ wins_slctd_next (void)
|
|||||||
slctd_win++;
|
slctd_win++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void wins_init_panels(void)
|
||||||
wins_init_panels (void)
|
|
||||||
{
|
{
|
||||||
win[CAL].p = newwin(CALHEIGHT, wins_sbar_width(), win[CAL].y, win[CAL].x);
|
win[CAL].p = newwin(CALHEIGHT, wins_sbar_width(), win[CAL].y, win[CAL].x);
|
||||||
wins_show(win[CAL].p, _("Calendar"));
|
wins_show(win[CAL].p, _("Calendar"));
|
||||||
@@ -233,8 +215,7 @@ wins_init_panels (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create all the windows. */
|
/* Create all the windows. */
|
||||||
void
|
void wins_init(void)
|
||||||
wins_init (void)
|
|
||||||
{
|
{
|
||||||
wins_init_panels();
|
wins_init_panels();
|
||||||
win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
win[STA].p = newwin(win[STA].h, win[STA].w, win[STA].y, win[STA].x);
|
||||||
@@ -249,8 +230,7 @@ wins_init (void)
|
|||||||
* Create a new window and its associated pad, which is used to make the
|
* Create a new window and its associated pad, which is used to make the
|
||||||
* scrolling faster.
|
* scrolling faster.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_scrollwin_init(struct scrollwin *sw)
|
||||||
wins_scrollwin_init (struct scrollwin *sw)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(sw == NULL, "null pointer");
|
EXIT_IF(sw == NULL, "null pointer");
|
||||||
sw->win.p = newwin(sw->win.h, sw->win.w, sw->win.y, sw->win.x);
|
sw->win.p = newwin(sw->win.h, sw->win.w, sw->win.y, sw->win.x);
|
||||||
@@ -260,8 +240,7 @@ wins_scrollwin_init (struct scrollwin *sw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free an already created scrollwin. */
|
/* Free an already created scrollwin. */
|
||||||
void
|
void wins_scrollwin_delete(struct scrollwin *sw)
|
||||||
wins_scrollwin_delete (struct scrollwin *sw)
|
|
||||||
{
|
{
|
||||||
EXIT_IF(sw == NULL, "null pointer");
|
EXIT_IF(sw == NULL, "null pointer");
|
||||||
delwin(sw->win.p);
|
delwin(sw->win.p);
|
||||||
@@ -269,13 +248,11 @@ wins_scrollwin_delete (struct scrollwin *sw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Display a scrolling window. */
|
/* Display a scrolling window. */
|
||||||
void
|
void wins_scrollwin_display(struct scrollwin *sw)
|
||||||
wins_scrollwin_display (struct scrollwin *sw)
|
|
||||||
{
|
{
|
||||||
const int visible_lines = sw->win.h - sw->pad.y - 1;
|
const int visible_lines = sw->win.h - sw->pad.y - 1;
|
||||||
|
|
||||||
if (sw->total_lines > visible_lines)
|
if (sw->total_lines > visible_lines) {
|
||||||
{
|
|
||||||
float ratio = ((float)visible_lines) / ((float)sw->total_lines);
|
float ratio = ((float)visible_lines) / ((float)sw->total_lines);
|
||||||
int sbar_length = (int)(ratio * visible_lines);
|
int sbar_length = (int)(ratio * visible_lines);
|
||||||
int highend = (int)(ratio * sw->first_visible_line);
|
int highend = (int)(ratio * sw->first_visible_line);
|
||||||
@@ -293,23 +270,19 @@ wins_scrollwin_display (struct scrollwin *sw)
|
|||||||
wins_doupdate();
|
wins_doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void wins_scrollwin_up(struct scrollwin *sw, int amount)
|
||||||
wins_scrollwin_up (struct scrollwin *sw, int amount)
|
|
||||||
{
|
{
|
||||||
if (sw->first_visible_line > 0)
|
if (sw->first_visible_line > 0)
|
||||||
sw->first_visible_line -= amount;
|
sw->first_visible_line -= amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void wins_scrollwin_down(struct scrollwin *sw, int amount)
|
||||||
wins_scrollwin_down (struct scrollwin *sw, int amount)
|
|
||||||
{
|
{
|
||||||
if (sw->total_lines
|
if (sw->total_lines > (sw->first_visible_line + sw->win.h - sw->pad.y - 1))
|
||||||
> (sw->first_visible_line + sw->win.h - sw->pad.y - 1))
|
|
||||||
sw->first_visible_line += amount;
|
sw->first_visible_line += amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void wins_reinit_panels(void)
|
||||||
wins_reinit_panels (void)
|
|
||||||
{
|
{
|
||||||
delwin(win[CAL].p);
|
delwin(win[CAL].p);
|
||||||
delwin(win[APP].p);
|
delwin(win[APP].p);
|
||||||
@@ -323,8 +296,7 @@ wins_reinit_panels (void)
|
|||||||
* Delete the existing windows and recreate them with their new
|
* Delete the existing windows and recreate them with their new
|
||||||
* size and placement.
|
* size and placement.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_reinit(void)
|
||||||
wins_reinit (void)
|
|
||||||
{
|
{
|
||||||
delwin(win[CAL].p);
|
delwin(win[CAL].p);
|
||||||
delwin(win[APP].p);
|
delwin(win[APP].p);
|
||||||
@@ -338,8 +310,7 @@ wins_reinit (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Show the window with a border and a label. */
|
/* Show the window with a border and a label. */
|
||||||
void
|
void wins_show(WINDOW * win, const char *label)
|
||||||
wins_show (WINDOW *win, const char *label)
|
|
||||||
{
|
{
|
||||||
int width = getmaxx(win);
|
int width = getmaxx(win);
|
||||||
|
|
||||||
@@ -354,8 +325,7 @@ wins_show (WINDOW *win, const char *label)
|
|||||||
/*
|
/*
|
||||||
* Get the screen size and recalculate the windows configurations.
|
* Get the screen size and recalculate the windows configurations.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_get_config(void)
|
||||||
wins_get_config (void)
|
|
||||||
{
|
{
|
||||||
/* Get the screen configuration */
|
/* Get the screen configuration */
|
||||||
getmaxyx(stdscr, row, col);
|
getmaxyx(stdscr, row, col);
|
||||||
@@ -366,15 +336,12 @@ wins_get_config (void)
|
|||||||
win[STA].y = row - win[STA].h;
|
win[STA].y = row - win[STA].h;
|
||||||
win[STA].x = 0;
|
win[STA].x = 0;
|
||||||
|
|
||||||
if (notify_bar ())
|
if (notify_bar()) {
|
||||||
{
|
|
||||||
win[NOT].h = 1;
|
win[NOT].h = 1;
|
||||||
win[NOT].w = col;
|
win[NOT].w = col;
|
||||||
win[NOT].y = win[STA].y - 1;
|
win[NOT].y = win[STA].y - 1;
|
||||||
win[NOT].x = 0;
|
win[NOT].x = 0;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
win[NOT].h = 0;
|
win[NOT].h = 0;
|
||||||
win[NOT].w = 0;
|
win[NOT].w = 0;
|
||||||
win[NOT].y = 0;
|
win[NOT].y = 0;
|
||||||
@@ -384,15 +351,12 @@ wins_get_config (void)
|
|||||||
win[CAL].w = wins_sbar_width();
|
win[CAL].w = wins_sbar_width();
|
||||||
win[CAL].h = CALHEIGHT;
|
win[CAL].h = CALHEIGHT;
|
||||||
|
|
||||||
if (layout <= 4)
|
if (layout <= 4) { /* APPOINTMENT is the biggest panel */
|
||||||
{ /* APPOINTMENT is the biggest panel */
|
|
||||||
win[APP].w = col - win[CAL].w;
|
win[APP].w = col - win[CAL].w;
|
||||||
win[APP].h = row - (win[STA].h + win[NOT].h);
|
win[APP].h = row - (win[STA].h + win[NOT].h);
|
||||||
win[TOD].w = win[CAL].w;
|
win[TOD].w = win[CAL].w;
|
||||||
win[TOD].h = row - (win[CAL].h + win[STA].h + win[NOT].h);
|
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].w = col - win[CAL].w;
|
||||||
win[TOD].h = row - (win[STA].h + win[NOT].h);
|
win[TOD].h = row - (win[STA].h + win[NOT].h);
|
||||||
win[APP].w = win[CAL].w;
|
win[APP].w = win[CAL].w;
|
||||||
@@ -400,8 +364,7 @@ wins_get_config (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* defining the layout */
|
/* defining the layout */
|
||||||
switch (layout)
|
switch (layout) {
|
||||||
{
|
|
||||||
case 1:
|
case 1:
|
||||||
win[APP].y = 0;
|
win[APP].y = 0;
|
||||||
win[APP].x = 0;
|
win[APP].x = 0;
|
||||||
@@ -470,79 +433,61 @@ wins_get_config (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* draw panel border in color */
|
/* draw panel border in color */
|
||||||
static void
|
static void border_color(WINDOW * window)
|
||||||
border_color (WINDOW *window)
|
|
||||||
{
|
{
|
||||||
int color_attr = A_BOLD;
|
int color_attr = A_BOLD;
|
||||||
int no_color_attr = A_BOLD;
|
int no_color_attr = A_BOLD;
|
||||||
|
|
||||||
if (colorize)
|
if (colorize) {
|
||||||
{
|
|
||||||
wattron(window, color_attr | COLOR_PAIR(COLR_CUSTOM));
|
wattron(window, color_attr | COLOR_PAIR(COLR_CUSTOM));
|
||||||
box(window, 0, 0);
|
box(window, 0, 0);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
wattron(window, no_color_attr);
|
wattron(window, no_color_attr);
|
||||||
box(window, 0, 0);
|
box(window, 0, 0);
|
||||||
}
|
}
|
||||||
if (colorize)
|
if (colorize) {
|
||||||
{
|
|
||||||
wattroff(window, color_attr | COLOR_PAIR(COLR_CUSTOM));
|
wattroff(window, color_attr | COLOR_PAIR(COLR_CUSTOM));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
wattroff(window, no_color_attr);
|
wattroff(window, no_color_attr);
|
||||||
}
|
}
|
||||||
wnoutrefresh(window);
|
wnoutrefresh(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw panel border without any color */
|
/* draw panel border without any color */
|
||||||
static void
|
static void border_nocolor(WINDOW * window)
|
||||||
border_nocolor (WINDOW *window)
|
|
||||||
{
|
{
|
||||||
int color_attr = A_BOLD;
|
int color_attr = A_BOLD;
|
||||||
int no_color_attr = A_DIM;
|
int no_color_attr = A_DIM;
|
||||||
|
|
||||||
if (colorize)
|
if (colorize) {
|
||||||
{
|
|
||||||
wattron(window, color_attr | COLOR_PAIR(COLR_DEFAULT));
|
wattron(window, color_attr | COLOR_PAIR(COLR_DEFAULT));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
wattron(window, no_color_attr);
|
wattron(window, no_color_attr);
|
||||||
}
|
}
|
||||||
box(window, 0, 0);
|
box(window, 0, 0);
|
||||||
if (colorize)
|
if (colorize) {
|
||||||
{
|
|
||||||
wattroff(window, color_attr | COLOR_PAIR(COLR_DEFAULT));
|
wattroff(window, color_attr | COLOR_PAIR(COLR_DEFAULT));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
wattroff(window, no_color_attr);
|
wattroff(window, no_color_attr);
|
||||||
}
|
}
|
||||||
wnoutrefresh(window);
|
wnoutrefresh(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void wins_update_border(int flags)
|
||||||
wins_update_border (int flags)
|
|
||||||
{
|
|
||||||
if (flags & FLAG_CAL)
|
|
||||||
{
|
{
|
||||||
|
if (flags & FLAG_CAL) {
|
||||||
if (slctd_win == CAL)
|
if (slctd_win == CAL)
|
||||||
border_color(win[CAL].p);
|
border_color(win[CAL].p);
|
||||||
else
|
else
|
||||||
border_nocolor(win[CAL].p);
|
border_nocolor(win[CAL].p);
|
||||||
}
|
}
|
||||||
if (flags & FLAG_APP)
|
if (flags & FLAG_APP) {
|
||||||
{
|
|
||||||
if (slctd_win == APP)
|
if (slctd_win == APP)
|
||||||
border_color(win[APP].p);
|
border_color(win[APP].p);
|
||||||
else
|
else
|
||||||
border_nocolor(win[APP].p);
|
border_nocolor(win[APP].p);
|
||||||
}
|
}
|
||||||
if (flags & FLAG_TOD)
|
if (flags & FLAG_TOD) {
|
||||||
{
|
|
||||||
if (slctd_win == TOD)
|
if (slctd_win == TOD)
|
||||||
border_color(win[TOD].p);
|
border_color(win[TOD].p);
|
||||||
else
|
else
|
||||||
@@ -550,8 +495,7 @@ wins_update_border (int flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void wins_update_panels(int flags)
|
||||||
wins_update_panels (int flags)
|
|
||||||
{
|
{
|
||||||
if (flags & FLAG_APP)
|
if (flags & FLAG_APP)
|
||||||
apoint_update_panel(slctd_win);
|
apoint_update_panel(slctd_win);
|
||||||
@@ -565,8 +509,7 @@ wins_update_panels (int flags)
|
|||||||
* Update all of the three windows and put a border around the
|
* Update all of the three windows and put a border around the
|
||||||
* selected window.
|
* selected window.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_update(int flags)
|
||||||
wins_update (int flags)
|
|
||||||
{
|
{
|
||||||
wins_update_border(flags);
|
wins_update_border(flags);
|
||||||
wins_update_panels(flags);
|
wins_update_panels(flags);
|
||||||
@@ -579,8 +522,7 @@ wins_update (int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reset the screen, needed when resizing terminal for example. */
|
/* Reset the screen, needed when resizing terminal for example. */
|
||||||
void
|
void wins_reset(void)
|
||||||
wins_reset (void)
|
|
||||||
{
|
{
|
||||||
endwin();
|
endwin();
|
||||||
wins_refresh();
|
wins_refresh();
|
||||||
@@ -590,8 +532,7 @@ wins_reset (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare windows for the execution of an external command. */
|
/* Prepare windows for the execution of an external command. */
|
||||||
void
|
void wins_prepare_external(void)
|
||||||
wins_prepare_external (void)
|
|
||||||
{
|
{
|
||||||
if (notify_bar())
|
if (notify_bar())
|
||||||
notify_stop_main_thread();
|
notify_stop_main_thread();
|
||||||
@@ -603,8 +544,7 @@ wins_prepare_external (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Restore windows when returning from an external command. */
|
/* Restore windows when returning from an external command. */
|
||||||
void
|
void wins_unprepare_external(void)
|
||||||
wins_unprepare_external (void)
|
|
||||||
{
|
{
|
||||||
reset_prog_mode();
|
reset_prog_mode();
|
||||||
clearok(curscr, TRUE);
|
clearok(curscr, TRUE);
|
||||||
@@ -619,8 +559,7 @@ wins_unprepare_external (void)
|
|||||||
* While inside interactive mode, launch the external command cmd on the given
|
* While inside interactive mode, launch the external command cmd on the given
|
||||||
* file.
|
* file.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_launch_external(const char *file, const char *cmd)
|
||||||
wins_launch_external (const char *file, const char *cmd)
|
|
||||||
{
|
{
|
||||||
const char *arg[] = { cmd, file, NULL };
|
const char *arg[] = { cmd, file, NULL };
|
||||||
int pid;
|
int pid;
|
||||||
@@ -643,8 +582,7 @@ static unsigned status_page;
|
|||||||
* table, and update the NB_CAL_CMDS, NB_APP_CMDS or NB_TOD_CMDS defines,
|
* 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.
|
* depending on which panel the added keybind is assigned to.
|
||||||
*/
|
*/
|
||||||
void
|
void wins_status_bar(void)
|
||||||
wins_status_bar (void)
|
|
||||||
{
|
{
|
||||||
struct binding help = { _("Help"), KEY_GENERIC_HELP };
|
struct binding help = { _("Help"), KEY_GENERIC_HELP };
|
||||||
struct binding quit = { _("Quit"), KEY_GENERIC_QUIT };
|
struct binding quit = { _("Quit"), KEY_GENERIC_QUIT };
|
||||||
@@ -708,8 +646,7 @@ wins_status_bar (void)
|
|||||||
struct binding **bindings;
|
struct binding **bindings;
|
||||||
int bindings_size;
|
int bindings_size;
|
||||||
|
|
||||||
switch (active_panel)
|
switch (active_panel) {
|
||||||
{
|
|
||||||
case CAL:
|
case CAL:
|
||||||
bindings = bindings_cal;
|
bindings = bindings_cal;
|
||||||
bindings_size = sizeof(bindings_cal) / sizeof(bindings_cal[0]);
|
bindings_size = sizeof(bindings_cal) / sizeof(bindings_cal[0]);
|
||||||
@@ -733,20 +670,17 @@ wins_status_bar (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Erase status bar. */
|
/* Erase status bar. */
|
||||||
void
|
void wins_erase_status_bar(void)
|
||||||
wins_erase_status_bar (void)
|
|
||||||
{
|
{
|
||||||
erase_window_part(win[STA].p, 0, 0, col, STATUSHEIGHT);
|
erase_window_part(win[STA].p, 0, 0, col, STATUSHEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the status bar page number to display other commands. */
|
/* Update the status bar page number to display other commands. */
|
||||||
void
|
void wins_other_status_page(int panel)
|
||||||
wins_other_status_page (int panel)
|
|
||||||
{
|
{
|
||||||
int nb_item, max_page;
|
int nb_item, max_page;
|
||||||
|
|
||||||
switch (panel)
|
switch (panel) {
|
||||||
{
|
|
||||||
case CAL:
|
case CAL:
|
||||||
nb_item = NB_CAL_CMDS;
|
nb_item = NB_CAL_CMDS;
|
||||||
break;
|
break;
|
||||||
@@ -765,8 +699,7 @@ wins_other_status_page (int panel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reset the status bar page. */
|
/* Reset the status bar page. */
|
||||||
void
|
void wins_reset_status_page(void)
|
||||||
wins_reset_status_page (void)
|
|
||||||
{
|
{
|
||||||
status_page = 1;
|
status_page = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,18 +60,15 @@ fork_exec (int *pfdin, int *pfdout, const char *path, char *const *arg)
|
|||||||
if (pfdout && (pipe(pout) == -1))
|
if (pfdout && (pipe(pout) == -1))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((pid = fork ()) == 0)
|
if ((pid = fork()) == 0) {
|
||||||
{
|
if (pfdout) {
|
||||||
if (pfdout)
|
|
||||||
{
|
|
||||||
if (dup2(pout[0], STDIN_FILENO) < 0)
|
if (dup2(pout[0], STDIN_FILENO) < 0)
|
||||||
_exit(127);
|
_exit(127);
|
||||||
close(pout[0]);
|
close(pout[0]);
|
||||||
close(pout[1]);
|
close(pout[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfdin)
|
if (pfdin) {
|
||||||
{
|
|
||||||
if (dup2(pin[1], STDOUT_FILENO) < 0)
|
if (dup2(pin[1], STDOUT_FILENO) < 0)
|
||||||
_exit(127);
|
_exit(127);
|
||||||
close(pin[0]);
|
close(pin[0]);
|
||||||
@@ -80,29 +77,22 @@ fork_exec (int *pfdin, int *pfdout, const char *path, char *const *arg)
|
|||||||
|
|
||||||
execvp(path, arg);
|
execvp(path, arg);
|
||||||
_exit(127);
|
_exit(127);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pfdin)
|
if (pfdin)
|
||||||
close(pin[1]);
|
close(pin[1]);
|
||||||
if (pfdout)
|
if (pfdout)
|
||||||
close(pout[0]);
|
close(pout[0]);
|
||||||
|
|
||||||
if (pid > 0)
|
if (pid > 0) {
|
||||||
{
|
if (pfdin) {
|
||||||
if (pfdin)
|
|
||||||
{
|
|
||||||
fcntl(pin[0], F_SETFD, FD_CLOEXEC);
|
fcntl(pin[0], F_SETFD, FD_CLOEXEC);
|
||||||
*pfdin = pin[0];
|
*pfdin = pin[0];
|
||||||
}
|
}
|
||||||
if (pfdout)
|
if (pfdout) {
|
||||||
{
|
|
||||||
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
|
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
|
||||||
*pfdout = pout[1];
|
*pfdout = pout[1];
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pfdin)
|
if (pfdin)
|
||||||
close(pin[0]);
|
close(pin[0]);
|
||||||
if (pfdout)
|
if (pfdout)
|
||||||
@@ -114,8 +104,7 @@ fork_exec (int *pfdin, int *pfdout, const char *path, char *const *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for a child process to terminate. */
|
/* Wait for a child process to terminate. */
|
||||||
static int
|
static int child_wait(int *pfdin, int *pfdout, int pid)
|
||||||
child_wait (int *pfdin, int *pfdout, int pid)
|
|
||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
@@ -129,8 +118,7 @@ child_wait (int *pfdin, int *pfdout, int pid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print error message and bail out. */
|
/* Print error message and bail out. */
|
||||||
static void
|
static void die(const char *format, ...)
|
||||||
die (const char *format, ...)
|
|
||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
|
|
||||||
@@ -143,15 +131,13 @@ die (const char *format, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print usage message. */
|
/* Print usage message. */
|
||||||
static void
|
static void usage(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. */
|
/* Run test with a specific name. */
|
||||||
static int
|
static int run_test(const char *name, int expect_failure)
|
||||||
run_test (const char *name, int expect_failure)
|
|
||||||
{
|
{
|
||||||
char filename[BUFSIZ];
|
char filename[BUFSIZ];
|
||||||
char *arg1[3], *arg2[3];
|
char *arg1[3], *arg2[3];
|
||||||
@@ -163,8 +149,7 @@ run_test (const char *name, int expect_failure)
|
|||||||
if (snprintf(filename, BUFSIZ, "./%s", name) >= BUFSIZ)
|
if (snprintf(filename, BUFSIZ, "./%s", name) >= BUFSIZ)
|
||||||
die("file name too long\n");
|
die("file name too long\n");
|
||||||
|
|
||||||
if (access (filename, F_OK) != 0)
|
if (access(filename, F_OK) != 0) {
|
||||||
{
|
|
||||||
if (snprintf(filename, BUFSIZ, "./%s.sh", name) >= BUFSIZ)
|
if (snprintf(filename, BUFSIZ, "./%s.sh", name) >= BUFSIZ)
|
||||||
die("file name too long\n");
|
die("file name too long\n");
|
||||||
|
|
||||||
@@ -191,10 +176,8 @@ run_test (const char *name, int expect_failure)
|
|||||||
fpin1 = fdopen(pin1, "r");
|
fpin1 = fdopen(pin1, "r");
|
||||||
fpin2 = fdopen(pin2, "r");
|
fpin2 = fdopen(pin2, "r");
|
||||||
|
|
||||||
while (fgets (buf1, BUFSIZ, fpin1))
|
while (fgets(buf1, BUFSIZ, fpin1)) {
|
||||||
{
|
if (!fgets(buf2, BUFSIZ, fpin2) || strcmp(buf1, buf2) != 0) {
|
||||||
if (!fgets (buf2, BUFSIZ, fpin2) || strcmp (buf1, buf2) != 0)
|
|
||||||
{
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -221,28 +204,22 @@ run_test (const char *name, int expect_failure)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int main(int argc, char **argv)
|
||||||
main (int argc, char **argv)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!argv[1])
|
if (!argv[1])
|
||||||
die("no tests specified, bailing out\n");
|
die("no tests specified, bailing out\n");
|
||||||
else if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "--help") == 0)
|
else if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
|
||||||
{
|
|
||||||
usage();
|
usage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++) {
|
||||||
{
|
if (*argv[i] == '!') {
|
||||||
if (*argv[i] == '!')
|
|
||||||
{
|
|
||||||
if (!run_test(argv[i] + 1, 1))
|
if (!run_test(argv[i] + 1, 1))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!run_test(argv[i], 0))
|
if (!run_test(argv[i], 0))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user