summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Stensgård <mastensg@mastensg.net>2025-07-11 20:35:26 +0200
committerMartin Stensgård <mastensg@mastensg.net>2025-07-11 20:35:26 +0200
commit9e67e5b528766246e4813a72361707ce60bb7709 (patch)
treee959ce9f6b6ba6b527715571cac74a61c4b2a5f8
parent76f07a58c266859445040cbb9f46fee3cbb3deca (diff)
opplysning: rubricate the now
-rw-r--r--opplysning.c142
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();