From e3dc1e881da128c6a9ee40e62d9f307dc840dbb9 Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Tue, 16 Jun 2026 09:09:16 +0200 Subject: [PATCH] cleanup: namespace Montauk (capital M) => montauk::abi --- kernel/src/ACPI/AcpiSleep.cpp | 2 +- kernel/src/Api/Audio.hpp | 2 +- kernel/src/Api/BluetoothSyscall.hpp | 2 +- kernel/src/Api/BuildNo.hpp | 2 +- kernel/src/Api/Clipboard.hpp | 2 +- kernel/src/Api/Common.hpp | 2 +- kernel/src/Api/CrashReportSyscall.hpp | 2 +- kernel/src/Api/Device.hpp | 2 +- kernel/src/Api/Filesystem.hpp | 2 +- kernel/src/Api/Graphics.hpp | 2 +- kernel/src/Api/Heap.hpp | 2 +- kernel/src/Api/Info.hpp | 2 +- kernel/src/Api/Input.hpp | 2 +- kernel/src/Api/IoRedir.hpp | 2 +- kernel/src/Api/IpcSyscall.hpp | 2 +- kernel/src/Api/Keyboard.hpp | 2 +- kernel/src/Api/LibSyscall.hpp | 2 +- kernel/src/Api/MemInfo.hpp | 2 +- kernel/src/Api/Mouse.hpp | 2 +- kernel/src/Api/Net.hpp | 2 +- kernel/src/Api/Path.hpp | 2 +- kernel/src/Api/Power.hpp | 2 +- kernel/src/Api/Process.hpp | 2 +- kernel/src/Api/Random.hpp | 2 +- kernel/src/Api/Storage.hpp | 2 +- kernel/src/Api/Syscall.cpp | 2 +- kernel/src/Api/Syscall.hpp | 2 +- kernel/src/Api/Terminal.hpp | 2 +- kernel/src/Api/Time.hpp | 2 +- kernel/src/Api/UserMemory.hpp | 2 +- kernel/src/Api/WinServer.cpp | 14 +- kernel/src/Api/WinServer.hpp | 6 +- kernel/src/Api/Window.hpp | 2 +- kernel/src/Drivers/Audio/Mixer.cpp | 22 +- kernel/src/Drivers/Audio/Mixer.hpp | 2 +- kernel/src/Ipc/Ipc.cpp | 36 +- kernel/src/Main.cpp | 2 +- kernel/src/Memory/PageFrameAllocator.cpp | 2 +- kernel/src/Memory/PageFrameAllocator.hpp | 2 +- kernel/src/Sched/Scheduler.cpp | 4 +- kernel/src/Sched/Scheduler.hpp | 2 +- programs/include/Api/Syscall.hpp | 2 +- programs/include/engine/engine.h | 4 +- programs/include/engine/input.h | 2 +- programs/include/gui/clipboard.hpp | 6 +- programs/include/gui/desktop.hpp | 8 +- programs/include/gui/framebuffer.hpp | 2 +- programs/include/gui/mtk/widgets.hpp | 2 +- programs/include/gui/standalone.hpp | 4 +- programs/include/gui/terminal.hpp | 2 +- programs/include/gui/widgets.hpp | 2 +- programs/include/gui/window.hpp | 2 +- programs/include/http/http.hpp | 2 +- programs/include/montauk/heap.h | 2 +- programs/include/montauk/syscall.h | 340 +++++++++--------- programs/include/montauk/thread.h | 8 +- programs/include/print/print.hpp | 20 +- programs/lib/tls/libtls.a | Bin 111322 -> 111626 bytes programs/lib/tls/obj/tls.o | Bin 110928 -> 111232 bytes programs/lib/tls/tls.cpp | 4 +- programs/libs/libhello/src/libhello.cpp | 4 +- programs/libs/libhello/src/libhello.o | Bin 113760 -> 108304 bytes .../obj/src/libprintersapplet.o | Bin 18680 -> 18648 bytes .../obj/src/libtimezonesapplet.o | Bin 18824 -> 18792 bytes programs/man/framebuffer.2 | 6 +- programs/man/syscalls.2 | 16 +- programs/src/2048/main.cpp | 6 +- programs/src/audio/main.cpp | 6 +- programs/src/bluetooth/main.cpp | 14 +- programs/src/calculator/main.cpp | 6 +- programs/src/crashpad/main.cpp | 4 +- programs/src/date/main.cpp | 2 +- programs/src/desktop/apps/apps_common.hpp | 2 +- .../src/desktop/apps/filemanager/events.cpp | 2 +- .../apps/filemanager/filemanager_internal.hpp | 2 +- .../src/desktop/apps/filemanager/fileop.cpp | 2 +- .../desktop/apps/filemanager/properties.cpp | 6 +- programs/src/desktop/apps/settings/app.cpp | 2 +- .../apps/settings/settings_internal.hpp | 2 +- programs/src/desktop/apps/usermanager/app.cpp | 2 +- .../src/desktop/apps/usermanager/dialogs.cpp | 6 +- programs/src/desktop/compose.cpp | 2 +- programs/src/desktop/desktop_internal.hpp | 4 +- programs/src/desktop/dialogs.cpp | 14 +- programs/src/desktop/input.cpp | 24 +- programs/src/desktop/launcher.cpp | 8 +- programs/src/desktop/main.cpp | 16 +- programs/src/desktop/panel.cpp | 4 +- programs/src/desktop/window.cpp | 2 +- programs/src/devexplorer/devexplorer.h | 6 +- programs/src/devexplorer/diskdetail.cpp | 2 +- programs/src/devexplorer/main.cpp | 6 +- programs/src/devexplorer/printers.cpp | 4 +- programs/src/dhcp/main.cpp | 12 +- programs/src/dialogs/filedialog.cpp | 8 +- programs/src/dialogs/filedialog.hpp | 4 +- programs/src/dialogs/main.cpp | 10 +- programs/src/dialogs/messagebox.cpp | 8 +- programs/src/dialogs/messagebox.hpp | 4 +- programs/src/dialogs/printdialog.cpp | 8 +- programs/src/dialogs/printdialog.hpp | 4 +- programs/src/disks/actions.cpp | 16 +- programs/src/disks/disks.h | 6 +- programs/src/disks/main.cpp | 10 +- programs/src/disks/render.cpp | 6 +- programs/src/doom/doomgeneric_montauk.c | 2 +- programs/src/edit/main.cpp | 6 +- programs/src/fetch/main.cpp | 10 +- programs/src/fontpreview/main.cpp | 2 +- programs/src/httpd/main.cpp | 14 +- programs/src/ifconfig/main.cpp | 4 +- programs/src/imageviewer/main.cpp | 2 +- programs/src/info/main.cpp | 2 +- programs/src/init/main.cpp | 2 +- programs/src/installer/actions.cpp | 34 +- programs/src/installer/installer.h | 4 +- programs/src/installer/main.cpp | 2 +- programs/src/irc/main.cpp | 6 +- programs/src/klog/main.cpp | 4 +- programs/src/login/login.hpp | 6 +- programs/src/login/login_input.cpp | 10 +- programs/src/login/login_shutdown.cpp | 8 +- programs/src/login/main.cpp | 2 +- programs/src/man/main.cpp | 2 +- programs/src/mandelbrot/main.cpp | 4 +- programs/src/mtkfetch/main.cpp | 12 +- programs/src/music/main.cpp | 6 +- programs/src/network/main.cpp | 12 +- programs/src/nslookup/main.cpp | 2 +- programs/src/paint/main.cpp | 2 +- programs/src/pdfviewer/main.cpp | 2 +- programs/src/printers/main.cpp | 10 +- programs/src/procmgr/main.cpp | 16 +- programs/src/rpgdemo/main.cpp | 2 +- programs/src/screenshot/main.cpp | 12 +- programs/src/shell/main.cpp | 6 +- programs/src/spreadsheet/main.cpp | 2 +- programs/src/tcpconnect/main.cpp | 6 +- programs/src/terminal/main.cpp | 10 +- programs/src/texteditor/main.cpp | 8 +- programs/src/timezone/main.cpp | 6 +- programs/src/video/main.cpp | 4 +- programs/src/weather/main.cpp | 2 +- programs/src/wiki/main.cpp | 10 +- programs/src/wikipedia/main.cpp | 6 +- programs/src/wikipedia/network.cpp | 2 +- programs/src/wordprocessor/input.cpp | 4 +- programs/src/wordprocessor/main.cpp | 2 +- programs/src/wordprocessor/wordprocessor.hpp | 4 +- template/docs/gui-apps.md | 10 +- template/docs/syscalls.md | 10 +- template/src/main.cpp | 4 +- template/sysroot/include/Api/Syscall.hpp | 2 +- template/sysroot/include/gui/clipboard.hpp | 6 +- template/sysroot/include/gui/desktop.hpp | 8 +- template/sysroot/include/gui/framebuffer.hpp | 2 +- template/sysroot/include/gui/mtk/widgets.hpp | 2 +- template/sysroot/include/gui/standalone.hpp | 4 +- template/sysroot/include/gui/terminal.hpp | 2 +- template/sysroot/include/gui/widgets.hpp | 2 +- template/sysroot/include/gui/window.hpp | 2 +- template/sysroot/include/http/http.hpp | 2 +- template/sysroot/include/montauk/heap.h | 2 +- template/sysroot/include/montauk/syscall.h | 332 ++++++++--------- template/sysroot/include/montauk/thread.h | 8 +- 165 files changed, 758 insertions(+), 758 deletions(-) diff --git a/kernel/src/ACPI/AcpiSleep.cpp b/kernel/src/ACPI/AcpiSleep.cpp index 4aa666e..c0d0550 100644 --- a/kernel/src/ACPI/AcpiSleep.cpp +++ b/kernel/src/ACPI/AcpiSleep.cpp @@ -424,7 +424,7 @@ namespace Hal { reinitProgress(0x02); // TSS Hal::LoadTSS(); reinitProgress(0x03); // Syscalls - Montauk::InitializeSyscalls(); + montauk::abi::InitializeSyscalls(); // Re-set GS base for BSP (lost during S3) { auto* bsp = Smp::GetCpuData(0); diff --git a/kernel/src/Api/Audio.hpp b/kernel/src/Api/Audio.hpp index 9d480e7..01212d4 100644 --- a/kernel/src/Api/Audio.hpp +++ b/kernel/src/Api/Audio.hpp @@ -17,7 +17,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { // Audio handle convention: // 0x00 - 0x07 : Mixer virtual streams (one per opened audio handle) diff --git a/kernel/src/Api/BluetoothSyscall.hpp b/kernel/src/Api/BluetoothSyscall.hpp index 59c2b1a..79f2e37 100644 --- a/kernel/src/Api/BluetoothSyscall.hpp +++ b/kernel/src/Api/BluetoothSyscall.hpp @@ -12,7 +12,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static int64_t Sys_BtScan(BtScanResult* buf, int maxCount, uint32_t timeoutMs) { if (!buf || maxCount <= 0) return -1; diff --git a/kernel/src/Api/BuildNo.hpp b/kernel/src/Api/BuildNo.hpp index 0163127..39cdee0 100644 --- a/kernel/src/Api/BuildNo.hpp +++ b/kernel/src/Api/BuildNo.hpp @@ -12,4 +12,4 @@ #pragma once -#define MONTAUK_BUILD_NUMBER 24 +#define MONTAUK_BUILD_NUMBER 25 diff --git a/kernel/src/Api/Clipboard.hpp b/kernel/src/Api/Clipboard.hpp index 3d51746..3f959bd 100644 --- a/kernel/src/Api/Clipboard.hpp +++ b/kernel/src/Api/Clipboard.hpp @@ -12,7 +12,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static constexpr int ClipboardMaxSlots = 32; diff --git a/kernel/src/Api/Common.hpp b/kernel/src/Api/Common.hpp index 8fbe0e1..fb0dab3 100644 --- a/kernel/src/Api/Common.hpp +++ b/kernel/src/Api/Common.hpp @@ -3,7 +3,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { static Sched::Process* GetRedirTarget(Sched::Process* proc) { if (!proc || !proc->redirected) return nullptr; diff --git a/kernel/src/Api/CrashReportSyscall.hpp b/kernel/src/Api/CrashReportSyscall.hpp index 1dfe26c..4a6263b 100644 --- a/kernel/src/Api/CrashReportSyscall.hpp +++ b/kernel/src/Api/CrashReportSyscall.hpp @@ -9,7 +9,7 @@ #include "Syscall.hpp" #include "../Sched/CrashReport.hpp" -namespace Montauk { +namespace montauk::abi { static int64_t Sys_CrashReport(CrashReportInfo* out) { if (!out) return 0; diff --git a/kernel/src/Api/Device.hpp b/kernel/src/Api/Device.hpp index d0ea0e8..530300b 100644 --- a/kernel/src/Api/Device.hpp +++ b/kernel/src/Api/Device.hpp @@ -22,7 +22,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { static void dl_strcpy(char* dst, const char* src, int max) { int i = 0; diff --git a/kernel/src/Api/Filesystem.hpp b/kernel/src/Api/Filesystem.hpp index 616ab9e..cab3bc6 100644 --- a/kernel/src/Api/Filesystem.hpp +++ b/kernel/src/Api/Filesystem.hpp @@ -17,7 +17,7 @@ #include #include "Path.hpp" -namespace Montauk { +namespace montauk::abi { static int Sys_Open(const char* path) { char resolved[256]; if (!ResolveProcessPath(path, resolved, sizeof(resolved))) return -1; diff --git a/kernel/src/Api/Graphics.hpp b/kernel/src/Api/Graphics.hpp index 5b14009..4556b62 100644 --- a/kernel/src/Api/Graphics.hpp +++ b/kernel/src/Api/Graphics.hpp @@ -16,7 +16,7 @@ #include "Common.hpp" #include "../Libraries/flanterm/src/flanterm.h" -namespace Montauk { +namespace montauk::abi { static void Sys_FbInfo(FbInfo* out) { if (out == nullptr) return; diff --git a/kernel/src/Api/Heap.hpp b/kernel/src/Api/Heap.hpp index 15ae038..8d34ead 100644 --- a/kernel/src/Api/Heap.hpp +++ b/kernel/src/Api/Heap.hpp @@ -10,7 +10,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { // Per-process heap allocation tracking (separate from Process struct to avoid bloating it) struct HeapAlloc { diff --git a/kernel/src/Api/Info.hpp b/kernel/src/Api/Info.hpp index 6e36d95..167a2ec 100644 --- a/kernel/src/Api/Info.hpp +++ b/kernel/src/Api/Info.hpp @@ -10,7 +10,7 @@ #include "BuildNo.hpp" #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static void Sys_GetInfo(SysInfo* outInfo) { if (outInfo == nullptr) return; diff --git a/kernel/src/Api/Input.hpp b/kernel/src/Api/Input.hpp index 8cca8ae..0efa817 100644 --- a/kernel/src/Api/Input.hpp +++ b/kernel/src/Api/Input.hpp @@ -7,7 +7,7 @@ #pragma once #include -namespace Montauk { +namespace montauk::abi { static uint64_t Sys_InputWait(uint64_t observedSerial, uint64_t timeoutMs) { return Drivers::InputEvents::WaitForChange(observedSerial, timeoutMs); diff --git a/kernel/src/Api/IoRedir.hpp b/kernel/src/Api/IoRedir.hpp index ee65fea..f9c042e 100644 --- a/kernel/src/Api/IoRedir.hpp +++ b/kernel/src/Api/IoRedir.hpp @@ -11,7 +11,7 @@ #include "Common.hpp" #include "Path.hpp" -namespace Montauk { +namespace montauk::abi { static constexpr uint32_t RedirOutputStreamCapacity = 64 * 1024; diff --git a/kernel/src/Api/IpcSyscall.hpp b/kernel/src/Api/IpcSyscall.hpp index c8df954..2f2df34 100644 --- a/kernel/src/Api/IpcSyscall.hpp +++ b/kernel/src/Api/IpcSyscall.hpp @@ -9,7 +9,7 @@ #include #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static int Sys_DupHandle(int handle) { return Ipc::DupHandle(handle); diff --git a/kernel/src/Api/Keyboard.hpp b/kernel/src/Api/Keyboard.hpp index 4928f23..21a78d0 100644 --- a/kernel/src/Api/Keyboard.hpp +++ b/kernel/src/Api/Keyboard.hpp @@ -11,7 +11,7 @@ #include "Common.hpp" -namespace Montauk { +namespace montauk::abi { static bool Sys_IsKeyAvailable() { auto* proc = Sched::GetCurrentProcessPtr(); if (proc && proc->redirected) { diff --git a/kernel/src/Api/LibSyscall.hpp b/kernel/src/Api/LibSyscall.hpp index 469ff3d..a5896c9 100644 --- a/kernel/src/Api/LibSyscall.hpp +++ b/kernel/src/Api/LibSyscall.hpp @@ -14,7 +14,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { // Maximum libraries per process static constexpr int MaxLibsPerProcess = 8; diff --git a/kernel/src/Api/MemInfo.hpp b/kernel/src/Api/MemInfo.hpp index 4a9b71e..324d4f5 100644 --- a/kernel/src/Api/MemInfo.hpp +++ b/kernel/src/Api/MemInfo.hpp @@ -9,7 +9,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static void Sys_MemStats(MemStats* out) { if (out == nullptr) return; diff --git a/kernel/src/Api/Mouse.hpp b/kernel/src/Api/Mouse.hpp index 2187f79..8d4f69f 100644 --- a/kernel/src/Api/Mouse.hpp +++ b/kernel/src/Api/Mouse.hpp @@ -9,7 +9,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static void Sys_MouseState(MouseState* out) { if (out == nullptr) return; diff --git a/kernel/src/Api/Net.hpp b/kernel/src/Api/Net.hpp index 7ab6973..81c5b15 100644 --- a/kernel/src/Api/Net.hpp +++ b/kernel/src/Api/Net.hpp @@ -19,7 +19,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static uint16_t g_pingSeq = 0; static constexpr uint16_t PING_ID = 0x2E01; // "ZE" diff --git a/kernel/src/Api/Path.hpp b/kernel/src/Api/Path.hpp index eedbed7..b8fb02a 100644 --- a/kernel/src/Api/Path.hpp +++ b/kernel/src/Api/Path.hpp @@ -9,7 +9,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { static int ParseDrivePrefix(const char* path, int* outPrefixLen = nullptr) { if (path == nullptr || path[0] < '0' || path[0] > '9') return -1; diff --git a/kernel/src/Api/Power.hpp b/kernel/src/Api/Power.hpp index 07dd2c0..b0c410f 100644 --- a/kernel/src/Api/Power.hpp +++ b/kernel/src/Api/Power.hpp @@ -15,7 +15,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { // Pending graceful power-off request, set by the desktop and consumed by // login.elf. Kernel-global IPC channel (one outstanding request system-wide). diff --git a/kernel/src/Api/Process.hpp b/kernel/src/Api/Process.hpp index 1849f20..57a0ecd 100644 --- a/kernel/src/Api/Process.hpp +++ b/kernel/src/Api/Process.hpp @@ -18,7 +18,7 @@ #include "WinServer.hpp" #include "Path.hpp" -namespace Montauk { +namespace montauk::abi { static void Sys_Exit(int exitCode) { (void)exitCode; Sched::ExitProcess(); diff --git a/kernel/src/Api/Random.hpp b/kernel/src/Api/Random.hpp index a9dff28..7655459 100644 --- a/kernel/src/Api/Random.hpp +++ b/kernel/src/Api/Random.hpp @@ -7,7 +7,7 @@ #pragma once #include -namespace Montauk { +namespace montauk::abi { // ---- Random number generation ---- // Uses RDTSC mixed with xorshift64* PRNG for entropy. diff --git a/kernel/src/Api/Storage.hpp b/kernel/src/Api/Storage.hpp index c148577..0852af6 100644 --- a/kernel/src/Api/Storage.hpp +++ b/kernel/src/Api/Storage.hpp @@ -15,7 +15,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static void dl_strcpy_s(char* dst, const char* src, int max) { int i = 0; diff --git a/kernel/src/Api/Syscall.cpp b/kernel/src/Api/Syscall.cpp index 4ae7f65..0d69b98 100644 --- a/kernel/src/Api/Syscall.cpp +++ b/kernel/src/Api/Syscall.cpp @@ -42,7 +42,7 @@ // Assembly entry point extern "C" void SyscallEntry(); -namespace Montauk { +namespace montauk::abi { static constexpr uint64_t kMaxPrintableStringBytes = 4096; static constexpr uint64_t kMaxPathBytes = 256; diff --git a/kernel/src/Api/Syscall.hpp b/kernel/src/Api/Syscall.hpp index f42a023..cb8ed42 100644 --- a/kernel/src/Api/Syscall.hpp +++ b/kernel/src/Api/Syscall.hpp @@ -8,7 +8,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { // Syscall numbers diff --git a/kernel/src/Api/Terminal.hpp b/kernel/src/Api/Terminal.hpp index fe08ed2..cfe70db 100644 --- a/kernel/src/Api/Terminal.hpp +++ b/kernel/src/Api/Terminal.hpp @@ -10,7 +10,7 @@ #include "Common.hpp" -namespace Montauk { +namespace montauk::abi { static void Sys_Print(const char* text) { auto* proc = Sched::GetCurrentProcessPtr(); diff --git a/kernel/src/Api/Time.hpp b/kernel/src/Api/Time.hpp index b64e972..f03025f 100644 --- a/kernel/src/Api/Time.hpp +++ b/kernel/src/Api/Time.hpp @@ -10,7 +10,7 @@ #include "Syscall.hpp" -namespace Montauk { +namespace montauk::abi { static uint64_t Sys_GetTicks() { return Timekeeping::GetTicks(); } diff --git a/kernel/src/Api/UserMemory.hpp b/kernel/src/Api/UserMemory.hpp index 0064682..f995f77 100644 --- a/kernel/src/Api/UserMemory.hpp +++ b/kernel/src/Api/UserMemory.hpp @@ -6,7 +6,7 @@ #include #include -namespace Montauk::UserMemory { +namespace montauk::abi::UserMemory { static constexpr uint64_t USER_SPACE_END = 0x0000800000000000ULL; diff --git a/kernel/src/Api/WinServer.cpp b/kernel/src/Api/WinServer.cpp index 8232911..cefd4a5 100644 --- a/kernel/src/Api/WinServer.cpp +++ b/kernel/src/Api/WinServer.cpp @@ -94,7 +94,7 @@ namespace WinServer { ResetSlotLocked(slot); } - static int SendEventLocked(int windowId, const Montauk::WinEvent* event) { + static int SendEventLocked(int windowId, const montauk::abi::WinEvent* event) { if (windowId < 0 || windowId >= MaxWindows || event == nullptr) return -1; WindowSlot& slot = g_slots[windowId]; if (!slot.used || slot.eventMailbox == nullptr) return -1; @@ -200,7 +200,7 @@ namespace WinServer { return 0; } - int Poll(int windowId, int callerPid, Montauk::WinEvent* outEvent) { + int Poll(int windowId, int callerPid, montauk::abi::WinEvent* outEvent) { WsGuard guard; if (windowId < 0 || windowId >= MaxWindows || outEvent == nullptr) return -1; @@ -213,13 +213,13 @@ namespace WinServer { return rc > 0 ? 1 : 0; } - int Enumerate(Montauk::WinInfo* outArray, int maxCount) { + int Enumerate(montauk::abi::WinInfo* outArray, int maxCount) { WsGuard guard; int count = 0; for (int i = 0; i < MaxWindows && count < maxCount; i++) { if (!g_slots[i].used) continue; - Montauk::WinInfo& info = outArray[count]; + montauk::abi::WinInfo& info = outArray[count]; info.id = i; info.ownerPid = g_slots[i].ownerPid; for (int j = 0; j < 64; j++) info.title[j] = g_slots[i].title[j]; @@ -263,7 +263,7 @@ namespace WinServer { return result; } - int SendEvent(int windowId, const Montauk::WinEvent* event) { + int SendEvent(int windowId, const montauk::abi::WinEvent* event) { WsGuard guard; return SendEventLocked(windowId, event); } @@ -346,7 +346,7 @@ namespace WinServer { WindowSlot& slot = g_slots[windowId]; if (!slot.used || slot.ownerPid != callerPid) return -1; - slot.flags = flags & Montauk::WIN_FLAG_FULLSCREEN; + slot.flags = flags & montauk::abi::WIN_FLAG_FULLSCREEN; return 0; } @@ -356,7 +356,7 @@ namespace WinServer { if (scale > 2) scale = 2; g_uiScale = scale; - Montauk::WinEvent ev{}; + montauk::abi::WinEvent ev{}; ev.type = 4; ev.scale.scale = scale; for (int i = 0; i < MaxWindows; i++) { diff --git a/kernel/src/Api/WinServer.hpp b/kernel/src/Api/WinServer.hpp index 333e46f..e36c629 100644 --- a/kernel/src/Api/WinServer.hpp +++ b/kernel/src/Api/WinServer.hpp @@ -31,11 +31,11 @@ namespace WinServer { uint64_t& heapNext, uint64_t& outVa); int Destroy(int windowId, int callerPid); int Present(int windowId, int callerPid); - int Poll(int windowId, int callerPid, Montauk::WinEvent* outEvent); - int Enumerate(Montauk::WinInfo* outArray, int maxCount); + int Poll(int windowId, int callerPid, montauk::abi::WinEvent* outEvent); + int Enumerate(montauk::abi::WinInfo* outArray, int maxCount); uint64_t Map(int windowId, int callerPid, uint64_t callerPml4, uint64_t& heapNext); int Unmap(int windowId, int callerPid, uint64_t callerPml4); - int SendEvent(int windowId, const Montauk::WinEvent* event); + int SendEvent(int windowId, const montauk::abi::WinEvent* event); int Resize(int windowId, int callerPid, uint64_t ownerPml4, int newW, int newH, uint64_t& heapNext, uint64_t& outVa); void CleanupProcess(int pid); diff --git a/kernel/src/Api/Window.hpp b/kernel/src/Api/Window.hpp index c6f5a4f..1675592 100644 --- a/kernel/src/Api/Window.hpp +++ b/kernel/src/Api/Window.hpp @@ -12,7 +12,7 @@ #include "Syscall.hpp" #include "WinServer.hpp" -namespace Montauk { +namespace montauk::abi { static int Sys_WinCreate(const char* title, int w, int h, WinCreateResult* result) { if (result == nullptr || title == nullptr) return -1; diff --git a/kernel/src/Drivers/Audio/Mixer.cpp b/kernel/src/Drivers/Audio/Mixer.cpp index cea5f9d..cc5ca09 100644 --- a/kernel/src/Drivers/Audio/Mixer.cpp +++ b/kernel/src/Drivers/Audio/Mixer.cpp @@ -437,15 +437,15 @@ namespace Drivers::Audio::Mixer { int Control(int handle, int cmd, int value) { // Master-scope commands ignore the handle. switch (cmd) { - case Montauk::AUDIO_CTL_SET_MASTER_VOLUME: + case montauk::abi::AUDIO_CTL_SET_MASTER_VOLUME: SetMasterVolume(value); return 0; - case Montauk::AUDIO_CTL_GET_MASTER_VOLUME: + case montauk::abi::AUDIO_CTL_GET_MASTER_VOLUME: return GetMasterVolume(); - case Montauk::AUDIO_CTL_SET_MASTER_MUTE: + case montauk::abi::AUDIO_CTL_SET_MASTER_MUTE: SetMasterMute(value != 0); return 0; - case Montauk::AUDIO_CTL_GET_MASTER_MUTE: + case montauk::abi::AUDIO_CTL_GET_MASTER_MUTE: return GetMasterMute() ? 1 : 0; } @@ -458,27 +458,27 @@ namespace Drivers::Audio::Mixer { int rv = -1; bool changed = false; switch (cmd) { - case Montauk::AUDIO_CTL_SET_VOLUME: { + case montauk::abi::AUDIO_CTL_SET_VOLUME: { int v = value; if (v < 0) v = 0; if (v > 100) v = 100; if (s.volume != (uint8_t)v) { s.volume = (uint8_t)v; changed = true; } rv = 0; break; } - case Montauk::AUDIO_CTL_GET_VOLUME: + case montauk::abi::AUDIO_CTL_GET_VOLUME: rv = s.volume; break; - case Montauk::AUDIO_CTL_GET_POS: + case montauk::abi::AUDIO_CTL_GET_POS: rv = (int)(s.consumedInputBytes & 0x7FFFFFFF); break; - case Montauk::AUDIO_CTL_PAUSE: + case montauk::abi::AUDIO_CTL_PAUSE: if (s.paused != (value != 0)) { s.paused = (value != 0); changed = true; } rv = 0; break; - case Montauk::AUDIO_CTL_SET_MUTE: + case montauk::abi::AUDIO_CTL_SET_MUTE: if (s.muted != (value != 0)) { s.muted = (value != 0); changed = true; } rv = 0; break; - case Montauk::AUDIO_CTL_GET_MUTE: + case montauk::abi::AUDIO_CTL_GET_MUTE: rv = s.muted ? 1 : 0; break; default: @@ -491,7 +491,7 @@ namespace Drivers::Audio::Mixer { return rv; } - int List(Montauk::AudioStreamInfo* buf, int maxCount) { + int List(montauk::abi::AudioStreamInfo* buf, int maxCount) { if (!buf || maxCount <= 0) return 0; g_lock.Acquire(); int count = 0; diff --git a/kernel/src/Drivers/Audio/Mixer.hpp b/kernel/src/Drivers/Audio/Mixer.hpp index 5817b7a..312d107 100644 --- a/kernel/src/Drivers/Audio/Mixer.hpp +++ b/kernel/src/Drivers/Audio/Mixer.hpp @@ -29,7 +29,7 @@ namespace Drivers::Audio::Mixer { int Control(int handle, int cmd, int value); // Enumerate all currently-active streams. - int List(Montauk::AudioStreamInfo* buf, int maxCount); + int List(montauk::abi::AudioStreamInfo* buf, int maxCount); // Close every stream owned by `pid`. Called from the scheduler on process // exit / kill so leaked handles do not occupy mixer slots. diff --git a/kernel/src/Ipc/Ipc.cpp b/kernel/src/Ipc/Ipc.cpp index 3543a32..c933f12 100644 --- a/kernel/src/Ipc/Ipc.cpp +++ b/kernel/src/Ipc/Ipc.cpp @@ -808,7 +808,7 @@ namespace Ipc { int StreamReadHandle(int handle, uint8_t* out, int maxLen) { if (out == nullptr) return -1; - if (maxLen > 0 && !Montauk::UserMemory::Range((uint64_t)out, (uint64_t)maxLen, true)) return -1; + if (maxLen > 0 && !montauk::abi::UserMemory::Range((uint64_t)out, (uint64_t)maxLen, true)) return -1; HandleType type = HandleType::None; Object* object = nullptr; @@ -820,7 +820,7 @@ namespace Ipc { int StreamWriteHandle(int handle, const uint8_t* data, int len) { if (data == nullptr) return -1; - if (len > 0 && !Montauk::UserMemory::Range((uint64_t)data, (uint64_t)len, false)) return -1; + if (len > 0 && !montauk::abi::UserMemory::Range((uint64_t)data, (uint64_t)len, false)) return -1; HandleType type = HandleType::None; Object* object = nullptr; @@ -963,9 +963,9 @@ namespace Ipc { int MailboxSendCoalescedMouse(Mailbox* mailbox, uint32_t msgType, const void* data, uint16_t len) { if (mailbox == nullptr || data == nullptr) return -1; - if (len != sizeof(Montauk::WinEvent)) return MailboxSend(mailbox, msgType, data, len); + if (len != sizeof(montauk::abi::WinEvent)) return MailboxSend(mailbox, msgType, data, len); - const Montauk::WinEvent* incoming = (const Montauk::WinEvent*)data; + const montauk::abi::WinEvent* incoming = (const montauk::abi::WinEvent*)data; if (incoming->type != 1 || incoming->mouse.scroll != 0) return MailboxSend(mailbox, msgType, data, len); @@ -983,7 +983,7 @@ namespace Ipc { uint32_t idx = (mailbox->head + MaxMailboxMessages - 1) % MaxMailboxMessages; MailboxMessage& latest = mailbox->messages[idx]; if (latest.type == msgType && latest.size == len && !latest.hasAttachment) { - const Montauk::WinEvent* queued = (const Montauk::WinEvent*)latest.data; + const montauk::abi::WinEvent* queued = (const montauk::abi::WinEvent*)latest.data; bool queuedTransition = queued->type != 1 || queued->mouse.scroll != 0 || queued->mouse.buttons != queued->mouse.prev_buttons; @@ -1060,7 +1060,7 @@ namespace Ipc { } int MailboxSendHandle(int handle, uint32_t msgType, const void* data, uint16_t len, int attachHandle) { - if (len > 0 && (data == nullptr || !Montauk::UserMemory::Range((uint64_t)data, len, false))) return -1; + if (len > 0 && (data == nullptr || !montauk::abi::UserMemory::Range((uint64_t)data, len, false))) return -1; HandleType type = HandleType::None; Object* object = nullptr; @@ -1072,12 +1072,12 @@ namespace Ipc { } int MailboxRecvHandle(int handle, uint32_t* msgType, void* data, uint16_t* inOutLen, int* outAttachHandle) { - if (inOutLen == nullptr || !Montauk::UserMemory::Writable((uint64_t)inOutLen)) return -1; + if (inOutLen == nullptr || !montauk::abi::UserMemory::Writable((uint64_t)inOutLen)) return -1; uint16_t requestedLen = *inOutLen; - if (msgType != nullptr && !Montauk::UserMemory::Writable((uint64_t)msgType)) return -1; - if (requestedLen > 0 && (data == nullptr || !Montauk::UserMemory::Range((uint64_t)data, requestedLen, true))) return -1; - if (outAttachHandle != nullptr && !Montauk::UserMemory::Writable((uint64_t)outAttachHandle)) return -1; + if (msgType != nullptr && !montauk::abi::UserMemory::Writable((uint64_t)msgType)) return -1; + if (requestedLen > 0 && (data == nullptr || !montauk::abi::UserMemory::Range((uint64_t)data, requestedLen, true))) return -1; + if (outAttachHandle != nullptr && !montauk::abi::UserMemory::Writable((uint64_t)outAttachHandle)) return -1; HandleType type = HandleType::None; Object* object = nullptr; @@ -1139,7 +1139,7 @@ namespace Ipc { int FileReadHandle(int handle, uint8_t* buffer, uint64_t offset, uint64_t size) { if (buffer == nullptr) return -1; - if (size > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, size, true)) return -1; + if (size > 0 && !montauk::abi::UserMemory::Range((uint64_t)buffer, size, true)) return -1; HandleType type = HandleType::None; Object* object = nullptr; @@ -1151,7 +1151,7 @@ namespace Ipc { int FileWriteHandle(int handle, const uint8_t* buffer, uint64_t offset, uint64_t size) { if (buffer == nullptr) return -1; - if (size > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, size, false)) return -1; + if (size > 0 && !montauk::abi::UserMemory::Range((uint64_t)buffer, size, false)) return -1; HandleType type = HandleType::None; Object* object = nullptr; @@ -1371,7 +1371,7 @@ namespace Ipc { int SocketSendHandle(int handle, const uint8_t* data, uint32_t len) { if (data == nullptr) return -1; - if (len > 0 && !Montauk::UserMemory::Range((uint64_t)data, len, false)) return -1; + if (len > 0 && !montauk::abi::UserMemory::Range((uint64_t)data, len, false)) return -1; Socket* socket = nullptr; uint32_t rights = 0; @@ -1387,7 +1387,7 @@ namespace Ipc { int SocketRecvHandle(int handle, uint8_t* buffer, uint32_t maxLen) { if (buffer == nullptr) return -1; - if (maxLen > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, maxLen, true)) return -1; + if (maxLen > 0 && !montauk::abi::UserMemory::Range((uint64_t)buffer, maxLen, true)) return -1; Socket* socket = nullptr; uint32_t rights = 0; @@ -1406,7 +1406,7 @@ namespace Ipc { int SocketSendToHandle(int handle, const uint8_t* data, uint32_t len, uint32_t destIp, uint16_t destPort) { if (data == nullptr) return -1; - if (len > 0 && !Montauk::UserMemory::Range((uint64_t)data, len, false)) return -1; + if (len > 0 && !montauk::abi::UserMemory::Range((uint64_t)data, len, false)) return -1; Socket* socket = nullptr; uint32_t rights = 0; @@ -1437,9 +1437,9 @@ namespace Ipc { int SocketRecvFromHandle(int handle, uint8_t* buffer, uint32_t maxLen, uint32_t* srcIp, uint16_t* srcPort) { if (buffer == nullptr) return -1; - if (maxLen > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, maxLen, true)) return -1; - if (srcIp != nullptr && !Montauk::UserMemory::Writable((uint64_t)srcIp)) return -1; - if (srcPort != nullptr && !Montauk::UserMemory::Writable((uint64_t)srcPort)) return -1; + if (maxLen > 0 && !montauk::abi::UserMemory::Range((uint64_t)buffer, maxLen, true)) return -1; + if (srcIp != nullptr && !montauk::abi::UserMemory::Writable((uint64_t)srcIp)) return -1; + if (srcPort != nullptr && !montauk::abi::UserMemory::Writable((uint64_t)srcPort)) return -1; Socket* socket = nullptr; uint32_t rights = 0; diff --git a/kernel/src/Main.cpp b/kernel/src/Main.cpp index ae39931..1c2696a 100644 --- a/kernel/src/Main.cpp +++ b/kernel/src/Main.cpp @@ -185,7 +185,7 @@ extern "C" void kmain() { Drivers::USB::Bluetooth::ServiceDeferredInit(); Hal::LoadTSS(); - Montauk::InitializeSyscalls(); + montauk::abi::InitializeSyscalls(); Sched::Initialize(); Ipc::Initialize(); diff --git a/kernel/src/Memory/PageFrameAllocator.cpp b/kernel/src/Memory/PageFrameAllocator.cpp index e57d0dc..4359335 100644 --- a/kernel/src/Memory/PageFrameAllocator.cpp +++ b/kernel/src/Memory/PageFrameAllocator.cpp @@ -200,7 +200,7 @@ namespace Memory { FreeRange(ptr, (size_t)n * 0x1000); } - void PageFrameAllocator::GetStats(Montauk::MemStats* out) { + void PageFrameAllocator::GetStats(montauk::abi::MemStats* out) { if (!out) return; Lock.Acquire(); uint64_t freeBytes = 0; diff --git a/kernel/src/Memory/PageFrameAllocator.hpp b/kernel/src/Memory/PageFrameAllocator.hpp index d7bdbe6..8cdb598 100644 --- a/kernel/src/Memory/PageFrameAllocator.hpp +++ b/kernel/src/Memory/PageFrameAllocator.hpp @@ -31,7 +31,7 @@ public: void Free(void* ptr); void Free(void* ptr, int n); - void GetStats(Montauk::MemStats* out); + void GetStats(montauk::abi::MemStats* out); }; extern PageFrameAllocator* g_pfa; diff --git a/kernel/src/Sched/Scheduler.cpp b/kernel/src/Sched/Scheduler.cpp index 978eede..37721d4 100644 --- a/kernel/src/Sched/Scheduler.cpp +++ b/kernel/src/Sched/Scheduler.cpp @@ -1089,8 +1089,8 @@ namespace Sched { // Release process-scoped IPC handles/mappings before tearing down the address space. Ipc::CleanupProcessSlot(slot, exitingPid, proc.pml4Phys); - Montauk::CleanupHeapForSlot(slot, proc.pml4Phys); - Montauk::CleanupLibTable(slot); + montauk::abi::CleanupHeapForSlot(slot, proc.pml4Phys); + montauk::abi::CleanupLibTable(slot); proc.waitingForPid = -1; proc.sleepUntilTick = 0; diff --git a/kernel/src/Sched/Scheduler.hpp b/kernel/src/Sched/Scheduler.hpp index 509dbef..b05431d 100644 --- a/kernel/src/Sched/Scheduler.hpp +++ b/kernel/src/Sched/Scheduler.hpp @@ -82,7 +82,7 @@ namespace Sched { uint8_t* inBuf = nullptr; // 4KB ring: parent writes, child reads (getchar) volatile uint32_t inHead = 0; volatile uint32_t inTail = 0; - Montauk::KeyEvent keyBuf[64]; // parent injects, child reads (getkey/iskeyavailable) + montauk::abi::KeyEvent keyBuf[64]; // parent injects, child reads (getkey/iskeyavailable) volatile uint32_t keyHead = 0; volatile uint32_t keyTail = 0; static constexpr uint32_t IoBufSize = 4096; diff --git a/programs/include/Api/Syscall.hpp b/programs/include/Api/Syscall.hpp index 3b2110e..ee1d72c 100644 --- a/programs/include/Api/Syscall.hpp +++ b/programs/include/Api/Syscall.hpp @@ -8,7 +8,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { // Syscall numbers static constexpr uint64_t SYS_EXIT = 0; diff --git a/programs/include/engine/engine.h b/programs/include/engine/engine.h index 2af3a1e..f35c6ff 100644 --- a/programs/include/engine/engine.h +++ b/programs/include/engine/engine.h @@ -56,7 +56,7 @@ struct Engine { } // Create window - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create(title, w, h, &wres) < 0 || wres.id < 0) return false; @@ -77,7 +77,7 @@ struct Engine { } // Poll one window event. Returns true if an event was received. - bool poll(Montauk::WinEvent* ev) { + bool poll(montauk::abi::WinEvent* ev) { int r = montauk::win_poll(win_id, ev); if (r < 0) { running = false; return false; } if (r == 0) return false; diff --git a/programs/include/engine/input.h b/programs/include/engine/input.h index da6c515..3058172 100644 --- a/programs/include/engine/input.h +++ b/programs/include/engine/input.h @@ -55,7 +55,7 @@ struct InputState { } // Process a window event - void handle_event(const Montauk::WinEvent& ev) { + void handle_event(const montauk::abi::WinEvent& ev) { if (ev.type == 0) { // keyboard // PS/2 scan code set 1: release codes have bit 7 set. // Mask to base scancode so press and release map to the same index. diff --git a/programs/include/gui/clipboard.hpp b/programs/include/gui/clipboard.hpp index c5ab6e2..614eaba 100644 --- a/programs/include/gui/clipboard.hpp +++ b/programs/include/gui/clipboard.hpp @@ -22,13 +22,13 @@ namespace gui { return clipboard_set_text(text, text ? montauk::slen(text) : 0); } - inline bool clipboard_get_info(Montauk::ClipboardInfo* out) { + inline bool clipboard_get_info(montauk::abi::ClipboardInfo* out) { if (out == nullptr) return false; return montauk::clipboard_get_info(out) == 0; } inline bool clipboard_has_text() { - Montauk::ClipboardInfo info = {}; + montauk::abi::ClipboardInfo info = {}; return clipboard_get_info(&info) && info.textBytes > 0; } @@ -36,7 +36,7 @@ namespace gui { if (out_len) *out_len = 0; if (out_serial) *out_serial = 0; - Montauk::ClipboardInfo info = {}; + montauk::abi::ClipboardInfo info = {}; if (!clipboard_get_info(&info) || info.textBytes == 0) return nullptr; diff --git a/programs/include/gui/desktop.hpp b/programs/include/gui/desktop.hpp index 7bf6073..05dbe41 100644 --- a/programs/include/gui/desktop.hpp +++ b/programs/include/gui/desktop.hpp @@ -88,7 +88,7 @@ struct DesktopState { char user_config_dir[128]; // "0:/users//config" bool is_admin; - Montauk::MouseState mouse; + montauk::abi::MouseState mouse; uint8_t prev_buttons; bool app_menu_open; @@ -160,7 +160,7 @@ struct DesktopState { int ctx_menu_x, ctx_menu_y; bool net_popup_open; - Montauk::NetCfg cached_net_cfg; + montauk::abi::NetCfg cached_net_cfg; uint64_t net_cfg_last_poll; Rect net_icon_rect; @@ -175,7 +175,7 @@ struct DesktopState { // Temperature monitoring static constexpr int MAX_THERMAL_ZONES = 8; - Montauk::ThermalInfo thermal_zones[MAX_THERMAL_ZONES]; + montauk::abi::ThermalInfo thermal_zones[MAX_THERMAL_ZONES]; int thermal_zone_count; uint64_t thermal_last_poll; Rect temp_icon_rect; @@ -214,6 +214,6 @@ void desktop_raise_window(DesktopState* ds, int idx); void desktop_draw_panel(DesktopState* ds); void desktop_draw_window(DesktopState* ds, int idx); void desktop_handle_mouse(DesktopState* ds); -void desktop_handle_keyboard(DesktopState* ds, const Montauk::KeyEvent& key); +void desktop_handle_keyboard(DesktopState* ds, const montauk::abi::KeyEvent& key); } // namespace gui diff --git a/programs/include/gui/framebuffer.hpp b/programs/include/gui/framebuffer.hpp index 65bfb2b..303d657 100644 --- a/programs/include/gui/framebuffer.hpp +++ b/programs/include/gui/framebuffer.hpp @@ -61,7 +61,7 @@ class Framebuffer { public: Framebuffer() : hw_fb(nullptr), back_buf(nullptr), fb_width(0), fb_height(0), fb_pitch(0) { - Montauk::FbInfo info; + montauk::abi::FbInfo info; montauk::fb_info(&info); fb_width = (int)info.width; diff --git a/programs/include/gui/mtk/widgets.hpp b/programs/include/gui/mtk/widgets.hpp index 03328db..e4171aa 100644 --- a/programs/include/gui/mtk/widgets.hpp +++ b/programs/include/gui/mtk/widgets.hpp @@ -552,7 +552,7 @@ inline int text_input_handle_mouse(TextInputState& state, inline int text_input_key(TextInputState& state, char* text, int cap, - const Montauk::KeyEvent& key, + const montauk::abi::KeyEvent& key, TextInputCharFilter filter = nullptr, void* userdata = nullptr, bool masked = false) { diff --git a/programs/include/gui/standalone.hpp b/programs/include/gui/standalone.hpp index 2a2fcd4..d5d31ac 100644 --- a/programs/include/gui/standalone.hpp +++ b/programs/include/gui/standalone.hpp @@ -24,7 +24,7 @@ struct WsWindow { : id(-1), pixels(nullptr), width(0), height(0), scale_factor(1), closed(false) {} bool create(const char* title, int w, int h) { - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create(title, w, h, &wres) < 0 || wres.id < 0) return false; @@ -37,7 +37,7 @@ struct WsWindow { return true; } - int poll(Montauk::WinEvent* ev) { + int poll(montauk::abi::WinEvent* ev) { if (id < 0 || closed) return -1; int r = montauk::win_poll(id, ev); diff --git a/programs/include/gui/terminal.hpp b/programs/include/gui/terminal.hpp index 2b33442..bd935fe 100644 --- a/programs/include/gui/terminal.hpp +++ b/programs/include/gui/terminal.hpp @@ -831,7 +831,7 @@ static inline void terminal_resize(TerminalState* t, int new_cols, int new_rows) } } -static inline void terminal_handle_key(TerminalState* t, const Montauk::KeyEvent& key) { +static inline void terminal_handle_key(TerminalState* t, const montauk::abi::KeyEvent& key) { // Snap to live on any keyboard input if (t->view_offset > 0) { t->view_offset = 0; diff --git a/programs/include/gui/widgets.hpp b/programs/include/gui/widgets.hpp index 56315c1..076846f 100644 --- a/programs/include/gui/widgets.hpp +++ b/programs/include/gui/widgets.hpp @@ -227,7 +227,7 @@ struct TextBox { } } - void handle_key(const Montauk::KeyEvent& key) { + void handle_key(const montauk::abi::KeyEvent& key) { if (!focused || !key.pressed) return; if (key.ascii == '\b' || key.scancode == 0x0E) { diff --git a/programs/include/gui/window.hpp b/programs/include/gui/window.hpp index fa16561..6baed69 100644 --- a/programs/include/gui/window.hpp +++ b/programs/include/gui/window.hpp @@ -32,7 +32,7 @@ static constexpr int MIN_WINDOW_H = 80; struct Window; using WindowDrawCallback = void (*)(Window* win, Framebuffer& fb); using WindowMouseCallback = void (*)(Window* win, MouseEvent& ev); -using WindowKeyCallback = void (*)(Window* win, const Montauk::KeyEvent& key); +using WindowKeyCallback = void (*)(Window* win, const montauk::abi::KeyEvent& key); using WindowCloseCallback = void (*)(Window* win); using WindowPollCallback = void (*)(Window* win); diff --git a/programs/include/http/http.hpp b/programs/include/http/http.hpp index e8f87ec..e84c358 100644 --- a/programs/include/http/http.hpp +++ b/programs/include/http/http.hpp @@ -350,7 +350,7 @@ inline Response get_plain(const char* host, const char* path, int reqLen = build_request(req, sizeof(req), "GET", host, path, nullptr, nullptr, 0, extra_headers); - int sock = montauk::socket(Montauk::SOCK_TCP); + int sock = montauk::socket(montauk::abi::SOCK_TCP); if (sock < 0) return resp; if (montauk::connect(sock, ip, 80) < 0) { montauk::closesocket(sock); return resp; } diff --git a/programs/include/montauk/heap.h b/programs/include/montauk/heap.h index 87ca143..8d306d7 100644 --- a/programs/include/montauk/heap.h +++ b/programs/include/montauk/heap.h @@ -46,7 +46,7 @@ namespace heap_detail { static inline void heap_lock_acquire() { while (__atomic_exchange_n(&g_heap_lock, 1, __ATOMIC_ACQUIRE) != 0) { - syscall0(Montauk::SYS_YIELD); + syscall0(montauk::abi::SYS_YIELD); } } static inline void heap_lock_release() { diff --git a/programs/include/montauk/syscall.h b/programs/include/montauk/syscall.h index d60a445..132ae28 100644 --- a/programs/include/montauk/syscall.h +++ b/programs/include/montauk/syscall.h @@ -110,519 +110,519 @@ namespace montauk { // Process [[noreturn]] inline void exit(int code = 0) { - syscall1(Montauk::SYS_EXIT, (uint64_t)code); + syscall1(montauk::abi::SYS_EXIT, (uint64_t)code); __builtin_unreachable(); } - inline void yield() { syscall0(Montauk::SYS_YIELD); } - inline void sleep_ms(uint64_t ms) { syscall1(Montauk::SYS_SLEEP_MS, ms); } - inline int getpid() { return (int)syscall0(Montauk::SYS_GETPID); } + inline void yield() { syscall0(montauk::abi::SYS_YIELD); } + inline void sleep_ms(uint64_t ms) { syscall1(montauk::abi::SYS_SLEEP_MS, ms); } + inline int getpid() { return (int)syscall0(montauk::abi::SYS_GETPID); } inline int spawn(const char* path, const char* args = nullptr) { - return (int)syscall2(Montauk::SYS_SPAWN, (uint64_t)path, (uint64_t)args); + return (int)syscall2(montauk::abi::SYS_SPAWN, (uint64_t)path, (uint64_t)args); } inline int chdir(const char* path) { - return (int)syscall1(Montauk::SYS_CHDIR, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_CHDIR, (uint64_t)path); } inline int getcwd(char* buf, uint64_t maxLen) { - return (int)syscall2(Montauk::SYS_GETCWD, (uint64_t)buf, maxLen); + return (int)syscall2(montauk::abi::SYS_GETCWD, (uint64_t)buf, maxLen); } // Console - inline void print(const char* text) { syscall1(Montauk::SYS_PRINT, (uint64_t)text); } - inline void putchar(char c) { syscall1(Montauk::SYS_PUTCHAR, (uint64_t)c); } + inline void print(const char* text) { syscall1(montauk::abi::SYS_PRINT, (uint64_t)text); } + inline void putchar(char c) { syscall1(montauk::abi::SYS_PUTCHAR, (uint64_t)c); } // File I/O - inline int open(const char* path) { return (int)syscall1(Montauk::SYS_OPEN, (uint64_t)path); } + inline int open(const char* path) { return (int)syscall1(montauk::abi::SYS_OPEN, (uint64_t)path); } inline int read(int handle, uint8_t* buf, uint64_t off, uint64_t size) { - return (int)syscall4(Montauk::SYS_READ, (uint64_t)handle, (uint64_t)buf, off, size); + return (int)syscall4(montauk::abi::SYS_READ, (uint64_t)handle, (uint64_t)buf, off, size); } - inline uint64_t getsize(int handle) { return (uint64_t)syscall1(Montauk::SYS_GETSIZE, (uint64_t)handle); } - inline void close(int handle) { syscall1(Montauk::SYS_CLOSE, (uint64_t)handle); } + inline uint64_t getsize(int handle) { return (uint64_t)syscall1(montauk::abi::SYS_GETSIZE, (uint64_t)handle); } + inline void close(int handle) { syscall1(montauk::abi::SYS_CLOSE, (uint64_t)handle); } inline int readdir(const char* path, const char** names, int max) { - return (int)syscall3(Montauk::SYS_READDIR, (uint64_t)path, (uint64_t)names, (uint64_t)max); + return (int)syscall3(montauk::abi::SYS_READDIR, (uint64_t)path, (uint64_t)names, (uint64_t)max); } // Paginated directory read: returns entries [startIndex, startIndex+max). // Call repeatedly with increasing startIndex (advancing by the returned // count) until it returns 0 to enumerate directories of any size. inline int readdir_at(const char* path, const char** names, int max, int startIndex) { - return (int)syscall4(Montauk::SYS_READDIR_AT, (uint64_t)path, (uint64_t)names, + return (int)syscall4(montauk::abi::SYS_READDIR_AT, (uint64_t)path, (uint64_t)names, (uint64_t)max, (uint64_t)startIndex); } // File write/create inline int fwrite(int handle, const uint8_t* buf, uint64_t off, uint64_t size) { - return (int)syscall4(Montauk::SYS_FWRITE, (uint64_t)handle, (uint64_t)buf, off, size); + return (int)syscall4(montauk::abi::SYS_FWRITE, (uint64_t)handle, (uint64_t)buf, off, size); } inline int fcreate(const char* path) { - return (int)syscall1(Montauk::SYS_FCREATE, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_FCREATE, (uint64_t)path); } inline int fdelete(const char* path) { - return (int)syscall1(Montauk::SYS_FDELETE, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_FDELETE, (uint64_t)path); } inline int fmkdir(const char* path) { - return (int)syscall1(Montauk::SYS_FMKDIR, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_FMKDIR, (uint64_t)path); } inline int frename(const char* oldPath, const char* newPath) { - return (int)syscall2(Montauk::SYS_FRENAME, (uint64_t)oldPath, (uint64_t)newPath); + return (int)syscall2(montauk::abi::SYS_FRENAME, (uint64_t)oldPath, (uint64_t)newPath); } inline int drivelist(int* outDrives, int max) { - return (int)syscall2(Montauk::SYS_DRIVELIST, (uint64_t)outDrives, (uint64_t)max); + return (int)syscall2(montauk::abi::SYS_DRIVELIST, (uint64_t)outDrives, (uint64_t)max); } inline int drivelabel(int drive, char* outLabel, int maxLen) { - return (int)syscall3(Montauk::SYS_DRIVELABEL, (uint64_t)drive, (uint64_t)outLabel, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_DRIVELABEL, (uint64_t)drive, (uint64_t)outLabel, (uint64_t)maxLen); } // Returns the kernel BlockDeviceKind backing the drive: 0=unknown/ramdisk, // 1=SATA, 2=SATAPI, 3=NVMe, 4=USB MSC. inline int drivekind(int drive) { - return (int)syscall1(Montauk::SYS_DRIVEKIND, (uint64_t)drive); + return (int)syscall1(montauk::abi::SYS_DRIVEKIND, (uint64_t)drive); } // Memory - inline void* alloc(uint64_t size) { return (void*)syscall1(Montauk::SYS_ALLOC, size); } - inline void free(void* ptr) { syscall1(Montauk::SYS_FREE, (uint64_t)ptr); } + inline void* alloc(uint64_t size) { return (void*)syscall1(montauk::abi::SYS_ALLOC, size); } + inline void free(void* ptr) { syscall1(montauk::abi::SYS_FREE, (uint64_t)ptr); } // Timekeeping - inline uint64_t get_ticks() { return (uint64_t)syscall0(Montauk::SYS_GETTICKS); } - inline uint64_t get_milliseconds() { return (uint64_t)syscall0(Montauk::SYS_GETMILLISECONDS); } + inline uint64_t get_ticks() { return (uint64_t)syscall0(montauk::abi::SYS_GETTICKS); } + inline uint64_t get_milliseconds() { return (uint64_t)syscall0(montauk::abi::SYS_GETMILLISECONDS); } // System - inline void get_info(Montauk::SysInfo* info) { syscall1(Montauk::SYS_GETINFO, (uint64_t)info); } + inline void get_info(montauk::abi::SysInfo* info) { syscall1(montauk::abi::SYS_GETINFO, (uint64_t)info); } // Keyboard - inline bool is_key_available() { return (bool)syscall0(Montauk::SYS_ISKEYAVAILABLE); } - inline void getkey(Montauk::KeyEvent* out) { syscall1(Montauk::SYS_GETKEY, (uint64_t)out); } - inline char getchar() { return (char)syscall0(Montauk::SYS_GETCHAR); } + inline bool is_key_available() { return (bool)syscall0(montauk::abi::SYS_ISKEYAVAILABLE); } + inline void getkey(montauk::abi::KeyEvent* out) { syscall1(montauk::abi::SYS_GETKEY, (uint64_t)out); } + inline char getchar() { return (char)syscall0(montauk::abi::SYS_GETCHAR); } inline uint64_t input_wait(uint64_t observedSerial, uint64_t timeoutMs) { - return (uint64_t)syscall2(Montauk::SYS_INPUT_WAIT, observedSerial, timeoutMs); + return (uint64_t)syscall2(montauk::abi::SYS_INPUT_WAIT, observedSerial, timeoutMs); } // Networking inline int32_t ping(uint32_t ip, uint32_t timeoutMs = 3000) { - return (int32_t)syscall2(Montauk::SYS_PING, (uint64_t)ip, (uint64_t)timeoutMs); + return (int32_t)syscall2(montauk::abi::SYS_PING, (uint64_t)ip, (uint64_t)timeoutMs); } // DNS resolve: returns IP in network byte order, or 0 on failure inline uint32_t resolve(const char* hostname) { - return (uint32_t)syscall1(Montauk::SYS_RESOLVE, (uint64_t)hostname); + return (uint32_t)syscall1(montauk::abi::SYS_RESOLVE, (uint64_t)hostname); } // Network configuration - inline void get_netcfg(Montauk::NetCfg* out) { syscall1(Montauk::SYS_GETNETCFG, (uint64_t)out); } - inline int set_netcfg(const Montauk::NetCfg* cfg) { return (int)syscall1(Montauk::SYS_SETNETCFG, (uint64_t)cfg); } - inline int net_status(Montauk::NetStatus* out) { return (int)syscall1(Montauk::SYS_NETSTATUS, (uint64_t)out); } + inline void get_netcfg(montauk::abi::NetCfg* out) { syscall1(montauk::abi::SYS_GETNETCFG, (uint64_t)out); } + inline int set_netcfg(const montauk::abi::NetCfg* cfg) { return (int)syscall1(montauk::abi::SYS_SETNETCFG, (uint64_t)cfg); } + inline int net_status(montauk::abi::NetStatus* out) { return (int)syscall1(montauk::abi::SYS_NETSTATUS, (uint64_t)out); } // Sockets inline int socket(int type) { - return (int)syscall1(Montauk::SYS_SOCKET, (uint64_t)type); + return (int)syscall1(montauk::abi::SYS_SOCKET, (uint64_t)type); } inline int connect(int fd, uint32_t ip, uint16_t port) { - return (int)syscall3(Montauk::SYS_CONNECT, (uint64_t)fd, (uint64_t)ip, (uint64_t)port); + return (int)syscall3(montauk::abi::SYS_CONNECT, (uint64_t)fd, (uint64_t)ip, (uint64_t)port); } inline int bind(int fd, uint16_t port) { - return (int)syscall2(Montauk::SYS_BIND, (uint64_t)fd, (uint64_t)port); + return (int)syscall2(montauk::abi::SYS_BIND, (uint64_t)fd, (uint64_t)port); } inline int listen(int fd) { - return (int)syscall1(Montauk::SYS_LISTEN, (uint64_t)fd); + return (int)syscall1(montauk::abi::SYS_LISTEN, (uint64_t)fd); } inline int accept(int fd) { - return (int)syscall1(Montauk::SYS_ACCEPT, (uint64_t)fd); + return (int)syscall1(montauk::abi::SYS_ACCEPT, (uint64_t)fd); } inline int send(int fd, const void* data, uint32_t len) { - return (int)syscall3(Montauk::SYS_SEND, (uint64_t)fd, (uint64_t)data, (uint64_t)len); + return (int)syscall3(montauk::abi::SYS_SEND, (uint64_t)fd, (uint64_t)data, (uint64_t)len); } inline int recv(int fd, void* buf, uint32_t maxLen) { - return (int)syscall3(Montauk::SYS_RECV, (uint64_t)fd, (uint64_t)buf, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_RECV, (uint64_t)fd, (uint64_t)buf, (uint64_t)maxLen); } inline int closesocket(int fd) { - return (int)syscall1(Montauk::SYS_CLOSESOCK, (uint64_t)fd); + return (int)syscall1(montauk::abi::SYS_CLOSESOCK, (uint64_t)fd); } inline int sendto(int fd, const void* data, uint32_t len, uint32_t destIp, uint16_t destPort) { - return (int)syscall5(Montauk::SYS_SENDTO, (uint64_t)fd, (uint64_t)data, + return (int)syscall5(montauk::abi::SYS_SENDTO, (uint64_t)fd, (uint64_t)data, (uint64_t)len, (uint64_t)destIp, (uint64_t)destPort); } inline int recvfrom(int fd, void* buf, uint32_t maxLen, uint32_t* srcIp, uint16_t* srcPort) { - return (int)syscall5(Montauk::SYS_RECVFROM, (uint64_t)fd, (uint64_t)buf, + return (int)syscall5(montauk::abi::SYS_RECVFROM, (uint64_t)fd, (uint64_t)buf, (uint64_t)maxLen, (uint64_t)srcIp, (uint64_t)srcPort); } // Generic IPC inline int dup_handle(int handle) { - return (int)syscall1(Montauk::SYS_DUPHANDLE, (uint64_t)handle); + return (int)syscall1(montauk::abi::SYS_DUPHANDLE, (uint64_t)handle); } inline uint32_t wait_handle(int handle, uint32_t wantedSignals, uint64_t timeoutMs = ~0ULL) { - return (uint32_t)syscall3(Montauk::SYS_WAIT_HANDLE, (uint64_t)handle, + return (uint32_t)syscall3(montauk::abi::SYS_WAIT_HANDLE, (uint64_t)handle, (uint64_t)wantedSignals, timeoutMs); } inline int stream_create(int* outReadHandle, int* outWriteHandle, uint32_t capacity = 0) { - return (int)syscall3(Montauk::SYS_STREAM_CREATE, (uint64_t)outReadHandle, + return (int)syscall3(montauk::abi::SYS_STREAM_CREATE, (uint64_t)outReadHandle, (uint64_t)outWriteHandle, (uint64_t)capacity); } inline int stream_read(int handle, void* buf, int maxLen) { - return (int)syscall3(Montauk::SYS_STREAM_READ, (uint64_t)handle, (uint64_t)buf, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_STREAM_READ, (uint64_t)handle, (uint64_t)buf, (uint64_t)maxLen); } inline int stream_write(int handle, const void* data, int len) { - return (int)syscall3(Montauk::SYS_STREAM_WRITE, (uint64_t)handle, (uint64_t)data, (uint64_t)len); + return (int)syscall3(montauk::abi::SYS_STREAM_WRITE, (uint64_t)handle, (uint64_t)data, (uint64_t)len); } inline int mailbox_create(int* outSendHandle, int* outRecvHandle) { - return (int)syscall2(Montauk::SYS_MAILBOX_CREATE, (uint64_t)outSendHandle, (uint64_t)outRecvHandle); + return (int)syscall2(montauk::abi::SYS_MAILBOX_CREATE, (uint64_t)outSendHandle, (uint64_t)outRecvHandle); } inline int mailbox_send(int handle, uint32_t msgType, const void* data, uint16_t len, int attachHandle = -1) { - return (int)syscall5(Montauk::SYS_MAILBOX_SEND, (uint64_t)handle, (uint64_t)msgType, + return (int)syscall5(montauk::abi::SYS_MAILBOX_SEND, (uint64_t)handle, (uint64_t)msgType, (uint64_t)data, (uint64_t)len, (uint64_t)(int64_t)attachHandle); } inline int mailbox_recv(int handle, uint32_t* outMsgType, void* data, uint16_t* inOutLen, int* outAttachHandle = nullptr) { - return (int)syscall5(Montauk::SYS_MAILBOX_RECV, (uint64_t)handle, (uint64_t)outMsgType, + return (int)syscall5(montauk::abi::SYS_MAILBOX_RECV, (uint64_t)handle, (uint64_t)outMsgType, (uint64_t)data, (uint64_t)inOutLen, (uint64_t)outAttachHandle); } inline int waitset_create() { - return (int)syscall0(Montauk::SYS_WAITSET_CREATE); + return (int)syscall0(montauk::abi::SYS_WAITSET_CREATE); } inline int waitset_add(int waitsetHandle, int targetHandle, uint32_t signals) { - return (int)syscall3(Montauk::SYS_WAITSET_ADD, (uint64_t)waitsetHandle, + return (int)syscall3(montauk::abi::SYS_WAITSET_ADD, (uint64_t)waitsetHandle, (uint64_t)targetHandle, (uint64_t)signals); } inline int waitset_remove(int waitsetHandle, int index) { - return (int)syscall2(Montauk::SYS_WAITSET_REMOVE, (uint64_t)waitsetHandle, (uint64_t)index); + return (int)syscall2(montauk::abi::SYS_WAITSET_REMOVE, (uint64_t)waitsetHandle, (uint64_t)index); } - inline int waitset_wait(int waitsetHandle, Montauk::IpcWaitResult* outReady, uint64_t timeoutMs = ~0ULL) { - return (int)syscall3(Montauk::SYS_WAITSET_WAIT, (uint64_t)waitsetHandle, (uint64_t)outReady, timeoutMs); + inline int waitset_wait(int waitsetHandle, montauk::abi::IpcWaitResult* outReady, uint64_t timeoutMs = ~0ULL) { + return (int)syscall3(montauk::abi::SYS_WAITSET_WAIT, (uint64_t)waitsetHandle, (uint64_t)outReady, timeoutMs); } inline int proc_open(int pid) { - return (int)syscall1(Montauk::SYS_PROC_OPEN, (uint64_t)pid); + return (int)syscall1(montauk::abi::SYS_PROC_OPEN, (uint64_t)pid); } inline int surface_create(uint64_t byteSize) { - return (int)syscall1(Montauk::SYS_SURFACE_CREATE, byteSize); + return (int)syscall1(montauk::abi::SYS_SURFACE_CREATE, byteSize); } inline void* surface_map(int handle) { - return (void*)syscall1(Montauk::SYS_SURFACE_MAP, (uint64_t)handle); + return (void*)syscall1(montauk::abi::SYS_SURFACE_MAP, (uint64_t)handle); } inline int surface_resize(int handle, uint64_t newSize) { - return (int)syscall2(Montauk::SYS_SURFACE_RESIZE, (uint64_t)handle, newSize); + return (int)syscall2(montauk::abi::SYS_SURFACE_RESIZE, (uint64_t)handle, newSize); } // Shared library support inline int load_lib(const char* path) { - return (int)syscall1(Montauk::SYS_LOAD_LIB, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_LOAD_LIB, (uint64_t)path); } inline int unload_lib(int handle) { - return (int)syscall1(Montauk::SYS_UNLOAD_LIB, (uint64_t)handle); + return (int)syscall1(montauk::abi::SYS_UNLOAD_LIB, (uint64_t)handle); } inline void* dlsym(int handle, uint64_t symbolOffset) { - return (void*)syscall2(Montauk::SYS_DLSYM, (uint64_t)handle, symbolOffset); + return (void*)syscall2(montauk::abi::SYS_DLSYM, (uint64_t)handle, symbolOffset); } inline uint64_t get_libbase(int handle) { - return (uint64_t)syscall1(Montauk::SYS_GETLIBBASE, (uint64_t)handle); + return (uint64_t)syscall1(montauk::abi::SYS_GETLIBBASE, (uint64_t)handle); } // Crash report retrieval - inline int crash_report(Montauk::CrashReportInfo* out) { - return (int)syscall1(Montauk::SYS_CRASH_REPORT, (uint64_t)out); + inline int crash_report(montauk::abi::CrashReportInfo* out) { + return (int)syscall1(montauk::abi::SYS_CRASH_REPORT, (uint64_t)out); } // Process management - inline void waitpid(int pid) { syscall1(Montauk::SYS_WAITPID, (uint64_t)pid); } + inline void waitpid(int pid) { syscall1(montauk::abi::SYS_WAITPID, (uint64_t)pid); } // Framebuffer - inline void fb_info(Montauk::FbInfo* info) { syscall1(Montauk::SYS_FBINFO, (uint64_t)info); } - inline void* fb_map() { return (void*)syscall0(Montauk::SYS_FBMAP); } + inline void fb_info(montauk::abi::FbInfo* info) { syscall1(montauk::abi::SYS_FBINFO, (uint64_t)info); } + inline void* fb_map() { return (void*)syscall0(montauk::abi::SYS_FBMAP); } // Arguments inline int getargs(char* buf, uint64_t maxLen) { - return (int)syscall2(Montauk::SYS_GETARGS, (uint64_t)buf, maxLen); + return (int)syscall2(montauk::abi::SYS_GETARGS, (uint64_t)buf, maxLen); } // Terminal inline void termsize(int* cols, int* rows) { - uint64_t r = (uint64_t)syscall0(Montauk::SYS_TERMSIZE); + uint64_t r = (uint64_t)syscall0(montauk::abi::SYS_TERMSIZE); if (cols) *cols = (int)(r & 0xFFFFFFFF); if (rows) *rows = (int)(r >> 32); } inline void termscale(int scale_x, int scale_y) { - syscall2(Montauk::SYS_TERMSCALE, (uint64_t)scale_x, (uint64_t)scale_y); + syscall2(montauk::abi::SYS_TERMSCALE, (uint64_t)scale_x, (uint64_t)scale_y); } inline void get_termscale(int* scale_x, int* scale_y) { - uint64_t r = (uint64_t)syscall2(Montauk::SYS_TERMSCALE, 0, 0); + uint64_t r = (uint64_t)syscall2(montauk::abi::SYS_TERMSCALE, 0, 0); if (scale_x) *scale_x = (int)(r & 0xFFFFFFFF); if (scale_y) *scale_y = (int)(r >> 32); } // Timekeeping (wall-clock) - inline void gettime(Montauk::DateTime* out) { syscall1(Montauk::SYS_GETTIME, (uint64_t)out); } + inline void gettime(montauk::abi::DateTime* out) { syscall1(montauk::abi::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); } + inline void settz(int offset_minutes) { syscall1(montauk::abi::SYS_SETTZ, (uint64_t)(int64_t)offset_minutes); } + inline int gettz() { return (int)syscall0(montauk::abi::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); + return syscall2(montauk::abi::SYS_GETRANDOM, (uint64_t)buf, (uint64_t)len); } // Power management [[noreturn]] inline void reset() { - syscall0(Montauk::SYS_RESET); + syscall0(montauk::abi::SYS_RESET); __builtin_unreachable(); } [[noreturn]] inline void shutdown() { - syscall0(Montauk::SYS_SHUTDOWN); + syscall0(montauk::abi::SYS_SHUTDOWN); __builtin_unreachable(); } inline int suspend() { - return (int)syscall0(Montauk::SYS_SUSPEND); + return (int)syscall0(montauk::abi::SYS_SUSPEND); } // Graceful power-off request channel. The desktop posts a pending action - // (Montauk::POWER_REQ_SHUTDOWN / POWER_REQ_REBOOT) then exits; login.elf + // (montauk::abi::POWER_REQ_SHUTDOWN / POWER_REQ_REBOOT) then exits; login.elf // reads it with POWER_REQ_QUERY (read-and-clear), runs the shutdown stages, // and finally calls shutdown()/reset(). Returns the pending action for a // query, or 0 when posting one. inline int power_request(int action) { - return (int)syscall1(Montauk::SYS_POWER_REQUEST, (uint64_t)(int64_t)action); + return (int)syscall1(montauk::abi::SYS_POWER_REQUEST, (uint64_t)(int64_t)action); } // Mouse - inline void mouse_state(Montauk::MouseState* out) { syscall1(Montauk::SYS_MOUSESTATE, (uint64_t)out); } + inline void mouse_state(montauk::abi::MouseState* out) { syscall1(montauk::abi::SYS_MOUSESTATE, (uint64_t)out); } inline void set_mouse_bounds(int32_t maxX, int32_t maxY) { - syscall2(Montauk::SYS_SETMOUSEBOUNDS, (uint64_t)maxX, (uint64_t)maxY); + syscall2(montauk::abi::SYS_SETMOUSEBOUNDS, (uint64_t)maxX, (uint64_t)maxY); } // Kernel log inline int64_t read_klog(char* buf, uint64_t size) { - return syscall2(Montauk::SYS_KLOG, (uint64_t)buf, size); + return syscall2(montauk::abi::SYS_KLOG, (uint64_t)buf, size); } // I/O redirection inline int spawn_redir(const char* path, const char* args = nullptr) { - return (int)syscall2(Montauk::SYS_SPAWN_REDIR, (uint64_t)path, (uint64_t)args); + return (int)syscall2(montauk::abi::SYS_SPAWN_REDIR, (uint64_t)path, (uint64_t)args); } inline int childio_read(int childPid, char* buf, int maxLen) { - return (int)syscall3(Montauk::SYS_CHILDIO_READ, (uint64_t)childPid, (uint64_t)buf, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_CHILDIO_READ, (uint64_t)childPid, (uint64_t)buf, (uint64_t)maxLen); } inline int childio_write(int childPid, const char* data, int len) { - return (int)syscall3(Montauk::SYS_CHILDIO_WRITE, (uint64_t)childPid, (uint64_t)data, (uint64_t)len); + return (int)syscall3(montauk::abi::SYS_CHILDIO_WRITE, (uint64_t)childPid, (uint64_t)data, (uint64_t)len); } - inline int childio_writekey(int childPid, const Montauk::KeyEvent* key) { - return (int)syscall2(Montauk::SYS_CHILDIO_WRITEKEY, (uint64_t)childPid, (uint64_t)key); + inline int childio_writekey(int childPid, const montauk::abi::KeyEvent* key) { + return (int)syscall2(montauk::abi::SYS_CHILDIO_WRITEKEY, (uint64_t)childPid, (uint64_t)key); } inline int childio_settermsz(int childPid, int cols, int rows) { - return (int)syscall3(Montauk::SYS_CHILDIO_SETTERMSZ, (uint64_t)childPid, (uint64_t)cols, (uint64_t)rows); + return (int)syscall3(montauk::abi::SYS_CHILDIO_SETTERMSZ, (uint64_t)childPid, (uint64_t)cols, (uint64_t)rows); } // Process listing / kill - inline int proclist(Montauk::ProcInfo* buf, int max) { - return (int)syscall2(Montauk::SYS_PROCLIST, (uint64_t)buf, (uint64_t)max); + inline int proclist(montauk::abi::ProcInfo* buf, int max) { + return (int)syscall2(montauk::abi::SYS_PROCLIST, (uint64_t)buf, (uint64_t)max); } inline int kill(int pid) { - return (int)syscall1(Montauk::SYS_KILL, (uint64_t)pid); + return (int)syscall1(montauk::abi::SYS_KILL, (uint64_t)pid); } - inline int devlist(Montauk::DevInfo* buf, int max) { - return (int)syscall2(Montauk::SYS_DEVLIST, (uint64_t)buf, (uint64_t)max); + inline int devlist(montauk::abi::DevInfo* buf, int max) { + return (int)syscall2(montauk::abi::SYS_DEVLIST, (uint64_t)buf, (uint64_t)max); } - inline int diskinfo(Montauk::DiskInfo* buf, int port) { - return (int)syscall2(Montauk::SYS_DISKINFO, (uint64_t)buf, (uint64_t)port); + inline int diskinfo(montauk::abi::DiskInfo* buf, int port) { + return (int)syscall2(montauk::abi::SYS_DISKINFO, (uint64_t)buf, (uint64_t)port); } // Partition table - inline int partlist(Montauk::PartInfo* buf, int max) { - return (int)syscall2(Montauk::SYS_PARTLIST, (uint64_t)buf, (uint64_t)max); + inline int partlist(montauk::abi::PartInfo* buf, int max) { + return (int)syscall2(montauk::abi::SYS_PARTLIST, (uint64_t)buf, (uint64_t)max); } // Raw block device I/O (driver-agnostic) inline int64_t disk_read(int blockDev, uint64_t lba, uint32_t sectorCount, void* buf) { - return syscall4(Montauk::SYS_DISKREAD, (uint64_t)blockDev, lba, + return syscall4(montauk::abi::SYS_DISKREAD, (uint64_t)blockDev, lba, (uint64_t)sectorCount, (uint64_t)buf); } inline int64_t disk_write(int blockDev, uint64_t lba, uint32_t sectorCount, const void* buf) { - return syscall4(Montauk::SYS_DISKWRITE, (uint64_t)blockDev, lba, + return syscall4(montauk::abi::SYS_DISKWRITE, (uint64_t)blockDev, lba, (uint64_t)sectorCount, (uint64_t)buf); } // GPT management inline int gpt_init(int blockDev) { - return (int)syscall1(Montauk::SYS_GPTINIT, (uint64_t)blockDev); + return (int)syscall1(montauk::abi::SYS_GPTINIT, (uint64_t)blockDev); } - inline int gpt_add(const Montauk::GptAddParams* params) { - return (int)syscall1(Montauk::SYS_GPTADD, (uint64_t)params); + inline int gpt_add(const montauk::abi::GptAddParams* params) { + return (int)syscall1(montauk::abi::SYS_GPTADD, (uint64_t)params); } inline int fs_mount(int partIndex, int driveNum) { - return (int)syscall2(Montauk::SYS_FSMOUNT, (uint64_t)partIndex, (uint64_t)driveNum); + return (int)syscall2(montauk::abi::SYS_FSMOUNT, (uint64_t)partIndex, (uint64_t)driveNum); } // Flush all block-device write caches and cleanly unmount disk-backed // volumes ahead of power-off. Returns the number of volumes unmounted. inline int fs_sync() { - return (int)syscall0(Montauk::SYS_FS_SYNC); + return (int)syscall0(montauk::abi::SYS_FS_SYNC); } - inline int fs_format(const Montauk::FsFormatParams* params) { - return (int)syscall1(Montauk::SYS_FSFORMAT, (uint64_t)params); + inline int fs_format(const montauk::abi::FsFormatParams* params) { + return (int)syscall1(montauk::abi::SYS_FSFORMAT, (uint64_t)params); } // Audio inline int audio_open(uint32_t sampleRate, uint8_t channels, uint8_t bitsPerSample) { - return (int)syscall3(Montauk::SYS_AUDIOOPEN, (uint64_t)sampleRate, + return (int)syscall3(montauk::abi::SYS_AUDIOOPEN, (uint64_t)sampleRate, (uint64_t)channels, (uint64_t)bitsPerSample); } inline void audio_close(int handle) { - syscall1(Montauk::SYS_AUDIOCLOSE, (uint64_t)handle); + syscall1(montauk::abi::SYS_AUDIOCLOSE, (uint64_t)handle); } inline int audio_write(int handle, const void* data, uint32_t size) { - return (int)syscall3(Montauk::SYS_AUDIOWRITE, (uint64_t)handle, + return (int)syscall3(montauk::abi::SYS_AUDIOWRITE, (uint64_t)handle, (uint64_t)data, (uint64_t)size); } inline int audio_ctl(int handle, int cmd, int value) { - return (int)syscall3(Montauk::SYS_AUDIOCTL, (uint64_t)handle, + return (int)syscall3(montauk::abi::SYS_AUDIOCTL, (uint64_t)handle, (uint64_t)cmd, (uint64_t)value); } inline int audio_set_volume(int handle, int percent) { - return audio_ctl(handle, Montauk::AUDIO_CTL_SET_VOLUME, percent); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_SET_VOLUME, percent); } inline int audio_get_volume(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_VOLUME, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_VOLUME, 0); } inline int audio_get_pos(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_POS, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_POS, 0); } inline int audio_pause(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_PAUSE, 1); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_PAUSE, 1); } inline int audio_resume(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_PAUSE, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_PAUSE, 0); } inline int audio_get_output(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_OUTPUT, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_OUTPUT, 0); } inline int audio_bt_status(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_BT_STATUS, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_BT_STATUS, 0); } inline int audio_set_master_volume(int percent) { - return audio_ctl(-1, Montauk::AUDIO_CTL_SET_MASTER_VOLUME, percent); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_SET_MASTER_VOLUME, percent); } inline int audio_get_master_volume() { - return audio_ctl(-1, Montauk::AUDIO_CTL_GET_MASTER_VOLUME, 0); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_GET_MASTER_VOLUME, 0); } inline int audio_set_master_mute(bool muted) { - return audio_ctl(-1, Montauk::AUDIO_CTL_SET_MASTER_MUTE, muted ? 1 : 0); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_SET_MASTER_MUTE, muted ? 1 : 0); } inline int audio_get_master_mute() { - return audio_ctl(-1, Montauk::AUDIO_CTL_GET_MASTER_MUTE, 0); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_GET_MASTER_MUTE, 0); } inline int audio_set_mute(int handle, bool muted) { - return audio_ctl(handle, Montauk::AUDIO_CTL_SET_MUTE, muted ? 1 : 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_SET_MUTE, muted ? 1 : 0); } inline int audio_get_mute(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_MUTE, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_MUTE, 0); } - inline int audio_list(Montauk::AudioStreamInfo* buf, int maxCount) { - return (int)syscall2(Montauk::SYS_AUDIOLIST, (uint64_t)buf, (uint64_t)maxCount); + inline int audio_list(montauk::abi::AudioStreamInfo* buf, int maxCount) { + return (int)syscall2(montauk::abi::SYS_AUDIOLIST, (uint64_t)buf, (uint64_t)maxCount); } // Returns the current mixer state serial. With timeoutMs > 0 the call // blocks until the serial differs from `prevSerial` or the timeout // elapses. With timeoutMs == 0 it returns immediately (cheap snapshot). inline uint64_t audio_wait(uint64_t prevSerial, uint64_t timeoutMs) { - return syscall2(Montauk::SYS_AUDIOWAIT, prevSerial, timeoutMs); + return syscall2(montauk::abi::SYS_AUDIOWAIT, prevSerial, timeoutMs); } // Bluetooth - inline int bt_scan(Montauk::BtScanResult* buf, int maxCount, uint32_t timeoutMs) { - return (int)syscall3(Montauk::SYS_BTSCAN, (uint64_t)buf, (uint64_t)maxCount, (uint64_t)timeoutMs); + inline int bt_scan(montauk::abi::BtScanResult* buf, int maxCount, uint32_t timeoutMs) { + return (int)syscall3(montauk::abi::SYS_BTSCAN, (uint64_t)buf, (uint64_t)maxCount, (uint64_t)timeoutMs); } inline int bt_connect(const uint8_t* bdAddr) { - return (int)syscall1(Montauk::SYS_BTCONNECT, (uint64_t)bdAddr); + return (int)syscall1(montauk::abi::SYS_BTCONNECT, (uint64_t)bdAddr); } inline int bt_disconnect(const uint8_t* bdAddr) { - return (int)syscall1(Montauk::SYS_BTDISCONNECT, (uint64_t)bdAddr); + return (int)syscall1(montauk::abi::SYS_BTDISCONNECT, (uint64_t)bdAddr); } // Change the adapter's BD_ADDR. bdAddr is a 6-byte buffer with bdAddr[0] as // the least-significant octet (same order as BtAdapterInfo::bdAddr). Returns // 0 on success, negative on failure. Persist separately to bluetooth.toml. inline int bt_set_addr(const uint8_t* bdAddr) { - return (int)syscall1(Montauk::SYS_BTSETADDR, (uint64_t)bdAddr); + return (int)syscall1(montauk::abi::SYS_BTSETADDR, (uint64_t)bdAddr); } // List bonded (paired) devices. Returns count written to buf (may be 0). - inline int bt_bonds(Montauk::BtBondInfo* buf, int maxCount) { - return (int)syscall2(Montauk::SYS_BTBONDS, (uint64_t)buf, (uint64_t)maxCount); + inline int bt_bonds(montauk::abi::BtBondInfo* buf, int maxCount) { + return (int)syscall2(montauk::abi::SYS_BTBONDS, (uint64_t)buf, (uint64_t)maxCount); } // Forget a paired device (removes the bond; it must re-pair next time). inline int bt_forget(const uint8_t* bdAddr) { - return (int)syscall1(Montauk::SYS_BTFORGET, (uint64_t)bdAddr); + return (int)syscall1(montauk::abi::SYS_BTFORGET, (uint64_t)bdAddr); } - inline int bt_list(Montauk::BtDevInfo* buf, int maxCount) { - return (int)syscall2(Montauk::SYS_BTLIST, (uint64_t)buf, (uint64_t)maxCount); + inline int bt_list(montauk::abi::BtDevInfo* buf, int maxCount) { + return (int)syscall2(montauk::abi::SYS_BTLIST, (uint64_t)buf, (uint64_t)maxCount); } - inline int bt_info(Montauk::BtAdapterInfo* buf) { - return (int)syscall1(Montauk::SYS_BTINFO, (uint64_t)buf); + inline int bt_info(montauk::abi::BtAdapterInfo* buf) { + return (int)syscall1(montauk::abi::SYS_BTINFO, (uint64_t)buf); } // Kernel introspection - inline void memstats(Montauk::MemStats* out) { syscall1(Montauk::SYS_MEMSTATS, (uint64_t)out); } + inline void memstats(montauk::abi::MemStats* out) { syscall1(montauk::abi::SYS_MEMSTATS, (uint64_t)out); } // User management inline int setuser(int pid, const char* name) { - return (int)syscall2(Montauk::SYS_SETUSER, (uint64_t)pid, (uint64_t)name); + return (int)syscall2(montauk::abi::SYS_SETUSER, (uint64_t)pid, (uint64_t)name); } inline int getuser(char* buf, uint64_t maxLen) { - return (int)syscall2(Montauk::SYS_GETUSER, (uint64_t)buf, maxLen); + return (int)syscall2(montauk::abi::SYS_GETUSER, (uint64_t)buf, maxLen); } // Clipboard inline int clipboard_set_text(const char* data, uint32_t len) { - return (int)syscall2(Montauk::SYS_CLIPBOARD_SET_TEXT, (uint64_t)data, (uint64_t)len); + return (int)syscall2(montauk::abi::SYS_CLIPBOARD_SET_TEXT, (uint64_t)data, (uint64_t)len); } - inline int clipboard_get_info(Montauk::ClipboardInfo* out) { - return (int)syscall1(Montauk::SYS_CLIPBOARD_GET_INFO, (uint64_t)out); + inline int clipboard_get_info(montauk::abi::ClipboardInfo* out) { + return (int)syscall1(montauk::abi::SYS_CLIPBOARD_GET_INFO, (uint64_t)out); } inline int clipboard_get_text(char* buf, uint32_t bufLen, uint32_t* outLen, uint64_t* outSerial = nullptr) { - return (int)syscall4(Montauk::SYS_CLIPBOARD_GET_TEXT, (uint64_t)buf, (uint64_t)bufLen, + return (int)syscall4(montauk::abi::SYS_CLIPBOARD_GET_TEXT, (uint64_t)buf, (uint64_t)bufLen, (uint64_t)outLen, (uint64_t)outSerial); } inline int clipboard_clear() { - return (int)syscall0(Montauk::SYS_CLIPBOARD_CLEAR); + return (int)syscall0(montauk::abi::SYS_CLIPBOARD_CLEAR); } // Window server - inline int win_create(const char* title, int w, int h, Montauk::WinCreateResult* result) { - return (int)syscall4(Montauk::SYS_WINCREATE, (uint64_t)title, (uint64_t)w, (uint64_t)h, (uint64_t)result); + inline int win_create(const char* title, int w, int h, montauk::abi::WinCreateResult* result) { + return (int)syscall4(montauk::abi::SYS_WINCREATE, (uint64_t)title, (uint64_t)w, (uint64_t)h, (uint64_t)result); } inline int win_destroy(int id) { - return (int)syscall1(Montauk::SYS_WINDESTROY, (uint64_t)id); + return (int)syscall1(montauk::abi::SYS_WINDESTROY, (uint64_t)id); } inline uint64_t win_present(int id) { - return (uint64_t)syscall1(Montauk::SYS_WINPRESENT, (uint64_t)id); + return (uint64_t)syscall1(montauk::abi::SYS_WINPRESENT, (uint64_t)id); } - inline int win_poll(int id, Montauk::WinEvent* event) { - return (int)syscall2(Montauk::SYS_WINPOLL, (uint64_t)id, (uint64_t)event); + inline int win_poll(int id, montauk::abi::WinEvent* event) { + return (int)syscall2(montauk::abi::SYS_WINPOLL, (uint64_t)id, (uint64_t)event); } - inline int win_enumerate(Montauk::WinInfo* info, int max) { - return (int)syscall2(Montauk::SYS_WINENUM, (uint64_t)info, (uint64_t)max); + inline int win_enumerate(montauk::abi::WinInfo* info, int max) { + return (int)syscall2(montauk::abi::SYS_WINENUM, (uint64_t)info, (uint64_t)max); } inline uint64_t win_map(int id) { - return (uint64_t)syscall1(Montauk::SYS_WINMAP, (uint64_t)id); + return (uint64_t)syscall1(montauk::abi::SYS_WINMAP, (uint64_t)id); } inline int win_unmap(int id) { - return (int)syscall1(Montauk::SYS_WINUNMAP, (uint64_t)id); + return (int)syscall1(montauk::abi::SYS_WINUNMAP, (uint64_t)id); } - inline int win_sendevent(int id, const Montauk::WinEvent* event) { - return (int)syscall2(Montauk::SYS_WINSENDEVENT, (uint64_t)id, (uint64_t)event); + inline int win_sendevent(int id, const montauk::abi::WinEvent* event) { + return (int)syscall2(montauk::abi::SYS_WINSENDEVENT, (uint64_t)id, (uint64_t)event); } inline uint64_t win_resize(int id, int w, int h) { - return (uint64_t)syscall3(Montauk::SYS_WINRESIZE, (uint64_t)id, (uint64_t)w, (uint64_t)h); + return (uint64_t)syscall3(montauk::abi::SYS_WINRESIZE, (uint64_t)id, (uint64_t)w, (uint64_t)h); } inline int win_setscale(int scale) { - return (int)syscall1(Montauk::SYS_WINSETSCALE, (uint64_t)scale); + return (int)syscall1(montauk::abi::SYS_WINSETSCALE, (uint64_t)scale); } inline int win_getscale() { - return (int)syscall0(Montauk::SYS_WINGETSCALE); + return (int)syscall0(montauk::abi::SYS_WINGETSCALE); } inline int win_setcursor(int id, int cursor) { - return (int)syscall2(Montauk::SYS_WINSETCURSOR, (uint64_t)id, (uint64_t)cursor); + return (int)syscall2(montauk::abi::SYS_WINSETCURSOR, (uint64_t)id, (uint64_t)cursor); } inline int win_setflags(int id, uint32_t flags) { - return (int)syscall2(Montauk::SYS_WINSETFLAGS, (uint64_t)id, (uint64_t)flags); + return (int)syscall2(montauk::abi::SYS_WINSETFLAGS, (uint64_t)id, (uint64_t)flags); } } diff --git a/programs/include/montauk/thread.h b/programs/include/montauk/thread.h index e4eb5aa..57b3777 100644 --- a/programs/include/montauk/thread.h +++ b/programs/include/montauk/thread.h @@ -35,7 +35,7 @@ namespace montauk { // Terminate the calling thread. Never returns. If called by the main // thread this is equivalent to exit() (the whole process exits). [[noreturn]] inline void thread_exit(int code = 0) { - syscall1(Montauk::SYS_THREAD_EXIT, (uint64_t)code); + syscall1(montauk::abi::SYS_THREAD_EXIT, (uint64_t)code); __builtin_unreachable(); } @@ -86,7 +86,7 @@ namespace montauk { ctx->stack_base = stack; uint64_t stack_top = ((uint64_t)stack + stack_bytes) & ~0xFULL; - int tid = (int)syscall3(Montauk::SYS_THREAD_SPAWN, + int tid = (int)syscall3(montauk::abi::SYS_THREAD_SPAWN, (uint64_t)&detail::thread_trampoline, (uint64_t)ctx, stack_top); if (tid < 0) { @@ -101,13 +101,13 @@ namespace montauk { // success (with the thread's exit code in *out_code if non-null) or // -1 if `tid` is not a joinable sibling. inline int thread_join(int tid, int* out_code = nullptr) { - return (int)syscall2(Montauk::SYS_THREAD_JOIN, + return (int)syscall2(montauk::abi::SYS_THREAD_JOIN, (uint64_t)tid, (uint64_t)out_code); } // Return the calling thread's TID (== getpid() for the main thread). inline int thread_self() { - return (int)syscall0(Montauk::SYS_THREAD_SELF); + return (int)syscall0(montauk::abi::SYS_THREAD_SELF); } // Lightweight mutex backed by a single atomic word + the kernel diff --git a/programs/include/print/print.hpp b/programs/include/print/print.hpp index a9d61c8..37dc439 100644 --- a/programs/include/print/print.hpp +++ b/programs/include/print/print.hpp @@ -218,7 +218,7 @@ inline void parse_key_value_lines(char* text, Fn fn) { inline void now_string(char* out, int out_len) { if (out == nullptr || out_len <= 0) return; - Montauk::DateTime dt = {}; + montauk::abi::DateTime dt = {}; montauk::gettime(&dt); snprintf(out, (size_t)out_len, "%04d-%02d-%02d %02d:%02d:%02d", (int)dt.Year, (int)dt.Month, (int)dt.Day, @@ -1010,11 +1010,11 @@ inline bool daemon_is_running(int* out_pid) { int handle = montauk::proc_open(pid); if (handle < 0) return false; - uint32_t sig = montauk::wait_handle(handle, Montauk::IPC_SIGNAL_EXITED, 0); + uint32_t sig = montauk::wait_handle(handle, montauk::abi::IPC_SIGNAL_EXITED, 0); montauk::close(handle); - if (sig & Montauk::IPC_SIGNAL_EXITED) return false; + if (sig & montauk::abi::IPC_SIGNAL_EXITED) return false; - Montauk::ProcInfo procs[128]; + montauk::abi::ProcInfo procs[128]; int proc_count = montauk::proclist(procs, (int)(sizeof(procs) / sizeof(procs[0]))); bool matched = false; for (int i = 0; i < proc_count; i++) { @@ -1289,9 +1289,9 @@ inline int send_all_plain(int fd, const uint8_t* data, int len) { if (n < 0) return -1; uint32_t sig = montauk::wait_handle(fd, - Montauk::IPC_SIGNAL_WRITABLE | Montauk::IPC_SIGNAL_PEER_CLOSED, + montauk::abi::IPC_SIGNAL_WRITABLE | montauk::abi::IPC_SIGNAL_PEER_CLOSED, 1000); - if (sig & Montauk::IPC_SIGNAL_PEER_CLOSED) return -1; + if (sig & montauk::abi::IPC_SIGNAL_PEER_CLOSED) return -1; if (montauk::get_milliseconds() >= deadline) return -1; montauk::sleep_ms(1); } @@ -1379,13 +1379,13 @@ inline int recv_http_plain(int fd, char* buf, int cap) { if (montauk::get_milliseconds() >= deadline) break; uint32_t sig = montauk::wait_handle(fd, - Montauk::IPC_SIGNAL_READABLE | Montauk::IPC_SIGNAL_PEER_CLOSED, + montauk::abi::IPC_SIGNAL_READABLE | montauk::abi::IPC_SIGNAL_PEER_CLOSED, 1000); if (sig == 0) continue; - if (sig & Montauk::IPC_SIGNAL_PEER_CLOSED) + if (sig & montauk::abi::IPC_SIGNAL_PEER_CLOSED) peer_closed = true; - if (!(sig & Montauk::IPC_SIGNAL_READABLE)) { + if (!(sig & montauk::abi::IPC_SIGNAL_READABLE)) { if (peer_closed) break; continue; } @@ -1525,7 +1525,7 @@ inline bool ipp_http_post(const IppUri* uri, tas, raw, HTTP_RESPONSE_MAX - 1); if (tas.anchors) free(tas.anchors); } else { - int fd = montauk::socket(Montauk::SOCK_TCP); + int fd = montauk::socket(montauk::abi::SOCK_TCP); if (fd < 0) { free(raw); free(req); diff --git a/programs/lib/tls/libtls.a b/programs/lib/tls/libtls.a index 39232618356c193d2f59ccacfa146f6ade07616d..ef62ca325ce70288ef3d9d497b9baaae42b7eff8 100644 GIT binary patch literal 111626 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 BHPHY7 literal 111322 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 diff --git a/programs/lib/tls/obj/tls.o b/programs/lib/tls/obj/tls.o index cb811c2c2b72f40b12871d4caa6e168f8b8fb022..a87d493afc4ccf34ed2bb5a27650e1cd100330e9 100644 GIT binary patch literal 111232 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 diff --git a/programs/libs/libprintersapplet/obj/src/libprintersapplet.o b/programs/libs/libprintersapplet/obj/src/libprintersapplet.o index a8f2ddc42d37f6d8db24c26d4348e2ad1a50b58b..7c7439226bfb2d7f8c011a35d5b00c7c584bb698 100644 GIT binary patch delta 6562 zcmZ{o4Qv$06~|}JoWBkqJ{wrCvB76zgHbW@7vN6{0n9lhgc-KU!-w2VGRY>~PmGp$#&Dc1HG6hJ-EuBX}c z6yg06y@h|Ow&1VdM%@}BqGU8=FC^QB32d9CZ64U-p4U=pMxwVxCZfGZH|@#+nSgq% z(|YbVvfr;@N)%DCUUZCdA{d0a_X8QV6xOuYmi|OU7fRnH-HMMb_qFP$NJpO-pRY4c zh=iK?wIZf}^WkHjV=>kcSUj)W6OPr@6S_w@FK7Tcmr4uYz3NugTPVXG|&ND2fBd!fQ;2h08AhY$OFoO z5Ks-&0Clm*zXnv-16zS+;2>}mI1O|F*MTnJJ|Oj*A`<`;$O7_!av%g$12sS$&;YCj zlt#RaPy2GJex2f_FKwTG2KApFF}+B?Oh|60Wa1&s04@%<45y0Rc`reTp=e37@SgfU zA;TXt)bDoFue{3f2d$W=dP-A!HmZ9xo`7H0ydDaKxLX?8sL26?2lO!NJ+O=18Hb3I zn)RAWv^^Q>>zTMioN8Pl>LTexoJ#NaOMghKF@ki^Fx16<;lg4W62iBe32fh$UCg zBUY+#_9%H&HD(*;F^IanU{hzMexlDN)s|gZJ4+uf%4X-$ZJk11yP3X8-_R)gokw^7 zm#O~;On*<`ekdnY%`n6Iv(xDIs-gI=GCh}a@GGVl&@2y`Zt1%S#Y^v!yT-rLH~~i= z(LM1(T6Q{fSVqgsQNiIxXd1IVtxWBWQ@513v>vv?>9cgq%0KR?sA(Cn#>9@)x&(LmYE zVE~OT2dlyYmC!w?E+ z3)9z73hie4E2JM_`ZuJ1)JxYtNBwDnQ@spA%%DgwFnu-+^f}X$XvMdf{&(tskLg_) zU(YWdGlOv3lsRq&?598nGJQ0?Gnq_3O?ocV=Tkr>TF3m|N03S@p3EFBkUpL1b+qDn zOfRLBT*&lCbi~UedcA$+{fOR$HzNjHf0riM%=A_YXb010(Zu_i9-#3LspcOTq2tW@ z4@%*4Oi!V3uP{BEX1}TANW=V^S;vvrcPekB5sId<-81}#&Nhkboy4BNsy}9qJk8&_Ky?iRtYW&<&=Kp#|J#dX9S$_tN!?v6%M5LlL`Y z_yV23pXq(6e=5@tQ#+gKd+2QQnf^W6crh!OVKPNp#q?>U&t&>eO1Ak-f0`z)XL>&A zE41G0VpvBV*D{9&IqcrXWO@lD!*ZtohZg^)8lP{No0;{u6!Z?YB;T<1Gwa(F z`XQ#rlh<*kSJ7POn7)QqdWGo=Y5bdxu3`!T*4M1h9h&PqreC9WG#!(BY!|7264RS0 z1~*5$`%_BMajSO<0_JGuyN*&s-?s&Z`7E<8pq-zi?iLuK1!&erRcGadwJHx!X$a;zCtEqj1>7(d;Z>vC&5qiL^ zb7+S>^n$oCl+Y>rnZAT}K25?9;6bTk`eNFdnM|MRbQknr zQRKDUMHAOEhjN-=g~}UkSR0rXAJb5_F?}M9wwLMn8iwNDChlgvL*cfw{*^TT8Ap%& zOm3%+mzYBroyHBO-=u(UGyN*%-225n)HI6Yt z`ONx0B|`<%FH*QwOn;8jV5aIEW0>=q6`z7o>Q!K@VXa`+R9ezHrn|51+f2`**!D8L zFRiqN>G(8;a?;TwXVp%N`6F{!P3>%a2hhdYWBo;%lA(Zf91#s+_bX%l(n~J|w!X`(HHEHX< z|1)x{I;pMg%r{KF$JJeJ{R6Ysko8Y0SYnu;F>3=^ud1-NUhiSWX5jNX$}QEXt+#tv zu^a1bn-Jfswh|*Liax|)>z#yG(@S$@i)t(#B|WOG)R4bdXG<&PAr&Yy6q5>1GxVN&LVSlE!Pdp+MRd|x+`DdBBG-(yOO}6B(RmbE?`I<5- k$H+Y@TsclQsU}UWYc5uSDdVJ2Va@kdlja`PF=g0)0bOAgIRF3v delta 6390 zcmZ9Q3vg7`8OQJ0Wb@c1n`{=jY!V;|uz`pP8`1<4Amw4=@z=0waENNj115SkjD~-0G=xD$H-tQ*McV_l?&-wqq z^SI}nd+tsCUa!8ZSMT&v{hNA6l+|h0lG#SQ*E>iVhG|fW_oj8mHAls#CEbRAlHY>> zJD=`(f%4f=JrK=*5JXITN6%~+%5d+XVg|JAcr&Sl#AtA5-;2pfdDe9r`sArMqf|opzq|EFz_imMj zaw8Q}k=dhCkWaEp!}qGxT~tgm#O4Q8syzi zS0mbRqIYxi8Q1YdOI;^T-31;1E*gjO0U1CDC;|opBY;W3OrREc6?g;K1iTOI0S*JF zfKP#|z?Z-`z)yh3iX(Oca)AP%45$R21*QRWfR}+)z}vu9U}L4s-?bfs%N`GSpCH#{g4+mw<)9N?;wZ8Q2c&1C9Y_fJ?x2;4bh0aM6M&ACLir zfFfWpFanqa%ml1j@KxXqU=#2@um?B{oB}=tt^!{I-vB=W9@8Q>Cd z9k>fT09;lw(FbGzA)p8t42%FK0W*PGU^(z6!J|A`c+fq{o3(?k-RNhilrA_tl4;A? zDH|6R^y67~QZLS^_jYzjp>qpG6)fJVD}C9%gzi2k&M*@6VqeavgkiDLsMx}DF@;>z z>pm?;fslNg&;vR3MAvgE`ljy*3qy<^11?Vnh4+N(S{7CMQ}%lrR3eVGD2!0l&g+QF zaQY=Ke+-6^ew8YeQ9}WQEXzezJ6nvbk&XuElHZ|rp%Gec=={_zzHq>09vMmpc%s{g z1oXw!@x@9-0*Wg7a!4uk($SY<#QDl{+~w{8-bmn0a_0)s?ozg=Esv^iYPh*P&1~z~0-<_B^x~_I{^^&>GD}skQsI@vA zGSzAw2^9uU(k4fG!M+$Cy3$%0r*%EW{8sM{RjC=eHDo4_gGH%9`}54;PP@<+KcC${ z>LGcibyB!E@sKXqm$q87X$g@2VPD$x5+2pRgkSCjj?aI?6s*7dzi>-WMPz;*Wu{X89N zNC$*Io8Ey)p9_5)Pv{Myr**L7@7em4wj0JVkMvMfaBeP+J95^4D-S4D=s$2fnfkTf zW-w2ynCS2yOH))C?UitqZg(5t!DMWJW#on90AR~&y^=&juTx3;cJpY&Tli1#hRRS{0ZP=RtSImSfL}u}IW9$D7R(I=-8b*6Zp5Gq^>#|K%}! zsOt+%Yrk+0^D-Y7`fI#h&InHRvJdz5bPiB3jt?S!`{>WqzGlBc65qcTxbwc0BWjap# zn${ZOhIr1k(5ral4MP8n*J7{Gf8=(K2tA!gb=uZ-OJ9HRqKN6h&&4&Z!e;Qca96SW ztqzAx>u2E>alc+3ud`Bzc@LOEzv~>HLchc977D$R@3-96_1UmL;>?ZH*Hqp^6GUCj z<>^8n%BwtA=MOi8J)PTWwsn1^$ZwqxF&p@< z&kKDax7i}}=XnfY2>pND*L|Vi%ZzTp^K{)tTbmJfMKkTX=hQ6MBt(3K?`n z_A{+g;ktOioEMtYOD!+VSP@^%N9t6e=W+Zjp?}18vB=hSX|X?IiI_~Dvh_kwK-!;BbR5w`ATu_xRwXBR>VKWH*k#~O(#B$SMLt%7#}xb7^A4r zDk}8gDg7~~0^clFzzE=vX-ZB9pYYb|s)r0PgSjy-BDfJckNo5o$G8};Flo6_2h04 z?oxI)>67Gc6Yg4e8+2=#Y5gI_MfMKwj-#xj$m<`i_g4{rf#>#`&^zKLDBTizGH;qk zw%)yMkxucFD}KqMK4RWV)17{_uY`tLU z3DsYRhn-O4bn7rH`Q4uA-Z0+PuM9t;`s(o0mMdwHKKS%X3J6zP>J!~mS*4ci?<-5y kE*-9_P`}d)hzE2N@g3btOw!?JD%4TEfcR(K^i1CW0V&8J%m4rY diff --git a/programs/libs/libtimezonesapplet/obj/src/libtimezonesapplet.o b/programs/libs/libtimezonesapplet/obj/src/libtimezonesapplet.o index a7ffd50955b5e7ce2a43aab3197525931307978e..03236a05ca02d73add0967a5483afee4deb7ebaa 100644 GIT binary patch delta 6571 zcmZ{o3s6+o8OQHgTwW_H3+i30yrdX~EHQ~B!BIOpS=v~!f|95WI?1h> z_#RE=L>n{eh^cn4l}1f;Boiy9+G?wbwkDd6PH-9yEz0)1CySc}Puwc8B$A)jdHQ|{8{X;U;BU}IDvdOvR5WBaB-_IPwr7#&f*1ERNh#@x?pBqE@@^{Hnf)pO`BI+MMU_|FD&qXT5$Ci59=xL;(PK?LX8D|&? zq1rklW^l{lzqsCuu|~piy=V_OiLxiCMl_~p!$`O7hX>;^mHwhv_Jd)lE~=~U0GN(S z0Q^8EkPDOoL7)Z*0rfzW%Ob8ub_=i*Xa(K{I)HP)72tEA2e=Q!MG=Mo0bndp2uuU2 zfw@2(unbrQYy!3edkL00i0u2o8Q>Do3ETwk0dCr9bAdWw8L$f21Z)TP0tbQjfiu7*pcA+W+ymS( z1RszFWCI0&RSrH5%m$tV8iAL9^}tr31vmg415N=KfU7_ka0gJagap73WCFQBDG&r| zfDlk0i}Tln?0R4;&;lF)jsd5D3&2&N3%CO)dQ(&a;0H2+T%Z&P0yRJgs0W&WHGn3> ztN7F}r_<{cuRN)H=^3Cu>M^Z=UM3uFCuQKF{61V9;WU~vYRBya!x)8<^5@^y!@cR= zm{HzvHG1WB&>OH~9_cGh?^~$pQ+NpNGUxSCAjI7uWFe=9j2P0#q&2XU+7X9{lUis_ zMdT+#eK7-fh?9-WN8U&}5vNNB{oETQHO6h^CcDg|Q%rqpP<4Kxii$1r6bC$o9!0KK zsbDfPg91h{d7Ou?wFD!|TNH2?y9+(RQ6*V#pGg(D>J#MFnro-$O zwi`^IM5ov8`gqLg)*YgU!nMY4?^vF{FgFDI+4TkW} z=jl!gcd~Fjyp&Z!w|9slo+{8q5Qn>}MFpGaTu8q0i=yJ{5Wr&-jMW|H}1m3%v{d)A+^% zVHn{upPcXs*vEkm75W5zXEKC-iuD|!*K$Bbq+|TvElA-RSBM7ZS$|6C^*rNwLNDec zxlri$d5f1v^alIN`yRgwuS5)6e}f0uEc7-G=uM%|;(_-G-N*eO(w*NigU5yYH$K8= zg+7eK{aEN(Jo@+m+!ZBM~_?#ZM>WWMNcrq*X$HlJ%KF-@%8iR_KrMzzssrV|@kb z{Vs;JTyc$P(8PPzEc6k)WxIr4#w)j9=x2B)~rx=%4X;MUEc%p`OgM zuMiE!^JJdVfjl!fPq-Voyin*xd>EDs{hvJfSM;hp)4y4`zv7_Z)CcoSYoBmm=g%zyZF31ffgG^9!KQuXBfsM9ymql;c}Mlm}my` zg!?uhhRH(zki)GK`V2k>Gj(8+>8}+oJ_R8)=;}$PwL-WlJf*cl55Kyv3q6x#+avUW zJkwU85DWUhViUpi@0yQUWurm$^ljOsqZ#8 zdbF6QeTAmKu1_49ycjyb`?)^VK zw`o;m`rAd@YHoX6=aTz7;fC1#gAS4VXW=%nds%NG_i7&(w=q7yBi+y)5ylyVeQLVb8c${+So?=t|R>zf8szbWE#8g)g*OmM@TFug( zQ+}hC=$1$Rqt@w`saD)anRYkEPjvRQqiTlkoMx%fI#gj%tV)pBEK^5x;L$Smkq!~x)-A-*x|8^K9SD}ie^%ynxLWD%@)7?9Sd<+4 delta 6395 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 0 && !g_win.closed) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = g_win.poll(&ev); bool redraw = false; diff --git a/programs/src/bluetooth/main.cpp b/programs/src/bluetooth/main.cpp index 04064d2..afa4ac6 100644 --- a/programs/src/bluetooth/main.cpp +++ b/programs/src/bluetooth/main.cpp @@ -76,16 +76,16 @@ static int g_mouse_y = -1; static int g_hover_row = -1; // Adapter info -static Montauk::BtAdapterInfo g_adapter; +static montauk::abi::BtAdapterInfo g_adapter; static bool g_adapter_ok = false; // Connected/paired devices -static Montauk::BtDevInfo g_devices[MAX_CONNECTED]; +static montauk::abi::BtDevInfo g_devices[MAX_CONNECTED]; static char g_device_names[MAX_CONNECTED][64]; static int g_device_count = 0; // Scan results -static Montauk::BtScanResult g_scan[MAX_SCAN]; +static montauk::abi::BtScanResult g_scan[MAX_SCAN]; static int g_scan_count = 0; static bool g_scanning = false; @@ -268,7 +268,7 @@ static void refresh_devices() { // Append bonded (paired) devices that aren't currently connected, so the // Devices tab remembers them across sessions/reboots. - Montauk::BtBondInfo bonds[8]; + montauk::abi::BtBondInfo bonds[8]; int nb = montauk::bt_bonds(bonds, 8); for (int i = 0; i < nb && g_device_count < MAX_CONNECTED; i++) { bool already = false; @@ -277,7 +277,7 @@ static void refresh_devices() { } if (already) continue; - Montauk::BtDevInfo d = {}; + montauk::abi::BtDevInfo d = {}; montauk::memcpy(d.bdAddr, bonds[i].bdAddr, 6); d.connected = 0; // paired but not connected d.encrypted = 0; @@ -642,7 +642,7 @@ static bool handle_adapter_mouse(int mx, int my, uint8_t buttons, return false; } -static bool handle_adapter_key(const Montauk::KeyEvent& key) { +static bool handle_adapter_key(const montauk::abi::KeyEvent& key) { if (key.ascii == '\n' || key.ascii == '\r') { apply_mac(); return true; } if (key.ascii == '\t') { g_mac_focus = !g_mac_focus; return true; } @@ -883,7 +883,7 @@ extern "C" void _start() { uint64_t last_refresh = montauk::get_milliseconds(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/calculator/main.cpp b/programs/src/calculator/main.cpp index ad7806e..5e099c4 100644 --- a/programs/src/calculator/main.cpp +++ b/programs/src/calculator/main.cpp @@ -530,7 +530,7 @@ static void render(Canvas& c) { } } -static bool handle_mouse(const Montauk::WinEvent& ev, int win_w, int win_h) { +static bool handle_mouse(const montauk::abi::WinEvent& ev, int win_w, int win_h) { CalcLayout layout; calc_build_layout(win_w, win_h, &layout); @@ -558,7 +558,7 @@ static bool handle_mouse(const Montauk::WinEvent& ev, int win_w, int win_h) { return redraw; } -static bool handle_key(const Montauk::KeyEvent& key) { +static bool handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return false; if (key.ascii >= '0' && key.ascii <= '9') { @@ -602,7 +602,7 @@ extern "C" void _start() { win.present(); while (win.id >= 0 && !win.closed) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/crashpad/main.cpp b/programs/src/crashpad/main.cpp index ace24ce..1f3b4cc 100644 --- a/programs/src/crashpad/main.cpp +++ b/programs/src/crashpad/main.cpp @@ -21,7 +21,7 @@ static constexpr int COL1_W = 200; static constexpr int SECTION_GAP = 10; WsWindow g_win; -Montauk::CrashReportInfo g_report = {}; +montauk::abi::CrashReportInfo g_report = {}; int g_scroll = 0; // Colors - light theme matching DiskDetail @@ -213,7 +213,7 @@ extern "C" void _start() { render(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = g_win.poll(&ev); if (r < 0) break; if (r == 0) { diff --git a/programs/src/date/main.cpp b/programs/src/date/main.cpp index fbb8caf..5fa87c0 100644 --- a/programs/src/date/main.cpp +++ b/programs/src/date/main.cpp @@ -37,7 +37,7 @@ static const char* month_name(int m) { } extern "C" void _start() { - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); print_int(dt.Day); diff --git a/programs/src/desktop/apps/apps_common.hpp b/programs/src/desktop/apps/apps_common.hpp index 4af4527..447e803 100644 --- a/programs/src/desktop/apps/apps_common.hpp +++ b/programs/src/desktop/apps/apps_common.hpp @@ -233,7 +233,7 @@ void open_sleep_dialog(DesktopState* ds); // Hand a graceful power-off request to login.elf and exit the desktop so the // user returns to the login screen, where the shutdown stages run (Bluetooth // teardown, filesystem flush) before the final ACPI power-off / reset. Pass -// Montauk::POWER_REQ_SHUTDOWN or Montauk::POWER_REQ_REBOOT. +// montauk::abi::POWER_REQ_SHUTDOWN or montauk::abi::POWER_REQ_REBOOT. [[noreturn]] inline void desktop_request_power(int action) { montauk::power_request(action); montauk::exit(0); diff --git a/programs/src/desktop/apps/filemanager/events.cpp b/programs/src/desktop/apps/filemanager/events.cpp index 2fd52f7..2026b6e 100644 --- a/programs/src/desktop/apps/filemanager/events.cpp +++ b/programs/src/desktop/apps/filemanager/events.cpp @@ -319,7 +319,7 @@ void filemanager_on_mouse(Window* win, MouseEvent& ev) { } } -void filemanager_on_key(Window* win, const Montauk::KeyEvent& key) { +void filemanager_on_key(Window* win, const montauk::abi::KeyEvent& key) { FileManagerState* fm = (FileManagerState*)win->app_data; if (!fm || !key.pressed) return; diff --git a/programs/src/desktop/apps/filemanager/filemanager_internal.hpp b/programs/src/desktop/apps/filemanager/filemanager_internal.hpp index a1fc228..ae62a24 100644 --- a/programs/src/desktop/apps/filemanager/filemanager_internal.hpp +++ b/programs/src/desktop/apps/filemanager/filemanager_internal.hpp @@ -297,7 +297,7 @@ int filemanager_collect_selection(const FileManagerState* fm, int* out, int max void filemanager_draw_header(Canvas& c, FileManagerState* fm, Color toolbar_color, Color btn_bg); void filemanager_on_draw(Window* win, Framebuffer& fb); void filemanager_on_mouse(Window* win, MouseEvent& ev); -void filemanager_on_key(Window* win, const Montauk::KeyEvent& key); +void filemanager_on_key(Window* win, const montauk::abi::KeyEvent& key); void filemanager_on_close(Window* win); } // namespace filemanager diff --git a/programs/src/desktop/apps/filemanager/fileop.cpp b/programs/src/desktop/apps/filemanager/fileop.cpp index 2ad9082..4d8a441 100644 --- a/programs/src/desktop/apps/filemanager/fileop.cpp +++ b/programs/src/desktop/apps/filemanager/fileop.cpp @@ -238,7 +238,7 @@ static void fileop_dialog_on_mouse(Window* win, MouseEvent& ev) { } } -static void fileop_dialog_on_key(Window* win, const Montauk::KeyEvent& key) { +static void fileop_dialog_on_key(Window* win, const montauk::abi::KeyEvent& key) { FileOpJob* job = (FileOpJob*)win->app_data; if (!job || !key.pressed) return; if (key.scancode == 0x01) job->cancel = 1; // Escape requests cancel diff --git a/programs/src/desktop/apps/filemanager/properties.cpp b/programs/src/desktop/apps/filemanager/properties.cpp index 307e114..bc82811 100644 --- a/programs/src/desktop/apps/filemanager/properties.cpp +++ b/programs/src/desktop/apps/filemanager/properties.cpp @@ -392,7 +392,7 @@ static void props_on_mouse(Window* win, MouseEvent& ev) { props_close_self(st->desktop, st); } -static void props_on_key(Window* win, const Montauk::KeyEvent& key) { +static void props_on_key(Window* win, const montauk::abi::KeyEvent& key) { FilePropertiesDialogState* st = (FilePropertiesDialogState*)win->app_data; if (!st || !key.pressed) return; if (key.scancode == 0x01 || key.ascii == '\n' || key.ascii == '\r') @@ -576,7 +576,7 @@ static void delete_confirm_on_mouse(Window* win, MouseEvent& ev) { } } -static void delete_confirm_on_key(Window* win, const Montauk::KeyEvent& key) { +static void delete_confirm_on_key(Window* win, const montauk::abi::KeyEvent& key) { FileDeleteConfirmDialogState* st = (FileDeleteConfirmDialogState*)win->app_data; if (!st || !key.pressed) return; @@ -820,7 +820,7 @@ static void multi_props_on_mouse(Window* win, MouseEvent& ev) { props_close_self(st->desktop, st); } -static void multi_props_on_key(Window* win, const Montauk::KeyEvent& key) { +static void multi_props_on_key(Window* win, const montauk::abi::KeyEvent& key) { MultiPropertiesDialogState* st = (MultiPropertiesDialogState*)win->app_data; if (!st || !key.pressed) return; if (key.scancode == 0x01 || key.ascii == '\n' || key.ascii == '\r') diff --git a/programs/src/desktop/apps/settings/app.cpp b/programs/src/desktop/apps/settings/app.cpp index 7eaedb6..41f7051 100644 --- a/programs/src/desktop/apps/settings/app.cpp +++ b/programs/src/desktop/apps/settings/app.cpp @@ -60,7 +60,7 @@ static void settings_on_mouse(Window* win, MouseEvent& ev) { } } -static void settings_on_key(Window* win, const Montauk::KeyEvent& key) { +static void settings_on_key(Window* win, const montauk::abi::KeyEvent& key) { // Settings main window no longer needs keyboard handling. (void)win; (void)key; diff --git a/programs/src/desktop/apps/settings/settings_internal.hpp b/programs/src/desktop/apps/settings/settings_internal.hpp index 784b963..bafdd47 100644 --- a/programs/src/desktop/apps/settings/settings_internal.hpp +++ b/programs/src/desktop/apps/settings/settings_internal.hpp @@ -18,7 +18,7 @@ namespace settings_app { struct SettingsState { DesktopState* desktop; int active_tab; // 0=Appearance, 1=Display, 2=About - Montauk::SysInfo sys_info; + montauk::abi::SysInfo sys_info; uint64_t uptime_ms; WallpaperFileList wp_files; bool wp_scanned; diff --git a/programs/src/desktop/apps/usermanager/app.cpp b/programs/src/desktop/apps/usermanager/app.cpp index 2f97c96..6438024 100644 --- a/programs/src/desktop/apps/usermanager/app.cpp +++ b/programs/src/desktop/apps/usermanager/app.cpp @@ -32,7 +32,7 @@ static void usermanager_on_mouse(Window* win, MouseEvent& ev) { } } -static void usermanager_on_key(Window* win, const Montauk::KeyEvent& key) { +static void usermanager_on_key(Window* win, const montauk::abi::KeyEvent& key) { (void)win; (void)key; } diff --git a/programs/src/desktop/apps/usermanager/dialogs.cpp b/programs/src/desktop/apps/usermanager/dialogs.cpp index 67d76a9..5b4e127 100644 --- a/programs/src/desktop/apps/usermanager/dialogs.cpp +++ b/programs/src/desktop/apps/usermanager/dialogs.cpp @@ -257,7 +257,7 @@ static void adduser_on_mouse(Window* win, MouseEvent& ev) { } } -static void adduser_on_key(Window* win, const Montauk::KeyEvent& key) { +static void adduser_on_key(Window* win, const montauk::abi::KeyEvent& key) { AddUserDialogState* st = (AddUserDialogState*)win->app_data; if (!st || !key.pressed) return; @@ -495,7 +495,7 @@ static void chpwd_on_mouse(Window* win, MouseEvent& ev) { } } -static void chpwd_on_key(Window* win, const Montauk::KeyEvent& key) { +static void chpwd_on_key(Window* win, const montauk::abi::KeyEvent& key) { ChPwdDialogState* st = (ChPwdDialogState*)win->app_data; if (!st || !key.pressed) return; @@ -647,7 +647,7 @@ static void deluser_on_mouse(Window* win, MouseEvent& ev) { } } -static void deluser_on_key(Window* win, const Montauk::KeyEvent& key) { +static void deluser_on_key(Window* win, const montauk::abi::KeyEvent& key) { DeleteUserDialogState* st = (DeleteUserDialogState*)win->app_data; if (!st || !key.pressed) return; diff --git a/programs/src/desktop/compose.cpp b/programs/src/desktop/compose.cpp index 2d9dacf..e718079 100644 --- a/programs/src/desktop/compose.cpp +++ b/programs/src/desktop/compose.cpp @@ -33,7 +33,7 @@ void desktop_draw_lock_screen(DesktopState* ds) { fb.fill_rect_alpha(0, 0, sw, sh, Color::from_rgba(0, 0, 0, 0x80)); // Clock display above card - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); char time_str[12]; snprintf(time_str, sizeof(time_str), "%02d:%02d", (int)dt.Hour, (int)dt.Minute); diff --git a/programs/src/desktop/desktop_internal.hpp b/programs/src/desktop/desktop_internal.hpp index 16d67a1..f7ac528 100644 --- a/programs/src/desktop/desktop_internal.hpp +++ b/programs/src/desktop/desktop_internal.hpp @@ -124,7 +124,7 @@ inline int menu_add_external(const char* label, const char* binary, SvgIcon* ico // ============================================================================ inline bool desktop_window_fullscreen(const gui::Window* win) { - return win && win->external && (win->ext_flags & Montauk::WIN_FLAG_FULLSCREEN); + return win && win->external && (win->ext_flags & montauk::abi::WIN_FLAG_FULLSCREEN); } inline gui::Rect desktop_content_rect(const gui::Window* win) { @@ -160,7 +160,7 @@ inline const char* month_names[] = { // launcher.cpp void desktop_init_launcher(gui::DesktopState* ds); -bool desktop_handle_launcher_keyboard(gui::DesktopState* ds, const Montauk::KeyEvent& key); +bool desktop_handle_launcher_keyboard(gui::DesktopState* ds, const montauk::abi::KeyEvent& key); void desktop_handle_launcher_mouse(gui::DesktopState* ds); void desktop_draw_launcher(gui::DesktopState* ds); uint64_t desktop_launcher_blink_token(const gui::DesktopState* ds, uint64_t now); diff --git a/programs/src/desktop/dialogs.cpp b/programs/src/desktop/dialogs.cpp index 65eba4f..25f288d 100644 --- a/programs/src/desktop/dialogs.cpp +++ b/programs/src/desktop/dialogs.cpp @@ -69,7 +69,7 @@ static void reboot_dialog_on_mouse(Window* win, MouseEvent& ev) { rs->hover_cancel = cb.contains(lx, ly); if (ev.left_pressed()) { - if (rs->hover_reboot) desktop_request_power(Montauk::POWER_REQ_REBOOT); + if (rs->hover_reboot) desktop_request_power(montauk::abi::POWER_REQ_REBOOT); if (rs->hover_cancel) { for (int i = 0; i < rs->ds->window_count; i++) { if (rs->ds->windows[i].app_data == rs) { @@ -81,12 +81,12 @@ static void reboot_dialog_on_mouse(Window* win, MouseEvent& ev) { } } -static void reboot_dialog_on_key(Window* win, const Montauk::KeyEvent& key) { +static void reboot_dialog_on_key(Window* win, const montauk::abi::KeyEvent& key) { RebootDialogState* rs = (RebootDialogState*)win->app_data; if (!rs || !key.pressed) return; if (key.ascii == '\n' || key.ascii == '\r') { - desktop_request_power(Montauk::POWER_REQ_REBOOT); + desktop_request_power(montauk::abi::POWER_REQ_REBOOT); } if (key.scancode == 0x01) { // Escape for (int i = 0; i < rs->ds->window_count; i++) { @@ -181,7 +181,7 @@ static void shutdown_dialog_on_mouse(Window* win, MouseEvent& ev) { ss->hover_cancel = cb.contains(lx, ly); if (ev.left_pressed()) { - if (ss->hover_shutdown) desktop_request_power(Montauk::POWER_REQ_SHUTDOWN); + if (ss->hover_shutdown) desktop_request_power(montauk::abi::POWER_REQ_SHUTDOWN); if (ss->hover_cancel) { for (int i = 0; i < ss->ds->window_count; i++) { if (ss->ds->windows[i].app_data == ss) { @@ -193,12 +193,12 @@ static void shutdown_dialog_on_mouse(Window* win, MouseEvent& ev) { } } -static void shutdown_dialog_on_key(Window* win, const Montauk::KeyEvent& key) { +static void shutdown_dialog_on_key(Window* win, const montauk::abi::KeyEvent& key) { ShutdownDialogState* ss = (ShutdownDialogState*)win->app_data; if (!ss || !key.pressed) return; if (key.ascii == '\n' || key.ascii == '\r') { - desktop_request_power(Montauk::POWER_REQ_SHUTDOWN); + desktop_request_power(montauk::abi::POWER_REQ_SHUTDOWN); } if (key.scancode == 0x01) { // Escape for (int i = 0; i < ss->ds->window_count; i++) { @@ -314,7 +314,7 @@ static void sleep_dialog_on_mouse(Window* win, MouseEvent& ev) { } } -static void sleep_dialog_on_key(Window* win, const Montauk::KeyEvent& key) { +static void sleep_dialog_on_key(Window* win, const montauk::abi::KeyEvent& key) { SleepDialogState* ss = (SleepDialogState*)win->app_data; if (!ss || !key.pressed) return; diff --git a/programs/src/desktop/input.cpp b/programs/src/desktop/input.cpp index 56e1644..72b288d 100644 --- a/programs/src/desktop/input.cpp +++ b/programs/src/desktop/input.cpp @@ -66,7 +66,7 @@ static void handle_lock_mouse(DesktopState* ds) { } } -static void handle_lock_keyboard(DesktopState* ds, const Montauk::KeyEvent& key) { +static void handle_lock_keyboard(DesktopState* ds, const montauk::abi::KeyEvent& key) { if (!key.pressed) return; // Enter submits @@ -101,7 +101,7 @@ static void forward_external_mouse(gui::Window* win, uint8_t buttons, uint8_t prev) { gui::Rect cr = desktop_content_rect(win); - Montauk::WinEvent wev; + montauk::abi::WinEvent wev; montauk::memset(&wev, 0, sizeof(wev)); wev.type = 1; // mouse wev.mouse.x = mx - cr.x; @@ -242,7 +242,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { } } else { Rect cr = desktop_content_rect(win); - Montauk::WinEvent rev; + montauk::abi::WinEvent rev; montauk::memset(&rev, 0, sizeof(rev)); rev.type = 2; rev.resize.w = cr.w; @@ -264,7 +264,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { } } else { Rect cr = desktop_content_rect(win); - Montauk::WinEvent rev; + montauk::abi::WinEvent rev; montauk::memset(&rev, 0, sizeof(rev)); rev.type = 2; rev.resize.w = cr.w; @@ -331,7 +331,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { win->dirty = true; } else { Rect cr = desktop_content_rect(win); - Montauk::WinEvent rev; + montauk::abi::WinEvent rev; montauk::memset(&rev, 0, sizeof(rev)); rev.type = 2; rev.resize.w = cr.w; @@ -615,7 +615,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { } } else { Rect cr = desktop_content_rect(win); - Montauk::WinEvent rev; + montauk::abi::WinEvent rev; montauk::memset(&rev, 0, sizeof(rev)); rev.type = 2; rev.resize.w = cr.w; @@ -661,7 +661,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { Window* raised = &ds->windows[new_idx]; if (raised->external) { // Forward mouse event to external window - Montauk::WinEvent wev; + montauk::abi::WinEvent wev; montauk::memset(&wev, 0, sizeof(wev)); wev.type = 1; // mouse wev.mouse.x = mx - cr.x; @@ -700,7 +700,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { // Forward if mouse is over content (hover/move) or button is held/released (drag continuity) if (cr.contains(mx, my) || left_held || left_released) { if (win->external) { - Montauk::WinEvent wev; + montauk::abi::WinEvent wev; montauk::memset(&wev, 0, sizeof(wev)); wev.type = 1; // mouse wev.mouse.x = mx - cr.x; @@ -726,7 +726,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { Rect cr = desktop_content_rect(win); if (cr.contains(mx, my)) { if (win->external) { - Montauk::WinEvent wev; + montauk::abi::WinEvent wev; montauk::memset(&wev, 0, sizeof(wev)); wev.type = 1; // mouse wev.mouse.x = mx - cr.x; @@ -763,7 +763,7 @@ void gui::desktop_handle_mouse(DesktopState* ds) { } } -void gui::desktop_handle_keyboard(DesktopState* ds, const Montauk::KeyEvent& key) { +void gui::desktop_handle_keyboard(DesktopState* ds, const montauk::abi::KeyEvent& key) { if (ds->screen_locked) { handle_lock_keyboard(ds, key); return; @@ -776,7 +776,7 @@ void gui::desktop_handle_keyboard(DesktopState* ds, const Montauk::KeyEvent& key if (!desktop_window_fullscreen(win)) break; - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; montauk::memset(&ev, 0, sizeof(ev)); ev.type = 0; // key ev.key = key; @@ -828,7 +828,7 @@ void gui::desktop_handle_keyboard(DesktopState* ds, const Montauk::KeyEvent& key Window* win = &ds->windows[ds->focused_window]; if (win->external) { // Forward key event to external window via syscall - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; montauk::memset(&ev, 0, sizeof(ev)); ev.type = 0; // key ev.key = key; diff --git a/programs/src/desktop/launcher.cpp b/programs/src/desktop/launcher.cpp index 75369fe..f4f5c7e 100644 --- a/programs/src/desktop/launcher.cpp +++ b/programs/src/desktop/launcher.cpp @@ -339,11 +339,11 @@ static void launcher_activate_selected(DesktopState* ds) { break; case LAUNCHER_ITEM_COMMAND_REBOOT: desktop_close_launcher(ds); - desktop_request_power(Montauk::POWER_REQ_REBOOT); + desktop_request_power(montauk::abi::POWER_REQ_REBOOT); return; case LAUNCHER_ITEM_COMMAND_SHUTDOWN: desktop_close_launcher(ds); - desktop_request_power(Montauk::POWER_REQ_SHUTDOWN); + desktop_request_power(montauk::abi::POWER_REQ_SHUTDOWN); return; case LAUNCHER_ITEM_SPECIAL_FOLDER: if (item->path[0] != '\0') { @@ -355,7 +355,7 @@ static void launcher_activate_selected(DesktopState* ds) { desktop_close_launcher(ds); } -static void launcher_update_super_state(DesktopState* ds, const Montauk::KeyEvent& key) { +static void launcher_update_super_state(DesktopState* ds, const montauk::abi::KeyEvent& key) { uint8_t sc = key.scancode & 0x7F; if (sc == 0x5B) { ds->super_left_down = key.pressed; @@ -411,7 +411,7 @@ void desktop_close_launcher(DesktopState* ds) { ds->launcher_scroll = 0; } -bool desktop_handle_launcher_keyboard(DesktopState* ds, const Montauk::KeyEvent& key) { +bool desktop_handle_launcher_keyboard(DesktopState* ds, const montauk::abi::KeyEvent& key) { launcher_update_super_state(ds, key); uint8_t sc = key.scancode & 0x7F; diff --git a/programs/src/desktop/main.cpp b/programs/src/desktop/main.cpp index a74eaa1..18f7b03 100644 --- a/programs/src/desktop/main.cpp +++ b/programs/src/desktop/main.cpp @@ -180,7 +180,7 @@ void gui::desktop_init(DesktopState* ds) { ds->app_menu_open = false; desktop_init_launcher(ds); - montauk::memset(&ds->mouse, 0, sizeof(Montauk::MouseState)); + montauk::memset(&ds->mouse, 0, sizeof(montauk::abi::MouseState)); montauk::set_mouse_bounds(ds->screen_w - 1, ds->screen_h - 1); gui::clipboard_clear(); @@ -333,7 +333,7 @@ void gui::desktop_init(DesktopState* ds) { // ============================================================================ static uint64_t desktop_clock_token() { - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); return ((uint64_t)dt.Year << 32) | ((uint64_t)dt.Month << 24) @@ -369,7 +369,7 @@ static void desktop_clear_window_dirty(DesktopState* ds) { } } -static bool desktop_netcfg_equal(const Montauk::NetCfg& a, const Montauk::NetCfg& b) { +static bool desktop_netcfg_equal(const montauk::abi::NetCfg& a, const montauk::abi::NetCfg& b) { if (a.ipAddress != b.ipAddress || a.subnetMask != b.subnetMask || a.gateway != b.gateway || a.dnsServer != b.dnsServer) { return false; @@ -385,7 +385,7 @@ static bool desktop_refresh_panel_state(DesktopState* ds, uint64_t now) { bool changed = false; if (now - ds->net_cfg_last_poll > 5000) { - Montauk::NetCfg next; + montauk::abi::NetCfg next; montauk::get_netcfg(&next); if (!desktop_netcfg_equal(next, ds->cached_net_cfg)) { ds->cached_net_cfg = next; @@ -425,7 +425,7 @@ static bool desktop_refresh_panel_state(DesktopState* ds, uint64_t now) { bool desktop_poll_external_windows(DesktopState* ds) { bool changed = false; - Montauk::WinInfo extWins[8]; + montauk::abi::WinInfo extWins[8]; int extCount = montauk::win_enumerate(extWins, 8); // Check for new external windows and map them @@ -649,7 +649,7 @@ void gui::desktop_run(DesktopState* ds) { // Poll keyboard events while (montauk::is_key_available()) { - Montauk::KeyEvent key; + montauk::abi::KeyEvent key; montauk::getkey(&key); desktop_handle_keyboard(ds, key); keyboardChanged = true; @@ -730,7 +730,7 @@ static DesktopState* g_desktop; static constexpr const char kDesktopBinaryName[] = "desktop.elf"; static constexpr int DESKTOP_PROC_SCAN_MAX = 256; -static bool desktop_proc_alive(const Montauk::ProcInfo& proc) { +static bool desktop_proc_alive(const montauk::abi::ProcInfo& proc) { return proc.state == 1 || proc.state == 2 || proc.state == 3; } @@ -745,7 +745,7 @@ static bool proc_name_is_desktop(const char* name) { } static bool existing_desktop_running() { - static Montauk::ProcInfo procs[DESKTOP_PROC_SCAN_MAX]; + static montauk::abi::ProcInfo procs[DESKTOP_PROC_SCAN_MAX]; int count = montauk::proclist(procs, DESKTOP_PROC_SCAN_MAX); if (count <= 0) return false; diff --git a/programs/src/desktop/panel.cpp b/programs/src/desktop/panel.cpp index f765bfc..5abb1bb 100644 --- a/programs/src/desktop/panel.cpp +++ b/programs/src/desktop/panel.cpp @@ -83,7 +83,7 @@ void gui::desktop_draw_panel(DesktopState* ds) { } // Date + Clock (right side) - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); char clock_str[12]; @@ -256,7 +256,7 @@ void desktop_draw_app_menu(DesktopState* ds) { void desktop_draw_net_popup(DesktopState* ds) { Framebuffer& fb = ds->fb; - Montauk::NetCfg& nc = ds->cached_net_cfg; + montauk::abi::NetCfg& nc = ds->cached_net_cfg; bool connected = nc.ipAddress != 0; int popup_w = 220; diff --git a/programs/src/desktop/window.cpp b/programs/src/desktop/window.cpp index 9937d02..d62f005 100644 --- a/programs/src/desktop/window.cpp +++ b/programs/src/desktop/window.cpp @@ -64,7 +64,7 @@ void gui::desktop_close_window(DesktopState* ds, int idx) { if (ds->closing_ext_count < DesktopState::MAX_CLOSING) { ds->closing_ext_ids[ds->closing_ext_count++] = win->ext_win_id; } - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; montauk::memset(&ev, 0, sizeof(ev)); ev.type = 3; // close montauk::win_sendevent(win->ext_win_id, &ev); diff --git a/programs/src/devexplorer/devexplorer.h b/programs/src/devexplorer/devexplorer.h index c72dcf7..0123de7 100644 --- a/programs/src/devexplorer/devexplorer.h +++ b/programs/src/devexplorer/devexplorer.h @@ -139,7 +139,7 @@ static constexpr int DD_INIT_H = 420; static constexpr int DD_TAB_BAR_H = 32; struct DiskDetailState { - Montauk::DiskInfo info; + montauk::abi::DiskInfo info; int active_tab; int win_id; int win_w, win_h; @@ -152,7 +152,7 @@ struct DiskDetailState { // ============================================================================ struct DevExplorerState { - Montauk::DevInfo devs[MAX_TOTAL_DEVS]; + montauk::abi::DevInfo devs[MAX_TOTAL_DEVS]; int dev_count; bool collapsed[NUM_CATEGORIES]; int selected_row; @@ -193,7 +193,7 @@ void render(uint32_t* pixels); // ============================================================================ int build_display_rows(DevExplorerState* de, DisplayRow* rows); -int append_printer_devices(Montauk::DevInfo* out, int max_count); +int append_printer_devices(montauk::abi::DevInfo* out, int max_count); ScrollMetrics compute_scroll_metrics(DevExplorerState* de, const DisplayRow* rows, int row_count); void set_scroll_from_px(DevExplorerState* de, const DisplayRow* rows, diff --git a/programs/src/devexplorer/diskdetail.cpp b/programs/src/devexplorer/diskdetail.cpp index 524327e..ce1d525 100644 --- a/programs/src/devexplorer/diskdetail.cpp +++ b/programs/src/devexplorer/diskdetail.cpp @@ -274,7 +274,7 @@ void open_disk_detail(int port, const char* model) { montauk::memset(&dd.info, 0, sizeof(dd.info)); montauk::diskinfo(&dd.info, port); - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create(title, dd.win_w, dd.win_h, &wres) < 0 || wres.id < 0) return; diff --git a/programs/src/devexplorer/main.cpp b/programs/src/devexplorer/main.cpp index 2398709..5d0681d 100644 --- a/programs/src/devexplorer/main.cpp +++ b/programs/src/devexplorer/main.cpp @@ -186,7 +186,7 @@ static bool handle_list_click(int mx, int my) { // Mouse handling (wheel, draggable scrollbar, clicks) // ============================================================================ -static bool handle_main_mouse(const Montauk::WinEvent& ev) { +static bool handle_main_mouse(const montauk::abi::WinEvent& ev) { auto& de = g_state; int mx = ev.mouse.x; int my = ev.mouse.y; @@ -272,7 +272,7 @@ static bool handle_main_mouse(const Montauk::WinEvent& ev) { // Key handling // ============================================================================ -static bool handle_key(const Montauk::KeyEvent& key) { +static bool handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return false; auto& de = g_state; @@ -371,7 +371,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool redraw_main = false; bool redraw_detail = false; diff --git a/programs/src/devexplorer/printers.cpp b/programs/src/devexplorer/printers.cpp index ec30e57..e282d15 100644 --- a/programs/src/devexplorer/printers.cpp +++ b/programs/src/devexplorer/printers.cpp @@ -45,7 +45,7 @@ static void format_printer_detail(const ProbeState& probe, snprintf(out, (size_t)out_len, "Awaiting spooler probe"); } -int append_printer_devices(Montauk::DevInfo* out, int max_count) { +int append_printer_devices(montauk::abi::DevInfo* out, int max_count) { if (out == nullptr || max_count <= 0) return 0; char current_uri[MAX_PATH_LEN] = {}; @@ -65,7 +65,7 @@ int append_printer_devices(Montauk::DevInfo* out, int max_count) { char uri_err[128] = {}; bool normalized_ok = normalize_ipp_uri(effective_uri, &normalized, uri_err, sizeof(uri_err)); - Montauk::DevInfo dev = {}; + montauk::abi::DevInfo dev = {}; dev.category = CAT_PRINTER; if (has_probe && probe.caps.printer_name[0]) { diff --git a/programs/src/dhcp/main.cpp b/programs/src/dhcp/main.cpp index 8c5fa6a..1a8c05a 100644 --- a/programs/src/dhcp/main.cpp +++ b/programs/src/dhcp/main.cpp @@ -335,7 +335,7 @@ extern "C" void _start() { montauk::print("MontaukOS DHCP Client\n"); // 1. Get MAC address - Montauk::NetCfg origCfg; + montauk::abi::NetCfg origCfg; montauk::get_netcfg(&origCfg); char macStr[32]; @@ -344,14 +344,14 @@ extern "C" void _start() { montauk::print(msg); // 2. Set IP to 0.0.0.0 to allow broadcast send/receive - Montauk::NetCfg zeroCfg; + montauk::abi::NetCfg zeroCfg; zeroCfg.ipAddress = 0; zeroCfg.subnetMask = 0; zeroCfg.gateway = 0; montauk::set_netcfg(&zeroCfg); // 3. Create UDP socket and bind to port 68 - int fd = montauk::socket(Montauk::SOCK_UDP); + int fd = montauk::socket(montauk::abi::SOCK_UDP); if (fd < 0) { montauk::print("Error: failed to create UDP socket\n"); montauk::set_netcfg(&origCfg); @@ -399,7 +399,7 @@ extern "C" void _start() { } uint64_t now = montauk::get_milliseconds(); if (now >= startMs + 10000) break; - montauk::wait_handle(fd, Montauk::IPC_SIGNAL_READABLE, startMs + 10000 - now); + montauk::wait_handle(fd, montauk::abi::IPC_SIGNAL_READABLE, startMs + 10000 - now); } if (!gotOffer) { @@ -451,7 +451,7 @@ extern "C" void _start() { } uint64_t now = montauk::get_milliseconds(); if (now >= startMs + 10000) break; - montauk::wait_handle(fd, Montauk::IPC_SIGNAL_READABLE, startMs + 10000 - now); + montauk::wait_handle(fd, montauk::abi::IPC_SIGNAL_READABLE, startMs + 10000 - now); } montauk::closesocket(fd); @@ -463,7 +463,7 @@ extern "C" void _start() { } // 8. Apply configuration - Montauk::NetCfg newCfg; + montauk::abi::NetCfg newCfg; newCfg.ipAddress = offer.offeredIp; newCfg.subnetMask = offer.subnetMask; newCfg.gateway = offer.router; diff --git a/programs/src/dialogs/filedialog.cpp b/programs/src/dialogs/filedialog.cpp index 1211da4..82ae14b 100644 --- a/programs/src/dialogs/filedialog.cpp +++ b/programs/src/dialogs/filedialog.cpp @@ -1047,7 +1047,7 @@ int file_field_mouse(mtk::TextInputState& input, const Rect& rect, char* buf, in focused, false, filter); } -void handle_file_mouse(const Montauk::WinEvent& ev) { +void handle_file_mouse(const montauk::abi::WinEvent& ev) { FileDialogState* st = &g_file; st->mouse_x = ev.mouse.x; st->mouse_y = ev.mouse.y; @@ -1159,7 +1159,7 @@ void handle_file_mouse(const Montauk::WinEvent& ev) { } } -void handle_file_key(const Montauk::KeyEvent& key) { +void handle_file_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return; FileDialogState* st = &g_file; @@ -1234,11 +1234,11 @@ void draw() { draw_file_dialog(); } -void handle_mouse(const Montauk::WinEvent& ev) { +void handle_mouse(const montauk::abi::WinEvent& ev) { handle_file_mouse(ev); } -void handle_key(const Montauk::KeyEvent& key) { +void handle_key(const montauk::abi::KeyEvent& key) { handle_file_key(key); } diff --git a/programs/src/dialogs/filedialog.hpp b/programs/src/dialogs/filedialog.hpp index aa0cc1d..4fabce8 100644 --- a/programs/src/dialogs/filedialog.hpp +++ b/programs/src/dialogs/filedialog.hpp @@ -50,8 +50,8 @@ constexpr int BUTTON_W = 88; void init(const gui::dialogs::Request& req); void draw(); -void handle_mouse(const Montauk::WinEvent& ev); -void handle_key(const Montauk::KeyEvent& key); +void handle_mouse(const montauk::abi::WinEvent& ev); +void handle_key(const montauk::abi::KeyEvent& key); void cleanup(); } // namespace filedialog diff --git a/programs/src/dialogs/main.cpp b/programs/src/dialogs/main.cpp index c7b34aa..5fdd052 100644 --- a/programs/src/dialogs/main.cpp +++ b/programs/src/dialogs/main.cpp @@ -35,8 +35,8 @@ static constexpr uint8_t WIN_SCALE = 4; struct DialogCallbacks { void (*draw)(); void (*on_close)(); - void (*handle_mouse)(const Montauk::WinEvent& ev); - void (*handle_key)(const Montauk::KeyEvent& key); + void (*handle_mouse)(const montauk::abi::WinEvent& ev); + void (*handle_key)(const montauk::abi::KeyEvent& key); }; static void run_dialog_loop(const DialogCallbacks& cb) { @@ -44,7 +44,7 @@ static void run_dialog_loop(const DialogCallbacks& cb) { cb.draw(); g_app.win.present(); - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int rc = g_app.win.poll(&ev); if (rc < 0) { cb.on_close(); break; } if (rc == 0) { montauk::sleep_ms(16); continue; } @@ -143,8 +143,8 @@ DIALOGS_EXPORT bool dialogs_run_request(const dlg::Request* request, dlg::Result } void (*draw_fn)() = g_app.is_print ? printdialog::draw : filedialog::draw; - void (*mouse_fn)(const Montauk::WinEvent&) = g_app.is_print ? printdialog::handle_mouse : filedialog::handle_mouse; - void (*key_fn)(const Montauk::KeyEvent&) = g_app.is_print ? printdialog::handle_key : filedialog::handle_key; + void (*mouse_fn)(const montauk::abi::WinEvent&) = g_app.is_print ? printdialog::handle_mouse : filedialog::handle_mouse; + void (*key_fn)(const montauk::abi::KeyEvent&) = g_app.is_print ? printdialog::handle_key : filedialog::handle_key; draw_fn(); g_app.win.present(); diff --git a/programs/src/dialogs/messagebox.cpp b/programs/src/dialogs/messagebox.cpp index 9b878d1..05de72e 100644 --- a/programs/src/dialogs/messagebox.cpp +++ b/programs/src/dialogs/messagebox.cpp @@ -367,7 +367,7 @@ void draw_message_box() { } } -void handle_message_mouse(const Montauk::WinEvent& ev) { +void handle_message_mouse(const montauk::abi::WinEvent& ev) { MessageBoxState* st = &g_message; st->mouse_x = ev.mouse.x; st->mouse_y = ev.mouse.y; @@ -384,7 +384,7 @@ void handle_message_mouse(const Montauk::WinEvent& ev) { } } -void handle_message_key(const Montauk::KeyEvent& key) { +void handle_message_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return; MessageBoxState* st = &g_message; @@ -464,11 +464,11 @@ void draw() { draw_message_box(); } -void handle_mouse(const Montauk::WinEvent& ev) { +void handle_mouse(const montauk::abi::WinEvent& ev) { handle_message_mouse(ev); } -void handle_key(const Montauk::KeyEvent& key) { +void handle_key(const montauk::abi::KeyEvent& key) { handle_message_key(key); } diff --git a/programs/src/dialogs/messagebox.hpp b/programs/src/dialogs/messagebox.hpp index ad3e368..d2545de 100644 --- a/programs/src/dialogs/messagebox.hpp +++ b/programs/src/dialogs/messagebox.hpp @@ -38,8 +38,8 @@ constexpr int MAX_LINE_LEN = 128; void init(const char* message, uint8_t buttons, uint8_t default_choice = 0); void preferred_size(const char* title, int* out_w, int* out_h); void draw(); -void handle_mouse(const Montauk::WinEvent& ev); -void handle_key(const Montauk::KeyEvent& key); +void handle_mouse(const montauk::abi::WinEvent& ev); +void handle_key(const montauk::abi::KeyEvent& key); void dismiss(); uint8_t selected_choice(); void cleanup(); diff --git a/programs/src/dialogs/printdialog.cpp b/programs/src/dialogs/printdialog.cpp index 5c3569d..f483011 100644 --- a/programs/src/dialogs/printdialog.cpp +++ b/programs/src/dialogs/printdialog.cpp @@ -420,7 +420,7 @@ void print_submit(PrintDialogState* st) { dialog_finish("ok", "", job_id, msg, printer.uri, printer.name, st->copies); } -void handle_print_mouse(const Montauk::WinEvent& ev) { +void handle_print_mouse(const montauk::abi::WinEvent& ev) { PrintDialogState* st = &g_print; st->mouse_x = ev.mouse.x; st->mouse_y = ev.mouse.y; @@ -456,7 +456,7 @@ void handle_print_mouse(const Montauk::WinEvent& ev) { } } -void handle_print_key(const Montauk::KeyEvent& key) { +void handle_print_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return; if (key.scancode == 0x01) { dialog_cancel(); @@ -505,11 +505,11 @@ void draw() { draw_print_dialog(); } -void handle_mouse(const Montauk::WinEvent& ev) { +void handle_mouse(const montauk::abi::WinEvent& ev) { handle_print_mouse(ev); } -void handle_key(const Montauk::KeyEvent& key) { +void handle_key(const montauk::abi::KeyEvent& key) { handle_print_key(key); } diff --git a/programs/src/dialogs/printdialog.hpp b/programs/src/dialogs/printdialog.hpp index 04b3bcf..b908697 100644 --- a/programs/src/dialogs/printdialog.hpp +++ b/programs/src/dialogs/printdialog.hpp @@ -34,8 +34,8 @@ constexpr int BUTTON_W = 88; void init(const gui::dialogs::Request& req); void draw(); -void handle_mouse(const Montauk::WinEvent& ev); -void handle_key(const Montauk::KeyEvent& key); +void handle_mouse(const montauk::abi::WinEvent& ev); +void handle_key(const montauk::abi::KeyEvent& key); void cleanup(); } // namespace printdialog diff --git a/programs/src/disks/actions.cpp b/programs/src/disks/actions.cpp index af4e584..71210fc 100644 --- a/programs/src/disks/actions.cpp +++ b/programs/src/disks/actions.cpp @@ -14,7 +14,7 @@ void disktool_refresh() { auto& dt = g_state; dt.disk_count = 0; for (int port = 0; port < MAX_DISKS; port++) { - Montauk::DiskInfo info; + montauk::abi::DiskInfo info; montauk::memset(&info, 0, sizeof(info)); int r = montauk::diskinfo(&info, port); if (r == 0 && info.type != 0) { @@ -45,7 +45,7 @@ void open_newpart_dialog() { dlg.hover_confirm = false; dlg.hover_cancel = false; - Montauk::DiskInfo& disk = dt.disks[dt.selected_disk]; + montauk::abi::DiskInfo& disk = dt.disks[dt.selected_disk]; int blockDev = selected_block_dev(); char sz[24]; format_disk_size(sz, sizeof(sz), disk.sectorCount, disk.sectorSizeLog); @@ -64,7 +64,7 @@ void open_newpart_dialog() { "free region on this disk."); } - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; const char* title = dlg.will_init_gpt ? "Initialize Disk" : "New Partition"; if (montauk::win_create(title, NP_DLG_W, NP_DLG_H, &wres) < 0 || wres.id < 0) { set_status("Failed to open dialog"); @@ -100,7 +100,7 @@ void newpart_dialog_confirm() { set_status("Initialized GPT"); } - Montauk::GptAddParams params; + montauk::abi::GptAddParams params; montauk::memset(¶ms, 0, sizeof(params)); params.blockDev = selected_block_dev(); params.startLba = 0; @@ -187,15 +187,15 @@ void open_format_dialog() { dlg.hover_cancel = false; // Build partition description - Montauk::PartInfo& p = dt.parts[global_idx]; - Montauk::DiskInfo& disk = dt.disks[dt.selected_disk]; + montauk::abi::PartInfo& p = dt.parts[global_idx]; + montauk::abi::DiskInfo& disk = dt.disks[dt.selected_disk]; char sz[24]; format_disk_size(sz, sizeof(sz), p.sectorCount, disk.sectorSizeLog); const char* pname = p.name[0] ? p.name : "Partition"; snprintf(dlg.part_desc, sizeof(dlg.part_desc), "%s (%s)", pname, sz); // Create dialog window - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create("Format Partition", FMT_DLG_W, FMT_DLG_H, &wres) < 0 || wres.id < 0) { set_status("Failed to open format dialog"); return; @@ -219,7 +219,7 @@ void format_dialog_do_format() { auto& dt = g_state; auto& dlg = dt.fmt_dlg; - Montauk::FsFormatParams params; + montauk::abi::FsFormatParams params; montauk::memset(¶ms, 0, sizeof(params)); params.partIndex = dlg.global_part_index; params.fsType = g_fsTypes[dlg.selected_fs].id; diff --git a/programs/src/disks/disks.h b/programs/src/disks/disks.h index c25df46..b4c46c0 100644 --- a/programs/src/disks/disks.h +++ b/programs/src/disks/disks.h @@ -49,7 +49,7 @@ struct FsTypeEntry { }; static const FsTypeEntry g_fsTypes[] = { - { "FAT32", Montauk::FS_TYPE_FAT32 }, + { "FAT32", montauk::abi::FS_TYPE_FAT32 }, }; static constexpr int NUM_FS_TYPES = 1; @@ -86,9 +86,9 @@ struct NewPartDialog { }; struct DiskToolState { - Montauk::DiskInfo disks[MAX_DISKS]; + montauk::abi::DiskInfo disks[MAX_DISKS]; int disk_count; - Montauk::PartInfo parts[MAX_PARTS]; + montauk::abi::PartInfo parts[MAX_PARTS]; int part_count; int selected_disk; int selected_part; diff --git a/programs/src/disks/main.cpp b/programs/src/disks/main.cpp index ca0b727..cba8edd 100644 --- a/programs/src/disks/main.cpp +++ b/programs/src/disks/main.cpp @@ -146,13 +146,13 @@ static bool handle_content_click(int mx, int my) { int map_x = MAP_PAD; int map_w = g_win_w - MAP_PAD * 2; if (my >= y && my < y + MAP_H) { - Montauk::DiskInfo& disk = dt.disks[dt.selected_disk]; + montauk::abi::DiskInfo& disk = dt.disks[dt.selected_disk]; int part_indices[MAX_PARTS]; int nparts = get_disk_parts(part_indices, MAX_PARTS); uint64_t total = disk.sectorCount; if (total > 0) { for (int pi = 0; pi < nparts; pi++) { - Montauk::PartInfo& p = dt.parts[part_indices[pi]]; + montauk::abi::PartInfo& p = dt.parts[part_indices[pi]]; int px = map_x + (int)((p.startLba * (uint64_t)map_w) / total); int pw = (int)((p.sectorCount * (uint64_t)map_w) / total); if (pw < 2) pw = 2; @@ -278,7 +278,7 @@ static void clamp_scroll() { g_state.scroll_y = gui_clamp(g_state.scroll_y, 0, max_scroll_y()); } -static bool handle_mouse(const Montauk::WinEvent& ev) { +static bool handle_mouse(const montauk::abi::WinEvent& ev) { int prev_x = g_state.mouse_x; int prev_y = g_state.mouse_y; int prev_disk_hover = hovered_disk_button(prev_x, prev_y); @@ -320,7 +320,7 @@ static bool handle_mouse(const Montauk::WinEvent& ev) { // Key handling // ============================================================================ -static bool handle_key(const Montauk::KeyEvent& key) { +static bool handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return false; auto& dt = g_state; @@ -403,7 +403,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool redraw_main = false; bool redraw_dlg = false; diff --git a/programs/src/disks/render.cpp b/programs/src/disks/render.cpp index 641f650..5b4e7e6 100644 --- a/programs/src/disks/render.cpp +++ b/programs/src/disks/render.cpp @@ -112,7 +112,7 @@ static void render_content(Canvas& c, const mtk::Theme& theme) { if (dt.disk_count == 0 || dt.selected_disk < 0 || dt.selected_disk >= dt.disk_count) return; - Montauk::DiskInfo& disk = dt.disks[dt.selected_disk]; + montauk::abi::DiskInfo& disk = dt.disks[dt.selected_disk]; int y = content_title_y(); char info_str[64]; @@ -138,7 +138,7 @@ static void render_content(Canvas& c, const mtk::Theme& theme) { if (total_sectors > 0 && nparts > 0) { for (int pi = 0; pi < nparts; pi++) { - Montauk::PartInfo& p = dt.parts[part_indices[pi]]; + montauk::abi::PartInfo& p = dt.parts[part_indices[pi]]; int part_x = map_rect.x + (int)((p.startLba * (uint64_t)map_rect.w) / total_sectors); int part_w = (int)((p.sectorCount * (uint64_t)map_rect.w) / total_sectors); if (part_w < 2) part_w = 2; @@ -214,7 +214,7 @@ static void render_content(Canvas& c, const mtk::Theme& theme) { table_style.row_hover_bg); } - Montauk::PartInfo& p = dt.parts[part_indices[pi]]; + montauk::abi::PartInfo& p = dt.parts[part_indices[pi]]; c.fill_rounded_rect(col_idx, row_y + (ITEM_H - 10) / 2, 10, 10, 5, part_colors[pi % NUM_PART_COLORS]); diff --git a/programs/src/doom/doomgeneric_montauk.c b/programs/src/doom/doomgeneric_montauk.c index 1a07f75..d0ff299 100644 --- a/programs/src/doom/doomgeneric_montauk.c +++ b/programs/src/doom/doomgeneric_montauk.c @@ -66,7 +66,7 @@ static inline long _zos_syscall4(long nr, long a1, long a2, long a3, long a4) { #define SYS_WINPRESENT 56 #define SYS_WINPOLL 57 -/* Window server structs (must match Montauk::WinCreateResult and Montauk::WinEvent) */ +/* Window server structs (must match montauk::abi::WinCreateResult and montauk::abi::WinEvent) */ struct WinCreateResult { int id; /* -1 on failure */ unsigned _pad; diff --git a/programs/src/edit/main.cpp b/programs/src/edit/main.cpp index a6ea7a7..2d2537d 100644 --- a/programs/src/edit/main.cpp +++ b/programs/src/edit/main.cpp @@ -396,7 +396,7 @@ static int prompt_input(const char* promptStr, char* out, int outMax) { continue; } - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (!ev.pressed) continue; @@ -732,7 +732,7 @@ static constexpr uint8_t SC_DELETE = 0x53; // ---- Input handling ---- -static void handle_key(const Montauk::KeyEvent& ev) { +static void handle_key(const montauk::abi::KeyEvent& ev) { if (!ev.pressed) return; // Ctrl key combinations @@ -905,7 +905,7 @@ extern "C" void _start() { montauk::yield(); } - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); handle_key(ev); } diff --git a/programs/src/fetch/main.cpp b/programs/src/fetch/main.cpp index 578e3ff..072e3b7 100644 --- a/programs/src/fetch/main.cpp +++ b/programs/src/fetch/main.cpp @@ -160,7 +160,7 @@ static void parse_status_text(const char* buf, int len, char* out, int outMax) { static bool check_keyboard_abort() { if (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (ev.pressed && ev.ctrl && ev.ascii == 'q') return true; } @@ -189,7 +189,7 @@ static int plain_http_exchange(int fd, const char* request, int reqLen, deadline = montauk::get_milliseconds() + 15000; while (respLen < respMax - 1) { if (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (ev.pressed && ev.ctrl && ev.ascii == 'q') return -2; // aborted } @@ -202,7 +202,7 @@ static int plain_http_exchange(int fd, const char* request, int reqLen, if (now >= deadline) break; uint32_t signals = montauk::wait_handle( fd, - Montauk::IPC_SIGNAL_READABLE | Montauk::IPC_SIGNAL_PEER_CLOSED, + montauk::abi::IPC_SIGNAL_READABLE | montauk::abi::IPC_SIGNAL_PEER_CLOSED, deadline - now ); if (signals == 0 || signals == (uint32_t)-1) break; @@ -404,7 +404,7 @@ extern "C" void _start() { if (verbose) { uint32_t days, secs; tls::get_bearssl_time(&days, &secs); - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); char tmsg[128]; snprintf(tmsg, sizeof(tmsg), "System time: %u-%02u-%02u %02u:%02u:%02u (days=%u secs=%u)\n", @@ -424,7 +424,7 @@ extern "C" void _start() { } } else { // ---- Plain HTTP ---- - int fd = montauk::socket(Montauk::SOCK_TCP); + int fd = montauk::socket(montauk::abi::SOCK_TCP); if (fd < 0) { montauk::print("Error: failed to create socket\n"); montauk::exit(1); diff --git a/programs/src/fontpreview/main.cpp b/programs/src/fontpreview/main.cpp index c8fba47..44b2bc1 100644 --- a/programs/src/fontpreview/main.cpp +++ b/programs/src/fontpreview/main.cpp @@ -369,7 +369,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/httpd/main.cpp b/programs/src/httpd/main.cpp index 5754a6a..6103dab 100644 --- a/programs/src/httpd/main.cpp +++ b/programs/src/httpd/main.cpp @@ -223,7 +223,7 @@ static int parse_request_path(const char* req, int reqLen, char* pathOut, int pa static void log_request(const char* method, const char* path, int status, int bodyLen) { // Get timestamp - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); char msg[256]; @@ -236,7 +236,7 @@ static void log_request(const char* method, const char* path, int status, int bo // ---- Page generators ---- static int generate_index_page(char* buf, int bufSize) { - Montauk::SysInfo info; + montauk::abi::SysInfo info; montauk::get_info(&info); uint64_t ms = montauk::get_milliseconds(); @@ -388,13 +388,13 @@ static void handle_client(int clientFd) { } else { uint32_t signals = montauk::wait_handle( clientFd, - Montauk::IPC_SIGNAL_READABLE | Montauk::IPC_SIGNAL_PEER_CLOSED, + montauk::abi::IPC_SIGNAL_READABLE | montauk::abi::IPC_SIGNAL_PEER_CLOSED, 20 ); if (signals == 0) { idleCount++; if (idleCount > 500) break; - } else if (signals & Montauk::IPC_SIGNAL_PEER_CLOSED) { + } else if (signals & montauk::abi::IPC_SIGNAL_PEER_CLOSED) { break; } } @@ -545,7 +545,7 @@ extern "C" void _start() { } // Create server socket - int listenFd = montauk::socket(Montauk::SOCK_TCP); + int listenFd = montauk::socket(montauk::abi::SOCK_TCP); if (listenFd < 0) { montauk::print("Error: failed to create socket\n"); montauk::exit(1); @@ -578,7 +578,7 @@ extern "C" void _start() { while (running) { // Check for Ctrl+Q before blocking on accept while (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (ev.pressed && ev.ctrl && ev.ascii == 'q') { running = false; @@ -599,7 +599,7 @@ extern "C" void _start() { // After serving, check for Ctrl+Q while (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (ev.pressed && ev.ctrl && ev.ascii == 'q') { running = false; diff --git a/programs/src/ifconfig/main.cpp b/programs/src/ifconfig/main.cpp index b81109e..973f85a 100644 --- a/programs/src/ifconfig/main.cpp +++ b/programs/src/ifconfig/main.cpp @@ -70,7 +70,7 @@ extern "C" void _start() { if (len <= 0 || args[0] == '\0') { // Show current network configuration - Montauk::NetCfg cfg; + montauk::abi::NetCfg cfg; montauk::get_netcfg(&cfg); montauk::print(" IP Address: "); print_ip(cfg.ipAddress); @@ -135,7 +135,7 @@ extern "C" void _start() { montauk::exit(1); } - Montauk::NetCfg cfg; + montauk::abi::NetCfg cfg; cfg.ipAddress = ip; cfg.subnetMask = mask; cfg.gateway = gw; diff --git a/programs/src/imageviewer/main.cpp b/programs/src/imageviewer/main.cpp index 094f2ab..5bdec59 100644 --- a/programs/src/imageviewer/main.cpp +++ b/programs/src/imageviewer/main.cpp @@ -581,7 +581,7 @@ extern "C" void _start() { // Event loop while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/info/main.cpp b/programs/src/info/main.cpp index cdb74ff..baad81f 100644 --- a/programs/src/info/main.cpp +++ b/programs/src/info/main.cpp @@ -23,7 +23,7 @@ static void print_int(uint64_t n) { } extern "C" void _start() { - Montauk::SysInfo info; + montauk::abi::SysInfo info; montauk::get_info(&info); montauk::print(info.osName); montauk::print(" v"); diff --git a/programs/src/init/main.cpp b/programs/src/init/main.cpp index 06da618..51a378e 100644 --- a/programs/src/init/main.cpp +++ b/programs/src/init/main.cpp @@ -90,7 +90,7 @@ static int snprintf(char* buf, int size, const char* fmt, ...) { // ---- Logging ---- static void log_timestamp(char* buf, int size) { - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); snprintf(buf, size, "%02d:%02d:%02d", dt.Hour, dt.Minute, dt.Second); } diff --git a/programs/src/installer/actions.cpp b/programs/src/installer/actions.cpp index 59dedaa..bc3edcb 100644 --- a/programs/src/installer/actions.cpp +++ b/programs/src/installer/actions.cpp @@ -11,8 +11,8 @@ // ============================================================================ // EFI System Partition: C12A7328-F81F-11D2-BA4B-00A0C93EC93B -static Montauk::PartGuid esp_type_guid() { - Montauk::PartGuid g; +static montauk::abi::PartGuid esp_type_guid() { + montauk::abi::PartGuid g; g.Data1 = 0xC12A7328; g.Data2 = 0xF81F; g.Data3 = 0x11D2; @@ -24,8 +24,8 @@ static Montauk::PartGuid esp_type_guid() { } // Linux Filesystem: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 -static Montauk::PartGuid linux_fs_type_guid() { - Montauk::PartGuid g; +static montauk::abi::PartGuid linux_fs_type_guid() { + montauk::abi::PartGuid g; g.Data1 = 0x0FC63DAF; g.Data2 = 0x8483; g.Data3 = 0x4772; @@ -52,7 +52,7 @@ void installer_refresh_disks() { auto& st = g_state; st.disk_count = 0; for (int port = 0; port < MAX_DISKS; port++) { - Montauk::DiskInfo info; + montauk::abi::DiskInfo info; montauk::memset(&info, 0, sizeof(info)); int r = montauk::diskinfo(&info, port); if (r == 0 && info.type != 0) { @@ -272,7 +272,7 @@ static bool copy_recursive(const char* src_dir, const char* dst_dir, // GPT + partition helper // ============================================================================ -static void set_gpt_name(Montauk::GptAddParams& params, const char* name) { +static void set_gpt_name(montauk::abi::GptAddParams& params, const char* name) { int i = 0; for (; name[i] && i < 71; i++) params.name[i] = name[i]; params.name[i] = '\0'; @@ -306,7 +306,7 @@ static void install_efi_ext2(int disk) { add_log("Creating EFI partition (128 MB)..."); flush_ui(); { - Montauk::GptAddParams params; + montauk::abi::GptAddParams params; montauk::memset(¶ms, 0, sizeof(params)); params.blockDev = disk; params.startLba = FIRST_USABLE_LBA; @@ -327,7 +327,7 @@ static void install_efi_ext2(int disk) { add_log("Creating ext2 partition..."); flush_ui(); { - Montauk::GptAddParams params; + montauk::abi::GptAddParams params; montauk::memset(¶ms, 0, sizeof(params)); params.blockDev = disk; params.startLba = 0; // auto-fill largest free region @@ -345,7 +345,7 @@ static void install_efi_ext2(int disk) { flush_ui(); // Step 4: Find partition indices - Montauk::PartInfo parts[MAX_PARTS]; + montauk::abi::PartInfo parts[MAX_PARTS]; int part_count = montauk::partlist(parts, MAX_PARTS); int efi_idx = -1, linux_idx = -1; for (int p = 0; p < part_count; p++) { @@ -365,10 +365,10 @@ static void install_efi_ext2(int disk) { add_log("Formatting EFI partition (FAT32)..."); flush_ui(); { - Montauk::FsFormatParams fmt; + montauk::abi::FsFormatParams fmt; montauk::memset(&fmt, 0, sizeof(fmt)); fmt.partIndex = efi_idx; - fmt.fsType = Montauk::FS_TYPE_FAT32; + fmt.fsType = montauk::abi::FS_TYPE_FAT32; r = montauk::fs_format(&fmt); if (r < 0) { add_log("ERROR: FAT32 format failed"); @@ -382,10 +382,10 @@ static void install_efi_ext2(int disk) { add_log("Formatting root partition (ext2)..."); flush_ui(); { - Montauk::FsFormatParams fmt; + montauk::abi::FsFormatParams fmt; montauk::memset(&fmt, 0, sizeof(fmt)); fmt.partIndex = linux_idx; - fmt.fsType = Montauk::FS_TYPE_EXT2; + fmt.fsType = montauk::abi::FS_TYPE_EXT2; r = montauk::fs_format(&fmt); if (r < 0) { add_log("ERROR: ext2 format failed"); @@ -515,7 +515,7 @@ static void install_single_fat32(int disk) { // Step 2: Create EFI System Partition (entire disk) add_log("Creating EFI System Partition..."); flush_ui(); - Montauk::GptAddParams params; + montauk::abi::GptAddParams params; montauk::memset(¶ms, 0, sizeof(params)); params.blockDev = disk; params.startLba = 0; @@ -535,7 +535,7 @@ static void install_single_fat32(int disk) { add_log("Formatting as FAT32..."); flush_ui(); - Montauk::PartInfo parts[MAX_PARTS]; + montauk::abi::PartInfo parts[MAX_PARTS]; int part_count = montauk::partlist(parts, MAX_PARTS); int esp_index = -1; for (int p = 0; p < part_count; p++) { @@ -550,10 +550,10 @@ static void install_single_fat32(int disk) { flush_ui(); st.step = STEP_ERROR; return; } - Montauk::FsFormatParams fmt; + montauk::abi::FsFormatParams fmt; montauk::memset(&fmt, 0, sizeof(fmt)); fmt.partIndex = esp_index; - fmt.fsType = Montauk::FS_TYPE_FAT32; + fmt.fsType = montauk::abi::FS_TYPE_FAT32; r = montauk::fs_format(&fmt); if (r < 0) { diff --git a/programs/src/installer/installer.h b/programs/src/installer/installer.h index 5cca57a..acdda21 100644 --- a/programs/src/installer/installer.h +++ b/programs/src/installer/installer.h @@ -106,13 +106,13 @@ struct InstallerState { int mode; // InstallerMode // Install flow - Montauk::DiskInfo disks[MAX_DISKS]; + montauk::abi::DiskInfo disks[MAX_DISKS]; int disk_count; int selected_disk; int partition_scheme; // Update flow - Montauk::PartInfo parts[MAX_PARTS]; + montauk::abi::PartInfo parts[MAX_PARTS]; int part_count; int selected_part; diff --git a/programs/src/installer/main.cpp b/programs/src/installer/main.cpp index 4e5dc00..6d231a5 100644 --- a/programs/src/installer/main.cpp +++ b/programs/src/installer/main.cpp @@ -289,7 +289,7 @@ extern "C" void _start() { bool install_triggered = false; while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool redraw = false; int r = g_window.poll(&ev); diff --git a/programs/src/irc/main.cpp b/programs/src/irc/main.cpp index 5a168c9..844d2e0 100644 --- a/programs/src/irc/main.cpp +++ b/programs/src/irc/main.cpp @@ -917,7 +917,7 @@ extern "C" void _start() { ui_render(); // Create socket and connect - irc.fd = montauk::socket(Montauk::SOCK_TCP); + irc.fd = montauk::socket(montauk::abi::SOCK_TCP); if (irc.fd < 0) { msg_add("\033[31m*** Failed to create socket\033[0m"); ui_render(); @@ -955,7 +955,7 @@ extern "C" void _start() { // Poll keyboard if (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (!ev.pressed) { @@ -1029,7 +1029,7 @@ extern "C" void _start() { } else { if (!dirty) { montauk::wait_handle(irc.fd, - Montauk::IPC_SIGNAL_READABLE | Montauk::IPC_SIGNAL_PEER_CLOSED, + montauk::abi::IPC_SIGNAL_READABLE | montauk::abi::IPC_SIGNAL_PEER_CLOSED, 10); continue; } diff --git a/programs/src/klog/main.cpp b/programs/src/klog/main.cpp index 2322501..1fbbb9b 100644 --- a/programs/src/klog/main.cpp +++ b/programs/src/klog/main.cpp @@ -135,7 +135,7 @@ static bool klog_render() { return true; } -static void klog_handle_mouse(const Montauk::WinEvent& ev) { +static void klog_handle_mouse(const montauk::abi::WinEvent& ev) { if (ev.mouse.scroll == 0) return; g_klog.term.view_offset += (ev.mouse.scroll < 0) ? 3 : -3; @@ -193,7 +193,7 @@ extern "C" void _start() { while (true) { bool redraw = klog_poll(); - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool quit = false; int r = 0; diff --git a/programs/src/login/login.hpp b/programs/src/login/login.hpp index c219cd6..b838b81 100644 --- a/programs/src/login/login.hpp +++ b/programs/src/login/login.hpp @@ -51,7 +51,7 @@ struct LoginState { char error_msg[128]; bool show_error; - Montauk::MouseState mouse; + montauk::abi::MouseState mouse; uint8_t prev_buttons; gui::mtk::TextInputState username_input; gui::mtk::TextInputState display_name_input; @@ -144,12 +144,12 @@ void draw_login_screen(LoginState* ls); int max_fields(LoginState* ls); bool try_first_boot_submit(LoginState* ls); bool try_login(LoginState* ls); -void handle_key(LoginState* ls, const Montauk::KeyEvent& key); +void handle_key(LoginState* ls, const montauk::abi::KeyEvent& key); void handle_mouse(LoginState* ls); // Graceful shutdown view (login_shutdown.cpp). draw_shutdown_screen paints the // status card; perform_graceful_shutdown runs the staged power-off (Bluetooth // teardown, filesystem flush) and finally issues the ACPI power-off / reset, so -// it never returns. `action` is Montauk::POWER_REQ_SHUTDOWN or POWER_REQ_REBOOT. +// it never returns. `action` is montauk::abi::POWER_REQ_SHUTDOWN or POWER_REQ_REBOOT. void draw_shutdown_screen(LoginState* ls, const char* heading, const char* status); [[noreturn]] void perform_graceful_shutdown(LoginState* ls, int action); diff --git a/programs/src/login/login_input.cpp b/programs/src/login/login_input.cpp index 334c9f5..f1f6740 100644 --- a/programs/src/login/login_input.cpp +++ b/programs/src/login/login_input.cpp @@ -50,8 +50,8 @@ void launch_desktop_session(LoginState* ls) { // exiting (see desktop_request_power). Pick it up now that waitpid has // returned and run the shutdown stages; perform_graceful_shutdown never // returns. A normal logout leaves no request, so we fall through. - int req = montauk::power_request(Montauk::POWER_REQ_QUERY); - if (req == Montauk::POWER_REQ_SHUTDOWN || req == Montauk::POWER_REQ_REBOOT) { + int req = montauk::power_request(montauk::abi::POWER_REQ_QUERY); + if (req == montauk::abi::POWER_REQ_SHUTDOWN || req == montauk::abi::POWER_REQ_REBOOT) { perform_graceful_shutdown(ls, req); } @@ -152,7 +152,7 @@ bool try_login(LoginState* ls) { return true; } -void handle_key(LoginState* ls, const Montauk::KeyEvent& key) { +void handle_key(LoginState* ls, const montauk::abi::KeyEvent& key) { if (!key.pressed) return; // Tab / Shift+Tab cycles fields. @@ -220,10 +220,10 @@ void handle_mouse(LoginState* ls) { } return; } else if (lo.shutdown_button.contains(mx, my)) { - perform_graceful_shutdown(ls, Montauk::POWER_REQ_SHUTDOWN); + perform_graceful_shutdown(ls, montauk::abi::POWER_REQ_SHUTDOWN); return; } else if (lo.reboot_button.contains(mx, my)) { - perform_graceful_shutdown(ls, Montauk::POWER_REQ_REBOOT); + perform_graceful_shutdown(ls, montauk::abi::POWER_REQ_REBOOT); return; } } diff --git a/programs/src/login/login_shutdown.cpp b/programs/src/login/login_shutdown.cpp index 1332505..0fba94c 100644 --- a/programs/src/login/login_shutdown.cpp +++ b/programs/src/login/login_shutdown.cpp @@ -148,11 +148,11 @@ bool run_stage(void (*fn)(), uint64_t timeout_ms) { // that return immediately when no adapter exists (e.g. under QEMU), so this // gate is effectively free. bool bluetooth_has_active_connection() { - Montauk::BtAdapterInfo adapter; + montauk::abi::BtAdapterInfo adapter; if (montauk::bt_info(&adapter) != 0 || !adapter.initialized) { return false; // no adapter } - Montauk::BtDevInfo devs[8]; + montauk::abi::BtDevInfo devs[8]; int n = montauk::bt_list(devs, 8); for (int i = 0; i < n; i++) { if (devs[i].connected) return true; @@ -162,7 +162,7 @@ bool bluetooth_has_active_connection() { // Stage bodies -- no captured state, so they double as bare thread entries. void stage_disconnect_bluetooth() { - Montauk::BtDevInfo devs[8]; + montauk::abi::BtDevInfo devs[8]; int n = montauk::bt_list(devs, 8); for (int i = 0; i < n; i++) { if (devs[i].connected) { @@ -178,7 +178,7 @@ void stage_flush_filesystems() { } // namespace void perform_graceful_shutdown(LoginState* ls, int action) { - const bool rebooting = (action == Montauk::POWER_REQ_REBOOT); + const bool rebooting = (action == montauk::abi::POWER_REQ_REBOOT); const char* heading = rebooting ? "Restarting" : "Shutting Down"; // ==== Stage 1: disconnect connected Bluetooth devices ==== diff --git a/programs/src/login/main.cpp b/programs/src/login/main.cpp index 558147d..c9649ee 100644 --- a/programs/src/login/main.cpp +++ b/programs/src/login/main.cpp @@ -94,7 +94,7 @@ extern "C" void _start() { fast_mouse_path = mouse_changed || ls->mouse.buttons != 0; while (montauk::is_key_available()) { - Montauk::KeyEvent key; + montauk::abi::KeyEvent key; montauk::getkey(&key); handle_key(ls, key); key_changed = true; diff --git a/programs/src/man/main.cpp b/programs/src/man/main.cpp index 494bc65..d29078f 100644 --- a/programs/src/man/main.cpp +++ b/programs/src/man/main.cpp @@ -287,7 +287,7 @@ extern "C" void _start() { montauk::yield(); } - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (!ev.pressed) continue; diff --git a/programs/src/mandelbrot/main.cpp b/programs/src/mandelbrot/main.cpp index c2744dd..86982a0 100644 --- a/programs/src/mandelbrot/main.cpp +++ b/programs/src/mandelbrot/main.cpp @@ -253,7 +253,7 @@ static bool handle_mouse(MandelbrotState* mb, const MouseEvent& ev, int win_w, i return false; } -static bool handle_key(MandelbrotState* mb, const Montauk::KeyEvent& key, int win_w) { +static bool handle_key(MandelbrotState* mb, const montauk::abi::KeyEvent& key, int win_w) { if (!key.pressed) return false; if (key.ascii == 'r' || key.ascii == 'R') { @@ -303,7 +303,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/mtkfetch/main.cpp b/programs/src/mtkfetch/main.cpp index 7efa236..a82e980 100644 --- a/programs/src/mtkfetch/main.cpp +++ b/programs/src/mtkfetch/main.cpp @@ -82,7 +82,7 @@ static const int art_vw[] = { extern "C" void _start() { // ==== Gather system information ==== - Montauk::SysInfo sysinfo; + montauk::abi::SysInfo sysinfo; montauk::get_info(&sysinfo); const char* username = "user"; @@ -97,16 +97,16 @@ extern "C" void _start() { uint64_t mins = (total_secs % 3600) / 60; uint64_t secs = total_secs % 60; - Montauk::MemStats mem; + montauk::abi::MemStats mem; montauk::memstats(&mem); - Montauk::FbInfo fb; + montauk::abi::FbInfo fb; montauk::fb_info(&fb); int tcols = 0, trows = 0; montauk::termsize(&tcols, &trows); - Montauk::DevInfo devs[32]; + montauk::abi::DevInfo devs[32]; int ndev = montauk::devlist(devs, 32); const char* cpu_name = "Unknown"; const char* gpu_name = "Unknown"; @@ -122,14 +122,14 @@ extern "C" void _start() { } } - static Montauk::ProcInfo procs[PROC_SCAN_MAX]; + static montauk::abi::ProcInfo procs[PROC_SCAN_MAX]; int nproc = montauk::proclist(procs, PROC_SCAN_MAX); int active = 0; for (int i = 0; i < nproc; i++) { if (process_state_alive(procs[i].state)) active++; } - Montauk::NetCfg net; + montauk::abi::NetCfg net; montauk::get_netcfg(&net); // ==== Build info lines ==== diff --git a/programs/src/music/main.cpp b/programs/src/music/main.cpp index 4cf662f..4c8f746 100644 --- a/programs/src/music/main.cpp +++ b/programs/src/music/main.cpp @@ -1402,7 +1402,7 @@ static bool handle_click(int mx, int my) { return false; } -static bool handle_key(const Montauk::KeyEvent& key, bool& quit) { +static bool handle_key(const montauk::abi::KeyEvent& key, bool& quit) { if (!key.pressed) return false; if (key.scancode == 0x01) { // Escape @@ -1620,7 +1620,7 @@ extern "C" void _start() { } // Create window - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create("Music", g.win_w, g.win_h, &wres) < 0 || wres.id < 0) montauk::exit(1); @@ -1638,7 +1638,7 @@ extern "C" void _start() { uint64_t last_render = montauk::get_milliseconds(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool redraw = false; bool quit = false; int r; diff --git a/programs/src/network/main.cpp b/programs/src/network/main.cpp index 64d24e9..05ab419 100644 --- a/programs/src/network/main.cpp +++ b/programs/src/network/main.cpp @@ -51,8 +51,8 @@ static Tab g_tab = TAB_STATUS; static int g_mouse_x = -1; static int g_mouse_y = -1; static int g_focus_field = -1; -static Montauk::NetCfg g_cfg = {}; -static Montauk::NetStatus g_net = {}; +static montauk::abi::NetCfg g_cfg = {}; +static montauk::abi::NetStatus g_net = {}; static Field g_fields[FIELD_COUNT] = { {"IP Address", {}, {}}, {"Subnet Mask", {}, {}}, @@ -475,7 +475,7 @@ static void launch_dhcp() { } static void clear_config() { - Montauk::NetCfg cfg = g_cfg; + montauk::abi::NetCfg cfg = g_cfg; cfg.ipAddress = 0; cfg.subnetMask = 0; cfg.gateway = 0; @@ -500,7 +500,7 @@ static bool apply_config() { } } - Montauk::NetCfg cfg = g_cfg; + montauk::abi::NetCfg cfg = g_cfg; cfg.ipAddress = values[0]; cfg.subnetMask = values[1]; cfg.gateway = values[2]; @@ -623,7 +623,7 @@ static bool handle_mouse(int mx, int my, uint8_t buttons, uint8_t prev_buttons) return true; } -static bool handle_key(const Montauk::KeyEvent& key) { +static bool handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return false; if (key.scancode == 0x01) { @@ -694,7 +694,7 @@ extern "C" void _start() { render(); while (g_win.id >= 0 && !g_win.closed) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = g_win.poll(&ev); bool redraw = false; diff --git a/programs/src/nslookup/main.cpp b/programs/src/nslookup/main.cpp index 0b68489..ebaa47c 100644 --- a/programs/src/nslookup/main.cpp +++ b/programs/src/nslookup/main.cpp @@ -40,7 +40,7 @@ extern "C" void _start() { } // Show DNS server - Montauk::NetCfg cfg; + montauk::abi::NetCfg cfg; montauk::get_netcfg(&cfg); montauk::print("Server: "); diff --git a/programs/src/paint/main.cpp b/programs/src/paint/main.cpp index 40da627..6f8037c 100644 --- a/programs/src/paint/main.cpp +++ b/programs/src/paint/main.cpp @@ -275,7 +275,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/pdfviewer/main.cpp b/programs/src/pdfviewer/main.cpp index 86133d6..6b3f0c0 100644 --- a/programs/src/pdfviewer/main.cpp +++ b/programs/src/pdfviewer/main.cpp @@ -193,7 +193,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/printers/main.cpp b/programs/src/printers/main.cpp index c8130db..dd97ca6 100644 --- a/programs/src/printers/main.cpp +++ b/programs/src/printers/main.cpp @@ -524,7 +524,7 @@ static void open_config_popup() { g_app.config_mouse_y = -1; if (!g_config.open) { - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create("Configure Printer", CONFIG_W, CONFIG_H, &wres) < 0 || wres.id < 0) { set_status("Failed to open printer dialog"); return; @@ -671,7 +671,7 @@ static bool handle_config_mouse(int mx, int my, uint8_t buttons, uint8_t prev_bu return false; } -static bool handle_config_key(const Montauk::KeyEvent& key) { +static bool handle_config_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return false; if (key.scancode == 0x01) { @@ -1101,7 +1101,7 @@ static bool hover_changed(const Rect& rect, bool enabled, return rect.contains(prev_x, prev_y) != rect.contains(next_x, next_y); } -static bool handle_mouse(const Montauk::WinEvent& ev) { +static bool handle_mouse(const montauk::abi::WinEvent& ev) { if (g_app.config_open) return false; @@ -1145,7 +1145,7 @@ static void cycle_tab(int delta) { g_app.active_tab = next; } -static void handle_key(const Montauk::KeyEvent& key) { +static void handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return; if (g_app.config_open) { @@ -1211,7 +1211,7 @@ extern "C" void _start() { render(); while (g_win.id >= 0 && !g_win.closed) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool redraw_config = false; bool redraw_main = false; diff --git a/programs/src/procmgr/main.cpp b/programs/src/procmgr/main.cpp index a1790b0..16d9a99 100644 --- a/programs/src/procmgr/main.cpp +++ b/programs/src/procmgr/main.cpp @@ -54,10 +54,10 @@ struct ProcCpuSnapshot { }; struct ProcMgrState { - Montauk::ProcInfo procs[PM_MAX_PROCS]; - Montauk::WinInfo windows[PM_MAX_WINDOWS]; - Montauk::MemStats mem; - Montauk::SysInfo sys_info; + montauk::abi::ProcInfo procs[PM_MAX_PROCS]; + montauk::abi::WinInfo windows[PM_MAX_WINDOWS]; + montauk::abi::MemStats mem; + montauk::abi::SysInfo sys_info; int proc_count; int win_count; int selected; @@ -130,7 +130,7 @@ static int parse_positive_int_after_comma(const char* text) { } static int detect_cpu_count() { - Montauk::DevInfo devs[16]; + montauk::abi::DevInfo devs[16]; int count = montauk::devlist(devs, 16); if (count < 0) count = 0; @@ -779,7 +779,7 @@ static bool handle_window_click(int mx, int my) { return true; } -static bool handle_mouse(const Montauk::WinEvent& ev) { +static bool handle_mouse(const montauk::abi::WinEvent& ev) { bool refresh_hover_before = mouse_in_rect(refresh_button_rect()); bool kill_hover_before = mouse_in_rect(kill_button_rect()); @@ -824,7 +824,7 @@ static bool handle_mouse(const Montauk::WinEvent& ev) { return redraw; } -static bool handle_key(const Montauk::KeyEvent& key) { +static bool handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed) return false; @@ -906,7 +906,7 @@ extern "C" void _start() { while (!g_win.closed) { bool redraw = refresh_state(false); - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = g_win.poll(&ev); if (r < 0) break; diff --git a/programs/src/rpgdemo/main.cpp b/programs/src/rpgdemo/main.cpp index c244042..86765a6 100644 --- a/programs/src/rpgdemo/main.cpp +++ b/programs/src/rpgdemo/main.cpp @@ -1053,7 +1053,7 @@ extern "C" void _start() { g_input.begin_frame(); // Process all pending events - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; while (g_engine.poll(&ev)) { g_input.handle_event(ev); diff --git a/programs/src/screenshot/main.cpp b/programs/src/screenshot/main.cpp index 7edad3d..f55a7e0 100644 --- a/programs/src/screenshot/main.cpp +++ b/programs/src/screenshot/main.cpp @@ -226,7 +226,7 @@ static bool run_picker(CaptureMode* out_mode) { bool accepted = false; while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; @@ -300,7 +300,7 @@ static bool capture_screen(ScreenBuffer* out, char* err, int err_len) { out->height = 0; out->pitch = 0; - Montauk::FbInfo fb; + montauk::abi::FbInfo fb; montauk::fb_info(&fb); int width = (int)fb.width; @@ -559,7 +559,7 @@ enum AreaEventResult : uint8_t { static AreaEventResult handle_area_selector_event(WsWindow& win, const ScreenBuffer& screen, AreaSelectorState& st, - const Montauk::WinEvent& ev, + const montauk::abi::WinEvent& ev, bool* redraw) { if (!redraw) return AREA_EVENT_CONTINUE; @@ -660,7 +660,7 @@ static bool run_area_selector(const ScreenBuffer& screen, Rect* out_area) { return false; } if (st.fullscreen) - win.set_flags(Montauk::WIN_FLAG_FULLSCREEN); + win.set_flags(montauk::abi::WIN_FLAG_FULLSCREEN); mtk::StandaloneHost host(&win); Canvas canvas = host.canvas(); @@ -669,7 +669,7 @@ static bool run_area_selector(const ScreenBuffer& screen, Rect* out_area) { bool accepted = false; while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; @@ -803,7 +803,7 @@ static void build_default_save_dir(char* out, int out_len) { } static void build_suggested_name(char* out, int out_len) { - Montauk::DateTime dt; + montauk::abi::DateTime dt; montauk::gettime(&dt); snprintf(out, out_len, "screenshot_%04d%02d%02d_%02d%02d%02d.jpg", diff --git a/programs/src/shell/main.cpp b/programs/src/shell/main.cpp index f733c6e..efa7b49 100644 --- a/programs/src/shell/main.cpp +++ b/programs/src/shell/main.cpp @@ -352,12 +352,12 @@ static constexpr uint8_t SC_DOWN = 0x50; static constexpr uint8_t SC_LEFT = 0x4B; static constexpr uint8_t SC_RIGHT = 0x4D; -static bool empty_key_event(const Montauk::KeyEvent& ev) { +static bool empty_key_event(const montauk::abi::KeyEvent& ev) { return ev.scancode == 0 && ev.ascii == 0 && !ev.pressed && !ev.shift && !ev.ctrl && !ev.alt; } -static void wait_key_event(Montauk::KeyEvent* out) { +static void wait_key_event(montauk::abi::KeyEvent* out) { if (!out) return; for (;;) { @@ -399,7 +399,7 @@ extern "C" void _start() { prompt(); while (true) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; wait_key_event(&ev); if (!ev.pressed) continue; diff --git a/programs/src/spreadsheet/main.cpp b/programs/src/spreadsheet/main.cpp index 11ec307..099eeb6 100644 --- a/programs/src/spreadsheet/main.cpp +++ b/programs/src/spreadsheet/main.cpp @@ -370,7 +370,7 @@ extern "C" void _start() { win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/tcpconnect/main.cpp b/programs/src/tcpconnect/main.cpp index 387ed8d..5b6ad53 100644 --- a/programs/src/tcpconnect/main.cpp +++ b/programs/src/tcpconnect/main.cpp @@ -120,7 +120,7 @@ extern "C" void _start() { } // Create socket - int fd = montauk::socket(Montauk::SOCK_TCP); + int fd = montauk::socket(montauk::abi::SOCK_TCP); if (fd < 0) { montauk::print("Error: failed to create socket\n"); montauk::exit(1); @@ -159,7 +159,7 @@ extern "C" void _start() { // Poll keyboard if (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (!ev.pressed) continue; @@ -187,7 +187,7 @@ extern "C" void _start() { montauk::putchar(ev.ascii); } } else { - montauk::wait_handle(fd, Montauk::IPC_SIGNAL_READABLE | Montauk::IPC_SIGNAL_PEER_CLOSED, 10); + montauk::wait_handle(fd, montauk::abi::IPC_SIGNAL_READABLE | montauk::abi::IPC_SIGNAL_PEER_CLOSED, 10); } } diff --git a/programs/src/terminal/main.cpp b/programs/src/terminal/main.cpp index b1ca8f3..9df3eb6 100644 --- a/programs/src/terminal/main.cpp +++ b/programs/src/terminal/main.cpp @@ -45,11 +45,11 @@ static bool g_should_exit = false; static bool g_force_redraw = true; static int g_last_win_w = 0; static int g_last_win_h = 0; -static Montauk::ProcInfo g_kill_procs[256]; +static montauk::abi::ProcInfo g_kill_procs[256]; static int g_kill_pids[256]; static int g_kill_pid_count = 0; -static bool left_pressed(const Montauk::WinEvent& ev) { +static bool left_pressed(const montauk::abi::WinEvent& ev) { return (ev.mouse.buttons & 1) && !(ev.mouse.prev_buttons & 1); } @@ -278,7 +278,7 @@ static bool term_render() { return true; } -static void term_handle_mouse(const Montauk::WinEvent& ev) { +static void term_handle_mouse(const montauk::abi::WinEvent& ev) { if (g_tabs.tab_count <= 0) return; TerminalState* ts = g_tabs.tabs[g_tabs.active_tab]; @@ -319,7 +319,7 @@ static void term_handle_mouse(const Montauk::WinEvent& ev) { } } -static void term_handle_key(const Montauk::KeyEvent& key) { +static void term_handle_key(const montauk::abi::KeyEvent& key) { if (g_tabs.tab_count <= 0) return; if (key.ctrl && key.pressed && key.scancode == 0x14) { @@ -423,7 +423,7 @@ extern "C" void _start() { while (!g_should_exit) { bool redraw = false; - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; bool quit = false; int r = 0; diff --git a/programs/src/texteditor/main.cpp b/programs/src/texteditor/main.cpp index fadd06c..1f95f9b 100644 --- a/programs/src/texteditor/main.cpp +++ b/programs/src/texteditor/main.cpp @@ -1033,7 +1033,7 @@ static void open_pathbar_save() { // Keyboard handler // ============================================================================ -static bool handle_key(Montauk::KeyEvent& key, int win_id) { +static bool handle_key(montauk::abi::KeyEvent& key, int win_id) { if (!key.pressed) return false; if (g_ctx_menu.open) { @@ -1227,7 +1227,7 @@ static bool handle_key(Montauk::KeyEvent& key, int win_id) { // Mouse handler // ============================================================================ -static bool handle_mouse(Montauk::WinEvent& ev, int win_id) { +static bool handle_mouse(montauk::abi::WinEvent& ev, int win_id) { int mx = ev.mouse.x; int my = ev.mouse.y; uint8_t btns = ev.mouse.buttons; @@ -1458,7 +1458,7 @@ extern "C" void _start() { } // Create window - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create(title, INIT_W, INIT_H, &wres) < 0 || wres.id < 0) montauk::exit(1); @@ -1469,7 +1469,7 @@ extern "C" void _start() { montauk::win_present(win_id); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = montauk::win_poll(win_id, &ev); if (r < 0) break; diff --git a/programs/src/timezone/main.cpp b/programs/src/timezone/main.cpp index 0b71ac4..135b370 100644 --- a/programs/src/timezone/main.cpp +++ b/programs/src/timezone/main.cpp @@ -692,7 +692,7 @@ static void render() { host.present(); } -static bool handle_mouse(const Montauk::WinEvent& ev) { +static bool handle_mouse(const montauk::abi::WinEvent& ev) { int prev_x = g_mouse_x; int prev_y = g_mouse_y; g_mouse_x = ev.mouse.x; @@ -803,7 +803,7 @@ static bool handle_mouse(const Montauk::WinEvent& ev) { return redraw; } -static bool handle_key(const Montauk::KeyEvent& key) { +static bool handle_key(const montauk::abi::KeyEvent& key) { if (!key.pressed || g_country_count <= 0) return false; if (key.ascii == '\n' || key.ascii == '\r') { @@ -858,7 +858,7 @@ extern "C" void _start() { render(); while (g_win.id >= 0 && !g_win.closed) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = g_win.poll(&ev); bool redraw = false; diff --git a/programs/src/video/main.cpp b/programs/src/video/main.cpp index df3f87f..c28ad73 100644 --- a/programs/src/video/main.cpp +++ b/programs/src/video/main.cpp @@ -1205,7 +1205,7 @@ static bool handle_click(int mx, int my) { return false; } -static bool handle_key(const Montauk::KeyEvent& key, bool& quit) { +static bool handle_key(const montauk::abi::KeyEvent& key, bool& quit) { if (!key.pressed) return false; if (key.scancode == 0x01) { @@ -1357,7 +1357,7 @@ extern "C" void _start() { uint64_t last_draw = montauk::get_milliseconds(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/weather/main.cpp b/programs/src/weather/main.cpp index 9957754..a89a1c8 100644 --- a/programs/src/weather/main.cpp +++ b/programs/src/weather/main.cpp @@ -432,7 +432,7 @@ extern "C" void _start() { // Event loop while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/wiki/main.cpp b/programs/src/wiki/main.cpp index 9e681b6..f379448 100644 --- a/programs/src/wiki/main.cpp +++ b/programs/src/wiki/main.cpp @@ -73,7 +73,7 @@ static void sb_cursor_to(int row, int col) { static bool check_keyboard_abort() { if (montauk::is_key_available()) { - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (ev.pressed && ev.ctrl && ev.ascii == 'q') return true; } @@ -468,7 +468,7 @@ static void run_pager(WikiLine* lines, int totalLines, const char* title, while (running) { while (!montauk::is_key_available()) montauk::yield(); - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (!ev.pressed) continue; @@ -631,7 +631,7 @@ static int run_search(char titles[][256], int count, const char* query, while (true) { while (!montauk::is_key_available()) montauk::yield(); - Montauk::KeyEvent ev; + montauk::abi::KeyEvent ev; montauk::getkey(&ev); if (!ev.pressed) continue; @@ -838,7 +838,7 @@ extern "C" void _start() { sb_puts("\033[2K\033[1;31mFetch failed. Press any key.\033[0m"); sb_flush(); while (!montauk::is_key_available()) montauk::yield(); - Montauk::KeyEvent ev; montauk::getkey(&ev); + montauk::abi::KeyEvent ev; montauk::getkey(&ev); continue; } respBuf[respLen] = '\0'; @@ -856,7 +856,7 @@ extern "C" void _start() { sb_puts("\033[2K\033[1;31mArticle not found. Press any key.\033[0m"); sb_flush(); while (!montauk::is_key_available()) montauk::yield(); - Montauk::KeyEvent ev; montauk::getkey(&ev); + montauk::abi::KeyEvent ev; montauk::getkey(&ev); continue; } diff --git a/programs/src/wikipedia/main.cpp b/programs/src/wikipedia/main.cpp index b0bff94..aed3515 100644 --- a/programs/src/wikipedia/main.cpp +++ b/programs/src/wikipedia/main.cpp @@ -39,7 +39,7 @@ static bool init_buffers_and_fonts() { return true; } -static void handle_key_event(const Montauk::WinEvent& ev, bool& search_pending) { +static void handle_key_event(const montauk::abi::WinEvent& ev, bool& search_pending) { uint8_t ascii = ev.key.ascii; uint8_t scan = ev.key.scancode; @@ -65,7 +65,7 @@ static void handle_key_event(const Montauk::WinEvent& ev, bool& search_pending) else if (scan == 0x4F) { g_scroll_y = max_sc; } } -static void handle_mouse_event(const Montauk::WinEvent& ev, bool& search_pending) { +static void handle_mouse_event(const montauk::abi::WinEvent& ev, bool& search_pending) { int mx = ev.mouse.x, my = ev.mouse.y; g_mouse_x = mx; g_mouse_y = my; @@ -169,7 +169,7 @@ extern "C" void _start() { continue; } - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = win.poll(&ev); if (r < 0) break; diff --git a/programs/src/wikipedia/network.cpp b/programs/src/wikipedia/network.cpp index b73ba33..71d814b 100644 --- a/programs/src/wikipedia/network.cpp +++ b/programs/src/wikipedia/network.cpp @@ -41,7 +41,7 @@ bool ensure_wiki_tls_ready(char* err, int err_len) { } bool welcome_feed_path(char* path, int path_len) { - Montauk::DateTime dt {}; + montauk::abi::DateTime dt {}; montauk::gettime(&dt); if (dt.Year < 2001 || dt.Month < 1 || dt.Month > 12 || diff --git a/programs/src/wordprocessor/input.cpp b/programs/src/wordprocessor/input.cpp index 807b290..28306e4 100644 --- a/programs/src/wordprocessor/input.cpp +++ b/programs/src/wordprocessor/input.cpp @@ -282,7 +282,7 @@ static int wp_hit_test_text(WordProcessorState* wp, int local_x, int local_y, in return best_abs; } -void wp_handle_mouse(const Montauk::WinEvent& ev) { +void wp_handle_mouse(const montauk::abi::WinEvent& ev) { WordProcessorState* wp = &g_wp; int local_x = ev.mouse.x; int local_y = ev.mouse.y; @@ -592,7 +592,7 @@ void wp_handle_mouse(const Montauk::WinEvent& ev) { } } -void wp_handle_key(const Montauk::KeyEvent& key) { +void wp_handle_key(const montauk::abi::KeyEvent& key) { WordProcessorState* wp = &g_wp; if (!key.pressed) return; diff --git a/programs/src/wordprocessor/main.cpp b/programs/src/wordprocessor/main.cpp index 75134da..6873eb1 100644 --- a/programs/src/wordprocessor/main.cpp +++ b/programs/src/wordprocessor/main.cpp @@ -110,7 +110,7 @@ extern "C" void _start() { g_win.present(); while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = g_win.poll(&ev); if (r < 0) break; diff --git a/programs/src/wordprocessor/wordprocessor.hpp b/programs/src/wordprocessor/wordprocessor.hpp index 2ac8cf3..29fb8f8 100644 --- a/programs/src/wordprocessor/wordprocessor.hpp +++ b/programs/src/wordprocessor/wordprocessor.hpp @@ -497,5 +497,5 @@ void wp_build_context_items(WordProcessorState* wp, mtk::ContextMenuItem items[WP_CTX_COUNT]); void wp_render(); -void wp_handle_mouse(const Montauk::WinEvent& ev); -void wp_handle_key(const Montauk::KeyEvent& key); +void wp_handle_mouse(const montauk::abi::WinEvent& ev); +void wp_handle_key(const montauk::abi::KeyEvent& key); diff --git a/template/docs/gui-apps.md b/template/docs/gui-apps.md index d7f7081..0947d16 100644 --- a/template/docs/gui-apps.md +++ b/template/docs/gui-apps.md @@ -71,7 +71,7 @@ extern "C" void _start() { // Create window g_win_w = 400; g_win_h = 300; - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; montauk::win_create("My App", g_win_w, g_win_h, &wres); int win_id = wres.id; uint32_t* pixels = (uint32_t*)(uintptr_t)wres.pixelVa; @@ -82,7 +82,7 @@ extern "C" void _start() { // Event loop while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = montauk::win_poll(win_id, &ev); if (r < 0) break; // Window destroyed externally @@ -230,7 +230,7 @@ static void myapp_on_mouse(Window* win, MouseEvent& ev) { } } -static void myapp_on_key(Window* win, const Montauk::KeyEvent& key) { +static void myapp_on_key(Window* win, const montauk::abi::KeyEvent& key) { if (!key.pressed) return; MyAppState* state = (MyAppState*)win->app_data; // Handle keystrokes... @@ -418,7 +418,7 @@ int w = text_width("Hello"); ```cpp // In standalone apps (via win_poll) if (ev.type == 0) { - Montauk::KeyEvent& key = ev.key; + montauk::abi::KeyEvent& key = ev.key; if (!key.pressed) { /* key release */ } if (key.ascii >= 0x20 && key.ascii < 0x7F) { @@ -826,7 +826,7 @@ See `syscalls.md` for the full `tls::` API reference. For non-TLS networking without the HTTP wrapper, use the raw socket syscalls directly (see `syscalls.md`): ```cpp -int sock = montauk::socket(Montauk::SOCK_TCP); // or SOCK_UDP +int sock = montauk::socket(montauk::abi::SOCK_TCP); // or SOCK_UDP montauk::connect(sock, ip, port); montauk::send(sock, data, len); int n = montauk::recv(sock, buf, maxLen); diff --git a/template/docs/syscalls.md b/template/docs/syscalls.md index 3cc7141..a0badca 100644 --- a/template/docs/syscalls.md +++ b/template/docs/syscalls.md @@ -129,7 +129,7 @@ These write to the kernel's text-mode console, not to a GUI window. ```cpp bool is_key_available(); // Poll for pending keystroke -void getkey(Montauk::KeyEvent* out); // Get next keystroke (blocks) +void getkey(montauk::abi::KeyEvent* out); // Get next keystroke (blocks) char getchar(); // Get single ASCII character (blocks) ``` @@ -165,7 +165,7 @@ struct KeyEvent { ### Mouse (Direct, Non-Windowed) ```cpp -void mouse_state(Montauk::MouseState* out); // Get current mouse state +void mouse_state(montauk::abi::MouseState* out); // Get current mouse state void set_mouse_bounds(int32_t maxX, int32_t maxY); // Set mouse boundary ``` @@ -224,7 +224,7 @@ struct WinEvent { ```cpp while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = montauk::win_poll(win_id, &ev); if (r < 0) break; // Window closed if (r == 0) { @@ -434,7 +434,7 @@ int bt_info(BtAdapterInfo* buf); // Adapter i ```cpp uint64_t get_ticks(); // CPU tick counter uint64_t get_milliseconds(); // Milliseconds since boot -void gettime(Montauk::DateTime* out); // Wall-clock time +void gettime(montauk::abi::DateTime* out); // Wall-clock time ``` **`DateTime` struct:** @@ -496,7 +496,7 @@ For launching child processes with redirected I/O (used by the terminal emulator int spawn_redir(const char* path, const char* args); // Spawn with I/O pipes int childio_read(int childPid, char* buf, int maxLen); // Read child stdout int childio_write(int childPid, const char* data, int len); // Write to child stdin -int childio_writekey(int childPid, const Montauk::KeyEvent* key); // Send keystroke to child +int childio_writekey(int childPid, const montauk::abi::KeyEvent* key); // Send keystroke to child int childio_settermsz(int childPid, int cols, int rows); // Set child terminal size ``` diff --git a/template/src/main.cpp b/template/src/main.cpp index d99daa0..90cbf60 100644 --- a/template/src/main.cpp +++ b/template/src/main.cpp @@ -125,7 +125,7 @@ static int app_main() { g_font = nullptr; // Create window - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; montauk::win_create("My App", g_win_w, g_win_h, &wres); int win_id = wres.id; uint32_t* pixels = (uint32_t*)(uintptr_t)wres.pixelVa; @@ -136,7 +136,7 @@ static int app_main() { // Event loop while (true) { - Montauk::WinEvent ev; + montauk::abi::WinEvent ev; int r = montauk::win_poll(win_id, &ev); if (r < 0) break; diff --git a/template/sysroot/include/Api/Syscall.hpp b/template/sysroot/include/Api/Syscall.hpp index aa16747..e784a29 100644 --- a/template/sysroot/include/Api/Syscall.hpp +++ b/template/sysroot/include/Api/Syscall.hpp @@ -8,7 +8,7 @@ #include #include -namespace Montauk { +namespace montauk::abi { // Syscall numbers static constexpr uint64_t SYS_EXIT = 0; diff --git a/template/sysroot/include/gui/clipboard.hpp b/template/sysroot/include/gui/clipboard.hpp index c5ab6e2..614eaba 100644 --- a/template/sysroot/include/gui/clipboard.hpp +++ b/template/sysroot/include/gui/clipboard.hpp @@ -22,13 +22,13 @@ namespace gui { return clipboard_set_text(text, text ? montauk::slen(text) : 0); } - inline bool clipboard_get_info(Montauk::ClipboardInfo* out) { + inline bool clipboard_get_info(montauk::abi::ClipboardInfo* out) { if (out == nullptr) return false; return montauk::clipboard_get_info(out) == 0; } inline bool clipboard_has_text() { - Montauk::ClipboardInfo info = {}; + montauk::abi::ClipboardInfo info = {}; return clipboard_get_info(&info) && info.textBytes > 0; } @@ -36,7 +36,7 @@ namespace gui { if (out_len) *out_len = 0; if (out_serial) *out_serial = 0; - Montauk::ClipboardInfo info = {}; + montauk::abi::ClipboardInfo info = {}; if (!clipboard_get_info(&info) || info.textBytes == 0) return nullptr; diff --git a/template/sysroot/include/gui/desktop.hpp b/template/sysroot/include/gui/desktop.hpp index 7bf6073..05dbe41 100644 --- a/template/sysroot/include/gui/desktop.hpp +++ b/template/sysroot/include/gui/desktop.hpp @@ -88,7 +88,7 @@ struct DesktopState { char user_config_dir[128]; // "0:/users//config" bool is_admin; - Montauk::MouseState mouse; + montauk::abi::MouseState mouse; uint8_t prev_buttons; bool app_menu_open; @@ -160,7 +160,7 @@ struct DesktopState { int ctx_menu_x, ctx_menu_y; bool net_popup_open; - Montauk::NetCfg cached_net_cfg; + montauk::abi::NetCfg cached_net_cfg; uint64_t net_cfg_last_poll; Rect net_icon_rect; @@ -175,7 +175,7 @@ struct DesktopState { // Temperature monitoring static constexpr int MAX_THERMAL_ZONES = 8; - Montauk::ThermalInfo thermal_zones[MAX_THERMAL_ZONES]; + montauk::abi::ThermalInfo thermal_zones[MAX_THERMAL_ZONES]; int thermal_zone_count; uint64_t thermal_last_poll; Rect temp_icon_rect; @@ -214,6 +214,6 @@ void desktop_raise_window(DesktopState* ds, int idx); void desktop_draw_panel(DesktopState* ds); void desktop_draw_window(DesktopState* ds, int idx); void desktop_handle_mouse(DesktopState* ds); -void desktop_handle_keyboard(DesktopState* ds, const Montauk::KeyEvent& key); +void desktop_handle_keyboard(DesktopState* ds, const montauk::abi::KeyEvent& key); } // namespace gui diff --git a/template/sysroot/include/gui/framebuffer.hpp b/template/sysroot/include/gui/framebuffer.hpp index 65bfb2b..303d657 100644 --- a/template/sysroot/include/gui/framebuffer.hpp +++ b/template/sysroot/include/gui/framebuffer.hpp @@ -61,7 +61,7 @@ class Framebuffer { public: Framebuffer() : hw_fb(nullptr), back_buf(nullptr), fb_width(0), fb_height(0), fb_pitch(0) { - Montauk::FbInfo info; + montauk::abi::FbInfo info; montauk::fb_info(&info); fb_width = (int)info.width; diff --git a/template/sysroot/include/gui/mtk/widgets.hpp b/template/sysroot/include/gui/mtk/widgets.hpp index 03328db..e4171aa 100644 --- a/template/sysroot/include/gui/mtk/widgets.hpp +++ b/template/sysroot/include/gui/mtk/widgets.hpp @@ -552,7 +552,7 @@ inline int text_input_handle_mouse(TextInputState& state, inline int text_input_key(TextInputState& state, char* text, int cap, - const Montauk::KeyEvent& key, + const montauk::abi::KeyEvent& key, TextInputCharFilter filter = nullptr, void* userdata = nullptr, bool masked = false) { diff --git a/template/sysroot/include/gui/standalone.hpp b/template/sysroot/include/gui/standalone.hpp index 2a2fcd4..d5d31ac 100644 --- a/template/sysroot/include/gui/standalone.hpp +++ b/template/sysroot/include/gui/standalone.hpp @@ -24,7 +24,7 @@ struct WsWindow { : id(-1), pixels(nullptr), width(0), height(0), scale_factor(1), closed(false) {} bool create(const char* title, int w, int h) { - Montauk::WinCreateResult wres; + montauk::abi::WinCreateResult wres; if (montauk::win_create(title, w, h, &wres) < 0 || wres.id < 0) return false; @@ -37,7 +37,7 @@ struct WsWindow { return true; } - int poll(Montauk::WinEvent* ev) { + int poll(montauk::abi::WinEvent* ev) { if (id < 0 || closed) return -1; int r = montauk::win_poll(id, ev); diff --git a/template/sysroot/include/gui/terminal.hpp b/template/sysroot/include/gui/terminal.hpp index 2b33442..bd935fe 100644 --- a/template/sysroot/include/gui/terminal.hpp +++ b/template/sysroot/include/gui/terminal.hpp @@ -831,7 +831,7 @@ static inline void terminal_resize(TerminalState* t, int new_cols, int new_rows) } } -static inline void terminal_handle_key(TerminalState* t, const Montauk::KeyEvent& key) { +static inline void terminal_handle_key(TerminalState* t, const montauk::abi::KeyEvent& key) { // Snap to live on any keyboard input if (t->view_offset > 0) { t->view_offset = 0; diff --git a/template/sysroot/include/gui/widgets.hpp b/template/sysroot/include/gui/widgets.hpp index 56315c1..076846f 100644 --- a/template/sysroot/include/gui/widgets.hpp +++ b/template/sysroot/include/gui/widgets.hpp @@ -227,7 +227,7 @@ struct TextBox { } } - void handle_key(const Montauk::KeyEvent& key) { + void handle_key(const montauk::abi::KeyEvent& key) { if (!focused || !key.pressed) return; if (key.ascii == '\b' || key.scancode == 0x0E) { diff --git a/template/sysroot/include/gui/window.hpp b/template/sysroot/include/gui/window.hpp index fa16561..6baed69 100644 --- a/template/sysroot/include/gui/window.hpp +++ b/template/sysroot/include/gui/window.hpp @@ -32,7 +32,7 @@ static constexpr int MIN_WINDOW_H = 80; struct Window; using WindowDrawCallback = void (*)(Window* win, Framebuffer& fb); using WindowMouseCallback = void (*)(Window* win, MouseEvent& ev); -using WindowKeyCallback = void (*)(Window* win, const Montauk::KeyEvent& key); +using WindowKeyCallback = void (*)(Window* win, const montauk::abi::KeyEvent& key); using WindowCloseCallback = void (*)(Window* win); using WindowPollCallback = void (*)(Window* win); diff --git a/template/sysroot/include/http/http.hpp b/template/sysroot/include/http/http.hpp index e8f87ec..e84c358 100644 --- a/template/sysroot/include/http/http.hpp +++ b/template/sysroot/include/http/http.hpp @@ -350,7 +350,7 @@ inline Response get_plain(const char* host, const char* path, int reqLen = build_request(req, sizeof(req), "GET", host, path, nullptr, nullptr, 0, extra_headers); - int sock = montauk::socket(Montauk::SOCK_TCP); + int sock = montauk::socket(montauk::abi::SOCK_TCP); if (sock < 0) return resp; if (montauk::connect(sock, ip, 80) < 0) { montauk::closesocket(sock); return resp; } diff --git a/template/sysroot/include/montauk/heap.h b/template/sysroot/include/montauk/heap.h index 87ca143..8d306d7 100644 --- a/template/sysroot/include/montauk/heap.h +++ b/template/sysroot/include/montauk/heap.h @@ -46,7 +46,7 @@ namespace heap_detail { static inline void heap_lock_acquire() { while (__atomic_exchange_n(&g_heap_lock, 1, __ATOMIC_ACQUIRE) != 0) { - syscall0(Montauk::SYS_YIELD); + syscall0(montauk::abi::SYS_YIELD); } } static inline void heap_lock_release() { diff --git a/template/sysroot/include/montauk/syscall.h b/template/sysroot/include/montauk/syscall.h index 96b2cb2..1cd6155 100644 --- a/template/sysroot/include/montauk/syscall.h +++ b/template/sysroot/include/montauk/syscall.h @@ -110,505 +110,505 @@ namespace montauk { // Process [[noreturn]] inline void exit(int code = 0) { - syscall1(Montauk::SYS_EXIT, (uint64_t)code); + syscall1(montauk::abi::SYS_EXIT, (uint64_t)code); __builtin_unreachable(); } - inline void yield() { syscall0(Montauk::SYS_YIELD); } - inline void sleep_ms(uint64_t ms) { syscall1(Montauk::SYS_SLEEP_MS, ms); } - inline int getpid() { return (int)syscall0(Montauk::SYS_GETPID); } + inline void yield() { syscall0(montauk::abi::SYS_YIELD); } + inline void sleep_ms(uint64_t ms) { syscall1(montauk::abi::SYS_SLEEP_MS, ms); } + inline int getpid() { return (int)syscall0(montauk::abi::SYS_GETPID); } inline int spawn(const char* path, const char* args = nullptr) { - return (int)syscall2(Montauk::SYS_SPAWN, (uint64_t)path, (uint64_t)args); + return (int)syscall2(montauk::abi::SYS_SPAWN, (uint64_t)path, (uint64_t)args); } inline int chdir(const char* path) { - return (int)syscall1(Montauk::SYS_CHDIR, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_CHDIR, (uint64_t)path); } inline int getcwd(char* buf, uint64_t maxLen) { - return (int)syscall2(Montauk::SYS_GETCWD, (uint64_t)buf, maxLen); + return (int)syscall2(montauk::abi::SYS_GETCWD, (uint64_t)buf, maxLen); } // Console - inline void print(const char* text) { syscall1(Montauk::SYS_PRINT, (uint64_t)text); } - inline void putchar(char c) { syscall1(Montauk::SYS_PUTCHAR, (uint64_t)c); } + inline void print(const char* text) { syscall1(montauk::abi::SYS_PRINT, (uint64_t)text); } + inline void putchar(char c) { syscall1(montauk::abi::SYS_PUTCHAR, (uint64_t)c); } // File I/O - inline int open(const char* path) { return (int)syscall1(Montauk::SYS_OPEN, (uint64_t)path); } + inline int open(const char* path) { return (int)syscall1(montauk::abi::SYS_OPEN, (uint64_t)path); } inline int read(int handle, uint8_t* buf, uint64_t off, uint64_t size) { - return (int)syscall4(Montauk::SYS_READ, (uint64_t)handle, (uint64_t)buf, off, size); + return (int)syscall4(montauk::abi::SYS_READ, (uint64_t)handle, (uint64_t)buf, off, size); } - inline uint64_t getsize(int handle) { return (uint64_t)syscall1(Montauk::SYS_GETSIZE, (uint64_t)handle); } - inline void close(int handle) { syscall1(Montauk::SYS_CLOSE, (uint64_t)handle); } + inline uint64_t getsize(int handle) { return (uint64_t)syscall1(montauk::abi::SYS_GETSIZE, (uint64_t)handle); } + inline void close(int handle) { syscall1(montauk::abi::SYS_CLOSE, (uint64_t)handle); } inline int readdir(const char* path, const char** names, int max) { - return (int)syscall3(Montauk::SYS_READDIR, (uint64_t)path, (uint64_t)names, (uint64_t)max); + return (int)syscall3(montauk::abi::SYS_READDIR, (uint64_t)path, (uint64_t)names, (uint64_t)max); } // Paginated directory read: returns entries [startIndex, startIndex+max). // Call repeatedly with increasing startIndex (advancing by the returned // count) until it returns 0 to enumerate directories of any size. inline int readdir_at(const char* path, const char** names, int max, int startIndex) { - return (int)syscall4(Montauk::SYS_READDIR_AT, (uint64_t)path, (uint64_t)names, + return (int)syscall4(montauk::abi::SYS_READDIR_AT, (uint64_t)path, (uint64_t)names, (uint64_t)max, (uint64_t)startIndex); } // File write/create inline int fwrite(int handle, const uint8_t* buf, uint64_t off, uint64_t size) { - return (int)syscall4(Montauk::SYS_FWRITE, (uint64_t)handle, (uint64_t)buf, off, size); + return (int)syscall4(montauk::abi::SYS_FWRITE, (uint64_t)handle, (uint64_t)buf, off, size); } inline int fcreate(const char* path) { - return (int)syscall1(Montauk::SYS_FCREATE, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_FCREATE, (uint64_t)path); } inline int fdelete(const char* path) { - return (int)syscall1(Montauk::SYS_FDELETE, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_FDELETE, (uint64_t)path); } inline int fmkdir(const char* path) { - return (int)syscall1(Montauk::SYS_FMKDIR, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_FMKDIR, (uint64_t)path); } inline int frename(const char* oldPath, const char* newPath) { - return (int)syscall2(Montauk::SYS_FRENAME, (uint64_t)oldPath, (uint64_t)newPath); + return (int)syscall2(montauk::abi::SYS_FRENAME, (uint64_t)oldPath, (uint64_t)newPath); } inline int drivelist(int* outDrives, int max) { - return (int)syscall2(Montauk::SYS_DRIVELIST, (uint64_t)outDrives, (uint64_t)max); + return (int)syscall2(montauk::abi::SYS_DRIVELIST, (uint64_t)outDrives, (uint64_t)max); } inline int drivelabel(int drive, char* outLabel, int maxLen) { - return (int)syscall3(Montauk::SYS_DRIVELABEL, (uint64_t)drive, (uint64_t)outLabel, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_DRIVELABEL, (uint64_t)drive, (uint64_t)outLabel, (uint64_t)maxLen); } // Returns the kernel BlockDeviceKind backing the drive: 0=unknown/ramdisk, // 1=SATA, 2=SATAPI, 3=NVMe, 4=USB MSC. inline int drivekind(int drive) { - return (int)syscall1(Montauk::SYS_DRIVEKIND, (uint64_t)drive); + return (int)syscall1(montauk::abi::SYS_DRIVEKIND, (uint64_t)drive); } // Memory - inline void* alloc(uint64_t size) { return (void*)syscall1(Montauk::SYS_ALLOC, size); } - inline void free(void* ptr) { syscall1(Montauk::SYS_FREE, (uint64_t)ptr); } + inline void* alloc(uint64_t size) { return (void*)syscall1(montauk::abi::SYS_ALLOC, size); } + inline void free(void* ptr) { syscall1(montauk::abi::SYS_FREE, (uint64_t)ptr); } // Timekeeping - inline uint64_t get_ticks() { return (uint64_t)syscall0(Montauk::SYS_GETTICKS); } - inline uint64_t get_milliseconds() { return (uint64_t)syscall0(Montauk::SYS_GETMILLISECONDS); } + inline uint64_t get_ticks() { return (uint64_t)syscall0(montauk::abi::SYS_GETTICKS); } + inline uint64_t get_milliseconds() { return (uint64_t)syscall0(montauk::abi::SYS_GETMILLISECONDS); } // System - inline void get_info(Montauk::SysInfo* info) { syscall1(Montauk::SYS_GETINFO, (uint64_t)info); } + inline void get_info(montauk::abi::SysInfo* info) { syscall1(montauk::abi::SYS_GETINFO, (uint64_t)info); } // Keyboard - inline bool is_key_available() { return (bool)syscall0(Montauk::SYS_ISKEYAVAILABLE); } - inline void getkey(Montauk::KeyEvent* out) { syscall1(Montauk::SYS_GETKEY, (uint64_t)out); } - inline char getchar() { return (char)syscall0(Montauk::SYS_GETCHAR); } + inline bool is_key_available() { return (bool)syscall0(montauk::abi::SYS_ISKEYAVAILABLE); } + inline void getkey(montauk::abi::KeyEvent* out) { syscall1(montauk::abi::SYS_GETKEY, (uint64_t)out); } + inline char getchar() { return (char)syscall0(montauk::abi::SYS_GETCHAR); } inline uint64_t input_wait(uint64_t observedSerial, uint64_t timeoutMs) { - return (uint64_t)syscall2(Montauk::SYS_INPUT_WAIT, observedSerial, timeoutMs); + return (uint64_t)syscall2(montauk::abi::SYS_INPUT_WAIT, observedSerial, timeoutMs); } // Networking inline int32_t ping(uint32_t ip, uint32_t timeoutMs = 3000) { - return (int32_t)syscall2(Montauk::SYS_PING, (uint64_t)ip, (uint64_t)timeoutMs); + return (int32_t)syscall2(montauk::abi::SYS_PING, (uint64_t)ip, (uint64_t)timeoutMs); } // DNS resolve: returns IP in network byte order, or 0 on failure inline uint32_t resolve(const char* hostname) { - return (uint32_t)syscall1(Montauk::SYS_RESOLVE, (uint64_t)hostname); + return (uint32_t)syscall1(montauk::abi::SYS_RESOLVE, (uint64_t)hostname); } // Network configuration - inline void get_netcfg(Montauk::NetCfg* out) { syscall1(Montauk::SYS_GETNETCFG, (uint64_t)out); } - inline int set_netcfg(const Montauk::NetCfg* cfg) { return (int)syscall1(Montauk::SYS_SETNETCFG, (uint64_t)cfg); } - inline int net_status(Montauk::NetStatus* out) { return (int)syscall1(Montauk::SYS_NETSTATUS, (uint64_t)out); } + inline void get_netcfg(montauk::abi::NetCfg* out) { syscall1(montauk::abi::SYS_GETNETCFG, (uint64_t)out); } + inline int set_netcfg(const montauk::abi::NetCfg* cfg) { return (int)syscall1(montauk::abi::SYS_SETNETCFG, (uint64_t)cfg); } + inline int net_status(montauk::abi::NetStatus* out) { return (int)syscall1(montauk::abi::SYS_NETSTATUS, (uint64_t)out); } // Sockets inline int socket(int type) { - return (int)syscall1(Montauk::SYS_SOCKET, (uint64_t)type); + return (int)syscall1(montauk::abi::SYS_SOCKET, (uint64_t)type); } inline int connect(int fd, uint32_t ip, uint16_t port) { - return (int)syscall3(Montauk::SYS_CONNECT, (uint64_t)fd, (uint64_t)ip, (uint64_t)port); + return (int)syscall3(montauk::abi::SYS_CONNECT, (uint64_t)fd, (uint64_t)ip, (uint64_t)port); } inline int bind(int fd, uint16_t port) { - return (int)syscall2(Montauk::SYS_BIND, (uint64_t)fd, (uint64_t)port); + return (int)syscall2(montauk::abi::SYS_BIND, (uint64_t)fd, (uint64_t)port); } inline int listen(int fd) { - return (int)syscall1(Montauk::SYS_LISTEN, (uint64_t)fd); + return (int)syscall1(montauk::abi::SYS_LISTEN, (uint64_t)fd); } inline int accept(int fd) { - return (int)syscall1(Montauk::SYS_ACCEPT, (uint64_t)fd); + return (int)syscall1(montauk::abi::SYS_ACCEPT, (uint64_t)fd); } inline int send(int fd, const void* data, uint32_t len) { - return (int)syscall3(Montauk::SYS_SEND, (uint64_t)fd, (uint64_t)data, (uint64_t)len); + return (int)syscall3(montauk::abi::SYS_SEND, (uint64_t)fd, (uint64_t)data, (uint64_t)len); } inline int recv(int fd, void* buf, uint32_t maxLen) { - return (int)syscall3(Montauk::SYS_RECV, (uint64_t)fd, (uint64_t)buf, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_RECV, (uint64_t)fd, (uint64_t)buf, (uint64_t)maxLen); } inline int closesocket(int fd) { - return (int)syscall1(Montauk::SYS_CLOSESOCK, (uint64_t)fd); + return (int)syscall1(montauk::abi::SYS_CLOSESOCK, (uint64_t)fd); } inline int sendto(int fd, const void* data, uint32_t len, uint32_t destIp, uint16_t destPort) { - return (int)syscall5(Montauk::SYS_SENDTO, (uint64_t)fd, (uint64_t)data, + return (int)syscall5(montauk::abi::SYS_SENDTO, (uint64_t)fd, (uint64_t)data, (uint64_t)len, (uint64_t)destIp, (uint64_t)destPort); } inline int recvfrom(int fd, void* buf, uint32_t maxLen, uint32_t* srcIp, uint16_t* srcPort) { - return (int)syscall5(Montauk::SYS_RECVFROM, (uint64_t)fd, (uint64_t)buf, + return (int)syscall5(montauk::abi::SYS_RECVFROM, (uint64_t)fd, (uint64_t)buf, (uint64_t)maxLen, (uint64_t)srcIp, (uint64_t)srcPort); } // Generic IPC inline int dup_handle(int handle) { - return (int)syscall1(Montauk::SYS_DUPHANDLE, (uint64_t)handle); + return (int)syscall1(montauk::abi::SYS_DUPHANDLE, (uint64_t)handle); } inline uint32_t wait_handle(int handle, uint32_t wantedSignals, uint64_t timeoutMs = ~0ULL) { - return (uint32_t)syscall3(Montauk::SYS_WAIT_HANDLE, (uint64_t)handle, + return (uint32_t)syscall3(montauk::abi::SYS_WAIT_HANDLE, (uint64_t)handle, (uint64_t)wantedSignals, timeoutMs); } inline int stream_create(int* outReadHandle, int* outWriteHandle, uint32_t capacity = 0) { - return (int)syscall3(Montauk::SYS_STREAM_CREATE, (uint64_t)outReadHandle, + return (int)syscall3(montauk::abi::SYS_STREAM_CREATE, (uint64_t)outReadHandle, (uint64_t)outWriteHandle, (uint64_t)capacity); } inline int stream_read(int handle, void* buf, int maxLen) { - return (int)syscall3(Montauk::SYS_STREAM_READ, (uint64_t)handle, (uint64_t)buf, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_STREAM_READ, (uint64_t)handle, (uint64_t)buf, (uint64_t)maxLen); } inline int stream_write(int handle, const void* data, int len) { - return (int)syscall3(Montauk::SYS_STREAM_WRITE, (uint64_t)handle, (uint64_t)data, (uint64_t)len); + return (int)syscall3(montauk::abi::SYS_STREAM_WRITE, (uint64_t)handle, (uint64_t)data, (uint64_t)len); } inline int mailbox_create(int* outSendHandle, int* outRecvHandle) { - return (int)syscall2(Montauk::SYS_MAILBOX_CREATE, (uint64_t)outSendHandle, (uint64_t)outRecvHandle); + return (int)syscall2(montauk::abi::SYS_MAILBOX_CREATE, (uint64_t)outSendHandle, (uint64_t)outRecvHandle); } inline int mailbox_send(int handle, uint32_t msgType, const void* data, uint16_t len, int attachHandle = -1) { - return (int)syscall5(Montauk::SYS_MAILBOX_SEND, (uint64_t)handle, (uint64_t)msgType, + return (int)syscall5(montauk::abi::SYS_MAILBOX_SEND, (uint64_t)handle, (uint64_t)msgType, (uint64_t)data, (uint64_t)len, (uint64_t)(int64_t)attachHandle); } inline int mailbox_recv(int handle, uint32_t* outMsgType, void* data, uint16_t* inOutLen, int* outAttachHandle = nullptr) { - return (int)syscall5(Montauk::SYS_MAILBOX_RECV, (uint64_t)handle, (uint64_t)outMsgType, + return (int)syscall5(montauk::abi::SYS_MAILBOX_RECV, (uint64_t)handle, (uint64_t)outMsgType, (uint64_t)data, (uint64_t)inOutLen, (uint64_t)outAttachHandle); } inline int waitset_create() { - return (int)syscall0(Montauk::SYS_WAITSET_CREATE); + return (int)syscall0(montauk::abi::SYS_WAITSET_CREATE); } inline int waitset_add(int waitsetHandle, int targetHandle, uint32_t signals) { - return (int)syscall3(Montauk::SYS_WAITSET_ADD, (uint64_t)waitsetHandle, + return (int)syscall3(montauk::abi::SYS_WAITSET_ADD, (uint64_t)waitsetHandle, (uint64_t)targetHandle, (uint64_t)signals); } inline int waitset_remove(int waitsetHandle, int index) { - return (int)syscall2(Montauk::SYS_WAITSET_REMOVE, (uint64_t)waitsetHandle, (uint64_t)index); + return (int)syscall2(montauk::abi::SYS_WAITSET_REMOVE, (uint64_t)waitsetHandle, (uint64_t)index); } - inline int waitset_wait(int waitsetHandle, Montauk::IpcWaitResult* outReady, uint64_t timeoutMs = ~0ULL) { - return (int)syscall3(Montauk::SYS_WAITSET_WAIT, (uint64_t)waitsetHandle, (uint64_t)outReady, timeoutMs); + inline int waitset_wait(int waitsetHandle, montauk::abi::IpcWaitResult* outReady, uint64_t timeoutMs = ~0ULL) { + return (int)syscall3(montauk::abi::SYS_WAITSET_WAIT, (uint64_t)waitsetHandle, (uint64_t)outReady, timeoutMs); } inline int proc_open(int pid) { - return (int)syscall1(Montauk::SYS_PROC_OPEN, (uint64_t)pid); + return (int)syscall1(montauk::abi::SYS_PROC_OPEN, (uint64_t)pid); } inline int surface_create(uint64_t byteSize) { - return (int)syscall1(Montauk::SYS_SURFACE_CREATE, byteSize); + return (int)syscall1(montauk::abi::SYS_SURFACE_CREATE, byteSize); } inline void* surface_map(int handle) { - return (void*)syscall1(Montauk::SYS_SURFACE_MAP, (uint64_t)handle); + return (void*)syscall1(montauk::abi::SYS_SURFACE_MAP, (uint64_t)handle); } inline int surface_resize(int handle, uint64_t newSize) { - return (int)syscall2(Montauk::SYS_SURFACE_RESIZE, (uint64_t)handle, newSize); + return (int)syscall2(montauk::abi::SYS_SURFACE_RESIZE, (uint64_t)handle, newSize); } // Shared library support inline int load_lib(const char* path) { - return (int)syscall1(Montauk::SYS_LOAD_LIB, (uint64_t)path); + return (int)syscall1(montauk::abi::SYS_LOAD_LIB, (uint64_t)path); } inline int unload_lib(int handle) { - return (int)syscall1(Montauk::SYS_UNLOAD_LIB, (uint64_t)handle); + return (int)syscall1(montauk::abi::SYS_UNLOAD_LIB, (uint64_t)handle); } inline void* dlsym(int handle, uint64_t symbolOffset) { - return (void*)syscall2(Montauk::SYS_DLSYM, (uint64_t)handle, symbolOffset); + return (void*)syscall2(montauk::abi::SYS_DLSYM, (uint64_t)handle, symbolOffset); } inline uint64_t get_libbase(int handle) { - return (uint64_t)syscall1(Montauk::SYS_GETLIBBASE, (uint64_t)handle); + return (uint64_t)syscall1(montauk::abi::SYS_GETLIBBASE, (uint64_t)handle); } // Crash report retrieval - inline int crash_report(Montauk::CrashReportInfo* out) { - return (int)syscall1(Montauk::SYS_CRASH_REPORT, (uint64_t)out); + inline int crash_report(montauk::abi::CrashReportInfo* out) { + return (int)syscall1(montauk::abi::SYS_CRASH_REPORT, (uint64_t)out); } // Process management - inline void waitpid(int pid) { syscall1(Montauk::SYS_WAITPID, (uint64_t)pid); } + inline void waitpid(int pid) { syscall1(montauk::abi::SYS_WAITPID, (uint64_t)pid); } // Framebuffer - inline void fb_info(Montauk::FbInfo* info) { syscall1(Montauk::SYS_FBINFO, (uint64_t)info); } - inline void* fb_map() { return (void*)syscall0(Montauk::SYS_FBMAP); } + inline void fb_info(montauk::abi::FbInfo* info) { syscall1(montauk::abi::SYS_FBINFO, (uint64_t)info); } + inline void* fb_map() { return (void*)syscall0(montauk::abi::SYS_FBMAP); } // Arguments inline int getargs(char* buf, uint64_t maxLen) { - return (int)syscall2(Montauk::SYS_GETARGS, (uint64_t)buf, maxLen); + return (int)syscall2(montauk::abi::SYS_GETARGS, (uint64_t)buf, maxLen); } // Terminal inline void termsize(int* cols, int* rows) { - uint64_t r = (uint64_t)syscall0(Montauk::SYS_TERMSIZE); + uint64_t r = (uint64_t)syscall0(montauk::abi::SYS_TERMSIZE); if (cols) *cols = (int)(r & 0xFFFFFFFF); if (rows) *rows = (int)(r >> 32); } inline void termscale(int scale_x, int scale_y) { - syscall2(Montauk::SYS_TERMSCALE, (uint64_t)scale_x, (uint64_t)scale_y); + syscall2(montauk::abi::SYS_TERMSCALE, (uint64_t)scale_x, (uint64_t)scale_y); } inline void get_termscale(int* scale_x, int* scale_y) { - uint64_t r = (uint64_t)syscall2(Montauk::SYS_TERMSCALE, 0, 0); + uint64_t r = (uint64_t)syscall2(montauk::abi::SYS_TERMSCALE, 0, 0); if (scale_x) *scale_x = (int)(r & 0xFFFFFFFF); if (scale_y) *scale_y = (int)(r >> 32); } // Timekeeping (wall-clock) - inline void gettime(Montauk::DateTime* out) { syscall1(Montauk::SYS_GETTIME, (uint64_t)out); } + inline void gettime(montauk::abi::DateTime* out) { syscall1(montauk::abi::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); } + inline void settz(int offset_minutes) { syscall1(montauk::abi::SYS_SETTZ, (uint64_t)(int64_t)offset_minutes); } + inline int gettz() { return (int)syscall0(montauk::abi::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); + return syscall2(montauk::abi::SYS_GETRANDOM, (uint64_t)buf, (uint64_t)len); } // Power management [[noreturn]] inline void reset() { - syscall0(Montauk::SYS_RESET); + syscall0(montauk::abi::SYS_RESET); __builtin_unreachable(); } [[noreturn]] inline void shutdown() { - syscall0(Montauk::SYS_SHUTDOWN); + syscall0(montauk::abi::SYS_SHUTDOWN); __builtin_unreachable(); } inline int suspend() { - return (int)syscall0(Montauk::SYS_SUSPEND); + return (int)syscall0(montauk::abi::SYS_SUSPEND); } // Graceful power-off request channel. The desktop posts a pending action - // (Montauk::POWER_REQ_SHUTDOWN / POWER_REQ_REBOOT) then exits; login.elf + // (montauk::abi::POWER_REQ_SHUTDOWN / POWER_REQ_REBOOT) then exits; login.elf // reads it with POWER_REQ_QUERY (read-and-clear), runs the shutdown stages, // and finally calls shutdown()/reset(). Returns the pending action for a // query, or 0 when posting one. inline int power_request(int action) { - return (int)syscall1(Montauk::SYS_POWER_REQUEST, (uint64_t)(int64_t)action); + return (int)syscall1(montauk::abi::SYS_POWER_REQUEST, (uint64_t)(int64_t)action); } // Mouse - inline void mouse_state(Montauk::MouseState* out) { syscall1(Montauk::SYS_MOUSESTATE, (uint64_t)out); } + inline void mouse_state(montauk::abi::MouseState* out) { syscall1(montauk::abi::SYS_MOUSESTATE, (uint64_t)out); } inline void set_mouse_bounds(int32_t maxX, int32_t maxY) { - syscall2(Montauk::SYS_SETMOUSEBOUNDS, (uint64_t)maxX, (uint64_t)maxY); + syscall2(montauk::abi::SYS_SETMOUSEBOUNDS, (uint64_t)maxX, (uint64_t)maxY); } // Kernel log inline int64_t read_klog(char* buf, uint64_t size) { - return syscall2(Montauk::SYS_KLOG, (uint64_t)buf, size); + return syscall2(montauk::abi::SYS_KLOG, (uint64_t)buf, size); } // I/O redirection inline int spawn_redir(const char* path, const char* args = nullptr) { - return (int)syscall2(Montauk::SYS_SPAWN_REDIR, (uint64_t)path, (uint64_t)args); + return (int)syscall2(montauk::abi::SYS_SPAWN_REDIR, (uint64_t)path, (uint64_t)args); } inline int childio_read(int childPid, char* buf, int maxLen) { - return (int)syscall3(Montauk::SYS_CHILDIO_READ, (uint64_t)childPid, (uint64_t)buf, (uint64_t)maxLen); + return (int)syscall3(montauk::abi::SYS_CHILDIO_READ, (uint64_t)childPid, (uint64_t)buf, (uint64_t)maxLen); } inline int childio_write(int childPid, const char* data, int len) { - return (int)syscall3(Montauk::SYS_CHILDIO_WRITE, (uint64_t)childPid, (uint64_t)data, (uint64_t)len); + return (int)syscall3(montauk::abi::SYS_CHILDIO_WRITE, (uint64_t)childPid, (uint64_t)data, (uint64_t)len); } - inline int childio_writekey(int childPid, const Montauk::KeyEvent* key) { - return (int)syscall2(Montauk::SYS_CHILDIO_WRITEKEY, (uint64_t)childPid, (uint64_t)key); + inline int childio_writekey(int childPid, const montauk::abi::KeyEvent* key) { + return (int)syscall2(montauk::abi::SYS_CHILDIO_WRITEKEY, (uint64_t)childPid, (uint64_t)key); } inline int childio_settermsz(int childPid, int cols, int rows) { - return (int)syscall3(Montauk::SYS_CHILDIO_SETTERMSZ, (uint64_t)childPid, (uint64_t)cols, (uint64_t)rows); + return (int)syscall3(montauk::abi::SYS_CHILDIO_SETTERMSZ, (uint64_t)childPid, (uint64_t)cols, (uint64_t)rows); } // Process listing / kill - inline int proclist(Montauk::ProcInfo* buf, int max) { - return (int)syscall2(Montauk::SYS_PROCLIST, (uint64_t)buf, (uint64_t)max); + inline int proclist(montauk::abi::ProcInfo* buf, int max) { + return (int)syscall2(montauk::abi::SYS_PROCLIST, (uint64_t)buf, (uint64_t)max); } inline int kill(int pid) { - return (int)syscall1(Montauk::SYS_KILL, (uint64_t)pid); + return (int)syscall1(montauk::abi::SYS_KILL, (uint64_t)pid); } - inline int devlist(Montauk::DevInfo* buf, int max) { - return (int)syscall2(Montauk::SYS_DEVLIST, (uint64_t)buf, (uint64_t)max); + inline int devlist(montauk::abi::DevInfo* buf, int max) { + return (int)syscall2(montauk::abi::SYS_DEVLIST, (uint64_t)buf, (uint64_t)max); } - inline int diskinfo(Montauk::DiskInfo* buf, int port) { - return (int)syscall2(Montauk::SYS_DISKINFO, (uint64_t)buf, (uint64_t)port); + inline int diskinfo(montauk::abi::DiskInfo* buf, int port) { + return (int)syscall2(montauk::abi::SYS_DISKINFO, (uint64_t)buf, (uint64_t)port); } // Partition table - inline int partlist(Montauk::PartInfo* buf, int max) { - return (int)syscall2(Montauk::SYS_PARTLIST, (uint64_t)buf, (uint64_t)max); + inline int partlist(montauk::abi::PartInfo* buf, int max) { + return (int)syscall2(montauk::abi::SYS_PARTLIST, (uint64_t)buf, (uint64_t)max); } // Raw block device I/O (driver-agnostic) inline int64_t disk_read(int blockDev, uint64_t lba, uint32_t sectorCount, void* buf) { - return syscall4(Montauk::SYS_DISKREAD, (uint64_t)blockDev, lba, + return syscall4(montauk::abi::SYS_DISKREAD, (uint64_t)blockDev, lba, (uint64_t)sectorCount, (uint64_t)buf); } inline int64_t disk_write(int blockDev, uint64_t lba, uint32_t sectorCount, const void* buf) { - return syscall4(Montauk::SYS_DISKWRITE, (uint64_t)blockDev, lba, + return syscall4(montauk::abi::SYS_DISKWRITE, (uint64_t)blockDev, lba, (uint64_t)sectorCount, (uint64_t)buf); } // GPT management inline int gpt_init(int blockDev) { - return (int)syscall1(Montauk::SYS_GPTINIT, (uint64_t)blockDev); + return (int)syscall1(montauk::abi::SYS_GPTINIT, (uint64_t)blockDev); } - inline int gpt_add(const Montauk::GptAddParams* params) { - return (int)syscall1(Montauk::SYS_GPTADD, (uint64_t)params); + inline int gpt_add(const montauk::abi::GptAddParams* params) { + return (int)syscall1(montauk::abi::SYS_GPTADD, (uint64_t)params); } inline int fs_mount(int partIndex, int driveNum) { - return (int)syscall2(Montauk::SYS_FSMOUNT, (uint64_t)partIndex, (uint64_t)driveNum); + return (int)syscall2(montauk::abi::SYS_FSMOUNT, (uint64_t)partIndex, (uint64_t)driveNum); } // Flush all block-device write caches and cleanly unmount disk-backed // volumes ahead of power-off. Returns the number of volumes unmounted. inline int fs_sync() { - return (int)syscall0(Montauk::SYS_FS_SYNC); + return (int)syscall0(montauk::abi::SYS_FS_SYNC); } - inline int fs_format(const Montauk::FsFormatParams* params) { - return (int)syscall1(Montauk::SYS_FSFORMAT, (uint64_t)params); + inline int fs_format(const montauk::abi::FsFormatParams* params) { + return (int)syscall1(montauk::abi::SYS_FSFORMAT, (uint64_t)params); } // Audio inline int audio_open(uint32_t sampleRate, uint8_t channels, uint8_t bitsPerSample) { - return (int)syscall3(Montauk::SYS_AUDIOOPEN, (uint64_t)sampleRate, + return (int)syscall3(montauk::abi::SYS_AUDIOOPEN, (uint64_t)sampleRate, (uint64_t)channels, (uint64_t)bitsPerSample); } inline void audio_close(int handle) { - syscall1(Montauk::SYS_AUDIOCLOSE, (uint64_t)handle); + syscall1(montauk::abi::SYS_AUDIOCLOSE, (uint64_t)handle); } inline int audio_write(int handle, const void* data, uint32_t size) { - return (int)syscall3(Montauk::SYS_AUDIOWRITE, (uint64_t)handle, + return (int)syscall3(montauk::abi::SYS_AUDIOWRITE, (uint64_t)handle, (uint64_t)data, (uint64_t)size); } inline int audio_ctl(int handle, int cmd, int value) { - return (int)syscall3(Montauk::SYS_AUDIOCTL, (uint64_t)handle, + return (int)syscall3(montauk::abi::SYS_AUDIOCTL, (uint64_t)handle, (uint64_t)cmd, (uint64_t)value); } inline int audio_set_volume(int handle, int percent) { - return audio_ctl(handle, Montauk::AUDIO_CTL_SET_VOLUME, percent); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_SET_VOLUME, percent); } inline int audio_get_volume(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_VOLUME, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_VOLUME, 0); } inline int audio_get_pos(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_POS, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_POS, 0); } inline int audio_pause(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_PAUSE, 1); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_PAUSE, 1); } inline int audio_resume(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_PAUSE, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_PAUSE, 0); } inline int audio_get_output(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_OUTPUT, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_OUTPUT, 0); } inline int audio_bt_status(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_BT_STATUS, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_BT_STATUS, 0); } inline int audio_set_master_volume(int percent) { - return audio_ctl(-1, Montauk::AUDIO_CTL_SET_MASTER_VOLUME, percent); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_SET_MASTER_VOLUME, percent); } inline int audio_get_master_volume() { - return audio_ctl(-1, Montauk::AUDIO_CTL_GET_MASTER_VOLUME, 0); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_GET_MASTER_VOLUME, 0); } inline int audio_set_master_mute(bool muted) { - return audio_ctl(-1, Montauk::AUDIO_CTL_SET_MASTER_MUTE, muted ? 1 : 0); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_SET_MASTER_MUTE, muted ? 1 : 0); } inline int audio_get_master_mute() { - return audio_ctl(-1, Montauk::AUDIO_CTL_GET_MASTER_MUTE, 0); + return audio_ctl(-1, montauk::abi::AUDIO_CTL_GET_MASTER_MUTE, 0); } inline int audio_set_mute(int handle, bool muted) { - return audio_ctl(handle, Montauk::AUDIO_CTL_SET_MUTE, muted ? 1 : 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_SET_MUTE, muted ? 1 : 0); } inline int audio_get_mute(int handle) { - return audio_ctl(handle, Montauk::AUDIO_CTL_GET_MUTE, 0); + return audio_ctl(handle, montauk::abi::AUDIO_CTL_GET_MUTE, 0); } - inline int audio_list(Montauk::AudioStreamInfo* buf, int maxCount) { - return (int)syscall2(Montauk::SYS_AUDIOLIST, (uint64_t)buf, (uint64_t)maxCount); + inline int audio_list(montauk::abi::AudioStreamInfo* buf, int maxCount) { + return (int)syscall2(montauk::abi::SYS_AUDIOLIST, (uint64_t)buf, (uint64_t)maxCount); } // Returns the current mixer state serial. With timeoutMs > 0 the call // blocks until the serial differs from `prevSerial` or the timeout // elapses. With timeoutMs == 0 it returns immediately (cheap snapshot). inline uint64_t audio_wait(uint64_t prevSerial, uint64_t timeoutMs) { - return syscall2(Montauk::SYS_AUDIOWAIT, prevSerial, timeoutMs); + return syscall2(montauk::abi::SYS_AUDIOWAIT, prevSerial, timeoutMs); } // Bluetooth - inline int bt_scan(Montauk::BtScanResult* buf, int maxCount, uint32_t timeoutMs) { - return (int)syscall3(Montauk::SYS_BTSCAN, (uint64_t)buf, (uint64_t)maxCount, (uint64_t)timeoutMs); + inline int bt_scan(montauk::abi::BtScanResult* buf, int maxCount, uint32_t timeoutMs) { + return (int)syscall3(montauk::abi::SYS_BTSCAN, (uint64_t)buf, (uint64_t)maxCount, (uint64_t)timeoutMs); } inline int bt_connect(const uint8_t* bdAddr) { - return (int)syscall1(Montauk::SYS_BTCONNECT, (uint64_t)bdAddr); + return (int)syscall1(montauk::abi::SYS_BTCONNECT, (uint64_t)bdAddr); } inline int bt_disconnect(const uint8_t* bdAddr) { - return (int)syscall1(Montauk::SYS_BTDISCONNECT, (uint64_t)bdAddr); + return (int)syscall1(montauk::abi::SYS_BTDISCONNECT, (uint64_t)bdAddr); } - inline int bt_list(Montauk::BtDevInfo* buf, int maxCount) { - return (int)syscall2(Montauk::SYS_BTLIST, (uint64_t)buf, (uint64_t)maxCount); + inline int bt_list(montauk::abi::BtDevInfo* buf, int maxCount) { + return (int)syscall2(montauk::abi::SYS_BTLIST, (uint64_t)buf, (uint64_t)maxCount); } - inline int bt_info(Montauk::BtAdapterInfo* buf) { - return (int)syscall1(Montauk::SYS_BTINFO, (uint64_t)buf); + inline int bt_info(montauk::abi::BtAdapterInfo* buf) { + return (int)syscall1(montauk::abi::SYS_BTINFO, (uint64_t)buf); } // Kernel introspection - inline void memstats(Montauk::MemStats* out) { syscall1(Montauk::SYS_MEMSTATS, (uint64_t)out); } + inline void memstats(montauk::abi::MemStats* out) { syscall1(montauk::abi::SYS_MEMSTATS, (uint64_t)out); } // User management inline int setuser(int pid, const char* name) { - return (int)syscall2(Montauk::SYS_SETUSER, (uint64_t)pid, (uint64_t)name); + return (int)syscall2(montauk::abi::SYS_SETUSER, (uint64_t)pid, (uint64_t)name); } inline int getuser(char* buf, uint64_t maxLen) { - return (int)syscall2(Montauk::SYS_GETUSER, (uint64_t)buf, maxLen); + return (int)syscall2(montauk::abi::SYS_GETUSER, (uint64_t)buf, maxLen); } // Clipboard inline int clipboard_set_text(const char* data, uint32_t len) { - return (int)syscall2(Montauk::SYS_CLIPBOARD_SET_TEXT, (uint64_t)data, (uint64_t)len); + return (int)syscall2(montauk::abi::SYS_CLIPBOARD_SET_TEXT, (uint64_t)data, (uint64_t)len); } - inline int clipboard_get_info(Montauk::ClipboardInfo* out) { - return (int)syscall1(Montauk::SYS_CLIPBOARD_GET_INFO, (uint64_t)out); + inline int clipboard_get_info(montauk::abi::ClipboardInfo* out) { + return (int)syscall1(montauk::abi::SYS_CLIPBOARD_GET_INFO, (uint64_t)out); } inline int clipboard_get_text(char* buf, uint32_t bufLen, uint32_t* outLen, uint64_t* outSerial = nullptr) { - return (int)syscall4(Montauk::SYS_CLIPBOARD_GET_TEXT, (uint64_t)buf, (uint64_t)bufLen, + return (int)syscall4(montauk::abi::SYS_CLIPBOARD_GET_TEXT, (uint64_t)buf, (uint64_t)bufLen, (uint64_t)outLen, (uint64_t)outSerial); } inline int clipboard_clear() { - return (int)syscall0(Montauk::SYS_CLIPBOARD_CLEAR); + return (int)syscall0(montauk::abi::SYS_CLIPBOARD_CLEAR); } // Window server - inline int win_create(const char* title, int w, int h, Montauk::WinCreateResult* result) { - return (int)syscall4(Montauk::SYS_WINCREATE, (uint64_t)title, (uint64_t)w, (uint64_t)h, (uint64_t)result); + inline int win_create(const char* title, int w, int h, montauk::abi::WinCreateResult* result) { + return (int)syscall4(montauk::abi::SYS_WINCREATE, (uint64_t)title, (uint64_t)w, (uint64_t)h, (uint64_t)result); } inline int win_destroy(int id) { - return (int)syscall1(Montauk::SYS_WINDESTROY, (uint64_t)id); + return (int)syscall1(montauk::abi::SYS_WINDESTROY, (uint64_t)id); } inline uint64_t win_present(int id) { - return (uint64_t)syscall1(Montauk::SYS_WINPRESENT, (uint64_t)id); + return (uint64_t)syscall1(montauk::abi::SYS_WINPRESENT, (uint64_t)id); } - inline int win_poll(int id, Montauk::WinEvent* event) { - return (int)syscall2(Montauk::SYS_WINPOLL, (uint64_t)id, (uint64_t)event); + inline int win_poll(int id, montauk::abi::WinEvent* event) { + return (int)syscall2(montauk::abi::SYS_WINPOLL, (uint64_t)id, (uint64_t)event); } - inline int win_enumerate(Montauk::WinInfo* info, int max) { - return (int)syscall2(Montauk::SYS_WINENUM, (uint64_t)info, (uint64_t)max); + inline int win_enumerate(montauk::abi::WinInfo* info, int max) { + return (int)syscall2(montauk::abi::SYS_WINENUM, (uint64_t)info, (uint64_t)max); } inline uint64_t win_map(int id) { - return (uint64_t)syscall1(Montauk::SYS_WINMAP, (uint64_t)id); + return (uint64_t)syscall1(montauk::abi::SYS_WINMAP, (uint64_t)id); } inline int win_unmap(int id) { - return (int)syscall1(Montauk::SYS_WINUNMAP, (uint64_t)id); + return (int)syscall1(montauk::abi::SYS_WINUNMAP, (uint64_t)id); } - inline int win_sendevent(int id, const Montauk::WinEvent* event) { - return (int)syscall2(Montauk::SYS_WINSENDEVENT, (uint64_t)id, (uint64_t)event); + inline int win_sendevent(int id, const montauk::abi::WinEvent* event) { + return (int)syscall2(montauk::abi::SYS_WINSENDEVENT, (uint64_t)id, (uint64_t)event); } inline uint64_t win_resize(int id, int w, int h) { - return (uint64_t)syscall3(Montauk::SYS_WINRESIZE, (uint64_t)id, (uint64_t)w, (uint64_t)h); + return (uint64_t)syscall3(montauk::abi::SYS_WINRESIZE, (uint64_t)id, (uint64_t)w, (uint64_t)h); } inline int win_setscale(int scale) { - return (int)syscall1(Montauk::SYS_WINSETSCALE, (uint64_t)scale); + return (int)syscall1(montauk::abi::SYS_WINSETSCALE, (uint64_t)scale); } inline int win_getscale() { - return (int)syscall0(Montauk::SYS_WINGETSCALE); + return (int)syscall0(montauk::abi::SYS_WINGETSCALE); } inline int win_setcursor(int id, int cursor) { - return (int)syscall2(Montauk::SYS_WINSETCURSOR, (uint64_t)id, (uint64_t)cursor); + return (int)syscall2(montauk::abi::SYS_WINSETCURSOR, (uint64_t)id, (uint64_t)cursor); } inline int win_setflags(int id, uint32_t flags) { - return (int)syscall2(Montauk::SYS_WINSETFLAGS, (uint64_t)id, (uint64_t)flags); + return (int)syscall2(montauk::abi::SYS_WINSETFLAGS, (uint64_t)id, (uint64_t)flags); } } diff --git a/template/sysroot/include/montauk/thread.h b/template/sysroot/include/montauk/thread.h index e4eb5aa..57b3777 100644 --- a/template/sysroot/include/montauk/thread.h +++ b/template/sysroot/include/montauk/thread.h @@ -35,7 +35,7 @@ namespace montauk { // Terminate the calling thread. Never returns. If called by the main // thread this is equivalent to exit() (the whole process exits). [[noreturn]] inline void thread_exit(int code = 0) { - syscall1(Montauk::SYS_THREAD_EXIT, (uint64_t)code); + syscall1(montauk::abi::SYS_THREAD_EXIT, (uint64_t)code); __builtin_unreachable(); } @@ -86,7 +86,7 @@ namespace montauk { ctx->stack_base = stack; uint64_t stack_top = ((uint64_t)stack + stack_bytes) & ~0xFULL; - int tid = (int)syscall3(Montauk::SYS_THREAD_SPAWN, + int tid = (int)syscall3(montauk::abi::SYS_THREAD_SPAWN, (uint64_t)&detail::thread_trampoline, (uint64_t)ctx, stack_top); if (tid < 0) { @@ -101,13 +101,13 @@ namespace montauk { // success (with the thread's exit code in *out_code if non-null) or // -1 if `tid` is not a joinable sibling. inline int thread_join(int tid, int* out_code = nullptr) { - return (int)syscall2(Montauk::SYS_THREAD_JOIN, + return (int)syscall2(montauk::abi::SYS_THREAD_JOIN, (uint64_t)tid, (uint64_t)out_code); } // Return the calling thread's TID (== getpid() for the main thread). inline int thread_self() { - return (int)syscall0(Montauk::SYS_THREAD_SELF); + return (int)syscall0(montauk::abi::SYS_THREAD_SELF); } // Lightweight mutex backed by a single atomic word + the kernel