summaryrefslogtreecommitdiff
path: root/rgfw.c3
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-04-25 22:50:36 +0200
committerandromeda <andromeda@lenovo>2026-04-25 22:50:36 +0200
commitc101e6571135cfd963e3c3f9543e64c445af7fd8 (patch)
treea1b54e635fd95c6353cbac24caf1b361f6bcb7c1 /rgfw.c3
parent168abecfafadb57a0c677777a40083761bf8a922 (diff)
finish x86_64-linux Wayland bindings for rfont, rgfw, rsgl :)
Diffstat (limited to 'rgfw.c3')
-rw-r--r--rgfw.c3855
1 files changed, 792 insertions, 63 deletions
diff --git a/rgfw.c3 b/rgfw.c3
index 3dd0692..80204dd 100644
--- a/rgfw.c3
+++ b/rgfw.c3
@@ -1,83 +1,812 @@
+/*
+*
+* Copyright (C) 2026 andromeda
+*
+* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
+*
+*/
+
module rgfw;
-alias Window = void;
-alias GlContext = void;
-alias EglContext = void;
-alias Proc = fn void ();
+alias Info = void;
+alias Window = void;
+alias Window_src = void;
+
+constdef Format : char
+{
+ RGB8 = 0,
+ BGR8,
+ RGBA8,
+ ARGB8,
+ BGRA8,
+ ABGR8,
+ COUNT,
+}
+
+struct ColorLayout
+{
+ int r;
+ int g;
+ int b;
+ int a;
+ uint channels;
+}
+
+alias ConvertImageDataFunc = fn void(char*, char*, ColorLayout*, ColorLayout*, usz);
+
+alias NativeImage = void;
+alias Surface = void;
+
+struct GammaRamp
+{
+ ushort* red;
+ ushort* green;
+ ushort* blue;
+ usz count;
+}
+
+struct MonitorMode
+{
+ int w;
+ int h;
+ float refreshRate;
+ char red;
+ char blue;
+ char green;
+ void* src;
+}
+
+alias MonitorNode = void;
+
+struct Monitor
+{
+ int x;
+ int y;
+ CChar* name;
+ float scaleX;
+ float scaleY;
+ float pixelRatio;
+ float physW;
+ float physH;
+ MonitorMode mode;
+ void* userPtr;
+ MonitorNode* node;
+}
+
+constdef ModeRequest : char
+{
+ SCALE = 1 << 0,
+ REFRESH = 1 << 1,
+ RGB = 1 << 2,
+ ALL = SCALE | REFRESH | RGB,
+}
+
+alias Mouse = void;
+
+constdef Key
+{
+ KEY_NULL = 0,
+ KEY_ESCAPE = 27,
+ KEY_BACKTICK = '`',
+ KEY_0 = '0',
+ KEY_1 = '1',
+ KEY_2 = '2',
+ KEY_3 = '3',
+ KEY_4 = '4',
+ KEY_5 = '5',
+ KEY_6 = '6',
+ KEY_7 = '7',
+ KEY_8 = '8',
+ KEY_9 = '9',
+ KEY_MINUS = '-',
+ KEY_EQUAL = '=',
+ KEY_EQUALS = KEY_EQUAL,
+ KEY_BACKSPACE = '\b',
+ KEY_TAB = '\t',
+ KEY_SPACE = ' ',
+ KEY_A = 'a',
+ KEY_B = 'b',
+ KEY_C = 'c',
+ KEY_D = 'd',
+ KEY_E = 'e',
+ KEY_F = 'f',
+ KEY_G = 'g',
+ KEY_H = 'h',
+ KEY_I = 'i',
+ KEY_J = 'j',
+ KEY_K = 'k',
+ KEY_L = 'l',
+ KEY_M = 'm',
+ KEY_N = 'n',
+ KEY_O = 'o',
+ KEY_P = 'p',
+ KEY_Q = 'q',
+ KEY_R = 'r',
+ KEY_S = 's',
+ KEY_T = 't',
+ KEY_U = 'u',
+ KEY_V = 'v',
+ KEY_W = 'w',
+ KEY_X = 'x',
+ KEY_Y = 'y',
+ KEY_Z = 'z',
+ KEY_PERIOD = '.',
+ KEY_COMMA = ',',
+ KEY_SLASH = '/',
+ KEY_BRACKET = '[',
+ KEY_CLOSEBRACKET = ']',
+ KEY_SEMICOLON = ';',
+ KEY_APOSTROPHE = '\'',
+ KEY_BACKSLASH = '\\',
+ KEY_RETURN = '\n',
+ KEY_ENTER = KEY_RETURN,
+ KEY_DELETE = 127,
+ KEY_F1,
+ KEY_F2,
+ KEY_F3,
+ KEY_F4,
+ KEY_F5,
+ KEY_F6,
+ KEY_F7,
+ KEY_F8,
+ KEY_F9,
+ KEY_F10,
+ KEY_F11,
+ KEY_F12,
+ KEY_F13,
+ KEY_F14,
+ KEY_F15,
+ KEY_F16,
+ KEY_F17,
+ KEY_F18,
+ KEY_F19,
+ KEY_F20,
+ KEY_F21,
+ KEY_F22,
+ KEY_F23,
+ KEY_F24,
+ KEY_F25,
+ KEY_CAPSLOCK,
+ KEY_SHIFTL,
+ KEY_CONTROLL,
+ KEY_ALTL,
+ KEY_SUPERL,
+ KEY_SHIFTR,
+ KEY_CONTROLR,
+ KEY_ALTR,
+ KEY_SUPERR,
+ KEY_UP,
+ KEY_DOWN,
+ KEY_LEFT,
+ KEY_RIGHT,
+ KEY_INSERT,
+ KEY_MENU,
+ KEY_END,
+ KEY_HOME,
+ KEY_PAGEUP,
+ KEY_PAGEDOWN,
+ KEY_NUMLOCK,
+ KEY_PADSLASH,
+ KEY_PADMULTIPLY,
+ KEY_PADPLUS,
+ KEY_PADMINUS,
+ KEY_PADEQUAL,
+ KEY_PADEQUALS = KEY_PADEQUAL,
+ KEY_KEY_PAD1,
+ KEY_PAD2,
+ KEY_PAD3,
+ KEY_PAD4,
+ KEY_PAD5,
+ KEY_PAD6,
+ KEY_PAD7,
+ KEY_PAD8,
+ KEY_PAD9,
+ KEY_PAD0,
+ KEY_PADPERIOD,
+ KEY_PADRETURN,
+ KEY_SCROLLLOCK,
+ KEY_PRINTSCREEN,
+ KEY_PAUSE,
+ KEY_WORLD1,
+ KEY_WORLD2,
+ KEY_LAST = 256,
+}
+
+constdef MouseButton : char
+{
+ LEFT = 0,
+ MIDDLE,
+ RIGHT,
+ MISC1,
+ MISC2,
+ MISC3,
+ MISC4,
+ MISC5,
+ FINAL,
+}
+
+constdef Keymod : char
+{
+ CAPSLOCK = 1 << 0,
+ NUMLOCK = 1 << 1,
+ CONTROL = 1 << 2,
+ ALT = 1 << 3,
+ SHIFT = 1 << 4,
+ SUPER = 1 << 5,
+ SCROLLLOCK = 1 << 6,
+}
+
+constdef DndActionType : char
+{
+ ACTION_NONE = 0,
+ ACTION_ENTER,
+ ACTION_MOVE,
+ ACTION_EXIT,
+}
+
+constdef DataTransferType : char
+{
+ NONE = 0,
+ TEXT,
+ FILE,
+ URL,
+ IMAGE,
+ UNKNOWN,
+}
+
+struct DataDropNode
+{
+ ZString data;
+ usz size;
+ DataTransferType type;
+ DataDropNode* next;
+}
+
+constdef EventType : char
+{
+ EVENT_NONE = 0,
+ KEY_PRESSED,
+ KEY_RELEASED,
+ KEY_CHAR,
+ MOUSE_BUTTON_PRESSED,
+ MOUSE_BUTTON_RELEASED,
+ MOUSE_SCROLL,
+ MOUSE_POS_CHANGED,
+ MOUSE_RAW_MOTION,
+ MOUSE_ENTER,
+ MOUSE_LEAVE,
+ WINDOW_MOVED,
+ WINDOW_RESIZED,
+ WINDOW_FOCUS_IN,
+ WINDOW_FOCUS_OUT,
+ WINDOW_REFRESH,
+ WINDOW_CLOSE,
+ WINDOW_MAXIMIZED,
+ WINDOW_MINIMIZED,
+ WINDOW_RESTORED,
+ DATA_DROP,
+ DATA_DRAG,
+ SCALE_UPDATED,
+ MONITOR_CONNECTED,
+ MONITOR_DISCONNECTED,
+ EVENT_COUNT,
+}
+
+constdef EventFlag : uint
+{
+ KEY_PRESSED = 1 << (char)EventType.KEY_PRESSED,
+ KEY_RELEASED = 1 << (char)EventType.KEY_RELEASED,
+ KEY_CHAR = 1 << (char)EventType.KEY_CHAR,
+ MOUSE_BUTTON_PRESSED = 1 << (char)EventType.MOUSE_BUTTON_PRESSED,
+ MOUSE_BUTTON_RELEASED = 1 << (char)EventType.MOUSE_BUTTON_RELEASED,
+ MOUSE_SCROLL = 1 << (char)EventType.MOUSE_SCROLL,
+ MOUSE_POS_CHANGED = 1 << (char)EventType.MOUSE_POS_CHANGED,
+ MOUSE_RAW_MOTION = 1 << (char)EventType.MOUSE_RAW_MOTION,
+ MOUSE_ENTER = 1 << (char)EventType.MOUSE_ENTER,
+ MOUSE_LEAVE = 1 << (char)EventType.MOUSE_LEAVE,
+ WINDOW_MOVED = 1 << (char)EventType.WINDOW_MOVED,
+ WINDOW_RESIZED = 1 << (char)EventType.WINDOW_RESIZED,
+ WINDOW_FOCUS_IN = 1 << (char)EventType.WINDOW_FOCUS_IN,
+ WINDOW_FOCUS_OUT = 1 << (char)EventType.WINDOW_FOCUS_OUT,
+ WINDOW_REFRESH = 1 << (char)EventType.WINDOW_REFRESH,
+ WINDOW_CLOSE = 1 << (char)EventType.WINDOW_CLOSE,
+ WINDOW_MAXIMIZED = 1 << (char)EventType.WINDOW_MAXIMIZED,
+ WINDOW_MINIMIZED = 1 << (char)EventType.WINDOW_MINIMIZED,
+ WINDOW_RESTORED = 1 << (char)EventType.WINDOW_RESTORED,
+ DATA_DROP = 1 << (char)EventType.DATA_DROP,
+ DATA_DRAG = 1 << (char)EventType.DATA_DRAG,
+ SCALE_UPDATED = 1 << (char)EventType.SCALE_UPDATED,
+ MONITOR_CONNECTED = 1 << (char)EventType.MONITOR_CONNECTED,
+ MONITOR_DISCONNECTED = 1 << (char)EventType.MONITOR_DISCONNECTED,
+
+ KEY_EVENTS = KEY_PRESSED | KEY_RELEASED | KEY_CHAR,
+ MOUSE_EVENTS = MOUSE_BUTTON_PRESSED | MOUSE_BUTTON_RELEASED | MOUSE_SCROLL | MOUSE_POS_CHANGED | MOUSE_RAW_MOTION | MOUSE_ENTER | MOUSE_LEAVE,
+ WINDOW_EVENTS = WINDOW_MOVED | WINDOW_RESIZED | WINDOW_REFRESH | WINDOW_MAXIMIZED | WINDOW_MINIMIZED | WINDOW_RESTORED | SCALE_UPDATED,
+ WINDOW_FOCUS_EVENTS = WINDOW_FOCUS_IN | WINDOW_FOCUS_OUT,
+ DATA_DRAG_DROP_EVENTS = DATA_DRAG | DATA_DROP,
+ MONITOR_EVENTS = MONITOR_CONNECTED | MONITOR_DISCONNECTED,
+ ALL_EVENTS = KEY_EVENTS | MOUSE_EVENTS | WINDOW_EVENTS | WINDOW_FOCUS_EVENTS | DATA_DRAG_DROP_EVENTS | MONITOR_EVENTS,
+}
+
+struct CommonEvent
+{
+ EventType type;
+ Window* win;
+}
+
+struct WindowFocusEvent
+{
+ EventType type;
+ Window* win;
+ bool state;
+}
+
+struct MouseButtonEvent
+{
+ EventType type;
+ Window* win;
+ MouseButton value;
+ bool state;
+}
-enum GlReleaseBehavior: int
+struct MouseDeltaEvent
{
- GL_RELEASE_FLUSH,
- GL_RELEASE_NONE,
+ EventType type;
+ Window* win;
+ float x;
+ float y;
}
-enum GlProfile: int
+struct MousePosEvent
{
- GL_CORE,
- GL_FORWARD_COMPATIBILITY,
- GL_COMPATIBILITY,
- GL_ES,
+ EventType type;
+ Window* win;
+ int x;
+ int y;
+ bool inWindow;
}
-enum GlRenderer: int
+struct KeyEvent
{
- GL_ACCELERATED,
- GL_SOFTWARE,
+ EventType type;
+ Window* win;
+ Key value;
+ bool repeat;
+ Keymod mod;
+ bool state;
}
+struct KeyCharEvent
+{
+ EventType type;
+ Window* win;
+ Char32 value;
+}
+
+struct DataDropEvent
+{
+ EventType type;
+ Window* win;
+ DataDropNode* value;
+}
+
+struct DataDragEvent
+{
+ EventType type;
+ Window* win;
+ int x;
+ int y;
+ DndActionType action;
+ DataTransferType dataType;
+}
+
+struct ScaleUpdatedEvent
+{
+ EventType type;
+ Window* win;
+ float x;
+ float y;
+}
+
+struct MonitorEvent
+{
+ EventType type;
+ Window* win;
+ Monitor* monitor;
+ bool state;
+}
+
+struct WindowUpdateEvent
+{
+ EventType type;
+ Window* win;
+ int x;
+ int y;
+ int w;
+ int h;
+}
+
+union Event
+{
+ EventType type;
+ CommonEvent common;
+ WindowFocusEvent focus;
+ WindowUpdateEvent update;
+ MouseButtonEvent button;
+ MouseDeltaEvent delta;
+ MousePosEvent mouse;
+ KeyEvent key;
+ KeyCharEvent keyChar;
+ DataDropEvent drop;
+ DataDragEvent drag;
+ ScaleUpdatedEvent scale;
+ MonitorEvent monitor;
+}
+
+constdef EventWait : int
+{
+ NO_WAIT = 0,
+ WAIT_NEXT = -1,
+}
+
+alias GenericFunc = fn void(Event*);
+
+struct Callbacks { GenericFunc* arr; }
+
constdef WindowFlags : uint
{
- WINDOW_NO_BORDER = 1 << 0,
- WINDOW_NO_RESIZE = 1 << 1,
- WINDOW_ALLOW_DND = 1 << 2,
- WINDOW_HIDE_MOUSE = 1 << 3,
- WINDOW_FULLSCREEN = 1 << 4,
- WINDOW_TRANSLUCENT = 1 << 5,
- WINDOW_TRANSPARENT = WINDOW_TRANSLUCENT,
- WINDOW_CENTER = 1 << 6,
- WINDOW_RAW_MOUSE = 1 << 7,
- WINDOW_SCALE_TO_MONITOR = 1 << 8,
- WINDOW_HIDE = 1 << 9,
- WINDOW_MAXIMIZE = 1 << 10,
- WINDOW_CENTER_CURSOR = 1 << 11,
- WINDOW_FLOATING = 1 << 12,
- WINDOW_FOCUS_ON_SHOW = 1 << 13,
- WINDOW_MINIMIZE = 1 << 14,
- WINDOW_FOCUS = 1 << 15,
- WINDOW_CAPTURE_MOUSE = 1 << 16,
- WINDOW_OPENGL = 1 << 17,
- WINDOW_EGL = 1 << 18,
- NO_DEINIT_ON_CLOSE = 1 << 19,
- WINDOWED_FULLSCREEN = WINDOW_NO_BORDER | WINDOW_MAXIMIZE,
- WINDOW_CAPTURE_RAW_MOUSE = WINDOW_CAPTURE_MOUSE | WINDOW_RAW_MOUSE,
+ NO_BORDER = 1 << 0,
+ NO_RESIZE = 1 << 1,
+ ALLOW_DND = 1 << 2,
+ HIDE_MOUSE = 1 << 3,
+ FULLSCREEN = 1 << 4,
+ TRANSLUCENT = 1 << 5,
+ TRANSPARENT = TRANSLUCENT,
+ CENTER = 1 << 6,
+ RAW_MOUSE = 1 << 7,
+ SCALE_TO_MONITOR = 1 << 8,
+ HIDE = 1 << 9,
+ MAXIMIZE = 1 << 10,
+ CENTER_CURSOR = 1 << 11,
+ FLOATING = 1 << 12,
+ FOCUS_ON_SHOW = 1 << 13,
+ MINIMIZE = 1 << 14,
+ FOCUS = 1 << 15,
+ CAPTURE_MOUSE = 1 << 16,
+ OPENGL = 1 << 17,
+ EGL = 1 << 18,
+ NO_DEINIT_ON_CLOSE = 1 << 19,
+ WINDOWED_FULLSCREEN = NO_BORDER | MAXIMIZE,
+ CAPTURE_RAW_MOUSE = CAPTURE_MOUSE | RAW_MOUSE,
+}
+
+constdef Icon : char
+{
+ TASKBAR = 1 << 0,
+ WINDOW = 1 << 1,
+ BOTH = TASKBAR | WINDOW,
+}
+
+constdef MouseIcon : char
+{
+ NORMAL = 0,
+ ARROW,
+ IBEAM,
+ TEXT = IBEAM,
+ CROSSHAIR,
+ POINTING_HAND,
+ RESIZE_EW,
+ RESIZE_NS,
+ RESIZE_NWSE,
+ RESIZE_NESW,
+ RESIZE_NW,
+ RESIZE_N,
+ RESIZE_NE,
+ RESIZE_E,
+ RESIZE_SE,
+ RESIZE_S,
+ RESIZE_SW,
+ RESIZE_W,
+ RESIZE_ALL,
+ NOT_ALLOWED,
+ WAIT,
+ PROGRESS,
+ ICON_COUNT,
+ ICON_FINAL = 16, // padding
+}
+
+constdef FlashRequest : char
+{
+ CANCEL = 0,
+ BRIEFLY,
+ UNTIL_FOCUSED,
+}
+
+constdef DebugType : char
+{
+ ERROR = 0,
+ WARNING,
+ INFO,
+}
+
+constdef ErrorCode : char
+{
+ NO_ERROR = 0,
+ ERR_OUT_OF_MEMORY,
+ ERR_OPENGL_CONTEXT,
+ ERR_EGL_CONTEXT,
+ ERR_WAYLAND,
+ ERR_X11,
+ ERR_DIRECTX_CONTEXT,
+ ERR_IOKIT,
+ ERR_CLIPBOARD,
+ ERR_FAILED_FUNC_LOAD,
+ ERR_BUFFER,
+ ERR_METAL,
+ ERR_PLATFORM,
+ ERR_EVENT_QUEUE,
+ INFO_WINDOW,
+ INFO_BUFFER,
+ INFO_GLOBAL,
+ INFO_OPENGL,
+ WARNING_WAYLAND,
+ WARNING_OPENGL,
+}
+
+struct DebugInfo
+{
+ DebugType type;
+ ErrorCode code;
+ ZString msg;
+}
+
+alias DebugFunc = fn void(DebugInfo*);
+alias Proc @if($feature(OPENGL)) = fn void();
+alias GlContext @if($feature(OPENGL)) = void;
+alias EglContext @if($feature(OPENGL)) = void;
+
+constdef GlReleaseBehavior : int @if($feature(OPENGL))
+{
+ FLUSH = 0,
+ NONE,
+}
+
+constdef GlProfile : int @if($feature(OPENGL))
+{
+ CORE = 0,
+ FORWARD_COMPATIBILITY,
+ COMPATIBILITY,
+ ES,
}
-struct GlHints
+constdef GlRenderer : int @if($feature(OPENGL))
{
- int stencil;
- int samples;
- int stereo;
- int auxBuffers;
- int doubleBuffer;
- int red; int green; int blue; int alpha;
- int depth;
- int accumRed; int accumGreen; int accumBlue; int accumAlpha;
- bool sRGB;
- bool robustness;
- bool debug;
- bool noError;
+ ACCELERATED = 0,
+ SOFTWARE,
+}
+
+struct GlHints @if($feature(OPENGL))
+{
+ int stencil;
+ int samples;
+ int stereo;
+ int auxBuffers;
+ int doubleBuffer;
+ int red;
+ int green;
+ int blue;
+ int alpha;
+ int depth;
+ int accumRed;
+ int accumGreen;
+ int accumBlue;
+ int accumAlpha;
+ bool sRGB;
+ bool robustness;
+ bool debug;
+ bool noError;
GlReleaseBehavior releaseBehavior;
- GlProfile profile;
- int major; int minor;
- GlContext* share;
- EglContext* shareEGL;
- GlRenderer renderer;
+ GlProfile profile;
+ int major;
+ int minor;
+ GlContext* share;
+ EglContext* shareEGL;
+ GlRenderer renderer;
}
-extern fn Window* createWindow(ZString, int, int, int, int, WindowFlags) @cname("RGFW_createWindow");
-extern fn bool window_shouldClose(Window*) @cname("RGFW_window_shouldClose");
-extern fn bool window_close(Window*) @cname("RGFW_window_close");
-extern fn void pollEvents() @cname("RGFW_pollEvents");
-extern fn GlHints* getGlobalHints_OpenGL() @cname("RGFW_getGlobalHints_OpenGL");
-extern fn void setGlobalHints_OpenGL(GlHints*) @cname("RGFW_setGlobalHints_OpenGL");
-extern fn Proc getProcAddress_OpenGL(ZString) @cname("RGFW_getProcAddress_OpenGL");
+extern fn void* alloc(usz) @cname("RGFW_alloc");
+extern fn void free(void*) @cname("RGFW_free");
+extern fn usz sizeofWindow() @cname("RGFW_sizeofWindow");
+extern fn usz sizeofWindowSrc() @cname("RGFW_sizeofWindowSrc");
+extern fn void useWayland(bool) @cname("RGFW_useWayland");
+extern fn bool usingWayland() @cname("RGFW_usingWayland");
+extern fn void* getLayer_OSX() @cname("RGFW_getLayer_OSX");
+extern fn void* getDisplay_X11() @cname("RGFW_getDisplay_X11");
+extern fn void* getDisplay_Wayland() @cname("RGFW_getDisplay_Wayland"); // TODO return isn't void*
+extern fn void setClassName(ZString) @cname("RGFW_setClassName");
+extern fn void setXInstName(ZString) @cname("RGFW_setXInstName");
+extern fn void moveToMacOSResourceDir() @cname("RGFW_modeToMacOSResourceDir");
+extern fn void copyImageData(char*, int, int, Format, char*, Format, ConvertImageDataFunc) @cname("RGFW_copyImageData");
+extern fn usz sizeofNativeImage() @cname("RGFW_sizeofNativeImage");
+extern fn usz sizeofSurface() @cname("RGFW_sizeofSurface");
+extern fn Format nativeFormat() @cname("RGFW_nativeFormat");
+extern fn Surface* createSurface(char*, int, int, Format) @cname("RGFW_createSurface");
+extern fn bool createSurfacePtr(char*, int, int, Format, Surface*) @cname("RGFW_createSurfacePtr");
+extern fn NativeImage* surface_getNativeImage(Surface*) @cname("RGFW_surface_getNativeImage");
+extern fn void surface_free(Surface*) @cname("RGFW_surface_free");
+extern fn void surface_freePtr(Surface*) @cname("RGFW_surface_freePtr");
+extern fn Mouse* createMouse(char*, int, int, Format) @cname("RGFW_createMouse");
+extern fn Mouse* createMouseStandard(MouseIcon) @cname("RGFW_createMouseStandard");
+extern fn void freeMouse(Mouse*) @cname("RGFW_freeMouse");
+extern fn MonitorMode* monitor_getModes(Monitor*, usz*) @cname("RGFW_monitor_getModes");
+extern fn void freeModes(MonitorMode*) @cname("RGFW_freeModes");
+extern fn usz monitor_getModesPtr(Monitor*, MonitorMode**) @cname("RGFW_monitor_getModesPtr");
+extern fn bool monitor_findClosestMode(Monitor*, MonitorMode*, MonitorMode*) @cname("RGFW_monitor_findClosestMode");
+extern fn GammaRamp* monitor_getGammaRamp(Monitor*) @cname("RGFW_monitor_getGammaRamp");
+extern fn void freeGammaRamp(GammaRamp*) @cname("RGFW_freeGammaRamp");
+extern fn usz monitor_getGammaRampPtr(Monitor*, GammaRamp*) @cname("RGFW_monitor_getGammaRampPtr");
+extern fn bool monitor_setGammaRamp(Monitor*, GammaRamp*) @cname("RGFW_monitor_setGammaRamp");
+extern fn bool monitor_setGamma(Monitor*, float) @cname("RGFW_monitor_setGamma");
+extern fn bool monitor_setGammaPtr(Monitor*, float, ushort*, usz) @cname("RGFW_monitor_setGammaPtr");
+extern fn bool monitor_getWorkarea(Monitor*, int*, int*, int*, int*) @cname("RGFW_monitor_getWorkarea");
+extern fn bool monitor_getPosition(Monitor*, int*, int*) @cname("RGFW_monitor_getPosition");
+extern fn ZString monitor_getName(Monitor*) @cname("RGFW_monitor_getName");
+extern fn bool monitor_getScale(Monitor*, float*, float*) @cname("RGFW_monitor_getScale");
+extern fn bool monitor_getPhysicalSize(Monitor*, float*, float*) @cname("RGFW_monitor_getPhysicalSize");
+extern fn void monitor_setUserPtr(Monitor*, void*) @cname("RGFW_monitor_setUserPtr");
+extern fn void* monitor_getUserPtr(Monitor*) @cname("RGFW_monitor_getUserPtr");
+extern fn bool monitor_getMode(Monitor*, MonitorMode*) @cname("RGFW_monitor_getMode");
+extern fn void pollMonitors() @cname("RGFW_pollMonitors");
+extern fn Monitor** getMonitors(usz*) @cname("RGFW_getMonitors");
+extern fn Monitor* getPrimaryMonitor() @cname("RGFW_getPrimaryMonitor");
+extern fn bool monitor_requestMode(Monitor*, MonitorMode*, ModeRequest) @cname("RGFW_monitor_requestMode");
+extern fn bool monitor_setMode(Monitor*, MonitorMode*) @cname("RGFW_monitor_setMode");
+extern fn bool monitorModeCompare(MonitorMode*, MonitorMode*, ModeRequest) @cname("RGFW_monitorModeCompare");
+extern fn bool monitor_scaleToWindow(Monitor*, Window*) @cname("RGFW_monitor_scaleToWindow");
+extern fn void setRawMouseMode(bool) @cname("RGFW_setRawMouseMode");
+extern fn void setBuildDND(bool) @cname("RGFW_setbuildDND");
+extern fn void waitForEvent(int) @cname("RGFW_waitForEvent");
+extern fn void setQueueEvents(bool) @cname("RGFW_setQueueEvents");
+extern fn GenericFunc* setEventCallback(EventType, GenericFunc) @cname("RGFW_setEventCallback");
+extern fn void setDualEventCallback(EventType, GenericFunc, GenericFunc*, GenericFunc*) @cname("RGFW_setDualEventCallback");
+extern fn void setAllEventCallbacks(GenericFunc, Callbacks*) @cname("RGFW_setAllEventCallbacks");
+extern fn void pollEvents() @cname("RGFW_pollEvents");
+extern fn void stopCheckEvents() @cname("RGFW_stopCheckEvents");
+extern fn bool checkEvent(Event*) @cname("RGFW_checkEvent");
+extern fn bool checkQueuedEvent(Event*) @cname("RGFW_checkQueuedEvent");
+extern fn bool isKeyPressed(Key) @cname("RGFW_isKeyPressed");
+extern fn bool isKeyReleased(Key) @cname("RGFW_isKeyReleased");
+extern fn bool isKeyDown(Key) @cname("RGFW_isKeyDown");
+extern fn bool isMousePressed(MouseButton) @cname("RGFW_isMousePressed");
+extern fn bool isMouseReleased(MouseButton) @cname("RGFW_isMouseReleased");
+extern fn bool isMouseDown(MouseButton) @cname("RGFW_isMouseDown");
+extern fn void getMouseScroll(float*, float*) @cname("RGFW_getMouseScroll");
+extern fn void getMouseVector(float*, float*) @cname("RGFW_getMouseVector");
+extern fn Window* createWindow(ZString, int, int, int, int, WindowFlags) @cname("RGFW_createWindow");
+extern fn Window* createWindowPtr(ZString, int, int, int, int, WindowFlags, Window*) @cname("RGFW_createWindowPtr");
+extern fn Surface* window_createSurface(Window*, char*, int, int, Format) @cname("RGFW_window_createSurface");
+extern fn Surface* window_createSurfacePtr(Window*, char*, int, int, Format, Surface*) @cname("RGFW_window_createSurfacePtr");
+extern fn void surface_setConvertFunc(Surface*, ConvertImageDataFunc) @cname("RGFW_surface_setConvertFunc");
+extern fn void window_blitSurface(Window*, Surface*) @cname("RGFW_window_blitSurface");
+extern fn bool window_getPosition(Window*, int*, int*) @cname("RGFW_window_getPosition");
+extern fn bool window_getSize(Window*, int*, int*) @cname("RGFW_window_getSize");
+extern fn bool window_getSizeInPixels(Window*, int*, int*) @cname("RGFW_window_getSizeInPixels");
+extern fn uint window_getFlags(Window*) @cname("RGFW_window_getFlags");
+extern fn Key window_getExitKey(Window*) @cname("RGFW_window_getExitKey");
+extern fn void window_setExitKey(Window*, Key) @cname("RGFW_window_setExitKey");
+extern fn void window_setEnabledEvents(Window*, EventFlag) @cname("RGFW_window_setEnabledEvents");
+extern fn EventFlag window_getEnabledEvents(Window*) @cname("RGFW_window_getEnabledEvents");
+extern fn void window_setDisabledEvents(Window*, EventFlag) @cname("RGFW_window_setDisabledEvents");
+extern fn void window_setEventState(Window*, EventFlag, bool) @cname("RGFW_window_setEventState");
+extern fn void* window_getUserPtr(Window*) @cname("RGFW_window_getUserPtr");
+extern fn void window_setUserPtr(Window*, void*) @cname("RGFW_window_setUserPtr");
+extern fn Window_src* window_getSrc(Window*) @cname("RGFW_window_getSrc");
+extern fn void window_setLayer_OSX(Window*, void*) @cname("RGFW_window_setLayer_OSX");
+extern fn void* window_getView_OSX(Window*) @cname("RGFW_window_getView_OSX");
+extern fn void* window_getWindow_OSX(Window*) @cname("RGFW_window_getWindow_OSX");
+extern fn void* window_getHWND(Window*) @cname("RGFW_window_getHWND");
+extern fn void* window_getHDC(Window*) @cname("RGFW_window_getHDC");
+extern fn ulong window_getWindow_X11(Window*) @cname("RGFW_window_getWindow_X11");
+extern fn void* window_getWindow_Wayland(Window*) @cname("RGFW_window_getWindow_Wayland"); // TODO return isn't *void
+extern fn void window_setFlags(Window*, WindowFlags) @cname("RGFW_window_setFlags");
+extern fn bool window_checkEvent(Window*, Event*) @cname("RGFW_window_checkEvent");
+extern fn bool window_checkQueuedEvent(Window*, Event*) @cname("RGFW_window_checkQueuedEvent");
+extern fn bool window_isKeyPressed(Window*, Key) @cname("RGFW_window_isKeyPressed");
+extern fn bool window_isKeyDown(Window*, Key) @cname("RGFW_window_isKeyDown");
+extern fn bool window_isKeyReleased(Window*, Key) @cname("RGFW_window_isKeyReleased");
+extern fn bool window_isMousePressed(Window*, MouseButton) @cname("RGFW_window_isMousePressed");
+extern fn bool window_isMouseDown(Window*, MouseButton) @cname("RGFW_window_isMouseDown");
+extern fn bool window_isMouseReleased(Window*, MouseButton) @cname("RGFW_window_isMouseReleased");
+extern fn bool window_didMouseLeave(Window*) @cname("RGFW_window_didMouseLeave");
+extern fn bool window_didMouseEnter(Window*) @cname("RGFW_window_didMouseEnter");
+extern fn bool window_isMouseInside(Window*) @cname("RGFW_window_isMouseInside");
+extern fn bool window_isDataDragging(Window*) @cname("RGFW_window_isDataDragging");
+extern fn bool window_getDataDrag(Window*, int*, int*) @cname("RGFW_window_getDataDrag");
+extern fn bool window_didDataDrop(Window*) @cname("RGFW_window_didDataDrop");
+extern fn DataDropNode* window_getDataDrop(Window*) @cname("RGFW_window_getDataDrop");
+extern fn void window_close(Window*) @cname("RGFW_window_close");
+extern fn void window_closePtr(Window*) @cname("RGFW_window_closePtr");
+extern fn bool window_fetchSize(Window*, int*, int*) @cname("RGFW_window_fetchSize");
+extern fn void window_move(Window*, int, int) @cname("RGFW_window_move");
+extern fn void window_moveToMonitor(Window*, Monitor*) @cname("RGFW_window_moveToMonitor");
+extern fn void window_resize(Window*, int, int) @cname("RGFW_window_resize");
+extern fn void window_setAspectRatio(Window*, int, int) @cname("RGFW_window_setAspectRation");
+extern fn void window_setMinSize(Window*, int, int) @cname("RGFW_window_setMinSize");
+extern fn void window_setMaxSize(Window*, int, int) @cname("RGFW_window_setMaxSize");
+extern fn void window_focus(Window*) @cname("RGFW_window_focus");
+extern fn bool window_isInFocus(Window*) @cname("RGFW_window_isInFocus");
+extern fn void window_raise(Window*) @cname("RGFW_window_raise");
+extern fn void window_maximize(Window*) @cname("RGFW_window_maximize");
+extern fn void window_setFullscreen(Window*, bool) @cname("RGFW_window_setFullscreen");
+extern fn void window_center(Window*) @cname("RGFW_window_center");
+extern fn void window_minimize(Window*) @cname("RGFW_window_minimize");
+extern fn void window_restore(Window*) @cname("RGFW_window_restore");
+extern fn void window_setFloating(Window*, bool) @cname("RGFW_window_setFloating");
+extern fn void window_setOpacity(Window*, char) @cname("RGFW_window_setOpacity");
+extern fn void window_setBorder(Window*, bool) @cname("RGFW_window_setBorder");
+extern fn bool window_borderless(Window*) @cname("RGFW_window_borderless");
+extern fn void window_setDND(Window*, bool) @cname("RGFW_window_setDND");
+extern fn bool window_allowsDND(Window*) @cname("RGFW_window_allowsDND");
+extern fn void window_setMousePassthrough(Window*, bool) @cname("RGFW_window_setMousePassthrough");
+extern fn void window_setName(Window*, ZString) @cname("RGFW_window_setName");
+extern fn bool window_setIcon(Window*, char*, int, int, Format) @cname("RGFW_window_seticon");
+extern fn bool window_setIconEx(Window*, char*, int, int, Format, Icon) @cname("RGFW_window_setIconEx");
+extern fn bool window_setMouse(Window*, Mouse*) @cname("RGFW_window_setMouse");
+extern fn bool window_setMouseStandard(Window*, MouseIcon) @cname("RGFW_window_setMouseStandard");
+extern fn bool window_setMouseDefault(Window*) @cname("RGFW_window_setMouseDefault");
+extern fn void window_setRawMouseMode(Window*, bool) @cname("RGFW_window_setRawMousemode");
+extern fn void window_captureMouse(Window*, bool) @cname("RGFW_window_captureMouse");
+extern fn void window_captureRawMouse(Window*, bool) @cname("RGFW_window_captureRawMouse");
+extern fn bool window_isRawMouseMode(Window*) @cname("RGFW_window_isRawMouseMode");
+extern fn bool window_isCaptured(Window*) @cname("RGFW_window_isCaptured");
+extern fn void window_hide(Window*) @cname("RGFW_window_hide");
+extern fn void window_show(Window*) @cname("RGFW_window_show");
+extern fn void window_flash(Window*, FlashRequest) @cname("RGFW_window_flash");
+extern fn void window_setShouldClose(Window*, bool) @cname("RGFW_window_setShouldClose");
+extern fn bool window_getGlobalMouse(int*, int*) @cname("RGFW_window_getGlobalMouse");
+extern fn bool window_getMouse(Window*, int*, int*) @cname("RGFW_window_getMouse");
+extern fn void window_showMouse(Window*, bool) @cname("RGFW_window_showMouse");
+extern fn bool window_isMouseHidden(Window*) @cname("RGFW_window_isMouseHidden");
+extern fn void window_moveMouse(Window*, int, int) @cname("RGFW_window_moveMouse");
+extern fn bool window_shouldClose(Window*) @cname("RGFW_window_shouldClose");
+extern fn bool window_isFullscreen(Window*) @cname("RGFW_window_isFullscreen");
+extern fn bool window_isHidden(Window*) @cname("RGFW_window_isHidden");
+extern fn bool window_isMinimized(Window*) @cname("RGFW_window_isMinimized");
+extern fn bool window_isMaximized(Window*) @cname("RGFW_window_isMaximized");
+extern fn bool window_isFloating(Window*) @cname("RGFW_window_isFloating");
+extern fn void window_scaleToMonitor(Window*) @cname("RGFW_window_scaleToMonitor");
+extern fn Monitor* window_getMonitor(Window*) @cname("RGFW_window_getMonitor");
+extern fn ZString readClipboard(usz*) @cname("RGFW_readClipboard");
+extern fn sz readClipboardPtr(CChar*, usz) @cname("RGFW_readClipboardPtr");
+extern fn void writeClipboard(ZString, uint) @cname("RGFW_writeClipboard");
+extern fn DebugFunc setDebugCallback(DebugFunc) @cname("RGFW_setDebugCallback");
+extern fn void debugCallback(DebugType, ErrorCode, ZString) @cname("RGFW_debugCallback");
+
+// RGFW_OPENGL
+extern fn void setGlobalHints(GlHints*) @cname("RGFW_setGlobalHints_OpenGL") @if($feature(OPENGL));
+extern fn void resetGlobalHints() @cname("RGFW_resetGlobalHints_OpenGL") @if($feature(OPENGL));
+extern fn GlHints* getGlobalHints() @cname("RGFW_getGlobalHints_OpenGL") @if($feature(OPENGL));
+extern fn GlContext* window_createContext(Window*, GlHints*) @cname("RGFW_window_createContext_OpenGL") @if($feature(OPENGL));
+extern fn bool window_createContextPtr(Window*, GlContext*, GlHints*) @cname("RGFW_window_createContextPtr_OpenGL") @if($feature(OPENGL));
+extern fn GlContext* window_getContext(Window*) @cname("RGFW_window_getContext_OpenGL") @if($feature(OPENGL));
+extern fn void window_deleteContext(Window*, GlContext*) @cname("RGFW_window_deleteContext_OpenGL") @if($feature(OPENGL));
+extern fn void window_deleteContextPtr(Window*, GlContext*) @cname("RGFW_window_deleteContextPtr_OpenGL") @if($feature(OPENGL));
+extern fn void* glContext_getSourceContext(GlContext*) @cname("RGFW_glContext_getSourceContext") @if($feature(OPENGL));
+extern fn void window_makeCurrentWindow(Window*) @cname("RGFW_window_makeCurrentWindow_OpenGL") @if($feature(OPENGL));
+extern fn void window_makeCurrentContext(Window*) @cname("RGFW_window_makeCurrentContext_OpenGL") @if($feature(OPENGL));
+extern fn void window_swapBuffers(Window*) @cname("RGFW_window_swapBuffers_OpenGL") @if($feature(OPENGL));
+extern fn void* getCurrentContext() @cname("RGFW_getCurrentContext_OpenGL") @if($feature(OPENGL));
+extern fn Window* getCurrentWindow() @cname("RGFW_getCurrentWindow_OpenGL") @if($feature(OPENGL));
+extern fn void window_swapInterval(Window*, int) @cname("RGFW_window_swapInterval_OpenGL") @if($feature(OPENGL));
+extern fn Proc getProcAddress(ZString) @cname("RGFW_getProcAddress_OpenGL") @if($feature(OPENGL));
+extern fn bool extensionSupported(ZString, usz) @cname("RGFW_extensionSupported_OpenGL") @if($feature(OPENGL));
+extern fn bool extensionSupportedPlatform(ZString, usz) @cname("RGFW_extensionSupportedPlatform_OpenGL") @if($feature(OPENGL));
+
+// RGFW_EGL 2460..2596
+// RGFW_VULKAN 2599..2626
+// RGFW_DIRECTX 2630..2649
+// RGFW_WEBGPU 2652..2661