static todo_t todos[6];
/* Event functions */
-event_t *dummy_events(cal_t *cal, year_t year, month_t month, day_t day, int days)
+event_t *dummy_events(date_t start, date_t end)
{
for (int i = 0; i < N_ELEMENTS(events); i++) {
date_t *s = &events[i].start;
}
/* Todo functions */
-todo_t *dummy_todos(cal_t *cal, year_t year, month_t month, day_t day, int days)
+todo_t *dummy_todos(date_t start, date_t end)
{
for (int i = 0; i < N_ELEMENTS(todos); i++) {
todos[i] = todo;
};
}
+static icaltimetype to_itime(date_t time)
+{
+ return (struct icaltimetype){
+ .year = time.year,
+ .month = time.month + 1,
+ .day = time.day + 1,
+ .hour = time.hour,
+ .minute = time.min
+ };
+}
+
static void add_recur(icalarray *array, icalcomponent *comp,
icaltimetype start, icaltimetype end,
icalcomponent_kind which)
}
/* Event functions */
-event_t *ical_events(cal_t *cal, year_t year, month_t month, day_t day, int days)
+event_t *ical_events(date_t _start, date_t _end)
{
read_icals();
+ icaltimetype start = to_itime(_start);
+ icaltimetype end = to_itime(_end);
icalarray *array = icalarray_new(sizeof(ical_inst), 1);
- icaltimetype start = {.year = year-10};
- icaltimetype end = {.year = year+10};
for (ical_t *cal = calendars; cal; cal = cal->next)
add_recur(array, cal->ical, start, end, ICAL_VEVENT_COMPONENT);
icalarray_sort(array, ical_compare);
}
/* Todo functions */
-todo_t *ical_todos(cal_t *cal, year_t year, month_t month, day_t day, int days)
+todo_t *ical_todos(date_t _start, date_t _end)
{
read_icals();
+ icaltimetype start = to_itime(_start);
+ icaltimetype end = to_itime(_end);
icalarray *array = icalarray_new(sizeof(ical_inst), 1);
- icaltimetype start = {.year = year-10};
- icaltimetype end = {.year = year+10};
for (ical_t *cal = calendars; cal; cal = cal->next)
add_recur(array, cal->ical, start, end, ICAL_VTODO_COMPONENT);
icalarray_sort(array, ical_compare);
/* Macros */
#define CAL(name) \
- event_t *name##_events(cal_t *cal, year_t year, month_t month, day_t day, int days); \
- todo_t *name##_todos(cal_t *cal, year_t year, month_t month, day_t day, int days)
+ event_t *name##_events(date_t start, date_t end); \
+ todo_t *name##_todos(date_t start, date_t end)
/* Prototypes */
CAL(dummy);
CAL(ical);
-event_t *cal_events(year_t year, month_t month, day_t day, int days);
-todo_t *cal_todos(year_t year, month_t month, day_t day, int days);
-
/* Global data */
event_t *EVENTS;
todo_t *TODOS;
+/* Local data */
+static date_t start;
+static date_t end;
+
/* Merge events and todos */
static void add_event(event_t **first, event_t **last, event_t **next)
{
/* Initialize */
void cal_init(void)
{
- EVENTS = cal_events(2012, JAN, 0, 366);
- TODOS = cal_todos(2012, JAN, 0, 366);
+ /* Load a year's worth of data */
+ cal_load(YEAR-1, DEC, 31-7, 366+7+7);
/* Debug */
for (event_t *e = EVENTS; e; e = e->next)
e->start.hour, e->start.min, e->name, e->desc);
}
-/* Get events */
-event_t *cal_events(year_t year, month_t month, day_t day, int days)
+/* Load events and todos */
+void cal_load(year_t year, month_t month, day_t day, int days)
{
- event_t *dummy = dummy_events(0, year, month, day, days);
- event_t *ical = ical_events(0, year, month, day, days);
- return merge_events(dummy, ical);
-}
+ year_t eyear = year;
+ month_t emonth = month;
+ day_t eday = day;
+ add_days(&eyear, &emonth, &eday, days);
+
+ /* Skip if we already loaded enough info */
+ if (!before(&start, year, month, day, 0, 0) &&
+ before(&end, eyear, emonth, eday, 24, 0))
+ return;
+
+ /* Free uneeded data */
+ // TODO
+
+ /* Push dates out a bit to avoid reloading,
+ * enough to at least cover the current year */
+ add_days(&year, &month, &day, -366);
+ add_days(&eyear, &emonth, &eday, 366);
+ start = (date_t){year, month, day};
+ end = (date_t){eyear, emonth, eday};
+
+ /* Load events */
+ EVENTS = merge_events(
+ dummy_events(start, end),
+ ical_events(start, end));
+
+ /* Load todos */
+ TODOS = merge_todos(
+ dummy_todos(start, end),
+ ical_todos(start, end));
-/* Get todos */
-todo_t *cal_todos(year_t year, month_t month, day_t day, int days)
-{
- todo_t *dummy = dummy_todos(0, year, month, day, days);
- todo_t *ical = ical_todos(0, year, month, day, days);
- return merge_todos(dummy, ical);
}
/* Calendar functions */
void cal_init(void);
+void cal_load(year_t year, month_t month, day_t day, int days);
/* Test fuctions */
void ical_test(void);
int y = !COMPACT+1;
event_t *event;
+ /* Load cal data */
+ cal_load(YEAR, MONTH, DAY, 1);
+
/* Print Header */
if (COMPACT) wattron(win, A_REVERSE | A_BOLD);
mvwhline(win, 0, 0, ' ', COLS);
date_t cur = {YEAR, MONTH, DAY-1, 0, 0};
date_t end = {YEAR, MONTH, DAY, 24, 0};
add_days(&end.year, &end.month, &end.day, days);
+ cal_load(YEAR, MONTH, DAY, days);
int row = 0;
int count = 0;
const float hstep = (float)(COLS-1)/7.0;
const float vstep = (float)(LINES-2-hdr+COMPACT)/weeks;
+ /* Load cal data */
+ cal_load(YEAR, MONTH, 0, days);
+
/* Print Header */
if (COMPACT) wattron(win, A_REVERSE | A_BOLD);
if (COMPACT) mvwhline(win, 0, 0, ' ' | A_REVERSE | A_BOLD, COLS);
int shift = day_of_week(year, month, day);
add_days(&year, &month, &day, -shift);
+ /* Load cal data */
+ cal_load(year, month, day, 7);
+
/* For today */
int l = ROUND((shift+0)*hstep);
int r = ROUND((shift+1)*hstep);
int y = 0;
int h[4] = {};
+ /* Load cal data */
+ cal_load(YEAR, 0, 0, 366);
+
/* Determine heights */
for (int m = 0; m < 12; m++) {
int weeks = weeks_in_month(YEAR, m);