ical_cals());
/* Load data */
- cal_load(YEAR, MONTH, DAY, 1);
+ cal_load(SEL.year, SEL.month, SEL.day, 1);
/* Debug */
#ifdef DEBUG_CALS
#include "date.h"
/* Global data */
-year_t YEAR;
-month_t MONTH;
-day_t DAY;
+date_t SEL;
/* Initialize */
void date_init(void)
time_t sec = time(NULL);
struct tm *tm = localtime(&sec);
- YEAR = tm->tm_year+1900;
- MONTH = tm->tm_mon;
- DAY = tm->tm_mday-1;
+ SEL.year = tm->tm_year+1900;
+ SEL.month = tm->tm_mon;
+ SEL.day = tm->tm_mday-1;
}
/* Time functions */
} date_t;
/* Global data */
-extern year_t YEAR;
-extern month_t MONTH;
-extern day_t DAY;
+extern date_t SEL; // date and time the user is looking at
/* Initialize */
void date_init(void);
/* Day draw */
void day_draw(void)
{
- const char *mstr = month_to_string(MONTH);
- const char *dstr = day_to_string(day_of_week(YEAR, MONTH, DAY));
+ const char *mstr = month_to_string(SEL.month);
+ const char *dstr = day_to_string(day_of_week(SEL.year, SEL.month, SEL.day));
int y = !COMPACT+1;
event_t *event;
/* Load cal data */
- cal_load(YEAR, MONTH, DAY, 1);
+ cal_load(SEL.year, SEL.month, SEL.day, 1);
/* Print Header */
if (COMPACT) wattron(win, A_REVERSE | A_BOLD);
mvwhline(win, 0, 0, ' ', COLS);
- mvwprintw(win, 0, 0, "%s, %s %d", dstr, mstr, DAY+1);
- mvwprintw(win, 0, COLS-10, "%d-%02d-%02d", YEAR, MONTH, DAY+1);
+ mvwprintw(win, 0, 0, "%s, %s %d", dstr, mstr, SEL.day+1);
+ mvwprintw(win, 0, COLS-10, "%d-%02d-%02d", SEL.year, SEL.month, SEL.day+1);
if (COMPACT) wattroff(win, A_REVERSE | A_BOLD);
/* Print all day events */
event = EVENTS;
int allday = 0;
- while (event && before(&event->start, YEAR, MONTH, DAY, 24, 0)) {
- if (!before(&event->end, YEAR, MONTH, DAY, 0, 1) &&
+ while (event && before(&event->start, SEL.year, SEL.month, SEL.day, 24, 0)) {
+ if (!before(&event->end, SEL.year, SEL.month, SEL.day, 0, 1) &&
get_mins(&event->start, &event->end) > 23*60)
event_line(win, event, y+allday++, 6, COLS, SHOW_DETAILS);
event = event->next;
for (int h = 0; h < 24; h++)
for (int m = 0; m < 60; m+=15)
while (event && before(&event->start,
- YEAR, MONTH, DAY, h+(m+15)/60, (m+15)%60)) {
- if (!before(&event->start, YEAR, MONTH, DAY, h, m) &&
+ SEL.year, SEL.month, SEL.day, h+(m+15)/60, (m+15)%60)) {
+ if (!before(&event->start, SEL.year, SEL.month, SEL.day, h, m) &&
get_mins(&event->start, &event->end) <= 23*60) {
int col = get_col(active, N_ELEMENTS(active), event, &ncols);
int left = ROUND((col+0.0)*(COLS-6)/ncols) + 1;
}
line = CLAMP(line, 0, 24*4);
if (days)
- add_days(&YEAR, &MONTH, &DAY, days);
+ add_days(&SEL.year, &SEL.month, &SEL.day, days);
if (ref) {
werase(win);
day_draw();
int days = 2*7;
int min = 12;
- date_t start = {YEAR, MONTH, DAY, 0, 0};
- date_t cur = {YEAR, MONTH, DAY-1, 0, 0};
- date_t end = {YEAR, MONTH, DAY, 24, 0};
+ date_t start = {SEL.year, SEL.month, SEL.day, 0, 0};
+ date_t cur = {SEL.year, SEL.month, SEL.day-1, 0, 0};
+ date_t end = {SEL.year, SEL.month, SEL.day, 24, 0};
add_days(&end.year, &end.month, &end.day, days);
- cal_load(YEAR, MONTH, DAY, days);
+ cal_load(SEL.year, SEL.month, SEL.day, days);
int row = 0;
int count = 0;
/* Month draw */
void month_draw(void)
{
- const char *name = month_to_string(MONTH);
- const int start = start_of_month(YEAR, MONTH);
- const int days = days_in_month(YEAR, MONTH);
- const int weeks = weeks_in_month(YEAR, MONTH);
+ const char *name = month_to_string(SEL.month);
+ const int start = start_of_month(SEL.year, SEL.month);
+ const int days = days_in_month(SEL.year, SEL.month);
+ const int weeks = weeks_in_month(SEL.year, SEL.month);
const int hdr = COMPACT ? 3 : 4;
const float midpt = (float)COLS/2.0 - (strlen(name) + 1 + 4)/2.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);
+ cal_load(SEL.year, SEL.month, 0, days);
/* Print Header */
if (COMPACT) wattron(win, A_REVERSE | A_BOLD);
if (COMPACT) mvwhline(win, 0, 0, ' ' | A_REVERSE | A_BOLD, COLS);
if (COMPACT) mvwhline(win, 1, 0, ' ' | A_REVERSE | A_BOLD, COLS);
- mvwprintw(win, 0, midpt, "%s %d", name, YEAR);
+ mvwprintw(win, 0, midpt, "%s %d", name, SEL.year);
for (int d = 0; d < 7; d++) {
const char *str = hstep >= 10 ? day_to_string(d+SUN) : day_to_str(d+SUN);
mvwprintw(win, 1, ROUND(1+d*hstep), "%s", str);
for (int d = 0; d < days; d++) {
int row = (start + d) / 7;
int col = (start + d) % 7;
- if (d == DAY) wattron(win, A_BOLD);
+ if (d == SEL.day) wattron(win, A_BOLD);
mvwprintw(win, ROUND(hdr+row*vstep), ROUND(1+col*hstep), "%d", d+1);
- if (d == DAY) wattroff(win, A_BOLD);
+ if (d == SEL.day) wattroff(win, A_BOLD);
}
/* Print events */
int e = ROUND(hdr+(((start + d) / 7)+1)*vstep)-2;
int x = ROUND(1 +(((start + d) % 7) )*hstep)+3;
int w = ROUND(1 +(((start + d) % 7)+1)*hstep)-x-1;
- while (event && before(&event->start, YEAR, MONTH, d, 24, 0)) {
- if (!before(&event->start, YEAR, MONTH, d, 0, 0)){
+ while (event && before(&event->start, SEL.year, SEL.month, d, 24, 0)) {
+ if (!before(&event->start, SEL.year, SEL.month, d, 0, 0)){
if (y == e) mvwhline(win, y, x-3, ACS_DARROW, 2);
if (y <= e) event_line(win, event, y, x, w, 0);
y++;
}
/* Draw today */
- int col = day_of_week(YEAR, MONTH, DAY);
- int row = (start+DAY) / 7;
+ int col = day_of_week(SEL.year, SEL.month, SEL.day);
+ int row = (start+SEL.day) / 7;
int l = ROUND((col+0)*hstep);
int r = ROUND((col+1)*hstep);
int t = ROUND((row+0)*vstep+hdr-1);
case 'o': months = 1; break;
}
if (days || months) {
- add_days(&YEAR, &MONTH, &DAY, days);
- add_months(&YEAR, &MONTH, months);
+ add_days(&SEL.year, &SEL.month, &SEL.day, days);
+ add_months(&SEL.year, &SEL.month, months);
werase(win);
month_draw();
wrefresh(win);
event_t *event;
/* Get start of week */
- year_t year = YEAR;
- month_t month = MONTH;
- day_t day = DAY;
+ year_t year = SEL.year;
+ month_t month = SEL.month;
+ day_t day = SEL.day;
int shift = day_of_week(year, month, day);
add_days(&year, &month, &day, -shift);
/* Print Header */
int rev = COMPACT ? A_REVERSE | A_BOLD : 0;
wattron(win, rev);
- mvwprintw(win, 0, 0, "%-*s", COLS, month_to_str(MONTH));
- mvwprintw(win, 1, 0, "%-0*d", COLS, YEAR);
+ mvwprintw(win, 0, 0, "%-*s", COLS, month_to_str(SEL.month));
+ mvwprintw(win, 1, 0, "%-0*d", COLS, SEL.year);
wattroff(win, rev);
mvwhline(win, 0, x+l, ' ', r-l-1);
mvwhline(win, 1, x+l, ' ', r-l-1);
}
line = CLAMP(line, 0, 24*4);
if (days)
- add_days(&YEAR, &MONTH, &DAY, days);
+ add_days(&SEL.year, &SEL.month, &SEL.day, days);
if (ref) {
werase(win);
week_draw();
{
event_t *event = EVENTS;
const char *name = month_to_string(month);
- const int start = start_of_month(YEAR, month);
- const char days = days_in_month(YEAR, month);
+ const int start = start_of_month(SEL.year, month);
+ const char days = days_in_month(SEL.year, month);
mvwprintw(win, y, x+MW/2-strlen(name)/2, "%s", name);
wmove(win, y+1, x);
for (int d = 0; d < 7; d++)
int col = (start + d) % 7;
int busy = 0;
- while (event && before(&event->start, YEAR, month, d, 24, 0)) {
- if (!before(&event->start, YEAR, month, d, 0, 0))
+ while (event && before(&event->start, SEL.year, month, d, 24, 0)) {
+ if (!before(&event->start, SEL.year, month, d, 0, 0))
busy = 1;
event = event->next;
}
- int today = month == MONTH && d == DAY;
+ int today = month == SEL.month && d == SEL.day;
int attr = (busy ? A_BOLD|A_UNDERLINE : A_DIM)
| (today ? A_REVERSE : 0 );
int h[4] = {};
/* Load cal data */
- cal_load(YEAR, 0, 0, 366);
+ cal_load(SEL.year, 0, 0, 366);
/* Determine heights */
for (int m = 0; m < 12; m++) {
- int weeks = weeks_in_month(YEAR, m);
+ int weeks = weeks_in_month(SEL.year, m);
h[m/3] = MAX(h[m/3], weeks+2);
}
int sum = h[0]+h[1]+h[2]+h[3];
/* Print Header */
if (COMPACT) wattron(win, A_REVERSE | A_BOLD);
if (COMPACT) mvwhline(win, y, 0, A_REVERSE | A_BOLD, COLS);
- mvwprintw(win, y++, COLS/2-2, "%d", YEAR);
+ mvwprintw(win, y++, COLS/2-2, "%d", SEL.year);
if (COMPACT) wattroff(win, A_REVERSE | A_BOLD);
/* Print Months */
/* Year run */
int year_run(int key, mmask_t btn, int row, int col)
{
- day_t d = DAY;
- month_t m = MONTH;
- year_t y = YEAR;
- wday_t day = day_of_week(YEAR, MONTH, DAY);
+ day_t d = SEL.day;
+ month_t m = SEL.month;
+ year_t y = SEL.year;
+ wday_t day = day_of_week(SEL.year, SEL.month, SEL.day);
int week = (start_of_month(y, m) + d) / 7;
int dir = 0;
/* Step years */
if (key == 'i')
- YEAR--;
+ SEL.year--;
if (key == 'o')
- YEAR++;
+ SEL.year++;
/* Get direction */
if (key == 'h' || key == 'k')
for (int i = 0; i < 90/7; i++) {
add_days(&y, &m, &d, dir*7);
if (day_of_week(y, m, d) == day &&
- y == YEAR && m%3 == MONTH%3) {
- MONTH = m;
- DAY = d;
+ y == SEL.year && m%3 == SEL.month%3) {
+ SEL.month = m;
+ SEL.day = d;
break;
}
}
for (int i = 0; i < 90; i++) {
add_days(&y, &m, &d, dir);
if ((start_of_month(y, m) + d) / 7 == week &&
- y == YEAR && m/3 == MONTH/3) {
- MONTH = m;
- DAY = d;
+ y == SEL.year && m/3 == SEL.month/3) {
+ SEL.month = m;
+ SEL.day = d;
break;
}
}
}
/* Refresh */
- if (dir || y != YEAR) {
+ if (dir || y != SEL.year) {
werase(win);
year_draw();
wrefresh(win);
}
- return dir || y != YEAR;
+ return dir || y != SEL.year;
}