diff options
author | Martin Stensgård <mastensg@mastensg.net> | 2025-07-11 20:35:26 +0200 |
---|---|---|
committer | Martin Stensgård <mastensg@mastensg.net> | 2025-07-11 20:35:26 +0200 |
commit | 9e67e5b528766246e4813a72361707ce60bb7709 (patch) | |
tree | e959ce9f6b6ba6b527715571cac74a61c4b2a5f8 | |
parent | 76f07a58c266859445040cbb9f46fee3cbb3deca (diff) |
opplysning: rubricate the now
-rw-r--r-- | opplysning.c | 142 |
1 files changed, 83 insertions, 59 deletions
diff --git a/opplysning.c b/opplysning.c index c707b1a..4a139b2 100644 --- a/opplysning.c +++ b/opplysning.c @@ -32,6 +32,8 @@ enum { }; struct event { + time_t start; + time_t end; int year; int month; int day; @@ -43,15 +45,24 @@ struct event { char title[SIZEOF_TITLE]; }; +struct calendar { + char *database; + char *title; + char *subtitle; + size_t num_events; + struct event events[MAX_EVENTS]; +}; + void -load_events(size_t *num_events, struct event events[static MAX_EVENTS], - const char *database) +load_events(struct calendar *cal) { sqlite3 *db; - if (sqlite3_open(database, &db)) + if (sqlite3_open(cal->database, &db)) errx(1, "sqlite3_open: %s", sqlite3_errmsg(db)); const char *sql = "SELECT " + "unixepoch(start), " + "unixepoch(end), " "CAST(strftime('%Y', start, 'localtime') as INT), " "CAST(strftime('%m', start, 'localtime') as INT), " "CAST(strftime('%d', start, 'localtime') as INT), " @@ -82,27 +93,31 @@ load_events(size_t *num_events, struct event events[static MAX_EVENTS], break; } - int year = sqlite3_column_int(stmt, 0); - int month = sqlite3_column_int(stmt, 1); - int day = sqlite3_column_int(stmt, 2); - int wday = sqlite3_column_int(stmt, 3); - int hour = sqlite3_column_int(stmt, 4); - int minute = sqlite3_column_int(stmt, 5); - int end_hour = sqlite3_column_int(stmt, 6); - int end_minute = sqlite3_column_int(stmt, 7); + int start = sqlite3_column_int(stmt, 0); + int end = sqlite3_column_int(stmt, 1); + int year = sqlite3_column_int(stmt, 2); + int month = sqlite3_column_int(stmt, 3); + int day = sqlite3_column_int(stmt, 4); + int wday = sqlite3_column_int(stmt, 5); + int hour = sqlite3_column_int(stmt, 6); + int minute = sqlite3_column_int(stmt, 7); + int end_hour = sqlite3_column_int(stmt, 8); + int end_minute = sqlite3_column_int(stmt, 9); const char *summary = - (const void *)sqlite3_column_text(stmt, 8); + (const void *)sqlite3_column_text(stmt, 10); assert(summary); - events[n].year = year; - events[n].month = month; - events[n].day = day; - events[n].hour = hour; - events[n].minute = minute; - events[n].end_hour = end_hour; - events[n].end_minute = end_minute; - strncpy(events[n].title, summary, SIZEOF_TITLE); - events[n].wday = wday; + cal->events[n].start = start; + cal->events[n].end = end; + cal->events[n].year = year; + cal->events[n].month = month; + cal->events[n].day = day; + cal->events[n].hour = hour; + cal->events[n].minute = minute; + cal->events[n].end_hour = end_hour; + cal->events[n].end_minute = end_minute; + strncpy(cal->events[n].title, summary, SIZEOF_TITLE); + cal->events[n].wday = wday; ++n; } @@ -112,7 +127,7 @@ load_events(size_t *num_events, struct event events[static MAX_EVENTS], if (sqlite3_close(db)) errx(1, "sqlite3_close: %s", sqlite3_errmsg(db)); - *num_events = n; + cal->num_events = n; } struct ray { @@ -123,6 +138,7 @@ struct ray { Color bg; Color fg; Color hd; + Color rd; Font font_h; Font font_p; @@ -157,6 +173,7 @@ ray_init(void) R.bg = RAYWHITE; R.fg = BLACK; R.hd = (Color){0xf0, 0x4a, 0x00, 0xff}; + R.rd = (Color){0xd7, 0x21, 0x17, 0xff}; R.shader = LoadShader(0, "s.glsl"); R.shader_u_time = GetShaderLocation(R.shader, "u_time"); @@ -188,10 +205,8 @@ line(int x, int y, Font f, Color c, const char *s) } void -draw_time(int x, int y) +draw_time(int x, int y, struct timespec now) { - struct timespec now = {0}; - clock_gettime(CLOCK_REALTIME, &now); struct tm *ti = localtime(&now.tv_sec); char ts[64] = {0}; snprintf(ts, sizeof(ts), "%02d:%02d", ti->tm_hour, ti->tm_min); @@ -200,30 +215,43 @@ draw_time(int x, int y) } void -draw_one_event(int x, int y, const struct event *e) +draw_event(int x, int y, struct timespec now, const struct event *e) { char s[128] = {0}; snprintf(s, sizeof(s), "%02u:%02u-%02u:%02u %s", e->hour, e->minute, e->end_hour, e->end_minute, e->title); - line(x, y, R.font_p, R.fg, s); + Color c = R.fg; + if (e->start <= now.tv_sec && now.tv_sec < e->end) + c = R.rd; + line(x, y, R.font_p, c, s); } void -draw_date(int x, int y, int wday, int day, int month) +draw_date(int x, int y, struct timespec now, int wday, int day, int month, + int year) { + struct tm *ti = localtime(&now.tv_sec); + Color c = R.fg; + if ((year == 1900 + ti->tm_year) && (month == 1 + ti->tm_mon) && + (day == ti->tm_mday)) + c = R.rd; char s[64] = {0}; snprintf(s, sizeof(s), "%s %u. %s", ukedag[wday], day, maaned[month]); - line(x, y, R.font_h, R.hd, s); + line(x, y, R.font_h, c, s); } void -draw_events(int x, int y, size_t numevents, - const struct event events[static numevents]) +draw_calendar(int x, int y, struct timespec now, struct calendar *cal) { + x += 20; + line(x, y, R.font_h, R.fg, cal->title); + y += 50; + line(x, y, R.font_p, R.fg, cal->subtitle); + int year = 0, month = 0, day = 0; - for (size_t i = 0; i < numevents; ++i) { - const struct event *e = &events[i]; + for (size_t i = 0; i < cal->num_events; ++i) { + const struct event *e = &cal->events[i]; if (year != e->year || month != e->month || day != e->day) { if (SCREEN_H - 2 * R.font_h.baseSize < y) break; @@ -231,51 +259,47 @@ draw_events(int x, int y, size_t numevents, month = e->month; day = e->day; y += 40; - draw_date(x, y, e->wday, e->day, e->month); + draw_date(x, y, now, e->wday, e->day, e->month, + e->year); y += 20; } y += 40; - draw_one_event(x, y, e); + draw_event(x, y, now, e); } } int main(void) { - size_t ne_google = 0; - size_t ne_meetup = 0; - struct event ev_google[MAX_EVENTS] = {0}; - struct event ev_meetup[MAX_EVENTS] = {0}; - - load_events(&ne_google, ev_google, "var/google.db"); - load_events(&ne_meetup, ev_meetup, "var/meetup.db"); - - const char *t_meetup = "Begivenheter"; - const char *u_meetup = "Hentet fra https://www.meetup.com/bitraf/"; - const char *t_google = "Reservasjoner"; - const char *u_google = "Hentet fra Google-kalenderen «Bitraf booking»"; + struct calendar google = { + .database = "var/google.db", + .title = "Reservasjoner", + .subtitle = "Hentet fra Google-kalenderen «Bitraf booking»", + }; + struct calendar meetup = { + .database = "var/meetup.db", + .title = "Begivenheter", + .subtitle = "Hentet fra https://www.meetup.com/bitraf/", + }; ray_init(); while (!WindowShouldClose()) { if (IsKeyPressed(KEY_R)) { double t0 = GetTime(); - load_events(&ne_google, ev_google, "var/google.db"); - load_events(&ne_meetup, ev_meetup, "var/meetup.db"); + load_events(&google); + load_events(&meetup); double t1 = GetTime(); fprintf(stderr, "%6.3f ms\n", (t1 - t0) * 1000.0); } + + struct timespec now = {0}; + clock_gettime(CLOCK_REALTIME, &now); + BeginDrawing(); ClearBackground(R.bg); - draw_time(SCREEN_W / 2 - 100, 0); - int x = 20; - int y = 0; - line(x, y, R.font_h, R.fg, t_meetup); - line(x + SCREEN_W / 2, y, R.font_h, R.fg, t_google); - y += 50; - line(x, y, R.font_p, R.fg, u_meetup); - line(x + SCREEN_W / 2, y, R.font_p, R.fg, u_google); - draw_events(x, y, ne_meetup, ev_meetup); - draw_events(x + SCREEN_W / 2, y, ne_google, ev_google); + draw_time(SCREEN_W / 2 - 100, 0, now); + draw_calendar(0, 0, now, &meetup); + draw_calendar(SCREEN_W / 2, 0, now, &google); EndDrawing(); } CloseWindow(); |