feat: add time offset configuration

This commit is contained in:
2026-03-24 07:20:52 +01:00
parent 560cb67722
commit 195028d994
14 changed files with 148 additions and 27 deletions
+4
View File
@@ -116,6 +116,10 @@ namespace Montauk {
// Power management
static constexpr uint64_t SYS_SUSPEND = 89;
// Timezone
static constexpr uint64_t SYS_SETTZ = 90;
static constexpr uint64_t SYS_GETTZ = 91;
// Audio control commands (for SYS_AUDIOCTL)
static constexpr int AUDIO_CTL_SET_VOLUME = 0;
static constexpr int AUDIO_CTL_GET_VOLUME = 1;
+1
View File
@@ -52,6 +52,7 @@ struct DesktopSettings {
bool show_shadows; // window shadows on/off
bool clock_24h; // 24-hour clock format
int ui_scale; // 0=Small, 1=Default, 2=Large
int tz_offset_minutes; // timezone offset from UTC in minutes
};
struct DesktopState {
+10
View File
@@ -94,6 +94,8 @@ extern "C" {
#define MTK_SYS_AUDIOCLOSE 81
#define MTK_SYS_AUDIOWRITE 82
#define MTK_SYS_AUDIOCTL 83
#define MTK_SYS_SETTZ 90
#define MTK_SYS_GETTZ 91
#define MTK_SOCK_TCP 1
#define MTK_SOCK_UDP 2
@@ -411,6 +413,14 @@ static inline void mtk_gettime(mtk_datetime *out) {
_mtk_syscall1(MTK_SYS_GETTIME, (long)out);
}
static inline void mtk_settz(int offset_minutes) {
_mtk_syscall1(MTK_SYS_SETTZ, (long)offset_minutes);
}
static inline int mtk_gettz(void) {
return (int)_mtk_syscall0(MTK_SYS_GETTZ);
}
/* ====================================================================
System info
==================================================================== */
+4
View File
@@ -249,6 +249,10 @@ namespace montauk {
// Timekeeping (wall-clock)
inline void gettime(Montauk::DateTime* out) { syscall1(Montauk::SYS_GETTIME, (uint64_t)out); }
// Timezone offset (total minutes from UTC)
inline void settz(int offset_minutes) { syscall1(Montauk::SYS_SETTZ, (uint64_t)(int64_t)offset_minutes); }
inline int gettz() { return (int)syscall0(Montauk::SYS_GETTZ); }
// Random number generation
inline int64_t getrandom(void* buf, uint32_t len) {
return syscall2(Montauk::SYS_GETRANDOM, (uint64_t)buf, (uint64_t)len);
@@ -301,6 +301,35 @@ static void settings_draw_display(Canvas& c, SettingsState* st) {
draw_toggle_btn(c, bx, y, sbw, btn_h, "Small", s.ui_scale == 0, accent);
draw_toggle_btn(c, bx + sbw + 8, y, sbw, btn_h, "Default", s.ui_scale == 1, accent);
draw_toggle_btn(c, bx + (sbw + 8) * 2, y, sbw, btn_h, "Large", s.ui_scale == 2, accent);
y += btn_h + 20;
// Separator
c.hline(x, y, c.w - 2 * x, colors::BORDER);
y += 16;
// UTC Offset
c.text(x, y + 6, "UTC Offset", colors::TEXT_COLOR);
bx = x + 180;
// [-] button
draw_toggle_btn(c, bx, y, 36, btn_h, "-", false, accent);
// Offset label
int off = s.tz_offset_minutes;
int offH = off / 60;
int offM = off % 60;
if (offM < 0) offM = -offM;
char tz_label[16];
if (offM)
snprintf(tz_label, sizeof(tz_label), "UTC%s%d:%02d", offH >= 0 ? "+" : "", offH, offM);
else
snprintf(tz_label, sizeof(tz_label), "UTC%s%d", offH >= 0 ? "+" : "", offH);
int tw = text_width(tz_label);
int label_w = 90;
c.text(bx + 36 + (label_w - tw) / 2, y + 6, tz_label, colors::TEXT_COLOR);
// [+] button
draw_toggle_btn(c, bx + 36 + label_w, y, 36, btn_h, "+", false, accent);
}
static void settings_draw_about(Canvas& c, SettingsState* st) {
@@ -392,6 +421,14 @@ static void settings_persist(SettingsState* st) {
doc.destroy();
}
static void settings_persist_tz(SettingsState* st) {
montauk::toml::Doc doc;
doc.init();
montauk::config::set_int(&doc, "timezone.offset_minutes", st->desktop->settings.tz_offset_minutes);
montauk::config::save("timezone", &doc);
doc.destroy();
}
// ============================================================================
// Users tab
// ============================================================================
@@ -1295,6 +1332,27 @@ static void settings_on_mouse(Window* win, MouseEvent& ev) {
settings_persist(st);
return;
}
y += btn_h + 20 + 16;
// UTC Offset: [-] button
if (mx >= bx && mx < bx + 36 && cy >= y && cy < y + btn_h) {
if (s.tz_offset_minutes > -720) {
s.tz_offset_minutes -= 60;
montauk::settz(s.tz_offset_minutes);
settings_persist_tz(st);
}
return;
}
// UTC Offset: [+] button
int label_w = 90;
if (mx >= bx + 36 + label_w && mx < bx + 36 + label_w + 36 && cy >= y && cy < y + btn_h) {
if (s.tz_offset_minutes < 840) {
s.tz_offset_minutes += 60;
montauk::settz(s.tz_offset_minutes);
settings_persist_tz(st);
}
return;
}
} else if (st->active_tab == 2) {
// Users tab
if (!st->desktop->is_admin) return;
+10
View File
@@ -256,6 +256,7 @@ void gui::desktop_init(DesktopState* ds) {
ds->settings.show_shadows = true;
ds->settings.clock_24h = true;
ds->settings.ui_scale = 1;
ds->settings.tz_offset_minutes = 60; // default CET (UTC+1)
// Load per-user desktop settings
{
@@ -311,6 +312,15 @@ void gui::desktop_init(DesktopState* ds) {
doc.destroy();
}
// Load timezone config
{
auto tz = montauk::config::load("timezone");
ds->settings.tz_offset_minutes = (int)tz.get_int("timezone.offset_minutes", 60);
tz.destroy();
}
montauk::settz(ds->settings.tz_offset_minutes);
montauk::win_setscale(ds->settings.ui_scale);
ds->ctx_menu_open = false;